The BTF encoder will now be storing symbol data for more than just percpu variables. Rename the data structure fields so that they are more general. Signed-off-by: Stephen Brennan <stephen.s.brennan@xxxxxxxxxx> --- btf_encoder.c | 54 ++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index a5fa04a..c914647 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -2,6 +2,7 @@ SPDX-License-Identifier: GPL-2.0-only Copyright (C) 2019 Facebook + Copyright (c) 2022, Oracle and/or its affiliates. Derived from ctf_encoder.c, which is: @@ -36,7 +37,7 @@ struct elf_function { bool generated; }; -#define MAX_PERCPU_VAR_CNT 4096 +#define MAX_VAR_CNT 4096 struct var_info { uint64_t addr; @@ -64,12 +65,12 @@ struct btf_encoder { is_rel; uint32_t array_index_id; struct { - struct var_info vars[MAX_PERCPU_VAR_CNT]; + struct var_info vars[MAX_VAR_CNT]; int var_cnt; - uint32_t shndx; - uint64_t base_addr; - uint64_t sec_sz; - } percpu; + uint32_t percpu_shndx; + uint64_t percpu_base_addr; + uint64_t percpu_sec_sz; + } variables; struct { struct elf_function *entries; int allocated; @@ -1175,8 +1176,8 @@ static int percpu_var_cmp(const void *_a, const void *_b) static bool btf_encoder__percpu_var_exists(struct btf_encoder *encoder, uint64_t addr, uint32_t *sz, const char **name) { struct var_info key = { .addr = addr }; - const struct var_info *p = bsearch(&key, encoder->percpu.vars, encoder->percpu.var_cnt, - sizeof(encoder->percpu.vars[0]), percpu_var_cmp); + const struct var_info *p = bsearch(&key, encoder->variables.vars, encoder->variables.var_cnt, + sizeof(encoder->variables.vars[0]), percpu_var_cmp); if (!p) return false; @@ -1192,7 +1193,7 @@ static int btf_encoder__collect_percpu_var(struct btf_encoder *encoder, GElf_Sym uint32_t size; /* compare a symbol's shndx to determine if it's a percpu variable */ - if (sym_sec_idx != encoder->percpu.shndx) + if (sym_sec_idx != encoder->variables.percpu_shndx) return 0; if (elf_sym__type(sym) != STT_OBJECT) return 0; @@ -1220,17 +1221,17 @@ static int btf_encoder__collect_percpu_var(struct btf_encoder *encoder, GElf_Sym * ET_EXEC file) we need to subtract the section address. */ if (!encoder->is_rel) - addr -= encoder->percpu.base_addr; + addr -= encoder->variables.percpu_base_addr; - if (encoder->percpu.var_cnt == MAX_PERCPU_VAR_CNT) { + if (encoder->variables.var_cnt == MAX_VAR_CNT) { fprintf(stderr, "Reached the limit of per-CPU variables: %d\n", - MAX_PERCPU_VAR_CNT); + MAX_VAR_CNT); return -1; } - encoder->percpu.vars[encoder->percpu.var_cnt].addr = addr; - encoder->percpu.vars[encoder->percpu.var_cnt].sz = size; - encoder->percpu.vars[encoder->percpu.var_cnt].name = sym_name; - encoder->percpu.var_cnt++; + encoder->variables.vars[encoder->variables.var_cnt].addr = addr; + encoder->variables.vars[encoder->variables.var_cnt].sz = size; + encoder->variables.vars[encoder->variables.var_cnt].name = sym_name; + encoder->variables.var_cnt++; return 0; } @@ -1242,7 +1243,7 @@ static int btf_encoder__collect_symbols(struct btf_encoder *encoder, bool collec GElf_Sym sym; /* cache variables' addresses, preparing for searching in symtab. */ - encoder->percpu.var_cnt = 0; + encoder->variables.var_cnt = 0; /* search within symtab for percpu variables */ elf_symtab__for_each_symbol_index(encoder->symtab, core_id, sym, sym_sec_idx) { @@ -1253,11 +1254,11 @@ static int btf_encoder__collect_symbols(struct btf_encoder *encoder, bool collec } if (collect_percpu_vars) { - if (encoder->percpu.var_cnt) - qsort(encoder->percpu.vars, encoder->percpu.var_cnt, sizeof(encoder->percpu.vars[0]), percpu_var_cmp); + if (encoder->variables.var_cnt) + qsort(encoder->variables.vars, encoder->variables.var_cnt, sizeof(encoder->variables.vars[0]), percpu_var_cmp); if (encoder->verbose) - printf("Found %d per-CPU variables!\n", encoder->percpu.var_cnt); + printf("Found %d per-CPU variables!\n", encoder->variables.var_cnt); } if (encoder->functions.cnt) { @@ -1288,7 +1289,7 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder, uint32_ struct tag *pos; int err = -1; - if (encoder->percpu.shndx == 0 || !encoder->symtab) + if (encoder->variables.percpu_shndx == 0 || !encoder->symtab) return 0; if (encoder->verbose) @@ -1318,9 +1319,10 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder, uint32_ * always contains virtual symbol addresses, so subtract * the section address unconditionally. */ - if (addr < encoder->percpu.base_addr || addr >= encoder->percpu.base_addr + encoder->percpu.sec_sz) + if (addr < encoder->variables.percpu_base_addr || + addr >= encoder->variables.percpu_base_addr + encoder->variables.percpu_sec_sz) continue; - addr -= encoder->percpu.base_addr; + addr -= encoder->variables.percpu_base_addr; if (!btf_encoder__percpu_var_exists(encoder, addr, &size, &name)) continue; /* not a per-CPU variable */ @@ -1468,9 +1470,9 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam if (encoder->verbose) printf("%s: '%s' doesn't have '%s' section\n", __func__, cu->filename, PERCPU_SECTION); } else { - encoder->percpu.shndx = elf_ndxscn(sec); - encoder->percpu.base_addr = shdr.sh_addr; - encoder->percpu.sec_sz = shdr.sh_size; + encoder->variables.percpu_shndx = elf_ndxscn(sec); + encoder->variables.percpu_base_addr = shdr.sh_addr; + encoder->variables.percpu_sec_sz = shdr.sh_size; } if (btf_encoder__collect_symbols(encoder, !encoder->skip_encoding_vars)) -- 2.31.1