https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98734
Bug ID: 98734
Summary: ABI diagnostics emitted despite always_inline
attribute
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
On POWER, I get a lot of "note: the ABI of passing aggregates with 16-byte
alignment has changed in GCC 5" diagnostics unless I pass -Wno-psabi to the
compiler. This happens even if all the functions which accept the offending
type are also annotated with __attribute__((__always_inline__)) static inline.
Not even a '#pragma GCC diagnostic ignored "-Wpsabi"' can disable it.
Here is a quick example:
#include <stdint.h>
typedef struct {
int32_t i32 __attribute__((__aligned__(16)));
} vec;
#pragma GCC diagnostic ignored "-Wpsabi"
__attribute__((__always_inline__))
static inline vec
add_i32x4 (vec a, vec b) {
vec r;
r.i32 = a.i32 + b.i32;
return r;
}
void
foo (int32_t r[4], int32_t a[4], int32_t b[4]) {
vec va, vb, vr;
__builtin_memcpy(&va, a, sizeof(va));
__builtin_memcpy(&vb, b, sizeof(vb));
vr = add_i32x4(va, vb);
__builtin_memcpy(r, &vr, sizeof(vr));
}
$ gcc -mcpu=power8 -c -o psabi.o psabi.c
psabi.c: In function ‘add_i32x4’:
psabi.c:11:1: note: the ABI of passing aggregates with 16-byte alignment has
changed in GCC 5
11 | add_i32x4 (vec a, vec b) {
| ^~~~~~~~~
Ideally, I don't think this should be emitted if the ABI isn't publicly exposed
(i.e., if the function is static, or always_inline. It would also be good if
it could be disabled with a pragma-. Finally, the diagnostic message itself
should really mention that it is triggered by -Wpsabi so people don't have to
use Google to figure out what to do to work around the issue.