btf_encoder: Move percpu members from btf_elf to btf_encoder

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2021-06-03 11:29:36 -03:00
parent 7f70877b19
commit be8dac4869
4 changed files with 21 additions and 22 deletions

View File

@ -366,7 +366,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 != btfe->percpu_shndx)
if (sym_sec_idx != encoder->percpu.shndx)
return 0;
if (elf_sym__type(sym) != STT_OBJECT)
return 0;
@ -464,6 +464,20 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, struct btf *base_btf, bool s
encoder->has_index_type = false;
encoder->need_index_type = false;
encoder->array_index_id = 0;
/* find percpu section's shndx */
GElf_Shdr shdr;
Elf_Scn *sec = elf_section_by_name(cu->elf, &encoder->btfe->ehdr, &shdr, PERCPU_SECTION, NULL);
if (!sec) {
if (encoder->verbose)
printf("%s: '%s' doesn't have '%s' section\n", __func__, encoder->btfe->filename, PERCPU_SECTION);
} else {
encoder->percpu.shndx = elf_ndxscn(sec);
encoder->percpu.base_addr = shdr.sh_addr;
encoder->percpu.sec_sz = shdr.sh_size;
}
}
return encoder;
@ -597,7 +611,7 @@ int cu__encode_btf(struct cu *cu, struct btf *base_btf, int verbose, bool force,
if (skip_encoding_vars)
goto out;
if (encoder->btfe->percpu_shndx == 0 || !encoder->btfe->symtab)
if (encoder->percpu.shndx == 0 || !encoder->btfe->symtab)
goto out;
if (encoder->verbose)
@ -628,9 +642,9 @@ int cu__encode_btf(struct cu *cu, struct btf *base_btf, int verbose, bool force,
* section start), so to match DWARF and ELF symbols we need
* to negate the section base address here.
*/
if (addr < encoder->btfe->percpu_base_addr || addr >= encoder->btfe->percpu_base_addr + encoder->btfe->percpu_sec_sz)
if (addr < encoder->percpu.base_addr || addr >= encoder->percpu.base_addr + encoder->percpu.sec_sz)
continue;
addr -= encoder->btfe->percpu_base_addr;
addr -= encoder->percpu.base_addr;
if (!btf_encoder__percpu_var_exists(encoder, addr, &size, &name))
continue; /* not a per-CPU variable */

View File

@ -33,6 +33,9 @@ struct btf_encoder {
struct {
struct var_info vars[MAX_PERCPU_VAR_CNT];
int var_cnt;
uint32_t shndx;
uint64_t base_addr;
uint64_t sec_sz;
} percpu;
};

View File

@ -52,8 +52,6 @@ static int btf_var_secinfo_cmp(const void *a, const void *b)
struct btf_elf *btf_elf__new(const char *filename, Elf *elf, struct btf *base_btf)
{
struct btf_elf *btfe = zalloc(sizeof(*btfe));
GElf_Shdr shdr;
Elf_Scn *sec;
if (!btfe)
return NULL;
@ -114,19 +112,6 @@ struct btf_elf *btf_elf__new(const char *filename, Elf *elf, struct btf *base_bt
return btfe;
}
/* find percpu section's shndx */
sec = elf_section_by_name(btfe->elf, &btfe->ehdr, &shdr, PERCPU_SECTION,
NULL);
if (!sec) {
if (btf_elf__verbose)
printf("%s: '%s' doesn't have '%s' section\n", __func__,
btfe->filename, PERCPU_SECTION);
return btfe;
}
btfe->percpu_shndx = elf_ndxscn(sec);
btfe->percpu_base_addr = shdr.sh_addr;
btfe->percpu_sec_sz = shdr.sh_size;
return btfe;
errout:

View File

@ -20,9 +20,6 @@ struct btf_elf {
struct gobuffer percpu_secinfo;
char *filename;
int in_fd;
uint32_t percpu_shndx;
uint64_t percpu_base_addr;
uint64_t percpu_sec_sz;
struct btf *btf;
};