diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-12-17 22:05:42 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-12-17 22:05:42 +0000 |
| commit | 140d41b791825eb29dcfcb81744ef7a87c554bba (patch) | |
| tree | 3ab5aac030f255b9a29f822922ae0967aea36eaf /llvm/lib | |
| parent | 6c93b3e29c56d14eab570ce62cd646a95f0c1403 (diff) | |
| download | bcm5719-llvm-140d41b791825eb29dcfcb81744ef7a87c554bba.tar.gz bcm5719-llvm-140d41b791825eb29dcfcb81744ef7a87c554bba.zip | |
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.)
llvm-svn: 224466
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/LTO/LTOModule.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/llvm/lib/LTO/LTOModule.cpp b/llvm/lib/LTO/LTOModule.cpp index 678b1801c4a..8817c35d9d4 100644 --- a/llvm/lib/LTO/LTOModule.cpp +++ b/llvm/lib/LTO/LTOModule.cpp @@ -146,6 +146,25 @@ LTOModule *LTOModule::createInContext(const void *mem, size_t length, 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(MemoryBufferRef Buffer, 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; |

