From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Eduard Zingerman <eddyz87@gmail.com>
Cc: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>,
dwarves@vger.kernel.org, bpf@vger.kernel.org, kernel-team@fb.com,
ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
yhs@fb.com
Subject: Re: [PATCH dwarves] fprintf: Fix `*` not being printed for pointers with btf_type_tag
Date: Fri, 31 Mar 2023 15:33:25 -0300 [thread overview]
Message-ID: <ZCcndelzoRrKSg/Q@kernel.org> (raw)
In-Reply-To: <7728af3d77339ea4a333ca4ad9654953c4c2c5cd.camel@gmail.com>
Em Fri, Mar 31, 2023 at 05:12:31PM +0300, Eduard Zingerman escreveu:
> On Fri, 2023-03-31 at 09:20 -0300, Arnaldo Carvalho de Melo wrote:
> > Em Fri, Mar 31, 2023 at 09:14:39AM -0300, Arnaldo Carvalho de Melo escreveu:
> > > > This part I didn't understand, do you see any possibility of a
> > > > DW_TAG_LLVM_annotation pointing to another DW_TAG_LLVM_annotation?
> > >
> > > I _think_ its a noop, so will test your patch as-is, thanks!
> >
> > Tested, now we're left with normalizing base type names generated by
> > clang and gcc, things like:
> >
> > --- /tmp/gcc 2023-03-31 09:16:34.100006650 -0300
> > +++ /tmp/clang 2023-03-31 09:16:26.211789489 -0300
> > @@ -96,8 +96,8 @@
> >
> > /* XXX 4 bytes hole, try to pack */
> >
> > - long unsigned int state; /* 216 8 */
> > - long unsigned int state2; /* 224 8 */
> > + unsigned long state; /* 216 8 */
> > + unsigned long state2; /* 224 8 */
> > struct Qdisc * next_sched; /* 232 8 */
> > struct sk_buff_head skb_bad_txq; /* 240 24 */
> >
> > @@ -112,7 +112,7 @@
> > /* XXX 40 bytes hole, try to pack */
> >
> > /* --- cacheline 6 boundary (384 bytes) --- */
> > - long int privdata[]; /* 384 0 */
> > + long privdata[]; /* 384 0 */
> >
> > /* size: 384, cachelines: 6, members: 28 */
> > /* sum members: 260, holes: 4, sum holes: 124 */
> > @@ -145,19 +145,19 @@
> > /* XXX 4 bytes hole, try to pack */
> >
> > struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); /* 8 8 */
> > - int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc * *, struct netlink_ext_ack *); /* 16 8 */
> > + int (*graft)(struct Qdisc *, unsigned long, struct Qdisc *, struct Qdisc * *, struct netlink_ext_ack *); /* 16 8 */
> > - struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); /* 24 8 */
> > + struct Qdisc * (*leaf)(struct Qdisc *, unsigned long); /* 24 8 */
> > - void (*qlen_notify)(struct Qdisc *, long unsigned int); /* 32 8 */
> > + void (*qlen_notify)(struct Qdisc *, unsigned long); /* 32 8 */
> > - long unsigned int (*find)(struct Qdisc *, u32); /* 40 8 */
> > + unsigned long (*find)(struct Qdisc *, u32); /* 40 8 */
> > - int (*change)(struct Qdisc *, u32, u32, struct nlattr * *, long unsigned int *, struct netlink_ext_ack *); /* 48 8 */
> > + int (*change)(struct Qdisc *, u32, u32, struct nlattr * *, unsigned long *, struct netlink_ext_ack *); /* 48 8 */
> > - int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); /* 56 8 */
> > + int (*delete)(struct Qdisc *, unsigned long, struct netlink_ext_ack *); /* 56 8 */
> > /* --- cacheline 1 boundary (64 bytes) --- */
> > void (*walk)(struct Qdisc *, struct qdisc_walker *); /* 64 8 */
> > - struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); /* 72 8 */
> > + struct tcf_block * (*tcf_block)(struct Qdisc *, unsigned long, struct netlink_ext_ack *); /* 72 8 */
> > - long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); /* 80 8 */
> > + unsigned long (*bind_tcf)(struct Qdisc *, unsigned long, u32); /* 80 8 */
> > - void (*unbind_tcf)(struct Qdisc *, long unsigned int); /* 88 8 */
> > + void (*unbind_tcf)(struct Qdisc *, unsigned long); /* 88 8 */
> > - int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); /* 96 8 */
> > + int (*dump)(struct Qdisc *, unsigned long, struct sk_buff *, struct tcmsg *); /* 96 8 */
> > - int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); /* 104 8 */
> > + int (*dump_stats)(struct Qdisc *, unsigned long, struct gnet_dump *); /* 104 8 */
> >
> > /* size: 112, cachelines: 2, members: 14 */
> > /* sum members: 108, holes: 1, sum holes: 4 */
> > @@ -227,21 +227,21 @@
> >
> > This was affected somehow by these LLVM_annotation patches, I'll try to
> > handle this later.
>
> Are you sure it is related to LLVM_annotation patches?
My bad, was just a hunch, this is not btfdiff, where it uses just one
vmlinux, comparing its DWARF and BTF infos, this is a diff for two
vmlinux produced by different compilers (gcc and clang) for a mostly
equal .config file (modulo the ones that depend on being built by clang,
etc).
So a normalization or names is interesting, but has to be opt in, when
someone wants to do what I did, compare BTF or DWARF from produced by
different compilers, which is useful, like in this case, where I noticed
the problem by using this technique.
I'll queue this up for after 1.25 is produced.
- Arnaldo
> I tried (4d17096 "btf_encoder: Compare functions via prototypes not parameter names")
> and see the same behavior.
>
> Looking at the DWARF, itself gcc and clang use different names for these types:
>
> gcc:
> 0x0000002b: DW_TAG_base_type
> DW_AT_byte_size (0x08)
> DW_AT_encoding (DW_ATE_unsigned)
> DW_AT_name ("long unsigned int")
>
> clang:
> 0x000000f7: DW_TAG_base_type
> DW_AT_name ("unsigned long")
> DW_AT_encoding (DW_ATE_unsigned)
> DW_AT_byte_size (0x08)
>
> And the base type names are copied to BTF as is. Looks like some
> normalization is necessary either in dwarf_loader.c:base_type__new()
> or in fprintf.
>
> Thanks,
> Eduard
--
- Arnaldo
next prev parent reply other threads:[~2023-03-31 18:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 21:27 [PATCH dwarves] fprintf: Fix `*` not being printed for pointers with btf_type_tag Eduard Zingerman
2023-03-31 12:13 ` Arnaldo Carvalho de Melo
2023-03-31 12:14 ` Arnaldo Carvalho de Melo
2023-03-31 12:20 ` Arnaldo Carvalho de Melo
2023-03-31 14:12 ` Eduard Zingerman
2023-03-31 18:33 ` Arnaldo Carvalho de Melo [this message]
2023-03-31 13:35 ` Eduard Zingerman
2023-03-31 14:05 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZCcndelzoRrKSg/Q@kernel.org \
--to=acme@kernel.org \
--cc=andrii@kernel.org \
--cc=arnaldo.melo@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=dwarves@vger.kernel.org \
--cc=eddyz87@gmail.com \
--cc=kernel-team@fb.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).