A dynamic tracer for Linux

global.c 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <errno.h>
  2. #include <string.h>
  3. #include "ply.h"
  4. /* pid */
  5. type_t t_pid_t = {
  6. .ttype = T_TYPEDEF,
  7. .t.tdef = {
  8. .name = "__ply_pid_t",
  9. .type = &t_u32,
  10. },
  11. };
  12. type_t t_pid_func = {
  13. .ttype = T_FUNC,
  14. .t.func = {
  15. .name = "pid",
  16. .type = &t_pid_t,
  17. .args = NULL,
  18. },
  19. };
  20. type_t *ts_pid[] = { &t_pid_t, &t_pid_func, NULL };
  21. /* quantize */
  22. type_t t_u64_64 = {
  23. .ttype = T_ARRAY,
  24. .t.array = {
  25. .type = &t_u64,
  26. .len = 64,
  27. },
  28. };
  29. type_t t_quantize_t = {
  30. .ttype = T_TYPEDEF,
  31. .t.tdef = {
  32. .name = "__ply_quantize_t",
  33. .type = &t_u64_64,
  34. },
  35. };
  36. field_t f_quantize_args[] = {
  37. { .type = &t_s64 },
  38. { .type = NULL }
  39. };
  40. type_t t_quantize_func = {
  41. .ttype = T_FUNC,
  42. .t.func = {
  43. .name = "quantize",
  44. .type = &t_quantize_t,
  45. .args = f_quantize_args,
  46. },
  47. };
  48. type_t *ts_quantize[] = { &t_u64_64, &t_quantize_t, &t_quantize_func, NULL };
  49. /* time */
  50. type_t t_time_t = {
  51. .ttype = T_TYPEDEF,
  52. .t.tdef = {
  53. .name = "__ply_time_t",
  54. .type = &t_u32,
  55. },
  56. };
  57. type_t t_time_func = {
  58. .ttype = T_FUNC,
  59. .t.func = {
  60. .name = "time",
  61. .type = &t_time_t,
  62. .args = NULL,
  63. },
  64. };
  65. type_t *ts_time[] = { &t_time_t, &t_time_func, NULL };
  66. int global_resolve(prog_t *prog, node_t *n)
  67. {
  68. type_t **ts = NULL;
  69. type_t *t;
  70. int err;
  71. if (!strcmp(n->ident, "pid")) {
  72. ts = ts_pid;
  73. t = &t_pid_func;
  74. } else if (!strcmp(n->ident, "quantize")) {
  75. ts = ts_quantize;
  76. t = &t_quantize_func;
  77. } else if (!strcmp(n->ident, "time")) {
  78. ts = ts_time;
  79. t = &t_time_func;
  80. } else {
  81. return -ENOENT;
  82. }
  83. if (ts) {
  84. err = type_add_list(ts);
  85. if (err)
  86. return err;
  87. }
  88. n->type = t;
  89. return sym_add(prog->locals, n->ident, t, &n->sym);
  90. }
  91. int global_probe(prog_t *prog)
  92. {
  93. return 0;
  94. }
  95. provider_t global = {
  96. .name = ":",
  97. .resolve = global_resolve,
  98. .probe = global_probe,
  99. };
  100. __attribute__((constructor))
  101. static void global_init(void)
  102. {
  103. provider_register(&global);
  104. }