From dddd1fd9f44ee04b9fb1081a5e03075fde1398a3 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 4 Jul 2014 18:40:36 +0000 Subject: Implement LTOModule on top of IRObjectFile. IRObjectFile provides all the logic for producing mangled names and getting symbols from inline assembly. LTOModule then adds logic for linking specific tasks, like constructing llvm.compiler_user or extracting linker options from the bitcode. The rule of the thumb is that IRObjectFile has the functionality that is needed by both LTO and llvm-ar. llvm-svn: 212349 --- llvm/lib/Object/IRObjectFile.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'llvm/lib/Object/IRObjectFile.cpp') diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 0639c71d1b0..e927447739e 100644 --- a/llvm/lib/Object/IRObjectFile.cpp +++ b/llvm/lib/Object/IRObjectFile.cpp @@ -33,14 +33,8 @@ using namespace llvm; using namespace object; IRObjectFile::IRObjectFile(std::unique_ptr Object, - std::error_code &EC, LLVMContext &Context) - : SymbolicFile(Binary::ID_IR, std::move(Object)) { - ErrorOr MOrErr = getLazyBitcodeModule(Data.get(), Context); - if ((EC = MOrErr.getError())) - return; - - M.reset(MOrErr.get()); - + std::unique_ptr Mod) + : SymbolicFile(Binary::ID_IR, std::move(Object)), M(std::move(Mod)) { // If we have a DataLayout, setup a mangler. const DataLayout *DL = M->getDataLayout(); if (!DL) @@ -119,7 +113,11 @@ IRObjectFile::IRObjectFile(std::unique_ptr Object, } } -IRObjectFile::~IRObjectFile() { M->getMaterializer()->releaseBuffer(); } +IRObjectFile::~IRObjectFile() { + GVMaterializer *GVM = M->getMaterializer(); + if (GVM) + GVM->releaseBuffer(); + } static const GlobalValue *getGV(DataRefImpl &Symb) { if ((Symb.p & 3) == 3) @@ -275,10 +273,10 @@ basic_symbol_iterator IRObjectFile::symbol_end_impl() const { ErrorOr llvm::object::IRObjectFile::createIRObjectFile( std::unique_ptr Object, LLVMContext &Context) { - std::error_code EC; - std::unique_ptr Ret( - new IRObjectFile(std::move(Object), EC, Context)); - if (EC) + ErrorOr MOrErr = getLazyBitcodeModule(Object.get(), Context); + if (std::error_code EC = MOrErr.getError()) return EC; - return Ret.release(); + + std::unique_ptr M(MOrErr.get()); + return new IRObjectFile(std::move(Object), std::move(M)); } -- cgit v1.2.3