[Test] Add examples of problematic assembler auto-padding
authorPhilip Reames <listmail@philipreames.com>
Sun, 22 Dec 2019 16:59:35 +0000 (08:59 -0800)
committerPhilip Reames <listmail@philipreames.com>
Sun, 22 Dec 2019 17:01:04 +0000 (09:01 -0800)
This is in the context of the automatic padding work for the jcc erratum mitigation.  These are example cases we need to *not* pad for correctness.  Exact mechanism to suppress is still TBD, but saving the tests which have come up.

llvm/test/MC/X86/align-branch-64-negative.s [new file with mode: 0644]

diff --git a/llvm/test/MC/X86/align-branch-64-negative.s b/llvm/test/MC/X86/align-branch-64-negative.s
new file mode 100644 (file)
index 0000000..c310e47
--- /dev/null
@@ -0,0 +1,65 @@
+  # RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --x86-align-branch-boundary=32 --x86-align-branch=call+jmp+indirect+ret+jcc+fused %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s
+
+  # This file includes cases which are problematic to apply automatic padding
+  # in the assembler.  These are the examples brought up in review and
+  # discussion which motivate the need for a assembler directive to
+  # selectively enable/disable.
+  # FIXME: the checks are checking current *incorrect* behavior
+
+  .text
+
+  # In the first test, we have a label which is expected to be bound to the
+  # start of the call.  For instance, we want to associate a fault on the call
+  # target with some bit of higher level sementic.
+  # CHECK: labeled_call_test1:
+  # CHECK: 1f label_before
+  # CHECK: 1f: nop
+  # CHECK: 20: callq
+  .globl  labeled_call_test1
+  .p2align  5
+labeled_call_test1:
+  .rept 31
+  int3
+  .endr
+label_before:
+  callq bar
+
+  # In the second test, we have a label which is expected to be bound to the
+  # end of the call.  For instance, we want the to associate some data with
+  # the return address of the call.
+  # CHECK: labeled_call_test2:
+  # CHECK: 5a: callq
+  # CHECK: 5f: nop
+  # CHECK: 60 label_after
+  # CHECK: 60: jmp
+  .globl  labeled_call_test2
+  .p2align  5
+labeled_call_test2:
+  .rept 26
+  int3
+  .endr
+  callq bar
+label_after:
+  jmp bar
+
+  # Our third test is like the first w/a labeled fault, but specifically to
+  # a fused memory comparison.  This is the form produced by implicit null
+  # checks for instance.
+  # CHECK: implicit_null_check:
+  # CHECK: 9f fault_addr
+  # CHECK: 9f: nop
+  # CHECK: a0: cmpq
+  .globl  implicit_null_check
+  .p2align  5
+implicit_null_check:
+  .rept 31
+  int3
+  .endr
+fault_addr:
+  cmpq (%rsi), %rdi
+  jne bar
+
+  .p2align 4
+  .type   bar,@function
+bar:
+  retq