Convert llvm-extract to use lazy loading. This makes it substantially
authorDan Gohman <gohman@apple.com>
Wed, 25 Aug 2010 23:33:07 +0000 (23:33 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 25 Aug 2010 23:33:07 +0000 (23:33 +0000)
faster on large modules.

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

tools/llvm-extract/llvm-extract.cpp

index 190ab2e6b18c4f17e105e77b1e0bd8a2f5485ba3..b5c0bcf4f03001a4255d3235e0f14313f8ff8657 100644 (file)
@@ -71,9 +71,10 @@ int main(int argc, char **argv) {
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
   cl::ParseCommandLineOptions(argc, argv, "llvm extractor\n");
 
+  // Use lazy loading, since we only care about selected global values.
   SMDiagnostic Err;
   std::auto_ptr<Module> M;
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M.reset(getLazyIRFileModule(InputFilename, Err, Context));
 
   if (M.get() == 0) {
     Err.Print(argv[0], errs());
@@ -104,6 +105,18 @@ int main(int argc, char **argv) {
     GVs.push_back(GV);
   }
 
+  // Materialize requisite global values.
+  for (size_t i = 0, e = GVs.size(); i != e; ++i) {
+    GlobalValue *GV = GVs[i];
+    if (GV->isMaterializable()) {
+      std::string ErrInfo;
+      if (GV->Materialize(&ErrInfo)) {
+        errs() << argv[0] << ": error reading input: " << ErrInfo << "\n";
+        return 1;
+      }
+    }
+  }
+
   // In addition to deleting all other functions, we also want to spiff it
   // up a little bit.  Do this now.
   PassManager Passes;