8 static inline int is_anon_memory(const char *filename
)
10 return strcmp(filename
, "//anon") == 0;
13 static int strcommon(const char *pathname
, char *cwd
, int cwdlen
)
17 while (n
< cwdlen
&& pathname
[n
] == cwd
[n
])
23 void map__init(struct map
*self
, enum map_type type
,
24 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
)
31 self
->map_ip
= map__map_ip
;
32 self
->unmap_ip
= map__unmap_ip
;
33 RB_CLEAR_NODE(&self
->rb_node
);
36 struct map
*map__new(struct mmap_event
*event
, enum map_type type
,
37 char *cwd
, int cwdlen
)
39 struct map
*self
= malloc(sizeof(*self
));
42 const char *filename
= event
->filename
;
43 char newfilename
[PATH_MAX
];
48 int n
= strcommon(filename
, cwd
, cwdlen
);
51 snprintf(newfilename
, sizeof(newfilename
),
53 filename
= newfilename
;
57 anon
= is_anon_memory(filename
);
60 snprintf(newfilename
, sizeof(newfilename
), "/tmp/perf-%d.map", event
->pid
);
61 filename
= newfilename
;
64 dso
= dsos__findnew(filename
);
68 map__init(self
, type
, event
->start
, event
->start
+ event
->len
,
71 if (self
->dso
== vdso
|| anon
)
72 self
->map_ip
= self
->unmap_ip
= identity__map_ip
;
80 void map__delete(struct map
*self
)
85 void map__fixup_start(struct map
*self
)
87 struct rb_root
*symbols
= &self
->dso
->symbols
[self
->type
];
88 struct rb_node
*nd
= rb_first(symbols
);
90 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
91 self
->start
= sym
->start
;
95 void map__fixup_end(struct map
*self
)
97 struct rb_root
*symbols
= &self
->dso
->symbols
[self
->type
];
98 struct rb_node
*nd
= rb_last(symbols
);
100 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
101 self
->end
= sym
->end
;
105 #define DSO__DELETED "(deleted)"
107 int map__load(struct map
*self
, struct perf_session
*session
,
108 symbol_filter_t filter
)
110 const char *name
= self
->dso
->long_name
;
113 if (dso__loaded(self
->dso
, self
->type
))
116 nr
= dso__load(self
->dso
, self
, session
, filter
);
118 if (self
->dso
->has_build_id
) {
119 char sbuild_id
[BUILD_ID_SIZE
* 2 + 1];
121 build_id__sprintf(self
->dso
->build_id
,
122 sizeof(self
->dso
->build_id
),
124 pr_warning("%s with build id %s not found",
127 pr_warning("Failed to open %s", name
);
129 pr_warning(", continuing without symbols\n");
131 } else if (nr
== 0) {
132 const size_t len
= strlen(name
);
133 const size_t real_len
= len
- sizeof(DSO__DELETED
);
135 if (len
> sizeof(DSO__DELETED
) &&
136 strcmp(name
+ real_len
+ 1, DSO__DELETED
) == 0) {
137 pr_warning("%.*s was updated, restart the long "
138 "running apps that use it!\n",
139 (int)real_len
, name
);
141 pr_warning("no symbols found in %s, maybe install "
142 "a debug package?\n", name
);
151 struct symbol
*map__find_symbol(struct map
*self
, struct perf_session
*session
,
152 u64 addr
, symbol_filter_t filter
)
154 if (map__load(self
, session
, filter
) < 0)
157 return dso__find_symbol(self
->dso
, self
->type
, addr
);
160 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
161 struct perf_session
*session
,
162 symbol_filter_t filter
)
164 if (map__load(self
, session
, filter
) < 0)
167 if (!dso__sorted_by_name(self
->dso
, self
->type
))
168 dso__sort_by_name(self
->dso
, self
->type
);
170 return dso__find_symbol_by_name(self
->dso
, self
->type
, name
);
173 struct map
*map__clone(struct map
*self
)
175 struct map
*map
= malloc(sizeof(*self
));
180 memcpy(map
, self
, sizeof(*self
));
185 int map__overlap(struct map
*l
, struct map
*r
)
187 if (l
->start
> r
->start
) {
193 if (l
->end
> r
->start
)
199 size_t map__fprintf(struct map
*self
, FILE *fp
)
201 return fprintf(fp
, " %Lx-%Lx %Lx %s\n",
202 self
->start
, self
->end
, self
->pgoff
, self
->dso
->name
);