[llvm] r224466 - LTO: Lazy-load LTOModule in local contexts

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed Dec 17 14:05:43 PST 2014


Author: dexonsmith
Date: Wed Dec 17 16:05:42 2014
New Revision: 224466

URL: http://llvm.org/viewvc/llvm-project?rev=224466&view=rev
Log:
LTO: Lazy-load LTOModule in local contexts

Start lazy-loading `LTOModule`s that own their contexts.  These can only
really be used for parsing symbols, so its unnecessary to ever
materialize their functions.

I looked into using `IRObjectFile::create()` and optionally calling
`materializAllPermanently()` afterwards, but this turned out to be
awkward.

  - The default target triple and data layout logic needs to happen
    *before* the call to `IRObjectFile::IRObjectFile()`, but after
    `Module` was created.

  - I tried passing a lambda in to do the module initialization, but
    this seemed to require threading the error message from
    `TargetRegistry::lookupTarget()` through `std::error_code`.

  - I also looked at setting `errMsg` directly from within the lambda,
    but this didn't look any better.

(I guess there's a reason we weren't already using that function.)

Modified:
    llvm/trunk/lib/LTO/LTOModule.cpp

Modified: llvm/trunk/lib/LTO/LTOModule.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOModule.cpp?rev=224466&r1=224465&r2=224466&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTOModule.cpp (original)
+++ llvm/trunk/lib/LTO/LTOModule.cpp Wed Dec 17 16:05:42 2014
@@ -146,6 +146,25 @@ LTOModule *LTOModule::createInContext(co
   return makeLTOModule(Buffer, options, errMsg, Context);
 }
 
+static ErrorOr<Module *> parseBitcodeFileImpl(MemoryBufferRef Buffer,
+                                              LLVMContext &Context,
+                                              bool ShouldBeLazy) {
+  // Find the buffer.
+  ErrorOr<MemoryBufferRef> MBOrErr =
+      IRObjectFile::findBitcodeInMemBuffer(Buffer);
+  if (std::error_code EC = MBOrErr.getError())
+    return EC;
+
+  if (!ShouldBeLazy)
+    // Parse the full file.
+    return parseBitcodeFile(*MBOrErr, Context);
+
+  // Parse lazily.
+  std::unique_ptr<MemoryBuffer> LightweightBuf =
+      MemoryBuffer::getMemBuffer(*MBOrErr, false);
+  return getLazyBitcodeModule(std::move(LightweightBuf), Context);
+}
+
 LTOModule *LTOModule::makeLTOModule(MemoryBufferRef Buffer,
                                     TargetOptions options, std::string &errMsg,
                                     LLVMContext *Context) {
@@ -155,13 +174,10 @@ LTOModule *LTOModule::makeLTOModule(Memo
     Context = OwnedContext.get();
   }
 
-  ErrorOr<MemoryBufferRef> MBOrErr =
-      IRObjectFile::findBitcodeInMemBuffer(Buffer);
-  if (std::error_code EC = MBOrErr.getError()) {
-    errMsg = EC.message();
-    return nullptr;
-  }
-  ErrorOr<Module *> MOrErr = parseBitcodeFile(*MBOrErr, *Context);
+  // If we own a context, we know this is being used only for symbol
+  // extraction, not linking.  Be lazy in that case.
+  ErrorOr<Module *> MOrErr = parseBitcodeFileImpl(
+      Buffer, *Context, /* ShouldBeLazy */ static_cast<bool>(OwnedContext));
   if (std::error_code EC = MOrErr.getError()) {
     errMsg = EC.message();
     return nullptr;





More information about the llvm-commits mailing list