[lld] r312757 - Revert "Revert r311468: If --dynamic-list is given, only those symbols are preemptible"

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 8 11:26:16 PDT 2017


The tests started to run while I was trying to figure out why they were
not :-(

In any case, I found the bug in the previous patch and everything is
working now.

Cheers,
Rafael

Evgenii Stepanov <eugeni.stepanov at gmail.com> writes:

> You don't need to install the new lld.
> I get this:
>   Expected Passes    : 156
>   Expected Failures  : 16
>   Unsupported Tests  : 8
>   Unexpected Failures: 44
> so obviously you are not running all the tests for some reason. Do you
> have compiler-rt? Do you have COMPILER_RT_HAS_LLD in cmake?
>
>
> On Thu, Sep 7, 2017 at 6:09 PM, Rafael Avila de Espindola
> <rafael.espindola at gmail.com> wrote:
>> Just tried that and got
>>
>>   Expected Passes    : 100
>>   Expected Failures  : 8
>>   Unsupported Tests  : 4
>>
>> Do I have to install the new lld for it to be used?
>>
>> Cheers,
>> Rafael
>>
>> Rafael Avila de Espindola <rafael.espindola at gmail.com> writes:
>>
>>> Will do. What do I have to do to run the cfi tests? Just add compiler-rt
>>> to projects?
>>>
>>> Cheers,
>>> Rafael
>>>
>>> Evgenii Stepanov <eugeni.stepanov at gmail.com> writes:
>>>
>>>> CFI tests (simple check-cfi) are failing on my machine because of this change.
>>>> The binary is looking absolutely crazy: it defines a function
>>>> "atexit", which is not in the source code, and the new function, among
>>>> other things, jumps to a randomly-looking .tbss symbol.
>>>>
>>>> Please revert.
>>>>
>>>>
>>>> On Thu, Sep 7, 2017 at 4:19 PM, Rafael Espindola via llvm-commits
>>>> <llvm-commits at lists.llvm.org> wrote:
>>>>> Author: rafael
>>>>> Date: Thu Sep  7 16:19:09 2017
>>>>> New Revision: 312757
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=312757&view=rev
>>>>> Log:
>>>>> Revert "Revert r311468: If --dynamic-list is given, only those symbols are preemptible"
>>>>>
>>>>> If --dynamic-list is given, only those symbols are preemptible.
>>>>>
>>>>> This allows combining --dynamic-list and version scripts too. The
>>>>> version script controls which symbols are visible, and --dynamic-list
>>>>> controls which of those are preemptible.
>>>>>
>>>>> This fixes pr34053.
>>>>>
>>>>> Added:
>>>>>     lld/trunk/test/ELF/dynamic-list-preempt.s
>>>>> Modified:
>>>>>     lld/trunk/ELF/Config.h
>>>>>     lld/trunk/ELF/ScriptParser.cpp
>>>>>     lld/trunk/ELF/SymbolTable.cpp
>>>>>     lld/trunk/ELF/SymbolTable.h
>>>>>     lld/trunk/ELF/Writer.cpp
>>>>>
>>>>> Modified: lld/trunk/ELF/Config.h
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=312757&r1=312756&r2=312757&view=diff
>>>>> ==============================================================================
>>>>> --- lld/trunk/ELF/Config.h (original)
>>>>> +++ lld/trunk/ELF/Config.h Thu Sep  7 16:19:09 2017
>>>>> @@ -104,6 +104,7 @@ struct Configuration {
>>>>>    std::vector<llvm::StringRef> SearchPaths;
>>>>>    std::vector<llvm::StringRef> SymbolOrderingFile;
>>>>>    std::vector<llvm::StringRef> Undefined;
>>>>> +  std::vector<SymbolVersion> DynamicList;
>>>>>    std::vector<SymbolVersion> VersionScriptGlobals;
>>>>>    std::vector<SymbolVersion> VersionScriptLocals;
>>>>>    std::vector<uint8_t> BuildIdVector;
>>>>>
>>>>> Modified: lld/trunk/ELF/ScriptParser.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=312757&r1=312756&r2=312757&view=diff
>>>>> ==============================================================================
>>>>> --- lld/trunk/ELF/ScriptParser.cpp (original)
>>>>> +++ lld/trunk/ELF/ScriptParser.cpp Thu Sep  7 16:19:09 2017
>>>>> @@ -180,9 +180,22 @@ static ExprValue bitOr(ExprValue A, Expr
>>>>>
>>>>>  void ScriptParser::readDynamicList() {
>>>>>    expect("{");
>>>>> -  readAnonymousDeclaration();
>>>>> -  if (!atEOF())
>>>>> +  std::vector<SymbolVersion> Locals;
>>>>> +  std::vector<SymbolVersion> Globals;
>>>>> +  std::tie(Locals, Globals) = readSymbols();
>>>>> +  expect(";");
>>>>> +
>>>>> +  if (!atEOF()) {
>>>>>      setError("EOF expected, but got " + next());
>>>>> +    return;
>>>>> +  }
>>>>> +  if (!Locals.empty()) {
>>>>> +    setError("\"local:\" scope not supported in --dynamic-list");
>>>>> +    return;
>>>>> +  }
>>>>> +
>>>>> +  for (SymbolVersion V : Globals)
>>>>> +    Config->DynamicList.push_back(V);
>>>>>  }
>>>>>
>>>>>  void ScriptParser::readVersionScript() {
>>>>>
>>>>> Modified: lld/trunk/ELF/SymbolTable.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=312757&r1=312756&r2=312757&view=diff
>>>>> ==============================================================================
>>>>> --- lld/trunk/ELF/SymbolTable.cpp (original)
>>>>> +++ lld/trunk/ELF/SymbolTable.cpp Thu Sep  7 16:19:09 2017
>>>>> @@ -680,6 +680,24 @@ void SymbolTable::handleAnonymousVersion
>>>>>      assignWildcardVersion(Ver, VER_NDX_LOCAL);
>>>>>  }
>>>>>
>>>>> +// Handles -dynamic-list.
>>>>> +void SymbolTable::handleDynamicList() {
>>>>> +  for (SymbolVersion &Ver : Config->DynamicList) {
>>>>> +    std::vector<SymbolBody *> Syms;
>>>>> +    if (Ver.HasWildcard)
>>>>> +      Syms = findByVersion(Ver);
>>>>> +    else
>>>>> +      Syms = findAllByVersion(Ver);
>>>>> +
>>>>> +    for (SymbolBody *B : Syms) {
>>>>> +      if (!Config->Shared)
>>>>> +        B->symbol()->VersionId = VER_NDX_GLOBAL;
>>>>> +      else if (B->symbol()->includeInDynsym())
>>>>> +        B->IsPreemptible = true;
>>>>> +    }
>>>>> +  }
>>>>> +}
>>>>> +
>>>>>  // Set symbol versions to symbols. This function handles patterns
>>>>>  // containing no wildcard characters.
>>>>>  void SymbolTable::assignExactVersion(SymbolVersion Ver, uint16_t VersionId,
>>>>> @@ -729,6 +747,7 @@ void SymbolTable::assignWildcardVersion(
>>>>>  void SymbolTable::scanVersionScript() {
>>>>>    // Handle edge cases first.
>>>>>    handleAnonymousVersion();
>>>>> +  handleDynamicList();
>>>>>
>>>>>    // Now we have version definitions, so we need to set version ids to symbols.
>>>>>    // Each version definition has a glob pattern, and all symbols that match
>>>>>
>>>>> Modified: lld/trunk/ELF/SymbolTable.h
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=312757&r1=312756&r2=312757&view=diff
>>>>> ==============================================================================
>>>>> --- lld/trunk/ELF/SymbolTable.h (original)
>>>>> +++ lld/trunk/ELF/SymbolTable.h Thu Sep  7 16:19:09 2017
>>>>> @@ -90,6 +90,8 @@ public:
>>>>>
>>>>>    void trace(StringRef Name);
>>>>>
>>>>> +  void handleDynamicList();
>>>>> +
>>>>>  private:
>>>>>    std::vector<SymbolBody *> findByVersion(SymbolVersion Ver);
>>>>>    std::vector<SymbolBody *> findAllByVersion(SymbolVersion Ver);
>>>>>
>>>>> Modified: lld/trunk/ELF/Writer.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=312757&r1=312756&r2=312757&view=diff
>>>>> ==============================================================================
>>>>> --- lld/trunk/ELF/Writer.cpp (original)
>>>>> +++ lld/trunk/ELF/Writer.cpp Thu Sep  7 16:19:09 2017
>>>>> @@ -1294,8 +1294,9 @@ template <class ELFT> void Writer<ELFT>:
>>>>>    applySynthetic({In<ELFT>::EhFrame},
>>>>>                   [](SyntheticSection *SS) { SS->finalizeContents(); });
>>>>>
>>>>> -  for (Symbol *S : Symtab->getSymbols())
>>>>> -    S->body()->IsPreemptible = computeIsPreemptible(*S->body());
>>>>> +  if (Config->DynamicList.empty())
>>>>> +    for (Symbol *S : Symtab->getSymbols())
>>>>> +      S->body()->IsPreemptible = computeIsPreemptible(*S->body());
>>>>>
>>>>>    // Scan relocations. This must be done after every symbol is declared so that
>>>>>    // we can correctly decide if a dynamic relocation is needed.
>>>>>
>>>>> Added: lld/trunk/test/ELF/dynamic-list-preempt.s
>>>>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/dynamic-list-preempt.s?rev=312757&view=auto
>>>>> ==============================================================================
>>>>> --- lld/trunk/test/ELF/dynamic-list-preempt.s (added)
>>>>> +++ lld/trunk/test/ELF/dynamic-list-preempt.s Thu Sep  7 16:19:09 2017
>>>>> @@ -0,0 +1,65 @@
>>>>> +# REQUIRES: x86
>>>>> +
>>>>> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
>>>>> +# RUN: echo "{ foo; zed; };" > %t.list
>>>>> +# RUN: echo "{ global: foo; bar; local: *; };" > %t.vers
>>>>> +# RUN: ld.lld -fatal-warnings -dynamic-list %t.list -version-script %t.vers -shared %t.o -o %t.so
>>>>> +# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=RELOCS %s
>>>>> +# RUN: llvm-readobj -dyn-symbols  %t.so | FileCheck --check-prefix=DYNSYMS %s
>>>>> +
>>>>> +# RELOCS:      Relocations [
>>>>> +# RELOCS-NEXT:   Section ({{.*}}) .rela.plt {
>>>>> +# RELOCS-NEXT:     R_X86_64_JUMP_SLOT foo 0x0
>>>>> +# RELOCS-NEXT:   }
>>>>> +# RELOCS-NEXT: ]
>>>>> +
>>>>> +# DYNSYMS:      DynamicSymbols [
>>>>> +# DYNSYMS-NEXT:   Symbol {
>>>>> +# DYNSYMS-NEXT:     Name: @ (0)
>>>>> +# DYNSYMS-NEXT:     Value: 0x0
>>>>> +# DYNSYMS-NEXT:     Size: 0
>>>>> +# DYNSYMS-NEXT:     Binding: Local
>>>>> +# DYNSYMS-NEXT:     Type: None
>>>>> +# DYNSYMS-NEXT:     Other: 0
>>>>> +# DYNSYMS-NEXT:     Section: Undefined
>>>>> +# DYNSYMS-NEXT:   }
>>>>> +# DYNSYMS-NEXT:   Symbol {
>>>>> +# DYNSYMS-NEXT:     Name: bar@
>>>>> +# DYNSYMS-NEXT:     Value:
>>>>> +# DYNSYMS-NEXT:     Size:
>>>>> +# DYNSYMS-NEXT:     Binding: Global
>>>>> +# DYNSYMS-NEXT:     Type:
>>>>> +# DYNSYMS-NEXT:     Other:
>>>>> +# DYNSYMS-NEXT:     Section:
>>>>> +# DYNSYMS-NEXT:   }
>>>>> +# DYNSYMS-NEXT:   Symbol {
>>>>> +# DYNSYMS-NEXT:     Name: foo@
>>>>> +# DYNSYMS-NEXT:     Value:
>>>>> +# DYNSYMS-NEXT:     Size:
>>>>> +# DYNSYMS-NEXT:     Binding: Global
>>>>> +# DYNSYMS-NEXT:     Type:
>>>>> +# DYNSYMS-NEXT:     Other:
>>>>> +# DYNSYMS-NEXT:     Section:
>>>>> +# DYNSYMS-NEXT:   }
>>>>> +# DYNSYMS-NEXT: ]
>>>>> +
>>>>> +        .globl foo
>>>>> +foo:
>>>>> +        ret
>>>>> +
>>>>> +        .globl bar
>>>>> +bar:
>>>>> +        ret
>>>>> +
>>>>> +        .globl baz
>>>>> +baz:
>>>>> +        ret
>>>>> +
>>>>> +        .globl zed
>>>>> +zed:
>>>>> +        ret
>>>>> +
>>>>> +        call   foo at PLT
>>>>> +        call   bar at PLT
>>>>> +        call   baz at PLT
>>>>> +        call   zed at PLT
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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