Re-added the part where it tries to remove all global variables first.
authorBill Wendling <isanbard@gmail.com>
Fri, 27 Oct 2006 20:18:06 +0000 (20:18 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 27 Oct 2006 20:18:06 +0000 (20:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31225 91177308-0d34-0410-b5e6-96231b3b80d8

tools/bugpoint/CrashDebugger.cpp

index b86bb8fa042d0853c50266c6a8a3dc018c7ea2e0..a67d9922fce1ad5e94c0fc10a074272aeb11f103 100644 (file)
@@ -357,22 +357,47 @@ static bool DebugACrash(BugDriver &BD,  bool (*TestFn)(BugDriver &, Module *)) {
   if (BD.getProgram()->global_begin() != BD.getProgram()->global_end()) {
     // Now try to reduce the number of global variable initializers in the
     // module to something small.
-    std::vector<GlobalVariable*> GVs;
+    Module *M = CloneModule(BD.getProgram());
+    bool DeletedInit = false;
+
+    for (Module::global_iterator I = M->global_begin(), E = M->global_end();
+         I != E; ++I)
+      if (I->hasInitializer()) {
+        I->setInitializer(0);
+        I->setLinkage(GlobalValue::ExternalLinkage);
+        DeletedInit = true;
+      }
+
+    if (!DeletedInit) {
+      delete M;  // No change made...
+    } else {
+      // See if the program still causes a crash...
+      std::cout << "\nChecking to see if we can delete global inits: ";
+
+      if (TestFn(BD, M)) {      // Still crashes?
+        BD.setNewProgram(M);
+        std::cout << "\n*** Able to remove all global initializers!\n";
+      } else {                  // No longer crashes?
+        std::cout << "  - Removing all global inits hides problem!\n";
+        delete M;
+
+        std::vector<GlobalVariable*> GVs;
 
-    for (Module::global_iterator I = BD.getProgram()->global_begin(),
-           E = BD.getProgram()->global_end(); I != E; ++I)
-      if (I->hasInitializer())
-        GVs.push_back(I);
+        for (Module::global_iterator I = BD.getProgram()->global_begin(),
+               E = BD.getProgram()->global_end(); I != E; ++I)
+          if (I->hasInitializer())
+            GVs.push_back(I);
 
-    if (GVs.size() > 1 && !BugpointIsInterrupted) {
-      std::cout << "\n*** Attempting to reduce the number of global variables "
-                << "in the testcase\n";
+        if (GVs.size() > 1 && !BugpointIsInterrupted) {
+          std::cout << "\n*** Attempting to reduce the number of global "
+                    << "variables in the testcase\n";
 
-      unsigned OldSize = GVs.size();
-      ReduceCrashingGlobalVariables(BD, TestFn).reduceList(GVs);
+          unsigned OldSize = GVs.size();
+          ReduceCrashingGlobalVariables(BD, TestFn).reduceList(GVs);
 
-      if (GVs.size() < OldSize)
-        BD.EmitProgressBytecode("reduced-global-variables");
+          if (GVs.size() < OldSize)
+            BD.EmitProgressBytecode("reduced-global-variables");
+        }
     }
   }