/usr.bin/gprof/kernel.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 64 lines · 53 code · 8 blank · 3 comment · 19 complexity · 74f96cab5e3a966f081a0fa857f43115 MD5 · raw file

  1. #include <sys/cdefs.h>
  2. __FBSDID("$FreeBSD$");
  3. #include <sys/param.h>
  4. #include <sys/linker.h>
  5. #include <sys/sysctl.h>
  6. #include <sys/errno.h>
  7. #include <err.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "gprof.h"
  11. /* Things which get -E excluded by default. */
  12. static char *excludes[] = { ".mcount", "_mcleanup", NULL };
  13. int
  14. kernel_getnfile(const char *unused, char ***defaultEs)
  15. {
  16. char *namelist;
  17. size_t len;
  18. char *name;
  19. if (sysctlbyname("kern.function_list", NULL, &len, NULL, 0) == -1)
  20. err(1, "sysctlbyname: function_list size");
  21. for (;;) {
  22. namelist = malloc(len);
  23. if (namelist == NULL)
  24. err(1, "malloc");
  25. if (sysctlbyname("kern.function_list", namelist, &len, NULL,
  26. 0) == 0)
  27. break;
  28. if (errno == ENOMEM)
  29. free(namelist);
  30. else
  31. err(1, "sysctlbyname: function_list");
  32. }
  33. nname = 0;
  34. for (name = namelist; *name != '\0'; name += strlen(name) + 1)
  35. nname++;
  36. /* Allocate memory for them, plus a terminating entry. */
  37. if ((nl = (nltype *)calloc(nname + 1, sizeof(nltype))) == NULL)
  38. errx(1, "Insufficient memory for symbol table");
  39. npe = nl;
  40. for (name = namelist; *name != '\0'; name += strlen(name) + 1) {
  41. struct kld_sym_lookup ksl;
  42. ksl.version = sizeof(ksl);
  43. ksl.symname = name;
  44. if (kldsym(0, KLDSYM_LOOKUP, &ksl))
  45. err(1, "kldsym(%s)", name);
  46. /* aflag not supported */
  47. if (uflag && strchr(name, '.') != NULL)
  48. continue;
  49. npe->value = ksl.symvalue;
  50. npe->name = name;
  51. npe++;
  52. }
  53. npe->value = -1;
  54. *defaultEs = excludes;
  55. return (0);
  56. }