A dynamic tracer for Linux

global.c 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. int global_resolve(prog_t *prog, node_t *n)
  50. {
  51. type_t **ts = NULL;
  52. type_t *t;
  53. int err;
  54. if (!strcmp(n->ident, "pid")) {
  55. ts = ts_pid;
  56. t = &t_pid_func;
  57. } else if (!strcmp(n->ident, "quantize")) {
  58. ts = ts_quantize;
  59. t = &t_quantize_func;
  60. } else {
  61. return -ENOENT;
  62. }
  63. if (ts) {
  64. err = type_add_list(ts);
  65. if (err)
  66. return err;
  67. }
  68. n->type = t;
  69. return sym_add(prog->locals, n->ident, t, &n->sym);
  70. }
  71. int global_probe(prog_t *prog)
  72. {
  73. return 0;
  74. }
  75. provider_t global = {
  76. .name = ":",
  77. .resolve = global_resolve,
  78. .probe = global_probe,
  79. };
  80. __attribute__((constructor))
  81. static void global_init(void)
  82. {
  83. provider_register(&global);
  84. }