emit: Do not emit a forward declararion to a nameless struct
This was happening here: $ pfunct --compile /home/acme/git/build/v5.1-rc4+/block/partitions/check.o > a.c ; head -29 a.c struct block_device; struct (null); typedef _Bool bool; struct parsed_partitions { struct block_device * bdev; /* 0 8 */ char name[32]; /* 8 32 */ struct { sector_t from; /* 40 8 */ sector_t size; /* 48 8 */ int flags; /* 56 4 */ bool has_info; /* 60 1 */ struct partition_meta_info info; /* 61 101 */ } * parts; /* 40 8 */ int next; /* 48 4 */ int limit; /* 52 4 */ bool access_beyond_eod; /* 56 1 */ /* XXX 7 bytes hole, try to pack */ /* --- cacheline 1 boundary (64 bytes) --- */ char * pp_buf; /* 64 8 */ /* size: 72, cachelines: 2, members: 7 */ /* sum members: 65, holes: 1, sum holes: 7 */ /* last cacheline: 8 bytes */ }; $ I.e. we saw a pointer to a struct, so all we need is a forward declaration for that function, right? Not if it is defined inline, so just don't emit the forward declaration if the struct name is NULL. Oops, the offsets in a struct defined inline and that the member is a pointer need to have its offset restarted from zero... Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
cf459ca16f
commit
cfa377c238
@ -206,9 +206,12 @@ int type__emit_fwd_decl(struct type *ctype, const struct cu *cu,
|
||||
if (ctype->fwd_decl_emitted)
|
||||
return 0;
|
||||
|
||||
const char *name = type__name(ctype, cu);
|
||||
if (name == NULL)
|
||||
return 0;
|
||||
|
||||
/* Ok, lets look at the previous CUs: */
|
||||
if (type_emissions__find_fwd_decl(emissions, cu,
|
||||
type__name(ctype, cu)) != NULL) {
|
||||
if (type_emissions__find_fwd_decl(emissions, cu, name) != NULL) {
|
||||
/*
|
||||
* Yes, so lets mark it visited on this CU too,
|
||||
* to speed up the lookup.
|
||||
|
Loading…
Reference in New Issue
Block a user