X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FObject%2FIRObjectFile.cpp;h=5323d9277eee1f4d47a8bceb6dd061f3b550f46d;hb=783d16f0b73462275904768fa54c2ea9ed33a9d0;hp=50394058a87ad69a0da3c73953f1501b7730e12a;hpb=ab419e6d0c52628e149e740b4d1f1ff6df52fd97;p=oota-llvm.git diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index 50394058a87..5323d9277ee 100644 --- a/lib/Object/IRObjectFile.cpp +++ b/lib/Object/IRObjectFile.cpp @@ -11,13 +11,13 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Object/IRObjectFile.h" +#include "RecordStreamer.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/GVMaterializer.h" #include "llvm/IR/Mangler.h" #include "llvm/IR/Module.h" -#include "llvm/Object/IRObjectFile.h" -#include "llvm/Object/RecordStreamer.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" @@ -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) @@ -240,6 +238,13 @@ uint32_t IRObjectFile::getSymbolFlags(DataRefImpl Symb) const { if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) Res |= BasicSymbolRef::SF_Weak; + if (GV->getName().startswith("llvm.")) + Res |= BasicSymbolRef::SF_FormatSpecific; + else if (auto *Var = dyn_cast(GV)) { + if (Var->getSection() == StringRef("llvm.metadata")) + Res |= BasicSymbolRef::SF_FormatSpecific; + } + return Res; } @@ -265,10 +270,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)); }