Use llvm.global_ctors to locate global constructors instead
of recognizing them by name.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148416 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/ObjCARC.cpp b/lib/Transforms/Scalar/ObjCARC.cpp
index 87df838..a01676a 100644
--- a/lib/Transforms/Scalar/ObjCARC.cpp
+++ b/lib/Transforms/Scalar/ObjCARC.cpp
@@ -887,6 +887,8 @@
 // ARC autorelease pool elimination.
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Constants.h"
+
 namespace {
   /// ObjCARCAPElim - Autorelease pool elimination.
   class ObjCARCAPElim : public ModulePass {
@@ -978,17 +980,28 @@
   if (!ModuleHasARC(M))
     return false;
 
+  // Find the llvm.global_ctors variable, as the first step in
+  // identifying the global constructors.
+  GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors");
+  if (!GV)
+    return false;
+
+  assert(GV->hasDefinitiveInitializer() &&
+         "llvm.global_ctors is uncooperative!");
+
   bool Changed = false;
 
-  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
-    Function *F = I;
+  // Dig the constructor functions out of GV's initializer.
+  ConstantArray *Init = cast<ConstantArray>(GV->getInitializer());
+  for (User::op_iterator OI = Init->op_begin(), OE = Init->op_end();
+       OI != OE; ++OI) {
+    Value *Op = *OI;
+    // llvm.global_ctors is an array of pairs where the second members
+    // are constructor functions.
+    Function *F = cast<Function>(cast<ConstantStruct>(Op)->getOperand(1));
     // Only look at function definitions.
     if (F->isDeclaration())
       continue;
-    // Only look at global constructor functions. Unfortunately,
-    // the name is the most convenient way to recognize them.
-    if (!F->getName().startswith("_GLOBAL__I_"))
-      continue;
     // Only look at functions with one basic block.
     if (llvm::next(F->begin()) != F->end())
       continue;