From 786d8e33db3a5d5754c5d9be10bc508cf28de921 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Thu, 29 Sep 2016 00:40:08 +0000 Subject: [PATCH] [ELF/LTO] Switch to the new resolution-based API. Differential Revision: https://reviews.llvm.org/D24492 llvm-svn: 282656 --- lld/ELF/Error.h | 9 + lld/ELF/InputFiles.cpp | 115 ++----- lld/ELF/InputFiles.h | 13 +- lld/ELF/LTO.cpp | 322 ++++-------------- lld/ELF/LTO.h | 17 +- lld/ELF/SymbolTable.cpp | 42 +-- lld/ELF/SymbolTable.h | 10 +- lld/ELF/Symbols.h | 3 - lld/test/ELF/lto/archive-3.ll | 4 +- lld/test/ELF/lto/asmundef.ll | 2 +- lld/test/ELF/lto/available-externally.ll | 2 +- lld/test/ELF/lto/common2.ll | 2 +- lld/test/ELF/lto/common3.ll | 2 +- lld/test/ELF/lto/discard-value-names.ll | 2 +- lld/test/ELF/lto/drop-debug-info.ll | 2 +- lld/test/ELF/lto/drop-linkage.ll | 2 +- lld/test/ELF/lto/internalize-basic.ll | 2 +- lld/test/ELF/lto/internalize-exportdyn.ll | 2 +- lld/test/ELF/lto/internalize-llvmused.ll | 2 +- lld/test/ELF/lto/internalize-undef.ll | 2 +- .../ELF/lto/internalize-version-script.ll | 2 +- lld/test/ELF/lto/irmover-error.ll | 2 +- lld/test/ELF/lto/linkonce-odr.ll | 2 +- lld/test/ELF/lto/linkonce.ll | 2 +- lld/test/ELF/lto/ltopasses-basic.ll | 3 +- lld/test/ELF/lto/ltopasses-custom.ll | 4 +- lld/test/ELF/lto/save-temps.ll | 4 +- lld/test/ELF/lto/type-merge.ll | 2 +- lld/test/ELF/lto/type-merge2.ll | 2 +- lld/test/ELF/lto/unnamed-addr-comdat.ll | 2 +- lld/test/ELF/lto/unnamed-addr-drop.ll | 2 +- lld/test/ELF/lto/unnamed-addr-lib.ll | 6 +- lld/test/ELF/lto/unnamed-addr.ll | 2 +- lld/test/ELF/lto/version-script.ll | 2 +- 34 files changed, 187 insertions(+), 407 deletions(-) diff --git a/lld/ELF/Error.h b/lld/ELF/Error.h index 5887e4ce9432..34e63c6dda7b 100644 --- a/lld/ELF/Error.h +++ b/lld/ELF/Error.h @@ -12,6 +12,8 @@ #include "lld/Core/LLVM.h" +#include "llvm/Support/Error.h" + namespace lld { namespace elf { @@ -31,6 +33,13 @@ template void error(const ErrorOr &V, const Twine &Prefix) { LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg); LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg, const Twine &Prefix); +inline void check(Error E) { + handleAllErrors(std::move(E), [&](llvm::ErrorInfoBase &EIB) { + error(EIB.message()); + return Error::success(); + }); +} + template T check(ErrorOr E) { if (auto EC = E.getError()) fatal(EC.message()); diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 9ec47a05bd07..d13a0b31b344 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -20,6 +20,7 @@ #include "llvm/CodeGen/Analysis.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" +#include "llvm/LTO/LTO.h" #include "llvm/MC/StringTableBuilder.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" @@ -397,13 +398,12 @@ SymbolBody *elf::ObjectFile::createSymbolBody(const Elf_Sym *Sym) { case SHN_UNDEF: return elf::Symtab::X ->addUndefined(Name, Binding, Sym->st_other, Sym->getType(), - /*CanOmitFromDynSym*/ false, /*HasUnnamedAddr*/ false, - this) + /*CanOmitFromDynSym*/ false, this) ->body(); case SHN_COMMON: return elf::Symtab::X ->addCommon(Name, Sym->st_size, Sym->st_value, Binding, Sym->st_other, - Sym->getType(), /*HasUnnamedAddr*/ false, this) + Sym->getType(), this) ->body(); } @@ -416,8 +416,7 @@ SymbolBody *elf::ObjectFile::createSymbolBody(const Elf_Sym *Sym) { if (Sec == &InputSection::Discarded) return elf::Symtab::X ->addUndefined(Name, Binding, Sym->st_other, Sym->getType(), - /*CanOmitFromDynSym*/ false, - /*HasUnnamedAddr*/ false, this) + /*CanOmitFromDynSym*/ false, this) ->body(); return elf::Symtab::X->addRegular(Name, *Sym, Sec)->body(); } @@ -639,8 +638,8 @@ BitcodeFile::BitcodeFile(MemoryBufferRef MB) : InputFile(BitcodeKind, MB) { EMachine = getBitcodeMachineKind(MB); } -static uint8_t getGvVisibility(const GlobalValue *GV) { - switch (GV->getVisibility()) { +static uint8_t mapVisibility(GlobalValue::VisibilityTypes GvVisibility) { + switch (GvVisibility) { case GlobalValue::DefaultVisibility: return STV_DEFAULT; case GlobalValue::HiddenVisibility: @@ -652,84 +651,48 @@ static uint8_t getGvVisibility(const GlobalValue *GV) { } template -Symbol *BitcodeFile::createSymbol(const DenseSet &KeptComdats, - const IRObjectFile &Obj, - const BasicSymbolRef &Sym) { - const GlobalValue *GV = Obj.getSymbolGV(Sym.getRawDataRefImpl()); - - SmallString<64> Name; - raw_svector_ostream OS(Name); - Sym.printName(OS); - StringRef NameRef = Saver.save(StringRef(Name)); - - uint32_t Flags = Sym.getFlags(); +static Symbol *createBitcodeSymbol(const DenseSet &KeptComdats, + const lto::InputFile::Symbol &ObjSym, + StringSaver &Saver, BitcodeFile *F) { + StringRef NameRef = Saver.save(ObjSym.getName()); + uint32_t Flags = ObjSym.getFlags(); uint32_t Binding = (Flags & BasicSymbolRef::SF_Weak) ? STB_WEAK : STB_GLOBAL; - uint8_t Type = STT_NOTYPE; - uint8_t Visibility; - bool CanOmitFromDynSym = false; - bool HasUnnamedAddr = false; + uint8_t Type = ObjSym.isTLS() ? STT_TLS : STT_NOTYPE; + uint8_t Visibility = mapVisibility(ObjSym.getVisibility()); + bool CanOmitFromDynSym = ObjSym.canBeOmittedFromSymbolTable(); - // FIXME: Expose a thread-local flag for module asm symbols. - if (GV) { - if (GV->isThreadLocal()) - Type = STT_TLS; - CanOmitFromDynSym = canBeOmittedFromSymbolTable(GV); - Visibility = getGvVisibility(GV); - HasUnnamedAddr = - GV->getUnnamedAddr() == llvm::GlobalValue::UnnamedAddr::Global; - } else { - // FIXME: Set SF_Hidden flag correctly for module asm symbols, and expose - // protected visibility. - Visibility = STV_DEFAULT; - } + if (const Comdat *C = check(ObjSym.getComdat())) + if (!KeptComdats.count(C)) + return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, + CanOmitFromDynSym, F); - if (GV) - if (const Comdat *C = GV->getComdat()) - if (!KeptComdats.count(C)) - return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, - CanOmitFromDynSym, HasUnnamedAddr, - this); - - const Module &M = Obj.getModule(); if (Flags & BasicSymbolRef::SF_Undefined) return Symtab::X->addUndefined(NameRef, Binding, Visibility, Type, - CanOmitFromDynSym, HasUnnamedAddr, - this); - if (Flags & BasicSymbolRef::SF_Common) { - // FIXME: Set SF_Common flag correctly for module asm symbols, and expose - // size and alignment. - assert(GV); - const DataLayout &DL = M.getDataLayout(); - uint64_t Size = DL.getTypeAllocSize(GV->getValueType()); - return Symtab::X->addCommon(NameRef, Size, GV->getAlignment(), - Binding, Visibility, STT_OBJECT, - HasUnnamedAddr, this); - } - return Symtab::X->addBitcode(NameRef, Binding, Visibility, Type, - CanOmitFromDynSym, HasUnnamedAddr, this); -} + CanOmitFromDynSym, F); -bool BitcodeFile::shouldSkip(uint32_t Flags) { - return !(Flags & BasicSymbolRef::SF_Global) || - (Flags & BasicSymbolRef::SF_FormatSpecific); + if (Flags & BasicSymbolRef::SF_Common) + return Symtab::X->addCommon(NameRef, ObjSym.getCommonSize(), + ObjSym.getCommonAlignment(), Binding, + Visibility, STT_OBJECT, F); + + return Symtab::X->addBitcode(NameRef, Binding, Visibility, Type, + CanOmitFromDynSym, F); } template void BitcodeFile::parse(DenseSet &ComdatGroups) { - Obj = check(IRObjectFile::create(MB, Driver->Context)); - const Module &M = Obj->getModule(); - + Obj = check(lto::InputFile::create(MB)); DenseSet KeptComdats; - for (const auto &P : M.getComdatSymbolTable()) { + for (const auto &P : Obj->getComdatSymbolTable()) { StringRef N = Saver.save(P.first()); if (ComdatGroups.insert(N).second) KeptComdats.insert(&P.second); } - for (const BasicSymbolRef &Sym : Obj->symbols()) - if (!shouldSkip(Sym.getFlags())) - Symbols.push_back(createSymbol(KeptComdats, *Obj, Sym)); + for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) + Symbols.push_back( + createBitcodeSymbol(KeptComdats, ObjSym, Saver, this)); } template