diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1887,6 +1887,14 @@ CfiFunctionLinkage Linkage = P.second.Linkage; MDNode *FuncMD = P.second.FuncMD; 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. + F->setName(F->getName() + ".1"); + F = nullptr; + } + if (!F) F = Function::Create( FunctionType::get(Type::getVoidTy(M.getContext()), false), diff --git a/llvm/test/Transforms/LowerTypeTests/export-rename-local.ll b/llvm/test/Transforms/LowerTypeTests/export-rename-local.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LowerTypeTests/export-rename-local.ll @@ -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"}