diff options
Diffstat (limited to 'contrib/llvm/lib/Object/IRObjectFile.cpp')
| -rw-r--r-- | contrib/llvm/lib/Object/IRObjectFile.cpp | 41 | 
1 files changed, 25 insertions, 16 deletions
| diff --git a/contrib/llvm/lib/Object/IRObjectFile.cpp b/contrib/llvm/lib/Object/IRObjectFile.cpp index c35c413b3c3b..42c8ecd62da8 100644 --- a/contrib/llvm/lib/Object/IRObjectFile.cpp +++ b/contrib/llvm/lib/Object/IRObjectFile.cpp @@ -24,9 +24,9 @@  #include "llvm/MC/MCInstrInfo.h"  #include "llvm/MC/MCObjectFileInfo.h"  #include "llvm/MC/MCParser/MCAsmParser.h" +#include "llvm/MC/MCParser/MCTargetAsmParser.h"  #include "llvm/MC/MCRegisterInfo.h"  #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/MC/MCTargetAsmParser.h"  #include "llvm/Object/ObjectFile.h"  #include "llvm/Support/MemoryBuffer.h"  #include "llvm/Support/SourceMgr.h" @@ -38,12 +38,20 @@ using namespace object;  IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)      : SymbolicFile(Binary::ID_IR, Object), M(std::move(Mod)) {    Mang.reset(new Mangler()); +  CollectAsmUndefinedRefs(Triple(M->getTargetTriple()), M->getModuleInlineAsm(), +                          [this](StringRef Name, BasicSymbolRef::Flags Flags) { +                            AsmSymbols.emplace_back(Name, std::move(Flags)); +                          }); +} -  const std::string &InlineAsm = M->getModuleInlineAsm(); +// Parse inline ASM and collect the list of symbols that are not defined in +// the current module. This is inspired from IRObjectFile. +void IRObjectFile::CollectAsmUndefinedRefs( +    const Triple &TT, StringRef InlineAsm, +    function_ref<void(StringRef, BasicSymbolRef::Flags)> AsmUndefinedRefs) {    if (InlineAsm.empty())      return; -  Triple TT(M->getTargetTriple());    std::string Err;    const Target *T = TargetRegistry::lookupTarget(TT.str(), Err);    if (!T) @@ -68,7 +76,7 @@ IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)    MCObjectFileInfo MOFI;    MCContext MCCtx(MAI.get(), MRI.get(), &MOFI); -  MOFI.InitMCObjectFileInfo(TT, Reloc::Default, CodeModel::Default, MCCtx); +  MOFI.InitMCObjectFileInfo(TT, /*PIC*/ false, CodeModel::Default, MCCtx);    std::unique_ptr<RecordStreamer> Streamer(new RecordStreamer(MCCtx));    T->createNullTargetStreamer(*Streamer); @@ -105,9 +113,12 @@ IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)        Res |= BasicSymbolRef::SF_Undefined;        Res |= BasicSymbolRef::SF_Global;        break; +    case RecordStreamer::GlobalWeak: +      Res |= BasicSymbolRef::SF_Weak; +      Res |= BasicSymbolRef::SF_Global; +      break;      } -    AsmSymbols.push_back( -        std::make_pair<std::string, uint32_t>(Key, std::move(Res))); +    AsmUndefinedRefs(Key, BasicSymbolRef::Flags(Res));    }  } @@ -231,13 +242,14 @@ uint32_t IRObjectFile::getSymbolFlags(DataRefImpl Symb) const {      Res |= BasicSymbolRef::SF_Global;    if (GV->hasCommonLinkage())      Res |= BasicSymbolRef::SF_Common; -  if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) +  if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() || +      GV->hasExternalWeakLinkage())      Res |= BasicSymbolRef::SF_Weak;    if (GV->getName().startswith("llvm."))      Res |= BasicSymbolRef::SF_FormatSpecific;    else if (auto *Var = dyn_cast<GlobalVariable>(GV)) { -    if (Var->getSection() == StringRef("llvm.metadata")) +    if (Var->getSection() == "llvm.metadata")        Res |= BasicSymbolRef::SF_FormatSpecific;    } @@ -265,10 +277,7 @@ basic_symbol_iterator IRObjectFile::symbol_end_impl() const {  ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInObject(const ObjectFile &Obj) {    for (const SectionRef &Sec : Obj.sections()) { -    StringRef SecName; -    if (std::error_code EC = Sec.getName(SecName)) -      return EC; -    if (SecName == ".llvmbc") { +    if (Sec.isBitcode()) {        StringRef SecContents;        if (std::error_code EC = Sec.getContents(SecContents))          return EC; @@ -287,10 +296,10 @@ ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Ob    case sys::fs::file_magic::elf_relocatable:    case sys::fs::file_magic::macho_object:    case sys::fs::file_magic::coff_object: { -    ErrorOr<std::unique_ptr<ObjectFile>> ObjFile = +    Expected<std::unique_ptr<ObjectFile>> ObjFile =          ObjectFile::createObjectFile(Object, Type);      if (!ObjFile) -      return ObjFile.getError(); +      return errorToErrorCode(ObjFile.takeError());      return findBitcodeInObject(*ObjFile->get());    }    default: @@ -305,8 +314,8 @@ llvm::object::IRObjectFile::create(MemoryBufferRef Object,    if (!BCOrErr)      return BCOrErr.getError(); -  std::unique_ptr<MemoryBuffer> Buff( -      MemoryBuffer::getMemBuffer(BCOrErr.get(), false)); +  std::unique_ptr<MemoryBuffer> Buff = +      MemoryBuffer::getMemBuffer(BCOrErr.get(), false);    ErrorOr<std::unique_ptr<Module>> MOrErr =        getLazyBitcodeModule(std::move(Buff), Context, | 
