forked from OSchip/llvm-project
[NFC][X86] Simplify test cases for branch align
This commit is contained in:
parent
56aed6144a
commit
d2b522f173
|
@ -1,43 +0,0 @@
|
|||
.text
|
||||
.globl foo
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
cmp %rax, %rbp
|
||||
xorl %eax, %eax
|
||||
cmp %rax, %rbp
|
||||
je .L_2
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
xorl %eax, %eax
|
||||
je .L_2
|
||||
popq %rbp
|
||||
je .L_2
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
xorl %eax, %eax
|
||||
jmp .L_3
|
||||
jmp .L_3
|
||||
jmp .L_3
|
||||
.rept 2
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
movl %eax, -4(%rbp)
|
||||
popq %rbp
|
||||
cmp %rax, %rbp
|
||||
je .L_2
|
||||
jmp .L_3
|
||||
.L_2:
|
||||
movl -12(%rbp), %eax
|
||||
movl %eax, -4(%rbp)
|
||||
.L_3:
|
||||
.rept 10
|
||||
movl %esi, -1200(%rbp)
|
||||
.endr
|
||||
jmp .L_3
|
||||
retq
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
.text
|
||||
.globl foo
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
.rept 2
|
||||
movl %esi, -12(%rbp)
|
||||
.endr
|
||||
jmp *%rax
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
movl %esi, -12(%rbp)
|
||||
pushq %rbp
|
||||
call *%rax
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
pushq %rbp
|
||||
call foo
|
||||
.rept 4
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
call *foo
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
# Check NOP padding is disabled before instruction that has variant symbol operand.
|
||||
# RUN: llvm-mc -filetype=obj -triple i386-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=call %s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 00000000 <foo>:
|
||||
# CHECK-COUNT-5: : 64 a3 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 1e: e8 fc ff ff ff calll {{.*}}
|
||||
# CHECK-COUNT-4: : 64 a3 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3b: 55 pushl %ebp
|
||||
# CHECK-NEXT: 3c: ff 91 00 00 00 00 calll *(%ecx)
|
||||
# CHECK-COUNT-4: : 64 a3 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5a: c1 e9 02 shrl $2, %ecx
|
||||
# CHECK-NEXT: 5d: 55 pushl %ebp
|
||||
# CHECK-NEXT: 5e: ff 10 calll *(%eax)
|
||||
# CHECK-COUNT-5: : 64 a3 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 7e: ff 20 jmpl *(%eax)
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 5
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
call ___tls_get_addr@PLT
|
||||
.rept 4
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
pushl %ebp
|
||||
call *___tls_get_addr@GOT(%ecx)
|
||||
.rept 4
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
shrl $2, %ecx
|
||||
pushl %ebp
|
||||
call *foo@tlscall(%eax)
|
||||
.rept 5
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
jmp *foo@tlscall(%eax)
|
|
@ -0,0 +1,15 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=jmp %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Check the branch align mechanism can work in 32-bit mode.
|
||||
|
||||
.text
|
||||
.rept 31
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 20: jmp
|
||||
jmp bar
|
||||
|
||||
|
||||
.type bar,@function
|
||||
bar:
|
||||
ret
|
|
@ -1,43 +0,0 @@
|
|||
# Check only fused conditional jumps, conditional jumps and unconditional jumps are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp %p/Inputs/align-branch-64-1.s -o %t1 && llvm-objdump -d %t1 | FileCheck %s
|
||||
|
||||
# Check that -x86-branches-within-32B-boundaries matches the above command line
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-branches-within-32B-boundaries %p/Inputs/align-branch-64-1.s -o %t2
|
||||
# RUN: cmp %t1 %t2
|
||||
|
||||
# Check no branches is aligned with option --x86-align-branch-boundary=0
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=0 --x86-align-branch=fused+jcc+jmp %p/Inputs/align-branch-64-1.s | llvm-objdump -d - > %t3
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %p/Inputs/align-branch-64-1.s | llvm-objdump -d - > %t4
|
||||
# RUN: cmp %t3 %t4
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 18: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 1b: 31 c0 xorl %eax, %eax
|
||||
# CHECK-COUNT-3: : 90 nop
|
||||
# CHECK: 20: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 23: 74 5d je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3d: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 3f: 90 nop
|
||||
# CHECK-NEXT: 40: 74 40 je {{.*}}
|
||||
# CHECK-NEXT: 42: 5d popq %rbp
|
||||
# CHECK-NEXT: 43: 74 3d je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5d: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 5f: 90 nop
|
||||
# CHECK-NEXT: 60: eb 26 jmp {{.*}}
|
||||
# CHECK-NEXT: 62: eb 24 jmp {{.*}}
|
||||
# CHECK-NEXT: 64: eb 22 jmp {{.*}}
|
||||
# CHECK-COUNT-2: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 76: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-NEXT: 79: 5d popq %rbp
|
||||
# CHECK-NEXT: 7a: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 7d: 74 03 je {{.*}}
|
||||
# CHECK-NEXT: 7f: 90 nop
|
||||
# CHECK-NEXT: 80: eb 06 jmp {{.*}}
|
||||
# CHECK-NEXT: 82: 8b 45 f4 movl -12(%rbp), %eax
|
||||
# CHECK-NEXT: 85: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-COUNT-10: : 89 b5 50 fb ff ff movl %esi, -1200(%rbp)
|
||||
# CHECK: c4: eb c2 jmp {{.*}}
|
||||
# CHECK-NEXT: c6: c3 retq
|
|
@ -1,32 +0,0 @@
|
|||
# Check only fused conditional jumps and conditional jumps are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc %p/Inputs/align-branch-64-1.s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 18: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 1b: 31 c0 xorl %eax, %eax
|
||||
# CHECK-COUNT-3: : 90 nop
|
||||
# CHECK-NEXT: 20: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 23: 74 5b je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3d: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 3f: 90 nop
|
||||
# CHECK-NEXT: 40: 74 3e je {{.*}}
|
||||
# CHECK-NEXT: 42: 5d popq %rbp
|
||||
# CHECK-NEXT: 43: 74 3b je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5d: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 5f: eb 25 jmp {{.*}}
|
||||
# CHECK-NEXT: 61: eb 23 jmp {{.*}}
|
||||
# CHECK-NEXT: 63: eb 21 jmp {{.*}}
|
||||
# CHECK-COUNT-2: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 75: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK: 78: 5d popq %rbp
|
||||
# CHECK-NEXT: 79: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 7c: 74 02 je {{.*}}
|
||||
# CHECK-NEXT: 7e: eb 06 jmp {{.*}}
|
||||
# CHECK-NEXT: 80: 8b 45 f4 movl -12(%rbp), %eax
|
||||
# CHECK-NEXT: 83: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-COUNT-10: : 89 b5 50 fb ff ff movl %esi, -1200(%rbp)
|
||||
# CHECK: c2: eb c2 jmp {{.*}}
|
||||
# CHECK-NEXT: c4: c3 retq
|
|
@ -1,31 +0,0 @@
|
|||
# Check only conditional jumps are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=jcc
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=jcc %p/Inputs/align-branch-64-1.s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 18: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 1b: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 1d: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 20: 74 5b je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3a: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 3c: 74 3f je {{.*}}
|
||||
# CHECK-NEXT: 3e: 5d popq %rbp
|
||||
# CHECK-NEXT: 3f: 90 nop
|
||||
# CHECK-NEXT: 40: 74 3b je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5a: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 5c: eb 25 jmp {{.*}}
|
||||
# CHECK-NEXT: 5e: eb 23 jmp {{.*}}
|
||||
# CHECK-NEXT: 60: eb 21 jmp {{.*}}
|
||||
# CHECK-COUNT-2: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 72: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-NEXT: 75: 5d popq %rbp
|
||||
# CHECK-NEXT: 76: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 79: 74 02 je {{.*}}
|
||||
# CHECK-NEXT: 7b: eb 06 jmp {{.*}}
|
||||
# CHECK-NEXT: 7d: 8b 45 f4 movl -12(%rbp), %eax
|
||||
# CHECK-NEXT: 80: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-COUNT-10: : 89 b5 50 fb ff ff movl %esi, -1200(%rbp)
|
||||
# CHECK: bf: eb c2 jmp {{.*}}
|
||||
# CHECK-NEXT: c1: c3 retq
|
|
@ -1,38 +0,0 @@
|
|||
# Check only conditional jumps and unconditional jumps are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=jcc+jmp
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=jcc+jmp %p/Inputs/align-branch-64-1.s | llvm-objdump -d - > %t1
|
||||
# RUN: FileCheck --input-file=%t1 %s --check-prefixes=CHECK,SHORT-NOP
|
||||
|
||||
# Check long NOP can be emitted to align branch if the target cpu support long nop.
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 -mcpu=x86-64 --x86-align-branch=jcc+jmp %p/Inputs/align-branch-64-1.s | llvm-objdump -d - >%t2
|
||||
# RUN: FileCheck --input-file=%t2 %s --check-prefixes=CHECK,LONG-NOP
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 18: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 1b: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 1d: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 20: 74 5d je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3a: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 3c: 74 41 je {{.*}}
|
||||
# CHECK-NEXT: 3e: 5d popq %rbp
|
||||
# CHECK-NEXT: 3f: 90 nop
|
||||
# CHECK-NEXT: 40: 74 3d je {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5a: 31 c0 xorl %eax, %eax
|
||||
# CHECK-NEXT: 5c: eb 27 jmp {{.*}}
|
||||
# SHORT-NOP-COUNT-2: : 90 nop
|
||||
# LONG-NOP: 5e: 66 90 nop
|
||||
# CHECK-NEXT: 60: eb 23 jmp {{.*}}
|
||||
# CHECK-NEXT: 62: eb 21 jmp {{.*}}
|
||||
# CHECK-COUNT-2: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 74: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-NEXT: 77: 5d popq %rbp
|
||||
# CHECK-NEXT: 78: 48 39 c5 cmpq %rax, %rbp
|
||||
# CHECK-NEXT: 7b: 74 02 je {{.*}}
|
||||
# CHECK-NEXT: 7d: eb 06 jmp {{.*}}
|
||||
# CHECK-NEXT: 7f: 8b 45 f4 movl -12(%rbp), %eax
|
||||
# CHECK-NEXT: 82: 89 45 fc movl %eax, -4(%rbp)
|
||||
# CHECK-COUNT-10: : 89 b5 50 fb ff ff movl %esi, -1200(%rbp)
|
||||
# CHECK: c1: eb c2 jmp {{.*}}
|
||||
# CHECK-NEXT: c3: c3 retq
|
|
@ -1,17 +0,0 @@
|
|||
# Check only indirect jumps are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=indirect
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=indirect %p/Inputs/align-branch-64-2.s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-2: : 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-COUNT-2: : 90 nop
|
||||
# CHECK: 20: ff e0 jmpq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3a: 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-NEXT: 3d: 55 pushq %rbp
|
||||
# CHECK-NEXT: 3e: ff d0 callq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 58: 55 pushq %rbp
|
||||
# CHECK-NEXT: 59: e8 00 00 00 00 callq {{.*}}
|
||||
# CHECK-COUNT-4: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 7e: ff 14 25 00 00 00 00 callq *0
|
|
@ -1,17 +0,0 @@
|
|||
# Check only calls are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=call
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=call %p/Inputs/align-branch-64-2.s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-2: : 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK: 1e: ff e0 jmpq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 38: 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-NEXT: 3b: 55 pushq %rbp
|
||||
# CHECK-NEXT: 3c: ff d0 callq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 56: 55 pushq %rbp
|
||||
# CHECK-NEXT: 57: e8 00 00 00 00 callq {{.*}}
|
||||
# CHECK-COUNT-4: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-4: : 90 nop
|
||||
# CHECK: 80: ff 14 25 00 00 00 00 callq *0
|
|
@ -1,19 +0,0 @@
|
|||
# Check only indirect jumps and calls are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=indirect+call
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=indirect+call %p/Inputs/align-branch-64-2.s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-2: : 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-COUNT-2: : 90 nop
|
||||
# CHECK: 20: ff e0 jmpq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3a: 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-NEXT: 3d: 55 pushq %rbp
|
||||
# CHECK-COUNT-2: : 90 nop
|
||||
# CHECK: 40: ff d0 callq *%rax
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5a: 55 pushq %rbp
|
||||
# CHECK-COUNT-5: : 90 nop
|
||||
# CHECK: 60: e8 00 00 00 00 callq {{.*}}
|
||||
# CHECK-COUNT-4: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 85: ff 14 25 00 00 00 00 callq *0
|
|
@ -1,41 +0,0 @@
|
|||
# Check NOP padding is disabled before instruction that has variant symbol operand.
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=jmp+call %s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-2: : 48 89 e5 movq %rsp, %rbp
|
||||
# CHECK: 1e: e8 00 00 00 00 callq {{.*}}
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 3b: 55 pushq %rbp
|
||||
# CHECK-NEXT: 3c: 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-NEXT: 3f: ff 15 00 00 00 00 callq *(%rip)
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 5d: ff 15 00 00 00 00 callq *(%rip)
|
||||
# CHECK-NEXT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 7b: ff 25 00 00 00 00 jmpq *(%rip)
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
.rept 2
|
||||
movq %rsp, %rbp
|
||||
.endr
|
||||
call __tls_get_addr@PLT
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
pushq %rbp
|
||||
movl %esi, -12(%rbp)
|
||||
call *__tls_get_addr@GOTPCREL(%rip)
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
call *foo@GOTPCREL(%rip)
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
jmp *foo@GOTPCREL(%rip)
|
|
@ -1,33 +0,0 @@
|
|||
# Check only rets are aligned with option --x86-align-branch-boundary=32 --x86-align-branch=ret
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=ret %s | llvm-objdump -d - | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-COUNT-2: : 48 89 e5 movq %rsp, %rbp
|
||||
# CHECK: 1e: 5a popq %rdx
|
||||
# CHECK-NEXT: 1f: 90 nop
|
||||
# CHECK-NEXT: 20: c3 retq
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 39: 89 75 f4 movl %esi, -12(%rbp)
|
||||
# CHECK-NEXT: 3c: 31 c0 xorl %eax, %eax
|
||||
# CHECK-COUNT-2: : 90 nop
|
||||
# CHECK: 40: c2 1e 00 retq $30
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
.rept 2
|
||||
movq %rsp, %rbp
|
||||
.endr
|
||||
popq %rdx
|
||||
ret
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
movl %esi, -12(%rbp)
|
||||
xorl %eax, %eax
|
||||
ret $30
|
|
@ -1,43 +0,0 @@
|
|||
# Check no nop is inserted if no branch cross or is against the boundary
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp+indirect+call+ret %s | llvm-objdump -d - > %t1
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s | llvm-objdump -d - > %t2
|
||||
# RUN: cmp %t1 %t2
|
||||
# RUN: FileCheck --input-file=%t1 %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-COUNT-3: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 18: c1 e9 02 shrl $2, %ecx
|
||||
# CHECK-NEXT: 1b: 89 d1 movl %edx, %ecx
|
||||
# CHECK-NEXT: 1d: 75 fc jne {{.*}}
|
||||
# CHECK-NEXT: 1f: 55 pushq %rbp
|
||||
# CHECK-NEXT: 20: f6 c2 02 testb $2, %dl
|
||||
# CHECK-NEXT: 23: 75 fa jne {{.*}}
|
||||
# CHECK-COUNT-2: : 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK: 35: c1 e9 02 shrl $2, %ecx
|
||||
# CHECK-NEXT: 38: e8 c3 ff ff ff callq {{.*}}
|
||||
# CHECK-NEXT: 3d: ff e0 jmpq *%rax
|
||||
# CHECK-NEXT: 3f: 55 pushq %rbp
|
||||
# CHECK-NEXT: 40: c2 63 00 retq $99
|
||||
|
||||
.text
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
shrl $2, %ecx
|
||||
.L1:
|
||||
movl %edx, %ecx
|
||||
jne .L1
|
||||
.L2:
|
||||
push %rbp
|
||||
testb $2, %dl
|
||||
jne .L2
|
||||
.rept 2
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
shrl $2, %ecx
|
||||
call foo
|
||||
jmp *%rax
|
||||
push %rbp
|
||||
ret $99
|
|
@ -1,50 +0,0 @@
|
|||
# Check option --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp+indirect+call+ret can cowork with option --mc-relax-all
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp+indirect+call+ret --mc-relax-all %s | llvm-objdump -d - > %t1
|
||||
# RUN: FileCheck --input-file=%t1 %s
|
||||
|
||||
# CHECK: 0000000000000000 <foo>:
|
||||
# CHECK-NEXT: 0: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 8: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 10: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 18: c1 e9 02 shrl $2, %ecx
|
||||
# CHECK-NEXT: 1b: 89 d1 movl %edx, %ecx
|
||||
# CHECK-NEXT: 1d: 90 nop
|
||||
# CHECK-NEXT: 1e: 90 nop
|
||||
# CHECK-NEXT: 1f: 90 nop
|
||||
# CHECK-NEXT: 20: 0f 85 f5 ff ff ff jne {{.*}}
|
||||
# CHECK-NEXT: 26: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 2e: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 36: f6 c2 02 testb $2, %dl
|
||||
# CHECK-NEXT: 39: 0f 85 e7 ff ff ff jne {{.*}}
|
||||
# CHECK-NEXT: 3f: 90 nop
|
||||
# CHECK-NEXT: 40: e9 d6 ff ff ff jmp {{.*}}
|
||||
# CHECK-NEXT: 45: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 4d: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 55: 64 89 04 25 01 00 00 00 movl %eax, %fs:1
|
||||
# CHECK-NEXT: 5d: 90 nop
|
||||
# CHECK-NEXT: 5e: 90 nop
|
||||
# CHECK-NEXT: 5f: 90 nop
|
||||
# CHECK-NEXT: 60: e8 9b ff ff ff callq {{.*}}
|
||||
# CHECK-NEXT: 65: e9 bc ff ff ff jmp {{.*}}
|
||||
.text
|
||||
.p2align 4
|
||||
foo:
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
shrl $2, %ecx
|
||||
.L1:
|
||||
movl %edx, %ecx
|
||||
jne .L1
|
||||
.L2:
|
||||
.rept 2
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
testb $2, %dl
|
||||
jne .L2
|
||||
jmp .L1
|
||||
.rept 3
|
||||
movl %eax, %fs:0x1
|
||||
.endr
|
||||
call foo
|
||||
jmp .L2
|
|
@ -0,0 +1,26 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+call %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Exercise some corner cases related to align directive.
|
||||
|
||||
.text
|
||||
# Check the align directive between the macro fused pair
|
||||
# does not make code crazy.
|
||||
# CHECK: 0: cmpq %rax, %rbp
|
||||
# CHECK: 3: nop
|
||||
# CHECK: 4: jne
|
||||
cmp %rax, %rbp
|
||||
.p2align 1
|
||||
jne bar
|
||||
|
||||
.rept 24
|
||||
int3
|
||||
.endr
|
||||
.p2align 1
|
||||
# Check we can ensure this call not cross or end at boundary when there
|
||||
# is a align directive before it.
|
||||
# CHECK: 20: callq *%rax
|
||||
call *%rax
|
||||
|
||||
.type bar,@function
|
||||
bar:
|
||||
retq
|
|
@ -0,0 +1,42 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Exercise cases where fused instructions need to be aligned.
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# 'cmp %rax, %rbp' is macro fused with 'jne foo',
|
||||
# so we need to align the pair.
|
||||
# CHECK: 20: cmpq %rax, %rbp
|
||||
# CHECK: 23: jne
|
||||
cmp %rax, %rbp
|
||||
jne foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 28
|
||||
int3
|
||||
.endr
|
||||
# 'cmp %rax, %rbp' is fusible but can not fused with `jo foo`,
|
||||
# so we only need to align 'jo foo'.
|
||||
# CHECK: 5c: cmpq %rax, %rbp
|
||||
cmp %rax, %rbp
|
||||
# CHECK: 60: jo
|
||||
jo foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 26
|
||||
int3
|
||||
.endr
|
||||
# The second 'cmp %rax, %rbp' is macro fused with 'jne foo'.
|
||||
cmp %rax, %rbp
|
||||
# CHECK: a0: cmpq %rax, %rbp
|
||||
# CHECK: a3: jne
|
||||
cmp %rax, %rbp
|
||||
jne foo
|
||||
int3
|
|
@ -0,0 +1,49 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp %s -o %t1
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-branches-within-32B-boundaries %s -o %t2
|
||||
# RUN: cmp %t1 %t2
|
||||
|
||||
# Check the general option --x86-branches-within-32B-boundaries is equivelent
|
||||
# to the fined options --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+jmp.
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 5
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
js foo
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
jmp foo
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
jmp *%rcx
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
call foo
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
ret $0
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 29
|
||||
int3
|
||||
.endr
|
||||
cmp %rax, %rbp
|
||||
je foo
|
|
@ -0,0 +1,51 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=jcc+jmp+indirect+call+ret %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Exercise cases where mixed kinds of branch are asked to be aligned.
|
||||
|
||||
.text
|
||||
.globl labeled_mixed_test1
|
||||
labeled_mixed_test1:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# This call should have started at 0x1e and ends at 0x23, so two bytes of
|
||||
# padding are inserted before it.
|
||||
# CHECK: 20: callq
|
||||
call bar
|
||||
.rept 28
|
||||
int3
|
||||
.endr
|
||||
# If the previous call was not aligned, this jmp should have started at 0x3f
|
||||
# and need two bytes of padding. After the two bytes of padding are inserted
|
||||
# for the call, this jmp starts at 0xa1 and does not need padding.
|
||||
# CHECK: 41: jmp
|
||||
jmp *%rax
|
||||
|
||||
.globl labeled_mixed_test2
|
||||
labeled_mixed_test2:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# This jne should have started at 0x7e, so two bytes of padding are inserted
|
||||
# before it.
|
||||
# CHECK: 80: jne
|
||||
jne bar
|
||||
.rept 28
|
||||
int3
|
||||
.endr
|
||||
# If the previous jne was not aligned, this jmp should have started at 0x3c.
|
||||
# After the two bytes of padding are inserted for the jne, this jmp should
|
||||
# have started at 0x9e, so two bytes of padding are inserted and it starts at
|
||||
# 0xa0.
|
||||
# CHECK: a0: jmp
|
||||
jmp bar
|
||||
|
||||
.globl labeled_mixed_test3
|
||||
labeled_mixed_test3:
|
||||
.p2align 5
|
||||
.type bar,@function
|
||||
bar:
|
||||
# CHECK: c0: retq
|
||||
retq
|
|
@ -0,0 +1,54 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc+indirect+call+ret %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Check if no instruction crosses or is against the boundary,
|
||||
# there will be no extra padding.
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 5
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 24
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 18: js
|
||||
js foo
|
||||
|
||||
.p2align 5
|
||||
.rept 24
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 38: jmp
|
||||
jmp foo
|
||||
|
||||
.p2align 5
|
||||
.rept 24
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 58: jmpq *%rcx
|
||||
jmp *%rcx
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 24
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 78: callq
|
||||
call foo
|
||||
|
||||
.p2align 5
|
||||
.rept 27
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 9b: retq $0
|
||||
ret $0
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 21
|
||||
int3
|
||||
.endr
|
||||
# CHECK: b5: cmpq %rax, %rbp
|
||||
# CHECK: b8: je
|
||||
cmp %rax, %rbp
|
||||
je foo
|
|
@ -0,0 +1,42 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=fused+jcc --mc-relax-all %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# Check instructions can be aligned correctly along with option --mc-relax-all
|
||||
|
||||
.text
|
||||
.global foo
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 25
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 19: jne
|
||||
# CHECK: 1f: int3
|
||||
jne foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 27
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 40: jne
|
||||
jne foo
|
||||
|
||||
.p2align 5
|
||||
.rept 22
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 76: testb $2, %dl
|
||||
# CHECK: 79: jne
|
||||
# CHECK: 7f: int3
|
||||
testb $2, %dl
|
||||
jne foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 27
|
||||
int3
|
||||
.endr
|
||||
# CHECK: a0: testb $2, %dl
|
||||
# CHECK: a3: jne
|
||||
testb $2, %dl
|
||||
jne foo
|
|
@ -0,0 +1,20 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=ret %s | llvm-readobj -S | FileCheck %s
|
||||
|
||||
# Check the aligment of section that contains instructions to be aligned
|
||||
# is correctly set.
|
||||
|
||||
# CHECK: Name: text1
|
||||
# CHECK: AddressAlignment: 32
|
||||
.section text1
|
||||
foo:
|
||||
ret
|
||||
|
||||
# CHECK: Name: text2
|
||||
# CHECK: AddressAlignment: 1
|
||||
.section text2
|
||||
nop
|
||||
|
||||
# CHECK: Name: text3
|
||||
# CHECK: AddressAlignment: 1
|
||||
.section text3
|
||||
jmp foo
|
|
@ -0,0 +1,93 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=jcc %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=JCC
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=jmp %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=JMP
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=indirect %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=IND
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=call %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=CAL
|
||||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=ret %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=RET
|
||||
|
||||
# Exercise cases where only one kind of instruction is asked to be aligned.
|
||||
# Fused instruction cases are excluded.
|
||||
|
||||
.text
|
||||
.globl foo
|
||||
.p2align 5
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# JCC: 20: jne
|
||||
# JMP: 1e: jne
|
||||
# IND: 1e: jne
|
||||
# CAL: 1e: jne
|
||||
# RET: 1e: jne
|
||||
jne foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# JCC: 5e: jmp
|
||||
# JMP: 60: jmp
|
||||
# IND: 5e: jmp
|
||||
# CAL: 5e: jmp
|
||||
# RET: 5e: jmp
|
||||
jmp foo
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# JCC: 9e: jmpq *%rax
|
||||
# JMP: 9e: jmpq *%rax
|
||||
# IND: a0: jmpq *%rax
|
||||
# CAL: 9e: jmpq *%rax
|
||||
# RET: 9e: jmpq *%rax
|
||||
jmp *%rax
|
||||
int3
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# JCC: de: callq *%rax
|
||||
# JMP: de: callq *%rax
|
||||
# IND: de: callq *%rax
|
||||
# CAL: e0: callq *%rax
|
||||
# RET: de: callq *%rax
|
||||
call *%rax
|
||||
int3
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# JCC: 11e: retq
|
||||
# JMP: 11e: retq
|
||||
# IND: 11e: retq
|
||||
# CAL: 11e: retq
|
||||
# RET: 120: retq
|
||||
ret $0
|
||||
int3
|
||||
|
||||
|
||||
.p2align 5
|
||||
.rept 29
|
||||
int3
|
||||
.endr
|
||||
# JCC: 15d: cmpq %rax, %rbp
|
||||
# JCC: 160: je
|
||||
# JMP: 15d: cmpq %rax, %rbp
|
||||
# JMP: 160: je
|
||||
# IND: 15d: cmpq %rax, %rbp
|
||||
# IND: 160: je
|
||||
# CAL: 15d: cmpq %rax, %rbp
|
||||
# CAL: 160: je
|
||||
# RET: 15d: cmpq %rax, %rbp
|
||||
# RET: 160: je
|
||||
cmp %rax, %rbp
|
||||
je foo
|
||||
int3
|
|
@ -0,0 +1,57 @@
|
|||
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=call+indirect %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=64BIT,CHECK
|
||||
|
||||
# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=call+indirect %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s --check-prefixes=32BIT,CHECK
|
||||
|
||||
# Exercise cases where the instruction to be aligned has a variant symbol
|
||||
# operand, and we can't add before it since linker may rewrite it.
|
||||
|
||||
.text
|
||||
.global foo
|
||||
|
||||
foo:
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 1d: int3
|
||||
# 64BIT: 1e: callq
|
||||
# 32BIT: 1e: calll
|
||||
# CHECK: 23: int3
|
||||
call ___tls_get_addr@PLT
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 5d: int3
|
||||
# 64BIT: 5e: callq *(%ecx)
|
||||
# 64BIT: 65: int3
|
||||
# 32BIT: 5e: calll *(%ecx)
|
||||
# 32BIT: 64: int3
|
||||
call *___tls_get_addr@GOT(%ecx)
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# CHECK: 9d: int3
|
||||
# 64BIT: 9e: callq *(%eax)
|
||||
# 64BIT: a1: int3
|
||||
# 32BIT: 9e: calll *(%eax)
|
||||
# 32BIT: a0: int3
|
||||
call *foo@tlscall(%eax)
|
||||
int3
|
||||
|
||||
.p2align 5
|
||||
.rept 30
|
||||
int3
|
||||
.endr
|
||||
# CHECK: dd: int3
|
||||
# 64BIT: de: jmpq *(%eax)
|
||||
# 64BIT: e1: int3
|
||||
# 32BIT: de: jmpl *(%eax)
|
||||
# 32BIT: e0: int3
|
||||
jmp *foo@tlscall(%eax)
|
||||
int3
|
Loading…
Reference in New Issue