In the kernel we occasionally find empty structs as parameters to functions, usually because some arch-specific field(s) are not present. Ensure that when such structs are used as parameters to functions we handle the fact that no registers are used in their representation. Deliberately not using a Fixes: tag here because for this to be useful we need a more recent pahole with [1]. [1] https://lore.kernel.org/dwarves/20250502070318.1561924-1-tony.ambardar@xxxxxxxxx/ Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> --- tools/lib/bpf/bpf_tracing.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h index a8f6cd4841b0..7629650251dc 100644 --- a/tools/lib/bpf/bpf_tracing.h +++ b/tools/lib/bpf/bpf_tracing.h @@ -694,12 +694,13 @@ ____##name(unsigned long long *ctx, ##args) #endif #define ___bpf_treg_cnt(t) \ + __builtin_choose_expr(sizeof(t) == 0, 0, \ __builtin_choose_expr(sizeof(t) == 1, 1, \ __builtin_choose_expr(sizeof(t) == 2, 1, \ __builtin_choose_expr(sizeof(t) == 4, 1, \ __builtin_choose_expr(sizeof(t) == 8, 1, \ __builtin_choose_expr(sizeof(t) == 16, 2, \ - (void)0))))) + (void)0)))))) #define ___bpf_reg_cnt0() (0) #define ___bpf_reg_cnt1(t, x) (___bpf_reg_cnt0() + ___bpf_treg_cnt(t)) @@ -717,12 +718,13 @@ ____##name(unsigned long long *ctx, ##args) #define ___bpf_reg_cnt(args...) ___bpf_apply(___bpf_reg_cnt, ___bpf_narg2(args))(args) #define ___bpf_union_arg(t, x, n) \ + __builtin_choose_expr(sizeof(t) == 0, ({ t ___t; ___t; }), \ __builtin_choose_expr(sizeof(t) == 1, ({ union { __u8 z[1]; t x; } ___t = { .z = {ctx[n]}}; ___t.x; }), \ __builtin_choose_expr(sizeof(t) == 2, ({ union { __u16 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ __builtin_choose_expr(sizeof(t) == 4, ({ union { __u32 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ __builtin_choose_expr(sizeof(t) == 8, ({ union { __u64 z[1]; t x; } ___t = {.z = {ctx[n]} }; ___t.x; }), \ __builtin_choose_expr(sizeof(t) == 16, ({ union { __u64 z[2]; t x; } ___t = {.z = {ctx[n], ctx[n + 1]} }; ___t.x; }), \ - (void)0))))) + (void)0)))))) #define ___bpf_ctx_arg0(n, args...) #define ___bpf_ctx_arg1(n, t, x) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt1(t, x)) -- 2.39.3