Index: lib/LTO/LTO.cpp =================================================================== --- lib/LTO/LTO.cpp +++ lib/LTO/LTO.cpp @@ -1014,7 +1014,8 @@ // IRName will be defined if we have seen the prevailing copy of // this value. If not, no need to preserve any ThinLTO copies. !Res.second.IRName.empty()) - GUIDPreservedSymbols.insert(GlobalValue::getGUID(Res.second.IRName)); + GUIDPreservedSymbols.insert(GlobalValue::getGUID( + GlobalValue::getRealLinkageName(Res.second.IRName))); } auto DeadSymbols = @@ -1033,10 +1034,11 @@ // partition (and we can't get the GUID). if (Res.second.IRName.empty()) continue; - auto GUID = GlobalValue::getGUID(Res.second.IRName); + auto GUID = GlobalValue::getGUID( + GlobalValue::getRealLinkageName(Res.second.IRName)); // Mark exported unless index-based analysis determined it to be dead. if (!DeadSymbols.count(GUID)) - ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName)); + ExportedGUIDs.insert(GUID); } auto isPrevailing = [&](GlobalValue::GUID GUID, Index: test/ThinLTO/X86/Inputs/foobar.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/Inputs/foobar.ll @@ -0,0 +1,14 @@ +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.0.24215" + +%class.bar = type { i32 (...)** } + +$"\01??_Gbar@@UEAAPEAXI@Z" = comdat any + +define void @"\01??1bar@@UEAA@XZ"(%class.bar* nocapture %this) unnamed_addr { + ret void +} + +define linkonce_odr i8* @"\01??_Gbar@@UEAAPEAXI@Z"(%class.bar* %this, i32 %should_call_delete) unnamed_addr comdat { + ret i8* null +} Index: test/ThinLTO/X86/Inputs/qux.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/Inputs/qux.ll @@ -0,0 +1,28 @@ +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.0.24215" + +%class.baz = type { %class.bar } +%class.bar = type { i32 (...)** } + +$"\01?x@bar@@UEBA_NXZ" = comdat any + +$"\01??_7baz@@6B@" = comdat any + +$"\01??_Gbaz@@UEAAPEAXI@Z" = comdat any + +@"\01??_7baz@@6B@" = linkonce_odr unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (i8* (%class.baz*, i32)* @"\01??_Gbaz@@UEAAPEAXI@Z" to i8*), i8* bitcast (i1 (%class.bar*)* @"\01?x@bar@@UEBA_NXZ" to i8*)] }, comdat, !type !0, !type !1 + +define void @"\01?qux@@YAXXZ"() local_unnamed_addr { + ret void +} + +define linkonce_odr i8* @"\01??_Gbaz@@UEAAPEAXI@Z"(%class.baz* %this, i32 %should_call_delete) unnamed_addr comdat { + ret i8* null +} + +define linkonce_odr zeroext i1 @"\01?x@bar@@UEBA_NXZ"(%class.bar* %this) unnamed_addr comdat { + ret i1 false +} + +!0 = !{i64 0, !"?AVbar@@"} +!1 = !{i64 0, !"?AVbaz@@"} Index: test/ThinLTO/X86/mangled.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/mangled.ll @@ -0,0 +1,20 @@ +; RUN: opt -thinlto-bc %s -o %t.obj +; RUN: opt -thinlto-bc %S/Inputs/foobar.ll -o %T/foobar.obj +; RUN: opt -thinlto-bc %S/Inputs/qux.ll -o %T/qux.obj +; RUN: rm -f %T/qux.lib +; RUN: llvm-ar crs %T/qux.lib %T/foobar.obj %T/qux.obj +; RUN: lld-link -out:%t.exe -entry:main %t.obj %T/qux.lib + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.0.24215" + +%"class.bar" = type { i32 (...)**, i8*, i8*, i8*, i32 } + +define i32 @main() { + ret i32 0 +} + +; Function Attrs: norecurse nounwind sspstrong uwtable +define available_externally zeroext i1 @"\01?x@bar@@UEBA_NXZ"(%"class.bar"* %this) unnamed_addr align 2 { + ret i1 false +}