diff options
Diffstat (limited to 'llvm/lib/LTO/LTOModule.cpp')
-rw-r--r-- | llvm/lib/LTO/LTOModule.cpp | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/llvm/lib/LTO/LTOModule.cpp b/llvm/lib/LTO/LTOModule.cpp index 987da3e3210..9e49f0dc007 100644 --- a/llvm/lib/LTO/LTOModule.cpp +++ b/llvm/lib/LTO/LTOModule.cpp @@ -54,11 +54,6 @@ LTOModule::LTOModule(std::unique_ptr<object::IRObjectFile> Obj, llvm::TargetMachine *TM) : IRFile(std::move(Obj)), _target(TM) {} -LTOModule::LTOModule(std::unique_ptr<object::IRObjectFile> Obj, - llvm::TargetMachine *TM, - std::unique_ptr<LLVMContext> Context) - : OwnedContext(std::move(Context)), IRFile(std::move(Obj)), _target(TM) {} - LTOModule::~LTOModule() {} /// isBitcodeFile - Returns 'true' if the file (or memory contents) is LLVM @@ -110,7 +105,8 @@ LTOModule::createFromFile(LLVMContext &Context, const char *path, return EC; } std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrErr.get()); - return makeLTOModule(Buffer->getMemBufferRef(), options, &Context); + return makeLTOModule(Buffer->getMemBufferRef(), options, Context, + /* ShouldBeLazy*/ false); } ErrorOr<std::unique_ptr<LTOModule>> @@ -130,29 +126,32 @@ LTOModule::createFromOpenFileSlice(LLVMContext &Context, int fd, return EC; } std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrErr.get()); - return makeLTOModule(Buffer->getMemBufferRef(), options, &Context); + return makeLTOModule(Buffer->getMemBufferRef(), options, Context, + /* ShouldBeLazy */ false); } ErrorOr<std::unique_ptr<LTOModule>> LTOModule::createFromBuffer(LLVMContext &Context, const void *mem, size_t length, TargetOptions options, StringRef path) { - return createInContext(mem, length, options, path, &Context); + StringRef Data((const char *)mem, length); + MemoryBufferRef Buffer(Data, path); + return makeLTOModule(Buffer, options, Context, /* ShouldBeLazy */ false); } ErrorOr<std::unique_ptr<LTOModule>> -LTOModule::createInLocalContext(const void *mem, size_t length, +LTOModule::createInLocalContext(std::unique_ptr<LLVMContext> Context, + const void *mem, size_t length, TargetOptions options, StringRef path) { - return createInContext(mem, length, options, path, nullptr); -} - -ErrorOr<std::unique_ptr<LTOModule>> -LTOModule::createInContext(const void *mem, size_t length, - TargetOptions options, StringRef path, - LLVMContext *Context) { StringRef Data((const char *)mem, length); MemoryBufferRef Buffer(Data, path); - return makeLTOModule(Buffer, options, Context); + // If we own a context, we know this is being used only for symbol extraction, + // not linking. Be lazy in that case. + ErrorOr<std::unique_ptr<LTOModule>> Ret = + makeLTOModule(Buffer, options, *Context, /* ShouldBeLazy */ true); + if (Ret) + (*Ret)->OwnedContext = std::move(Context); + return std::move(Ret); } static ErrorOr<std::unique_ptr<Module>> @@ -187,18 +186,9 @@ parseBitcodeFileImpl(MemoryBufferRef Buffer, LLVMContext &Context, ErrorOr<std::unique_ptr<LTOModule>> LTOModule::makeLTOModule(MemoryBufferRef Buffer, TargetOptions options, - LLVMContext *Context) { - std::unique_ptr<LLVMContext> OwnedContext; - if (!Context) { - OwnedContext = llvm::make_unique<LLVMContext>(); - Context = OwnedContext.get(); - } - - // If we own a context, we know this is being used only for symbol - // extraction, not linking. Be lazy in that case. + LLVMContext &Context, bool ShouldBeLazy) { ErrorOr<std::unique_ptr<Module>> MOrErr = - parseBitcodeFileImpl(Buffer, *Context, - /* ShouldBeLazy */ static_cast<bool>(OwnedContext)); + parseBitcodeFileImpl(Buffer, Context, ShouldBeLazy); if (std::error_code EC = MOrErr.getError()) return EC; std::unique_ptr<Module> &M = *MOrErr; @@ -236,12 +226,7 @@ LTOModule::makeLTOModule(MemoryBufferRef Buffer, TargetOptions options, std::unique_ptr<object::IRObjectFile> IRObj( new object::IRObjectFile(Buffer, std::move(M))); - std::unique_ptr<LTOModule> Ret; - if (OwnedContext) - Ret.reset(new LTOModule(std::move(IRObj), target, std::move(OwnedContext))); - else - Ret.reset(new LTOModule(std::move(IRObj), target)); - + std::unique_ptr<LTOModule> Ret(new LTOModule(std::move(IRObj), target)); Ret->parseSymbols(); Ret->parseMetadata(); |