inlinecall

Print call sites of an inline function
git clone git://git.margiolis.net/inlinecall.git
Log | Files | Refs | README | LICENSE

commit 8e355b2580c619c3e57c5b17e84c9a71a931d640
parent 20e94fe32526308872442e947dc6f37f873f5a39
Author: Christos Margiolis <christos@margiolis.net>
Date:   Tue, 28 Feb 2023 19:54:10 +0200

fix lowpc/highpc bug from recent commit, embed GElf_Shdr into section

Diffstat:
Minlinecall.c | 37+++++++++++++++----------------------
1 file changed, 15 insertions(+), 22 deletions(-)

diff --git a/inlinecall.c b/inlinecall.c @@ -16,11 +16,7 @@ struct elf_info { Elf *elf; struct section { Elf_Scn *scn; - uint64_t sz; - uint64_t entsize; - uint64_t type; - uint32_t link; - uint32_t info; + GElf_Shdr sh; } *sl; size_t shnum; }; @@ -69,7 +65,7 @@ parse_die(Dwarf_Debug dbg, Dwarf_Die die, int level, int flag) Dwarf_Die die_next; Dwarf_Ranges *ranges, *rp; Dwarf_Attribute attp; - Dwarf_Addr base0, v_addr; + Dwarf_Addr base0, lowpc, highpc; Dwarf_Off dieoff, cuoff, culen, v_off; Dwarf_Unsigned line, nbytes, v_udata; Dwarf_Signed nranges; @@ -161,12 +157,12 @@ parse_die(Dwarf_Debug dbg, Dwarf_Die die, int level, int flag) goto cont; } - res = dwarf_lowpc(die_root, &v_addr, &error); + res = dwarf_lowpc(die_root, &lowpc, &error); if (res != DW_DLV_OK) { warnx("%s", dwarf_errmsg(error)); goto cont; } - base0 = v_addr; + base0 = lowpc; naddrs = nranges - 1; addr = emalloc(naddrs * sizeof(struct addr_pair)); @@ -180,20 +176,20 @@ parse_die(Dwarf_Debug dbg, Dwarf_Die die, int level, int flag) dwarf_ranges_dealloc(dbg, ranges, nranges); } else { /* DIE has high/low PC boundaries */ - res = dwarf_lowpc(die_root, &v_addr, &error); + res = dwarf_lowpc(die, &lowpc, &error); if (res != DW_DLV_OK) { warnx("%s", dwarf_errmsg(error)); goto cont; } - res = dwarf_highpc(die_root, &v_udata, &error); + res = dwarf_highpc(die, &highpc, &error); if (res != DW_DLV_OK) { warnx("%s", dwarf_errmsg(error)); goto cont; } naddrs = 1; addr = emalloc(sizeof(struct addr_pair)); - addr[0].lo = v_addr; /* lowpc */ - addr[0].hi = v_addr + v_udata; /* lowpc + highpc */ + addr[0].lo = lowpc; + addr[0].hi = lowpc + highpc; } } else goto cont; @@ -298,11 +294,11 @@ find_caller_func(struct addr_pair addr) for (i = 0; i < ei.shnum; i++) { s = &ei.sl[i]; - if (s->type != SHT_SYMTAB && s->type != SHT_DYNSYM) + if (s->sh.sh_type != SHT_SYMTAB && s->sh.sh_type != SHT_DYNSYM) continue; - if (s->link >= ei.shnum) + if (s->sh.sh_link >= ei.shnum) continue; - stab = s->link; + stab = s->sh.sh_link; (void)elf_errno(); if ((d = elf_getdata(s->scn, NULL)) == NULL) { if (elf_errno() != 0) @@ -311,11 +307,11 @@ find_caller_func(struct addr_pair addr) } if (d->d_size <= 0) continue; - if (s->entsize == 0) + if (s->sh.sh_entsize == 0) continue; - else if (s->sz / s->entsize > INT_MAX) + else if (s->sh.sh_size / s->sh.sh_entsize > INT_MAX) continue; - len = (int)(s->sz / s->entsize); + len = (int)(s->sh.sh_size / s->sh.sh_entsize); for (j = 0; j < len; j++) { if (gelf_getsym(d, j, &sym) != &sym) { warnx("gelf_getsym(): %s", elf_errmsg(-1)); @@ -422,10 +418,7 @@ main(int argc, char *argv[]) continue; s = &ei.sl[ndx]; s->scn = scn; - s->sz = sh.sh_size; - s->entsize = sh.sh_entsize; - s->type = sh.sh_type; - s->link = sh.sh_link; + s->sh = sh; } while ((scn = elf_nextscn(ei.elf, scn)) != NULL); if (elf_errno() != 0) warnx("elf_nextscn(): %s", elf_errmsg(-1));