https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92287
Bug ID: 92287 Summary: Mismatches in the calling convention for zero sized types Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: gonzalobg88 at gmail dot com Target Milestone: --- Consider this code: struct foo {}; int id_foo(struct foo bar, int x) { return x; } int id(int x) { return x; } This link shows the assembly generated for MSP430, MIPS64el, PPC32 and PPC64 (https://godbolt.org/z/yOCJ-z), reproduced here for completeness: ;; MIPS64: id_foo: j $31 move $2,$4 id: j $31 move $2,$4 ;; MSP430: id_foo: MOV.W R13, R12 RET id: RET ;; POWERPC64LE id_foo: blr .long 0 .byte 0,0,0,0,0,0,0,0 id: blr .long 0 .byte 0,0,0,0,0,0,0,0 ;; POWERPC id_foo: mr 3,4 blr id: blr Notice how MSP430 and POWERPC passes ZSTs in the calling convention, while MIPS64 and POWERPC64LE ignore them. I can't find an ABI specification document for the MSP430 and POWERPC targets, so I was wondering whether this is a bug in the GCC implementation of the ABI for these targets. And if not, then why do these targets care about passing zero-sized types in their calling convention? Is this documented anywhere? (Note: other targets might be affected as well)