diff options
-rw-r--r-- | llvm/include/llvm/LTO/LTOModule.h | 12 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOModule.cpp | 53 | ||||
-rw-r--r-- | llvm/test/tools/llvm-lto/Inputs/empty.bc | 0 | ||||
-rw-r--r-- | llvm/test/tools/llvm-lto/error.ll | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-lto/llvm-lto.cpp | 11 | ||||
-rw-r--r-- | llvm/tools/lto/lto.cpp | 12 |
6 files changed, 41 insertions, 50 deletions
diff --git a/llvm/include/llvm/LTO/LTOModule.h b/llvm/include/llvm/LTO/LTOModule.h index f009b35b015..d4316f686ad 100644 --- a/llvm/include/llvm/LTO/LTOModule.h +++ b/llvm/include/llvm/LTO/LTOModule.h @@ -57,8 +57,6 @@ private: std::vector<const char*> _asm_undefines; LTOModule(std::unique_ptr<object::IRObjectFile> Obj, TargetMachine *TM); - LTOModule(std::unique_ptr<object::IRObjectFile> Obj, TargetMachine *TM, - std::unique_ptr<LLVMContext> Context); public: ~LTOModule(); @@ -100,13 +98,9 @@ public: static ErrorOr<std::unique_ptr<LTOModule>> createFromBuffer(LLVMContext &Context, const void *mem, size_t length, TargetOptions options, StringRef path = ""); - - static ErrorOr<std::unique_ptr<LTOModule>> - createInLocalContext(const void *mem, size_t length, TargetOptions options, - StringRef path); static ErrorOr<std::unique_ptr<LTOModule>> - createInContext(const void *mem, size_t length, TargetOptions options, - StringRef path, LLVMContext *Context); + createInLocalContext(std::unique_ptr<LLVMContext> Context, const void *mem, + size_t length, TargetOptions options, StringRef path); const Module &getModule() const { return const_cast<LTOModule*>(this)->getModule(); @@ -206,7 +200,7 @@ private: /// Create an LTOModule (private version). static ErrorOr<std::unique_ptr<LTOModule>> makeLTOModule(MemoryBufferRef Buffer, TargetOptions options, - LLVMContext *Context); + LLVMContext &Context, bool ShouldBeLazy); }; } #endif 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(); diff --git a/llvm/test/tools/llvm-lto/Inputs/empty.bc b/llvm/test/tools/llvm-lto/Inputs/empty.bc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/llvm/test/tools/llvm-lto/Inputs/empty.bc diff --git a/llvm/test/tools/llvm-lto/error.ll b/llvm/test/tools/llvm-lto/error.ll index 43043d0cdc0..268b0818761 100644 --- a/llvm/test/tools/llvm-lto/error.ll +++ b/llvm/test/tools/llvm-lto/error.ll @@ -1,2 +1,5 @@ ; RUN: not llvm-lto foobar 2>&1 | FileCheck %s ; CHECK: llvm-lto: error loading file 'foobar': {{N|n}}o such file or directory + +; RUN: not llvm-lto --list-symbols-only %S/Inputs/empty.bc 2>&1 | FileCheck %s --check-prefix=CHECK-LIST +; CHECK-LIST: llvm-lto: error loading file '{{.*}}/Inputs/empty.bc': The file was not recognized as a valid object file diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp index e83ac279f83..7475c815812 100644 --- a/llvm/tools/llvm-lto/llvm-lto.cpp +++ b/llvm/tools/llvm-lto/llvm-lto.cpp @@ -158,8 +158,8 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { exit(1); } -static void diagnosticHandlerWithContenxt(const DiagnosticInfo &DI, - void *Context) { +static void diagnosticHandlerWithContext(const DiagnosticInfo &DI, + void *Context) { diagnosticHandler(DI); } @@ -186,8 +186,11 @@ getLocalLTOModule(StringRef Path, std::unique_ptr<MemoryBuffer> &Buffer, error(BufferOrErr, "error loading file '" + Path + "'"); Buffer = std::move(BufferOrErr.get()); CurrentActivity = ("loading file '" + Path + "'").str(); + std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>(); + Context->setDiagnosticHandler(diagnosticHandlerWithContext, nullptr, true); ErrorOr<std::unique_ptr<LTOModule>> Ret = LTOModule::createInLocalContext( - Buffer->getBufferStart(), Buffer->getBufferSize(), Options, Path); + std::move(Context), Buffer->getBufferStart(), Buffer->getBufferSize(), + Options, Path); CurrentActivity = ""; return std::move(*Ret); } @@ -271,7 +274,7 @@ int main(int argc, char **argv) { unsigned BaseArg = 0; LLVMContext Context; - Context.setDiagnosticHandler(diagnosticHandlerWithContenxt, nullptr, true); + Context.setDiagnosticHandler(diagnosticHandlerWithContext, nullptr, true); LTOCodeGenerator CodeGen(Context); diff --git a/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp index ad5addee7be..798b601413d 100644 --- a/llvm/tools/lto/lto.cpp +++ b/llvm/tools/lto/lto.cpp @@ -248,8 +248,14 @@ lto_module_t lto_module_create_in_local_context(const void *mem, size_t length, const char *path) { lto_initialize(); llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); + + // Create a local context. Ownership will be transfered to LTOModule. + std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>(); + Context->setDiagnosticHandler(diagnosticHandler, nullptr, true); + ErrorOr<std::unique_ptr<LTOModule>> M = - LTOModule::createInLocalContext(mem, length, Options, path); + LTOModule::createInLocalContext(std::move(Context), mem, length, Options, + path); if (!M) return nullptr; return wrap(M->release()); @@ -261,8 +267,8 @@ lto_module_t lto_module_create_in_codegen_context(const void *mem, lto_code_gen_t cg) { lto_initialize(); llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); - ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createInContext( - mem, length, Options, path, &unwrap(cg)->getContext()); + ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer( + unwrap(cg)->getContext(), mem, length, Options, path); return wrap(M->release()); } |