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
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 did also find this change which seems related:
https://github.com/torvalds/linux/commit/8faf7fc597d59b142af41ddd4a2d59485f75f88a
Thanks,
Daniel