diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp index 678b1801c4a..8817c35d9d4 100644 --- a/lib/LTO/LTOModule.cpp +++ b/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 parseBitcodeFileImpl(MemoryBufferRef Buffer, + LLVMContext &Context, + bool ShouldBeLazy) { + // Find the buffer. + ErrorOr 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 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 MBOrErr = - IRObjectFile::findBitcodeInMemBuffer(Buffer); - if (std::error_code EC = MBOrErr.getError()) { - errMsg = EC.message(); - return nullptr; - } - ErrorOr 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 MOrErr = parseBitcodeFileImpl( + Buffer, *Context, /* ShouldBeLazy */ static_cast(OwnedContext)); if (std::error_code EC = MOrErr.getError()) { errMsg = EC.message(); return nullptr;