Lines Matching refs:dso
10 char dso__symtab_origin(const struct dso *dso) in dso__symtab_origin() argument
31 if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND) in dso__symtab_origin()
33 return origin[dso->symtab_type]; in dso__symtab_origin()
36 int dso__read_binary_type_filename(const struct dso *dso, in dso__read_binary_type_filename() argument
48 len = __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
61 (dso__build_id_filename(dso, filename, size) == NULL)) in dso__read_binary_type_filename()
67 snprintf(filename + len, size - len, "%s.debug", dso->long_name); in dso__read_binary_type_filename()
72 snprintf(filename + len, size - len, "%s", dso->long_name); in dso__read_binary_type_filename()
80 last_slash = dso->long_name + dso->long_name_len; in dso__read_binary_type_filename()
81 while (last_slash != dso->long_name && *last_slash != '/') in dso__read_binary_type_filename()
85 dir_size = last_slash - dso->long_name + 2; in dso__read_binary_type_filename()
90 len += scnprintf(filename + len, dir_size, "%s", dso->long_name); in dso__read_binary_type_filename()
97 if (!dso->has_build_id) { in dso__read_binary_type_filename()
102 build_id__sprintf(dso->build_id, in dso__read_binary_type_filename()
103 sizeof(dso->build_id), in dso__read_binary_type_filename()
113 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
119 root_dir, dso->long_name); in dso__read_binary_type_filename()
124 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
129 snprintf(filename, size, "%s", dso->long_name); in dso__read_binary_type_filename()
190 bool dso__needs_decompress(struct dso *dso) in dso__needs_decompress() argument
192 return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || in dso__needs_decompress()
193 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; in dso__needs_decompress()
268 static void dso__list_add(struct dso *dso) in dso__list_add() argument
270 list_add_tail(&dso->data.open_entry, &dso__data_open); in dso__list_add()
274 static void dso__list_del(struct dso *dso) in dso__list_del() argument
276 list_del(&dso->data.open_entry); in dso__list_del()
305 static int __open_dso(struct dso *dso, struct machine *machine) in __open_dso() argument
317 if (dso__read_binary_type_filename(dso, dso->binary_type, in __open_dso()
337 static int open_dso(struct dso *dso, struct machine *machine) in open_dso() argument
339 int fd = __open_dso(dso, machine); in open_dso()
342 dso__list_add(dso); in open_dso()
353 static void close_data_fd(struct dso *dso) in close_data_fd() argument
355 if (dso->data.fd >= 0) { in close_data_fd()
356 close(dso->data.fd); in close_data_fd()
357 dso->data.fd = -1; in close_data_fd()
358 dso->data.file_size = 0; in close_data_fd()
359 dso__list_del(dso); in close_data_fd()
370 static void close_dso(struct dso *dso) in close_dso() argument
372 close_data_fd(dso); in close_dso()
377 struct dso *dso; in close_first_dso() local
379 dso = list_first_entry(&dso__data_open, struct dso, data.open_entry); in close_first_dso()
380 close_dso(dso); in close_first_dso()
434 void dso__data_close(struct dso *dso) in dso__data_close() argument
436 close_dso(dso); in dso__data_close()
447 int dso__data_fd(struct dso *dso, struct machine *machine) in dso__data_fd() argument
456 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_fd()
459 if (dso->data.fd >= 0) in dso__data_fd()
462 if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { in dso__data_fd()
463 dso->data.fd = open_dso(dso, machine); in dso__data_fd()
468 dso->binary_type = binary_type_data[i++]; in dso__data_fd()
470 dso->data.fd = open_dso(dso, machine); in dso__data_fd()
471 if (dso->data.fd >= 0) in dso__data_fd()
474 } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); in dso__data_fd()
476 if (dso->data.fd >= 0) in dso__data_fd()
477 dso->data.status = DSO_DATA_STATUS_OK; in dso__data_fd()
479 dso->data.status = DSO_DATA_STATUS_ERROR; in dso__data_fd()
481 return dso->data.fd; in dso__data_fd()
484 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by) in dso__data_status_seen() argument
488 if (dso->data.status_seen & flag) in dso__data_status_seen()
491 dso->data.status_seen |= flag; in dso__data_status_seen()
571 dso_cache__read(struct dso *dso, u64 offset, u8 *data, ssize_t size) in dso_cache__read() argument
587 ret = pread(dso->data.fd, cache->data, DSO__DATA_CACHE_SIZE, cache_offset); in dso_cache__read()
593 dso_cache__insert(&dso->data.cache, cache); in dso_cache__read()
605 static ssize_t dso_cache_read(struct dso *dso, u64 offset, in dso_cache_read() argument
610 cache = dso_cache__find(&dso->data.cache, offset); in dso_cache_read()
614 return dso_cache__read(dso, offset, data, size); in dso_cache_read()
622 static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size) in cached_read() argument
630 ret = dso_cache_read(dso, offset, p, size); in cached_read()
650 static int data_file_size(struct dso *dso) in data_file_size() argument
655 if (!dso->data.file_size) { in data_file_size()
656 if (fstat(dso->data.fd, &st)) { in data_file_size()
661 dso->data.file_size = st.st_size; in data_file_size()
674 off_t dso__data_size(struct dso *dso, struct machine *machine) in dso__data_size() argument
678 fd = dso__data_fd(dso, machine); in dso__data_size()
682 if (data_file_size(dso)) in dso__data_size()
686 return dso->data.file_size; in dso__data_size()
689 static ssize_t data_read_offset(struct dso *dso, u64 offset, in data_read_offset() argument
692 if (data_file_size(dso)) in data_read_offset()
696 if (offset > dso->data.file_size) in data_read_offset()
702 return cached_read(dso, offset, data, size); in data_read_offset()
716 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, in dso__data_read_offset() argument
719 if (dso__data_fd(dso, machine) < 0) in dso__data_read_offset()
722 return data_read_offset(dso, offset, data, size); in dso__data_read_offset()
735 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, in dso__data_read_addr() argument
740 return dso__data_read_offset(dso, machine, offset, data, size); in dso__data_read_addr()
746 struct dso *dso = dso__new(name); in dso__new_map() local
748 if (dso) in dso__new_map()
749 map = map__new2(0, dso, MAP__FUNCTION); in dso__new_map()
754 struct dso *dso__kernel_findnew(struct machine *machine, const char *name, in dso__kernel_findnew()
760 struct dso *dso = __dsos__findnew(&machine->kernel_dsos, name); in dso__kernel_findnew() local
766 if (dso != NULL) { in dso__kernel_findnew()
767 dso__set_short_name(dso, short_name, false); in dso__kernel_findnew()
768 dso->kernel = dso_type; in dso__kernel_findnew()
771 return dso; in dso__kernel_findnew()
779 static struct dso *dso__findlink_by_longname(struct rb_root *root, in dso__findlink_by_longname() argument
780 struct dso *dso, const char *name) in dso__findlink_by_longname()
786 name = dso->long_name; in dso__findlink_by_longname()
791 struct dso *this = rb_entry(*p, struct dso, rb_node); in dso__findlink_by_longname()
801 if (!dso || (dso == this)) in dso__findlink_by_longname()
808 rc = strcmp(dso->short_name, this->short_name); in dso__findlink_by_longname()
819 if (dso) { in dso__findlink_by_longname()
821 rb_link_node(&dso->rb_node, parent, p); in dso__findlink_by_longname()
822 rb_insert_color(&dso->rb_node, root); in dso__findlink_by_longname()
827 static inline struct dso *
833 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_long_name() argument
838 if (dso->long_name_allocated) in dso__set_long_name()
839 free((char *)dso->long_name); in dso__set_long_name()
841 dso->long_name = name; in dso__set_long_name()
842 dso->long_name_len = strlen(name); in dso__set_long_name()
843 dso->long_name_allocated = name_allocated; in dso__set_long_name()
846 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_short_name() argument
851 if (dso->short_name_allocated) in dso__set_short_name()
852 free((char *)dso->short_name); in dso__set_short_name()
854 dso->short_name = name; in dso__set_short_name()
855 dso->short_name_len = strlen(name); in dso__set_short_name()
856 dso->short_name_allocated = name_allocated; in dso__set_short_name()
859 static void dso__set_basename(struct dso *dso) in dso__set_basename() argument
865 char *base, *lname = strdup(dso->long_name); in dso__set_basename()
882 dso__set_short_name(dso, base, true); in dso__set_basename()
885 int dso__name_len(const struct dso *dso) in dso__name_len() argument
887 if (!dso) in dso__name_len()
890 return dso->long_name_len; in dso__name_len()
892 return dso->short_name_len; in dso__name_len()
895 bool dso__loaded(const struct dso *dso, enum map_type type) in dso__loaded() argument
897 return dso->loaded & (1 << type); in dso__loaded()
900 bool dso__sorted_by_name(const struct dso *dso, enum map_type type) in dso__sorted_by_name() argument
902 return dso->sorted_by_name & (1 << type); in dso__sorted_by_name()
905 void dso__set_sorted_by_name(struct dso *dso, enum map_type type) in dso__set_sorted_by_name() argument
907 dso->sorted_by_name |= (1 << type); in dso__set_sorted_by_name()
910 struct dso *dso__new(const char *name) in dso__new()
912 struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1); in dso__new() local
914 if (dso != NULL) { in dso__new()
916 strcpy(dso->name, name); in dso__new()
917 dso__set_long_name(dso, dso->name, false); in dso__new()
918 dso__set_short_name(dso, dso->name, false); in dso__new()
920 dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; in dso__new()
921 dso->data.cache = RB_ROOT; in dso__new()
922 dso->data.fd = -1; in dso__new()
923 dso->data.status = DSO_DATA_STATUS_UNKNOWN; in dso__new()
924 dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
925 dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
926 dso->is_64_bit = (sizeof(void *) == 8); in dso__new()
927 dso->loaded = 0; in dso__new()
928 dso->rel = 0; in dso__new()
929 dso->sorted_by_name = 0; in dso__new()
930 dso->has_build_id = 0; in dso__new()
931 dso->has_srcline = 1; in dso__new()
932 dso->a2l_fails = 1; in dso__new()
933 dso->kernel = DSO_TYPE_USER; in dso__new()
934 dso->needs_swap = DSO_SWAP__UNSET; in dso__new()
935 RB_CLEAR_NODE(&dso->rb_node); in dso__new()
936 INIT_LIST_HEAD(&dso->node); in dso__new()
937 INIT_LIST_HEAD(&dso->data.open_entry); in dso__new()
940 return dso; in dso__new()
943 void dso__delete(struct dso *dso) in dso__delete() argument
947 if (!RB_EMPTY_NODE(&dso->rb_node)) in dso__delete()
949 dso->long_name); in dso__delete()
951 symbols__delete(&dso->symbols[i]); in dso__delete()
953 if (dso->short_name_allocated) { in dso__delete()
954 zfree((char **)&dso->short_name); in dso__delete()
955 dso->short_name_allocated = false; in dso__delete()
958 if (dso->long_name_allocated) { in dso__delete()
959 zfree((char **)&dso->long_name); in dso__delete()
960 dso->long_name_allocated = false; in dso__delete()
963 dso__data_close(dso); in dso__delete()
964 dso_cache__free(&dso->data.cache); in dso__delete()
965 dso__free_a2l(dso); in dso__delete()
966 zfree(&dso->symsrc_filename); in dso__delete()
967 free(dso); in dso__delete()
970 void dso__set_build_id(struct dso *dso, void *build_id) in dso__set_build_id() argument
972 memcpy(dso->build_id, build_id, sizeof(dso->build_id)); in dso__set_build_id()
973 dso->has_build_id = 1; in dso__set_build_id()
976 bool dso__build_id_equal(const struct dso *dso, u8 *build_id) in dso__build_id_equal() argument
978 return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0; in dso__build_id_equal()
981 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine) in dso__read_running_kernel_build_id() argument
988 if (sysfs__read_build_id(path, dso->build_id, in dso__read_running_kernel_build_id()
989 sizeof(dso->build_id)) == 0) in dso__read_running_kernel_build_id()
990 dso->has_build_id = true; in dso__read_running_kernel_build_id()
993 int dso__kernel_module_get_build_id(struct dso *dso, in dso__kernel_module_get_build_id() argument
1001 const char *name = dso->short_name + 1; in dso__kernel_module_get_build_id()
1007 if (sysfs__read_build_id(filename, dso->build_id, in dso__kernel_module_get_build_id()
1008 sizeof(dso->build_id)) == 0) in dso__kernel_module_get_build_id()
1009 dso->has_build_id = true; in dso__kernel_module_get_build_id()
1017 struct dso *pos; in __dsos__read_build_ids()
1036 void dsos__add(struct dsos *dsos, struct dso *dso) in dsos__add() argument
1038 list_add_tail(&dso->node, &dsos->head); in dsos__add()
1039 dso__findlink_by_longname(&dsos->root, dso, NULL); in dsos__add()
1042 struct dso *dsos__find(const struct dsos *dsos, const char *name, in dsos__find()
1045 struct dso *pos; in dsos__find()
1056 struct dso *dsos__addnew(struct dsos *dsos, const char *name) in dsos__addnew()
1058 struct dso *dso = dso__new(name); in dsos__addnew() local
1060 if (dso != NULL) { in dsos__addnew()
1061 dsos__add(dsos, dso); in dsos__addnew()
1062 dso__set_basename(dso); in dsos__addnew()
1064 return dso; in dsos__addnew()
1067 struct dso *__dsos__findnew(struct dsos *dsos, const char *name) in __dsos__findnew()
1069 struct dso *dso = dsos__find(dsos, name, false); in __dsos__findnew() local
1071 return dso ? dso : dsos__addnew(dsos, name); in __dsos__findnew()
1075 bool (skip)(struct dso *dso, int parm), int parm) in __dsos__fprintf_buildid() argument
1077 struct dso *pos; in __dsos__fprintf_buildid()
1091 struct dso *pos; in __dsos__fprintf()
1103 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp) in dso__fprintf_buildid() argument
1107 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); in dso__fprintf_buildid()
1111 size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp) in dso__fprintf() argument
1114 size_t ret = fprintf(fp, "dso: %s (", dso->short_name); in dso__fprintf()
1116 if (dso->short_name != dso->long_name) in dso__fprintf()
1117 ret += fprintf(fp, "%s, ", dso->long_name); in dso__fprintf()
1119 dso__loaded(dso, type) ? "" : "NOT "); in dso__fprintf()
1120 ret += dso__fprintf_buildid(dso, fp); in dso__fprintf()
1122 for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) { in dso__fprintf()
1130 enum dso_type dso__type(struct dso *dso, struct machine *machine) in dso__type() argument
1134 fd = dso__data_fd(dso, machine); in dso__type()
1141 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) in dso__strerror_load() argument
1143 int idx, errnum = dso->load_errno; in dso__strerror_load()