• Home
  • Raw
  • Download

Lines Matching refs:dso

28 char dso__symtab_origin(const struct dso *dso)  in dso__symtab_origin()  argument
50 if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND) in dso__symtab_origin()
52 return origin[dso->symtab_type]; in dso__symtab_origin()
55 int dso__read_binary_type_filename(const struct dso *dso, in dso__read_binary_type_filename() argument
71 len = __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
102 if (dso__build_id_filename(dso, filename, size, false) == NULL) in dso__read_binary_type_filename()
107 if (dso__build_id_filename(dso, filename, size, true) == NULL) in dso__read_binary_type_filename()
113 snprintf(filename + len, size - len, "%s.debug", dso->long_name); in dso__read_binary_type_filename()
118 snprintf(filename + len, size - len, "%s", dso->long_name); in dso__read_binary_type_filename()
126 last_slash = dso->long_name + dso->long_name_len; in dso__read_binary_type_filename()
127 while (last_slash != dso->long_name && *last_slash != '/') in dso__read_binary_type_filename()
131 dir_size = last_slash - dso->long_name + 2; in dso__read_binary_type_filename()
136 len += scnprintf(filename + len, dir_size, "%s", dso->long_name); in dso__read_binary_type_filename()
143 if (!dso->has_build_id) { in dso__read_binary_type_filename()
148 build_id__sprintf(dso->build_id, in dso__read_binary_type_filename()
149 sizeof(dso->build_id), in dso__read_binary_type_filename()
159 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
165 root_dir, dso->long_name); in dso__read_binary_type_filename()
170 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
175 snprintf(filename, size, "%s", dso->long_name); in dso__read_binary_type_filename()
252 bool dso__needs_decompress(struct dso *dso) in dso__needs_decompress() argument
254 return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || in dso__needs_decompress()
255 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; in dso__needs_decompress()
258 static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf) in decompress_kmodule() argument
263 if (!dso__needs_decompress(dso)) in decompress_kmodule()
266 if (kmod_path__parse_ext(&m, dso->long_name)) in decompress_kmodule()
274 dso->load_errno = errno; in decompress_kmodule()
279 dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE; in decompress_kmodule()
289 int dso__decompress_kmodule_fd(struct dso *dso, const char *name) in dso__decompress_kmodule_fd() argument
294 fd = decompress_kmodule(dso, name, tmpbuf); in dso__decompress_kmodule_fd()
299 int dso__decompress_kmodule_path(struct dso *dso, const char *name, in dso__decompress_kmodule_path() argument
305 fd = decompress_kmodule(dso, name, tmpbuf); in dso__decompress_kmodule_path()
405 void dso__set_module_info(struct dso *dso, struct kmod_path *m, in dso__set_module_info() argument
409 dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; in dso__set_module_info()
411 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; in dso__set_module_info()
415 dso->symtab_type++; in dso__set_module_info()
417 dso__set_short_name(dso, strdup(m->name), true); in dso__set_module_info()
427 static void dso__list_add(struct dso *dso) in dso__list_add() argument
429 list_add_tail(&dso->data.open_entry, &dso__data_open); in dso__list_add()
433 static void dso__list_del(struct dso *dso) in dso__list_del() argument
435 list_del(&dso->data.open_entry); in dso__list_del()
464 static int __open_dso(struct dso *dso, struct machine *machine) in __open_dso() argument
476 if (dso__read_binary_type_filename(dso, dso->binary_type, in __open_dso()
483 if (dso__needs_decompress(dso)) { in __open_dso()
487 if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) { in __open_dso()
488 fd = -dso->load_errno; in __open_dso()
497 if (dso__needs_decompress(dso)) in __open_dso()
514 static int open_dso(struct dso *dso, struct machine *machine) in open_dso() argument
519 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) in open_dso()
520 nsinfo__mountns_enter(dso->nsinfo, &nsc); in open_dso()
521 fd = __open_dso(dso, machine); in open_dso()
522 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) in open_dso()
526 dso__list_add(dso); in open_dso()
537 static void close_data_fd(struct dso *dso) in close_data_fd() argument
539 if (dso->data.fd >= 0) { in close_data_fd()
540 close(dso->data.fd); in close_data_fd()
541 dso->data.fd = -1; in close_data_fd()
542 dso->data.file_size = 0; in close_data_fd()
543 dso__list_del(dso); in close_data_fd()
554 static void close_dso(struct dso *dso) in close_dso() argument
556 close_data_fd(dso); in close_dso()
561 struct dso *dso; in close_first_dso() local
563 dso = list_first_entry(&dso__data_open, struct dso, data.open_entry); in close_first_dso()
564 close_dso(dso); in close_first_dso()
628 void dso__data_close(struct dso *dso) in dso__data_close() argument
631 close_dso(dso); in dso__data_close()
635 static void try_to_open_dso(struct dso *dso, struct machine *machine) in try_to_open_dso() argument
644 if (dso->data.fd >= 0) in try_to_open_dso()
647 if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { in try_to_open_dso()
648 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
653 dso->binary_type = binary_type_data[i++]; in try_to_open_dso()
655 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
656 if (dso->data.fd >= 0) in try_to_open_dso()
659 } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); in try_to_open_dso()
661 if (dso->data.fd >= 0) in try_to_open_dso()
662 dso->data.status = DSO_DATA_STATUS_OK; in try_to_open_dso()
664 dso->data.status = DSO_DATA_STATUS_ERROR; in try_to_open_dso()
676 int dso__data_get_fd(struct dso *dso, struct machine *machine) in dso__data_get_fd() argument
678 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_get_fd()
684 try_to_open_dso(dso, machine); in dso__data_get_fd()
686 if (dso->data.fd < 0) in dso__data_get_fd()
689 return dso->data.fd; in dso__data_get_fd()
692 void dso__data_put_fd(struct dso *dso __maybe_unused) in dso__data_put_fd()
697 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by) in dso__data_status_seen() argument
701 if (dso->data.status_seen & flag) in dso__data_status_seen()
704 dso->data.status_seen |= flag; in dso__data_status_seen()
710 dso_cache__free(struct dso *dso) in dso_cache__free() argument
712 struct rb_root *root = &dso->data.cache; in dso_cache__free()
715 pthread_mutex_lock(&dso->lock); in dso_cache__free()
724 pthread_mutex_unlock(&dso->lock); in dso_cache__free()
727 static struct dso_cache *dso_cache__find(struct dso *dso, u64 offset) in dso_cache__find() argument
729 const struct rb_root *root = &dso->data.cache; in dso_cache__find()
753 dso_cache__insert(struct dso *dso, struct dso_cache *new) in dso_cache__insert() argument
755 struct rb_root *root = &dso->data.cache; in dso_cache__insert()
761 pthread_mutex_lock(&dso->lock); in dso_cache__insert()
782 pthread_mutex_unlock(&dso->lock); in dso_cache__insert()
798 dso_cache__read(struct dso *dso, struct machine *machine, in dso_cache__read() argument
818 try_to_open_dso(dso, machine); in dso_cache__read()
820 if (dso->data.fd < 0) { in dso_cache__read()
822 dso->data.status = DSO_DATA_STATUS_ERROR; in dso_cache__read()
828 ret = pread(dso->data.fd, cache->data, DSO__DATA_CACHE_SIZE, cache_offset); in dso_cache__read()
839 old = dso_cache__insert(dso, cache); in dso_cache__read()
855 static ssize_t dso_cache_read(struct dso *dso, struct machine *machine, in dso_cache_read() argument
860 cache = dso_cache__find(dso, offset); in dso_cache_read()
864 return dso_cache__read(dso, machine, offset, data, size); in dso_cache_read()
872 static ssize_t cached_read(struct dso *dso, struct machine *machine, in cached_read() argument
881 ret = dso_cache_read(dso, machine, offset, p, size); in cached_read()
901 static int data_file_size(struct dso *dso, struct machine *machine) in data_file_size() argument
907 if (dso->data.file_size) in data_file_size()
910 if (dso->data.status == DSO_DATA_STATUS_ERROR) in data_file_size()
919 try_to_open_dso(dso, machine); in data_file_size()
921 if (dso->data.fd < 0) { in data_file_size()
923 dso->data.status = DSO_DATA_STATUS_ERROR; in data_file_size()
927 if (fstat(dso->data.fd, &st) < 0) { in data_file_size()
931 dso->data.status = DSO_DATA_STATUS_ERROR; in data_file_size()
934 dso->data.file_size = st.st_size; in data_file_size()
948 off_t dso__data_size(struct dso *dso, struct machine *machine) in dso__data_size() argument
950 if (data_file_size(dso, machine)) in dso__data_size()
954 return dso->data.file_size; in dso__data_size()
957 static ssize_t data_read_offset(struct dso *dso, struct machine *machine, in data_read_offset() argument
960 if (data_file_size(dso, machine)) in data_read_offset()
964 if (offset > dso->data.file_size) in data_read_offset()
970 return cached_read(dso, machine, offset, data, size); in data_read_offset()
984 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, in dso__data_read_offset() argument
987 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_read_offset()
990 return data_read_offset(dso, machine, offset, data, size); in dso__data_read_offset()
1003 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, in dso__data_read_addr() argument
1008 return dso__data_read_offset(dso, machine, offset, data, size); in dso__data_read_addr()
1014 struct dso *dso = dso__new(name); in dso__new_map() local
1016 if (dso) in dso__new_map()
1017 map = map__new2(0, dso, MAP__FUNCTION); in dso__new_map()
1022 struct dso *machine__findnew_kernel(struct machine *machine, const char *name, in machine__findnew_kernel()
1028 struct dso *dso = machine__findnew_dso(machine, name); in machine__findnew_kernel() local
1034 if (dso != NULL) { in machine__findnew_kernel()
1035 dso__set_short_name(dso, short_name, false); in machine__findnew_kernel()
1036 dso->kernel = dso_type; in machine__findnew_kernel()
1039 return dso; in machine__findnew_kernel()
1047 static struct dso *__dso__findlink_by_longname(struct rb_root *root, in __dso__findlink_by_longname()
1048 struct dso *dso, const char *name) in __dso__findlink_by_longname() argument
1054 name = dso->long_name; in __dso__findlink_by_longname()
1059 struct dso *this = rb_entry(*p, struct dso, rb_node); in __dso__findlink_by_longname()
1069 if (!dso || (dso == this)) in __dso__findlink_by_longname()
1076 rc = strcmp(dso->short_name, this->short_name); in __dso__findlink_by_longname()
1087 if (dso) { in __dso__findlink_by_longname()
1089 rb_link_node(&dso->rb_node, parent, p); in __dso__findlink_by_longname()
1090 rb_insert_color(&dso->rb_node, root); in __dso__findlink_by_longname()
1091 dso->root = root; in __dso__findlink_by_longname()
1096 static inline struct dso *__dso__find_by_longname(struct rb_root *root, in __dso__find_by_longname()
1102 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_long_name() argument
1104 struct rb_root *root = dso->root; in dso__set_long_name()
1109 if (dso->long_name_allocated) in dso__set_long_name()
1110 free((char *)dso->long_name); in dso__set_long_name()
1113 rb_erase(&dso->rb_node, root); in dso__set_long_name()
1118 RB_CLEAR_NODE(&dso->rb_node); in dso__set_long_name()
1119 dso->root = NULL; in dso__set_long_name()
1122 dso->long_name = name; in dso__set_long_name()
1123 dso->long_name_len = strlen(name); in dso__set_long_name()
1124 dso->long_name_allocated = name_allocated; in dso__set_long_name()
1127 __dso__findlink_by_longname(root, dso, NULL); in dso__set_long_name()
1130 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_short_name() argument
1135 if (dso->short_name_allocated) in dso__set_short_name()
1136 free((char *)dso->short_name); in dso__set_short_name()
1138 dso->short_name = name; in dso__set_short_name()
1139 dso->short_name_len = strlen(name); in dso__set_short_name()
1140 dso->short_name_allocated = name_allocated; in dso__set_short_name()
1143 static void dso__set_basename(struct dso *dso) in dso__set_basename() argument
1149 char *base, *lname = strdup(dso->long_name); in dso__set_basename()
1166 dso__set_short_name(dso, base, true); in dso__set_basename()
1169 int dso__name_len(const struct dso *dso) in dso__name_len() argument
1171 if (!dso) in dso__name_len()
1174 return dso->long_name_len; in dso__name_len()
1176 return dso->short_name_len; in dso__name_len()
1179 bool dso__loaded(const struct dso *dso, enum map_type type) in dso__loaded() argument
1181 return dso->loaded & (1 << type); in dso__loaded()
1184 bool dso__sorted_by_name(const struct dso *dso, enum map_type type) in dso__sorted_by_name() argument
1186 return dso->sorted_by_name & (1 << type); in dso__sorted_by_name()
1189 void dso__set_sorted_by_name(struct dso *dso, enum map_type type) in dso__set_sorted_by_name() argument
1191 dso->sorted_by_name |= (1 << type); in dso__set_sorted_by_name()
1194 struct dso *dso__new(const char *name) in dso__new()
1196 struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1); in dso__new() local
1198 if (dso != NULL) { in dso__new()
1200 strcpy(dso->name, name); in dso__new()
1201 dso__set_long_name(dso, dso->name, false); in dso__new()
1202 dso__set_short_name(dso, dso->name, false); in dso__new()
1204 dso->symbols[i] = dso->symbol_names[i] = RB_ROOT; in dso__new()
1205 dso->data.cache = RB_ROOT; in dso__new()
1206 dso->data.fd = -1; in dso__new()
1207 dso->data.status = DSO_DATA_STATUS_UNKNOWN; in dso__new()
1208 dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
1209 dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
1210 dso->is_64_bit = (sizeof(void *) == 8); in dso__new()
1211 dso->loaded = 0; in dso__new()
1212 dso->rel = 0; in dso__new()
1213 dso->sorted_by_name = 0; in dso__new()
1214 dso->has_build_id = 0; in dso__new()
1215 dso->has_srcline = 1; in dso__new()
1216 dso->a2l_fails = 1; in dso__new()
1217 dso->kernel = DSO_TYPE_USER; in dso__new()
1218 dso->needs_swap = DSO_SWAP__UNSET; in dso__new()
1219 RB_CLEAR_NODE(&dso->rb_node); in dso__new()
1220 dso->root = NULL; in dso__new()
1221 INIT_LIST_HEAD(&dso->node); in dso__new()
1222 INIT_LIST_HEAD(&dso->data.open_entry); in dso__new()
1223 pthread_mutex_init(&dso->lock, NULL); in dso__new()
1224 refcount_set(&dso->refcnt, 1); in dso__new()
1227 return dso; in dso__new()
1230 void dso__delete(struct dso *dso) in dso__delete() argument
1234 if (!RB_EMPTY_NODE(&dso->rb_node)) in dso__delete()
1236 dso->long_name); in dso__delete()
1238 symbols__delete(&dso->symbols[i]); in dso__delete()
1240 if (dso->short_name_allocated) { in dso__delete()
1241 zfree((char **)&dso->short_name); in dso__delete()
1242 dso->short_name_allocated = false; in dso__delete()
1245 if (dso->long_name_allocated) { in dso__delete()
1246 zfree((char **)&dso->long_name); in dso__delete()
1247 dso->long_name_allocated = false; in dso__delete()
1250 dso__data_close(dso); in dso__delete()
1251 auxtrace_cache__free(dso->auxtrace_cache); in dso__delete()
1252 dso_cache__free(dso); in dso__delete()
1253 dso__free_a2l(dso); in dso__delete()
1254 zfree(&dso->symsrc_filename); in dso__delete()
1255 nsinfo__zput(dso->nsinfo); in dso__delete()
1256 pthread_mutex_destroy(&dso->lock); in dso__delete()
1257 free(dso); in dso__delete()
1260 struct dso *dso__get(struct dso *dso) in dso__get() argument
1262 if (dso) in dso__get()
1263 refcount_inc(&dso->refcnt); in dso__get()
1264 return dso; in dso__get()
1267 void dso__put(struct dso *dso) in dso__put() argument
1269 if (dso && refcount_dec_and_test(&dso->refcnt)) in dso__put()
1270 dso__delete(dso); in dso__put()
1273 void dso__set_build_id(struct dso *dso, void *build_id) in dso__set_build_id() argument
1275 memcpy(dso->build_id, build_id, sizeof(dso->build_id)); in dso__set_build_id()
1276 dso->has_build_id = 1; in dso__set_build_id()
1279 bool dso__build_id_equal(const struct dso *dso, u8 *build_id) in dso__build_id_equal() argument
1281 return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0; in dso__build_id_equal()
1284 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine) in dso__read_running_kernel_build_id() argument
1291 if (sysfs__read_build_id(path, dso->build_id, in dso__read_running_kernel_build_id()
1292 sizeof(dso->build_id)) == 0) in dso__read_running_kernel_build_id()
1293 dso->has_build_id = true; in dso__read_running_kernel_build_id()
1296 int dso__kernel_module_get_build_id(struct dso *dso, in dso__kernel_module_get_build_id() argument
1304 const char *name = dso->short_name + 1; in dso__kernel_module_get_build_id()
1310 if (sysfs__read_build_id(filename, dso->build_id, in dso__kernel_module_get_build_id()
1311 sizeof(dso->build_id)) == 0) in dso__kernel_module_get_build_id()
1312 dso->has_build_id = true; in dso__kernel_module_get_build_id()
1320 struct dso *pos; in __dsos__read_build_ids()
1342 void __dsos__add(struct dsos *dsos, struct dso *dso) in __dsos__add() argument
1344 list_add_tail(&dso->node, &dsos->head); in __dsos__add()
1345 __dso__findlink_by_longname(&dsos->root, dso, NULL); in __dsos__add()
1366 dso__get(dso); in __dsos__add()
1369 void dsos__add(struct dsos *dsos, struct dso *dso) in dsos__add() argument
1372 __dsos__add(dsos, dso); in dsos__add()
1376 struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short) in __dsos__find()
1378 struct dso *pos; in __dsos__find()
1389 struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short) in dsos__find()
1391 struct dso *dso; in dsos__find() local
1393 dso = __dsos__find(dsos, name, cmp_short); in dsos__find()
1395 return dso; in dsos__find()
1398 struct dso *__dsos__addnew(struct dsos *dsos, const char *name) in __dsos__addnew()
1400 struct dso *dso = dso__new(name); in __dsos__addnew() local
1402 if (dso != NULL) { in __dsos__addnew()
1403 __dsos__add(dsos, dso); in __dsos__addnew()
1404 dso__set_basename(dso); in __dsos__addnew()
1406 dso__put(dso); in __dsos__addnew()
1408 return dso; in __dsos__addnew()
1411 struct dso *__dsos__findnew(struct dsos *dsos, const char *name) in __dsos__findnew()
1413 struct dso *dso = __dsos__find(dsos, name, false); in __dsos__findnew() local
1415 return dso ? dso : __dsos__addnew(dsos, name); in __dsos__findnew()
1418 struct dso *dsos__findnew(struct dsos *dsos, const char *name) in dsos__findnew()
1420 struct dso *dso; in dsos__findnew() local
1422 dso = dso__get(__dsos__findnew(dsos, name)); in dsos__findnew()
1424 return dso; in dsos__findnew()
1428 bool (skip)(struct dso *dso, int parm), int parm) in __dsos__fprintf_buildid() argument
1430 struct dso *pos; in __dsos__fprintf_buildid()
1444 struct dso *pos; in __dsos__fprintf()
1456 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp) in dso__fprintf_buildid() argument
1460 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); in dso__fprintf_buildid()
1464 size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp) in dso__fprintf() argument
1467 size_t ret = fprintf(fp, "dso: %s (", dso->short_name); in dso__fprintf()
1469 if (dso->short_name != dso->long_name) in dso__fprintf()
1470 ret += fprintf(fp, "%s, ", dso->long_name); in dso__fprintf()
1472 dso__loaded(dso, type) ? "" : "NOT "); in dso__fprintf()
1473 ret += dso__fprintf_buildid(dso, fp); in dso__fprintf()
1475 for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) { in dso__fprintf()
1483 enum dso_type dso__type(struct dso *dso, struct machine *machine) in dso__type() argument
1488 fd = dso__data_get_fd(dso, machine); in dso__type()
1491 dso__data_put_fd(dso); in dso__type()
1497 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) in dso__strerror_load() argument
1499 int idx, errnum = dso->load_errno; in dso__strerror_load()