[PowerPC][AIX] Warn when using pragma align(packed) on AIX.

With xlc and xlC pragma align(packed) will pack bitfields the same way
as pragma align(bit_packed). xlclang, xlclang++ and clang will
pack bitfields the same way as pragma pack(1). Issue a warning when
source code using pragma align(packed) is used to alert the user it
may not be compatable with xlc/xlC.

Differential Revision: https://reviews.llvm.org/D107506
This commit is contained in:
Sean Fertile 2021-09-29 11:53:46 -04:00
parent ea56dcb730
commit 9b10e2b1cf
3 changed files with 51 additions and 0 deletions

View File

@ -916,6 +916,9 @@ def warn_pragma_options_align_reset_failed : Warning<
InGroup<IgnoredPragmas>;
def err_pragma_options_align_mac68k_target_unsupported : Error<
"mac68k alignment pragma is not supported on this target">;
def warn_pragma_align_not_xl_compatible : Warning<
"#pragma align(packed) may not be compatible with objects generated with AIX XL C/C++">,
InGroup<AIXCompat>;
def warn_pragma_pack_invalid_alignment : Warning<
"expected #pragma pack parameter to be '1', '2', '4', '8', or '16'">,
InGroup<IgnoredPragmas>;

View File

@ -16613,6 +16613,23 @@ void Sema::ActOnTagFinishDefinition(Scope *S, Decl *TagD,
// Notify the consumer that we've defined a tag.
if (!Tag->isInvalidDecl())
Consumer.HandleTagDeclDefinition(Tag);
// Clangs implementation of #pragma align(packed) differs in bitfield layout
// from XLs and instead matches the XL #pragma pack(1) behavior.
if (Context.getTargetInfo().getTriple().isOSAIX() &&
AlignPackStack.hasValue()) {
AlignPackInfo APInfo = AlignPackStack.CurrentValue;
// Only diagnose #pragma align(packed).
if (!APInfo.IsAlignAttr() || APInfo.getAlignMode() != AlignPackInfo::Packed)
return;
const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
if (!RD)
return;
// Only warn if there is at least 1 bitfield member.
if (llvm::any_of(RD->fields(),
[](const FieldDecl *FD) { return FD->isBitField(); }))
Diag(BraceRange.getBegin(), diag::warn_pragma_align_not_xl_compatible);
}
}
void Sema::ActOnObjCContainerFinishDefinition() {

View File

@ -0,0 +1,31 @@
// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fxl-pragma-pack -verify -fsyntax-only %s
// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fxl-pragma-pack -verify -fsyntax-only %s
#pragma align(packed)
struct A { // expected-warning {{#pragma align(packed) may not be compatible with objects generated with AIX XL C/C++}}
short s1;
int : 0;
short s2;
};
struct B { // expected-warning {{#pragma align(packed) may not be compatible with objects generated with AIX XL C/C++}}
short a : 8;
short b : 8;
int c;
};
struct C {
int x, y, z;
};
struct D {
double d;
struct A a;
};
#pragma align(reset)
struct E {
int a : 28;
int : 0;
int b : 16;
};