[lld] r281411 - revert: [ELF] - Versionscript: support mangled symbols with the same name.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 15 05:52:25 PDT 2016


Are you able to reproduce the failure with asan or valgrind?

Cheers,
Rafael


On 13 September 2016 at 18:26, George Rimar via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Tue Sep 13 17:26:12 2016
> New Revision: 281411
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281411&view=rev
> Log:
> revert: [ELF] - Versionscript: support mangled symbols with the same name.
>
> Something broked BBots:
> 281318 failed on step 9:
> http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/413
>
> r281317 built step 9 green:
> http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/415
>
> Initial revision commits were:
> This is PR30312. Info from bug page:
>
> Both of these symbols demangle to abc::abc():
> _ZN3abcC1Ev
> _ZN3abcC2Ev
> (These would be abc's complete object constructor and base object constructor, respectively.)
> however with "abc::abc()" in the version script only one of the two receives the symbol version.
>
> Patch fixes that.
> It uses testcase created by Ed Maste (D24306).
>
> Differential revision: https://reviews.llvm.org/D24336
>
> Modified:
>     lld/trunk/ELF/SymbolTable.cpp
>     lld/trunk/ELF/SymbolTable.h
>     lld/trunk/test/ELF/version-script-extern.s
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=281411&r1=281410&r2=281411&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Tue Sep 13 17:26:12 2016
> @@ -603,12 +603,11 @@ static void setVersionId(SymbolBody *Bod
>  // The relationship is 1:N instead of 1:1 because with the symbol
>  // versioning, more than one symbol may have the same name.
>  template <class ELFT>
> -std::map<std::string, std::vector<SymbolBody *>>
> -SymbolTable<ELFT>::getDemangledSyms() {
> -  std::map<std::string, std::vector<SymbolBody *>> Result;
> +std::map<std::string, SymbolBody *> SymbolTable<ELFT>::getDemangledSyms() {
> +  std::map<std::string, SymbolBody *> Result;
>    for (Symbol *Sym : SymVector) {
>      SymbolBody *B = Sym->body();
> -    Result[demangle(B->getName())].push_back(B);
> +    Result[demangle(B->getName())] = B;
>    }
>    return Result;
>  }
> @@ -621,24 +620,22 @@ static bool hasExternCpp() {
>    return false;
>  }
>
> -static ArrayRef<SymbolBody *>
> -findDemangled(std::map<std::string, std::vector<SymbolBody *>> &D,
> -              StringRef Name) {
> +static SymbolBody *findDemangled(const std::map<std::string, SymbolBody *> &D,
> +                                 StringRef Name) {
>    auto I = D.find(Name);
>    if (I != D.end())
>      return I->second;
> -  return {};
> +  return nullptr;
>  }
>
>  static std::vector<SymbolBody *>
> -findAllDemangled(const std::map<std::string, std::vector<SymbolBody *>> &D,
> +findAllDemangled(const std::map<std::string, SymbolBody *> &D,
>                   const Regex &Re) {
>    std::vector<SymbolBody *> Res;
>    for (auto &P : D) {
> -    if (const_cast<Regex &>(Re).match(P.first))
> -      for (SymbolBody *Body : P.second)
> -        if (!Body->isUndefined())
> -          Res.push_back(Body);
> +    SymbolBody *Body = P.second;
> +    if (!Body->isUndefined() && const_cast<Regex &>(Re).match(P.first))
> +      Res.push_back(Body);
>    }
>    return Res;
>  }
> @@ -687,7 +684,7 @@ template <class ELFT> void SymbolTable<E
>    // "llvm::*::foo(int, ?)". Obviously, there's no way to handle this
>    // other than trying to match a regexp against all demangled symbols.
>    // So, if "extern C++" feature is used, we demangle all known symbols.
> -  std::map<std::string, std::vector<SymbolBody *>> Demangled;
> +  std::map<std::string, SymbolBody *> Demangled;
>    if (hasExternCpp())
>      Demangled = getDemangledSyms();
>
> @@ -697,13 +694,9 @@ template <class ELFT> void SymbolTable<E
>      for (SymbolVersion Sym : V.Globals) {
>        if (Sym.HasWildcards)
>          continue;
> -
>        StringRef N = Sym.Name;
> -      ArrayRef<SymbolBody *> Arr = Sym.IsExternCpp
> -                                       ? findDemangled(Demangled, N)
> -                                       : ArrayRef<SymbolBody *>(find(N));
> -      for (SymbolBody *B : Arr)
> -        setVersionId(B, V.Name, N, V.Id);
> +      SymbolBody *B = Sym.IsExternCpp ? findDemangled(Demangled, N) : find(N);
> +      setVersionId(B, V.Name, N, V.Id);
>      }
>    }
>
>
> Modified: lld/trunk/ELF/SymbolTable.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=281411&r1=281410&r2=281411&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.h (original)
> +++ lld/trunk/ELF/SymbolTable.h Tue Sep 13 17:26:12 2016
> @@ -101,7 +101,7 @@ private:
>    std::string conflictMsg(SymbolBody *Existing, InputFile *NewFile);
>    void reportDuplicate(SymbolBody *Existing, InputFile *NewFile);
>
> -  std::map<std::string, std::vector<SymbolBody *>> getDemangledSyms();
> +  std::map<std::string, SymbolBody *> getDemangledSyms();
>    void handleAnonymousVersion();
>
>    struct SymIndex {
>
> Modified: lld/trunk/test/ELF/version-script-extern.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script-extern.s?rev=281411&r1=281410&r2=281411&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/version-script-extern.s (original)
> +++ lld/trunk/test/ELF/version-script-extern.s Tue Sep 13 17:26:12 2016
> @@ -64,20 +64,11 @@
>  # DSO-NEXT:      Other: 0
>  # DSO-NEXT:      Section: .text (0x6)
>  # DSO-NEXT:    }
> -# DSO-NEXT:    Symbol {
> -# DSO-NEXT:      Name: _ZN3abcC2Ev@@LIBSAMPLE_1.0
> -# DSO-NEXT:      Value: 0x1004
> -# DSO-NEXT:      Size: 0
> -# DSO-NEXT:      Binding: Global (0x1)
> -# DSO-NEXT:      Type: Function (0x2)
> -# DSO-NEXT:      Other: 0
> -# DSO-NEXT:      Section: .text (0x6)
> -# DSO-NEXT:    }
>  # DSO-NEXT:  ]
>  # DSO-NEXT:  Version symbols {
>  # DSO-NEXT:    Section Name: .gnu.version
> -# DSO-NEXT:    Address: 0x258
> -# DSO-NEXT:    Offset: 0x258
> +# DSO-NEXT:    Address: 0x240
> +# DSO-NEXT:    Offset: 0x240
>  # DSO-NEXT:    Link: 1
>  # DSO-NEXT:    Symbols [
>  # DSO-NEXT:      Symbol {
> @@ -100,10 +91,6 @@
>  # DSO-NEXT:        Version: 2
>  # DSO-NEXT:        Name: _ZN3abcC1Ev@@LIBSAMPLE_1.0
>  # DSO-NEXT:      }
> -# DSO-NEXT:      Symbol {
> -# DSO-NEXT:        Version: 2
> -# DSO-NEXT:        Name: _ZN3abcC2Ev@@LIBSAMPLE_1.0
> -# DSO-NEXT:      }
>  # DSO-NEXT:    ]
>  # DSO-NEXT:  }
>
> @@ -127,8 +114,3 @@ retq
>  .type _ZN3abcC1Ev, at function
>  _ZN3abcC1Ev:
>  retq
> -
> -.globl _ZN3abcC2Ev
> -.type _ZN3abcC2Ev, at function
> -_ZN3abcC2Ev:
> -retq
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list