build-id.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * build-id.c
  3. *
  4. * build-id support
  5. *
  6. * Copyright (C) 2009, 2010 Red Hat Inc.
  7. * Copyright (C) 2009, 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
  8. */
  9. #include "util.h"
  10. #include <stdio.h>
  11. #include "build-id.h"
  12. #include "event.h"
  13. #include "symbol.h"
  14. #include <linux/kernel.h>
  15. static int build_id__mark_dso_hit(event_t *event, struct perf_session *session)
  16. {
  17. struct addr_location al;
  18. u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
  19. struct thread *thread = perf_session__findnew(session, event->ip.pid);
  20. if (thread == NULL) {
  21. pr_err("problem processing %d event, skipping it.\n",
  22. event->header.type);
  23. return -1;
  24. }
  25. thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
  26. event->ip.pid, event->ip.ip, &al);
  27. if (al.map != NULL)
  28. al.map->dso->hit = 1;
  29. return 0;
  30. }
  31. struct perf_event_ops build_id__mark_dso_hit_ops = {
  32. .sample = build_id__mark_dso_hit,
  33. .mmap = event__process_mmap,
  34. .fork = event__process_task,
  35. };
  36. char *dso__build_id_filename(struct dso *self, char *bf, size_t size)
  37. {
  38. char build_id_hex[BUILD_ID_SIZE * 2 + 1];
  39. const char *home;
  40. if (!self->has_build_id)
  41. return NULL;
  42. build_id__sprintf(self->build_id, sizeof(self->build_id), build_id_hex);
  43. home = getenv("HOME");
  44. if (bf == NULL) {
  45. if (asprintf(&bf, "%s/%s/.build-id/%.2s/%s", home,
  46. DEBUG_CACHE_DIR, build_id_hex, build_id_hex + 2) < 0)
  47. return NULL;
  48. } else
  49. snprintf(bf, size, "%s/%s/.build-id/%.2s/%s", home,
  50. DEBUG_CACHE_DIR, build_id_hex, build_id_hex + 2);
  51. return bf;
  52. }