ZarkoCA updated this revision to Diff 358087. ZarkoCA added a comment. - Warning should only apply to members of struct - Re-word warning slightly
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105660/new/ https://reviews.llvm.org/D105660 Files: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclAttr.cpp clang/test/Sema/aix-attr-align.c Index: clang/test/Sema/aix-attr-align.c =================================================================== --- /dev/null +++ clang/test/Sema/aix-attr-align.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -verify -fsyntax-only %s +// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -verify -fsyntax-only %s + +struct S { + int a[8] __attribute__((aligned(8))); // no-warning +}; + +struct T { + int a[4] __attribute__((aligned(16))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +}; + +struct U { + int a[2] __attribute__((aligned(32))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +}; + int a[8] __attribute__((aligned(8))); // no-warning + int b[4] __attribute__((aligned(16))); // no-warning + int c[2] __attribute__((aligned(32))); // no-warning Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -3953,6 +3953,13 @@ return; uint64_t AlignVal = Alignment.getZExtValue(); + // 16 byte ByVal alignment not due to a vector member is not honoured by XL + // on AIX. Emit a warning here that users are generating binary incompatible + // code to be safe. + if (const auto *FD = dyn_cast<FieldDecl>(D)) { + if (Context.getTargetInfo().getTriple().isOSAIX() && AlignVal >= 16) + Diag(AttrLoc, diag::warn_not_xl_compatible) << E->getSourceRange(); + } // C++11 [dcl.align]p2: // -- if the constant expression evaluates to zero, the alignment Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3251,6 +3251,9 @@ : Warning<"requested alignment must be %0 bytes or smaller; maximum " "alignment assumed">, InGroup<DiagGroup<"builtin-assume-aligned-alignment">>; +def warn_not_xl_compatible + : Warning<"requesting an alignment of arguments 16 bytes or greater is not" + " binary compatible with AIX XL 16.1 and older">; def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning< "%q0 redeclared without %1 attribute: previous %1 ignored">, InGroup<MicrosoftInconsistentDllImport>;
Index: clang/test/Sema/aix-attr-align.c =================================================================== --- /dev/null +++ clang/test/Sema/aix-attr-align.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -verify -fsyntax-only %s +// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -verify -fsyntax-only %s + +struct S { + int a[8] __attribute__((aligned(8))); // no-warning +}; + +struct T { + int a[4] __attribute__((aligned(16))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +}; + +struct U { + int a[2] __attribute__((aligned(32))); // expected-warning {{requested alignment of arguments 16 bytes or greater is not compatible with previous versions of the AIX XL compiler}} +}; + int a[8] __attribute__((aligned(8))); // no-warning + int b[4] __attribute__((aligned(16))); // no-warning + int c[2] __attribute__((aligned(32))); // no-warning Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -3953,6 +3953,13 @@ return; uint64_t AlignVal = Alignment.getZExtValue(); + // 16 byte ByVal alignment not due to a vector member is not honoured by XL + // on AIX. Emit a warning here that users are generating binary incompatible + // code to be safe. + if (const auto *FD = dyn_cast<FieldDecl>(D)) { + if (Context.getTargetInfo().getTriple().isOSAIX() && AlignVal >= 16) + Diag(AttrLoc, diag::warn_not_xl_compatible) << E->getSourceRange(); + } // C++11 [dcl.align]p2: // -- if the constant expression evaluates to zero, the alignment Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3251,6 +3251,9 @@ : Warning<"requested alignment must be %0 bytes or smaller; maximum " "alignment assumed">, InGroup<DiagGroup<"builtin-assume-aligned-alignment">>; +def warn_not_xl_compatible + : Warning<"requesting an alignment of arguments 16 bytes or greater is not" + " binary compatible with AIX XL 16.1 and older">; def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning< "%q0 redeclared without %1 attribute: previous %1 ignored">, InGroup<MicrosoftInconsistentDllImport>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits