[PATCH dwarves v8 1/5] dwarf_loader: Detect aggregate ABI register usage and clang compiler
Yonghong Song <[email protected]> Tue, 23 Jun 2026 15:28:55 -0700
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
Aggregate ABI register usage applies for both clang and gcc. Detect clang compiler for occasional clang specific cases. Signed-off-by: Yonghong Song <[email protected]> --- dwarf_loader.c | 24 ++++++++++++++++++++++++ dwarves.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/dwarf_loader.c b/dwarf_loader.c index 8ce34cb..11a2377 100644 --- a/dwarf_loader.c +++ b/dwarf_loader.c @@ -1137,6 +1137,16 @@ static void arch__set_register_params(const GElf_E= hdr *ehdr, struct cu *cu) } } =20 +static bool arch__agg_use_two_regs(const GElf_Ehdr *ehdr) +{ + switch (ehdr->e_machine) { + case EM_S390: + return false; + default: + return true; + } +} + static struct template_type_param *template_type_param__new(Dwarf_Die *d= ie, struct cu *cu, struct conf_load *conf) { struct template_type_param *ttparm =3D tag__alloc(cu, sizeof(*ttparm)); @@ -3154,6 +3164,17 @@ static unsigned long long dwarf_tag__orig_id(const= struct tag *tag, return cu->extra_dbg_info ? dtag->id : 0; } =20 +static bool attr_producer_clang(Dwarf_Die *die) +{ + const char *producer; + + producer =3D attr_string(die, DW_AT_producer, NULL); + if (!producer) + return false; + + return !!strstr(producer, "clang"); +} + struct debug_fmt_ops dwarf__ops; =20 static int die__process(Dwarf_Die *die, struct cu *cu, struct conf_load = *conf) @@ -3191,6 +3212,7 @@ static int die__process(Dwarf_Die *die, struct cu *= cu, struct conf_load *conf) } =20 cu->language =3D attr_numeric(die, DW_AT_language); + cu->producer_clang =3D attr_producer_clang(die); =20 if (conf->early_cu_filter) cu =3D conf->early_cu_filter(cu); @@ -3409,6 +3431,7 @@ static int cu__set_common(struct cu *cu, struct con= f_load *conf, =20 cu->little_endian =3D ehdr.e_ident[EI_DATA] =3D=3D ELFDATA2LSB; cu->nr_register_params =3D arch__nr_register_params(&ehdr); + cu->agg_use_two_regs =3D arch__agg_use_two_regs(&ehdr); arch__set_register_params(&ehdr, cu); return 0; } @@ -3950,6 +3973,7 @@ static int cus__merge_and_process_cu(struct cus *cu= s, struct conf_load *conf, cu->priv =3D dcu; cu->dfops =3D &dwarf__ops; cu->language =3D attr_numeric(cu_die, DW_AT_language); + cu->producer_clang =3D attr_producer_clang(cu_die); cus__add(cus, cu); } =20 diff --git a/dwarves.h b/dwarves.h index 75c311a..c0d7f5c 100644 --- a/dwarves.h +++ b/dwarves.h @@ -306,6 +306,8 @@ struct cu { uint8_t has_addr_info:1; uint8_t uses_global_strings:1; uint8_t little_endian:1; + uint8_t producer_clang:1; + uint8_t agg_use_two_regs:1; /* An aggregate like {long a; long b;} */ uint8_t nr_register_params; int register_params[ARCH_MAX_REGISTER_PARAMS]; int functions_saved; --=20 2.53.0-Meta