<div dir="ltr">As George pointed out, it was measured with a debug build, so the numbers were bogus. I'll test it again and roll it back if needed tomorrow.</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 18, 2016 at 5:04 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I cannot reproduce these numbers.<br>
<br>
I could not test scylla and firefox because of pr28605, but the times<br>
I got with the rest are attached. The ratios are from the previous<br>
value.<br>
<br>
Can you upload the --reproduce of the testcase you used somewhere?<br>
<br>
Thanks,<br>
Rafael<br>
<br>
On 17 July 2016 at 13:23, Rui Ueyama via llvm-commits<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: ruiu<br>
> Date: Sun Jul 17 12:23:17 2016<br>
> New Revision: 275711<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=275711&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=275711&view=rev</a><br>
> Log:<br>
> Handle versioned symbols efficiently.<br>
><br>
> Versions can be assigned to symbols in two different ways.<br>
> One is the usual version scripts, and the other is special<br>
> symbol suffix '@'. If a symbol contains '@', the string after<br>
> that is considered to specify a version name.<br>
><br>
> Previously, we look for '@' for all symbols.<br>
><br>
> Anything that works on every symbol can be expensive because<br>
> the linker has to handle a lot of symbols. The search for '@'<br>
> was not an exception.<br>
><br>
> In this patch, I made two optimizations.<br>
><br>
> The first optimization is to handle '@' only when at least one<br>
> version is defined. If no versions are defined, no versions can<br>
> be assigned to any symbols, so it's waste of time to search for '@'.<br>
><br>
> The second optimization is to scan only suffixes of symbol names<br>
> instead of entire symbol names. Symbol names can be very long, but<br>
> symbol versions are usually short, so scanning entire symbol names<br>
> is waste of time, too.<br>
><br>
> There are some error cases which we no longer be able to detect<br>
> with this patch. I don't think it's a major drawback because they<br>
> are minor errors. Speed is more important.<br>
><br>
> This change improves LLD with debug info self-link time from<br>
> 6.6993 seconds to 6.3426 seconds (or -5.3%).<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D22433" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22433</a><br>
><br>
> Removed:<br>
>     lld/trunk/test/ELF/verdef-executable.s<br>
> Modified:<br>
>     lld/trunk/ELF/Config.h<br>
>     lld/trunk/ELF/Driver.cpp<br>
>     lld/trunk/ELF/SymbolTable.cpp<br>
>     lld/trunk/ELF/SymbolTable.h<br>
>     lld/trunk/ELF/Symbols.cpp<br>
>     lld/trunk/ELF/Symbols.h<br>
>     lld/trunk/test/ELF/verdef-defaultver.s<br>
><br>
> Modified: lld/trunk/ELF/Config.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Config.h (original)<br>
> +++ lld/trunk/ELF/Config.h Sun Jul 17 12:23:17 2016<br>
> @@ -90,7 +90,6 @@ struct Configuration {<br>
>    bool FatalWarnings;<br>
>    bool GcSections;<br>
>    bool GnuHash = false;<br>
> -  bool HasVersionScript = false;<br>
>    bool ICF;<br>
>    bool Mips64EL = false;<br>
>    bool NoGnuUnique;<br>
><br>
> Modified: lld/trunk/ELF/Driver.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Driver.cpp (original)<br>
> +++ lld/trunk/ELF/Driver.cpp Sun Jul 17 12:23:17 2016<br>
> @@ -443,11 +443,9 @@ void LinkerDriver::readConfigs(opt::Inpu<br>
>    for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol))<br>
>      Config->DynamicList.push_back(Arg->getValue());<br>
><br>
> -  if (auto *Arg = Args.getLastArg(OPT_version_script)) {<br>
> -    Config->HasVersionScript = true;<br>
> +  if (auto *Arg = Args.getLastArg(OPT_version_script))<br>
>      if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))<br>
>        parseVersionScript(*Buffer);<br>
> -  }<br>
><br>
>    for (auto *Arg : Args.filtered(OPT_trace_symbol))<br>
>      Config->TraceSymbol.insert(Arg->getValue());<br>
> @@ -557,6 +555,7 @@ template <class ELFT> void LinkerDriver:<br>
>    Symtab.scanShlibUndefined();<br>
>    Symtab.scanDynamicList();<br>
>    Symtab.scanVersionScript();<br>
> +  Symtab.scanSymbolVersions();<br>
>    Symtab.traceDefined();<br>
><br>
>    Symtab.addCombinedLtoObject();<br>
><br>
> Modified: lld/trunk/ELF/SymbolTable.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/SymbolTable.cpp (original)<br>
> +++ lld/trunk/ELF/SymbolTable.cpp Sun Jul 17 12:23:17 2016<br>
> @@ -165,39 +165,6 @@ static uint8_t getMinVisibility(uint8_t<br>
>    return std::min(VA, VB);<br>
>  }<br>
><br>
> -// A symbol version may be included in a symbol name as a suffix after '@'.<br>
> -// This function parses that part and returns a version ID number.<br>
> -static uint16_t getVersionId(Symbol *Sym, StringRef Name) {<br>
> -  size_t VersionBegin = Name.find('@');<br>
> -  if (VersionBegin == StringRef::npos)<br>
> -    return Config->DefaultSymbolVersion;<br>
> -<br>
> -  // If symbol name contains '@' or '@@' we can assign its version id right<br>
> -  // here. '@@' means the default version. It is usually the most recent one.<br>
> -  // VERSYM_HIDDEN flag should be set for all non-default versions.<br>
> -  StringRef Version = Name.drop_front(VersionBegin + 1);<br>
> -  bool Default = Version.startswith("@");<br>
> -  if (Default)<br>
> -    Version = Version.drop_front();<br>
> -<br>
> -  for (VersionDefinition &V : Config->VersionDefinitions)<br>
> -    if (V.Name == Version)<br>
> -      return Default ? V.Id : (V.Id | VERSYM_HIDDEN);<br>
> -<br>
> -<br>
> -  // If we are not building shared and version script<br>
> -  // is not specified, then it is not a error, it is<br>
> -  // in common not to use script for linking executables.<br>
> -  // In this case we just create new version.<br>
> -  if (!Config->Shared && !Config->HasVersionScript) {<br>
> -    size_t Id = defineSymbolVersion(Version);<br>
> -    return Default ? Id : (Id | VERSYM_HIDDEN);<br>
> -  }<br>
> -<br>
> -  error("symbol " + Name + " has undefined version " + Version);<br>
> -  return 0;<br>
> -}<br>
> -<br>
>  // Find an existing symbol or create and insert a new one.<br>
>  template <class ELFT><br>
>  std::pair<Symbol *, bool> SymbolTable<ELFT>::insert(StringRef Name) {<br>
> @@ -210,9 +177,7 @@ std::pair<Symbol *, bool> SymbolTable<EL<br>
>      Sym->Visibility = STV_DEFAULT;<br>
>      Sym->IsUsedInRegularObj = false;<br>
>      Sym->ExportDynamic = false;<br>
> -    Sym->VersionId = getVersionId(Sym, Name);<br>
> -    Sym->VersionedName =<br>
> -        Sym->VersionId != VER_NDX_LOCAL && Sym->VersionId != VER_NDX_GLOBAL;<br>
> +    Sym->VersionId = Config->DefaultSymbolVersion;<br>
>      SymVector.push_back(Sym);<br>
>    } else {<br>
>      Sym = SymVector[P.first->second];<br>
> @@ -646,6 +611,84 @@ template <class ELFT> void SymbolTable<E<br>
>    }<br>
>  }<br>
><br>
> +// Returns the size of the longest version name.<br>
> +static int getMaxVersionLen() {<br>
> +  size_t Len = 0;<br>
> +  for (VersionDefinition &V : Config->VersionDefinitions)<br>
> +    Len = std::max(Len, V.Name.size());<br>
> +  return Len;<br>
> +}<br>
> +<br>
> +// Parses a symbol name in the form of <name>@<version> or <name>@@<version>.<br>
> +static std::pair<StringRef, uint16_t><br>
> +getSymbolVersion(SymbolBody *B, int MaxVersionLen) {<br>
> +  StringRef S = B->getName();<br>
> +<br>
> +  // MaxVersionLen was passed so that we don't need to scan<br>
> +  // all characters in a symbol name. It is effective because<br>
> +  // versions are usually short and symbol names can be very long.<br>
> +  size_t Pos = S.find('@', std::max(0, int(S.size()) - MaxVersionLen - 2));<br>
> +  if (Pos == 0 || Pos == StringRef::npos)<br>
> +    return {"", 0};<br>
> +<br>
> +  StringRef Name = S.substr(0, Pos);<br>
> +  StringRef Verstr = S.substr(Pos + 1);<br>
> +  if (Verstr.empty())<br>
> +    return {"", 0};<br>
> +<br>
> +  // '@@' in a symbol name means the default version.<br>
> +  // It is usually the most recent one.<br>
> +  bool IsDefault = (Verstr[0] == '@');<br>
> +  if (IsDefault)<br>
> +    Verstr = Verstr.substr(1);<br>
> +<br>
> +  for (VersionDefinition &V : Config->VersionDefinitions) {<br>
> +    if (V.Name == Verstr)<br>
> +      return {Name, IsDefault ? V.Id : (V.Id | VERSYM_HIDDEN)};<br>
> +  }<br>
> +<br>
> +  // It is an error if the specified version was not defined.<br>
> +  error("symbol " + S + " has undefined version " + Verstr);<br>
> +  return {"", 0};<br>
> +}<br>
> +<br>
> +// Versions are usually assigned to symbols using version scripts,<br>
> +// but there's another way to assign versions to symbols.<br>
> +// If a symbol name contains '@', the string after it is not<br>
> +// actually a part of the symbol name but specifies a version.<br>
> +// This function takes care of it.<br>
> +template <class ELFT> void SymbolTable<ELFT>::scanSymbolVersions() {<br>
> +  if (Config->VersionDefinitions.empty())<br>
> +    return;<br>
> +<br>
> +  int MaxVersionLen = getMaxVersionLen();<br>
> +<br>
> +  // Unfortunately there's no way other than iterating over all<br>
> +  // symbols to look for '@' characters in symbol names.<br>
> +  // So this is inherently slow. A good news is that we do this<br>
> +  // only when versions have been defined.<br>
> +  for (Symbol *Sym : SymVector) {<br>
> +    // Symbol versions for exported symbols are by nature<br>
> +    // only for defined global symbols.<br>
> +    SymbolBody *B = Sym->body();<br>
> +    if (!B->isDefined())<br>
> +      continue;<br>
> +    uint8_t Visibility = B->getVisibility();<br>
> +    if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED)<br>
> +      continue;<br>
> +<br>
> +    // Look for '@' in the symbol name.<br>
> +    StringRef Name;<br>
> +    uint16_t Version;<br>
> +    std::tie(Name, Version) = getSymbolVersion(B, MaxVersionLen);<br>
> +    if (Name.empty())<br>
> +      continue;<br>
> +<br>
> +    B->setName(Name);<br>
> +    Sym->VersionId = Version;<br>
> +  }<br>
> +}<br>
> +<br>
>  // Print the module names which define the notified<br>
>  // symbols provided through -y or --trace-symbol option.<br>
>  template <class ELFT> void SymbolTable<ELFT>::traceDefined() {<br>
><br>
> Modified: lld/trunk/ELF/SymbolTable.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/SymbolTable.h (original)<br>
> +++ lld/trunk/ELF/SymbolTable.h Sun Jul 17 12:23:17 2016<br>
> @@ -82,6 +82,7 @@ public:<br>
>    void scanShlibUndefined();<br>
>    void scanDynamicList();<br>
>    void scanVersionScript();<br>
> +  void scanSymbolVersions();<br>
>    void traceDefined();<br>
><br>
>    SymbolBody *find(StringRef Name);<br>
><br>
> Modified: lld/trunk/ELF/Symbols.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Symbols.cpp (original)<br>
> +++ lld/trunk/ELF/Symbols.cpp Sun Jul 17 12:23:17 2016<br>
> @@ -98,10 +98,12 @@ SymbolBody::SymbolBody(Kind K, StringRef<br>
><br>
>  StringRef SymbolBody::getName() const {<br>
>    assert(!isLocal());<br>
> -  StringRef S = StringRef(Name.S, Name.Len);<br>
> -  if (!symbol()->VersionedName)<br>
> -    return S;<br>
> -  return S.substr(0, S.find('@'));<br>
> +  return StringRef(Name.S, Name.Len);<br>
> +}<br>
> +<br>
> +void SymbolBody::setName(StringRef S) {<br>
> +  Name.S = S.data();<br>
> +  Name.Len = S.size();<br>
>  }<br>
><br>
>  // Returns true if a symbol can be replaced at load-time by a symbol<br>
><br>
> Modified: lld/trunk/ELF/Symbols.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Symbols.h (original)<br>
> +++ lld/trunk/ELF/Symbols.h Sun Jul 17 12:23:17 2016<br>
> @@ -70,8 +70,9 @@ public:<br>
>    bool isLocal() const { return IsLocal; }<br>
>    bool isPreemptible() const;<br>
><br>
> -  // Returns the symbol name.<br>
>    StringRef getName() const;<br>
> +  void setName(StringRef S);<br>
> +<br>
>    uint32_t getNameOffset() const {<br>
>      assert(isLocal());<br>
>      return NameOffset;<br>
> @@ -419,11 +420,6 @@ struct Symbol {<br>
>    // --export-dynamic, and by dynamic lists.<br>
>    unsigned ExportDynamic : 1;<br>
><br>
> -  // If this flag is true then symbol name also contains version name. Such<br>
> -  // name can have single or double symbol @. Double means that version is<br>
> -  // used as default. Single signals about depricated symbol version.<br>
> -  unsigned VersionedName : 1;<br>
> -<br>
>    bool includeInDynsym() const;<br>
>    bool isWeak() const { return Binding == llvm::ELF::STB_WEAK; }<br>
><br>
><br>
> Modified: lld/trunk/test/ELF/verdef-defaultver.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/verdef-defaultver.s?rev=275711&r1=275710&r2=275711&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/verdef-defaultver.s?rev=275711&r1=275710&r2=275711&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/test/ELF/verdef-defaultver.s (original)<br>
> +++ lld/trunk/test/ELF/verdef-defaultver.s Sun Jul 17 12:23:17 2016<br>
> @@ -198,10 +198,6 @@<br>
>  # EXE-NEXT:    }<br>
>  # EXE-NEXT:  }<br>
><br>
> -# RUN: not ld.lld -shared %t1 -o %terr.so 2>&1 | \<br>
> -# RUN:   FileCheck -check-prefix=ERR1 %s<br>
> -# ERR1: symbol b@@LIBSAMPLE_2.0 has undefined version LIBSAMPLE_2.0<br>
> -<br>
>  .globl _start<br>
>  _start:<br>
>    callq a<br>
><br>
> Removed: lld/trunk/test/ELF/verdef-executable.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/verdef-executable.s?rev=275710&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/verdef-executable.s?rev=275710&view=auto</a><br>
> ==============================================================================<br>
> --- lld/trunk/test/ELF/verdef-executable.s (original)<br>
> +++ lld/trunk/test/ELF/verdef-executable.s (removed)<br>
> @@ -1,269 +0,0 @@<br>
> -# REQUIRES: x86<br>
> -<br>
> -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1<br>
> -# RUN: ld.lld %t1 -o %t<br>
> -# RUN: llvm-readobj -t -V -dyn-symbols %t | FileCheck --check-prefix=EXE %s<br>
> -<br>
> -# EXE:      Symbols [<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name:<br>
> -# EXE-NEXT:      Value: 0x0<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Local<br>
> -# EXE-NEXT:      Type: None (0x0)<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: Undefined (0x0)<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: _start<br>
> -# EXE-NEXT:      Value: 0x11004<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: None<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: a<br>
> -# EXE-NEXT:      Value: 0x11000<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: b<br>
> -# EXE-NEXT:      Value: 0x11002<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: b<br>
> -# EXE-NEXT:      Value: 0x11001<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: b_1<br>
> -# EXE-NEXT:      Value: 0x11001<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: b_2<br>
> -# EXE-NEXT:      Value: 0x11002<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:    Symbol {<br>
> -# EXE-NEXT:      Name: c<br>
> -# EXE-NEXT:      Value: 0x11003<br>
> -# EXE-NEXT:      Size: 0<br>
> -# EXE-NEXT:      Binding: Global<br>
> -# EXE-NEXT:      Type: Function<br>
> -# EXE-NEXT:      Other: 0<br>
> -# EXE-NEXT:      Section: .text<br>
> -# EXE-NEXT:    }<br>
> -# EXE-NEXT:  ]<br>
> -# EXE-NEXT: DynamicSymbols [<br>
> -# EXE-NEXT: ]<br>
> -# EXE-NEXT: Version symbols {<br>
> -# EXE-NEXT: }<br>
> -# EXE-NEXT: SHT_GNU_verdef {<br>
> -# EXE-NEXT: }<br>
> -# EXE-NEXT: SHT_GNU_verneed {<br>
> -# EXE-NEXT: }<br>
> -<br>
> -# RUN: ld.lld -pie --export-dynamic %t1 -o %t2<br>
> -# RUN: llvm-readobj -t -V -dyn-symbols %t2 | \<br>
> -# RUN:   FileCheck --check-prefix=EXEDYN %s<br>
> -<br>
> -# EXEDYN:      DynamicSymbols [<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: @<br>
> -# EXEDYN-NEXT:      Value: 0x0<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Local<br>
> -# EXEDYN-NEXT:      Type: None<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: Undefined<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: _start@<br>
> -# EXEDYN-NEXT:      Value: 0x1004<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: None<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: a@<br>
> -# EXEDYN-NEXT:      Value: 0x1000<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: b@@LIBSAMPLE_2.0<br>
> -# EXEDYN-NEXT:      Value: 0x1002<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: b@LIBSAMPLE_1.0<br>
> -# EXEDYN-NEXT:      Value: 0x1001<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: b_1@<br>
> -# EXEDYN-NEXT:      Value: 0x1001<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: b_2@<br>
> -# EXEDYN-NEXT:      Value: 0x1002<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Symbol {<br>
> -# EXEDYN-NEXT:      Name: c@<br>
> -# EXEDYN-NEXT:      Value: 0x1003<br>
> -# EXEDYN-NEXT:      Size: 0<br>
> -# EXEDYN-NEXT:      Binding: Global<br>
> -# EXEDYN-NEXT:      Type: Function<br>
> -# EXEDYN-NEXT:      Other: 0<br>
> -# EXEDYN-NEXT:      Section: .text<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:  ]<br>
> -# EXEDYN-NEXT:  Version symbols {<br>
> -# EXEDYN-NEXT:    Section Name: .gnu.version<br>
> -# EXEDYN-NEXT:    Address: 0x288<br>
> -# EXEDYN-NEXT:    Offset: 0x288<br>
> -# EXEDYN-NEXT:    Link: 1<br>
> -# EXEDYN-NEXT:    Symbols [<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 0<br>
> -# EXEDYN-NEXT:        Name: @<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 1<br>
> -# EXEDYN-NEXT:        Name: _start@<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 1<br>
> -# EXEDYN-NEXT:        Name: a@<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 2<br>
> -# EXEDYN-NEXT:        Name: b@@LIBSAMPLE_2.0<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 3<br>
> -# EXEDYN-NEXT:        Name: b@LIBSAMPLE_1.0<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 1<br>
> -# EXEDYN-NEXT:        Name: b_1@<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 1<br>
> -# EXEDYN-NEXT:        Name: b_2@<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:      Symbol {<br>
> -# EXEDYN-NEXT:        Version: 1<br>
> -# EXEDYN-NEXT:        Name: c@<br>
> -# EXEDYN-NEXT:      }<br>
> -# EXEDYN-NEXT:    ]<br>
> -# EXEDYN-NEXT:  }<br>
> -# EXEDYN-NEXT:  SHT_GNU_verdef {<br>
> -# EXEDYN-NEXT:    Definition {<br>
> -# EXEDYN-NEXT:      Version: 1<br>
> -# EXEDYN-NEXT:      Flags: Base<br>
> -# EXEDYN-NEXT:      Index: 1<br>
> -# EXEDYN-NEXT:      Hash:<br>
> -# EXEDYN-NEXT:      Name:<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Definition {<br>
> -# EXEDYN-NEXT:      Version: 1<br>
> -# EXEDYN-NEXT:      Flags: 0x0<br>
> -# EXEDYN-NEXT:      Index: 2<br>
> -# EXEDYN-NEXT:      Hash: 98456416<br>
> -# EXEDYN-NEXT:      Name: LIBSAMPLE_2.0<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:    Definition {<br>
> -# EXEDYN-NEXT:      Version: 1<br>
> -# EXEDYN-NEXT:      Flags: 0x0<br>
> -# EXEDYN-NEXT:      Index: 3<br>
> -# EXEDYN-NEXT:      Hash: 98457184<br>
> -# EXEDYN-NEXT:      Name: LIBSAMPLE_1.0<br>
> -# EXEDYN-NEXT:    }<br>
> -# EXEDYN-NEXT:  }<br>
> -# EXEDYN-NEXT:  SHT_GNU_verneed {<br>
> -# EXEDYN-NEXT:  }<br>
> -<br>
> -## Check when linking executable that error produced if version script<br>
> -## was specified and there are symbols with version in name that<br>
> -## is absent in script.<br>
> -# RUN: echo    "VERSION { \<br>
> -# RUN:          global: foo;   \<br>
> -# RUN:          local: *; }; " > %t.script<br>
> -# RUN: not ld.lld --version-script %t.script %t1 -o %t3 2>&1 | \<br>
> -# RUN:   FileCheck -check-prefix=ERR %s<br>
> -# ERR: symbol b@LIBSAMPLE_1.0 has undefined version LIBSAMPLE_1.0<br>
> -<br>
> -b@LIBSAMPLE_1.0 = b_1<br>
> -b@@LIBSAMPLE_2.0 = b_2<br>
> -<br>
> -.globl a<br>
> -.type  a,@function<br>
> -a:<br>
> -retq<br>
> -<br>
> -.globl b_1<br>
> -.type  b_1,@function<br>
> -b_1:<br>
> -retq<br>
> -<br>
> -.globl b_2<br>
> -.type  b_2,@function<br>
> -b_2:<br>
> -retq<br>
> -<br>
> -.globl c<br>
> -.type  c,@function<br>
> -c:<br>
> -retq<br>
> -<br>
> -.globl _start<br>
> -_start:<br>
> - nop<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>