X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FObject%2FIRObjectFile.cpp;h=964c7ed691d45d68c51a5214f4b03d1979daf2d3;hb=2292996e1a2c10bb62e1ebf8b0e658291bc7724d;hp=d01910811a65f5a2a7094f34fd02041013798456;hpb=ada0f6a93e1308d9d756ecd29fb86f4e8ad57d96;p=oota-llvm.git diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index d01910811a6..964c7ed691d 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" @@ -32,15 +32,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()); - +IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr Mod) + : SymbolicFile(Binary::ID_IR, Object), M(std::move(Mod)) { // If we have a DataLayout, setup a mangler. const DataLayout *DL = M->getDataLayout(); if (!DL) @@ -82,7 +75,7 @@ IRObjectFile::IRObjectFile(std::unique_ptr Object, std::unique_ptr Buffer(MemoryBuffer::getMemBuffer(InlineAsm)); SourceMgr SrcMgr; - SrcMgr.AddNewSourceBuffer(Buffer.release(), SMLoc()); + SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc()); std::unique_ptr Parser( createMCAsmParser(SrcMgr, MCCtx, *Streamer, *MAI)); @@ -119,7 +112,8 @@ IRObjectFile::IRObjectFile(std::unique_ptr Object, } } -IRObjectFile::~IRObjectFile() { M->getMaterializer()->releaseBuffer(); } +IRObjectFile::~IRObjectFile() { + } static const GlobalValue *getGV(DataRefImpl &Symb) { if ((Symb.p & 3) == 3) @@ -240,7 +234,9 @@ uint32_t IRObjectFile::getSymbolFlags(DataRefImpl Symb) const { if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) Res |= BasicSymbolRef::SF_Weak; - if (auto *Var = dyn_cast(GV)) { + 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; } @@ -268,12 +264,17 @@ basic_symbol_iterator IRObjectFile::symbol_end_impl() const { return basic_symbol_iterator(BasicSymbolRef(Ret, this)); } -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 +llvm::object::IRObjectFile::createIRObjectFile(MemoryBufferRef Object, + LLVMContext &Context) { + + std::unique_ptr Buff(MemoryBuffer::getMemBuffer(Object, false)); + + ErrorOr MOrErr = getLazyBitcodeModule(Buff.get(), Context); + if (std::error_code EC = MOrErr.getError()) return EC; - return Ret.release(); + Buff.release(); + + std::unique_ptr M(MOrErr.get()); + return new IRObjectFile(Object, std::move(M)); }