libbpf: Handle invalid typedef emitted by old GCC
authorAndrii Nakryiko <andriin@fb.com>
Fri, 11 Oct 2019 03:29:01 +0000 (20:29 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 11 Oct 2019 21:11:55 +0000 (23:11 +0200)
Old GCC versions are producing invalid typedef for __gnuc_va_list
pointing to void. Special-case this and emit valid:

typedef __builtin_va_list __gnuc_va_list;

Reported-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20191011032901.452042-1-andriin@fb.com
tools/lib/bpf/btf_dump.c

index 87f27e2664c5defcbd9bf5182ac9ef183c6ed469..139812b46c7b918dc5b780a19caefbcefc93b09b 100644 (file)
@@ -975,6 +975,17 @@ static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id,
 {
        const char *name = btf_dump_ident_name(d, id);
 
+       /*
+        * Old GCC versions are emitting invalid typedef for __gnuc_va_list
+        * pointing to VOID. This generates warnings from btf_dump() and
+        * results in uncompilable header file, so we are fixing it up here
+        * with valid typedef into __builtin_va_list.
+        */
+       if (t->type == 0 && strcmp(name, "__gnuc_va_list") == 0) {
+               btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list");
+               return;
+       }
+
        btf_dump_printf(d, "typedef ");
        btf_dump_emit_type_decl(d, t->type, name, lvl);
 }