[llvm-branch-commits] [clang] f0abe2a - [Frontend] Add pragma align natural and sort out pragma pack stack effect

2021-01-13 Thread Xiangling Liao via llvm-branch-commits

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

2021-01-08 Thread Xiangling Liao via llvm-branch-commits

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

2020-11-23 Thread Xiangling Liao via llvm-branch-commits

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