[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