[lld] r241416 - COFF: Use atomic pointers in preparation for parallelizing.

Rui Ueyama ruiu at google.com
Mon Jul 6 10:45:40 PDT 2015


That's what I was looking for. Thank you! Committed a follow-up patch
in r241477.

On Sun, Jul 5, 2015 at 8:24 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
> On Jul 5, 2015 2:56 PM, "Rui Ueyama" <ruiu at google.com> wrote:
> >
> > Author: ruiu
> > Date: Sun Jul  5 16:54:42 2015
> > New Revision: 241416
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=241416&view=rev
> > Log:
> > COFF: Use atomic pointers in preparation for parallelizing.
> >
> > In the new design, mutation of Symbol pointers is the name resolution
> > operation. This patch makes them atomic pointers so that they can
> > be mutated by multiple threads safely. I'm going to use atomic
> > compare-exchange on these pointers.
> >
> > dyn_cast<> doesn't recognize atomic pointers as pointers,
> > so we need to call load(). This is unfortunate, but in other places
> > automatic type conversion works fine.
>
> You might be able to use llvm::simplify_type to work around this problem?
>
> >
> > Modified:
> >     lld/trunk/COFF/Driver.cpp
> >     lld/trunk/COFF/SymbolTable.cpp
> >     lld/trunk/COFF/Symbols.h
> >     lld/trunk/COFF/Writer.cpp
> >
> > Modified: lld/trunk/COFF/Driver.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=241416&r1=241415&r2=241416&view=diff
> >
> ==============================================================================
> > --- lld/trunk/COFF/Driver.cpp (original)
> > +++ lld/trunk/COFF/Driver.cpp Sun Jul  5 16:54:42 2015
> > @@ -220,7 +220,7 @@ StringRef LinkerDriver::findDefaultEntry
> >    };
> >    for (auto E : Entries) {
> >      Symbol *Sym = Symtab.find(E[0]);
> > -    if (Sym && !isa<Undefined>(Sym->Body))
> > +    if (Sym && !isa<Undefined>(Sym->Body.load()))
> >        return E[1];
> >    }
> >    return "";
> > @@ -591,7 +591,7 @@ bool LinkerDriver::link(llvm::ArrayRef<c
> >        Symbol *Sym = Symtab.find(From);
> >        if (!Sym)
> >          continue;
> > -      if (auto *U = dyn_cast<Undefined>(Sym->Body))
> > +      if (auto *U = dyn_cast<Undefined>(Sym->Body.load()))
> >          if (!U->WeakAlias)
> >            U->WeakAlias = Symtab.addUndefined(To);
> >      }
> >
> > Modified: lld/trunk/COFF/SymbolTable.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=241416&r1=241415&r2=241416&view=diff
> >
> ==============================================================================
> > --- lld/trunk/COFF/SymbolTable.cpp (original)
> > +++ lld/trunk/COFF/SymbolTable.cpp Sun Jul  5 16:54:42 2015
> > @@ -77,7 +77,7 @@ std::error_code SymbolTable::readArchive
> >    // Add archive member files to ObjectQueue that should resolve
> >    // existing undefined symbols.
> >    for (Symbol *Sym : LazySyms)
> > -    if (auto EC = addMemberFile(cast<Lazy>(Sym->Body)))
> > +    if (auto EC = addMemberFile(cast<Lazy>(Sym->Body.load())))
> >        return EC;
> >    return std::error_code();
> >  }
> > @@ -126,7 +126,7 @@ bool SymbolTable::reportRemainingUndefin
> >    bool Ret = false;
> >    for (auto &I : Symtab) {
> >      Symbol *Sym = I.second;
> > -    auto *Undef = dyn_cast<Undefined>(Sym->Body);
> > +    auto *Undef = dyn_cast<Undefined>(Sym->Body.load());
> >      if (!Undef)
> >        continue;
> >      StringRef Name = Undef->getName();
> > @@ -140,10 +140,10 @@ bool SymbolTable::reportRemainingUndefin
> >      // This odd rule is for compatibility with MSVC linker.
> >      if (Name.startswith("__imp_")) {
> >        Symbol *Imp = find(Name.substr(strlen("__imp_")));
> > -      if (Imp && isa<Defined>(Imp->Body)) {
> > +      if (Imp && isa<Defined>(Imp->Body.load())) {
> >          if (!Resolve)
> >            continue;
> > -        auto *D = cast<Defined>(Imp->Body);
> > +        auto *D = cast<Defined>(Imp->Body.load());
> >          auto *S = new (Alloc) DefinedLocalImport(Name, D);
> >          LocalImportChunks.push_back(S->getChunk());
> >          Sym->Body = S;
> > @@ -320,11 +320,11 @@ std::error_code SymbolTable::addCombined
> >      StringRef Name = Body->getName();
> >      Symbol *Sym = insert(Body);
> >
> > -    if (isa<DefinedBitcode>(Sym->Body)) {
> > +    if (isa<DefinedBitcode>(Sym->Body.load())) {
> >        Sym->Body = Body;
> >        continue;
> >      }
> > -    if (auto *L = dyn_cast<Lazy>(Sym->Body)) {
> > +    if (auto *L = dyn_cast<Lazy>(Sym->Body.load())) {
> >        // We may see new references to runtime library symbols such as
> __chkstk
> >        // here. These symbols must be wholly defined in non-bitcode
> files.
> >        if (auto EC = addMemberFile(L))
> >
> > Modified: lld/trunk/COFF/Symbols.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.h?rev=241416&r1=241415&r2=241416&view=diff
> >
> ==============================================================================
> > --- lld/trunk/COFF/Symbols.h (original)
> > +++ lld/trunk/COFF/Symbols.h Sun Jul  5 16:54:42 2015
> > @@ -16,6 +16,7 @@
> >  #include "llvm/ADT/ArrayRef.h"
> >  #include "llvm/Object/Archive.h"
> >  #include "llvm/Object/COFF.h"
> > +#include <atomic>
> >  #include <memory>
> >  #include <vector>
> >
> > @@ -38,7 +39,7 @@ class SymbolBody;
> >  // The resolver updates SymbolBody pointers as it resolves symbols.
> >  struct Symbol {
> >    explicit Symbol(SymbolBody *P) : Body(P) {}
> > -  SymbolBody *Body;
> > +  std::atomic<SymbolBody *> Body;
> >  };
> >
> >  // The base class for real symbol classes.
> > @@ -80,7 +81,7 @@ public:
> >    // has chosen the object among other objects having the same name,
> >    // you can access P->Backref->Body to get the resolver's result.
> >    void setBackref(Symbol *P) { Backref = P; }
> > -  SymbolBody *repl() { return Backref ? Backref->Body : this; }
> > +  SymbolBody *repl() { return Backref ? Backref->Body.load() : this; }
> >
> >    // Decides which symbol should "win" in the symbol table, this or
> >    // the Other. Returns 1 if this wins, -1 if the Other wins, or 0 if
> >
> > Modified: lld/trunk/COFF/Writer.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=241416&r1=241415&r2=241416&view=diff
> >
> ==============================================================================
> > --- lld/trunk/COFF/Writer.cpp (original)
> > +++ lld/trunk/COFF/Writer.cpp Sun Jul  5 16:54:42 2015
> > @@ -243,7 +243,8 @@ void Writer::createImportTables() {
> >        Sec->addChunk(C);
> >    }
> >    if (!DelayIdata.empty()) {
> > -    Defined *Helper =
> cast<Defined>(Symtab->find("__delayLoadHelper2")->Body);
> > +    Symbol *Sym = Symtab->find("__delayLoadHelper2");
> > +    Defined *Helper = cast<Defined>(Sym->Body.load());
> >      DelayIdata.create(Helper);
> >      OutputSection *Sec = createSection(".didat");
> >      for (Chunk *C : DelayIdata.getChunks())
> > @@ -535,7 +536,7 @@ OutputSection *Writer::createSection(Str
> >  // Dest is .reloc section. Add contents to that section.
> >  void Writer::addBaserels(OutputSection *Dest) {
> >    std::vector<uint32_t> V;
> > -  Defined *ImageBase = cast<Defined>(Symtab->find("__ImageBase")->Body);
> > +  Defined *ImageBase =
> cast<Defined>(Symtab->find("__ImageBase")->Body.load());
> >    for (OutputSection *Sec : OutputSections) {
> >      if (Sec == Dest)
> >        continue;
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150706/d93614a3/attachment.html>


More information about the llvm-commits mailing list