[lld] r263248 - Avoid calling getNamedValue.
Sean Silva via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 11 18:14:08 PST 2016
Thanks for cleaning this up!
-- Sean Silva
On Fri, Mar 11, 2016 at 8:11 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: rafael
> Date: Fri Mar 11 10:11:47 2016
> New Revision: 263248
>
> URL: http://llvm.org/viewvc/llvm-project?rev=263248&view=rev
> Log:
> Avoid calling getNamedValue.
>
> In lld we usually avoid hash lookups. In addition to that, IR names are
> not fully mangled, so it is best to avoid using them whenever possible.
>
> Modified:
> lld/trunk/ELF/InputFiles.cpp
> lld/trunk/ELF/InputFiles.h
> lld/trunk/ELF/SymbolTable.cpp
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=263248&r1=263247&r2=263248&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Fri Mar 11 10:11:47 2016
> @@ -436,6 +436,50 @@ static uint8_t getGvVisibility(const Glo
> llvm_unreachable("Unknown visibility");
> }
>
> +SymbolBody *
> +BitcodeFile::createSymbolBody(const DenseSet<const Comdat *> &KeptComdats,
> + const IRObjectFile &Obj,
> + const BasicSymbolRef &Sym) {
> + const GlobalValue *GV = Obj.getSymbolGV(Sym.getRawDataRefImpl());
> + assert(GV);
> + if (const Comdat *C = GV->getComdat())
> + if (!KeptComdats.count(C))
> + return nullptr;
> +
> + uint8_t Visibility = getGvVisibility(GV);
> +
> + SmallString<64> Name;
> + raw_svector_ostream OS(Name);
> + Sym.printName(OS);
> + StringRef NameRef = Saver.save(StringRef(Name));
> +
> + const Module &M = Obj.getModule();
> + SymbolBody *Body;
> + uint32_t Flags = Sym.getFlags();
> + bool IsWeak = Flags & BasicSymbolRef::SF_Weak;
> + if (Flags & BasicSymbolRef::SF_Undefined) {
> + Body = new (Alloc) Undefined(NameRef, IsWeak, Visibility, false);
> + } else if (Flags & BasicSymbolRef::SF_Common) {
> + const DataLayout &DL = M.getDataLayout();
> + uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
> + Body = new (Alloc)
> + DefinedCommon(NameRef, Size, GV->getAlignment(), IsWeak,
> Visibility);
> + } else {
> + Body = new (Alloc) DefinedBitcode(NameRef, IsWeak, Visibility);
> + }
> + Body->IsTls = GV->isThreadLocal();
> + return Body;
> +}
> +
> +bool BitcodeFile::shouldSkip(const BasicSymbolRef &Sym) {
> + uint32_t Flags = Sym.getFlags();
> + if (!(Flags & BasicSymbolRef::SF_Global))
> + return true;
> + if (Flags & BasicSymbolRef::SF_FormatSpecific)
> + return true;
> + return false;
> +}
> +
> void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) {
> LLVMContext Context;
> std::unique_ptr<IRObjectFile> Obj = check(IRObjectFile::create(MB,
> Context));
> @@ -448,43 +492,9 @@ void BitcodeFile::parse(DenseSet<StringR
> KeptComdats.insert(&P.second);
> }
>
> - for (const BasicSymbolRef &Sym : Obj->symbols()) {
> - const GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl());
> - assert(GV);
> - uint32_t Flags = Sym.getFlags();
> - if (const Comdat *C = GV->getComdat())
> - if (!KeptComdats.count(C))
> - continue;
> - if (!(Flags & BasicSymbolRef::SF_Global))
> - continue;
> - if (GV->hasAppendingLinkage()) {
> - ExtraKeeps.push_back(GV->getName().copy(Alloc));
> - continue;
> - }
> - if (Flags & BasicSymbolRef::SF_FormatSpecific)
> - continue;
> - uint8_t Visibility = getGvVisibility(GV);
> -
> - SmallString<64> Name;
> - raw_svector_ostream OS(Name);
> - Sym.printName(OS);
> - StringRef NameRef = Saver.save(StringRef(Name));
> -
> - SymbolBody *Body;
> - bool IsWeak = Flags & BasicSymbolRef::SF_Weak;
> - if (Flags & BasicSymbolRef::SF_Undefined) {
> - Body = new (Alloc) Undefined(NameRef, IsWeak, Visibility, false);
> - } else if (Flags & BasicSymbolRef::SF_Common) {
> - const DataLayout &DL = M.getDataLayout();
> - uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
> - Body = new (Alloc)
> - DefinedCommon(NameRef, Size, GV->getAlignment(), IsWeak,
> Visibility);
> - } else {
> - Body = new (Alloc) DefinedBitcode(NameRef, IsWeak, Visibility);
> - }
> - Body->IsTls = GV->isThreadLocal();
> - SymbolBodies.push_back(Body);
> - }
> + for (const BasicSymbolRef &Sym : Obj->symbols())
> + if (!shouldSkip(Sym))
> + SymbolBodies.push_back(createSymbolBody(KeptComdats, *Obj, Sym));
> }
>
> template <typename T>
>
> Modified: lld/trunk/ELF/InputFiles.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=263248&r1=263247&r2=263248&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.h (original)
> +++ lld/trunk/ELF/InputFiles.h Fri Mar 11 10:11:47 2016
> @@ -18,8 +18,10 @@
> #include "lld/Core/LLVM.h"
> #include "llvm/ADT/DenseSet.h"
> #include "llvm/ADT/STLExtras.h"
> +#include "llvm/IR/Comdat.h"
> #include "llvm/Object/Archive.h"
> #include "llvm/Object/ELF.h"
> +#include "llvm/Object/IRObjectFile.h"
> #include "llvm/Support/StringSaver.h"
>
> namespace lld {
> @@ -180,19 +182,16 @@ public:
> static bool classof(const InputFile *F);
> void parse(llvm::DenseSet<StringRef> &ComdatGroups);
> ArrayRef<SymbolBody *> getSymbols() { return SymbolBodies; }
> - ArrayRef<StringRef> getExtraKeeps() { return ExtraKeeps; }
> + static bool shouldSkip(const llvm::object::BasicSymbolRef &Sym);
>
> private:
> std::vector<SymbolBody *> SymbolBodies;
> - // Some symbols like llvm.global_ctors are internal to the IR and so
> - // don't show up in SymbolBodies, but must be kept when creating the
> - // combined LTO module. We track them here.
> - // We currently use a different Module for creating SymbolBody's vs when
> - // we are creating the combined LTO module, and so we can't store IR
> - // pointers directly and must rely on the IR names.
> - std::vector<StringRef> ExtraKeeps;
> llvm::BumpPtrAllocator Alloc;
> llvm::StringSaver Saver{Alloc};
> + SymbolBody *
> + createSymbolBody(const llvm::DenseSet<const llvm::Comdat *>
> &KeptComdats,
> + const llvm::object::IRObjectFile &Obj,
> + const llvm::object::BasicSymbolRef &Sym);
> };
>
> // .so file.
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=263248&r1=263247&r2=263248&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Fri Mar 11 10:11:47 2016
> @@ -84,7 +84,8 @@ void SymbolTable<ELFT>::addFile(std::uni
> BitcodeFiles.emplace_back(cast<BitcodeFile>(File.release()));
> F->parse(ComdatGroups);
> for (SymbolBody *B : F->getSymbols())
> - resolve(B);
> + if (B)
> + resolve(B);
> return;
> }
>
> @@ -139,28 +140,33 @@ std::unique_ptr<InputFile> SymbolTable<E
>
> static void addBitcodeFile(IRMover &Mover, BitcodeFile &F,
> LLVMContext &Context) {
> - std::unique_ptr<MemoryBuffer> Buffer =
> - MemoryBuffer::getMemBuffer(F.MB, false);
> - std::unique_ptr<Module> M =
> - check(getLazyBitcodeModule(std::move(Buffer), Context,
> - /*ShouldLazyLoadMetadata*/ false));
> +
> + std::unique_ptr<IRObjectFile> Obj =
> + check(IRObjectFile::create(F.MB, Context));
> std::vector<GlobalValue *> Keep;
> - for (SymbolBody *B : F.getSymbols()) {
> - if (&B->repl() != B)
> + unsigned BodyIndex = 0;
> + ArrayRef<SymbolBody *> Bodies = F.getSymbols();
> +
> + for (const BasicSymbolRef &Sym : Obj->symbols()) {
> + GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl());
> + assert(GV);
> + if (GV->hasAppendingLinkage()) {
> + Keep.push_back(GV);
> + continue;
> + }
> + if (BitcodeFile::shouldSkip(Sym))
> + continue;
> + SymbolBody *B = Bodies[BodyIndex++];
> + if (!B || &B->repl() != B)
> continue;
> auto *DB = dyn_cast<DefinedBitcode>(B);
> if (!DB)
> continue;
> - GlobalValue *GV = M->getNamedValue(B->getName());
> - assert(GV);
> Keep.push_back(GV);
> }
> - for (StringRef S : F.getExtraKeeps()) {
> - GlobalValue *GV = M->getNamedValue(S);
> - assert(GV);
> - Keep.push_back(GV);
> - }
> - Mover.move(std::move(M), Keep, [](GlobalValue &, IRMover::ValueAdder)
> {});
> +
> + Mover.move(Obj->takeModule(), Keep,
> + [](GlobalValue &, IRMover::ValueAdder) {});
> }
>
> // This is for use when debugging LTO.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160311/a4a248e9/attachment.html>
More information about the llvm-commits
mailing list