On Wed, Jun 8, 2022 at 9:22 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > > On 6/8/22 3:04 PM, James Hilliard wrote: > > On Wed, Jun 8, 2022 at 6:50 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > >> On 6/8/22 8:40 AM, James Hilliard wrote: > >>> It seems the gcc preprocessor breaks when typeof is used with > >>> macros. > >>> > >>> Fixes errors like: > >>> error: expected identifier or '(' before '#pragma' > >>> 106 | SEC("cgroup/bind6") > >>> | ^~~ > >>> > >>> error: expected '=', ',', ';', 'asm' or '__attribute__' before '#pragma' > >>> 114 | char _license[] SEC("license") = "GPL"; > >>> | ^~~ > >>> > >>> Signed-off-by: James Hilliard <james.hilliard1@xxxxxxxxx> > >>> --- > >>> Changes v1 -> v2: > >>> - replace typeof with __typeof__ instead of changing pragma macros > >>> --- > >>> tools/lib/bpf/bpf_core_read.h | 16 ++++++++-------- > >>> tools/lib/bpf/bpf_helpers.h | 4 ++-- > >>> tools/lib/bpf/bpf_tracing.h | 24 ++++++++++++------------ > >>> tools/lib/bpf/btf.h | 4 ++-- > >>> tools/lib/bpf/libbpf_internal.h | 6 +++--- > >>> tools/lib/bpf/usdt.bpf.h | 6 +++--- > >>> tools/lib/bpf/xsk.h | 12 ++++++------ > >>> 7 files changed, 36 insertions(+), 36 deletions(-) > >>> > >>> diff --git a/tools/lib/bpf/bpf_core_read.h b/tools/lib/bpf/bpf_core_read.h > >>> index fd48b1ff59ca..d3a88721c9e7 100644 > >>> --- a/tools/lib/bpf/bpf_core_read.h > >>> +++ b/tools/lib/bpf/bpf_core_read.h > >>> @@ -111,7 +111,7 @@ enum bpf_enum_value_kind { > >>> }) > >>> > >>> #define ___bpf_field_ref1(field) (field) > >>> -#define ___bpf_field_ref2(type, field) (((typeof(type) *)0)->field) > >>> +#define ___bpf_field_ref2(type, field) (((__typeof__(type) *)0)->field) > >>> #define ___bpf_field_ref(args...) \ > >>> ___bpf_apply(___bpf_field_ref, ___bpf_narg(args))(args) > >>> > >> > >> Can't we just add the below? > >> > >> #ifndef typeof > >> # define typeof __typeof__ > >> #endif Ok, looks like this does appear to work, although just switching to __typeof__ may be preferable as it should work everywhere. > > > > From what I can tell it's not actually missing, but rather is > > preprocessed differently > > as the errors seem to be macro related. > > Are you saying that the above suggestion wouldn't work? Do you have some more > details? I'm mainly wondering if there's a way where we could prevent letting > typeof() usage slip through in future given from kernel side people are used > to it. I think my build env was using stale headers, I think I figured out what's going on, the typeof issue is triggered by building with -std=c17, the macro issue is unrelated and limited to the SEC macro it would appear. I suppose running builds with -std=c17 would prevent typeof() usage from slipping through. > > > I did also find this change which seems related: > > https://github.com/torvalds/linux/commit/8faf7fc597d59b142af41ddd4a2d59485f75f88a > > > >> > >> Thanks, > >> Daniel >