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.

Link: https://github.com/ClangBuiltLinux/linux/issues/1354

Reviewed By: pcc

Differential Revision: https://reviews.llvm.org/D104058
This commit is contained in:
Sami Tolvanen 2021-06-22 09:28:31 -07:00
parent bd240b3d77
commit 4474958d3a
2 changed files with 28 additions and 0 deletions

View File

@ -69,6 +69,15 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
ImportGV->setName(NewName); ImportGV->setName(NewName);
ImportGV->setVisibility(GlobalValue::HiddenVisibility); 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.
GlobalAlias *A =
GlobalAlias::create(F->getValueType(), F->getAddressSpace(),
GlobalValue::InternalLinkage, Name, F, &ExportM);
appendToCompilerUsed(ExportM, A);
}
} }
if (!RenamedComdats.empty()) if (!RenamedComdats.empty())

View File

@ -0,0 +1,19 @@
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o - %s | llvm-modextract -b -n 0 -o - | llvm-dis | FileCheck %s
; CHECK: @a = internal alias {{.*}}@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"}