Skip to content

Commit

Permalink
[ELF] -r: don't parse @ (symbol versioning) for .symver inline asm in…
Browse files Browse the repository at this point in the history
… bitcode

Fixes PR46420
Similar to D43307 for non-LTO.

Module-level inline assembly can use .symver to create a symbol with `@` in the name.
For relocatable output, @ should be retained in the symbol name. `@ver` should
not be parsed and dropped.

Reviewed By: grimar, psmith

Differential Revision: https://reviews.llvm.org/D82433
  • Loading branch information
MaskRay committed Jun 24, 2020
1 parent 778351d commit 4542c18
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
7 changes: 5 additions & 2 deletions lld/ELF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1717,8 +1717,11 @@ template <class ELFT> void LinkerDriver::compileBitcodeFiles() {
for (InputFile *file : lto->compile()) {
auto *obj = cast<ObjFile<ELFT>>(file);
obj->parse(/*ignoreComdats=*/true);
for (Symbol *sym : obj->getGlobalSymbols())
sym->parseSymbolVersion();

// Parse '@' in symbol names for non-relocatable output.
if (!config->relocatable)
for (Symbol *sym : obj->getGlobalSymbols())
sym->parseSymbolVersion();
objectFiles.push_back(file);
}
}
Expand Down
22 changes: 17 additions & 5 deletions lld/test/ELF/lto/version-script2.ll
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
; REQUIRES: x86

;; Test we parse symbol versions before LTO, otherwise we may get a symbol
;; named "foo@@VER1", but not "foo" with the version VER1.
;; For non-relocatable output, test we parse symbol versions after LTO,
;; otherwise we may get a symbol named "foo@@VER1", but not "foo" with the
;; version VER1.

; RUN: llvm-as %s -o %t.o
; RUN: echo "VER1 {};" > %t.script
; RUN: ld.lld %t.o -o %t.so -shared --version-script %t.script
; RUN: llvm-readobj --dyn-syms %t.so | FileCheck %s
; RUN: llvm-readelf --dyn-syms %t.so | FileCheck %s

; CHECK: Name: foo@@VER1 (
;; For non-relocatable output, @ in symbol names has no effect on undefined symbols.
; CHECK: UND bar{{$}}
; CHECK-NEXT: {{[1-9]}} foo@@VER1

;; For relocatable output, @ should be retained in the symbol name.
;; Don't parse and drop `@VER1`. Also check that --version-script is ignored.
; RUN: ld.lld %t.o -o %t.ro -r --version-script %t.script
; RUN: llvm-readelf -s %t.ro | FileCheck %s --check-prefix=RELOCATABLE

; RELOCATABLE: {{[1-9]}} foo@@VER1
; RELOCATABLE-NEXT: UND bar@VER1

target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

module asm ".global foo"
module asm "foo:"
module asm "foo: call bar"
module asm ".symver foo,foo@@@VER1"
module asm ".symver bar,bar@@@VER1"

0 comments on commit 4542c18

Please sign in to comment.