diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index b406c22c69d7..693df5e7ba92 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -855,15 +855,20 @@ void LowerTypeTestsModule::importFunction(Function *F, bool isDefinition) { FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage, Name + ".cfi_jt", &M); FDecl->setVisibility(GlobalValue::HiddenVisibility); - } else { - // Definition. - assert(isDefinition); + } else if (isDefinition) { F->setName(Name + ".cfi"); F->setLinkage(GlobalValue::ExternalLinkage); F->setVisibility(GlobalValue::HiddenVisibility); FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage, Name, &M); FDecl->setVisibility(Visibility); + } else { + // Function definition without type metadata, where some other translation + // unit contained a declaration with type metadata. This normally happens + // during mixed CFI + non-CFI compilation. We do nothing with the function + // so that it is treated the same way as a function defined outside of the + // LTO unit. + return; } if (F->isWeakForLinker()) diff --git a/llvm/test/Transforms/LowerTypeTests/Inputs/import-icall.yaml b/llvm/test/Transforms/LowerTypeTests/Inputs/import-icall.yaml index 17b634acd0e1..558aa9aa73f2 100644 --- a/llvm/test/Transforms/LowerTypeTests/Inputs/import-icall.yaml +++ b/llvm/test/Transforms/LowerTypeTests/Inputs/import-icall.yaml @@ -16,4 +16,5 @@ CfiFunctionDefs: CfiFunctionDecls: - external - external_weak + - local_decl ... diff --git a/llvm/test/Transforms/LowerTypeTests/import-icall.ll b/llvm/test/Transforms/LowerTypeTests/import-icall.ll index ddeb7fb5c9a2..b4e374720321 100644 --- a/llvm/test/Transforms/LowerTypeTests/import-icall.ll +++ b/llvm/test/Transforms/LowerTypeTests/import-icall.ll @@ -19,6 +19,10 @@ define i8 @use_b() { ret i8 %x } +define void @local_decl() { + call void @local_decl() + ret void +} declare void @external() declare extern_weak void @external_weak() @@ -33,6 +37,9 @@ declare extern_weak void @external_weak() ; CHECK: define internal i8 @local_b() { ; CHECK-NEXT: call i8 @local_a() +; CHECK: define void @local_decl() +; CHECK-NEXT: call void @local_decl() + ; CHECK: declare void @external() ; CHECK: declare extern_weak void @external_weak() ; CHECK: declare i8 @local_a()