From: Douglas Raillard <douglas.raillard@arm.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: acme@redhat.com, dwarves@vger.kernel.org
Subject: Re: [PATCH v1 1/2] fprintf: Allow making struct/enum/union anonymous
Date: Tue, 30 Nov 2021 16:42:55 +0000 [thread overview]
Message-ID: <cd9cfb2d-fc6c-9143-54da-8a29bc508e40@arm.com> (raw)
In-Reply-To: <YaEnHVi+i8mx54BB@kernel.org>
On 11/26/21 6:27 PM, Arnaldo Carvalho de Melo wrote:
> Em Tue, Oct 19, 2021 at 11:07:23AM +0100, Douglas RAILLARD escreveu:
>> From: Douglas Raillard <douglas.raillard@arm.com>
>>
>> Allow making inner struct enums and union anonymous.
>
> So I had to apply it by hand due to changes in the areas it touches, see
> below, and I expanded a bit the commit message, please review:
Thanks for the review, it seems to be working as well as before. That said I found a couple of issues:
1. CLI options seem to abbreviate "anonymous" into "anon" so maybe we should do the same for this one ?
2. I just found a case that generates a broken header:
struct /* hrtimer */ {
struct /* timerqueue_node */ {
struct /* rb_node */ {
long unsigned int __rb_parent_color; /* 3328 8 */
struct rb_node * rb_right; /* 3336 8 */
struct rb_node * rb_left; /* 3344 8 */
}node; /* 3328 24 */
/* typedef ktime_t -> s64 -> __s64 */ long long int expires; /* 3352 8 */
}node; /* 3328 32 */
/* typedef ktime_t -> s64 -> __s64 */ long long int _softexpires; /* 3360 8 */
enum hrtimer_restart (*function)(struct hrtimer *); /* 3368 8 */
struct hrtimer_clock_base * base; /* 3376 8 */
/* typedef u8 -> __u8 */ unsigned char state; /* 3384 1 */
/* typedef u8 -> __u8 */ unsigned char is_rel; /* 3385 1 */
/* typedef u8 -> __u8 */ unsigned char is_soft; /* 3386 1 */
/* typedef u8 -> __u8 */ unsigned char is_hard; /* 3387 1 */
}hrtick_timer; /* 3328 64 */
Here we can see that "struct rb_node" is a recursive type, so since the type
definition is now anonymous it will not compile. Detecting recursive types and
printing the name would avoid that but defeats the original purpose
of --inner_anonymous.
I can see two solutions:
1. Detecting recursive types and appending a user-defined prefix to create a
unique name.
2. Detecting recursive types and replacing the recursive references by "void *".
Solution #2 is the least invasive but will require a bit more work for the
end-user of the header:
struct hrtimer foo = *ptr;
typeof(foo.node.node) node = foo.node.node;
// Extra cast using typeof in order to change the type of tb_right from void*
// to "struct rb_node*"
((typeof(node))node.rb_right)->rb_left
Thanks,
Douglas
>
> ------ 8< ------------------------
>
> fprintf: Allow making struct/enum/union anonymous
>
> Allow making inner struct enums and union anonymous, so that when using
> -E to expand types we don't end up with multiple definitions for
> expanded inner structs, allowing the resulting expanded struct to be
> compilable.
>
> Signed-off-by: Douglas Raillard <douglas.raillard@arm.com>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
> ------ 8< ------------------------
>
> ⬢[acme@toolbox pahole]$ patch -p1 < ~/wb/1.patch
> patching file dwarves.h
> Hunk #1 succeeded at 105 (offset 6 lines).
> Hunk #2 succeeded at 1372 with fuzz 2 (offset 44 lines).
> patching file dwarves_emit.c
> patching file dwarves_fprintf.c
> Hunk #1 succeeded at 198 (offset 12 lines).
> Hunk #2 succeeded at 331 (offset 12 lines).
> Hunk #3 succeeded at 342 (offset 12 lines).
> Hunk #4 succeeded at 395 (offset 12 lines).
> Hunk #5 succeeded at 639 (offset 12 lines).
> Hunk #6 succeeded at 656 (offset 12 lines).
> Hunk #7 succeeded at 814 (offset 12 lines).
> Hunk #8 succeeded at 824 with fuzz 1 (offset 12 lines).
> Hunk #9 succeeded at 833 with fuzz 2 (offset 12 lines).
> Hunk #10 succeeded at 998 (offset 23 lines).
> Hunk #11 succeeded at 1013 (offset 23 lines).
> Hunk #12 succeeded at 1375 (offset 23 lines).
> Hunk #13 succeeded at 1396 (offset 23 lines).
> Hunk #14 succeeded at 1822 (offset 23 lines).
> Hunk #15 succeeded at 1909 (offset 23 lines).
> Hunk #16 succeeded at 1917 (offset 23 lines).
> Hunk #17 succeeded at 1929 (offset 23 lines).
> ⬢[acme@toolbox pahole]$
>
next prev parent reply other threads:[~2021-11-30 16:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-19 10:07 [PATCH v1 0/2] Anonymous inner struct Douglas RAILLARD
2021-10-19 10:07 ` [PATCH v1 1/2] fprintf: Allow making struct/enum/union anonymous Douglas RAILLARD
2021-11-26 18:27 ` Arnaldo Carvalho de Melo
2021-11-30 16:42 ` Douglas Raillard [this message]
2021-11-30 18:49 ` Arnaldo Carvalho de Melo
2021-12-01 10:56 ` Douglas Raillard
2021-12-01 12:01 ` Arnaldo Carvalho de Melo
2021-12-06 10:28 ` Douglas Raillard
2021-12-06 20:32 ` Arnaldo Carvalho de Melo
2021-10-19 10:07 ` [PATCH v1 2/2] pahole.c: Add --inner_anonymous option Douglas RAILLARD
2021-11-16 14:09 ` [PATCH v1 0/2] Anonymous inner struct Douglas Raillard
2021-11-23 0:36 ` 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=cd9cfb2d-fc6c-9143-54da-8a29bc508e40@arm.com \
--to=douglas.raillard@arm.com \
--cc=acme@kernel.org \
--cc=acme@redhat.com \
--cc=dwarves@vger.kernel.org \
/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 NNTP newsgroup(s).