struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, u64 pgoff, u32 pid, u32 d_maj, u32 d_min, u64 ino, u64 ino_gen, char *filename, enum map_type type) { struct map *map = malloc(sizeof(*map)); if (map != NULL) { char newfilename[PATH_MAX]; struct dso *dso; int anon, no_dso, vdso; anon = is_anon_memory(filename); vdso = is_vdso_map(filename); no_dso = is_no_dso_memory(filename); map->maj = d_maj; map->min = d_min; map->ino = ino; map->ino_generation = ino_gen; if ((anon || no_dso) && type == MAP__FUNCTION) { snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid); filename = newfilename; } if (vdso) { pgoff = 0; dso = vdso__dso_findnew(dsos__list); } else dso = __dsos__findnew(dsos__list, filename); if (dso == NULL) goto out_delete; map__init(map, type, start, start + len, pgoff, dso); if (anon || no_dso) { map->map_ip = map->unmap_ip = identity__map_ip; /* * Set memory without DSO as loaded. All map__find_* * functions still return NULL, and we avoid the * unnecessary map__load warning. */ if (type != MAP__FUNCTION) dso__set_loaded(dso, map->type); } } return map; out_delete: free(map); return NULL; }
struct map *map__new(struct mmap_event *event, enum map_type type, char *cwd, int cwdlen) { struct map *self = malloc(sizeof(*self)); if (self != NULL) { const char *filename = event->filename; char newfilename[PATH_MAX]; struct dso *dso; int anon; if (cwd) { int n = strcommon(filename, cwd, cwdlen); if (n == cwdlen) { snprintf(newfilename, sizeof(newfilename), ".%s", filename + n); filename = newfilename; } } anon = is_anon_memory(filename); if (anon) { snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", event->pid); filename = newfilename; } dso = dsos__findnew(filename); if (dso == NULL) goto out_delete; map__init(self, type, event->start, event->start + event->len, event->pgoff, dso); if (anon) { set_identity: self->map_ip = self->unmap_ip = identity__map_ip; } else if (strcmp(filename, "[vdso]") == 0) { dso__set_loaded(dso, self->type); goto set_identity; } } return self; out_delete: free(self); return NULL; }
struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, u64 pgoff, u32 pid, char *filename, enum map_type type) { struct map *self = malloc(sizeof(*self)); if (self != NULL) { char newfilename[PATH_MAX]; struct dso *dso; int anon, no_dso; anon = is_anon_memory(filename); no_dso = is_no_dso_memory(filename); if (anon) { snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid); filename = newfilename; } dso = __dsos__findnew(dsos__list, filename); if (dso == NULL) goto out_delete; map__init(self, type, start, start + len, pgoff, dso); if (anon || no_dso) { self->map_ip = self->unmap_ip = identity__map_ip; /* * Set memory without DSO as loaded. All map__find_* * functions still return NULL, and we avoid the * unnecessary map__load warning. */ if (no_dso) dso__set_loaded(dso, self->type); } } return self; out_delete: free(self); return NULL; }
struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, u64 pgoff, u32 pid, char *filename, enum map_type type) { struct map *self = malloc(sizeof(*self)); if (self != NULL) { char newfilename[PATH_MAX]; struct dso *dso; int anon; anon = is_anon_memory(filename); if (anon) { snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid); filename = newfilename; } dso = __dsos__findnew(dsos__list, filename); if (dso == NULL) goto out_delete; map__init(self, type, start, start + len, pgoff, dso); if (anon) { set_identity: self->map_ip = self->unmap_ip = identity__map_ip; } else if (strcmp(filename, "[vdso]") == 0) { dso__set_loaded(dso, self->type); goto set_identity; } } return self; out_delete: free(self); return NULL; }