[llvm] r360742 - [IR] Disallow llvm.global_ctors and llvm.global_dtors of the 2-field form in textual format

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue May 14 19:35:33 PDT 2019


Author: maskray
Date: Tue May 14 19:35:32 2019
New Revision: 360742

URL: http://llvm.org/viewvc/llvm-project?rev=360742&view=rev
Log:
[IR] Disallow llvm.global_ctors and llvm.global_dtors of the 2-field form in textual format

The 3-field form was introduced by D3499 in 2014 and the legacy 2-field
form was planned to be removed in LLVM 4.0

For the textual format, this patch migrates the existing 2-field form to
use the 3-field form and deletes the compatibility code.
test/Verifier/global-ctors-2.ll checks we have a friendly error message.

For bitcode, lib/IR/AutoUpgrade UpgradeGlobalVariables will upgrade the
2-field form (add i8* null as the third field).

Reviewed By: rnk, dexonsmith

Differential Revision: https://reviews.llvm.org/D61547

Added:
    llvm/trunk/test/Bitcode/upgrade-global-dtors.ll
    llvm/trunk/test/Bitcode/upgrade-global-dtors.ll.bc
    llvm/trunk/test/Verifier/global-ctors-2.ll
Removed:
    llvm/trunk/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll
    llvm/trunk/test/Linker/ctors5.ll
    llvm/trunk/test/Linker/global_ctors.ll
Modified:
    llvm/trunk/docs/LangRef.rst
    llvm/trunk/docs/ReleaseNotes.rst
    llvm/trunk/include/llvm/IR/AutoUpgrade.h
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
    llvm/trunk/lib/IR/AutoUpgrade.cpp
    llvm/trunk/lib/IR/Verifier.cpp
    llvm/trunk/lib/Transforms/Utils/ModuleUtils.cpp
    llvm/trunk/test/Bitcode/metadata-2.ll
    llvm/trunk/test/Bitcode/upgrade-global-ctors.ll
    llvm/trunk/test/CodeGen/AArch64/init-array.ll
    llvm/trunk/test/CodeGen/ARM/ctor_order.ll
    llvm/trunk/test/CodeGen/ARM/ctors_dtors.ll
    llvm/trunk/test/CodeGen/Mips/init-array.ll
    llvm/trunk/test/CodeGen/PowerPC/pr17354.ll
    llvm/trunk/test/CodeGen/RISCV/init-array.ll
    llvm/trunk/test/CodeGen/SPARC/2008-10-10-InlineAsmMemoryOperand.ll
    llvm/trunk/test/CodeGen/X86/2007-06-04-X86-64-CtorAsmBugs.ll
    llvm/trunk/test/CodeGen/X86/2011-08-29-InitOrder.ll
    llvm/trunk/test/CodeGen/X86/init-priority.ll
    llvm/trunk/test/CodeGen/X86/negate-add-zero.ll
    llvm/trunk/test/DebugInfo/COFF/asan-module-ctor.ll
    llvm/trunk/test/DebugInfo/COFF/asan-module-without-functions.ll
    llvm/trunk/test/DebugInfo/Generic/incorrect-variable-debugloc.ll
    llvm/trunk/test/DebugInfo/X86/cu-ranges-odr.ll
    llvm/trunk/test/DebugInfo/X86/dbg_value_direct.ll
    llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll
    llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
    llvm/trunk/test/Feature/global_pv.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll
    llvm/trunk/test/MC/ARM/cxx-global-constructor.ll
    llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll
    llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll
    llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll
    llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll
    llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll
    llvm/trunk/test/Transforms/GlobalOpt/assume.ll
    llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll
    llvm/trunk/test/Transforms/GlobalOpt/crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
    llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll
    llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll
    llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll
    llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant.ll
    llvm/trunk/test/Transforms/GlobalOpt/invoke.ll
    llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll
    llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll
    llvm/trunk/test/Transforms/ObjCARC/apelim.ll
    llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll

Modified: llvm/trunk/docs/LangRef.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.rst (original)
+++ llvm/trunk/docs/LangRef.rst Tue May 14 19:35:32 2019
@@ -6482,12 +6482,12 @@ The '``llvm.global_ctors``' Global Varia
     @llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @ctor, i8* @data }]
 
 The ``@llvm.global_ctors`` array contains a list of constructor
-functions, priorities, and an optional associated global or function.
+functions, priorities, and an associated global or function.
 The functions referenced by this array will be called in ascending order
 of priority (i.e. lowest first) when the module is loaded. The order of
 functions with the same priority is not defined.
 
-If the third field is present, non-null, and points to a global variable
+If the third field is non-null, and points to a global variable
 or function, the initializer function will only run if the associated
 data from the current module is not discarded.
 
@@ -6502,12 +6502,12 @@ The '``llvm.global_dtors``' Global Varia
     @llvm.global_dtors = appending global [1 x %0] [%0 { i32 65535, void ()* @dtor, i8* @data }]
 
 The ``@llvm.global_dtors`` array contains a list of destructor
-functions, priorities, and an optional associated global or function.
+functions, priorities, and an associated global or function.
 The functions referenced by this array will be called in descending
 order of priority (i.e. highest first) when the module is unloaded. The
 order of functions with the same priority is not defined.
 
-If the third field is present, non-null, and points to a global variable
+If the third field is non-null, and points to a global variable
 or function, the destructor function will only run if the associated
 data from the current module is not discarded.
 

Modified: llvm/trunk/docs/ReleaseNotes.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ReleaseNotes.rst?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/docs/ReleaseNotes.rst (original)
+++ llvm/trunk/docs/ReleaseNotes.rst Tue May 14 19:35:32 2019
@@ -62,6 +62,10 @@ Changes to the LLVM IR
   parameter is required to be a simple constant. This annotation must
   be accurate to avoid possible miscompiles.
 
+* The 2-field form of global variables ``@llvm.global_ctors`` and
+  ``@llvm.global_dtors`` has been deleted. The third field of their element
+  type is now mandatory. Specify `i8* null` to migrate from the obsoleted
+  2-field form.
 
 Changes to the ARM Backend
 --------------------------

Modified: llvm/trunk/include/llvm/IR/AutoUpgrade.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/AutoUpgrade.h?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/AutoUpgrade.h (original)
+++ llvm/trunk/include/llvm/IR/AutoUpgrade.h Tue May 14 19:35:32 2019
@@ -46,9 +46,9 @@ namespace llvm {
   /// so that it can update all calls to the old function.
   void UpgradeCallsToIntrinsic(Function* F);
 
-  /// This checks for global variables which should be upgraded. It returns true
-  /// if it requires upgrading.
-  bool UpgradeGlobalVariable(GlobalVariable *GV);
+  /// This checks for global variables which should be upgraded. It it requires
+  /// upgrading, returns a pointer to the upgraded variable.
+  GlobalVariable *UpgradeGlobalVariable(GlobalVariable *GV);
 
   /// This checks for module flags which should be upgraded. It returns true if
   /// module is modified.

Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Tue May 14 19:35:32 2019
@@ -2794,8 +2794,14 @@ Error BitcodeReader::globalCleanup() {
   }
 
   // Look for global variables which need to be renamed.
+  std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
   for (GlobalVariable &GV : TheModule->globals())
-    UpgradeGlobalVariable(&GV);
+    if (GlobalVariable *Upgraded = UpgradeGlobalVariable(&GV))
+      UpgradedVariables.emplace_back(&GV, Upgraded);
+  for (auto &Pair : UpgradedVariables) {
+    Pair.first->eraseFromParent();
+    TheModule->getGlobalList().push_back(Pair.second);
+  }
 
   // Force deallocation of memory for these vectors to favor the client that
   // want lazy deserialization.

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue May 14 19:35:32 2019
@@ -1966,7 +1966,7 @@ struct Structor {
 /// priority.
 void AsmPrinter::EmitXXStructorList(const DataLayout &DL, const Constant *List,
                                     bool isCtor) {
-  // Should be an array of '{ int, void ()* }' structs.  The first value is the
+  // Should be an array of '{ i32, void ()*, i8* }' structs.  The first value is the
   // init priority.
   if (!isa<ConstantArray>(List)) return;
 
@@ -1974,12 +1974,10 @@ void AsmPrinter::EmitXXStructorList(cons
   const ConstantArray *InitList = dyn_cast<ConstantArray>(List);
   if (!InitList) return; // Not an array!
   StructType *ETy = dyn_cast<StructType>(InitList->getType()->getElementType());
-  // FIXME: Only allow the 3-field form in LLVM 4.0.
-  if (!ETy || ETy->getNumElements() < 2 || ETy->getNumElements() > 3)
-    return; // Not an array of two or three elements!
-  if (!isa<IntegerType>(ETy->getTypeAtIndex(0U)) ||
-      !isa<PointerType>(ETy->getTypeAtIndex(1U))) return; // Not (int, ptr).
-  if (ETy->getNumElements() == 3 && !isa<PointerType>(ETy->getTypeAtIndex(2U)))
+  if (!ETy || ETy->getNumElements() != 3 ||
+      !isa<IntegerType>(ETy->getTypeAtIndex(0U)) ||
+      !isa<PointerType>(ETy->getTypeAtIndex(1U)) ||
+      !isa<PointerType>(ETy->getTypeAtIndex(2U)))
     return; // Not (int, ptr, ptr).
 
   // Gather the structors in a form that's convenient for sorting by priority.
@@ -1995,7 +1993,7 @@ void AsmPrinter::EmitXXStructorList(cons
     Structor &S = Structors.back();
     S.Priority = Priority->getLimitedValue(65535);
     S.Func = CS->getOperand(1);
-    if (ETy->getNumElements() == 3 && !CS->getOperand(2)->isNullValue())
+    if (!CS->getOperand(2)->isNullValue())
       S.ComdatKey =
           dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
   }

Modified: llvm/trunk/lib/IR/AutoUpgrade.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AutoUpgrade.cpp?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/lib/IR/AutoUpgrade.cpp (original)
+++ llvm/trunk/lib/IR/AutoUpgrade.cpp Tue May 14 19:35:32 2019
@@ -805,9 +805,35 @@ bool llvm::UpgradeIntrinsicFunction(Func
   return Upgraded;
 }
 
-bool llvm::UpgradeGlobalVariable(GlobalVariable *GV) {
-  // Nothing to do yet.
-  return false;
+GlobalVariable *llvm::UpgradeGlobalVariable(GlobalVariable *GV) {
+  if (!(GV->hasName() && (GV->getName() == "llvm.global_ctors" ||
+                          GV->getName() == "llvm.global_dtors")) ||
+      !GV->hasInitializer())
+    return nullptr;
+  ArrayType *ATy = dyn_cast<ArrayType>(GV->getValueType());
+  if (!ATy)
+    return nullptr;
+  StructType *STy = dyn_cast<StructType>(ATy->getElementType());
+  if (!STy || STy->getNumElements() != 2)
+    return nullptr;
+
+  LLVMContext &C = GV->getContext();
+  IRBuilder<> IRB(C);
+  auto EltTy = StructType::get(STy->getElementType(0), STy->getElementType(1),
+                               IRB.getInt8PtrTy());
+  Constant *Init = GV->getInitializer();
+  unsigned N = Init->getNumOperands();
+  std::vector<Constant *> NewCtors(N);
+  for (unsigned i = 0; i != N; ++i) {
+    auto Ctor = cast<Constant>(Init->getOperand(i));
+    NewCtors[i] = ConstantStruct::get(
+        EltTy, Ctor->getAggregateElement(0u), Ctor->getAggregateElement(1),
+        Constant::getNullValue(IRB.getInt8PtrTy()));
+  }
+  Constant *NewInit = ConstantArray::get(ArrayType::get(EltTy, N), NewCtors);
+
+  return new GlobalVariable(NewInit->getType(), false, GV->getLinkage(),
+                            NewInit, GV->getName());
 }
 
 // Handles upgrading SSE2/AVX2/AVX512BW PSLLDQ intrinsics by converting them

Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Tue May 14 19:35:32 2019
@@ -641,18 +641,18 @@ void Verifier::visitGlobalVariable(const
       PointerType *FuncPtrTy =
           FunctionType::get(Type::getVoidTy(Context), false)->
           getPointerTo(DL.getProgramAddressSpace());
-      // FIXME: Reject the 2-field form in LLVM 4.0.
       Assert(STy &&
                  (STy->getNumElements() == 2 || STy->getNumElements() == 3) &&
                  STy->getTypeAtIndex(0u)->isIntegerTy(32) &&
                  STy->getTypeAtIndex(1) == FuncPtrTy,
              "wrong type for intrinsic global variable", &GV);
-      if (STy->getNumElements() == 3) {
-        Type *ETy = STy->getTypeAtIndex(2);
-        Assert(ETy->isPointerTy() &&
-                   cast<PointerType>(ETy)->getElementType()->isIntegerTy(8),
-               "wrong type for intrinsic global variable", &GV);
-      }
+      Assert(STy->getNumElements() == 3,
+             "the third field of the element type is mandatory, "
+             "specify i8* null to migrate from the obsoleted 2-field form");
+      Type *ETy = STy->getTypeAtIndex(2);
+      Assert(ETy->isPointerTy() &&
+                 cast<PointerType>(ETy)->getElementType()->isIntegerTy(8),
+             "wrong type for intrinsic global variable", &GV);
     }
   }
 

Modified: llvm/trunk/lib/Transforms/Utils/ModuleUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/ModuleUtils.cpp?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/ModuleUtils.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/ModuleUtils.cpp Tue May 14 19:35:32 2019
@@ -27,44 +27,24 @@ static void appendToGlobalArray(const ch
   // Get the current set of static global constructors and add the new ctor
   // to the list.
   SmallVector<Constant *, 16> CurrentCtors;
-  StructType *EltTy;
+  StructType *EltTy = StructType::get(
+      IRB.getInt32Ty(), PointerType::getUnqual(FnTy), IRB.getInt8PtrTy());
   if (GlobalVariable *GVCtor = M.getNamedGlobal(Array)) {
-    ArrayType *ATy = cast<ArrayType>(GVCtor->getValueType());
-    StructType *OldEltTy = cast<StructType>(ATy->getElementType());
-    // Upgrade a 2-field global array type to the new 3-field format if needed.
-    if (Data && OldEltTy->getNumElements() < 3)
-      EltTy = StructType::get(IRB.getInt32Ty(), PointerType::getUnqual(FnTy),
-                              IRB.getInt8PtrTy());
-    else
-      EltTy = OldEltTy;
     if (Constant *Init = GVCtor->getInitializer()) {
       unsigned n = Init->getNumOperands();
       CurrentCtors.reserve(n + 1);
-      for (unsigned i = 0; i != n; ++i) {
-        auto Ctor = cast<Constant>(Init->getOperand(i));
-        if (EltTy != OldEltTy)
-          Ctor =
-              ConstantStruct::get(EltTy, Ctor->getAggregateElement((unsigned)0),
-                                  Ctor->getAggregateElement(1),
-                                  Constant::getNullValue(IRB.getInt8PtrTy()));
-        CurrentCtors.push_back(Ctor);
-      }
+      for (unsigned i = 0; i != n; ++i)
+        CurrentCtors.push_back(cast<Constant>(Init->getOperand(i)));
     }
     GVCtor->eraseFromParent();
-  } else {
-    // Use the new three-field struct if there isn't one already.
-    EltTy = StructType::get(IRB.getInt32Ty(), PointerType::getUnqual(FnTy),
-                            IRB.getInt8PtrTy());
   }
 
-  // Build a 2 or 3 field global_ctor entry.  We don't take a comdat key.
+  // Build a 3 field global_ctor entry.  We don't take a comdat key.
   Constant *CSVals[3];
   CSVals[0] = IRB.getInt32(Priority);
   CSVals[1] = F;
-  // FIXME: Drop support for the two element form in LLVM 4.0.
-  if (EltTy->getNumElements() >= 3)
-    CSVals[2] = Data ? ConstantExpr::getPointerCast(Data, IRB.getInt8PtrTy())
-                     : Constant::getNullValue(IRB.getInt8PtrTy());
+  CSVals[2] = Data ? ConstantExpr::getPointerCast(Data, IRB.getInt8PtrTy())
+                   : Constant::getNullValue(IRB.getInt8PtrTy());
   Constant *RuntimeCtorInit =
       ConstantStruct::get(EltTy, makeArrayRef(CSVals, EltTy->getNumElements()));
 

Modified: llvm/trunk/test/Bitcode/metadata-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/metadata-2.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Bitcode/metadata-2.ll (original)
+++ llvm/trunk/test/Bitcode/metadata-2.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 ; RUN: verify-uselistorder < %s
 	%0 = type { %object.ModuleInfo.__vtbl*, i8*, %"byte[]", %1, %"ClassInfo[]", i32, void ()*, void ()*, void ()*, i8*, void ()* }		; type %0
 	%1 = type { i64, %object.ModuleInfo* }		; type %1
-	%2 = type { i32, void ()* }		; type %2
+	%2 = type { i32, void ()*, i8* }		; type %2
 	%"ClassInfo[]" = type { i64, %object.ClassInfo** }
 	%"Interface[]" = type { i64, %object.Interface* }
 	%"ModuleInfo[]" = type { i64, %object.ModuleInfo** }
@@ -24,7 +24,7 @@
 @_D5tango4core8BitManip8__ModuleZ = global %0 { %object.ModuleInfo.__vtbl* @_D10ModuleInfo6__vtblZ, i8* null, %"byte[]" { i64 19, i8* getelementptr ([20 x i8], [20 x i8]* @.str, i32 0, i32 0) }, %1 zeroinitializer, %"ClassInfo[]" zeroinitializer, i32 4, void ()* null, void ()* null, void ()* null, i8* null, void ()* null }		; <%0*> [#uses=1]
 @_D5tango4core8BitManip11__moduleRefZ = internal global %ModuleReference { %ModuleReference* null, %object.ModuleInfo* bitcast (%0* @_D5tango4core8BitManip8__ModuleZ to %object.ModuleInfo*) }		; <%ModuleReference*> [#uses=2]
 @_Dmodule_ref = external global %ModuleReference*		; <%ModuleReference**> [#uses=2]
- at llvm.global_ctors = appending constant [1 x %2] [%2 { i32 65535, void ()* @_D5tango4core8BitManip16__moduleinfoCtorZ }]		; <[1 x %2]*> [#uses=0]
+ at llvm.global_ctors = appending constant [1 x %2] [%2 { i32 65535, void ()* @_D5tango4core8BitManip16__moduleinfoCtorZ, i8* null }]		; <[1 x %2]*> [#uses=0]
 
 define fastcc i32 @_D5tango4core8BitManip6popcntFkZi(i32 %x_arg) nounwind readnone {
 entry:

Modified: llvm/trunk/test/Bitcode/upgrade-global-ctors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/upgrade-global-ctors.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Bitcode/upgrade-global-ctors.ll (original)
+++ llvm/trunk/test/Bitcode/upgrade-global-ctors.ll Tue May 14 19:35:32 2019
@@ -1,5 +1,5 @@
 ; RUN:  llvm-dis < %s.bc| FileCheck %s
 ; RUN:  verify-uselistorder < %s.bc
 
-; Global constructors should no longer be upgraded when reading bitcode.
-; CHECK: @llvm.global_ctors = appending global [0 x { i32, void ()* }] zeroinitializer
+; The 2-field form @llvm.global_ctors will be upgraded when reading bitcode.
+; CHECK: @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer

Added: llvm/trunk/test/Bitcode/upgrade-global-dtors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/upgrade-global-dtors.ll?rev=360742&view=auto
==============================================================================
--- llvm/trunk/test/Bitcode/upgrade-global-dtors.ll (added)
+++ llvm/trunk/test/Bitcode/upgrade-global-dtors.ll Tue May 14 19:35:32 2019
@@ -0,0 +1,5 @@
+; RUN: llvm-dis < %s.bc | FileCheck %s
+; RUN: verify-uselistorder < %s.bc
+
+; The 2-field form @llvm.global_dtors will be upgraded when reading bitcode.
+; CHECK: @llvm.global_dtors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* null, i8* null }, { i32, void ()*, i8* } { i32 65534, void ()* null, i8* null }]

Added: llvm/trunk/test/Bitcode/upgrade-global-dtors.ll.bc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/upgrade-global-dtors.ll.bc?rev=360742&view=auto
==============================================================================
Binary files llvm/trunk/test/Bitcode/upgrade-global-dtors.ll.bc (added) and llvm/trunk/test/Bitcode/upgrade-global-dtors.ll.bc Tue May 14 19:35:32 2019 differ

Modified: llvm/trunk/test/CodeGen/AArch64/init-array.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/init-array.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/init-array.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/init-array.ll Tue May 14 19:35:32 2019
@@ -5,6 +5,6 @@ define internal void @_GLOBAL__I_a() sec
   ret void
 }
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 ; CHECK: .section .init_array

Modified: llvm/trunk/test/CodeGen/ARM/ctor_order.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ctor_order.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/ctor_order.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/ctor_order.ll Tue May 14 19:35:32 2019
@@ -21,7 +21,7 @@
 ; GNUEABI:      .long    f152
 
 
- at llvm.global_ctors = appending global [2 x { i32, void ()* }] [ { i32, void ()* } { i32 151, void ()* @f151 }, { i32, void ()* } { i32 152, void ()* @f152 } ]
+ at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 151, void ()* @f151, i8* null }, { i32, void ()*, i8* } { i32 152, void ()* @f152, i8* null } ]
 
 define void @f151() {
 entry:

Modified: llvm/trunk/test/CodeGen/ARM/ctors_dtors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ctors_dtors.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/ctors_dtors.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/ctors_dtors.ll Tue May 14 19:35:32 2019
@@ -11,8 +11,8 @@
 ; GNUEABI: .section .init_array,"aw",%init_array
 ; GNUEABI: .section .fini_array,"aw",%fini_array
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @__mf_init } ]                ; <[1 x { i32, void ()* }]*> [#uses=0]
- at llvm.global_dtors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @__mf_fini } ]                ; <[1 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @__mf_init, i8* null } ]                ; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
+ at llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @__mf_fini, i8* null } ]                ; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
 
 define void @__mf_init() {
 entry:

Modified: llvm/trunk/test/CodeGen/Mips/init-array.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/init-array.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/init-array.ll (original)
+++ llvm/trunk/test/CodeGen/Mips/init-array.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 
 target triple = "mipsel-unknown-linux"
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @test }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @test, i8* null }]
 ; CHECK: .section
 ; CHECK: .init_array
 ; CHECK-NOT: .ctors

Modified: llvm/trunk/test/CodeGen/PowerPC/pr17354.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/pr17354.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/pr17354.ll (original)
+++ llvm/trunk/test/CodeGen/PowerPC/pr17354.ll Tue May 14 19:35:32 2019
@@ -10,7 +10,7 @@ target triple = "powerpc64-unknown-linux
 %struct.CS = type { i32 }
 
 @_ZL3glb = internal global [1 x %struct.CS] zeroinitializer, align 4
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 define internal void @__cxx_global_var_init() section ".text.startup" {
 entry:

Modified: llvm/trunk/test/CodeGen/RISCV/init-array.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/RISCV/init-array.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/RISCV/init-array.ll (original)
+++ llvm/trunk/test/CodeGen/RISCV/init-array.ll Tue May 14 19:35:32 2019
@@ -20,7 +20,7 @@ define internal void @_GLOBAL__I_a() sec
   ret void
 }
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 ;INITARRAY: section .init_array
 ;INITARRAY-NOT: .section    .ctors

Modified: llvm/trunk/test/CodeGen/SPARC/2008-10-10-InlineAsmMemoryOperand.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SPARC/2008-10-10-InlineAsmMemoryOperand.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/SPARC/2008-10-10-InlineAsmMemoryOperand.ll (original)
+++ llvm/trunk/test/CodeGen/SPARC/2008-10-10-InlineAsmMemoryOperand.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 ; PR 1557
 
 target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f128:128:128"
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @set_fast_math } ]		; <[1 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @set_fast_math, i8* null } ]		; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
 
 define internal void @set_fast_math() nounwind {
 entry:

Modified: llvm/trunk/test/CodeGen/X86/2007-06-04-X86-64-CtorAsmBugs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2007-06-04-X86-64-CtorAsmBugs.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2007-06-04-X86-64-CtorAsmBugs.ll (original)
+++ llvm/trunk/test/CodeGen/X86/2007-06-04-X86-64-CtorAsmBugs.ll Tue May 14 19:35:32 2019
@@ -3,7 +3,7 @@
 
 	%struct.A = type { [1024 x i8] }
 @_ZN1A1aE = global %struct.A zeroinitializer, align 32		; <%struct.A*> [#uses=1]
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN1A1aE } ]		; <[1 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN1A1aE, i8* null } ]		; <[1 x { i32, void ()*, i8* null }]*> [#uses=0]
 
 define internal void @_GLOBAL__I__ZN1A1aE() section "__TEXT,__StaticInit,regular,pure_instructions" {
 entry:

Modified: llvm/trunk/test/CodeGen/X86/2011-08-29-InitOrder.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2011-08-29-InitOrder.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2011-08-29-InitOrder.ll (original)
+++ llvm/trunk/test/CodeGen/X86/2011-08-29-InitOrder.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 ; RUN: llc < %s -mtriple=i386-apple-darwin | FileCheck %s --check-prefix=CHECK-DARWIN
 ; PR5329
 
- at llvm.global_ctors = appending global [3 x { i32, void ()* }] [{ i32, void ()* } { i32 2000, void ()* @construct_2 }, { i32, void ()* } { i32 3000, void ()* @construct_3 }, { i32, void ()* } { i32 1000, void ()* @construct_1 }]
+ at llvm.global_ctors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 2000, void ()* @construct_2, i8* null }, { i32, void ()*, i8* } { i32 3000, void ()* @construct_3, i8* null }, { i32, void ()*, i8* } { i32 1000, void ()* @construct_1, i8* null }]
 ; CHECK-DEFAULT: .section        .ctors.64535,"aw", at progbits
 ; CHECK-DEFAULT: .long construct_1
 ; CHECK-DEFAULT: .section        .ctors.63535,"aw", at progbits
@@ -14,7 +14,7 @@
 ; CHECK-DARWIN-NEXT: .long _construct_2
 ; CHECK-DARWIN-NEXT: .long _construct_3
 
- at llvm.global_dtors = appending global [3 x { i32, void ()* }] [{ i32, void ()* } { i32 2000, void ()* @destruct_2 }, { i32, void ()* } { i32 1000, void ()* @destruct_1 }, { i32, void ()* } { i32 3000, void ()* @destruct_3 }]
+ at llvm.global_dtors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 2000, void ()* @destruct_2, i8* null }, { i32, void ()*, i8* } { i32 1000, void ()* @destruct_1, i8* null }, { i32, void ()*, i8* } { i32 3000, void ()* @destruct_3, i8* null }]
 ; CHECK-DEFAULT: .section        .dtors.64535,"aw", at progbits
 ; CHECK-DEFAULT: .long destruct_1
 ; CHECK-DEFAULT: .section        .dtors.63535,"aw", at progbits

Modified: llvm/trunk/test/CodeGen/X86/init-priority.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/init-priority.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/init-priority.ll (original)
+++ llvm/trunk/test/CodeGen/X86/init-priority.ll Tue May 14 19:35:32 2019
@@ -16,7 +16,7 @@
 
 @c1 = global %class.C zeroinitializer, align 1
 @d1 = global %class.D zeroinitializer, align 1
- at llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 101, void ()* @_GLOBAL__I_000101 }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 101, void ()* @_GLOBAL__I_000101, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 define linkonce_odr void @_ZN1CC1Ev(%class.C* nocapture %this) {
 entry:

Modified: llvm/trunk/test/CodeGen/X86/negate-add-zero.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/negate-add-zero.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/negate-add-zero.ll (original)
+++ llvm/trunk/test/CodeGen/X86/negate-add-zero.ll Tue May 14 19:35:32 2019
@@ -188,7 +188,6 @@ target triple = "i386-apple-darwin7"
 @"\01LC28" = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
 @"\01LC29" = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
 @"\01LC30" = external constant [41 x i8]		; <[41 x i8]*> [#uses=0]
- at llvm.global_ctors = external global [1 x { i32, void ()* }]		; <[1 x { i32, void ()* }]*> [#uses=0]
 
 declare void @_GLOBAL__I__ZN9HingeNode7DEG2RADE() section "__TEXT,__StaticInit,regular,pure_instructions"
 

Modified: llvm/trunk/test/DebugInfo/COFF/asan-module-ctor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/asan-module-ctor.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/asan-module-ctor.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/asan-module-ctor.ll Tue May 14 19:35:32 2019
@@ -21,7 +21,7 @@
 target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
 target triple = "i686-pc-win32"
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
 
 ; Function Attrs: nounwind sanitize_address
 define i32 @foo() #0 !dbg !4 {

Modified: llvm/trunk/test/DebugInfo/COFF/asan-module-without-functions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/asan-module-without-functions.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/asan-module-without-functions.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/asan-module-without-functions.ll Tue May 14 19:35:32 2019
@@ -14,11 +14,11 @@ target datalayout = "e-m:w-p:32:32-i64:6
 target triple = "i686-pc-win32"
 
 @c = global { i8, [63 x i8] } { i8 42, [63 x i8] zeroinitializer }, align 32
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
 @___asan_gen_ = private constant [7 x i8] c"asan.c\00", align 1
 @___asan_gen_1 = private unnamed_addr constant [2 x i8] c"c\00", align 1
 @0 = internal global [1 x { i32, i32, i32, i32, i32, i32 }] [{ i32, i32, i32, i32, i32, i32 } { i32 ptrtoint ({ i8, [63 x i8] }* @c to i32), i32 1, i32 64, i32 ptrtoint ([2 x i8]* @___asan_gen_1 to i32), i32 ptrtoint ([7 x i8]* @___asan_gen_ to i32), i32 0 }]
- at llvm.global_dtors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_dtor }]
+ at llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_dtor, i8* null }]
 
 define internal void @asan.module_ctor() {
   call void @__asan_init_v3()

Modified: llvm/trunk/test/DebugInfo/Generic/incorrect-variable-debugloc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/incorrect-variable-debugloc.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/Generic/incorrect-variable-debugloc.ll (original)
+++ llvm/trunk/test/DebugInfo/Generic/incorrect-variable-debugloc.ll Tue May 14 19:35:32 2019
@@ -52,7 +52,7 @@
 %struct.B = type { i32 }
 %struct.A = type { i8 }
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
 @__asan_option_detect_stack_use_after_return = external global i32
 @___asan_gen_ = private unnamed_addr constant [11 x i8] c"1 32 8 1 A\00", align 1
 @___asan_gen_1 = private unnamed_addr constant [13 x i8] c"1 32 1 3 tmp\00", align 1

Modified: llvm/trunk/test/DebugInfo/X86/cu-ranges-odr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/cu-ranges-odr.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/cu-ranges-odr.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/cu-ranges-odr.ll Tue May 14 19:35:32 2019
@@ -23,7 +23,7 @@ source_filename = "test/DebugInfo/X86/cu
 %class.A = type { i32 }
 
 @a = global %class.A zeroinitializer, align 4, !dbg !0
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 define internal void @__cxx_global_var_init() section ".text.startup" !dbg !18 {
 entry:

Modified: llvm/trunk/test/DebugInfo/X86/dbg_value_direct.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dbg_value_direct.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dbg_value_direct.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/dbg_value_direct.ll Tue May 14 19:35:32 2019
@@ -19,7 +19,7 @@ target triple = "x86_64-unknown-linux-gn
 
 @__asan_mapping_offset = linkonce_odr constant i64 2147450880
 @__asan_mapping_scale = linkonce_odr constant i64 3
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* null }]
 @___asan_gen_ = private unnamed_addr constant [16 x i8] c"1 32 4 5 .addr \00", align 1
 
 ; Function Attrs: sanitize_address uwtable

Modified: llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll Tue May 14 19:35:32 2019
@@ -6,7 +6,7 @@
 ; low_pc for the compile unit.
 ; CHECK-NOT: .rela.debug_ranges
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 0, void ()* @__msan_init }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__msan_init, i8* null }]
 @str = private unnamed_addr constant [4 x i8] c"zzz\00"
 @__msan_retval_tls = external thread_local(initialexec) global [8 x i64]
 @__msan_retval_origin_tls = external thread_local(initialexec) global i32

Modified: llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll Tue May 14 19:35:32 2019
@@ -181,7 +181,7 @@ source_filename = "test/DebugInfo/X86/ge
 @_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4, !dbg !6
 @w = internal global %"struct.<anonymous namespace>::walrus" zeroinitializer, align 1, !dbg !16
 @wom = global %struct.wombat zeroinitializer, align 4, !dbg !25
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 ; Function Attrs: nounwind uwtable
 define void @_Z3foov() #0 !dbg !40 {

Modified: llvm/trunk/test/Feature/global_pv.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/global_pv.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Feature/global_pv.ll (original)
+++ llvm/trunk/test/Feature/global_pv.ll Tue May 14 19:35:32 2019
@@ -3,8 +3,8 @@
 @G1 = global i32 zeroinitializer
 @G2 = global i32 zeroinitializer
 @g = global <2 x i32*> zeroinitializer
-%0 = type { i32, void ()* }
- at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @test }]
+%0 = type { i32, void ()*, i8* }
+ at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @test, i8* null }]
 define internal void @test() {
   %A = insertelement <2 x i32*> undef, i32* @G1, i32 0
   %B = insertelement <2 x i32*> %A,  i32* @G2, i32 1

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll Tue May 14 19:35:32 2019
@@ -26,7 +26,7 @@ entry:
   ret void
 }
 
- at llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @__late_ctor }, { i32, void ()* } { i32 0, void ()* @__early_ctor }]
+ at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__late_ctor, i8* null }, { i32, void ()*, i8* } { i32 0, void ()* @__early_ctor, i8* null }]
 
 define internal void @__late_ctor() sanitize_address section ".text.startup" {
 entry:

Removed: llvm/trunk/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll?rev=360741&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll (original)
+++ llvm/trunk/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll (removed)
@@ -1,18 +0,0 @@
-; MSan converts 2-element global_ctors to 3-element when adding the new entry.
-; RUN: opt < %s -msan-with-comdat -S -passes=msan 2>&1 | FileCheck %s
-; RUN: opt < %s -msan -msan-with-comdat -S | FileCheck %s
-
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; CHECK: $msan.module_ctor = comdat any
-; CHECK: @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @f, i8* null }, { i32, void ()*, i8* } { i32 0, void ()* @msan.module_ctor, i8* bitcast (void ()* @msan.module_ctor to i8*) }]
-
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @f }]
-
-define internal void @f() {
-entry:
-  ret void
-}
-
-; CHECK: define internal void @msan.module_ctor() comdat {

Removed: llvm/trunk/test/Linker/ctors5.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/ctors5.ll?rev=360741&view=auto
==============================================================================
--- llvm/trunk/test/Linker/ctors5.ll (original)
+++ llvm/trunk/test/Linker/ctors5.ll (removed)
@@ -1,8 +0,0 @@
-; RUN: llvm-link -S %s | FileCheck %s
-
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @f }]
-; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @f, i8* null }]
-
-define void @f() {
-  ret void
-}

Removed: llvm/trunk/test/Linker/global_ctors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/global_ctors.ll?rev=360741&view=auto
==============================================================================
--- llvm/trunk/test/Linker/global_ctors.ll (original)
+++ llvm/trunk/test/Linker/global_ctors.ll (removed)
@@ -1,29 +0,0 @@
-; RUN: llvm-link -S %s %S/Inputs/old_global_ctors.3.4.bc | FileCheck %s
-; RUN: llvm-link -S %S/Inputs/old_global_ctors.3.4.bc %s | FileCheck %s
-
-; old_global_ctors.3.4.bc contains the following LLVM IL, assembled into
-; bitcode by llvm-as from 3.4.  It uses a two element @llvm.global_ctors array.
-; ---
-; declare void @a_global_ctor()
-; declare void @b_global_ctor()
-;
-; @llvm.global_ctors = appending global [2 x { i32, void ()* } ] [
-;   { i32, void ()* } { i32 65535, void ()* @a_global_ctor },
-;   { i32, void ()* } { i32 65535, void ()* @b_global_ctor }
-; ]
-; ---
-
-declare void @c_global_ctor()
-declare void @d_global_ctor()
-
- at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* } ] [
-  { i32, void ()*, i8* } { i32 65535, void ()* @c_global_ctor, i8* null },
-  { i32, void ()*, i8* } { i32 65535, void ()* @d_global_ctor, i8* null }
-]
-
-; CHECK: @llvm.global_ctors = appending global [4 x { i32, void ()*, i8* }] [
-; CHECK-DAG:  { i32, void ()*, i8* } { i32 65535, void ()* @a_global_ctor, i8* null }
-; CHECK-DAG:  { i32, void ()*, i8* } { i32 65535, void ()* @b_global_ctor, i8* null }
-; CHECK-DAG:  { i32, void ()*, i8* } { i32 65535, void ()* @c_global_ctor, i8* null }
-; CHECK-DAG:  { i32, void ()*, i8* } { i32 65535, void ()* @d_global_ctor, i8* null }
-; CHECK: ]

Modified: llvm/trunk/test/MC/ARM/cxx-global-constructor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/cxx-global-constructor.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/cxx-global-constructor.ll (original)
+++ llvm/trunk/test/MC/ARM/cxx-global-constructor.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 ; RUN: -filetype=obj -o - | llvm-readobj -r | FileCheck %s
 
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @f }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @f, i8* null }]
 
 define void @f() {
   ret void

Modified: llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll (original)
+++ llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll Tue May 14 19:35:32 2019
@@ -1,12 +1,12 @@
 ; RUN: opt -S -globaldce < %s | FileCheck %s
 
 ; Test that the presence of debug intrinsics isn't affecting GlobalDCE.
-; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_notremovable }]
+; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_notremovable, i8* null }]
 ; CHECK-NOT: @_GLOBAL__I_a
 
 declare void @_notremovable()
 
- at llvm.global_ctors = appending global [3 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_b }, { i32, void ()* } { i32 65535, void ()* @_notremovable }]
+ at llvm.global_ctors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_b, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_notremovable, i8* null }]
 
 @x = internal unnamed_addr constant i8 undef, align 1
 

Modified: llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll (original)
+++ llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll Tue May 14 19:35:32 2019
@@ -9,7 +9,7 @@
 
 @foo = global %class.Foo zeroinitializer, align 4
 @_ZN3Bar18LINKER_INITIALIZEDE = external constant i32
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {
   %1 = load i32, i32* @_ZN3Bar18LINKER_INITIALIZEDE, align 4

Modified: llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll Tue May 14 19:35:32 2019
@@ -16,7 +16,7 @@ target triple = "i686-pc-linux-gnu"
 	%"struct.std::vector<int,std::allocator<int> >" = type { %"struct.std::_Vector_base<int,std::allocator<int> >" }
 @registry_lock = external global %struct..0FileDescriptor		; <%struct..0FileDescriptor*> [#uses=0]
 @_ZN61FLAG__foo_int32_44FLAGS_E = external global %"struct.FlagRegisterer<bool>"		; <%"struct.FlagRegisterer<bool>"*> [#uses=0]
- at llvm.global_ctors = appending global [20 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN7ScannerC2Ev }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z11StripStringPSsPKcc }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_ }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN8Hasher325ResetEj }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z25ACLRv }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_eventbuf }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__checker_bcad_variable } ]		; <[20 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [20 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN60FLAG__foo_bool_19FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZNK5Bzh4Enum13is_contiguousEv, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_21FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN7ScannerC2Ev, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__Z11StripStringPSsPKcc, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZNK9__gnu_cxx4hashI11StringPieceEclERKS1_, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN8Hasher325ResetEj, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__Z25ACLRv, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int64_25FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_7FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_18FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_17FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_25FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_eventbuf, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN61FLAG__foo_int32_26FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN62FLAG__foo_string_16FLAGS_E, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__ZN17InitializerC2EPKcS1_PFvvE, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__checker_bcad_variable, i8* null } ]		; <[20 x { i32, void ()*, i8* }]*> [#uses=0]
 
 declare void @_GLOBAL__I__ZN62FLAG__foo_string_10FLAGS_E()
 

Modified: llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll Tue May 14 19:35:32 2019
@@ -9,8 +9,8 @@ target triple = "i686-pc-linux-gnu"
 	%"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* }
 	%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" = type { %"struct.std::_Rb_tree<int,std::pair<const int, int>,std::_Select1st<std::pair<const int, int> >,std::less<int>,std::allocator<std::pair<const int, int> > >" }
 @someMap = global %"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >" zeroinitializer		; <%"struct.std::map<int,int,std::less<int>,std::allocator<std::pair<const int, int> > >"*> [#uses=1]
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_someMap } ]		; <[1 x { i32, void ()* }]*> [#uses=0]
- at llvm.global_dtors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__D_someMap } ]		; <[1 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_someMap, i8* null } ]		; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
+ at llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__D_someMap, i8* null } ]		; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
 
 define void @_GLOBAL__I_someMap() {
 entry:

Modified: llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll Tue May 14 19:35:32 2019
@@ -6,7 +6,7 @@
 
 @SomeVar = weak_odr global i32 0
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @CTOR } ]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @CTOR, i8* null } ]
 
 define internal void @CTOR() {
   store i32 23, i32* @SomeVar

Modified: llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll Tue May 14 19:35:32 2019
@@ -1,5 +1,5 @@
 ; RUN: opt < %s -globalopt -disable-output
 
-%0 = type { i32, void ()* }
+%0 = type { i32, void ()*, i8* }
 @llvm.global_ctors = appending global [0 x %0] zeroinitializer
 

Modified: llvm/trunk/test/Transforms/GlobalOpt/assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/assume.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/assume.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/assume.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 
 ; CHECK: @tmp = local_unnamed_addr global i32 42
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 @tmp = global i32 0
 
 define i32 @TheAnswerToLifeTheUniverseAndEverything() {

Modified: llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll Tue May 14 19:35:32 2019
@@ -94,10 +94,10 @@ define internal void @test6() {
 }
 
 @llvm.global_ctors = appending constant
-  [6 x { i32, void ()* }]
-  [{ i32, void ()* } { i32 65535, void ()* @test1 },
-   { i32, void ()* } { i32 65535, void ()* @test2 },
-   { i32, void ()* } { i32 65535, void ()* @test3 },
-   { i32, void ()* } { i32 65535, void ()* @test4 },
-   { i32, void ()* } { i32 65535, void ()* @test5 },
-   { i32, void ()* } { i32 65535, void ()* @test6 }]
+  [6 x { i32, void ()*, i8* }]
+  [{ i32, void ()*, i8* } { i32 65535, void ()* @test1, i8* null },
+   { i32, void ()*, i8* } { i32 65535, void ()* @test2, i8* null },
+   { i32, void ()*, i8* } { i32 65535, void ()* @test3, i8* null },
+   { i32, void ()*, i8* } { i32 65535, void ()* @test4, i8* null },
+   { i32, void ()*, i8* } { i32 65535, void ()* @test5, i8* null },
+   { i32, void ()*, i8* } { i32 65535, void ()* @test6, i8* null }]

Modified: llvm/trunk/test/Transforms/GlobalOpt/crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/crash.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/crash.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/crash.ll Tue May 14 19:35:32 2019
@@ -2,12 +2,12 @@
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
 target triple = "i386-apple-darwin9.8"
 
-%0 = type { i32, void ()* }
+%0 = type { i32, void ()*, i8* }
 %struct.btSimdScalar = type { %"union.btSimdScalar::$_14" }
 %"union.btSimdScalar::$_14" = type { <4 x float> }
 
 @_ZL6vTwist =  global %struct.btSimdScalar zeroinitializer ; <%struct.btSimdScalar*> [#uses=1]
- at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I__ZN21btConeTwistConstraintC2Ev }] ; <[12 x %0]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I__ZN21btConeTwistConstraintC2Ev, i8* null }] ; <[12 x %0]*> [#uses=0]
 
 define internal void @_GLOBAL__I__ZN21btConeTwistConstraintC2Ev() nounwind section "__TEXT,__StaticInit,regular,pure_instructions" {
 entry:

Modified: llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
 target triple = "x86_64-apple-darwin10.0.0"
 
-%0 = type { i32, void ()* }
+%0 = type { i32, void ()*, i8* }
 %struct.foo = type { i32* }
 %struct.bar = type { i128 }
 
@@ -10,7 +10,7 @@ target triple = "x86_64-apple-darwin10.0
 @H = global i32 0, align 4
 @X = global %struct.foo zeroinitializer, align 8
 @X2 = global %struct.bar zeroinitializer, align 8
- at llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @init1 }, %0 { i32 65535, void ()* @init2 }]
+ at llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @init1, i8* null }, %0 { i32 65535, void ()* @init2, i8* null }]
 
 ; PR8710 - GlobalOpt shouldn't change the global's initializer to have this
 ; arbitrary constant expression, the code generator can't handle it.

Modified: llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll Tue May 14 19:35:32 2019
@@ -6,7 +6,7 @@
 ; CHECK: @H = local_unnamed_addr global i32 2
 ; CHECK: @I = local_unnamed_addr global i32 2
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @CTOR } ]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @CTOR, i8* null } ]
 @addr = external global i32
 @G = internal global [6 x [5 x i32]] zeroinitializer
 @H = global i32 80

Modified: llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll Tue May 14 19:35:32 2019
@@ -1,12 +1,12 @@
 ; RUN: opt < %s -S -passes='cgscc(inline),function(early-cse),globalopt' | FileCheck %s
 
-%0 = type { i32, void ()* }
+%0 = type { i32, void ()*, i8* }
 %struct.A = type { i8 }
 %struct.B = type { }
 
 @a = global %struct.A zeroinitializer, align 1
 @__dso_handle = external global i8*
- at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 ; CHECK-NOT: call i32 @__cxa_atexit
 

Modified: llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll Tue May 14 19:35:32 2019
@@ -9,7 +9,7 @@
 @"\01L_OBJC_METH_VAR_NAME_40" = internal global [7 x i8] c"print:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
 @"\01L_OBJC_SELECTOR_REFERENCES_41" = internal externally_initialized  global i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 @llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0),  i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_41" to i8*)]
 
 define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {

Modified: llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll Tue May 14 19:35:32 2019
@@ -6,7 +6,7 @@
 
 declare void @llvm.sideeffect()
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @ctor } ]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null } ]
 @G = global i32 0
 
 define internal void @ctor() {

Modified: llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll Tue May 14 19:35:32 2019
@@ -13,5 +13,5 @@ define void @ctor1() {
 }
 
 @llvm.global_ctors = appending constant
-  [1 x { i32, void ()* }]
-  [ { i32, void ()* } { i32 65535, void ()* @ctor1 } ]
+  [1 x { i32, void ()*, i8* }]
+  [ { i32, void ()*, i8* } { i32 65535, void ()* @ctor1, i8* null } ]

Modified: llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll Tue May 14 19:35:32 2019
@@ -11,7 +11,7 @@
 @tmp3 = global i32 0
 @ptrToTmp3 = global i32* null
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 
 define i32 @TheAnswerToLifeTheUniverseAndEverything() {
   ret i32 42

Modified: llvm/trunk/test/Transforms/GlobalOpt/invariant.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/invariant.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/invariant.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/invariant.ll Tue May 14 19:35:32 2019
@@ -52,8 +52,8 @@ define void @ctor4() {
 
 
 @llvm.global_ctors = appending constant
-  [4 x { i32, void ()* }]
-  [ { i32, void ()* } { i32 65535, void ()* @ctor1 },
-    { i32, void ()* } { i32 65535, void ()* @ctor2 },
-    { i32, void ()* } { i32 65535, void ()* @ctor3 },
-    { i32, void ()* } { i32 65535, void ()* @ctor4 } ]
+  [4 x { i32, void ()*, i8* }]
+  [ { i32, void ()*, i8* } { i32 65535, void ()* @ctor1, i8* null },
+    { i32, void ()*, i8* } { i32 65535, void ()* @ctor2, i8* null },
+    { i32, void ()*, i8* } { i32 65535, void ()* @ctor3, i8* null },
+    { i32, void ()*, i8* } { i32 65535, void ()* @ctor4, i8* null } ]

Modified: llvm/trunk/test/Transforms/GlobalOpt/invoke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/invoke.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/invoke.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/invoke.ll Tue May 14 19:35:32 2019
@@ -4,7 +4,7 @@
 ; Globalopt should be able to evaluate an invoke.
 ; CHECK: @tmp = local_unnamed_addr global i32 1
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
 @tmp = global i32 0
 
 define i32 @one() {

Modified: llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll Tue May 14 19:35:32 2019
@@ -1,12 +1,12 @@
 ; RUN: opt -globalopt -S < %s | FileCheck %s
 ; PR10047
 
-%0 = type { i32, void ()* }
+%0 = type { i32, void ()*, i8* }
 %struct.A = type { [100 x i32] }
 
 ; CHECK: @a
 @a = global %struct.A zeroinitializer, align 4
- at llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a }, %0 { i32 65535, void ()* @_GLOBAL__I_b }]
+ at llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a, i8* null }, %0 { i32 65535, void ()* @_GLOBAL__I_b, i8* null }]
 
 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
 

Modified: llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll Tue May 14 19:35:32 2019
@@ -1,7 +1,7 @@
 ; RUN: opt < %s -globalopt -S | FileCheck %s
 ; CHECK-NOT: store
 
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [ { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I__Z3foov } ]          ; <[1 x { i32, void ()* }]*> [#uses=0]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I__Z3foov, i8* null } ]          ; <[1 x { i32, void ()*, i8* }]*> [#uses=0]
 @X.0 = internal global i32 undef                ; <i32*> [#uses=2]
 
 define i32 @_Z3foov() {

Modified: llvm/trunk/test/Transforms/ObjCARC/apelim.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/apelim.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/apelim.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/apelim.ll Tue May 14 19:35:32 2019
@@ -1,7 +1,7 @@
 ; RUN: opt -S -objc-arc-apelim < %s | FileCheck %s
 ; rdar://10227311
 
- at llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_x }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_y }]
+ at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_x, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_y, i8* null }]
 
 @x = global i32 0
 

Modified: llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll Tue May 14 19:35:32 2019
@@ -2,7 +2,7 @@
 
 ; See PR26774
 
- at llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_x }, { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_y }]
+ at llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_x, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_y, i8* null }]
 
 @x = global i32 0
 

Modified: llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll?rev=360742&r1=360741&r2=360742&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll (original)
+++ llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll Tue May 14 19:35:32 2019
@@ -9,7 +9,7 @@
 ; BCA-NOT: <GLOBALVAL_SUMMARY_BLOCK
 
 ; CHECK: @llvm.global_ctors = appending global
- at llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @f }]
+ at llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @f, i8* null }]
 
 ; CHECK: @g = internal global i8 42, !type !0
 @g = internal global i8 42, !type !0

Added: llvm/trunk/test/Verifier/global-ctors-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/global-ctors-2.ll?rev=360742&view=auto
==============================================================================
--- llvm/trunk/test/Verifier/global-ctors-2.ll (added)
+++ llvm/trunk/test/Verifier/global-ctors-2.ll Tue May 14 19:35:32 2019
@@ -0,0 +1,6 @@
+; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
+
+ at llvm.global_ctors = appending global [1 x { i32, void()* } ] [
+  { i32, void()* } { i32 65535, void ()* null }
+]
+; CHECK: the third field of the element type is mandatory, specify i8* null to migrate from the obsoleted 2-field form




More information about the llvm-commits mailing list