Auto-upgrade the magic ".llvm.eh.catch.all.value" global to
authorBill Wendling <isanbard@gmail.com>
Fri, 10 Sep 2010 18:51:56 +0000 (18:51 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 10 Sep 2010 18:51:56 +0000 (18:51 +0000)
"llvm.eh.catch.all.value". Only the name needs to be changed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113600 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/AutoUpgrade.h
lib/Bitcode/Reader/BitcodeReader.cpp
lib/VMCore/AutoUpgrade.cpp
test/Bitcode/AutoUpgradeGlobals.ll [new file with mode: 0644]
test/Bitcode/AutoUpgradeGlobals.ll.bc [new file with mode: 0644]

index 0a81c807956f6ec7192a14d1fd7205c505f4b272..5ce20b69e2fb2a26d7c228499ddd5ce5cc354a55 100644 (file)
@@ -16,6 +16,7 @@
 
 namespace llvm {
   class Module;
+  class GlobalVariable;
   class Function;
   class CallInst;
 
@@ -35,6 +36,10 @@ 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 function checks debug info intrinsics. If an intrinsic is invalid
   /// then this function simply removes the intrinsic. 
   void CheckDebugInfoIntrinsics(Module *M);
index 02b1fb0e6b4ff0c90ed806499e828f2e156ab5d3..74b8e40a18d07c87b2f090a7a07546498158190f 100644 (file)
@@ -1288,6 +1288,12 @@ bool BitcodeReader::ParseModule() {
           UpgradedIntrinsics.push_back(std::make_pair(FI, NewFn));
       }
 
+      // Look for global variables which need to be renamed.
+      for (Module::global_iterator
+             GI = TheModule->global_begin(), GE = TheModule->global_end();
+           GI != GE; ++GI)
+        UpgradeGlobalVariable(GI);
+
       // Force deallocation of memory for these vectors to favor the client that
       // want lazy deserialization.
       std::vector<std::pair<GlobalVariable*, unsigned> >().swap(GlobalInits);
index fd64460d6fd334e3372f4795ccd75fe7b6053de1..3908e8aed68cb2e7284e15538793ccb5505ac9e2 100644 (file)
@@ -365,6 +365,20 @@ bool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn) {
   return Upgraded;
 }
 
+bool llvm::UpgradeGlobalVariable(GlobalVariable *GV) {
+  const std::string &Name = GV->getName();
+
+  // We are only upgrading one symbol here. If we upgrade more, we will want to
+  // perform some sort of short-circuiting like in the
+  // "UpgradeIntrinsicFunction1" function.
+  if (Name == ".llvm.eh.catch.all.value") {
+    GV->setName("llvm.eh.catch.all.value");
+    return true;
+  }
+
+  return false;
+}
+
 /// ExtendNEONArgs - For NEON "long" and "wide" operations, where the results
 /// have vector elements twice as big as one or both source operands, do the
 /// sign- or zero-extension that used to be handled by intrinsics.  The
diff --git a/test/Bitcode/AutoUpgradeGlobals.ll b/test/Bitcode/AutoUpgradeGlobals.ll
new file mode 100644 (file)
index 0000000..8a87673
--- /dev/null
@@ -0,0 +1,3 @@
+; This isn't really an assembly file. It just runs test on bitcode to ensure
+; it is auto-upgraded.
+; RUN: llvm-dis < %s.bc | not grep {i32 @\\.llvm\\.eh}
diff --git a/test/Bitcode/AutoUpgradeGlobals.ll.bc b/test/Bitcode/AutoUpgradeGlobals.ll.bc
new file mode 100644 (file)
index 0000000..1abe968
Binary files /dev/null and b/test/Bitcode/AutoUpgradeGlobals.ll.bc differ