A dynamic tracer for Linux

sym.c 1.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <assert.h>
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "sym.h"
  7. sym_t *sym_get(symtab_t *st, const char *name)
  8. {
  9. size_t i;
  10. for (i = 0; i < st->len; i++) {
  11. if (!strcmp(st->sym[i].name, name))
  12. return &st->sym[i];
  13. }
  14. return NULL;
  15. }
  16. int sym_add(symtab_t *st, const char *name, type_t *type)
  17. {
  18. sym_t *sym;
  19. sym = sym_get(st, name);
  20. if (sym) {
  21. /* if there is no type info, accept anything */
  22. if (!sym->type)
  23. sym->type = type;
  24. /* otherwise, if specified, it must match */
  25. else if (type && !type_equal(sym->type, type))
  26. return -EINVAL;
  27. return 0;
  28. }
  29. st->sym = realloc(st->sym, ++st->len * sizeof(*st->sym));
  30. assert(st->sym);
  31. sym = &st->sym[st->len-1];
  32. sym->name = name;
  33. sym->type = type;
  34. return 0;
  35. }
  36. void sym_dump(sym_t *sym, FILE *fp)
  37. {
  38. type_dump(sym->type, fp);
  39. fputc(' ', fp);
  40. fputs(sym->name, fp);
  41. }
  42. void symtab_dump(symtab_t *st, FILE *fp)
  43. {
  44. size_t i;
  45. for (i = 0; i < st->len; i++) {
  46. sym_dump(&st->sym[i], fp);
  47. fputc('\n', fp);
  48. }
  49. }