From: Yonghong Song <yonghong.song@linux.dev>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Andrew Pinski <quic_apinski@quicinc.com>,
Namhyung Kim <namhyung@kernel.org>, Sam James <sam@gentoo.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
"Liang, Kan" <kan.liang@linux.intel.com>,
"linux-perf-users@vger.kernel.org"
<linux-perf-users@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"bpf@vger.kernel.org" <bpf@vger.kernel.org>
Subject: Re: [PATCH] perf: use __builtin_preserve_field_info for GCC compatibility
Date: Sat, 4 Oct 2025 16:19:48 -0700 [thread overview]
Message-ID: <80d42369-3e23-453e-86a1-2fdb57bb78c8@linux.dev> (raw)
In-Reply-To: <aN629m1MlMXYh1te@x1>
On 10/2/25 10:31 AM, Arnaldo Carvalho de Melo wrote:
> On Wed, Aug 06, 2025 at 05:27:02PM -0700, Yonghong Song wrote:
>> On 8/6/25 4:57 PM, Andrew Pinski wrote:
>>>> -----Original Message-----
>>>> From: Namhyung Kim <namhyung@kernel.org>
>>>> Sent: Wednesday, August 6, 2025 4:34 PM
>>>> To: Sam James <sam@gentoo.org>
>>>> Cc: Peter Zijlstra <peterz@infradead.org>; Ingo Molnar
>>>> <mingo@redhat.com>; Arnaldo Carvalho de Melo
>>>> <acme@kernel.org>; Mark Rutland
>>>> <mark.rutland@arm.com>; Alexander Shishkin
>>>> <alexander.shishkin@linux.intel.com>; Jiri Olsa
>>>> <jolsa@kernel.org>; Ian Rogers <irogers@google.com>; Adrian
>>>> Hunter <adrian.hunter@intel.com>; Liang, Kan
>>>> <kan.liang@linux.intel.com>; Andrew Pinski
>>>> <quic_apinski@quicinc.com>; linux-perf-
>>>> users@vger.kernel.org; linux-kernel@vger.kernel.org;
>>>> bpf@vger.kernel.org
>>>> Subject: Re: [PATCH] perf: use __builtin_preserve_field_info
>>>> for GCC compatibility
>>>>
>>>> Hello,
>>>>
>>>> On Wed, Aug 06, 2025 at 01:03:01AM +0100, Sam James
>>>> wrote:
>>>>> When exploring building bpf_skel with GCC's BPF support,
>>>> there was a
>>>>> buid failure because of bpf_core_field_exists vs the
>>>> mem_hops bitfield:
>>>>> ```
>>>>> In file included from util/bpf_skel/sample_filter.bpf.c:6:
>>>>> util/bpf_skel/sample_filter.bpf.c: In function
>>>> 'perf_get_sample':
>>>>> tools/perf/libbpf/include/bpf/bpf_core_read.h:169:42:
>>>> error: cannot take address of bit-field 'mem_hops'
>>>>> 169 | #define ___bpf_field_ref1(field) (&(field))
>>>>> | ^
>>>>> tools/perf/libbpf/include/bpf/bpf_helpers.h:222:29: note: in
>>>> expansion of macro '___bpf_field_ref1'
>>>>> 222 | #define ___bpf_concat(a, b) a ## b
>>>>> | ^
>>>>> tools/perf/libbpf/include/bpf/bpf_helpers.h:225:29: note: in
>>>> expansion of macro '___bpf_concat'
>>>>> 225 | #define ___bpf_apply(fn, n) ___bpf_concat(fn, n)
>>>>> | ^~~~~~~~~~~~~
>>>>> tools/perf/libbpf/include/bpf/bpf_core_read.h:173:9: note:
>>>> in expansion of macro '___bpf_apply'
>>>>> 173 | ___bpf_apply(___bpf_field_ref,
>>>> ___bpf_narg(args))(args)
>>>>> | ^~~~~~~~~~~~
>>>>> tools/perf/libbpf/include/bpf/bpf_core_read.h:188:39: note:
>>>> in expansion of macro '___bpf_field_ref'
>>>>> 188 |
>>>> __builtin_preserve_field_info(___bpf_field_ref(field),
>>>> BPF_FIELD_EXISTS)
>>>>> | ^~~~~~~~~~~~~~~~
>>>>> util/bpf_skel/sample_filter.bpf.c:167:29: note: in expansion
>>>> of macro 'bpf_core_field_exists'
>>>>> 167 | if (bpf_core_field_exists(data-
>>>>> mem_hops))
>>>>> | ^~~~~~~~~~~~~~~~~~~~~
>>>>> cc1: error: argument is not a field access ```
>>>>>
>>>>> ___bpf_field_ref1 was adapted for GCC in
>>>>> 12bbcf8e840f40b82b02981e96e0a5fbb0703ea9
>>>>> but the trick added for compatibility in
>>>>> 3a8b8fc3174891c4c12f5766d82184a82d4b2e3e
>>>>> isn't compatible with that as an address is used as an
>>>> argument.
>>>>> Workaround this by calling __builtin_preserve_field_info
>>>> directly as
>>>>> the bpf_core_field_exists macro does, but without the
>>>> ___bpf_field_ref use.
>>>>
>>>> IIUC GCC doesn't support bpf_core_fields_exists() for bitfield
>>>> members, right? Is it gonna change in the future?
>>> Let's discuss how __builtin_preserve_field_info is handled in the first place for BPF. Right now it seems it is passed some expression as the first argument is never evaluated.
>>> The problem is GCC's implementation of __builtin_preserve_field_info is all in the backend and the front end does not understand of the special rules here.
>>>
>>> GCC implements some "special" builtins in the front-end but not by the normal function call rules but parsing them separately; this is how __builtin_offsetof and a few others are implemented in both the C and C++ front-ends (and implemented separately). Now we could have add a hook to allow a backend to something similar and maybe that is the best way forward here.
>>> But it won't be __builtin_preserve_field_info but rather `__builtin_preserve_field_type_info(type,field,kind)` instead.
>>>
>>> __builtin_preserve_enum_type_value would also be added with the following:
>>> __builtin_preserve_enum_type_value(enum_type, enum_value, kind)
>>>
>>> And change all of the rest of the builtins to accept a true type argument rather than having to cast an null pointer to that type.
>>>
>>> Will clang implement a similar builtin?
>> The clang only has one builtin for some related relocations:
>> __builtin_preserve_field_info(..., BPF_FIELD_EXISTS)
>> __builtin_preserve_field_info(..., BPF_FIELD_BYTE_OFFSET)
>> ...
>> They are all used in bpf_core_read.h.
>>
>>> Note this won't be done until at least GCC 16; maybe not until GCC 17 depending on if I or someone else gets time to implement the front-end parts which is acceptable to both the C and C++ front-ends.
> So I'm taking the patch as-is, ok?
>
> But first we need the Signed-off-by tag from Andrew Pinski as he is
> listed in a Co-authored-by, that I replaced with Co-developed-by as its
> the term used for this purpose in:
>
> Yonghong, can I add an Acked-by: you since you participated in this
> discussion agreeing with the original patch (If I'm not mistaken)?
LGTM.
Acked-by: Yonghong Song <yonghong.song@linux.dev>
next prev parent reply other threads:[~2025-10-04 23:19 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-06 0:03 [PATCH] perf: use __builtin_preserve_field_info for GCC compatibility Sam James
2025-08-06 23:33 ` Namhyung Kim
2025-08-06 23:57 ` Andrew Pinski
2025-08-07 0:27 ` Yonghong Song
2025-10-02 17:31 ` Arnaldo Carvalho de Melo
2025-10-02 17:35 ` Andrew Pinski
2025-10-02 17:58 ` Arnaldo Carvalho de Melo
2025-10-02 18:01 ` Sam James
2025-10-02 18:09 ` Andrew Pinski
2025-10-04 23:19 ` Yonghong Song [this message]
2025-10-06 18:22 ` Arnaldo Carvalho de Melo
2025-08-07 0:15 ` Yonghong Song
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=80d42369-3e23-453e-86a1-2fdb57bb78c8@linux.dev \
--to=yonghong.song@linux.dev \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=bpf@vger.kernel.org \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=quic_apinski@quicinc.com \
--cc=sam@gentoo.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).