| # RUN: llvm-mc -filetype=obj -triple x86_64 --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 |
| |
| # 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: 200: int3 |
| # CHECK: 21a: testq |
| # CHECK: 21d: jne |
| # CHECK: 21f: nop |
| # CHECK: 220: 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: 240: int3 |
| # CHECK: 25d: jmp |
| # CHECK: 25f: nop |
| # CHECK: 260: 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 |