<div dir="ltr">Joel,<div><br></div><div>Your commit contains an unrelated text file `lld/lld-2018June4`. I'll remove that file for you.</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jun 6, 2018 at 7:01 AM Joel Jones 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: joel_k_jones<br>
Date: Wed Jun  6 06:56:51 2018<br>
New Revision: 334095<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=334095&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=334095&view=rev</a><br>
Log:<br>
[lld] Add REQUIRES: x86 where needed to tests<br>
<br>
If building lld without x86 support, tests that require that support should<br>
be treated as unsupported, not errors.<br>
<br>
Tested using:<br>
  1. cmake '-DLLVM_TARGETS_TO_BUILD=AArch64;X86'<br>
     make check-lld<br>
     =><br>
     Expected Passes    : 1406<br>
     Unsupported Tests  : 287<br>
<br>
  2. cmake '-DLLVM_TARGETS_TO_BUILD=AArch64'<br>
     make check-lld<br>
     =><br>
     Expected Passes    : 410<br>
     Unsupported Tests  : 1283<br>
<br>
Patch by Joel Jones<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D47748" rel="noreferrer" target="_blank">https://reviews.llvm.org/D47748</a><br>
<br>
Added:<br>
    lld/trunk/lld-2018June4<br>
Modified:<br>
    lld/trunk/test/COFF/associative-comdat.s<br>
    lld/trunk/test/COFF/dll.test<br>
    lld/trunk/test/COFF/dllexport-mingw.s<br>
    lld/trunk/test/COFF/duplicate.test<br>
    lld/trunk/test/COFF/export-all.s<br>
    lld/trunk/test/COFF/gfids-corrupt.s<br>
    lld/trunk/test/COFF/gfids-fallback.s<br>
    lld/trunk/test/COFF/gfids-gc.s<br>
    lld/trunk/test/COFF/gfids-icf.s<br>
    lld/trunk/test/COFF/guard-longjmp.s<br>
    lld/trunk/test/COFF/guardcf-lto.ll<br>
    lld/trunk/test/COFF/icf-executable.s<br>
    lld/trunk/test/COFF/icf-pdata.s<br>
    lld/trunk/test/COFF/icf-xdata.s<br>
    lld/trunk/test/COFF/implib-name.test<br>
    lld/trunk/test/COFF/loadcfg.ll<br>
    lld/trunk/test/COFF/lto-chkstk.ll<br>
    lld/trunk/test/COFF/lto-comdat.ll<br>
    lld/trunk/test/COFF/lto-icf.ll<br>
    lld/trunk/test/COFF/lto-lazy-reference.ll<br>
    lld/trunk/test/COFF/lto-linker-opts.ll<br>
    lld/trunk/test/COFF/lto-new-symbol.ll<br>
    lld/trunk/test/COFF/lto-opt-level.ll<br>
    lld/trunk/test/COFF/lto-parallel.ll<br>
    lld/trunk/test/COFF/lto-reloc-model.ll<br>
    lld/trunk/test/COFF/lto.ll<br>
    lld/trunk/test/COFF/pdb-global-gc.yaml<br>
    lld/trunk/test/COFF/reloc-discarded-dwarf.s<br>
    lld/trunk/test/COFF/reloc-discarded-early.s<br>
    lld/trunk/test/COFF/reloc-discarded-early2.s<br>
    lld/trunk/test/COFF/reloc-discarded.s<br>
    lld/trunk/test/COFF/reloc-x64.test<br>
    lld/trunk/test/COFF/reloc-x86.test<br>
    lld/trunk/test/COFF/safeseh-md.s<br>
    lld/trunk/test/COFF/safeseh-notable.s<br>
    lld/trunk/test/COFF/safeseh.s<br>
    lld/trunk/test/COFF/secidx-absolute.s<br>
    lld/trunk/test/COFF/secrel-absolute.s<br>
    lld/trunk/test/COFF/secrel-common.s<br>
    lld/trunk/test/COFF/undefined-symbol-cv.s<br>
    lld/trunk/test/COFF/undefined-symbol.s<br>
    lld/trunk/test/COFF/weak-external.test<br>
    lld/trunk/test/COFF/weak-external2.test<br>
    lld/trunk/test/COFF/weak-external3.test<br>
    lld/trunk/test/COFF/wholearchive.s<br>
    lld/trunk/test/ELF/bsymbolic-undef.s<br>
    lld/trunk/test/ELF/bsymbolic.s<br>
    lld/trunk/test/ELF/comdat-linkonce.s<br>
    lld/trunk/test/ELF/compatible-section-types.s<br>
    lld/trunk/test/ELF/conflict-debug-variable.s<br>
    lld/trunk/test/ELF/conflict-debug-variable2.s<br>
    lld/trunk/test/ELF/conflict-variable-linkage-name.s<br>
    lld/trunk/test/ELF/copy-rel-corrupted.s<br>
    lld/trunk/test/ELF/copy-rel-pie-error.s<br>
    lld/trunk/test/ELF/copy-rel-pie.s<br>
    lld/trunk/test/ELF/defined-tls_get_addr.s<br>
    lld/trunk/test/ELF/dont-export-hidden.s<br>
    lld/trunk/test/ELF/duplicated-synthetic-sym.s<br>
    lld/trunk/test/ELF/dynamic-reloc-index.s<br>
    lld/trunk/test/ELF/eh-frame-marker.s<br>
    lld/trunk/test/ELF/eh-frame-multilpe-cie.s<br>
    lld/trunk/test/ELF/empty-archive.s<br>
    lld/trunk/test/ELF/entry.s<br>
    lld/trunk/test/ELF/filter.s<br>
    lld/trunk/test/ELF/gc-debuginfo-tls.s<br>
    lld/trunk/test/ELF/gc-merge-local-sym.s<br>
    lld/trunk/test/ELF/gc-sections-merge-addend.s<br>
    lld/trunk/test/ELF/gc-sections-merge-implicit-addend.s<br>
    lld/trunk/test/ELF/gc-sections-merge.s<br>
    lld/trunk/test/ELF/gc-sections-protected.s<br>
    lld/trunk/test/ELF/global_offset_table.s<br>
    lld/trunk/test/ELF/global_offset_table_shared.s<br>
    lld/trunk/test/ELF/got-plt-header.s<br>
    lld/trunk/test/ELF/gotpcrelx.s<br>
    lld/trunk/test/ELF/i386-got-value.s<br>
    lld/trunk/test/ELF/i386-tls-ie-shared.s<br>
    lld/trunk/test/ELF/incompatible-section-flags.s<br>
    lld/trunk/test/ELF/incompatible-section-types2.s<br>
    lld/trunk/test/ELF/invalid/invalid-elf.test<br>
    lld/trunk/test/ELF/linkerscript/discard-interp.test<br>
    lld/trunk/test/ELF/linkerscript/openbsd-bootdata.test<br>
    lld/trunk/test/ELF/linkerscript/openbsd-randomize.s<br>
    lld/trunk/test/ELF/linkerscript/openbsd-wxneeded.test<br>
    lld/trunk/test/ELF/local-got-pie.s<br>
    lld/trunk/test/ELF/local-got-shared.s<br>
    lld/trunk/test/ELF/local-got.s<br>
    lld/trunk/test/ELF/map-gc-sections.s<br>
    lld/trunk/test/ELF/pr34872.s<br>
    lld/trunk/test/ELF/pr36475.s<br>
    lld/trunk/test/ELF/relocation-size-shared.s<br>
    lld/trunk/test/ELF/relocation-size.s<br>
    lld/trunk/test/ELF/relro-omagic.s<br>
    lld/trunk/test/ELF/rodynamic.s<br>
    lld/trunk/test/ELF/section-symbol.s<br>
    lld/trunk/test/ELF/shared-lazy.s<br>
    lld/trunk/test/ELF/sht-group-gold-r.test<br>
    lld/trunk/test/ELF/soname.s<br>
    lld/trunk/test/ELF/soname2.s<br>
    lld/trunk/test/ELF/string-gc.s<br>
    lld/trunk/test/ELF/symbol-override.s<br>
    lld/trunk/test/ELF/text-section-prefix.s<br>
    lld/trunk/test/ELF/tls-got.s<br>
    lld/trunk/test/ELF/tls-opt-gdie.s<br>
    lld/trunk/test/ELF/tls-opt-gdiele-i686.s<br>
    lld/trunk/test/ELF/tls-opt-i686.s<br>
    lld/trunk/test/ELF/tls-opt-iele-i686-nopic.s<br>
    lld/trunk/test/ELF/tls-opt-local.s<br>
    lld/trunk/test/ELF/tls-opt-no-plt.s<br>
    lld/trunk/test/ELF/tls-opt.s<br>
    lld/trunk/test/ELF/trace-symbols.s<br>
    lld/trunk/test/ELF/undef-shared.s<br>
    lld/trunk/test/ELF/undef-shared2.s<br>
    lld/trunk/test/ELF/undef-version-script.s<br>
    lld/trunk/test/ELF/user_def_init_array_start.s<br>
    lld/trunk/test/ELF/version-script-no-warn2.s<br>
    lld/trunk/test/ELF/x86-64-reloc-range.s<br>
    lld/trunk/test/ELF/zdefs.s<br>
<br>
Added: lld/trunk/lld-2018June4<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lld-2018June4?rev=334095&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lld-2018June4?rev=334095&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/lld-2018June4 (added)<br>
+++ lld/trunk/lld-2018June4 Wed Jun  6 06:56:51 2018<br>
@@ -0,0 +1,5797 @@<br>
+Index: test/COFF/associative-comdat.s<br>
+===================================================================<br>
+--- test/COFF/associative-comdat.s     (revision 333896)<br>
++++ test/COFF/associative-comdat.s     (working copy)<br>
+@@ -1,47 +1,48 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t1.obj<br>
+ # RUN: llvm-mc -triple=x86_64-windows-msvc %S/Inputs/associative-comdat-2.s -filetype=obj -o %t2.obj<br>
+ <br>
+ # RUN: lld-link -entry:main %t1.obj %t2.obj -out:%t.gc.exe<br>
+ # RUN: llvm-readobj -sections %t.gc.exe | FileCheck %s<br>
+ <br>
+ # RUN: lld-link -entry:main %t1.obj %t2.obj -opt:noref -out:%t.nogc.exe<br>
+ # RUN: llvm-readobj -sections %t.nogc.exe | FileCheck %s<br>
+ <br>
+ # CHECK: Sections [<br>
+ # CHECK:   Section {<br>
+ # CHECK:     Number: 2<br>
+ # CHECK-LABEL:     Name: .rdata (2E 72 64 61 74 61 00 00)<br>
+ #             This is the critical check to show that only *one* definition of<br>
+ #             foo_assoc was retained. This *must* be 8, not 16.<br>
+ # CHECK-NEXT:     VirtualSize: 0x8<br>
+ # CHECK:   Section {<br>
+ # CHECK:     Number: 3<br>
+ # CHECK-LABEL:     Name: .data (2E 64 61 74 61 00 00 00)<br>
+ # CHECK-NEXT:     VirtualSize: 0x4<br>
+ <br>
+         .text<br>
+         .def     main;<br>
+         .scl    2;<br>
+         .type   32;<br>
+         .endef<br>
+         .globl  main                    # -- Begin function main<br>
+         .p2align        4, 0x90<br>
+ main:                                   # @main<br>
+ # BB#0:<br>
+         movl    foo(%rip), %eax<br>
+         retq<br>
+                                         # -- End function<br>
+ <br>
+ # Defines foo and foo_assoc globals. foo is comdat, and foo_assoc is comdat<br>
+ # associative with it. foo_assoc should be discarded iff foo is discarded,<br>
+ # either by linker GC or normal comdat merging.<br>
+ <br>
+         .section        .rdata,"dr",associative,foo<br>
+         .p2align        3<br>
+         .quad   foo<br>
+ <br>
+         .section        .data,"dw",discard,foo<br>
+         .globl  foo                     # @foo<br>
+         .p2align        2<br>
+ foo:<br>
+         .long   42<br>
+Index: test/COFF/dll.test<br>
+===================================================================<br>
+--- test/COFF/dll.test (revision 333896)<br>
++++ test/COFF/dll.test (working copy)<br>
+@@ -1,50 +1,51 @@<br>
++# REQUIRES: x86<br>
+ # RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj<br>
+ # RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2 \<br>
+ # RUN:   /export:mangled<br>
+ # RUN: llvm-objdump -p %t.dll | FileCheck -check-prefix=EXPORT %s<br>
+ <br>
+ EXPORT:      Export Table:<br>
+ EXPORT:      DLL name: dll.test.tmp.dll<br>
+ EXPORT:      Ordinal      RVA  Name<br>
+ EXPORT-NEXT:       0        0<br>
+ EXPORT-NEXT:       1   0x1008  exportfn1<br>
+ EXPORT-NEXT:       2   0x1010  exportfn2<br>
+ EXPORT-NEXT:       3   0x1010  exportfn3<br>
+ EXPORT-NEXT:       4   0x1010  mangled<br>
+ <br>
+ # RUN: yaml2obj < %p/Inputs/export2.yaml > %t5.obj<br>
+ # RUN: rm -f %t5.lib<br>
+ # RUN: llvm-ar cru %t5.lib %t5.obj<br>
+ # RUN: lld-link /out:%t5.dll /dll %t.obj %t5.lib /export:mangled2<br>
+ # RUN: llvm-objdump -p %t5.dll | FileCheck -check-prefix=EXPORT2 %s<br>
+ <br>
+ EXPORT2:      Export Table:<br>
+ EXPORT2:      DLL name: dll.test.tmp5.dll<br>
+ EXPORT2:      Ordinal      RVA  Name<br>
+ EXPORT2-NEXT:       0        0<br>
+ EXPORT2-NEXT:       1   0x1010  exportfn3<br>
+ EXPORT2-NEXT:       2   0x101c  mangled2<br>
+ <br>
+ # RUN: llvm-as -o %t.lto.obj %p/Inputs/export.ll<br>
+ # RUN: lld-link -opt:noicf /out:%t.lto.dll /dll %t.lto.obj /export:exportfn1 /export:exportfn2<br>
+ # RUN: llvm-objdump -p %t.lto.dll | FileCheck -check-prefix=EXPORT-LTO %s<br>
+ <br>
+ EXPORT-LTO:      Export Table:<br>
+ EXPORT-LTO:      DLL name: dll.test.tmp.lto.dll<br>
+ EXPORT-LTO:      Ordinal      RVA  Name<br>
+ EXPORT-LTO-NEXT:       0        0<br>
+ EXPORT-LTO-NEXT:       1   0x1010  exportfn1<br>
+ EXPORT-LTO-NEXT:       2   0x1020  exportfn2<br>
+ EXPORT-LTO-NEXT:       3   0x1030  exportfn3<br>
+ <br>
+ # RUN: lld-link /out:%t.dll /dll %t.obj /implib:%t2.lib \<br>
+ # RUN:   /export:exportfn1 /export:exportfn2<br>
+ # RUN: yaml2obj < %p/Inputs/import.yaml > %t2.obj<br>
+ # RUN: lld-link /out:%t2.exe /entry:main %t2.obj %t2.lib<br>
+ # RUN: llvm-readobj -coff-imports %t2.exe | FileCheck -check-prefix=IMPORT %s<br>
+ <br>
+ # RUN: lld-link /out:%t2.lto.exe /entry:main %t2.obj %t.lto.lib<br>
+ # RUN: llvm-readobj -coff-imports %t2.lto.exe | FileCheck -check-prefix=IMPORT %s<br>
+ <br>
+ IMPORT: Symbol: exportfn1<br>
+ IMPORT: Symbol: exportfn2<br>
+Index: test/COFF/dllexport-mingw.s<br>
+===================================================================<br>
+--- test/COFF/dllexport-mingw.s        (revision 333896)<br>
++++ test/COFF/dllexport-mingw.s        (working copy)<br>
+@@ -1,24 +1,24 @@<br>
+-# REQEUIRES: x86<br>
++# REQUIRES: x86<br>
+ <br>
+ # RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj<br>
+ <br>
+ # RUN: lld-link -lldmingw -dll -out:%t.dll -entry:main %t.obj -implib:%t.lib<br>
+ # RUN: llvm-readobj %t.lib | FileCheck %s<br>
+ <br>
+ # CHECK: Symbol: __imp___underscoredFunc<br>
+ # CHECK: Symbol: __underscoredFunc<br>
+ # CHECK: Symbol: __imp__func<br>
+ # CHECK: Symbol: _func<br>
+ <br>
+ .global _main<br>
+ .global _func<br>
+ .global __underscoredFunc<br>
+ .text<br>
+ _main:<br>
+   ret<br>
+ _func:<br>
+   ret<br>
+ __underscoredFunc:<br>
+   ret<br>
+ .section .drectve<br>
+ .ascii "-export:func -export:_underscoredFunc"<br>
+Index: test/COFF/duplicate.test<br>
+===================================================================<br>
+--- test/COFF/duplicate.test   (revision 333896)<br>
++++ test/COFF/duplicate.test   (working copy)<br>
+@@ -1,12 +1,13 @@<br>
++# REQUIRES: x86<br>
+ RUN: llc -mtriple x86_64-windows-msvc -filetype obj -o alpha.obj %S/Inputs/alpha.ll<br>
+ RUN: llc -mtriple x86_64-windows-msvc -filetype obj -o beta.obj %S/Inputs/beta.ll<br>
+ RUN: lld-link /out:alpha.dll /dll alpha.obj /implib:alpha.lib<br>
+ RUN: not lld-link /out:beta.dll /dll alpha.obj beta.obj alpha.lib 2>&1 | FileCheck %s -check-prefix CHECK-ALPHA<br>
+ <br>
+ CHECK-ALPHA: error: duplicate symbol: f in {{.*}}alpha.obj and in alpha.dll<br>
+ <br>
+ RUN: llc -mtriple x86_64-windows-msvc -filetype obj -o gamma.obj %S/Inputs/gamma.ll<br>
+ RUN: not lld-link /out:gamma.exe /subsystem:console /entry:mainCRTStartup gamma.obj alpha.lib 2>&1 | FileCheck %s -check-prefix CHECK-GAMMA<br>
+ <br>
+ CHECK-GAMMA: error: duplicate symbol: __imp_f in {{.*}}gamma.obj and in alpha.dll<br>
+ <br>
+Index: test/COFF/export-all.s<br>
+===================================================================<br>
+--- test/COFF/export-all.s     (revision 333896)<br>
++++ test/COFF/export-all.s     (working copy)<br>
+@@ -1,86 +1,86 @@<br>
+-# REQEUIRES: x86<br>
++# REQUIRES: x86<br>
+ <br>
+ # RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj<br>
+ <br>
+ # RUN: lld-link -lldmingw -dll -out:%t.dll -entry:DllMainCRTStartup@12 %t.obj -implib:%t.lib<br>
+ # RUN: llvm-readobj -coff-exports %t.dll | FileCheck %s<br>
+ # RUN: llvm-readobj %t.lib | FileCheck -check-prefix=IMPLIB %s<br>
+ <br>
+ # CHECK-NOT: Name: DllMainCRTStartup<br>
+ # CHECK-NOT: Name: _imp__unexported<br>
+ # CHECK: Name: dataSym<br>
+ # CHECK: Name: foobar<br>
+ # CHECK-NOT: Name: unexported<br>
+ <br>
+ # IMPLIB: Symbol: __imp__dataSym<br>
+ # IMPLIB-NOT: Symbol: _dataSym<br>
+ # IMPLIB: Symbol: __imp__foobar<br>
+ # IMPLIB: Symbol: _foobar<br>
+ <br>
+ .global _foobar<br>
+ .global _DllMainCRTStartup@12<br>
+ .global _dataSym<br>
+ .global _unexported<br>
+ .global __imp__unexported<br>
+ .text<br>
+ _DllMainCRTStartup@12:<br>
+   ret<br>
+ _foobar:<br>
+   ret<br>
+ _unexported:<br>
+   ret<br>
+ .data<br>
+ _dataSym:<br>
+   .int 4<br>
+ __imp__unexported:<br>
+   .int _unexported<br>
+ <br>
+ # Test specifying -export-all-symbols, on an object file that contains<br>
+ # dllexport directive for some of the symbols.<br>
+ <br>
+ # RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj<br>
+ #<br>
+ # RUN: lld-link -out:%t.dll -dll %t.obj -lldmingw -export-all-symbols -output-def:%t.def<br>
+ # RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix=CHECK2 %s<br>
+ # RUN: cat %t.def | FileCheck -check-prefix=CHECK2-DEF %s<br>
+ <br>
+ # Note, this will actually export _DllMainCRTStartup as well, since<br>
+ # it uses the standard spelling in this object file, not the MinGW one.<br>
+ <br>
+ # CHECK2: Name: exportfn1<br>
+ # CHECK2: Name: exportfn2<br>
+ # CHECK2: Name: exportfn3<br>
+ <br>
+ # CHECK2-DEF: EXPORTS<br>
+ # CHECK2-DEF: exportfn1 @3<br>
+ # CHECK2-DEF: exportfn2 @4<br>
+ # CHECK2-DEF: exportfn3 @5<br>
+ <br>
+ # Test ignoring certain object files and libs.<br>
+ <br>
+ # RUN: echo -e ".global foobar\n.global DllMainCRTStartup\n.text\nDllMainCRTStartup:\nret\nfoobar:\ncall mingwfunc\ncall crtfunc\nret\n" > %t.main.s<br>
+ # RUN: llvm-mc -triple=x86_64-windows-gnu %t.main.s -filetype=obj -o %t.main.obj<br>
+ # RUN: mkdir -p %T/libs<br>
+ # RUN: echo -e ".global mingwfunc\n.text\nmingwfunc:\nret\n" > %T/libs/mingwfunc.s<br>
+ # RUN: llvm-mc -triple=x86_64-windows-gnu %T/libs/mingwfunc.s -filetype=obj -o %T/libs/mingwfunc.o<br>
+ # RUN: llvm-ar rcs %T/libs/libmingwex.a %T/libs/mingwfunc.o<br>
+ # RUN: echo -e ".global crtfunc\n.text\ncrtfunc:\nret\n" > %T/libs/crtfunc.s<br>
+ # RUN: llvm-mc -triple=x86_64-windows-gnu %T/libs/crtfunc.s -filetype=obj -o %T/libs/crt2.o<br>
+ # RUN: lld-link -out:%t.dll -dll -entry:DllMainCRTStartup %t.main.obj -lldmingw %T/libs/crt2.o %T/libs/libmingwex.a -output-def:%t.def<br>
+ # RUN: echo "EOF" >> %t.def<br>
+ # RUN: cat %t.def | FileCheck -check-prefix=CHECK-EXCLUDE %s<br>
+ <br>
+ # CHECK-EXCLUDE: EXPORTS<br>
+ # CHECK-EXCLUDE-NEXT: foobar @1<br>
+ # CHECK-EXCLUDE-NEXT: EOF<br>
+ <br>
+ # Test that we handle import libraries together with -opt:noref.<br>
+ <br>
+ # RUN: yaml2obj < %p/Inputs/hello32.yaml > %t.obj<br>
+ # RUN: lld-link -lldmingw -dll -out:%t.dll -entry:main@0 %t.obj -implib:%t.lib -opt:noref %p/Inputs/std32.lib -output-def:%t.def<br>
+ # RUN: echo "EOF" >> %t.def<br>
+ # RUN: cat %t.def | FileCheck -check-prefix=CHECK-IMPLIB %s<br>
+ <br>
+ # CHECK-IMPLIB: EXPORTS<br>
+ # CHECK-IMPLIB-NEXT: main@0 @1<br>
+ # CHECK-IMPLIB-NEXT: EOF<br>
+Index: test/COFF/gfids-corrupt.s<br>
+===================================================================<br>
+--- test/COFF/gfids-corrupt.s  (revision 333896)<br>
++++ test/COFF/gfids-corrupt.s  (working copy)<br>
+@@ -1,83 +1,84 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -opt:noref -guard:nolongjmp -out:%t.exe -entry:main 2>&1 | FileCheck %s --check-prefix=ERRS<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s<br>
+ <br>
+ # ERRS: warning: ignoring .gfids$y symbol table index section in object {{.*}}gfids-corrupt{{.*}}<br>
+ # ERRS: warning: ignoring invalid symbol table index in section .gfids$y in object {{.*}}gfids-corrupt{{.*}}<br>
+ <br>
+ # The table is arbitrary, really.<br>
+ # CHECK: ImageBase: 0x140000000<br>
+ # CHECK: LoadConfig [<br>
+ # CHECK:   SEHandlerTable: 0x0<br>
+ # CHECK:   SEHandlerCount: 0<br>
+ # CHECK:   GuardCFCheckFunction: 0x0<br>
+ # CHECK:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK:   GuardCFFunctionCount: 2<br>
+ # CHECK:   GuardFlags: 0x500<br>
+ # CHECK:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK:   GuardLongJumpTargetTable: 0x0<br>
+ # CHECK:   GuardLongJumpTargetCount: 0<br>
+ # CHECK: ]<br>
+ # CHECK:      GuardFidTable [<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT: ]<br>
+ <br>
+ <br>
+ # Indicate that gfids are present.<br>
+         .def     @feat.00; .scl    3; .type   0; .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0x800<br>
+ <br>
+         .def     f1; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,f1<br>
+         .global f1<br>
+ f1:<br>
+         movl $42, %eax<br>
+         retq<br>
+ <br>
+         .def     f2; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,f2<br>
+         .global f2<br>
+ f2:<br>
+         movl $13, %eax<br>
+         retq<br>
+ <br>
+         .section        .data,"dw",one_only,fp1<br>
+         .globl  fp1<br>
+ fp1:<br>
+         .quad   f1<br>
+ <br>
+         .section        .data,"dw",one_only,fp2<br>
+         .globl  fp2<br>
+ fp2:<br>
+         .quad   f2<br>
+ <br>
+         .section        .gfids$y,"dr",associative,fp1<br>
+         .symidx f1<br>
+         .byte 0<br>
+ <br>
+         .section        .gfids$y,"dr",associative,fp2<br>
+         .symidx f2<br>
+         .long 0x400<br>
+ <br>
+         .def     main; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,main<br>
+         .globl  main<br>
+ main:<br>
+         callq      *fp1(%rip)<br>
+         callq      *fp2(%rip)<br>
+         xor %eax, %eax<br>
+         retq<br>
+ <br>
+         .section .rdata,"dr"<br>
+ .globl _load_config_used<br>
+ _load_config_used:<br>
+         .long 256<br>
+         .fill 124, 1, 0<br>
+         .quad __guard_fids_table<br>
+         .quad __guard_fids_count<br>
+         .long __guard_flags<br>
+         .fill 128, 1, 0<br>
+Index: test/COFF/gfids-fallback.s<br>
+===================================================================<br>
+--- test/COFF/gfids-fallback.s (revision 333896)<br>
++++ test/COFF/gfids-fallback.s (working copy)<br>
+@@ -1,96 +1,97 @@<br>
++# REQUIRES: x86<br>
+ # RUN: grep -B99999 [S]PLITMARKER %s | llvm-mc -triple x86_64-windows-msvc -filetype=obj -o %t1.obj<br>
+ # RUN: grep -A99999 [S]PLITMARKER %s | llvm-mc -triple x86_64-windows-msvc -filetype=obj -o %t2.obj<br>
+ # RUN: lld-link %t1.obj %t2.obj -guard:nolongjmp -out:%t.exe -entry:main -opt:noref<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s<br>
+ <br>
+ # CHECK: ImageBase: 0x140000000<br>
+ # CHECK: LoadConfig [<br>
+ # CHECK:   SEHandlerTable: 0x0<br>
+ # CHECK:   SEHandlerCount: 0<br>
+ # CHECK:   GuardCFCheckFunction: 0x0<br>
+ # CHECK:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK:   GuardCFFunctionCount: 3<br>
+ # CHECK:   GuardFlags: 0x500<br>
+ # CHECK:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK:   GuardLongJumpTargetTable: 0x0<br>
+ # CHECK:   GuardLongJumpTargetCount: 0<br>
+ # CHECK: ]<br>
+ # CHECK:      GuardFidTable [<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT: ]<br>
+ <br>
+ <br>
+ # Indicate that no gfids are present. All symbols used by relocations in this<br>
+ # file will be considered address-taken.<br>
+         .def     @feat.00; .scl    3; .type   0; .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0<br>
+ <br>
+         .def     main; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,main<br>
+         .globl  main<br>
+ main:<br>
+         subq $8, %rsp<br>
+         leaq foo(%rip), %rdx<br>
+         callq bar<br>
+         movl $0, %eax<br>
+         addq $8, %rsp<br>
+         retq<br>
+ <br>
+ # Should not appear in gfids table.<br>
+         .def     baz; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,baz<br>
+         .globl  baz<br>
+ baz:<br>
+         mov $1, %eax<br>
+         retq<br>
+ <br>
+         .def     qux; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,qux<br>
+         .globl  qux<br>
+ qux:<br>
+         mov $2, %eax<br>
+         retq<br>
+ <br>
+         .def     quxx; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,quxx<br>
+         .globl  quxx<br>
+ quxx:<br>
+         mov $3, %eax<br>
+         retq<br>
+ <br>
+ # Load config.<br>
+         .section .rdata,"dr"<br>
+ .globl _load_config_used<br>
+ _load_config_used:<br>
+         .long 256<br>
+         .fill 124, 1, 0<br>
+         .quad __guard_fids_table<br>
+         .quad __guard_fids_count<br>
+         .long __guard_flags<br>
+         .fill 128, 1, 0<br>
+ <br>
+ # SPLITMARKER<br>
+ <br>
+ # Indicate that gfids are present. This file does not take any addresses.<br>
+         .def     @feat.00; .scl    3; .type   0; .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0x800<br>
+ <br>
+         .def     foo; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,foo<br>
+         .global foo<br>
+ foo:<br>
+         movl $42, %eax<br>
+         retq<br>
+ <br>
+         .def     bar; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,bar<br>
+         .global bar<br>
+ bar:<br>
+         movl $13, %eax<br>
+         retq<br>
+Index: test/COFF/gfids-gc.s<br>
+===================================================================<br>
+--- test/COFF/gfids-gc.s       (revision 333896)<br>
++++ test/COFF/gfids-gc.s       (working copy)<br>
+@@ -1,130 +1,131 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -guard:nolongjmp -out:%t.exe -opt:noref -entry:main<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK-NOGC<br>
+ # RUN: lld-link %t.obj -guard:nolongjmp -out:%t.exe -opt:noref -entry:main -debug:dwarf<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK-NOGC<br>
+ # RUN: lld-link %t.obj -guard:nolongjmp -out:%t.exe -opt:ref -entry:main<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK-GC<br>
+ <br>
+ # This assembly is meant to mimic what CL emits for this kind of C code when<br>
+ # /Gw (-fdata-sections) is enabled:<br>
+ # int f() { return 42; }<br>
+ # int g() { return 13; }<br>
+ # int (*fp1)() = &f;<br>
+ # int (*fp2)() = &g;<br>
+ # int main() {<br>
+ #   return fp1();<br>
+ # }<br>
+ # Compile with 'cl -c -guard:cf -Gw -O1' and note the two associative .gfids$y<br>
+ # sections.<br>
+ <br>
+ # Expect 3 entries: main, f, and g.<br>
+ <br>
+ # CHECK-NOGC: ImageBase: 0x140000000<br>
+ # CHECK-NOGC: LoadConfig [<br>
+ # CHECK-NOGC:   SEHandlerTable: 0x0<br>
+ # CHECK-NOGC:   SEHandlerCount: 0<br>
+ # CHECK-NOGC:   GuardCFCheckFunction: 0x0<br>
+ # CHECK-NOGC:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK-NOGC:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK-NOGC:   GuardCFFunctionCount: 3<br>
+ # CHECK-NOGC:   GuardFlags: 0x500<br>
+ # CHECK-NOGC:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK-NOGC:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK-NOGC:   GuardLongJumpTargetTable: 0x0<br>
+ # CHECK-NOGC:   GuardLongJumpTargetCount: 0<br>
+ # CHECK-NOGC: ]<br>
+ # CHECK-NOGC:      GuardFidTable [<br>
+ # CHECK-NOGC-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NOGC-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NOGC-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NOGC-NEXT: ]<br>
+ <br>
+ # Expect 2 entries: main and f. fp2 was discarded, so g was only used as a<br>
+ # direct call target.<br>
+ <br>
+ # CHECK-GC: ImageBase: 0x140000000<br>
+ # CHECK-GC: LoadConfig [<br>
+ # CHECK-GC:   SEHandlerTable: 0x0<br>
+ # CHECK-GC:   SEHandlerCount: 0<br>
+ # CHECK-GC:   GuardCFCheckFunction: 0x0<br>
+ # CHECK-GC:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK-GC:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK-GC:   GuardCFFunctionCount: 2<br>
+ # CHECK-GC:   GuardFlags: 0x500<br>
+ # CHECK-GC:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK-GC:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK-GC:   GuardLongJumpTargetTable: 0x0<br>
+ # CHECK-GC:   GuardLongJumpTargetCount: 0<br>
+ # CHECK-GC: ]<br>
+ # CHECK-GC:      GuardFidTable [<br>
+ # CHECK-GC-NEXT:   0x14000{{.*}}<br>
+ # CHECK-GC-NEXT:   0x14000{{.*}}<br>
+ # CHECK-GC-NEXT: ]<br>
+ <br>
+ <br>
+ # We need @feat.00 to have 0x800 to indicate .gfids are present.<br>
+         .def     @feat.00;<br>
+         .scl    3;<br>
+         .type   0;<br>
+         .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0x801<br>
+ <br>
+         .def     main;<br>
+         .scl    2;<br>
+         .type   32;<br>
+         .endef<br>
+         .section        .text,"xr",one_only,main<br>
+         .globl  main<br>
+ main:<br>
+         # Call g directly so that it is not dead stripped.<br>
+         callq g<br>
+         rex64 jmpq      *fp1(%rip)<br>
+ <br>
+         .def     f;<br>
+         .scl    3;<br>
+         .type   32;<br>
+         .endef<br>
+         .section        .text,"xr",one_only,f<br>
+ f:<br>
+         movl $42, %eax<br>
+         retq<br>
+ <br>
+         .section        .data,"dw",one_only,fp1<br>
+         .globl  fp1<br>
+ fp1:<br>
+         .quad   f<br>
+ <br>
+         .section        .gfids$y,"dr",associative,fp1<br>
+         .symidx f<br>
+ <br>
+ # Section GC will remove the following, so 'g' should not be present in the<br>
+ # guard fid table.<br>
+ <br>
+         .def     g;<br>
+         .scl    3;<br>
+         .type   32;<br>
+         .endef<br>
+         .section        .text,"xr",one_only,g<br>
+ g:<br>
+         movl $13, %eax<br>
+         retq<br>
+ <br>
+         .section        .data,"dw",one_only,fp2<br>
+         .globl  fp2<br>
+ fp2:<br>
+         .quad   g<br>
+ <br>
+         .section        .gfids$y,"dr",associative,fp2<br>
+         .symidx g<br>
+ <br>
+         .section .rdata,"dr"<br>
+ .globl _load_config_used<br>
+ _load_config_used:<br>
+         .long 256<br>
+         .fill 124, 1, 0<br>
+         .quad __guard_fids_table<br>
+         .quad __guard_fids_count<br>
+         .long __guard_flags<br>
+         .fill 128, 1, 0<br>
+Index: test/COFF/gfids-icf.s<br>
+===================================================================<br>
+--- test/COFF/gfids-icf.s      (revision 333896)<br>
++++ test/COFF/gfids-icf.s      (working copy)<br>
+@@ -1,87 +1,88 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -guard:nolongjmp -out:%t.exe -opt:icf -entry:main<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK<br>
+ <br>
+ # This assembly is meant to mimic what CL emits for this kind of C code:<br>
+ # int icf1() { return 42; }<br>
+ # int icf2() { return 42; }<br>
+ # int (*fp1)() = &icf1;<br>
+ # int (*fp2)() = &icf2;<br>
+ # int main() {<br>
+ #   return fp1();<br>
+ #   return fp2();<br>
+ # }<br>
+ <br>
+ # 'icf1' and 'icf2' are address taken, but should be merged into one entry.<br>
+ # There are two entries in the table because 'main' is included.<br>
+ <br>
+ # CHECK: ImageBase: 0x140000000<br>
+ # CHECK: LoadConfig [<br>
+ # CHECK:   SEHandlerTable: 0x0<br>
+ # CHECK:   SEHandlerCount: 0<br>
+ # CHECK:   GuardCFCheckFunction: 0x0<br>
+ # CHECK:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK:   GuardCFFunctionCount: 2<br>
+ # CHECK:   GuardFlags: 0x500<br>
+ # CHECK:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK:   GuardLongJumpTargetTable: 0x0<br>
+ # CHECK:   GuardLongJumpTargetCount: 0<br>
+ # CHECK: ]<br>
+ # CHECK:      GuardFidTable [<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT: ]<br>
+ <br>
+ <br>
+ # Indicate that gfids are present.<br>
+         .def     @feat.00; .scl    3; .type   0; .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0x800<br>
+ <br>
+         .def     icf1; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,icf1<br>
+         .global icf1<br>
+ icf1:<br>
+         movl $42, %eax<br>
+         retq<br>
+ <br>
+         .def     icf2; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,icf2<br>
+         .global icf2<br>
+ icf2:<br>
+         movl $42, %eax<br>
+         retq<br>
+ <br>
+ # Take their two addresses.<br>
+         .data<br>
+         .globl  fp1<br>
+ fp1:<br>
+         .quad   icf1<br>
+         .globl  fp2<br>
+ fp2:<br>
+         .quad   icf2<br>
+ <br>
+         .section        .gfids$y,"dr"<br>
+         .symidx icf1<br>
+         .symidx icf2<br>
+ <br>
+         .def     main; .scl    2; .type   32; .endef<br>
+         .section        .text,"xr",one_only,main<br>
+         .globl  main<br>
+ main:<br>
+         callq      *fp1(%rip)<br>
+         callq      *fp2(%rip)<br>
+         xor %eax, %eax<br>
+         retq<br>
+ <br>
+         .section .rdata,"dr"<br>
+ .globl _load_config_used<br>
+ _load_config_used:<br>
+         .long 256<br>
+         .fill 124, 1, 0<br>
+         .quad __guard_fids_table<br>
+         .quad __guard_fids_count<br>
+         .long __guard_flags<br>
+         .fill 128, 1, 0<br>
+Index: test/COFF/guard-longjmp.s<br>
+===================================================================<br>
+--- test/COFF/guard-longjmp.s  (revision 333896)<br>
++++ test/COFF/guard-longjmp.s  (working copy)<br>
+@@ -1,103 +1,104 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main<br>
+ # RUN: llvm-readobj -file-headers -coff-load-config %t.exe | FileCheck %s<br>
+ <br>
+ # CHECK: ImageBase: 0x140000000<br>
+ # CHECK: LoadConfig [<br>
+ # CHECK:   SEHandlerTable: 0x0<br>
+ # CHECK:   SEHandlerCount: 0<br>
+ # CHECK:   GuardCFCheckFunction: 0x0<br>
+ # CHECK:   GuardCFCheckDispatch: 0x0<br>
+ # CHECK:   GuardCFFunctionTable: 0x14000{{.*}}<br>
+ # CHECK:   GuardCFFunctionCount: 1<br>
+ # CHECK:   GuardFlags: 0x10500<br>
+ # CHECK:   GuardAddressTakenIatEntryTable: 0x0<br>
+ # CHECK:   GuardAddressTakenIatEntryCount: 0<br>
+ # CHECK:   GuardLongJumpTargetTable: 0x14000{{.*}}<br>
+ # CHECK:   GuardLongJumpTargetCount: 1<br>
+ # CHECK: ]<br>
+ # CHECK:      GuardLJmpTable [<br>
+ # CHECK-NEXT:   0x14000{{.*}}<br>
+ # CHECK-NEXT: ]<br>
+ <br>
+ <br>
+ # This assembly is reduced from C code like:<br>
+ # #include <setjmp.h><br>
+ # jmp_buf buf;<br>
+ # void g() { longjmp(buf, 1); }<br>
+ # void f() {<br>
+ #   if (setjmp(buf))<br>
+ #     return;<br>
+ #   g();<br>
+ # }<br>
+ # int main() { f(); }<br>
+ <br>
+ # We need @feat.00 to have 0x800 to indicate /guard:cf.<br>
+         .def     @feat.00;<br>
+         .scl    3;<br>
+         .type   0;<br>
+         .endef<br>
+         .globl  @feat.00<br>
+ @feat.00 = 0x801<br>
+         .def     f; .scl    2; .type   32; .endef<br>
+         .globl  f<br>
+ f:<br>
+         pushq   %rbp<br>
+         subq    $32, %rsp<br>
+         leaq    32(%rsp), %rbp<br>
+         leaq    buf(%rip), %rcx<br>
+         leaq    -32(%rbp), %rdx<br>
+         callq   _setjmp<br>
+ .Lljmp1:<br>
+         testl   %eax, %eax<br>
+         je      .LBB1_1<br>
+         addq    $32, %rsp<br>
+         popq    %rbp<br>
+         retq<br>
+ .LBB1_1:                                # %if.end<br>
+         leaq    buf(%rip), %rcx<br>
+         movl    $1, %edx<br>
+         callq   longjmp<br>
+         ud2<br>
+ <br>
+         # Record the longjmp target.<br>
+         .section        .gljmp$y,"dr"<br>
+         .symidx .Lljmp1<br>
+         .text<br>
+ <br>
+         # Provide setjmp/longjmp stubs.<br>
+         .def     _setjmp; .scl    2; .type   32; .endef<br>
+         .globl  _setjmp<br>
+ _setjmp:<br>
+         retq<br>
+ <br>
+         .def     longjmp; .scl    2; .type   32; .endef<br>
+         .globl  longjmp<br>
+ longjmp:<br>
+         retq<br>
+ <br>
+         .def     main; .scl    2; .type   32; .endef<br>
+         .globl  main                    # -- Begin function main<br>
+ main:                                   # @main<br>
+         subq    $40, %rsp<br>
+         callq   f<br>
+         xorl    %eax, %eax<br>
+         addq    $40, %rsp<br>
+         retq<br>
+ <br>
+         .comm   buf,256,4               # @buf<br>
+ <br>
+         .section .rdata,"dr"<br>
+ .globl _load_config_used<br>
+ _load_config_used:<br>
+         .long 256<br>
+         .fill 124, 1, 0<br>
+         .quad __guard_fids_table<br>
+         .quad __guard_fids_count<br>
+         .long __guard_flags<br>
+         .fill 12, 1, 0<br>
+         .quad __guard_iat_table<br>
+         .quad __guard_iat_count<br>
+         .quad __guard_longjmp_table<br>
+         .quad __guard_fids_count<br>
+         .fill 84, 1, 0<br>
+Index: test/COFF/guardcf-lto.ll<br>
+===================================================================<br>
+--- test/COFF/guardcf-lto.ll   (revision 333896)<br>
++++ test/COFF/guardcf-lto.ll   (working copy)<br>
+@@ -1,39 +1,40 @@<br>
++; REQUIRES: x86<br>
+ ; Set up an import library for a DLL that will do the indirect call.<br>
+ ; RUN: echo -e 'LIBRARY library\nEXPORTS\n  do_indirect_call\n' > %t.def<br>
+ ; RUN: lld-link -lib -def:%t.def -out:%t.lib -machine:x64<br>
+ <br>
+ ; Generate an object that will have the load configuration normally provided by<br>
+ ; the CRT.<br>
+ ; RUN: llvm-mc -triple x86_64-windows-msvc -filetype=obj %S/Inputs/loadconfig-cfg-x64.s -o %t.ldcfg.obj<br>
+ <br>
+ ; RUN: llvm-as %s -o %t.bc<br>
+ ; RUN: lld-link -entry:main -guard:cf -dll %t.bc %t.lib %t.ldcfg.obj -out:%t.dll<br>
+ ; RUN: llvm-readobj -coff-load-config %t.dll | FileCheck %s<br>
+ <br>
+ ; There must be *two* entries in the table: DLL entry point, and my_handler.<br>
+ <br>
+ ; CHECK:      LoadConfig [<br>
+ ; CHECK:        GuardCFFunctionTable: 0x{{[^0].*}}<br>
+ ; CHECK-NEXT:   GuardCFFunctionCount: 2<br>
+ ; CHECK-NEXT:   GuardFlags: 0x10500<br>
+ ; CHECK:      ]<br>
+ ; CHECK:      GuardFidTable [<br>
+ ; CHECK-NEXT:   0x180{{.*}}<br>
+ ; CHECK-NEXT:   0x180{{.*}}<br>
+ ; CHECK-NEXT: ]<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc19.12.25835"<br>
+ <br>
+ declare dllimport void @do_indirect_call(void ()*)<br>
+ <br>
+ define dso_local i32 @main() local_unnamed_addr {<br>
+ entry:<br>
+   tail call void @do_indirect_call(void ()* nonnull @my_handler)<br>
+   ret i32 0<br>
+ }<br>
+ <br>
+ define dso_local void @my_handler() {<br>
+ entry:<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/icf-executable.s<br>
+===================================================================<br>
+--- test/COFF/icf-executable.s (revision 333896)<br>
++++ test/COFF/icf-executable.s (working copy)<br>
+@@ -1,18 +1,19 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t.obj<br>
+ # RUN: lld-link -entry:main %t.obj -out:%t.exe -verbose 2>&1 | FileCheck %s<br>
+ <br>
+ # CHECK: Selected internal<br>
+ # CHECK:   Removed f2<br>
+ <br>
+ .section .text,"xr",one_only,internal<br>
+ internal:<br>
+ .globl main<br>
+ main:<br>
+ call f2<br>
+ ret<br>
+ <br>
+ .section .text,"xr",one_only,f2<br>
+ .globl f2<br>
+ f2:<br>
+ call main<br>
+ ret<br>
+Index: test/COFF/icf-pdata.s<br>
+===================================================================<br>
+--- test/COFF/icf-pdata.s      (revision 333896)<br>
++++ test/COFF/icf-pdata.s      (working copy)<br>
+@@ -1,97 +1,98 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc %s -triple x86_64-windows-msvc -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -dll -noentry -out:%t.dll -merge:.xdata=.xdata<br>
+ # RUN: llvm-readobj -sections -coff-exports %t.dll | FileCheck %s<br>
+ <br>
+ # CHECK:         Name: .pdata<br>
+ # CHECK-NEXT:    VirtualSize: 0x18<br>
+ # CHECK:         Name: .xdata<br>
+ # CHECK-NEXT:    VirtualSize: 0x10<br>
+ <br>
+ # CHECK:         Name: xdata1<br>
+ # CHECK-NEXT:    RVA: 0x1010<br>
+ # CHECK:         Name: xdata1a<br>
+ # CHECK-NEXT:    RVA: 0x1010<br>
+ # CHECK:         Name: xdata1b<br>
+ # CHECK-NEXT:    RVA: 0x1030<br>
+ <br>
+       .text<br>
+ callee:<br>
+       ret<br>
+ <br>
+       .def     xdata1;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata1<br>
+       .globl  xdata1                  # -- Begin function xdata1<br>
+       .p2align        4, 0x90<br>
+ xdata1:                                 # @xdata1<br>
+ .seh_proc xdata1<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 40<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata1<br>
+       .seh_endproc<br>
+                                         # -- End function<br>
+ <br>
+ # xdata1a is identical to xdata1, so it should be ICFd, and so should its pdata.<br>
+ # It also has associative debug and CFG sections which should be ignored by ICF.<br>
+       .def     xdata1a;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata1a<br>
+       .globl  xdata1a                  # -- Begin function xdata1a<br>
+       .p2align        4, 0x90<br>
+ xdata1a:                                 # @xdata1a<br>
+ .seh_proc xdata1a<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 40<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata1a<br>
+       .seh_endproc<br>
+ <br>
+       .section .debug$S,"r",associative,xdata1a<br>
+       .section .gfids$y,"r",associative,xdata1a<br>
+       .section .gljmp$y,"r",associative,xdata1a<br>
+ <br>
+ # xdata1b's text is identical to xdata1, but its xdata specifies a different<br>
+ # stack size, so it cannot be ICFd with xdata1.<br>
+       .def     xdata1b;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata1b<br>
+       .globl  xdata1b                  # -- Begin function xdata1b<br>
+       .p2align        4, 0x90<br>
+ xdata1b:                                 # @xdata1b<br>
+ .seh_proc xdata1b<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 48<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata1b<br>
+       .seh_endproc<br>
+                                         # -- End function<br>
+ <br>
+       .section        .drectve,"yn"<br>
+       .ascii  " -export:xdata1"<br>
+       .ascii  " -export:xdata1a"<br>
+       .ascii  " -export:xdata1b"<br>
+Index: test/COFF/icf-xdata.s<br>
+===================================================================<br>
+--- test/COFF/icf-xdata.s      (revision 333896)<br>
++++ test/COFF/icf-xdata.s      (working copy)<br>
+@@ -1,98 +1,99 @@<br>
++# REQUIRES: x86<br>
+ # RUN: llvm-mc %s -triple x86_64-windows-msvc -filetype=obj -o %t.obj<br>
+ # RUN: lld-link %t.obj -dll -noentry -out:%t.dll -merge:.xdata=.xdata 2>&1 \<br>
+ # RUN:     | FileCheck %s --check-prefix=WARN<br>
+ # RUN: llvm-readobj -sections %t.dll | FileCheck %s --check-prefix=XDATA<br>
+ # RUN: lld-link %t.obj -dll -noentry -out:%t.dll<br>
+ # RUN: llvm-readobj -sections %t.dll | FileCheck %s --check-prefix=RDATA<br>
+ <br>
+ # There shouldn't be much xdata, because all three .pdata entries (12 bytes<br>
+ # each) should use the same .xdata unwind info.<br>
+ # XDATA:         Name: .rdata<br>
+ # XDATA-NEXT:    VirtualSize: 0x73<br>
+ # XDATA:         Name: .pdata<br>
+ # XDATA-NEXT:    VirtualSize: 0x24<br>
+ # XDATA:         Name: .xdata<br>
+ # XDATA-NEXT:    VirtualSize: 0x8<br>
+ #<br>
+ # WARN: warning: .xdata=.rdata: already merged into .xdata<br>
+ #<br>
+ # RDATA:         Name: .rdata<br>
+ # RDATA-NEXT:    VirtualSize: 0x7C<br>
+ # RDATA:         Name: .pdata<br>
+ # RDATA-NEXT:    VirtualSize: 0x24<br>
+ <br>
+       .text<br>
+ callee:<br>
+       ret<br>
+ <br>
+       .def     xdata1;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata1<br>
+       .globl  xdata1                  # -- Begin function xdata1<br>
+       .p2align        4, 0x90<br>
+ xdata1:                                 # @xdata1<br>
+ .seh_proc xdata1<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 40<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata1<br>
+       .seh_endproc<br>
+                                         # -- End function<br>
+       .def     xdata2;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata2<br>
+       .globl  xdata2                  # -- Begin function xdata2<br>
+       .p2align        4, 0x90<br>
+ xdata2:                                 # @xdata2<br>
+ .seh_proc xdata2<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 40<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata2<br>
+       .seh_endproc<br>
+                                         # -- End function<br>
+       .def     xdata3;<br>
+       .scl    2;<br>
+       .type   32;<br>
+       .endef<br>
+       .section        .text,"xr",one_only,xdata3<br>
+       .globl  xdata3                  # -- Begin function xdata3<br>
+       .p2align        4, 0x90<br>
+ xdata3:                                 # @xdata3<br>
+ .seh_proc xdata3<br>
+ # BB#0:                                 # %entry<br>
+       subq    $40, %rsp<br>
+       .seh_stackalloc 40<br>
+       .seh_endprologue<br>
+       callq   callee<br>
+       callq   callee<br>
+       callq   callee<br>
+       nop<br>
+       addq    $40, %rsp<br>
+       jmp     callee                  # TAILCALL<br>
+       .seh_handlerdata<br>
+       .section        .text,"xr",one_only,xdata3<br>
+       .seh_endproc<br>
+                                         # -- End function<br>
+       .section        .drectve,"yn"<br>
+       .ascii  " -export:xdata1"<br>
+       .ascii  " -export:xdata2"<br>
+       .ascii  " -export:xdata3"<br>
+ <br>
+Index: test/COFF/implib-name.test<br>
+===================================================================<br>
+--- test/COFF/implib-name.test (revision 333896)<br>
++++ test/COFF/implib-name.test (working copy)<br>
+@@ -1,71 +1,72 @@<br>
++# REQUIRES: x86<br>
+ # RUN: mkdir -p %T<br>
+ # RUN: llvm-mc -triple x86_64-unknown-windows-msvc -filetype obj -o %T/object.obj %S/Inputs/object.s<br>
+ <br>
+ # RUN: lld-link /dll /machine:x64 /def:%S/Inputs/named.def /out:%T/library.dll %T/object.obj /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-DLL-EXT<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/named.def /out:%T/library.lib<br>
+ # RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-DLL-EXT<br>
+ <br>
+ CHECK-DEFAULT-DLL-EXT: library.dll<br>
+ CHECK-DEFAULT-DLL-EXT: library.dll<br>
+ CHECK-DEFAULT-DLL-EXT: library.dll<br>
+ CHECK-DEFAULT-DLL-EXT: library.dll<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/named.def /out:%T/library.exe %T/object.obj /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/library.lib | FileCheck %s -check-prefix CHECK-DEFAULT-EXE-EXT<br>
+ <br>
+ CHECK-DEFAULT-EXE-EXT: library.exe<br>
+ CHECK-DEFAULT-EXE-EXT: library.exe<br>
+ CHECK-DEFAULT-EXE-EXT: library.exe<br>
+ CHECK-DEFAULT-EXE-EXT: library.exe<br>
+ <br>
+ # RUN: lld-link /dll /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.dll /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.exe /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/extension.def /out:%T/extension.lib<br>
+ # RUN: llvm-ar t %T/extension.lib | FileCheck %s -check-prefix CHECK-EXTENSION<br>
+ <br>
+ CHECK-EXTENSION: library.ext<br>
+ CHECK-EXTENSION: library.ext<br>
+ CHECK-EXTENSION: library.ext<br>
+ CHECK-EXTENSION: library.ext<br>
+ <br>
+ # RUN: lld-link /dll /machine:x64 /def:%S/Inputs/default.def /out:%T/default.dll /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-DLL<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/default.def /out:%T/default.lib<br>
+ # RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-DLL<br>
+ <br>
+ CHECK-OUTPUT-NAME-DLL: default.dll<br>
+ CHECK-OUTPUT-NAME-DLL: default.dll<br>
+ CHECK-OUTPUT-NAME-DLL: default.dll<br>
+ CHECK-OUTPUT-NAME-DLL: default.dll<br>
+ <br>
+ # RUN: lld-link /machine:x64 /def:%S/Inputs/default.def /out:%T/default.exe %T/object.obj /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-OUTPUT-NAME-EXE<br>
+ <br>
+ CHECK-OUTPUT-NAME-EXE: default.exe<br>
+ CHECK-OUTPUT-NAME-EXE: default.exe<br>
+ CHECK-OUTPUT-NAME-EXE: default.exe<br>
+ CHECK-OUTPUT-NAME-EXE: default.exe<br>
+ <br>
+ # RUN: lld-link /machine:x64 /out:%T/default.exe %T/object.obj /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-NODEF-EXE<br>
+ <br>
+ CHECK-NODEF-EXE: default.exe<br>
+ CHECK-NODEF-EXE: default.exe<br>
+ CHECK-NODEF-EXE: default.exe<br>
+ CHECK-NODEF-EXE: default.exe<br>
+ <br>
+ # RUN: lld-link /machine:x64 /dll /out:%T/default.dll %T/object.obj /entry:f /subsystem:CONSOLE<br>
+ # RUN: llvm-ar t %T/default.lib | FileCheck %s -check-prefix CHECK-NODEF-DLL<br>
+ <br>
+ CHECK-NODEF-DLL: default.dll<br>
+ CHECK-NODEF-DLL: default.dll<br>
+ CHECK-NODEF-DLL: default.dll<br>
+ CHECK-NODEF-DLL: default.dll<br>
+ <br>
+Index: test/COFF/loadcfg.ll<br>
+===================================================================<br>
+--- test/COFF/loadcfg.ll       (revision 333896)<br>
++++ test/COFF/loadcfg.ll       (working copy)<br>
+@@ -1,15 +1,16 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: lld-link /out:%t.exe %t.obj /entry:main /subsystem:console<br>
+ ; RUN: llvm-readobj -file-headers %t.exe | FileCheck %s<br>
+ <br>
+ ; CHECK: LoadConfigTableRVA: 0x2000<br>
+ ; CHECK: LoadConfigTableSize: 0x70<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ @_load_config_used = constant [28 x i32] [i32 112, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0]<br>
+ <br>
+ define void @main() {<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/lto-chkstk.ll<br>
+===================================================================<br>
+--- test/COFF/lto-chkstk.ll    (revision 333896)<br>
++++ test/COFF/lto-chkstk.ll    (working copy)<br>
+@@ -1,17 +1,18 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-foo.obj %S/Inputs/lto-chkstk-foo.s<br>
+ ; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-chkstk.obj %S/Inputs/lto-chkstk-chkstk.s<br>
+ ; RUN: llvm-ar cru %t.lib %T/lto-chkstk-chkstk.obj<br>
+ ; RUN: lld-link /out:%t.exe /entry:main /subsystem:console %t.obj %T/lto-chkstk-foo.obj %t.lib<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ define void @main() {<br>
+ entry:<br>
+   %array4096 = alloca [4096 x i8]<br>
+   call void @foo([4096 x i8]* %array4096)<br>
+   ret void<br>
+ }<br>
+ <br>
+ declare void @foo([4096 x i8]*)<br>
+Index: test/COFF/lto-comdat.ll<br>
+===================================================================<br>
+--- test/COFF/lto-comdat.ll    (revision 333896)<br>
++++ test/COFF/lto-comdat.ll    (working copy)<br>
+@@ -1,107 +1,108 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %T/comdat-main.lto.obj %s<br>
+ ; RUN: llvm-as -o %T/comdat1.lto.obj %S/Inputs/lto-comdat1.ll<br>
+ ; RUN: llvm-as -o %T/comdat2.lto.obj %S/Inputs/lto-comdat2.ll<br>
+ ; RUN: rm -f %T/comdat.lto.lib<br>
+ ; RUN: llvm-ar cru %T/comdat.lto.lib %T/comdat1.lto.obj %T/comdat2.lto.obj<br>
+ <br>
+ ; RUN: llc -filetype=obj -o %T/comdat-main.obj %s<br>
+ ; RUN: llc -filetype=obj -o %T/comdat1.obj %S/Inputs/lto-comdat1.ll<br>
+ ; RUN: llc -filetype=obj -o %T/comdat2.obj %S/Inputs/lto-comdat2.ll<br>
+ ; RUN: rm -f %T/comdat.lib<br>
+ ; RUN: llvm-ar cru %T/comdat.lib %T/comdat1.obj %T/comdat2.obj<br>
+ <br>
+ ; Check that, when we use an LTO main with LTO objects, we optimize away all<br>
+ ; of f1, f2, and comdat.<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.lto.obj %T/comdat1.lto.obj %T/comdat2.lto.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-11 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-11 %s<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.lto.obj %T/comdat.lto.lib<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-11 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-11 %s<br>
+ <br>
+ ; Check that, when we use a non-LTO main with LTO objects, we pick the comdat<br>
+ ; implementation in LTO, elide calls to it from inside LTO, and retain the<br>
+ ; call to comdat from main.<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.obj %T/comdat1.lto.obj %T/comdat2.lto.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-01 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-01 %s<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.obj %T/comdat.lto.lib<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-01 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-01 %s<br>
+ <br>
+ ; Check that, when we use an LTO main with non-LTO objects, we pick the comdat<br>
+ ; implementation in LTO, elide the call to it from inside LTO, and keep the<br>
+ ; calls to comdat from the non-LTO objects.<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.lto.obj %T/comdat1.obj %T/comdat2.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-10 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-10 %s<br>
+ ; RUN: lld-link /out:%T/comdat-main.exe /entry:main /subsystem:console %T/comdat-main.lto.obj %T/comdat.lib<br>
+ ; RUN: llvm-readobj -file-headers %T/comdat-main.exe | FileCheck -check-prefix=HEADERS-10 %s<br>
+ ; RUN: llvm-objdump -d %T/comdat-main.exe | FileCheck -check-prefix=TEXT-10 %s<br>
+ <br>
+ ; HEADERS-11: AddressOfEntryPoint: 0x1000<br>
+ ; TEXT-11: Disassembly of section .text:<br>
+ ; TEXT-11-NEXT: .text:<br>
+ ; TEXT-11-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-11-NEXT: retq<br>
+ <br>
+ ; HEADERS-01: AddressOfEntryPoint: 0x1000<br>
+ ; TEXT-01: Disassembly of section .text:<br>
+ ; TEXT-01-NEXT: .text:<br>
+ ; TEXT-01-NEXT: subq  $40, %rsp<br>
+ ; TEXT-01-NEXT: callq 23<br>
+ ; TEXT-01-NEXT: callq 18<br>
+ ; TEXT-01-NEXT: callq 13<br>
+ ; TEXT-01-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-01-NEXT: addq  $40, %rsp<br>
+ ; TEXT-01: retq<br>
+ ; TEXT-01-NOT: callq<br>
+ ; TEXT-01: retq<br>
+ ; TEXT-01: int3<br>
+ ; TEXT-01: int3<br>
+ ; TEXT-01: int3<br>
+ ; TEXT-01-NOT: {{.}}<br>
+ <br>
+ ; HEADERS-10: AddressOfEntryPoint: 0x1020<br>
+ ; TEXT-10: Disassembly of section .text:<br>
+ ; TEXT-10-NEXT: .text:<br>
+ ; TEXT-10-NEXT: subq  $40, %rsp<br>
+ ; TEXT-10-NEXT: callq 55<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: addq  $40, %rsp<br>
+ ; TEXT-10-NEXT: retq<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: subq  $40, %rsp<br>
+ ; TEXT-10-NEXT: callq 39<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: addq  $40, %rsp<br>
+ ; TEXT-10-NEXT: retq<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: subq  $40, %rsp<br>
+ ; TEXT-10-NEXT: callq -41<br>
+ ; TEXT-10-NEXT: callq -30<br>
+ ; TEXT-10-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-10-NEXT: addq  $40, %rsp<br>
+ ; TEXT-10-NEXT: retq<br>
+ ; TEXT-10-NOT: callq<br>
+ ; TEXT-10: retq<br>
+ ; TEXT-10-NOT: {{.}}<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ $comdat = comdat any<br>
+ <br>
+ define i32 @main() {<br>
+   call void @f1()<br>
+   call void @f2()<br>
+   call void @comdat()<br>
+   ret i32 0<br>
+ }<br>
+ <br>
+ define linkonce_odr void @comdat() comdat {<br>
+   ret void<br>
+ }<br>
+ <br>
+ declare void @f1()<br>
+ declare void @f2()<br>
+Index: test/COFF/lto-icf.ll<br>
+===================================================================<br>
+--- test/COFF/lto-icf.ll       (revision 333896)<br>
++++ test/COFF/lto-icf.ll       (working copy)<br>
+@@ -1,26 +1,27 @@<br>
++; REQUIRES: x86<br>
+ ; Test that ICF works after LTO, i.e. both functions have the same address.<br>
+ ; Previously, when we didn't enable function sections, ICF didn't work.<br>
+ <br>
+ ; RUN: llvm-as %s -o %t.bc<br>
+ ; RUN: lld-link -opt:icf -dll -noentry %t.bc -out:%t.dll<br>
+ ; RUN: llvm-readobj -coff-exports %t.dll | FileCheck %s<br>
+ <br>
+ ; CHECK: Export {<br>
+ ; CHECK: Export {<br>
+ ; CHECK:   RVA: 0x[[RVA:.*]]<br>
+ ; CHECK: Export {<br>
+ ; CHECK:   RVA: 0x[[RVA]]<br>
+ ; CHECK-NOT: Export<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc19.12.25835"<br>
+ <br>
+ define dllexport i8* @icf_ptr() {<br>
+ entry:<br>
+   ret i8* null<br>
+ }<br>
+ <br>
+ define dllexport i64 @icf_int() {<br>
+ entry:<br>
+   ret i64 0<br>
+ }<br>
+Index: test/COFF/lto-lazy-reference.ll<br>
+===================================================================<br>
+--- test/COFF/lto-lazy-reference.ll    (revision 333896)<br>
++++ test/COFF/lto-lazy-reference.ll    (working copy)<br>
+@@ -1,21 +1,22 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llc -mtriple=i686-pc-windows-msvc -filetype=obj -o %T/lto-lazy-reference-quadruple.obj %S/Inputs/lto-lazy-reference-quadruple.ll<br>
+ ; RUN: llvm-as -o %T/lto-lazy-reference-dummy.bc %S/Inputs/lto-lazy-reference-dummy.ll<br>
+ ; RUN: rm -f %t.lib<br>
+ ; RUN: llvm-ar cru %t.lib %T/lto-lazy-reference-quadruple.obj %T/lto-lazy-reference-dummy.bc<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: lld-link /out:%t.exe /entry:main /subsystem:console %t.obj %t.lib<br>
+ <br>
+ target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"<br>
+ target triple = "i686-pc-windows-msvc18.0.0"<br>
+ <br>
+ define double @main(double %x) {<br>
+ entry:<br>
+   ; When compiled, this defines the __real@40800000 symbol, which already has a<br>
+   ; lazy definition in the lib file from  lto-lazy-reference-quadruple.obj. This<br>
+   ; test makes sure we *don't* try to take the definition from the lazy<br>
+   ; reference, because that can bring in new references to bitcode files after<br>
+   ; LTO, such as lto-lazy-reference-dummy.bc in this case.<br>
+   %mul = fmul double %x, 4.0<br>
+ <br>
+   ret double %mul<br>
+ }<br>
+Index: test/COFF/lto-linker-opts.ll<br>
+===================================================================<br>
+--- test/COFF/lto-linker-opts.ll       (revision 333896)<br>
++++ test/COFF/lto-linker-opts.ll       (working copy)<br>
+@@ -1,8 +1,9 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %T/lto-linker-opts.obj %s<br>
+ ; RUN: env LIB=%S/Inputs lld-link /out:%T/lto-linker-opts.exe /entry:main /subsystem:console %T/lto-linker-opts.obj<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ !llvm.linker.options = !{!0}<br>
+ !0 = !{!"/DEFAULTLIB:ret42.lib"}<br>
+Index: test/COFF/lto-new-symbol.ll<br>
+===================================================================<br>
+--- test/COFF/lto-new-symbol.ll        (revision 333896)<br>
++++ test/COFF/lto-new-symbol.ll        (working copy)<br>
+@@ -1,16 +1,17 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: lld-link /out:%t.exe /entry:foo /subsystem:console %t.obj<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ define void @foo(<4 x i32>* %p, <4 x float>* %q, i1 %t) nounwind {<br>
+ entry:<br>
+   br label %loop<br>
+ loop:<br>
+   store <4 x i32><i32 1073741824, i32 1073741824, i32 1073741824, i32 1073741824>, <4 x i32>* %p<br>
+   store <4 x float><float 2.0, float 2.0, float 2.0, float 2.0>, <4 x float>* %q<br>
+   br i1 %t, label %loop, label %ret<br>
+ ret:<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/lto-opt-level.ll<br>
+===================================================================<br>
+--- test/COFF/lto-opt-level.ll (revision 333896)<br>
++++ test/COFF/lto-opt-level.ll (working copy)<br>
+@@ -1,21 +1,22 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: lld-link /out:%t0.exe /entry:main /subsystem:console /opt:lldlto=0 /lldmap:%t0.map %t.obj<br>
+ ; RUN: FileCheck --check-prefix=CHECK-O0 %s < %t0.map<br>
+ ; RUN: lld-link /out:%t2.exe /entry:main /subsystem:console /opt:lldlto=2 /lldmap:%t2.map %t.obj<br>
+ ; RUN: FileCheck --check-prefix=CHECK-O2 %s < %t2.map<br>
+ ; RUN: lld-link /out:%t2a.exe /entry:main /subsystem:console /lldmap:%t2a.map %t.obj<br>
+ ; RUN: FileCheck --check-prefix=CHECK-O2 %s < %t2a.map<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ ; CHECK-O0: foo<br>
+ ; CHECK-O2-NOT: foo<br>
+ define internal void @foo() {<br>
+   ret void<br>
+ }<br>
+ <br>
+ define void @main() {<br>
+   call void @foo()<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/lto-parallel.ll<br>
+===================================================================<br>
+--- test/COFF/lto-parallel.ll  (revision 333896)<br>
++++ test/COFF/lto-parallel.ll  (working copy)<br>
+@@ -1,22 +1,23 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t.obj %s<br>
+ ; RUN: lld-link -opt:noicf /out:%t.exe /entry:foo /include:bar /opt:lldltopartitions=2 /subsystem:console /lldmap:%t.map %t.obj<br>
+ ; RUN: FileCheck %s < %t.map<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ ; CHECK: lto.tmp<br>
+ ; CHECK: lto.tmp<br>
+ ; CHECK-NEXT: foo<br>
+ define void @foo() {<br>
+   call void @bar()<br>
+   ret void<br>
+ }<br>
+ <br>
+ ; CHECK: lto.tmp<br>
+ ; CHECK: lto.tmp<br>
+ ; CHECK: bar<br>
+ define void @bar() {<br>
+   call void @foo()<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/lto-reloc-model.ll<br>
+===================================================================<br>
+--- test/COFF/lto-reloc-model.ll       (revision 333896)<br>
++++ test/COFF/lto-reloc-model.ll       (working copy)<br>
+@@ -1,19 +1,20 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %t %s<br>
+ ; RUN: lld-link /entry:main /subsystem:console /out:%t.exe %t<br>
+ ; RUN: llvm-objdump -d %t.exe | FileCheck %s<br>
+ <br>
+ target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"<br>
+ target triple = "i686-pc-windows-msvc"<br>
+ <br>
+ @foo = thread_local global i8 0<br>
+ <br>
+ module asm "__tls_index = 1"<br>
+ module asm "__tls_array = 2"<br>
+ <br>
+ define i8* @main() {<br>
+   ; CHECK: movl 1, %eax<br>
+   ; CHECK: movl %fs:2, %ecx<br>
+   ; CHECK: movl (%ecx,%eax,4), %eax<br>
+   ; CHECK: leal (%eax), %eax<br>
+   ret i8* @foo<br>
+ }<br>
+Index: test/COFF/lto.ll<br>
+===================================================================<br>
+--- test/COFF/lto.ll   (revision 333896)<br>
++++ test/COFF/lto.ll   (working copy)<br>
+@@ -1,144 +1,145 @@<br>
++; REQUIRES: x86<br>
+ ; RUN: llvm-as -o %T/main.lto.obj %s<br>
+ ; RUN: llvm-as -o %T/foo.lto.obj %S/Inputs/lto-dep.ll<br>
+ ; RUN: rm -f %T/foo.lto.lib<br>
+ ; RUN: llvm-ar cru %T/foo.lto.lib %T/foo.lto.obj<br>
+ <br>
+ ; RUN: llc -filetype=obj -o %T/main.obj %s<br>
+ ; RUN: llc -filetype=obj -o %T/foo.obj %S/Inputs/lto-dep.ll<br>
+ ; RUN: rm -f %T/foo.lib<br>
+ ; RUN: llvm-ar cru %T/foo.lib %T/foo.obj<br>
+ <br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /include:f2 /subsystem:console %T/main.lto.obj %T/foo.lto.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-11 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-11 %s<br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /include:f2 /subsystem:console %T/main.lto.obj %T/foo.lto.lib /verbose 2>&1 | FileCheck -check-prefix=VERBOSE %s<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-11 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-11 %s<br>
+ <br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /subsystem:console %T/main.obj %T/foo.lto.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-01 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-01 %s<br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /subsystem:console %T/main.obj %T/foo.lto.lib<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-01 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-01 %s<br>
+ <br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /subsystem:console %T/main.lto.obj %T/foo.obj<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-10 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-10 %s<br>
+ ; RUN: lld-link /out:%T/main.exe /entry:main /subsystem:console %T/main.lto.obj %T/foo.lib<br>
+ ; RUN: llvm-readobj -file-headers %T/main.exe | FileCheck -check-prefix=HEADERS-10 %s<br>
+ ; RUN: llvm-objdump -d %T/main.exe | FileCheck -check-prefix=TEXT-10 %s<br>
+ <br>
+ ; VERBOSE: foo.lto.lib({{.*}}foo.lto.obj)<br>
+ <br>
+ ; HEADERS-11: AddressOfEntryPoint: 0x1000<br>
+ ; TEXT-11: Disassembly of section .text:<br>
+ ; TEXT-11-NEXT: .text:<br>
+ ; TEXT-11-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-11-NEXT: retq<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: int3<br>
+ ; TEXT-11-NEXT: movl  $2, %eax<br>
+ ; TEXT-11-NEXT: retq<br>
+ <br>
+ ; HEADERS-01: AddressOfEntryPoint: 0x1000<br>
+ ; TEXT-01: Disassembly of section .text:<br>
+ ; TEXT-01-NEXT: .text:<br>
+ ; TEXT-01-NEXT: subq  $40, %rsp<br>
+ ; TEXT-01-NEXT: callq 23<br>
+ ; TEXT-01-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-01-NEXT: addq  $40, %rsp<br>
+ ; TEXT-01-NEXT: retq<br>
+ ; TEXT-01-NEXT: retq<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: int3<br>
+ ; TEXT-01-NEXT: retq<br>
+ <br>
+ ; HEADERS-10: AddressOfEntryPoint: 0x1020<br>
+ ; TEXT-10: Disassembly of section .text:<br>
+ ; TEXT-10-NEXT: .text:<br>
+ ; TEXT-10-NEXT: retq<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: nop<br>
+ ; TEXT-10-NEXT: retq<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: int3<br>
+ ; TEXT-10-NEXT: subq  $40, %rsp<br>
+ ; TEXT-10-NEXT: callq -41<br>
+ ; TEXT-10-NEXT: xorl  %eax, %eax<br>
+ ; TEXT-10-NEXT: addq  $40, %rsp<br>
+ ; TEXT-10-NEXT: retq<br>
+ <br>
+ target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
+ target triple = "x86_64-pc-windows-msvc"<br>
+ <br>
+ define i32 @main() {<br>
+   call void @foo()<br>
+   ret i32 0<br>
+ }<br>
+ <br>
+ declare void @foo()<br>
+ <br>
+ $f1 = comdat any<br>
+ define i32 @f1() comdat($f1) {<br>
+   ret i32 1<br>
+ }<br>
+ <br>
+ $f2 = comdat any<br>
+ define i32 @f2() comdat($f2) {<br>
+   ret i32 2<br>
+ }<br>
+ <br>
+ define internal void @internal() {<br>
+   ret void<br>
+ }<br>
+Index: test/COFF/pdb-global-gc.yaml<br>
+===================================================================<br>
+--- test/COFF/pdb-global-gc.yaml       (revision 333896)<br>
++++ test/COFF/pdb-global-gc.yaml       (working copy)<br>
+@@ -1,120 +1,121 @@<br>
++# REQUIRES: x86<br>
+ # RUN: yaml2obj %s -o %t.obj<br>
+ # RUN: llvm-mc %S/Inputs/pdb-global-gc.s -triple x86_64-windows-msvc -filetype=obj -o %t2.obj<br>
+ # RUN: lld-link %t.obj %t2.obj -debug -entry:main \<br>
+ # RUN:          -nodefaultlib -opt:ref -out:%t.exe -pdb:%t.pdb -verbose<br>
+ # RUN: llvm-pdbutil dump -symbols -globals %t.pdb | FileCheck %s<br>
+ <br>
+ # This tests the case where an __imp_ chunk is discarded by linker GC. The debug<br>
+ # info may refer to the __imp_ symbol still.<br>
+ <br>
+ # Compile this code with MSVC to regenerate the test case:<br>
+ #   extern char __declspec(dllimport) __wc_mb_cur;<br>
+ #   int discarded() { return __wc_mb_cur; }<br>
+ #   int main() { return g2; }<br>
+ <br>
+ # CHECK:                             Global Symbols<br>
+ # CHECK-NEXT: ============================================================<br>
+ # CHECK-NEXT:   Records<br>
+ # CHECK-NEXT:       20 | S_GDATA32 [size = 28] `__wc_mb_cur`<br>
+ # CHECK-NEXT:            type = 0x0070 (char), addr = 0000:0000<br>
+ <br>
+ # CHECK:                                Symbols<br>
+ # CHECK:      ============================================================<br>
+ # CHECK-NEXT:   Mod 0000 | `{{.*}}pdb-global-gc.yaml.tmp.obj`:<br>
+ # CHECK-NEXT:   Mod 0001 | `{{.*}}pdb-global-gc.yaml.tmp2.obj`:<br>
+ # CHECK-NEXT:   Mod 0002 | `* Linker *`:<br>
+ <br>
+ --- !COFF<br>
+ header:<br>
+   Machine:         IMAGE_FILE_MACHINE_AMD64<br>
+   Characteristics: [  ]<br>
+ sections:<br>
+   - Name:            '.debug$S'<br>
+     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]<br>
+     Alignment:       1<br>
+     Subsections:<br>
+       - !Symbols<br>
+         Records:<br>
+           - Kind:            S_GDATA32<br>
+             DataSym:<br>
+               Type:            112<br>
+               DisplayName:     __wc_mb_cur<br>
+       - !StringTable<br>
+         Strings:<br>
+     Relocations:<br>
+       - VirtualAddress:  20<br>
+         SymbolName:      __wc_mb_cur<br>
+         Type:            IMAGE_REL_AMD64_SECREL<br>
+       - VirtualAddress:  24<br>
+         SymbolName:      __wc_mb_cur<br>
+         Type:            IMAGE_REL_AMD64_SECTION<br>
+   - Name:            '.text$mn'<br>
+     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>
+     Alignment:       16<br>
+     SectionData:     0FBE0500000000C3<br>
+     Relocations:<br>
+       - VirtualAddress:  3<br>
+         SymbolName:      __wc_mb_cur<br>
+         Type:            IMAGE_REL_AMD64_REL32<br>
+   - Name:            '.text$mn'<br>
+     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>
+     Alignment:       16<br>
+     SectionData:     B82A000000C3<br>
+ symbols:<br>
+   - Name:            '.debug$S'<br>
+     Value:           0<br>
+     SectionNumber:   1<br>
+     SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+     ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+     StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+     SectionDefinition:<br>
+       Length:          240<br>
+       NumberOfRelocations: 2<br>
+       NumberOfLinenumbers: 0<br>
+       CheckSum:        0<br>
+       Number:          0<br>
+   - Name:            '.text$mn'<br>
+     Value:           0<br>
+     SectionNumber:   2<br>
+     SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+     ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+     StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+     SectionDefinition:<br>
+       Length:          11<br>
+       NumberOfRelocations: 1<br>
+       NumberOfLinenumbers: 0<br>
+       CheckSum:        2906070869<br>
+       Number:          0<br>
+       Selection:       IMAGE_COMDAT_SELECT_NODUPLICATES<br>
+   - Name:            '.text$mn'<br>
+     Value:           0<br>
+     SectionNumber:   3<br>
+     SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+     ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+     StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+     SectionDefinition:<br>
+       Length:          6<br>
+       NumberOfRelocations: 0<br>
+       NumberOfLinenumbers: 0<br>
+       CheckSum:        2139436471<br>
+       Number:          0<br>
+       Selection:       IMAGE_COMDAT_SELECT_NODUPLICATES<br>
+   - Name:            discarded<br>
+     Value:           0<br>
+     SectionNumber:   2<br>
+     SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+     ComplexType:     IMAGE_SYM_DTYPE_FUNCTION<br>
+     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL<br>
+   - Name:            main<br>
+     Value:           0<br>
+     SectionNumber:   3<br>
+     SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+     ComplexType:     IMAGE_SYM_DTYPE_FUNCTION<br>
+     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL<br>
+   - Name:        </blockquote></div>