forked from OSchip/llvm-project
164 lines
2.9 KiB
ArmAsm
164 lines
2.9 KiB
ArmAsm
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=call+jmp+indirect+ret+jcc %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
|
|
|
|
# These tests are checking the basic cases for each instructions, and a
|
|
# bit of the alignment checking logic itself. Fused instruction cases are
|
|
# excluded, as are details of argument parsing.
|
|
|
|
# instruction sizes for reference:
|
|
# callq is 5 bytes long
|
|
# int3 is 1 byte
|
|
# jmp <near-label> is 2 bytes
|
|
# jmp <far-label> is 5 bytes
|
|
# ret N is 2 bytes
|
|
|
|
# Next couple tests are checking the edge cases on the alignment computation
|
|
|
|
.text
|
|
# CHECK: <test1>:
|
|
# CHECK: 20: callq
|
|
.globl test1
|
|
.p2align 5
|
|
test1:
|
|
.rept 29
|
|
int3
|
|
.endr
|
|
callq bar
|
|
|
|
# CHECK: <test2>:
|
|
# CHECK: 60: callq
|
|
.globl test2
|
|
.p2align 5
|
|
test2:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
callq bar
|
|
|
|
# CHECK: <test3>:
|
|
# CHECK: a0: callq
|
|
.globl test3
|
|
.p2align 5
|
|
test3:
|
|
.rept 27
|
|
int3
|
|
.endr
|
|
callq bar
|
|
|
|
# next couple check instruction type coverage
|
|
|
|
# CHECK: <test_jmp>:
|
|
# CHECK: e0: jmp
|
|
.globl test_jmp
|
|
.p2align 5
|
|
test_jmp:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
jmp bar
|
|
|
|
# CHECK: <test_ret>:
|
|
# CHECK: 120: retq
|
|
.globl test_ret
|
|
.p2align 5
|
|
test_ret:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
retq $0
|
|
|
|
# check a case with a relaxable instruction
|
|
|
|
# CHECK: <test_jmp_far>:
|
|
# CHECK: 160: jmp
|
|
.globl test_jmp_far
|
|
.p2align 5
|
|
test_jmp_far:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
jmp baz
|
|
|
|
# CHECK: <test_jcc>:
|
|
# CHECK: 1a0: jne
|
|
.globl test_jcc
|
|
.p2align 5
|
|
test_jcc:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
jne bar
|
|
|
|
# CHECK: <test_indirect>:
|
|
# CHECK: 1e0: jmp
|
|
.globl test_indirect
|
|
.p2align 5
|
|
test_indirect:
|
|
.rept 31
|
|
int3
|
|
.endr
|
|
jmpq *(%rax)
|
|
|
|
.p2align 4
|
|
.type bar,@function
|
|
bar:
|
|
retq
|
|
|
|
# CHECK: <test_pad_via_relax>:
|
|
# CHECK: 200: testq
|
|
# CHECK: 203: jne
|
|
# CHECK: 209: int3
|
|
# note 6 byte jne which could be a 2 byte jne, but is instead
|
|
# expanded for padding purposes
|
|
# CHECK-NOT: nop
|
|
# CHECK: 220: callq
|
|
.global test_pad_via_relax
|
|
.p2align 5
|
|
test_pad_via_relax:
|
|
testq %rax, %rax
|
|
jnz bar
|
|
.rept 23
|
|
int3
|
|
.endr
|
|
callq bar
|
|
|
|
# This case looks really tempting to pad, but doing so for the call causes
|
|
# the jmp to be misaligned.
|
|
# CHECK: <test_pad_via_relax_neg1>:
|
|
# CHECK: 240: int3
|
|
# CHECK: 25a: testq
|
|
# CHECK: 25d: jne
|
|
# CHECK: 25f: nop
|
|
# CHECK: 260: callq
|
|
.global test_pad_via_relax_neg1
|
|
.p2align 5
|
|
test_pad_via_relax_neg1:
|
|
.rept 26
|
|
int3
|
|
.endr
|
|
testq %rax, %rax
|
|
jnz bar
|
|
callq bar
|
|
|
|
# Same as previous, but without fusion
|
|
# CHECK: <test_pad_via_relax_neg2>:
|
|
# CHECK: 280: int3
|
|
# CHECK: 29d: jmp
|
|
# CHECK: 29f: nop
|
|
# CHECK: 2a0: callq
|
|
.global test_pad_via_relax_neg2
|
|
.p2align 5
|
|
test_pad_via_relax_neg2:
|
|
.rept 29
|
|
int3
|
|
.endr
|
|
jmp bar2
|
|
callq bar2
|
|
|
|
bar2:
|
|
|
|
.section "unknown"
|
|
.p2align 4
|
|
.type baz,@function
|
|
baz:
|
|
retq
|