Index: lib/Linker/LinkModules.cpp =================================================================== --- lib/Linker/LinkModules.cpp +++ lib/Linker/LinkModules.cpp @@ -762,8 +762,10 @@ // It would be incorrect to import an appending linkage variable, // since it would cause global constructors/destructors to be // executed multiple times. This should have already been handled - // by linkGlobalValueProto. - llvm_unreachable("Cannot import appending linkage variable"); + // by linkGlobalValueProto, and we will assert in shouldLinkFromSource + // if we try to import, so we simply return AppendingLinkage here + // as this helper is called more widely in getLinkedToGlobal. + return GlobalValue::AppendingLinkage; case GlobalValue::InternalLinkage: case GlobalValue::PrivateLinkage: @@ -1861,7 +1863,8 @@ if (!DGV && !shouldOverrideFromSrc() && (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() || - GV.hasAvailableExternallyLinkage())) { + GV.hasAvailableExternallyLinkage() || + (GV.hasAppendingLinkage() && isPerformingImport()))) { return false; } MapValue(&GV, ValueMap, RF_MoveDistinctMDs, &TypeMap, &ValMaterializer); Index: test/Transforms/FunctionImport/Inputs/appending_global.ll =================================================================== --- /dev/null +++ test/Transforms/FunctionImport/Inputs/appending_global.ll @@ -0,0 +1,6 @@ +@v = weak global i8 1 +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @foo, i8* @v}] + +define void @foo() { + ret void +} Index: test/Transforms/FunctionImport/import_appending_global.ll =================================================================== --- /dev/null +++ test/Transforms/FunctionImport/import_appending_global.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as -function-summary %s -o %t.bc +; RUN: llvm-as -function-summary %p/Inputs/appending_global.ll -o %t2.bc +; RUN: llvm-lto -thinlto -o %t3 %t.bc %t2.bc + +; Do the import now +; RUN: opt -function-import -summary-file %t3.thinlto.bc %s -S | FileCheck %s + +; Ensure that global constructors (appending linkage) is not imported +; CHECK-NOT: @llvm.global_ctors + + +define i32 @main() { +entry: + call void @foo() + ret i32 0 +} + +declare void @foo()