2018-06-06 21:56:51 +08:00
|
|
|
# REQUIRES: x86
|
2018-05-12 10:12:40 +08:00
|
|
|
# RUN: llvm-mc %s -triple x86_64-windows-msvc -filetype=obj -o %t.obj
|
|
|
|
# RUN: lld-link %t.obj -dll -noentry -out:%t.dll -merge:.xdata=.xdata
|
2019-05-01 13:49:01 +08:00
|
|
|
# RUN: llvm-readobj --sections --coff-exports %t.dll | FileCheck %s
|
2018-05-12 10:12:40 +08:00
|
|
|
|
|
|
|
# CHECK: Name: .pdata
|
|
|
|
# CHECK-NEXT: VirtualSize: 0x18
|
|
|
|
# CHECK: Name: .xdata
|
|
|
|
# CHECK-NEXT: VirtualSize: 0x10
|
|
|
|
|
|
|
|
# CHECK: Name: xdata1
|
|
|
|
# CHECK-NEXT: RVA: 0x1010
|
|
|
|
# CHECK: Name: xdata1a
|
|
|
|
# CHECK-NEXT: RVA: 0x1010
|
|
|
|
# CHECK: Name: xdata1b
|
|
|
|
# CHECK-NEXT: RVA: 0x1030
|
|
|
|
|
|
|
|
.text
|
|
|
|
callee:
|
|
|
|
ret
|
|
|
|
|
|
|
|
.def xdata1;
|
|
|
|
.scl 2;
|
|
|
|
.type 32;
|
|
|
|
.endef
|
|
|
|
.section .text,"xr",one_only,xdata1
|
|
|
|
.globl xdata1 # -- Begin function xdata1
|
|
|
|
.p2align 4, 0x90
|
|
|
|
xdata1: # @xdata1
|
|
|
|
.seh_proc xdata1
|
|
|
|
# BB#0: # %entry
|
|
|
|
subq $40, %rsp
|
|
|
|
.seh_stackalloc 40
|
|
|
|
.seh_endprologue
|
|
|
|
callq callee
|
|
|
|
nop
|
|
|
|
addq $40, %rsp
|
|
|
|
jmp callee # TAILCALL
|
|
|
|
.seh_handlerdata
|
|
|
|
.section .text,"xr",one_only,xdata1
|
|
|
|
.seh_endproc
|
|
|
|
# -- End function
|
|
|
|
|
|
|
|
# xdata1a is identical to xdata1, so it should be ICFd, and so should its pdata.
|
|
|
|
# It also has associative debug and CFG sections which should be ignored by ICF.
|
|
|
|
.def xdata1a;
|
|
|
|
.scl 2;
|
|
|
|
.type 32;
|
|
|
|
.endef
|
|
|
|
.section .text,"xr",one_only,xdata1a
|
|
|
|
.globl xdata1a # -- Begin function xdata1a
|
|
|
|
.p2align 4, 0x90
|
|
|
|
xdata1a: # @xdata1a
|
|
|
|
.seh_proc xdata1a
|
|
|
|
# BB#0: # %entry
|
|
|
|
subq $40, %rsp
|
|
|
|
.seh_stackalloc 40
|
|
|
|
.seh_endprologue
|
|
|
|
callq callee
|
|
|
|
nop
|
|
|
|
addq $40, %rsp
|
|
|
|
jmp callee # TAILCALL
|
|
|
|
.seh_handlerdata
|
|
|
|
.section .text,"xr",one_only,xdata1a
|
|
|
|
.seh_endproc
|
|
|
|
|
|
|
|
.section .debug$S,"r",associative,xdata1a
|
|
|
|
.section .gfids$y,"r",associative,xdata1a
|
|
|
|
.section .gljmp$y,"r",associative,xdata1a
|
|
|
|
|
|
|
|
# xdata1b's text is identical to xdata1, but its xdata specifies a different
|
|
|
|
# stack size, so it cannot be ICFd with xdata1.
|
|
|
|
.def xdata1b;
|
|
|
|
.scl 2;
|
|
|
|
.type 32;
|
|
|
|
.endef
|
|
|
|
.section .text,"xr",one_only,xdata1b
|
|
|
|
.globl xdata1b # -- Begin function xdata1b
|
|
|
|
.p2align 4, 0x90
|
|
|
|
xdata1b: # @xdata1b
|
|
|
|
.seh_proc xdata1b
|
|
|
|
# BB#0: # %entry
|
|
|
|
subq $40, %rsp
|
|
|
|
.seh_stackalloc 48
|
|
|
|
.seh_endprologue
|
|
|
|
callq callee
|
|
|
|
nop
|
|
|
|
addq $40, %rsp
|
|
|
|
jmp callee # TAILCALL
|
|
|
|
.seh_handlerdata
|
|
|
|
.section .text,"xr",one_only,xdata1b
|
|
|
|
.seh_endproc
|
|
|
|
# -- End function
|
|
|
|
|
|
|
|
.section .drectve,"yn"
|
|
|
|
.ascii " -export:xdata1"
|
|
|
|
.ascii " -export:xdata1a"
|
|
|
|
.ascii " -export:xdata1b"
|