binutils-gdb/ld/testsuite/ld-x86-64/tlsbindesc.s
Lingling Kong 2d5428d8cd x86-64: Support APX NF TLS IE with 2 operands
Support APX NF TLS IE with 2 operands.Verify it with ld and gold.

gas/

	* config/tc-i386.c (md_assemble): Allow APX NF TLS IE with
	2 operands.
	* testsuite/gas/i386/x86-64-gottpoff.d: Updated.
	* testsuite/gas/i386/x86-64-gottpoff.s: Add APX NF TLS IE
	tests with 2 operands.

gold/

	* testsuite/x86_64_ie_to_le.s: Add APX NF TLS IE tests with
	2 operands.
	* testsuite/x86_64_ie_to_le.sh: Updated.

ld/

	* testsuite/ld-x86-64/tlsbindesc.s: Add APX NF TLS IE tests
	with 2 operands.
	* testsuite/ld-x86-64/tlsbindesc.d: Updated.
	* testsuite/ld-x86-64/tlsbindesc.rd: Likewise.
2024-07-03 10:18:36 +08:00

188 lines
4.4 KiB
ArmAsm

/* Force .data aligned to 4K, so that .got very likely gets at
0x5021a0 (0x60 bytes .tdata and 0x140 bytes .dynamic) */
.data
.balign 4096
.section ".tdata", "awT", @progbits
.globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
.globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
.hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
sg1: .long 17
sg2: .long 18
sg3: .long 19
sg4: .long 20
sg5: .long 21
sg6: .long 22
sg7: .long 23
sg8: .long 24
sl1: .long 65
sl2: .long 66
sl3: .long 67
sl4: .long 68
sl5: .long 69
sl6: .long 70
sl7: .long 71
sl8: .long 72
sh1: .long 257
sh2: .long 258
sh3: .long 259
sh4: .long 260
sh5: .long 261
sh6: .long 262
sh7: .long 263
sh8: .long 264
/* Force .text aligned to 4K, so it very likely gets at 0x401000. */
.text
.balign 4096
.globl fn2
.type fn2,@function
fn2:
pushq %rbp
movq %rsp, %rbp
/* GD -> IE because variable is not defined in executable */
leaq sG1@tlsdesc(%rip), %rax
call *sG1@tlscall(%rax)
nop;nop;nop;nop
/* GD -> IE because variable is not defined in executable where
the variable is referenced through IE too */
leaq sG2@tlsdesc(%rip), %rax
call *sG2@tlscall(%rax)
nop;nop;nop;nop
/* GD -> LE with global variable defined in executable */
leaq sg1@tlsdesc(%rip), %rax
call *sg1@tlscall(%rax)
nop;nop;nop;nop
/* GD -> LE with local variable defined in executable */
leaq sl1@tlsdesc(%rip), %rax
call *sl1@tlscall(%rax)
nop;nop;nop;nop
/* GD -> LE with hidden variable defined in executable */
leaq sh1@tlsdesc(%rip), %rax
call *sh1@tlscall(%rax)
nop;nop;nop;nop
/* LD -> LE */
leaq _TLS_MODULE_BASE_@tlsdesc(%rip), %rax
call *_TLS_MODULE_BASE_@tlscall(%rax)
nop;nop
leaq 1+sl1@dtpoff(%rax), %rdx
nop;nop
leaq sl2@dtpoff+2(%rax), %r9
nop;nop;nop;nop
/* LD -> LE against hidden variables */
leaq sh1@dtpoff(%rax), %rdx
nop;nop
leaq 3+sh2@dtpoff(%rax), %rcx
nop;nop;nop;nop
/* IE against global var */
movq %fs:0, %r9
nop;nop
addq sG2@gottpoff(%rip), %r9
nop;nop;nop;nop
/* IE -> LE against global var defined in exec */
movq %fs:0, %r10
nop;nop
addq sg1@gottpoff(%rip), %r10
nop;nop;nop;nop
/* IE -> LE against local var */
movq %fs:0, %rax
nop;nop
addq sl1@gottpoff(%rip), %rax
nop;nop;nop;nop
/* IE -> LE against hidden var */
movq %fs:0, %rcx
nop;nop
addq sh1@gottpoff(%rip), %rcx
nop;nop;nop;nop
/* Direct access through %fs */
/* IE against global var */
movq sG5@gottpoff(%rip), %rcx
nop;nop
movq %fs:(%rcx), %rdx
nop;nop;nop;nop
/* IE->LE against local var */
movq sl5@gottpoff(%rip), %r11
nop;nop
movq %fs:(%r11), %r12
nop;nop;nop;nop
/* IE->LE against hidden var */
movq sh5@gottpoff(%rip), %rdx
nop;nop
movq %fs:(%rdx), %rdx
nop;nop;nop;nop
leave
ret
/* IE against global var */
addq sG2@gottpoff(%rip), %r16
addq %rax, sG2@gottpoff(%rip), %r16
addq sG2@gottpoff(%rip), %rax, %r16
{nf} addq sG2@gottpoff(%rip), %r16
{nf} addq %rax, sG2@gottpoff(%rip), %r16
{nf} addq sG2@gottpoff(%rip), %rax, %r16
/* IE -> LE against global var defined in exec */
addq sg1@gottpoff(%rip), %r17
addq %r8, sg1@gottpoff(%rip), %r17
addq sg1@gottpoff(%rip), %r8, %r17
{nf} addq sg1@gottpoff(%rip), %r17
{nf} addq %r8, sg1@gottpoff(%rip), %r17
{nf} addq sg1@gottpoff(%rip), %r8, %r17
/* IE -> LE against local var */
addq sl1@gottpoff(%rip), %r18
addq %r8, sl1@gottpoff(%rip), %rax
addq sl1@gottpoff(%rip), %r8, %rax
{nf} addq sl1@gottpoff(%rip), %r18
{nf} addq %r8, sl1@gottpoff(%rip), %rax
{nf} addq sl1@gottpoff(%rip), %r8, %rax
/* IE -> LE against hidden var */
addq sh1@gottpoff(%rip), %r19
addq %r19, sh1@gottpoff(%rip), %r8
addq sh1@gottpoff(%rip), %r19, %r8
{nf} addq sh1@gottpoff(%rip), %r19
{nf} addq %r19, sh1@gottpoff(%rip), %r8
{nf} addq sh1@gottpoff(%rip), %r19, %r8
/* Direct access through %fs */
/* IE against global var */
movq sG5@gottpoff(%rip), %r20
/* IE->LE against local var */
movq sl5@gottpoff(%rip), %r21
/* IE->LE against hidden var */
movq sh5@gottpoff(%rip), %r22
/* GD -> IE because variable is not defined in executable */
leaq sG1@tlsdesc(%rip), %r16
/* GD -> IE because variable is not defined in executable where
the variable is referenced through IE too */
leaq sG2@tlsdesc(%rip), %r17
/* GD -> LE with global variable defined in executable */
leaq sg1@tlsdesc(%rip), %r18
/* GD -> LE with local variable defined in executable */
leaq sl1@tlsdesc(%rip), %r19
/* GD -> LE with hidden variable defined in executable */
leaq sh1@tlsdesc(%rip), %r20