8 const char *map_type__name
[MAP__NR_TYPES
] = {
9 [MAP__FUNCTION
] = "Functions",
10 [MAP__VARIABLE
] = "Variables",
13 static inline int is_anon_memory(const char *filename
)
15 return strcmp(filename
, "//anon") == 0;
18 static int strcommon(const char *pathname
, char *cwd
, int cwdlen
)
22 while (n
< cwdlen
&& pathname
[n
] == cwd
[n
])
28 void map__init(struct map
*self
, enum map_type type
,
29 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
)
36 self
->map_ip
= map__map_ip
;
37 self
->unmap_ip
= map__unmap_ip
;
38 RB_CLEAR_NODE(&self
->rb_node
);
41 struct map
*map__new(struct mmap_event
*event
, enum map_type type
,
42 char *cwd
, int cwdlen
)
44 struct map
*self
= malloc(sizeof(*self
));
47 const char *filename
= event
->filename
;
48 char newfilename
[PATH_MAX
];
53 int n
= strcommon(filename
, cwd
, cwdlen
);
56 snprintf(newfilename
, sizeof(newfilename
),
58 filename
= newfilename
;
62 anon
= is_anon_memory(filename
);
65 snprintf(newfilename
, sizeof(newfilename
), "/tmp/perf-%d.map", event
->pid
);
66 filename
= newfilename
;
69 dso
= dsos__findnew(filename
);
73 map__init(self
, type
, event
->start
, event
->start
+ event
->len
,
78 self
->map_ip
= self
->unmap_ip
= identity__map_ip
;
79 } else if (strcmp(filename
, "[vdso]") == 0) {
80 dso__set_loaded(dso
, self
->type
);
90 void map__delete(struct map
*self
)
95 void map__fixup_start(struct map
*self
)
97 struct rb_root
*symbols
= &self
->dso
->symbols
[self
->type
];
98 struct rb_node
*nd
= rb_first(symbols
);
100 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
101 self
->start
= sym
->start
;
105 void map__fixup_end(struct map
*self
)
107 struct rb_root
*symbols
= &self
->dso
->symbols
[self
->type
];
108 struct rb_node
*nd
= rb_last(symbols
);
110 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
111 self
->end
= sym
->end
;
115 #define DSO__DELETED "(deleted)"
117 int map__load(struct map
*self
, symbol_filter_t filter
)
119 const char *name
= self
->dso
->long_name
;
122 if (dso__loaded(self
->dso
, self
->type
))
125 nr
= dso__load(self
->dso
, self
, filter
);
127 if (self
->dso
->has_build_id
) {
128 char sbuild_id
[BUILD_ID_SIZE
* 2 + 1];
130 build_id__sprintf(self
->dso
->build_id
,
131 sizeof(self
->dso
->build_id
),
133 pr_warning("%s with build id %s not found",
136 pr_warning("Failed to open %s", name
);
138 pr_warning(", continuing without symbols\n");
140 } else if (nr
== 0) {
141 const size_t len
= strlen(name
);
142 const size_t real_len
= len
- sizeof(DSO__DELETED
);
144 if (len
> sizeof(DSO__DELETED
) &&
145 strcmp(name
+ real_len
+ 1, DSO__DELETED
) == 0) {
146 pr_warning("%.*s was updated, restart the long "
147 "running apps that use it!\n",
148 (int)real_len
, name
);
150 pr_warning("no symbols found in %s, maybe install "
151 "a debug package?\n", name
);
157 * Only applies to the kernel, as its symtabs aren't relative like the
160 if (self
->dso
->kernel
)
161 map__reloc_vmlinux(self
);
166 struct symbol
*map__find_symbol(struct map
*self
, u64 addr
,
167 symbol_filter_t filter
)
169 if (map__load(self
, filter
) < 0)
172 return dso__find_symbol(self
->dso
, self
->type
, addr
);
175 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
176 symbol_filter_t filter
)
178 if (map__load(self
, filter
) < 0)
181 if (!dso__sorted_by_name(self
->dso
, self
->type
))
182 dso__sort_by_name(self
->dso
, self
->type
);
184 return dso__find_symbol_by_name(self
->dso
, self
->type
, name
);
187 struct map
*map__clone(struct map
*self
)
189 struct map
*map
= malloc(sizeof(*self
));
194 memcpy(map
, self
, sizeof(*self
));
199 int map__overlap(struct map
*l
, struct map
*r
)
201 if (l
->start
> r
->start
) {
207 if (l
->end
> r
->start
)
213 size_t map__fprintf(struct map
*self
, FILE *fp
)
215 return fprintf(fp
, " %Lx-%Lx %Lx %s\n",
216 self
->start
, self
->end
, self
->pgoff
, self
->dso
->name
);
220 * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
221 * map->dso->adjust_symbols==1 for ET_EXEC-like cases.
223 u64
map__rip_2objdump(struct map
*map
, u64 rip
)
225 u64 addr
= map
->dso
->adjust_symbols
?
226 map
->unmap_ip(map
, rip
) : /* RIP -> IP */
231 u64
map__objdump_2ip(struct map
*map
, u64 addr
)
233 u64 ip
= map
->dso
->adjust_symbols
?
235 map
->unmap_ip(map
, addr
); /* RIP -> IP */