From 05921c47f557036811ef5c1a887ea6fd0f8ea5a4 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Tue, 16 Apr 2019 13:49:29 -0300 Subject: [PATCH] emit: Handle typedefs that are a pointer to typedefs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: $ pfunct --compile /home/acme/git/build/v5.1-rc4+/kernel/sched/autogroup.o > a.c $ gcc -g -c a.c a.c:1656:9: error: unknown type name ‘__signalfn_t’ typedef __signalfn_t * __sighandler_t; ^~~~~~~~~~~~ a.c:1658:9: error: unknown type name ‘__restorefn_t’ typedef __restorefn_t * __sigrestore_t; ^~~~~~~~~~~~~ $ After: $ pfunct --compile /home/acme/git/build/v5.1-rc4+/kernel/sched/autogroup.o > a.c $ gcc -g -c a.c $ egrep '__(restore|signal)fn_t' -A10 a.c typedef void (__signalfn_t)(int); typedef __signalfn_t * __sighandler_t; typedef void (__restorefn_t)(void); typedef __restorefn_t * __sigrestore_t; struct sigaction { __sighandler_t sa_handler; /* 0 8 */ long unsigned int sa_flags; /* 8 8 */ __sigrestore_t sa_restorer; /* 16 8 */ sigset_t sa_mask; /* 24 8 */ /* size: 32, cachelines: 1, members: 4 */ /* last cacheline: 32 bytes */ }; $ Signed-off-by: Arnaldo Carvalho de Melo --- dwarves_emit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dwarves_emit.c b/dwarves_emit.c index e983cf6..e583d18 100644 --- a/dwarves_emit.c +++ b/dwarves_emit.c @@ -138,7 +138,12 @@ static int typedef__emit_definitions(struct tag *tdef, struct cu *cu, case DW_TAG_pointer_type: ptr_type = cu__type(cu, type->type); /* void ** can make ptr_type be NULL */ - if (ptr_type == NULL || ptr_type->tag != DW_TAG_subroutine_type) + if (ptr_type == NULL) + break; + if (ptr_type->tag == DW_TAG_typedef) { + typedef__emit_definitions(ptr_type, cu, emissions, fp); + break; + } else if (ptr_type->tag != DW_TAG_subroutine_type) break; type = ptr_type; is_pointer = 1;