forked from OSchip/llvm-project
[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:
parent
ea56dcb730
commit
9b10e2b1cf
|
@ -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>;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
};
|
Loading…
Reference in New Issue