Index: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1349,9 +1349,14 @@ const TargetLoweringObjectFile &Obj = getObjFileLowering(); const MCSymbol *KeySym = nullptr; const MCSection *KeySec = nullptr; - if (S.ComdatKey) { - KeySym = getSymbol(S.ComdatKey); - KeySec = getObjFileLowering().SectionForGlobal(S.ComdatKey, *Mang, TM); + if (GlobalValue *GV = S.ComdatKey) { + if (GV->hasAvailableExternallyLinkage()) + // If the associated variable is available_externally, some other TU + // will provide its dynamic initializer. + continue; + + KeySym = getSymbol(GV); + KeySec = getObjFileLowering().SectionForGlobal(GV, *Mang, TM); } const MCSection *OutputSection = (isCtor ? Obj.getStaticCtorSection(S.Priority, KeySym, KeySec) Index: llvm/trunk/test/MC/COFF/global_ctors_dtors.ll =================================================================== --- llvm/trunk/test/MC/COFF/global_ctors_dtors.ll +++ llvm/trunk/test/MC/COFF/global_ctors_dtors.ll @@ -11,9 +11,10 @@ %ini = type { i32, void()*, i8* } -@llvm.global_ctors = appending global [2 x %ini ] [ +@llvm.global_ctors = appending global [3 x %ini ] [ %ini { i32 65535, void ()* @a_global_ctor, i8* null }, - %ini { i32 65535, void ()* @b_global_ctor, i8* bitcast (i32* @b to i8*) } + %ini { i32 65535, void ()* @b_global_ctor, i8* bitcast (i32* @b to i8*) }, + %ini { i32 65535, void ()* @c_global_ctor, i8* bitcast (i32* @c to i8*) } ] @llvm.global_dtors = appending global [1 x %ini ] [%ini { i32 65535, void ()* @a_global_dtor, i8* null }] @@ -26,11 +27,18 @@ @b = global i32 zeroinitializer +@c = available_externally dllimport global i32 zeroinitializer + define void @b_global_ctor() nounwind { store i32 42, i32* @b ret void } +define void @c_global_ctor() nounwind { + store i32 42, i32* @c + ret void +} + define void @a_global_dtor() nounwind { %1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str2, i32 0, i32 0)) ret void @@ -45,11 +53,13 @@ ; WIN32: a_global_ctor ; WIN32: .section .CRT$XCU,"rd",associative .bss,{{_?}}b ; WIN32: b_global_ctor +; WIN32-NOT: c_global_ctor ; WIN32: .section .CRT$XTX,"rd" ; WIN32: a_global_dtor ; MINGW32: .section .ctors,"wd" ; MINGW32: a_global_ctor ; MINGW32: .section .ctors,"wd",associative .bss,{{_?}}b ; MINGW32: b_global_ctor +; MINGW32-NOT: c_global_ctor ; MINGW32: .section .dtors,"wd" ; MINGW32: a_global_dtor