mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
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
This commit is contained in:
parent
a8e1be870c
commit
e348c84630
@ -146,6 +146,25 @@ LTOModule *LTOModule::createInContext(const void *mem, size_t length,
|
|||||||
return makeLTOModule(Buffer, options, errMsg, Context);
|
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,
|
LTOModule *LTOModule::makeLTOModule(MemoryBufferRef Buffer,
|
||||||
TargetOptions options, std::string &errMsg,
|
TargetOptions options, std::string &errMsg,
|
||||||
LLVMContext *Context) {
|
LLVMContext *Context) {
|
||||||
@ -155,13 +174,10 @@ LTOModule *LTOModule::makeLTOModule(MemoryBufferRef Buffer,
|
|||||||
Context = OwnedContext.get();
|
Context = OwnedContext.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<MemoryBufferRef> MBOrErr =
|
// If we own a context, we know this is being used only for symbol
|
||||||
IRObjectFile::findBitcodeInMemBuffer(Buffer);
|
// extraction, not linking. Be lazy in that case.
|
||||||
if (std::error_code EC = MBOrErr.getError()) {
|
ErrorOr<Module *> MOrErr = parseBitcodeFileImpl(
|
||||||
errMsg = EC.message();
|
Buffer, *Context, /* ShouldBeLazy */ static_cast<bool>(OwnedContext));
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
ErrorOr<Module *> MOrErr = parseBitcodeFile(*MBOrErr, *Context);
|
|
||||||
if (std::error_code EC = MOrErr.getError()) {
|
if (std::error_code EC = MOrErr.getError()) {
|
||||||
errMsg = EC.message();
|
errMsg = EC.message();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
Loading…
Reference in New Issue
Block a user