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 relands commit 4474958d3a
with a fix to a use-of-uninitialized-value error that tripped
MemorySanitizer.
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
ec08f03be3
commit
e3d24b45b8
|
@ -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,15 @@ 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.
|
||||
GlobalAlias *A = GlobalAlias::create(
|
||||
F->getValueType(), F->getAddressSpace(), GlobalValue::InternalLinkage,
|
||||
OldName, F, &ExportM);
|
||||
appendToCompilerUsed(ExportM, A);
|
||||
}
|
||||
}
|
||||
|
||||
if (!RenamedComdats.empty())
|
||||
|
|
|
@ -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"}
|
Loading…
Reference in New Issue