mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
LowerTypeTests: Rename local functions to avoid collisions with identically named functions in ThinLTO modules.
Without this we can encounter link errors or incorrect behaviour at runtime as a result of the wrong function being referenced. Differential Revision: https://reviews.llvm.org/D67945 llvm-svn: 373678
This commit is contained in:
parent
e2903b0e94
commit
14b352ee16
@ -1887,6 +1887,17 @@ bool LowerTypeTestsModule::lower() {
|
|||||||
CfiFunctionLinkage Linkage = P.second.Linkage;
|
CfiFunctionLinkage Linkage = P.second.Linkage;
|
||||||
MDNode *FuncMD = P.second.FuncMD;
|
MDNode *FuncMD = P.second.FuncMD;
|
||||||
Function *F = M.getFunction(FunctionName);
|
Function *F = M.getFunction(FunctionName);
|
||||||
|
if (F && F->hasLocalLinkage()) {
|
||||||
|
// Locally defined function that happens to have the same name as a
|
||||||
|
// function defined in a ThinLTO module. Rename it to move it out of
|
||||||
|
// the way of the external reference that we're about to create.
|
||||||
|
// Note that setName will find a unique name for the function, so even
|
||||||
|
// if there is an existing function with the suffix there won't be a
|
||||||
|
// name collision.
|
||||||
|
F->setName(F->getName() + ".1");
|
||||||
|
F = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (!F)
|
if (!F)
|
||||||
F = Function::Create(
|
F = Function::Create(
|
||||||
FunctionType::get(Type::getVoidTy(M.getContext()), false),
|
FunctionType::get(Type::getVoidTy(M.getContext()), false),
|
||||||
|
15
test/Transforms/LowerTypeTests/export-rename-local.ll
Normal file
15
test/Transforms/LowerTypeTests/export-rename-local.ll
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: define internal void @external_addrtaken.1()
|
||||||
|
; CHECK: declare {{.*}} void @external_addrtaken.cfi()
|
||||||
|
|
||||||
|
target triple = "x86_64-unknown-linux"
|
||||||
|
|
||||||
|
define internal void @external_addrtaken() !type !1 {
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
!cfi.functions = !{!0}
|
||||||
|
|
||||||
|
!0 = !{!"external_addrtaken", i8 0, !1}
|
||||||
|
!1 = !{i64 0, !"typeid1"}
|
Loading…
x
Reference in New Issue
Block a user