[llvm] be051f4 - [Test] Add examples of problematic assembler auto-padding
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 22 09:01:11 PST 2019
Author: Philip Reames
Date: 2019-12-22T09:01:04-08:00
New Revision: be051f4312aa0952b7cf937f44b9b46e4ffee627
URL: https://github.com/llvm/llvm-project/commit/be051f4312aa0952b7cf937f44b9b46e4ffee627
DIFF: https://github.com/llvm/llvm-project/commit/be051f4312aa0952b7cf937f44b9b46e4ffee627.diff
LOG: [Test] Add examples of problematic assembler auto-padding
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.
Added:
llvm/test/MC/X86/align-branch-64-negative.s
Modified:
Removed:
################################################################################
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
index 000000000000..c310e4700012
--- /dev/null
+++ b/llvm/test/MC/X86/align-branch-64-negative.s
@@ -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, at function
+bar:
+ retq
More information about the llvm-commits
mailing list