[llvm-branch-commits] [clang] f0abe2a - [Frontend] Add pragma align natural and sort out pragma pack stack effect
Author: Xiangling Liao Date: 2021-01-13T10:53:24-05:00 New Revision: f0abe2aeaca76a24b1e17295ab797068c057a15d URL: https://github.com/llvm/llvm-project/commit/f0abe2aeaca76a24b1e17295ab797068c057a15d DIFF: https://github.com/llvm/llvm-project/commit/f0abe2aeaca76a24b1e17295ab797068c057a15d.diff LOG: [Frontend] Add pragma align natural and sort out pragma pack stack effect - Implemente the natural align for XL on AIX - Sort out pragma pack stack effect - Add -fxl-pragma-stack option to enable XL on AIX pragma stack effect Differential Revision: https://reviews.llvm.org/D87702 Added: clang/test/Driver/aix-pragma-pack.c clang/test/Layout/aix-power-natural-interaction.cpp clang/test/PCH/aix-pragma-pack.c clang/test/Sema/aix-pragma-pack-and-align.c Modified: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/include/clang/Basic/LangOptions.def clang/include/clang/Driver/Options.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTReader.h clang/include/clang/Serialization/ASTWriter.h clang/lib/AST/RecordLayoutBuilder.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/lib/Parse/ParsePragma.cpp clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaAttr.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/Layout/aix-double-struct-member.cpp Removed: diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index c51e95fa6fa8..b30b91d3d4a6 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -681,6 +681,13 @@ def AlignMac68k : InheritableAttr { let Documentation = [Undocumented]; } +def AlignNatural : InheritableAttr { + // This attribute has no spellings as it is only ever created implicitly. + let Spellings = []; + let SemaHandler = 0; + let Documentation = [Undocumented]; +} + def AlwaysInline : InheritableAttr { let Spellings = [GCC<"always_inline">, Keyword<"__forceinline">]; let Subjects = SubjectList<[Function]>; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 717bf6e12ccd..b387736832a9 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -854,6 +854,8 @@ def err_pragma_options_align_mac68k_target_unsupported : Error< def warn_pragma_pack_invalid_alignment : Warning< "expected #pragma pack parameter to be '1', '2', '4', '8', or '16'">, InGroup; +def err_pragma_pack_invalid_alignment : Error< + warn_pragma_pack_invalid_alignment.Text>; def warn_pragma_pack_non_default_at_include : Warning< "non-default #pragma pack value changes the alignment of struct or union " "members in the included file">, InGroup, @@ -887,6 +889,8 @@ def warn_cxx_ms_struct : Warning<"ms_struct may not produce Microsoft-compatible layouts for classes " "with base classes or virtual functions">, DefaultError, InGroup; +def err_pragma_pack_identifer_not_supported : Error< + "specifying an identifier within `#pragma pack` is not supported on this target">; def err_section_conflict : Error<"%0 causes a section type conflict with %1">; def err_no_base_classes : Error<"invalid use of '__super', %0 has no base classes">; def err_invalid_super_scope : Error<"invalid use of '__super', " diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 963fde5f3ad4..c01f0cca9c9c 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -354,6 +354,8 @@ ENUM_LANGOPT(VtorDispMode, MSVtorDispMode, 2, MSVtorDispMode::ForVBaseOverride, LANGOPT(ApplePragmaPack, 1, 0, "Apple gcc-compatible #pragma pack handling") +LANGOPT(XLPragmaPack, 1, 0, "IBM XL #pragma pack handling") + LANGOPT(RetainCommentsFromSystemHeaders, 1, 0, "retain documentation comments from system headers in the AST") LANGOPT(SanitizeAddressFieldPadding, 2, 0, "controls how aggressive is ASan " diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index acc3db40bdc7..9ea3feccddff 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1026,6 +1026,8 @@ defm apple_pragma_pack : BoolFOption<"apple-pragma-pack", "LangOpts->ApplePragmaPack", DefaultsToFalse, ChangedBy, ResetBy>; +def fxl_pragma_pack : Flag<["-"], "fxl-pragma-pack">, Group, Flags<[CC1Option]>, + HelpText<"Enable IBM XL #pragma pack handling">; def shared_libsan : Flag<["-"], "shared-libsan">, HelpText<"Dynamically link the sanitizer runtime">; def static_libsan : Flag<["-"], "static-libsan">, @@ -1966,6 +1968,7 @@ def fmudflapth : Flag<["-"], "fmudflapth">, Group; def fmudf
[llvm-branch-commits] [clang] e97071d - [NFC] Renaming PackStack to AlignPackStack
Author: Xiangling Liao Date: 2021-01-08T09:15:11-05:00 New Revision: e97071d7952068bbb5fee7bf9e46f304044d4aee URL: https://github.com/llvm/llvm-project/commit/e97071d7952068bbb5fee7bf9e46f304044d4aee DIFF: https://github.com/llvm/llvm-project/commit/e97071d7952068bbb5fee7bf9e46f304044d4aee.diff LOG: [NFC] Renaming PackStack to AlignPackStack This patch renames PackStack and related variable names to also contain align across Clang. As it is right now, Clang already uses one stack to record the information from both #pragma align and #pragma pack. Leaving it as PackStack is confusing, and could cause people to ignore #pragma align when developing code that interacts with PackStack. Differential Revision: https://reviews.llvm.org/D93901 Added: clang/test/Sema/Inputs/pragma-align-pack1.h clang/test/Sema/misleading-pragma-align-pack-diagnostics.c Modified: clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/include/clang/Serialization/ASTReader.h clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaAttr.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp Removed: diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 6b81494e8eff0..acc3184aea97d 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -568,14 +568,14 @@ class Sema final { // #pragma pack. // Sentinel to represent when the stack is set to mac68k alignment. static const unsigned kMac68kAlignmentSentinel = ~0U; - PragmaStack PackStack; - // The current #pragma pack values and locations at each #include. - struct PackIncludeState { + PragmaStack AlignPackStack; + // The current #pragma align/pack values and locations at each #include. + struct AlignPackIncludeState { unsigned CurrentValue; SourceLocation CurrentPragmaLocation; bool HasNonDefaultValue, ShouldWarnOnInclude; }; - SmallVector PackIncludeStack; + SmallVector AlignPackIncludeStack; // Segment #pragmas. PragmaStack DataSegStack; PragmaStack BSSSegStack; @@ -9721,14 +9721,14 @@ class Sema final { void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment); - enum class PragmaPackDiagnoseKind { + enum class PragmaAlignPackDiagnoseKind { NonDefaultStateAtInclude, ChangedStateAtExit }; - void DiagnoseNonDefaultPragmaPack(PragmaPackDiagnoseKind Kind, -SourceLocation IncludeLoc); - void DiagnoseUnterminatedPragmaPack(); + void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, + SourceLocation IncludeLoc); + void DiagnoseUnterminatedPragmaAlignPack(); /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off]. void ActOnPragmaMSStruct(PragmaMSStructKind Kind); diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index b4fd9e95d28f4..e9fc202f8d1db 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -681,8 +681,8 @@ class TypeIdx { MODULAR_CODEGEN_DECLS = 60, - /// Record code for \#pragma pack options. - PACK_PRAGMA_OPTIONS = 61, + /// Record code for \#pragma align/pack options. + ALIGN_PACK_PRAGMA_OPTIONS = 61, /// The stack of open #ifs/#ifdefs recorded in a preamble. PP_CONDITIONAL_STACK = 62, diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 94491e45b55b7..1dc1be00ea3ac 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -869,17 +869,17 @@ class ASTReader llvm::SmallVector FpPragmaStack; llvm::SmallVector FpPragmaStrings; - /// The pragma pack state. - Optional PragmaPackCurrentValue; - SourceLocation PragmaPackCurrentLocation; - struct PragmaPackStackEntry { + /// The pragma align/pack state. + Optional PragmaAlignPackCurrentValue; + SourceLocation PragmaAlignPackCurrentLocation; + struct PragmaAlignPackStackEntry { unsigned Value; SourceLocation Location; SourceLocation PushLocation; StringRef SlotLabel; }; - llvm::SmallVector PragmaPackStack; - llvm::SmallVector PragmaPackStrings; + llvm::SmallVector PragmaAlignPackStack; + llvm::SmallVector PragmaAlignPackStrings; /// The OpenCL extension settings. OpenCLOptions OpenCLExtensions; diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 83df76b967c4b..975fe9b812506 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -120,8 +120,9 @@ class SemaPPCallbacks : public PPCallbacks { } IncludeStack.push_back(IncludeLoc); -S->Diagno
[llvm-branch-commits] [llvm] 01b3e6e - [AIX] Support init priority
Author: Xiangling Liao Date: 2020-11-23T14:50:05-05:00 New Revision: 01b3e6e026332d66b18a658f31926436669f3bb9 URL: https://github.com/llvm/llvm-project/commit/01b3e6e026332d66b18a658f31926436669f3bb9 DIFF: https://github.com/llvm/llvm-project/commit/01b3e6e026332d66b18a658f31926436669f3bb9.diff LOG: [AIX] Support init priority Support reserved [0-100] and non-reserved[101-65535] Clang/GNU init priority values on AIX. This patch maps Clang/GNU values into priority values used in sinit/sterm functions. User can play with values and be able to get init to occur before or after XL init and vice versa. Differential Revision: https://reviews.llvm.org/D91272 Added: Modified: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll Removed: diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 22aa9a5e1e45..f7102dccf6ee 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1996,6 +1996,48 @@ bool PPCAIXAsmPrinter::doFinalization(Module &M) { return PPCAsmPrinter::doFinalization(M); } +static unsigned mapToSinitPriority(int P) { + if (P < 0 || P > 65535) +report_fatal_error("invalid init priority"); + + if (P <= 20) +return P; + + if (P < 81) +return 20 + (P - 20) * 16; + + if (P <= 1124) +return 1004 + (P - 81); + + if (P < 64512) +return 2047 + (P - 1124) * 33878; + + return 2147482625 + (P - 64512); +} + +static std::string convertToSinitPriority(int Priority) { + // This helper function converts clang init priority to values used in sinit + // and sterm functions. + // + // The conversion strategies are: + // We map the reserved clang/gnu priority range [0, 100] into the sinit/sterm + // reserved priority range [0, 1023] by + // - directly mapping the first 21 and the last 20 elements of the ranges + // - linear interpolating the intermediate values with a step size of 16. + // + // We map the non reserved clang/gnu priority range of [101, 65535] into the + // sinit/sterm priority range [1024, 2147483648] by: + // - directly mapping the first and the last 1024 elements of the ranges + // - linear interpolating the intermediate values with a step size of 33878. + unsigned int P = mapToSinitPriority(Priority); + + std::string PrioritySuffix; + llvm::raw_string_ostream os(PrioritySuffix); + os << llvm::format_hex_no_prefix(P, 8); + os.flush(); + return PrioritySuffix; +} + void PPCAIXAsmPrinter::emitXXStructorList(const DataLayout &DL, const Constant *List, bool IsCtor) { SmallVector Structors; @@ -2005,14 +2047,14 @@ void PPCAIXAsmPrinter::emitXXStructorList(const DataLayout &DL, unsigned Index = 0; for (Structor &S : Structors) { -if (S.Priority != 65535) - report_fatal_error( - "prioritized sinit and sterm functions are not yet supported on AIX"); +if (const ConstantExpr *CE = dyn_cast(S.Func)) + S.Func = CE->getOperand(0); llvm::GlobalAlias::create( GlobalValue::ExternalLinkage, (IsCtor ? llvm::Twine("__sinit") : llvm::Twine("__sterm")) + -llvm::Twine("8000_", FormatIndicatorAndUniqueModId) + +llvm::Twine(convertToSinitPriority(S.Priority)) + +llvm::Twine("_", FormatIndicatorAndUniqueModId) + llvm::Twine("_", llvm::utostr(Index++)), cast(S.Func)); } diff --git a/llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll b/llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll index 96566a912bb8..81777c2dec14 100644 --- a/llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll +++ b/llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll @@ -1,10 +1,146 @@ -; RUN: not --crash llc -mtriple powerpc-ibm-aix-xcoff < %s 2>&1 | FileCheck %s -; RUN: not --crash llc -mtriple powerpc64-ibm-aix-xcoff < %s 2>&1 | FileCheck %s +; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s -@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 655, void ()* @foo, i8* null }] +@llvm.global_ctors = appending global [5 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* bitcast (i32 (i32)* @cf1 to void ()*), i8* null }, { i32, void ()*, i8* } { i32 21, void ()* @cf2, i8* null }, { i32, void ()*, i8* } { i32 81, void ()* @cf3, i8* null }, { i32, void ()*, i8* } { i32 1125, void ()* @cf4, i8* null }, { i32, void ()*, i8* } { i32 64512, void ()* @cf5, i8* null }] +@llvm.global_dtors = appending global [5 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 20, void ()* bitcast (i32 (i32)* @df1 to void ()*), i8* null }, { i