If all linker input files are native object files then lto-bugpoint is not useful.
authorDevang Patel <dpatel@apple.com>
Fri, 18 Jul 2008 23:46:41 +0000 (23:46 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 18 Jul 2008 23:46:41 +0000 (23:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53777 91177308-0d34-0410-b5e6-96231b3b80d8

tools/lto-bugpoint/LTOBugPoint.cpp
tools/lto-bugpoint/LTOBugPoint.h
tools/lto-bugpoint/Makefile
tools/lto-bugpoint/lto-bugpoint.cpp

index 83ed134816c187fdb6743fff7e16f4b0a6c668b0..925ab9e1acb7a2091620037ae1fcb5b915a1fafd 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "LTOBugPoint.h"
+#include "llvm/Support/SystemUtils.h"
+#include "llvm/System/Path.h"
+#include <iostream>
 
+/// LTOBugPoint -- Constructor. Popuate list of linker options and
+/// list of linker input files.
 LTOBugPoint::LTOBugPoint(std::istream &args, std::istream &ins) {
 
   // Read linker options. Order is important here.
@@ -26,3 +31,27 @@ LTOBugPoint::LTOBugPoint(std::istream &args, std::istream &ins) {
   while(getline(ins, inFile))
     LinkerInputFiles.push_back(inFile);
 }
+
+/// findTroubleMakers - Find minimum set of input files that causes error
+/// identified by the script.
+bool
+LTOBugPoint::findTroubleMakers(llvm::SmallVector<std::string, 4> &TroubleMakers,
+                              std::string &Script) {
+
+  // First, build native object files set.
+  bool bitcodeFileSeen = false;
+  for(llvm::SmallVector<std::string, 16>::iterator I = LinkerInputFiles.begin(),
+       E = LinkerInputFiles.end(); I != E; ++I) {
+    std::string &path = *I;
+    if (llvm::sys::Path(path.c_str()).isBitcodeFile()) 
+      bitcodeFileSeen = true;
+  }
+
+  if (!bitcodeFileSeen) {
+    std::cerr << "lto-bugpoint: Error: Unable to help!"; 
+    std::cerr << " Need at least one input file that contains llvm bitcode\n";
+    return false;
+  }
+
+  return true;
+}
index 57b99c15f22f37eb1fa029d1a00c8d13c4a583ae..b73b2672d6ce822764032b99c98d88a25866cfe8 100644 (file)
@@ -21,10 +21,22 @@ class LTOBugPoint {
 
   LTOBugPoint(std::istream &args, std::istream &ins);
 
+  /// findTroubleMakers - Find minimum set of input files that causes error
+  /// identified by the script.
+  bool findTroubleMakers(llvm::SmallVector<std::string, 4> &TroubleMakers,
+                       std::string &Script);
  private:
   /// LinkerInputFiles - This is a list of linker input files. Once populated
   /// this list is not modified.
   llvm::SmallVector<std::string, 16> LinkerInputFiles;
+
+  /// LinkerOptions - List of linker command line options.
   llvm::SmallVector<std::string, 16> LinkerOptions;
 
+  /// NativeInputFiles - This is a list of input files that are not llvm
+  /// bitcode files. The order in this list is important. The a file
+  /// in LinkerInputFiles at index 4 is a llvm bitcode file then the file
+  /// at index 4 in NativeInputFiles is corresponding native object file.
+  llvm::SmallVector<std::string, 16> NativeInputFiles;
+
 };
index e7f8061b0dd90bbd1642061e1e73dd9e03455d20..c63eb6b6feb6d40686239e7e16079c5f6ce4affe 100644 (file)
@@ -10,6 +10,8 @@ LEVEL = ../..
 
 TOOLNAME = lto-bugpoint
 
+LINK_COMPONENTS := system
+
 REQUIRES_EH := 1
 
 include $(LEVEL)/Makefile.common
index 8633415d65cc9980c9aa66f963bd9a65f2fda690..01adb5734d369e607c0b5f9f01c47d38fea37df0 100644 (file)
@@ -47,16 +47,13 @@ int main(int argc, char **argv) {
 
     // Third argument is absolute path to the validation script. This
     // script is used to validate LTO error under investigation.
-    std::istream *ValidationScriptFile = new std::ifstream(argv[3], input_mode);
-    if (!ValidationScriptFile->good()) {
-      std::cerr << argv[0] << ": error opening " << argv[3] << "!\n";
-      delete LinkerArgsFile;
-      delete LinkerInputsFile;
-      return 1;
-    }
-
+    std::string ValidationScript = argv[3];
     LTOBugPoint bugFinder(*LinkerArgsFile, *LinkerInputsFile);
 
+    llvm::SmallVector<std::string, 4> TroubleMakers;
+    if (!bugFinder.findTroubleMakers(TroubleMakers, ValidationScript))
+      return 1;
+
     return 0;
   } catch (const std::string& msg) {
     std::cerr << argv[0] << ": " << msg << "\n";