tools/perf/util/maps.c
Source file repositories/reference/linux-study-clean/tools/perf/util/maps.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/util/maps.c- Extension
.c- Size
- 36772 bytes
- Lines
- 1371
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
errno.hstdlib.hlinux/zalloc.hdebug.hdso.hmap.hmaps.hrwsem.hthread.hui/ui.hunwind.hunwind-libdw.hinternal/rc_check.h
Detected Declarations
struct maps__find_symbol_by_name_argsstruct maps__fprintf_argsfunction check_invariantsfunction maps__set_maps_by_addressfunction maps__set_nr_maps_allocatedfunction maps__set_nr_mapsfunction maps__set_maps_by_namefunction maps__maps_by_address_sortedfunction maps__set_maps_by_address_sortedfunction maps__maps_by_name_sortedfunction maps__set_maps_by_name_sortedfunction maps__nr_mapsfunction maps__set_addr_spacefunction maps__set_unwind_libunwind_opsfunction maps__set_libdw_addr_space_dwflfunction maps__initfunction maps__exitfunction maps__deletefunction maps__putfunction __maps__free_maps_by_namefunction map__start_cmpfunction __maps__sort_by_addressfunction maps__sort_by_addressfunction map__strcmpfunction maps__sort_by_namefunction maps__by_address_indexfunction maps__by_name_indexfunction map__set_kmap_mapsfunction __maps__insertfunction maps__insertfunction __maps__removefunction maps__removefunction maps__emptyfunction maps__equalfunction maps__for_each_mapfunction maps__remove_mapsfunction maps__find_symbol_by_name_cbfunction maps__find_amsfunction maps__fprintf_cbfunction maps__fprintffunction find_vmafunction __maps__insert_sortedfunction __maps__fixup_overlap_and_insertfunction maps__fixup_overlap_and_insertfunction maps__copy_fromfunction map__addr_cmpfunction map__strcmp_namefunction maps__fixup_end
Annotated Snippet
struct maps__find_symbol_by_name_args {
struct map **mapp;
const char *name;
struct symbol *sym;
};
static int maps__find_symbol_by_name_cb(struct map *map, void *data)
{
struct maps__find_symbol_by_name_args *args = data;
args->sym = map__find_symbol_by_name(map, args->name);
if (!args->sym)
return 0;
if (!map__contains_symbol(map, args->sym)) {
args->sym = NULL;
return 0;
}
if (args->mapp != NULL)
*args->mapp = map__get(map);
return 1;
}
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp)
{
struct maps__find_symbol_by_name_args args = {
.mapp = mapp,
.name = name,
.sym = NULL,
};
maps__for_each_map(maps, maps__find_symbol_by_name_cb, &args);
return args.sym;
}
int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams)
{
if (ams->addr < map__start(ams->ms.map) || ams->addr >= map__end(ams->ms.map)) {
if (maps == NULL)
return -1;
map__put(ams->ms.map);
ams->ms.map = maps__find(maps, ams->addr);
if (ams->ms.map == NULL)
return -1;
}
ams->al_addr = map__map_ip(ams->ms.map, ams->addr);
ams->ms.sym = map__find_symbol(ams->ms.map, ams->al_addr);
return ams->ms.sym ? 0 : -1;
}
struct maps__fprintf_args {
FILE *fp;
size_t printed;
};
static int maps__fprintf_cb(struct map *map, void *data)
{
struct maps__fprintf_args *args = data;
args->printed += fprintf(args->fp, "Map:");
args->printed += map__fprintf(map, args->fp);
if (verbose > 2) {
args->printed += dso__fprintf(map__dso(map), args->fp);
args->printed += fprintf(args->fp, "--\n");
}
return 0;
}
size_t maps__fprintf(struct maps *maps, FILE *fp)
{
struct maps__fprintf_args args = {
.fp = fp,
.printed = 0,
};
maps__for_each_map(maps, maps__fprintf_cb, &args);
return args.printed;
}
/*
* Find first map where end > map->start.
* Same as find_vma() in kernel.
*/
static unsigned int first_ending_after(struct maps *maps, const struct map *map)
{
struct map **maps_by_address = maps__maps_by_address(maps);
Annotation
- Immediate include surface: `errno.h`, `stdlib.h`, `linux/zalloc.h`, `debug.h`, `dso.h`, `map.h`, `maps.h`, `rwsem.h`.
- Detected declarations: `struct maps__find_symbol_by_name_args`, `struct maps__fprintf_args`, `function check_invariants`, `function maps__set_maps_by_address`, `function maps__set_nr_maps_allocated`, `function maps__set_nr_maps`, `function maps__set_maps_by_name`, `function maps__maps_by_address_sorted`, `function maps__set_maps_by_address_sorted`, `function maps__maps_by_name_sorted`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.