Index: llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp +++ llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1887,6 +1887,17 @@ 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. + // 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) F = Function::Create( FunctionType::get(Type::getVoidTy(M.getContext()), false), Index: llvm/trunk/test/Transforms/LowerTypeTests/export-rename-local.ll =================================================================== --- llvm/trunk/test/Transforms/LowerTypeTests/export-rename-local.ll +++ llvm/trunk/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"}