113 lines · plain
1; REQUIRES: x862; RUN: mkdir -p %t.dir3; RUN: llvm-as -o %t.dir/comdat-main.lto.obj %s4; RUN: llvm-as -o %t.dir/comdat1.lto.obj %S/Inputs/lto-comdat1.ll5; RUN: llvm-as -o %t.dir/comdat2.lto.obj %S/Inputs/lto-comdat2.ll6; RUN: rm -f %t.dir/comdat.lto.lib7; RUN: llvm-ar cru %t.dir/comdat.lto.lib %t.dir/comdat1.lto.obj %t.dir/comdat2.lto.obj8 9; RUN: llc -filetype=obj -o %t.dir/comdat-main.obj %s10; RUN: llc -filetype=obj -o %t.dir/comdat1.obj %S/Inputs/lto-comdat1.ll11; RUN: llc -filetype=obj -o %t.dir/comdat2.obj %S/Inputs/lto-comdat2.ll12; RUN: rm -f %t.dir/comdat.lib13; RUN: llvm-ar cru %t.dir/comdat.lib %t.dir/comdat1.obj %t.dir/comdat2.obj14 15; Check that, when we use an LTO main with LTO objects, we optimize away all16; of f1, f2, and comdat.17; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.lto.obj %t.dir/comdat1.lto.obj %t.dir/comdat2.lto.obj18; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-11 %s19; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-11 %s20; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.lto.obj %t.dir/comdat.lto.lib21; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-11 %s22; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-11 %s23 24; Check that, when we use a non-LTO main with LTO objects, we pick the comdat25; implementation in LTO, elide calls to it from inside LTO, and retain the26; call to comdat from main.27; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.obj %t.dir/comdat1.lto.obj %t.dir/comdat2.lto.obj28; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-01 %s29; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-01 %s30; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.obj %t.dir/comdat.lto.lib31; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-01 %s32; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-01 %s33 34; Check that, when we use an LTO main with non-LTO objects, we pick the comdat35; implementation in LTO, elide the call to it from inside LTO, and keep the36; calls to comdat from the non-LTO objects.37; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.lto.obj %t.dir/comdat1.obj %t.dir/comdat2.obj38; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-10 %s39; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-10 %s40; RUN: lld-link /out:%t.dir/comdat-main.exe /entry:main /subsystem:console %t.dir/comdat-main.lto.obj %t.dir/comdat.lib41; RUN: llvm-readobj --file-headers %t.dir/comdat-main.exe | FileCheck -check-prefix=HEADERS-10 %s42; RUN: llvm-objdump --no-print-imm-hex -d %t.dir/comdat-main.exe | FileCheck --check-prefix=TEXT-10 %s43 44; HEADERS-11: AddressOfEntryPoint: 0x100045; TEXT-11: Disassembly of section .text:46; TEXT-11-EMPTY:47; TEXT-11-NEXT: <.text>:48; TEXT-11-NEXT: xorl %eax, %eax49; TEXT-11-NEXT: retq50 51; HEADERS-01: AddressOfEntryPoint: 0x100052; TEXT-01: Disassembly of section .text:53; TEXT-01-EMPTY:54; TEXT-01-NEXT: <.text>:55; TEXT-01-NEXT: subq $40, %rsp56; TEXT-01-NEXT: callq 0x14000102057; TEXT-01-NEXT: callq 0x14000102058; TEXT-01-NEXT: callq 0x14000102059; TEXT-01-NEXT: xorl %eax, %eax60; TEXT-01-NEXT: addq $40, %rsp61; TEXT-01: retq62; TEXT-01-NOT: callq63; TEXT-01: retq64; TEXT-01: int365; TEXT-01: int366; TEXT-01: int367; TEXT-01-NOT: {{.}}68 69; HEADERS-10: AddressOfEntryPoint: 0x102070; TEXT-10: Disassembly of section .text:71; TEXT-10-EMPTY:72; TEXT-10-NEXT: <.text>:73; TEXT-10-NEXT: subq $40, %rsp74; TEXT-10-NEXT: callq 0x14000104075; TEXT-10-NEXT: nop76; TEXT-10-NEXT: addq $40, %rsp77; TEXT-10-NEXT: retq78; TEXT-10-NEXT: int379; TEXT-10-NEXT: subq $40, %rsp80; TEXT-10-NEXT: callq 0x14000104081; TEXT-10-NEXT: nop82; TEXT-10-NEXT: addq $40, %rsp83; TEXT-10-NEXT: retq84; TEXT-10-NEXT: int385; TEXT-10-NEXT: subq $40, %rsp86; TEXT-10-NEXT: callq 0x14000100087; TEXT-10-NEXT: callq 0x14000101088; TEXT-10-NEXT: xorl %eax, %eax89; TEXT-10-NEXT: addq $40, %rsp90; TEXT-10-NEXT: retq91; TEXT-10-NOT: callq92; TEXT-10: retq93; TEXT-10-NOT: {{.}}94 95target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"96target triple = "x86_64-pc-windows-msvc"97 98$comdat = comdat any99 100define i32 @main() {101 call void @f1()102 call void @f2()103 call void @comdat()104 ret i32 0105}106 107define linkonce_odr void @comdat() comdat {108 ret void109}110 111declare void @f1()112declare void @f2()113