[lld] 4542c18 - [ELF] -r: don't parse @ (symbol versioning) for .symver inline asm in bitcode

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 24 08:25:44 PDT 2020


Author: Fangrui Song
Date: 2020-06-24T08:22:22-07:00
New Revision: 4542c18ef295702b269204f83352b673c59e6542

URL: https://github.com/llvm/llvm-project/commit/4542c18ef295702b269204f83352b673c59e6542
DIFF: https://github.com/llvm/llvm-project/commit/4542c18ef295702b269204f83352b673c59e6542.diff

LOG: [ELF] -r: don't parse @ (symbol versioning) for .symver inline asm in 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

Added: 
    

Modified: 
    lld/ELF/Driver.cpp
    lld/test/ELF/lto/version-script2.ll

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 28942b9475c5..4e025071fc1e 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -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);
   }
 }

diff  --git a/lld/test/ELF/lto/version-script2.ll b/lld/test/ELF/lto/version-script2.ll
index cd1da747a7b4..b8c8b56b4317 100644
--- a/lld/test/ELF/lto/version-script2.ll
+++ b/lld/test/ELF/lto/version-script2.ll
@@ -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 at 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"


        


More information about the llvm-commits mailing list