summaryrefslogtreecommitdiff
path: root/tools/perf/util/symbol-elf.c
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2024-05-05 00:38:01 +0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2024-05-06 21:28:49 +0300
commitee756ef7491eafd70f390343a1d90930af125a51 (patch)
treeac5e5aa5fed83cbc7db80a77e67b2045b14122de /tools/perf/util/symbol-elf.c
parent7a9418cf7f05a74cbc9d4c750ee1bfddaa11f121 (diff)
downloadlinux-ee756ef7491eafd70f390343a1d90930af125a51.tar.xz
perf dso: Add reference count checking and accessor functions
Add reference count checking to struct dso, this can help with implementing correct reference counting discipline. To avoid RC_CHK_ACCESS everywhere, add accessor functions for the variables in struct dso. The majority of the change is mechanical in nature and not easy to split up. Committer testing: 'perf test' up to this patch shows no regressions. But: util/symbol.c: In function ‘dso__load_bfd_symbols’: util/symbol.c:1683:9: error: too few arguments to function ‘dso__set_adjust_symbols’ 1683 | dso__set_adjust_symbols(dso); | ^~~~~~~~~~~~~~~~~~~~~~~ In file included from util/symbol.c:21: util/dso.h:268:20: note: declared here 268 | static inline void dso__set_adjust_symbols(struct dso *dso, bool val) | ^~~~~~~~~~~~~~~~~~~~~~~ make[6]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:106: /tmp/tmp.ZWHbQftdN6/util/symbol.o] Error 1 MKDIR /tmp/tmp.ZWHbQftdN6/tests/workloads/ make[6]: *** Waiting for unfinished jobs.... This was updated: - symbols__fixup_end(&dso->symbols, false); - symbols__fixup_duplicate(&dso->symbols); - dso->adjust_symbols = 1; + symbols__fixup_end(dso__symbols(dso), false); + symbols__fixup_duplicate(dso__symbols(dso)); + dso__set_adjust_symbols(dso); But not build tested with BUILD_NONDISTRO and libbfd devel files installed (binutils-devel on fedora). Add the missing argument: symbols__fixup_end(dso__symbols(dso), false); symbols__fixup_duplicate(dso__symbols(dso)); - dso__set_adjust_symbols(dso); + dso__set_adjust_symbols(dso, true); Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Ben Gainey <ben.gainey@arm.com> Cc: Changbin Du <changbin.du@huawei.com> Cc: Chengen Du <chengen.du@canonical.com> Cc: Colin Ian King <colin.i.king@gmail.com> Cc: Dima Kogan <dima@secretsauce.net> Cc: Ilkka Koskinen <ilkka@os.amperecomputing.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: K Prateek Nayak <kprateek.nayak@amd.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Leo Yan <leo.yan@linux.dev> Cc: Li Dong <lidong@vivo.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paran Lee <p4ranlee@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <song@kernel.org> Cc: Sun Haiyong <sunhaiyong@loongson.cn> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Tiezhu Yang <yangtiezhu@loongson.cn> Cc: Yanteng Si <siyanteng@loongson.cn> Cc: zhaimingbing <zhaimingbing@cmss.chinamobile.com> Link: https://lore.kernel.org/r/20240504213803.218974-6-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/symbol-elf.c')
-rw-r--r--tools/perf/util/symbol-elf.c94
1 files changed, 47 insertions, 47 deletions
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 0b91f813c4fa..3be5e8d1e278 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -174,7 +174,7 @@ static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
static bool elf_sec__filter(GElf_Shdr *shdr, Elf_Data *secstrs)
{
- return elf_sec__is_text(shdr, secstrs) ||
+ return elf_sec__is_text(shdr, secstrs) ||
elf_sec__is_data(shdr, secstrs);
}
@@ -312,8 +312,8 @@ static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
* DWARF DW_compile_unit has this, but we don't always have access
* to it...
*/
- if (!want_demangle(dso->kernel || kmodule))
- return demangled;
+ if (!want_demangle(dso__kernel(dso) || kmodule))
+ return demangled;
demangled = cxx_demangle_sym(elf_name, verbose > 0, verbose > 0);
if (demangled == NULL) {
@@ -470,7 +470,7 @@ static bool get_plt_sizes(struct dso *dso, GElf_Ehdr *ehdr, GElf_Shdr *shdr_plt,
}
if (*plt_entry_size)
return true;
- pr_debug("Missing PLT entry size for %s\n", dso->long_name);
+ pr_debug("Missing PLT entry size for %s\n", dso__long_name(dso));
return false;
}
@@ -654,7 +654,7 @@ static int dso__synthesize_plt_got_symbols(struct dso *dso, Elf *elf,
sym = symbol__new(shdr.sh_offset + i, shdr.sh_entsize, STB_GLOBAL, STT_FUNC, buf);
if (!sym)
goto out;
- symbols__insert(&dso->symbols, sym);
+ symbols__insert(dso__symbols(dso), sym);
}
err = 0;
out:
@@ -708,7 +708,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss)
plt_sym = symbol__new(shdr_plt.sh_offset, plt_header_size, STB_GLOBAL, STT_FUNC, ".plt");
if (!plt_sym)
goto out_elf_end;
- symbols__insert(&dso->symbols, plt_sym);
+ symbols__insert(dso__symbols(dso), plt_sym);
/* Only x86 has .plt.got */
if (machine_is_x86(ehdr.e_machine) &&
@@ -830,7 +830,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss)
goto out_elf_end;
plt_offset += plt_entry_size;
- symbols__insert(&dso->symbols, f);
+ symbols__insert(dso__symbols(dso), f);
++nr;
}
@@ -840,7 +840,7 @@ out_elf_end:
if (err == 0)
return nr;
pr_debug("%s: problems reading %s PLT info.\n",
- __func__, dso->long_name);
+ __func__, dso__long_name(dso));
return 0;
}
@@ -1175,19 +1175,19 @@ static int dso__swap_init(struct dso *dso, unsigned char eidata)
{
static unsigned int const endian = 1;
- dso->needs_swap = DSO_SWAP__NO;
+ dso__set_needs_swap(dso, DSO_SWAP__NO);
switch (eidata) {
case ELFDATA2LSB:
/* We are big endian, DSO is little endian. */
if (*(unsigned char const *)&endian != 1)
- dso->needs_swap = DSO_SWAP__YES;
+ dso__set_needs_swap(dso, DSO_SWAP__YES);
break;
case ELFDATA2MSB:
/* We are little endian, DSO is big endian. */
if (*(unsigned char const *)&endian != 0)
- dso->needs_swap = DSO_SWAP__YES;
+ dso__set_needs_swap(dso, DSO_SWAP__YES);
break;
default:
@@ -1238,11 +1238,11 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
if (fd < 0)
return -1;
- type = dso->symtab_type;
+ type = dso__symtab_type(dso);
} else {
fd = open(name, O_RDONLY);
if (fd < 0) {
- dso->load_errno = errno;
+ *dso__load_errno(dso) = errno;
return -1;
}
}
@@ -1250,37 +1250,37 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
if (elf == NULL) {
pr_debug("%s: cannot read %s ELF file.\n", __func__, name);
- dso->load_errno = DSO_LOAD_ERRNO__INVALID_ELF;
+ *dso__load_errno(dso) = DSO_LOAD_ERRNO__INVALID_ELF;
goto out_close;
}
if (gelf_getehdr(elf, &ehdr) == NULL) {
- dso->load_errno = DSO_LOAD_ERRNO__INVALID_ELF;
+ *dso__load_errno(dso) = DSO_LOAD_ERRNO__INVALID_ELF;
pr_debug("%s: cannot get elf header.\n", __func__);
goto out_elf_end;
}
if (dso__swap_init(dso, ehdr.e_ident[EI_DATA])) {
- dso->load_errno = DSO_LOAD_ERRNO__INTERNAL_ERROR;
+ *dso__load_errno(dso) = DSO_LOAD_ERRNO__INTERNAL_ERROR;
goto out_elf_end;
}
/* Always reject images with a mismatched build-id: */
- if (dso->has_build_id && !symbol_conf.ignore_vmlinux_buildid) {
+ if (dso__has_build_id(dso) && !symbol_conf.ignore_vmlinux_buildid) {
u8 build_id[BUILD_ID_SIZE];
struct build_id bid;
int size;
size = elf_read_build_id(elf, build_id, BUILD_ID_SIZE);
if (size <= 0) {
- dso->load_errno = DSO_LOAD_ERRNO__CANNOT_READ_BUILDID;
+ *dso__load_errno(dso) = DSO_LOAD_ERRNO__CANNOT_READ_BUILDID;
goto out_elf_end;
}
build_id__init(&bid, build_id, size);
if (!dso__build_id_equal(dso, &bid)) {
pr_debug("%s: build id mismatch for %s.\n", __func__, name);
- dso->load_errno = DSO_LOAD_ERRNO__MISMATCHING_BUILDID;
+ *dso__load_errno(dso) = DSO_LOAD_ERRNO__MISMATCHING_BUILDID;
goto out_elf_end;
}
}
@@ -1305,14 +1305,14 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
if (ss->opdshdr.sh_type != SHT_PROGBITS)
ss->opdsec = NULL;
- if (dso->kernel == DSO_SPACE__USER)
+ if (dso__kernel(dso) == DSO_SPACE__USER)
ss->adjust_symbols = true;
else
ss->adjust_symbols = elf__needs_adjust_symbols(ehdr);
ss->name = strdup(name);
if (!ss->name) {
- dso->load_errno = errno;
+ *dso__load_errno(dso) = errno;
goto out_elf_end;
}
@@ -1432,7 +1432,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
if (adjust_kernel_syms)
sym->st_value -= shdr->sh_addr - shdr->sh_offset;
- if (strcmp(section_name, (curr_dso->short_name + dso->short_name_len)) == 0)
+ if (strcmp(section_name, (dso__short_name(curr_dso) + dso__short_name_len(dso))) == 0)
return 0;
if (strcmp(section_name, ".text") == 0) {
@@ -1441,7 +1441,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
* kallsyms and identity maps. Overwrite it to
* map to the kernel dso.
*/
- if (*remap_kernel && dso->kernel && !kmodule) {
+ if (*remap_kernel && dso__kernel(dso) && !kmodule) {
*remap_kernel = false;
map__set_start(map, shdr->sh_addr + ref_reloc(kmap));
map__set_end(map, map__start(map) + shdr->sh_size);
@@ -1489,7 +1489,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
return 0;
}
- snprintf(dso_name, sizeof(dso_name), "%s%s", dso->short_name, section_name);
+ snprintf(dso_name, sizeof(dso_name), "%s%s", dso__short_name(dso), section_name);
curr_map = maps__find_by_name(kmaps, dso_name);
if (curr_map == NULL) {
@@ -1501,17 +1501,17 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
curr_dso = dso__new(dso_name);
if (curr_dso == NULL)
return -1;
- curr_dso->kernel = dso->kernel;
- curr_dso->long_name = dso->long_name;
- curr_dso->long_name_len = dso->long_name_len;
- curr_dso->binary_type = dso->binary_type;
- curr_dso->adjust_symbols = dso->adjust_symbols;
+ dso__set_kernel(curr_dso, dso__kernel(dso));
+ RC_CHK_ACCESS(curr_dso)->long_name = dso__long_name(dso);
+ RC_CHK_ACCESS(curr_dso)->long_name_len = dso__long_name_len(dso);
+ dso__set_binary_type(curr_dso, dso__binary_type(dso));
+ dso__set_adjust_symbols(curr_dso, dso__adjust_symbols(dso));
curr_map = map__new2(start, curr_dso);
dso__put(curr_dso);
if (curr_map == NULL)
return -1;
- if (curr_dso->kernel)
+ if (dso__kernel(curr_dso))
map__kmap(curr_map)->kmaps = kmaps;
if (adjust_kernel_syms) {
@@ -1521,7 +1521,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
} else {
map__set_mapping_type(curr_map, MAPPING_TYPE__IDENTITY);
}
- curr_dso->symtab_type = dso->symtab_type;
+ dso__set_symtab_type(curr_dso, dso__symtab_type(dso));
if (maps__insert(kmaps, curr_map))
return -1;
/*
@@ -1547,7 +1547,7 @@ static int
dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
struct symsrc *runtime_ss, int kmodule, int dynsym)
{
- struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
+ struct kmap *kmap = dso__kernel(dso) ? map__kmap(map) : NULL;
struct maps *kmaps = kmap ? map__kmaps(map) : NULL;
struct map *curr_map = map;
struct dso *curr_dso = dso;
@@ -1581,8 +1581,8 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
if (elf_section_by_name(runtime_ss->elf, &runtime_ss->ehdr, &tshdr,
".text", NULL)) {
- dso->text_offset = tshdr.sh_addr - tshdr.sh_offset;
- dso->text_end = tshdr.sh_offset + tshdr.sh_size;
+ dso__set_text_offset(dso, tshdr.sh_addr - tshdr.sh_offset);
+ dso__set_text_end(dso, tshdr.sh_offset + tshdr.sh_size);
}
if (runtime_ss->opdsec)
@@ -1641,16 +1641,16 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
* attempted to prelink vdso to its virtual address.
*/
if (dso__is_vdso(dso))
- map__set_reloc(map, map__start(map) - dso->text_offset);
+ map__set_reloc(map, map__start(map) - dso__text_offset(dso));
- dso->adjust_symbols = runtime_ss->adjust_symbols || ref_reloc(kmap);
+ dso__set_adjust_symbols(dso, runtime_ss->adjust_symbols || ref_reloc(kmap));
/*
* Initial kernel and module mappings do not map to the dso.
* Flag the fixups.
*/
- if (dso->kernel) {
+ if (dso__kernel(dso)) {
remap_kernel = true;
- adjust_kernel_syms = dso->adjust_symbols;
+ adjust_kernel_syms = dso__adjust_symbols(dso);
}
if (kmodule && adjust_kernel_syms)
@@ -1743,7 +1743,7 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
(sym.st_value & 1))
--sym.st_value;
- if (dso->kernel) {
+ if (dso__kernel(dso)) {
if (dso__process_kernel_symbol(dso, map, &sym, &shdr, kmaps, kmap, &curr_dso, &curr_map,
section_name, adjust_kernel_syms, kmodule,
&remap_kernel, max_text_sh_offset))
@@ -1792,7 +1792,7 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
arch__sym_update(f, &sym);
- __symbols__insert(&curr_dso->symbols, f, dso->kernel);
+ __symbols__insert(dso__symbols(curr_dso), f, dso__kernel(dso));
nr++;
}
@@ -1800,8 +1800,8 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
* For misannotated, zeroed, ASM function sizes.
*/
if (nr > 0) {
- symbols__fixup_end(&dso->symbols, false);
- symbols__fixup_duplicate(&dso->symbols);
+ symbols__fixup_end(dso__symbols(dso), false);
+ symbols__fixup_duplicate(dso__symbols(dso));
if (kmap) {
/*
* We need to fixup this here too because we create new
@@ -1821,16 +1821,16 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
int nr = 0;
int err = -1;
- dso->symtab_type = syms_ss->type;
- dso->is_64_bit = syms_ss->is_64_bit;
- dso->rel = syms_ss->ehdr.e_type == ET_REL;
+ dso__set_symtab_type(dso, syms_ss->type);
+ dso__set_is_64_bit(dso, syms_ss->is_64_bit);
+ dso__set_rel(dso, syms_ss->ehdr.e_type == ET_REL);
/*
* Modules may already have symbols from kallsyms, but those symbols
* have the wrong values for the dso maps, so remove them.
*/
if (kmodule && syms_ss->symtab)
- symbols__delete(&dso->symbols);
+ symbols__delete(dso__symbols(dso));
if (!syms_ss->symtab) {
/*
@@ -1838,7 +1838,7 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
* to using kallsyms. The vmlinux runtime symbols aren't
* of much use.
*/
- if (dso->kernel)
+ if (dso__kernel(dso))
return err;
} else {
err = dso__load_sym_internal(dso, map, syms_ss, runtime_ss,