diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 8d8a73729e74c..e5f9401fda276 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -561,6 +561,8 @@ class LowerTypeTestsModule { return FunctionAnnotations.contains(V); } + void maybeReplaceComdat(Function *F, StringRef OriginalName); + public: LowerTypeTestsModule(Module &M, ModuleAnalysisManager &AM, ModuleSummaryIndex *ExportSummary, @@ -1082,6 +1084,23 @@ void LowerTypeTestsModule::importTypeTest(CallInst *CI) { } } +void LowerTypeTestsModule::maybeReplaceComdat(Function *F, + StringRef OriginalName) { + // For COFF we should also rename the comdat if this function also + // happens to be the key function. Even if the comdat name changes, this + // should still be fine since comdat and symbol resolution happens + // before LTO, so all symbols which would prevail have been selected. + if (F->hasComdat() && ObjectFormat == Triple::COFF && + F->getComdat()->getName() == OriginalName) { + Comdat *OldComdat = F->getComdat(); + Comdat *NewComdat = M.getOrInsertComdat(F->getName()); + for (GlobalObject &GO : M.global_objects()) { + if (GO.getComdat() == OldComdat) + GO.setComdat(NewComdat); + } + } +} + // ThinLTO backend: the function F has a jump table entry; update this module // accordingly. isJumpTableCanonical describes the type of the jump table entry. void LowerTypeTestsModule::importFunction( @@ -1115,6 +1134,7 @@ void LowerTypeTestsModule::importFunction( FDecl->setVisibility(GlobalValue::HiddenVisibility); } else { F->setName(Name + ".cfi"); + maybeReplaceComdat(F, Name); F->setLinkage(GlobalValue::ExternalLinkage); FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage, F->getAddressSpace(), Name, &M); @@ -1734,19 +1754,7 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative( FAlias->takeName(F); if (FAlias->hasName()) { F->setName(FAlias->getName() + ".cfi"); - // For COFF we should also rename the comdat if this function also - // happens to be the key function. Even if the comdat name changes, this - // should still be fine since comdat and symbol resolution happens - // before LTO, so all symbols which would prevail have been selected. - if (F->hasComdat() && ObjectFormat == Triple::COFF && - F->getComdat()->getName() == FAlias->getName()) { - Comdat *OldComdat = F->getComdat(); - Comdat *NewComdat = M.getOrInsertComdat(F->getName()); - for (GlobalObject &GO : M.global_objects()) { - if (GO.getComdat() == OldComdat) - GO.setComdat(NewComdat); - } - } + maybeReplaceComdat(F, FAlias->getName()); } replaceCfiUses(F, FAlias, IsJumpTableCanonical); if (!F->hasLocalLinkage()) diff --git a/llvm/test/Transforms/LowerTypeTests/Inputs/import-thinlto-funcs.yaml b/llvm/test/Transforms/LowerTypeTests/Inputs/import-thinlto-funcs.yaml new file mode 100644 index 0000000000000..459d45032b0c4 --- /dev/null +++ b/llvm/test/Transforms/LowerTypeTests/Inputs/import-thinlto-funcs.yaml @@ -0,0 +1,5 @@ +--- +CfiFunctionDefs: + - f1 + - f2 +... diff --git a/llvm/test/Transforms/LowerTypeTests/cfi-coff-comdat-rename.ll b/llvm/test/Transforms/LowerTypeTests/cfi-coff-comdat-rename.ll index 7dda7f6df10c3..7eede8b7322f8 100644 --- a/llvm/test/Transforms/LowerTypeTests/cfi-coff-comdat-rename.ll +++ b/llvm/test/Transforms/LowerTypeTests/cfi-coff-comdat-rename.ll @@ -1,5 +1,6 @@ ; REQUIRES: x86-registered-target ; RUN: opt -S -passes=lowertypetests %s | FileCheck %s +; RUN: opt -S -passes=lowertypetests -lowertypetests-summary-action=import -lowertypetests-read-summary=%p/Inputs/import-thinlto-funcs.yaml %s | FileCheck %s ;; This is a check to assert we don't crash with: ;; @@ -7,6 +8,7 @@ ;; ;; So this just needs to exit normally. ; RUN: opt -S -passes=lowertypetests %s | llc -asm-verbose=false +; RUN: opt -S -passes=lowertypetests -lowertypetests-summary-action=import -lowertypetests-read-summary=%p/Inputs/import-thinlto-funcs.yaml %s | llc -asm-verbose=false target datalayout = "e-p:64:64" target triple = "x86_64-pc-windows-msvc"