forked from OSchip/llvm-project
ThinLTO: Fix inline assembly references to static functions with CFI
Create an internal alias with the original name for static functions that are renamed in promoteInternals to avoid breaking inline assembly references to them. This version uses module inline assembly to avoid issues with LowerTypeTestsModule. Link: https://github.com/ClangBuiltLinux/linux/issues/1354 Reviewed By: nickdesaulniers, pcc Differential Revision: https://reviews.llvm.org/D104058
This commit is contained in:
parent
35a18a981f
commit
8e3b5cb39e
|
@ -55,6 +55,7 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
|
|||
}
|
||||
}
|
||||
|
||||
std::string OldName = Name.str();
|
||||
std::string NewName = (Name + ModuleId).str();
|
||||
|
||||
if (const auto *C = ExportGV.getComdat())
|
||||
|
@ -69,6 +70,13 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
|
|||
ImportGV->setName(NewName);
|
||||
ImportGV->setVisibility(GlobalValue::HiddenVisibility);
|
||||
}
|
||||
|
||||
if (Function *F = dyn_cast<Function>(&ExportGV)) {
|
||||
// Create a local alias with the original name to avoid breaking
|
||||
// references from inline assembly.
|
||||
std::string Alias = ".set " + OldName + "," + NewName + "\n";
|
||||
ExportM.appendModuleInlineAsm(Alias);
|
||||
}
|
||||
}
|
||||
|
||||
if (!RenamedComdats.empty())
|
||||
|
|
|
@ -131,10 +131,12 @@
|
|||
; RUN: -r=%t1.o,_ZN1D1mEi, \
|
||||
; RUN: -r=%t1.o,test2, \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi, \
|
||||
; RUN: -r=%t2.o,_ZN1B1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1C1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1D1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi, \
|
||||
; RUN: -r=%t2.o,_ZTV1B, \
|
||||
; RUN: -r=%t2.o,_ZTV1C, \
|
||||
; RUN: -r=%t2.o,_ZTV1D, \
|
||||
|
@ -167,10 +169,12 @@
|
|||
; RUN: -r=%t1.o,_ZN1D1mEi, \
|
||||
; RUN: -r=%t1.o,test2, \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi, \
|
||||
; RUN: -r=%t2.o,_ZN1B1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1C1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1D1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi, \
|
||||
; RUN: -r=%t2.o,_ZTV1B, \
|
||||
; RUN: -r=%t2.o,_ZTV1C, \
|
||||
; RUN: -r=%t2.o,_ZTV1D, \
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o - %s | llvm-modextract -b -n 0 -o - | llvm-dis | FileCheck %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: module asm ".set a,a.[[HASH:[0-9a-f]+]]"
|
||||
|
||||
define void @b() {
|
||||
%f = alloca void ()*, align 8
|
||||
; CHECK: store{{.*}} @a.[[HASH]],{{.*}} %f
|
||||
store void ()* @a, void ()** %f, align 8
|
||||
; CHECK: %1 = call void ()* asm sideeffect "leaq a(%rip)
|
||||
%1 = call void ()* asm sideeffect "leaq a(%rip), $0\0A\09", "=r,~{dirflag},~{fpsr},~{flags}"()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: define{{.*}} @a.[[HASH]](){{.*}} !type
|
||||
define internal void @a() !type !0 {
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = !{i64 0, !"typeid1"}
|
|
@ -7,6 +7,8 @@
|
|||
; RUN: llvm-bcanalyzer -dump %t0 | FileCheck --check-prefix=BCA0 %s
|
||||
; RUN: llvm-bcanalyzer -dump %t1 | FileCheck --check-prefix=BCA1 %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; ERROR: llvm-modextract: error: module index out of range; bitcode file contains 2 module(s)
|
||||
|
||||
; BCA0: <GLOBALVAL_SUMMARY_BLOCK
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s
|
||||
; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define [1 x i8*]* @source() {
|
||||
ret [1 x i8*]* @g
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue