<div dir="ltr"><div>This seems to be failing on our bots with this error:</div><div><br></div><div>******************** TEST 'lld :: COFF/undefined-symbol-lto.test' FAILED ********************<br>Script:<br>--<br>: 'RUN: at line 1';   rm -rf /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/tools/lld/test/COFF/Output/undefined-symbol-lto.test.tmp && mkdir -p /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/tools/lld/test/COFF/Output/undefined-symbol-lto.test.tmp && cd /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/tools/lld/test/COFF/Output/undefined-symbol-lto.test.tmp<br>: 'RUN: at line 2';   /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/bin/llvm-as /b/s/w/ir/k/llvm-project/lld/test/COFF/Inputs/undefined-symbol-lto-a.ll -o t.obj<br>: 'RUN: at line 3';   /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/bin/llvm-as /b/s/w/ir/k/llvm-project/lld/test/COFF/Inputs/undefined-symbol-lto-b.ll -o b.obj<br>: 'RUN: at line 4';   llvm-lib b.obj -out:b.lib<br>: 'RUN: at line 5';   not /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/bin/lld-link t.obj b.lib -subsystem:console 2>&1 | /b/s/w/ir/k/recipe_cleanup/clangHoCU64/llvm_build_dir/bin/FileCheck /b/s/w/ir/k/llvm-project/lld/test/COFF/undefined-symbol-lto.test<br>--<br>Exit Code: 1<br><br>Command Output (stderr):<br>--<br>/b/s/w/ir/k/llvm-project/lld/test/COFF/undefined-symbol-lto.test:7:8: error: CHECK: expected string not found in input<br>CHECK: undefined symbol: main<br>       ^<br><stdin>:1:1: note: scanning from here<br>lld-link: error: could not open 'libcmt.lib': No such file or directory<br>^<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 12, 2019 at 5:20 PM Reid Kleckner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: rnk<br>
Date: Fri Jul 12 17:20:34 2019<br>
New Revision: 365979<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=365979&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=365979&view=rev</a><br>
Log:<br>
[COFF] Add null check in case of symbols defined in LTO blobs<br>
<br>
The test case could probably be improved further if the failure path was<br>
better understood.<br>
<br>
Fixes PR42536<br>
<br>
Added:<br>
    lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll<br>
    lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll<br>
    lld/trunk/test/COFF/undefined-symbol-lto.test<br>
Modified:<br>
    lld/trunk/COFF/SymbolTable.cpp<br>
<br>
Modified: lld/trunk/COFF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=365979&r1=365978&r2=365979&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=365979&r1=365978&r2=365979&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/SymbolTable.cpp (original)<br>
+++ lld/trunk/COFF/SymbolTable.cpp Fri Jul 12 17:20:34 2019<br>
@@ -69,7 +69,7 @@ static Symbol *getSymbol(SectionChunk *s<br>
<br>
   for (Symbol *s : sc->file->getSymbols()) {<br>
     auto *d = dyn_cast_or_null<DefinedRegular>(s);<br>
-    if (!d || d->getChunk() != sc || d->getValue() > addr ||<br>
+    if (!d || !d->data || d->getChunk() != sc || d->getValue() > addr ||<br>
         (candidate && d->getValue() < candidate->getValue()))<br>
       continue;<br>
<br>
<br>
Added: lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll?rev=365979&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll?rev=365979&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll (added)<br>
+++ lld/trunk/test/COFF/Inputs/undefined-symbol-lto-a.ll Fri Jul 12 17:20:34 2019<br>
@@ -0,0 +1,82 @@<br>
+; ModuleID = 't.obj'<br>
+source_filename = "t.cpp"<br>
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-pc-windows-msvc19.21.27702"<br>
+<br>
+%struct.Init = type { %struct.S }<br>
+%struct.S = type { i32 (...)** }<br>
+%rtti.CompleteObjectLocator = type { i32, i32, i32, i32, i32, i32 }<br>
+%rtti.TypeDescriptor7 = type { i8**, i8*, [8 x i8] }<br>
+%rtti.ClassHierarchyDescriptor = type { i32, i32, i32, i32 }<br>
+%rtti.BaseClassDescriptor = type { i32, i32, i32, i32, i32, i32, i32 }<br>
+<br>
+$"??_SS@@6B@" = comdat largest<br>
+<br>
+$"??_R4S@@6B@" = comdat any<br>
+<br>
+$"??_R0?AUS@@@8" = comdat any<br>
+<br>
+$"??_R3S@@8" = comdat any<br>
+<br>
+$"??_R2S@@8" = comdat any<br>
+<br>
+$"??_R1A@?0A@EA@S@@8" = comdat any<br>
+<br>
+@"?d@@3UInit@@A" = dso_local local_unnamed_addr global %struct.Init zeroinitializer, align 8<br>
+@anon.bcb2691509de99310dddb690fcdb4cdc.0 = private unnamed_addr constant { [2 x i8*] } { [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"??_R4S@@6B@" to i8*), i8* bitcast (void (%struct.S*)* @"?foo@S@@UEAAXXZ" to i8*)] }, comdat($"??_SS@@6B@"), !type !0<br>
+@"??_R4S@@6B@" = linkonce_odr constant %rtti.CompleteObjectLocator { i32 1, i32 0, i32 0, i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.TypeDescriptor7* @"??_R0?AUS@@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32), i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.ClassHierarchyDescriptor* @"??_R3S@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32), i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.CompleteObjectLocator* @"??_R4S@@6B@" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32) }, comdat<br>
+@"??_7type_info@@6B@" = external constant i8*<br>
+@"??_R0?AUS@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"??_7type_info@@6B@", i8* null, [8 x i8] c".?AUS@@\00" }, comdat<br>
+@__ImageBase = external dso_local constant i8<br>
+@"??_R3S@@8" = linkonce_odr constant %rtti.ClassHierarchyDescriptor { i32 0, i32 0, i32 1, i32 trunc (i64 sub nuw nsw (i64 ptrtoint ([2 x i32]* @"??_R2S@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32) }, comdat<br>
+@"??_R2S@@8" = linkonce_odr constant [2 x i32] [i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.BaseClassDescriptor* @"??_R1A@?0A@EA@S@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32), i32 0], comdat<br>
+@"??_R1A@?0A@EA@S@@8" = linkonce_odr constant %rtti.BaseClassDescriptor { i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.TypeDescriptor7* @"??_R0?AUS@@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32), i32 0, i32 0, i32 -1, i32 0, i32 64, i32 trunc (i64 sub nuw nsw (i64 ptrtoint (%rtti.ClassHierarchyDescriptor* @"??_R3S@@8" to i64), i64 ptrtoint (i8* @__ImageBase to i64)) to i32) }, comdat<br>
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_t.cpp, i8* null }]<br>
+<br>
+@"??_SS@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @anon.bcb2691509de99310dddb690fcdb4cdc.0, i32 0, i32 0, i32 1)<br>
+<br>
+declare dso_local void @"?undefined_ref@@YAXXZ"() local_unnamed_addr #0<br>
+<br>
+declare dllimport void @"?foo@S@@UEAAXXZ"(%struct.S*) unnamed_addr #0<br>
+<br>
+; Function Attrs: nounwind sspstrong uwtable<br>
+define internal void @_GLOBAL__sub_I_t.cpp() #1 {<br>
+entry:<br>
+  store i32 (...)** bitcast (i8** @"??_SS@@6B@" to i32 (...)**), i32 (...)*** getelementptr inbounds (%struct.Init, %struct.Init* @"?d@@3UInit@@A", i64 0, i32 0, i32 0), align 8<br>
+  tail call void @"?undefined_ref@@YAXXZ"() #2<br>
+  ret void<br>
+}<br>
+<br>
+attributes #0 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
+attributes #1 = { nounwind sspstrong uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
+attributes #2 = { nounwind }<br>
+<br>
+!llvm.linker.options = !{!1, !2}<br>
+!llvm.module.flags = !{!3, !4, !5, !6}<br>
+!llvm.ident = !{!7}<br>
+<br>
+!0 = !{i64 8, !"?AUS@@"}<br>
+!1 = !{!"/DEFAULTLIB:libcmt.lib"}<br>
+!2 = !{!"/DEFAULTLIB:oldnames.lib"}<br>
+!3 = !{i32 1, !"wchar_size", i32 2}<br>
+!4 = !{i32 7, !"PIC Level", i32 2}<br>
+!5 = !{i32 1, !"ThinLTO", i32 0}<br>
+!6 = !{i32 1, !"EnableSplitLTOUnit", i32 0}<br>
+!7 = !{!"clang version 9.0.0 (git@github.com:llvm/llvm-project.git 1a285c27fdf6407ceed3398e015d00559f5f533d)"}<br>
+<br>
+^0 = module: (path: "t.obj", hash: (0, 0, 0, 0, 0))<br>
+^1 = gv: (name: "__ImageBase") ; guid = 434928772013489304<br>
+^2 = gv: (name: "??_R2S@@8", summaries: (variable: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^1, ^6)))) ; guid = 2160898732728284029<br>
+^3 = gv: (name: "llvm.global_ctors", summaries: (variable: (module: ^0, flags: (linkage: appending, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^14)))) ; guid = 2412314959268824392<br>
+^4 = gv: (name: "?foo@S@@UEAAXXZ") ; guid = 6578172636330484861<br>
+^5 = gv: (name: "??_SS@@6B@", summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), aliasee: ^10))) ; guid = 8774897714842691026<br>
+^6 = gv: (name: "??_R1A@?0A@EA@S@@8", summaries: (variable: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^11, ^1, ^8)))) ; guid = 9397802696236423453<br>
+^7 = gv: (name: "?undefined_ref@@YAXXZ") ; guid = 9774674600202276560<br>
+^8 = gv: (name: "??_R3S@@8", summaries: (variable: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^1, ^2)))) ; guid = 10685958509605791599<br>
+^9 = gv: (name: "??_7type_info@@6B@") ; guid = 10826752452437539368<br>
+^10 = gv: (name: "anon.bcb2691509de99310dddb690fcdb4cdc.0", summaries: (variable: (module: ^0, flags: (linkage: private, notEligibleToImport: 1, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), vTableFuncs: ((virtFunc: ^4, offset: 8)), refs: (^13, ^4)))) ; guid = 11510395461204283992<br>
+^11 = gv: (name: "??_R0?AUS@@@8", summaries: (variable: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^9)))) ; guid = 12346607659584231960<br>
+^12 = gv: (name: "?d@@3UInit@@A", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 1, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 1)))) ; guid = 14563354643524156382<br>
+^13 = gv: (name: "??_R4S@@6B@", summaries: (variable: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 1, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0), refs: (^13, ^11, ^1, ^8)))) ; guid = 14703528065171087394<br>
+^14 = gv: (name: "_GLOBAL__sub_I_t.cpp", summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 1, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 3, calls: ((callee: ^7)), refs: (^12, ^5)))) ; guid = 15085897428757412588<br>
+^15 = typeidCompatibleVTable: (name: "?AUS@@", summary: ((offset: 8, ^10))) ; guid = 13986515119763165370<br>
<br>
Added: lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll?rev=365979&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll?rev=365979&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll (added)<br>
+++ lld/trunk/test/COFF/Inputs/undefined-symbol-lto-b.ll Fri Jul 12 17:20:34 2019<br>
@@ -0,0 +1,29 @@<br>
+; ModuleID = 'b.obj'<br>
+source_filename = "b.cpp"<br>
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-pc-windows-msvc19.21.27702"<br>
+<br>
+%struct.S = type { i32 (...)** }<br>
+<br>
+; Function Attrs: norecurse nounwind readnone sspstrong uwtable<br>
+define dso_local void @"?foo@S@@UEAAXXZ"(%struct.S* nocapture %this) unnamed_addr #0 align 2 {<br>
+entry:<br>
+  ret void<br>
+}<br>
+<br>
+attributes #0 = { norecurse nounwind readnone sspstrong uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
+<br>
+!llvm.linker.options = !{!0, !1}<br>
+!llvm.module.flags = !{!2, !3, !4, !5}<br>
+!llvm.ident = !{!6}<br>
+<br>
+!0 = !{!"/DEFAULTLIB:libcmt.lib"}<br>
+!1 = !{!"/DEFAULTLIB:oldnames.lib"}<br>
+!2 = !{i32 1, !"wchar_size", i32 2}<br>
+!3 = !{i32 7, !"PIC Level", i32 2}<br>
+!4 = !{i32 1, !"ThinLTO", i32 0}<br>
+!5 = !{i32 1, !"EnableSplitLTOUnit", i32 0}<br>
+!6 = !{!"clang version 9.0.0 (git@github.com:llvm/llvm-project.git 1a285c27fdf6407ceed3398e015d00559f5f533d)"}<br>
+<br>
+^0 = module: (path: "b.obj", hash: (0, 0, 0, 0, 0))<br>
+^1 = gv: (name: "?foo@S@@UEAAXXZ", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 1, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0)))) ; guid = 6578172636330484861<br>
<br>
Added: lld/trunk/test/COFF/undefined-symbol-lto.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/undefined-symbol-lto.test?rev=365979&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/undefined-symbol-lto.test?rev=365979&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/COFF/undefined-symbol-lto.test (added)<br>
+++ lld/trunk/test/COFF/undefined-symbol-lto.test Fri Jul 12 17:20:34 2019<br>
@@ -0,0 +1,30 @@<br>
+RUN: rm -rf %t && mkdir -p %t && cd %t<br>
+RUN: llvm-as %S/Inputs/undefined-symbol-lto-a.ll -o t.obj<br>
+RUN: llvm-as %S/Inputs/undefined-symbol-lto-b.ll -o b.obj<br>
+RUN: llvm-lib b.obj -out:b.lib<br>
+RUN: not lld-link t.obj b.lib -subsystem:console 2>&1 | FileCheck %s<br>
+<br>
+CHECK: undefined symbol: main<br>
+CHECK: referenced by<br>
+CHECK: undefined symbol: void __cdecl undefined_ref(void)<br>
+CHECK: referenced by<br>
+<br>
+Originally reported as PR42536.<br>
+<br>
+a.ll corresponds to this C++:<br>
+<br>
+struct __declspec(dllimport) S {<br>
+  virtual void foo();<br>
+};<br>
+void undefined_ref();<br>
+struct Init {<br>
+  Init() { undefined_ref(); }<br>
+  S c;<br>
+} d;<br>
+<br>
+b.ll is from this C++:<br>
+<br>
+struct S {<br>
+  virtual void foo();<br>
+};<br>
+void S::foo() {}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>