diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index ab960e021d4da11be65607ad3b1cca03f072b58e..b520dc24b167bc273161b56678fb7cf3e27fd75e 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -30,6 +30,11 @@ #include using namespace llvm; +static cl::opt ReplaceImportedSymverAsDeclare( + "replace-imported-symver-as-declare", + cl::desc("Replace imported symver as declare"), cl::init(true), + cl::Hidden); + //===----------------------------------------------------------------------===// // TypeMap implementation. //===----------------------------------------------------------------------===// @@ -1622,7 +1627,15 @@ Error IRLinker::run() { SmallString<256> S(".symver "); S += Name; S += ", "; - S += Alias; + auto Pos = Alias.find("@@"); + if (ReplaceImportedSymverAsDeclare && + (Pos != StringRef::npos && !Alias.startswith("@@@"))) { + S += Alias.substr(0, Pos); + S += '@'; + S += Alias.substr(Pos + 2); + } else { + S += Alias; + } DstM.appendModuleInlineAsm(S); } }); diff --git a/llvm/test/ThinLTO/X86/Inputs/import-symver-foo.ll b/llvm/test/ThinLTO/X86/Inputs/import-symver-foo.ll index 95545b433f98c937dbd46e4d789497049edad3e3..498fede9e552fbcc89ff2bac9f2f996accf7fd4f 100644 --- a/llvm/test/ThinLTO/X86/Inputs/import-symver-foo.ll +++ b/llvm/test/ThinLTO/X86/Inputs/import-symver-foo.ll @@ -5,6 +5,8 @@ module asm ".symver bar, bar@BAR_1.2.3" declare dso_local i32 @bar() +module asm ".symver foo, foo@@FOO_1.2.3" + define dso_local i32 @foo() { entry: %call = tail call i32 @bar() diff --git a/llvm/test/ThinLTO/X86/import-symver.ll b/llvm/test/ThinLTO/X86/import-symver.ll index 556c4fd992f0d69f29c33001e68e9085bfeba331..41cd98f8665bfdc1645ce89c14dadee52ae338db 100644 --- a/llvm/test/ThinLTO/X86/import-symver.ll +++ b/llvm/test/ThinLTO/X86/import-symver.ll @@ -8,6 +8,8 @@ ; RUN: llvm-lto -thinlto-action=import -exported-symbol=main -import-instr-limit=0 %t1.bc -thinlto-index=%t3.index.bc ; RUN: llvm-dis %t1.bc.thinlto.imported.bc -o - | FileCheck --check-prefix=NOIMPORT %s +; When @foo gets imported, the symver must be imported as @ rather than @@. +; IMPORT: module asm ".symver foo, foo@FOO_1.2.3" ; When @bar gets imported, the symver must be imported too. ; IMPORT: module asm ".symver bar, bar@BAR_1.2.3" ; IMPORT: declare dso_local i32 @bar()