2018-06-06 21:56:51 +08:00
|
|
|
# REQUIRES: x86
|
2017-06-17 04:51:42 +08:00
|
|
|
# RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t1.obj
|
|
|
|
# RUN: llvm-mc -triple=x86_64-windows-msvc %S/Inputs/associative-comdat-2.s -filetype=obj -o %t2.obj
|
2017-06-17 04:47:19 +08:00
|
|
|
|
|
|
|
# RUN: lld-link -entry:main %t1.obj %t2.obj -out:%t.gc.exe
|
|
|
|
# RUN: llvm-readobj -sections %t.gc.exe | FileCheck %s
|
|
|
|
|
|
|
|
# RUN: lld-link -entry:main %t1.obj %t2.obj -opt:noref -out:%t.nogc.exe
|
|
|
|
# RUN: llvm-readobj -sections %t.nogc.exe | FileCheck %s
|
|
|
|
|
|
|
|
# CHECK: Sections [
|
|
|
|
# CHECK: Section {
|
2018-04-05 03:15:55 +08:00
|
|
|
# CHECK: Number: 2
|
2017-06-17 04:47:19 +08:00
|
|
|
# CHECK-LABEL: Name: .rdata (2E 72 64 61 74 61 00 00)
|
|
|
|
# This is the critical check to show that only *one* definition of
|
|
|
|
# foo_assoc was retained. This *must* be 8, not 16.
|
|
|
|
# CHECK-NEXT: VirtualSize: 0x8
|
2018-04-05 03:15:55 +08:00
|
|
|
# CHECK: Section {
|
|
|
|
# CHECK: Number: 3
|
|
|
|
# CHECK-LABEL: Name: .data (2E 64 61 74 61 00 00 00)
|
|
|
|
# CHECK-NEXT: VirtualSize: 0x4
|
2017-06-17 04:47:19 +08:00
|
|
|
|
|
|
|
.text
|
|
|
|
.def main;
|
|
|
|
.scl 2;
|
|
|
|
.type 32;
|
|
|
|
.endef
|
|
|
|
.globl main # -- Begin function main
|
|
|
|
.p2align 4, 0x90
|
|
|
|
main: # @main
|
|
|
|
# BB#0:
|
|
|
|
movl foo(%rip), %eax
|
|
|
|
retq
|
|
|
|
# -- End function
|
|
|
|
|
|
|
|
# Defines foo and foo_assoc globals. foo is comdat, and foo_assoc is comdat
|
|
|
|
# associative with it. foo_assoc should be discarded iff foo is discarded,
|
|
|
|
# either by linker GC or normal comdat merging.
|
|
|
|
|
|
|
|
.section .rdata,"dr",associative,foo
|
|
|
|
.p2align 3
|
|
|
|
.quad foo
|
|
|
|
|
|
|
|
.section .data,"dw",discard,foo
|
|
|
|
.globl foo # @foo
|
|
|
|
.p2align 2
|
|
|
|
foo:
|
|
|
|
.long 42
|