]>
git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - tools/perf/util/map.c
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 struct symbol
*map__find_symbol(struct map
*self
, u64 addr
,
108 symbol_filter_t filter
)
110 if (!dso__loaded(self
->dso
, self
->type
)) {
111 int nr
= dso__load(self
->dso
, self
, filter
);
114 if (self
->dso
->has_build_id
) {
115 char sbuild_id
[BUILD_ID_SIZE
* 2 + 1];
117 build_id__sprintf(self
->dso
->build_id
,
118 sizeof(self
->dso
->build_id
),
120 pr_warning("%s with build id %s not found",
121 self
->dso
->long_name
, sbuild_id
);
123 pr_warning("Failed to open %s",
124 self
->dso
->long_name
);
125 pr_warning(", continuing without symbols\n");
127 } else if (nr
== 0) {
128 const char *name
= self
->dso
->long_name
;
129 const size_t len
= strlen(name
);
130 const size_t real_len
= len
- sizeof(DSO__DELETED
);
132 if (len
> sizeof(DSO__DELETED
) &&
133 strcmp(name
+ real_len
+ 1, DSO__DELETED
) == 0) {
134 pr_warning("%.*s was updated, restart the long running apps that use it!\n",
135 (int)real_len
, name
);
137 pr_warning("no symbols found in %s, maybe install a debug package?\n", name
);
143 return self
->dso
->find_symbol(self
->dso
, self
->type
, addr
);
146 struct map
*map__clone(struct map
*self
)
148 struct map
*map
= malloc(sizeof(*self
));
153 memcpy(map
, self
, sizeof(*self
));
158 int map__overlap(struct map
*l
, struct map
*r
)
160 if (l
->start
> r
->start
) {
166 if (l
->end
> r
->start
)
172 size_t map__fprintf(struct map
*self
, FILE *fp
)
174 return fprintf(fp
, " %Lx-%Lx %Lx %s\n",
175 self
->start
, self
->end
, self
->pgoff
, self
->dso
->name
);