From 0bd5bbb31e0345aed8d029d70a4197aed53a3cd5 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 17 Jun 2021 12:13:55 +0100 Subject: [PATCH] [X86] Add test showing binary differences with -x86-pad-for-align. This patch adds a test case showing how a single extra .loc can cause binary differences when using -x86-pad-for-align=true. The issue has been discussed in D94542, PR42138, PR48742. --- .../test/MC/X86/Inputs/pad-align-with-debug.s | 45 +++++++++++ .../MC/X86/Inputs/pad-align-without-debug.s | 43 ++++++++++ llvm/test/MC/X86/pad-for-align-debug.s | 81 +++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 llvm/test/MC/X86/Inputs/pad-align-with-debug.s create mode 100644 llvm/test/MC/X86/Inputs/pad-align-without-debug.s create mode 100644 llvm/test/MC/X86/pad-for-align-debug.s diff --git a/llvm/test/MC/X86/Inputs/pad-align-with-debug.s b/llvm/test/MC/X86/Inputs/pad-align-with-debug.s new file mode 100644 index 000000000000..56a0378010f8 --- /dev/null +++ b/llvm/test/MC/X86/Inputs/pad-align-with-debug.s @@ -0,0 +1,45 @@ +# See PR48742. + .text + .p2align 4 +foo: + .file 1 "foo.c" + movq %rdi, %rax + .p2align 4,,10 + .p2align 3 +L1: + movzbl (%rax), %edx + cmpb $10, %dl + je L4 +L2: + cmpb $100, %dl + je L5 + cmpb $200, %dl + je L5 + cmpb $300, %dl + jne L5 + .p2align 4,,10 + .p2align 3 +L3: + movq %rax, %rdx + incq %rax + cmpb $30, (%rax) + jne L3 + leaq 2(%rdx), %rax + movzbl (%rax), %edx + .loc 1 1234 5 + cmpb $90, %dl + jne L2 + .p2align 4,,10 + .p2align 3 +L4: + cmpb $99, 4(%rax) + je L7 +L5: + incq %rax + jmp L1 + .p2align 4,,10 + .p2align 3 +L6: + ret +L7: + ret diff --git a/llvm/test/MC/X86/Inputs/pad-align-without-debug.s b/llvm/test/MC/X86/Inputs/pad-align-without-debug.s new file mode 100644 index 000000000000..74c27ed887fa --- /dev/null +++ b/llvm/test/MC/X86/Inputs/pad-align-without-debug.s @@ -0,0 +1,43 @@ +# See PR48742. + .text + .p2align 4 +foo: + movq %rdi, %rax + .p2align 4,,10 + .p2align 3 +L1: + movzbl (%rax), %edx + cmpb $10, %dl + je L4 +L2: + cmpb $100, %dl + je L5 + cmpb $200, %dl + je L5 + cmpb $300, %dl + jne L5 + .p2align 4,,10 + .p2align 3 +L3: + movq %rax, %rdx + incq %rax + cmpb $30, (%rax) + jne L3 + leaq 2(%rdx), %rax + movzbl (%rax), %edx + cmpb $90, %dl + jne L2 + .p2align 4,,10 + .p2align 3 +L4: + cmpb $99, 4(%rax) + je L7 +L5: + incq %rax + jmp L1 + .p2align 4,,10 + .p2align 3 +L6: + ret +L7: + ret diff --git a/llvm/test/MC/X86/pad-for-align-debug.s b/llvm/test/MC/X86/pad-for-align-debug.s new file mode 100644 index 000000000000..2e3bed9683c8 --- /dev/null +++ b/llvm/test/MC/X86/pad-for-align-debug.s @@ -0,0 +1,81 @@ +# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=true %S/Inputs/pad-align-with-debug.s | llvm-objdump -d - | FileCheck --check-prefix=CHECK --check-prefix=DEBUG %s +# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=true %S/Inputs/pad-align-without-debug.s | llvm-objdump -d - | FileCheck --check-prefix=CHECK --check-prefix=NODEBUG %s +# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=false %S/Inputs/pad-align-without-debug.s | llvm-objdump -d - | FileCheck --check-prefix=NOPAD %s +# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=false %S/Inputs/pad-align-with-debug.s | llvm-objdump -d - | FileCheck --check-prefix=NOPAD %s + +; Test case to show that -x86-pad-for-align causes binary differences in the +; presence of debug locations. Inputs/pad-align-with-debug.s and +; Inputs/pad-align-without-debug.s are equivalent, modulo a single .loc, which +; cause the difference in the binary below. This should be fixed, before +; x86-pad-for-align=true becomes the default. + +; Also see PR48742. + + +; CHECK-LABEL: 0000000000000000 : +; CHECK: 0: 48 89 f8 movq %rdi, %rax +; CHECK-NEXT: 3: 0f 1f 44 00 00 nopl (%rax,%rax) +; CHECK-NEXT: 8: 0f b6 10 movzbl (%rax), %edx +; CHECK-NEXT: b: 80 fa 0a cmpb $10, %dl +; CHECK-NEXT: e: 74 30 je 0x40 +; CHECK-NEXT: 10: 80 fa 64 cmpb $100, %dl +; CHECK-NEXT: 13: 74 31 je 0x46 +; CHECK-NEXT: 15: 80 fa c8 cmpb $-56, %dl +; CHECK-NEXT: 18: 74 2c je 0x46 +; CHECK-NEXT: 1a: 80 fa 2c cmpb $44, %dl +; CHECK-NEXT: 1d: 75 27 jne 0x46 +; CHECK-NEXT: 1f: 90 nop +; CHECK-NEXT: 20: 48 89 c2 movq %rax, %rdx +; CHECK-NEXT: 23: 48 ff c0 incq %rax +; CHECK-NEXT: 26: 80 38 1e cmpb $30, (%rax) + +; DEBUG-NEXT: 29: 75 f5 jne 0x20 +; DEBUG-NEXT: 2b: 48 8d 42 02 leaq 2(%rdx), %rax +; DEBUG-NEXT: 2f: 0f b6 10 movzbl (%rax), %edx +; DEBUG-NEXT: 32: 80 fa 5a cmpb $90, %dl +; DEBUG-NEXT: 35: 0f 85 d5 ff ff ff jne 0x10 +; DEBUG-NEXT: 3b: 0f 1f 44 00 00 nopl (%rax,%rax) + +; NODEBUG-NEXT: 29: 0f 85 f1 ff ff ff jne 0x20 +; NODEBUG-NEXT: 2f: 48 8d 42 02 leaq 2(%rdx), %rax +; NODEBUG-NEXT: 33: 0f b6 10 movzbl (%rax), %edx +; NODEBUG-NEXT: 36: 80 fa 5a cmpb $90, %dl +; NODEBUG-NEXT: 39: 0f 85 d1 ff ff ff jne 0x10 +; NODEBUG-NEXT: 3f: 90 nop + +; CHECK-NEXT: 40: 80 78 04 63 cmpb $99, 4(%rax) +; CHECK-NEXT: 44: 74 0b je 0x51 +; CHECK-NEXT: 46: 48 ff c0 incq %rax +; CHECK-NEXT: 49: e9 ba ff ff ff jmp 0x8 +; CHECK-NEXT: 4e: 66 90 nop +; CHECK-NEXT: 50: c3 retq +; CHECK-NEXT: 51: c3 retq + +; NOPAD: 0: 48 89 f8 movq %rdi, %rax +; NOPAD-NEXT: 3: 0f 1f 44 00 00 nopl (%rax,%rax) +; NOPAD-NEXT: 8: 0f b6 10 movzbl (%rax), %edx +; NOPAD-NEXT: b: 80 fa 0a cmpb $10, %dl +; NOPAD-NEXT: e: 74 30 je 0x40 +; NOPAD-NEXT: 10: 80 fa 64 cmpb $100, %dl +; NOPAD-NEXT: 13: 74 31 je 0x46 +; NOPAD-NEXT: 15: 80 fa c8 cmpb $-56, %dl +; NOPAD-NEXT: 18: 74 2c je 0x46 +; NOPAD-NEXT: 1a: 80 fa 2c cmpb $44, %dl +; NOPAD-NEXT: 1d: 75 27 jne 0x46 +; NOPAD-NEXT: 1f: 90 nop +; NOPAD-NEXT: 20: 48 89 c2 movq %rax, %rdx +; NOPAD-NEXT: 23: 48 ff c0 incq %rax +; NOPAD-NEXT: 26: 80 38 1e cmpb $30, (%rax) +; NOPAD-NEXT: 29: 75 f5 jne 0x20 +; NOPAD-NEXT: 2b: 48 8d 42 02 leaq 2(%rdx), %rax +; NOPAD-NEXT: 2f: 0f b6 10 movzbl (%rax), %edx +; NOPAD-NEXT: 32: 80 fa 5a cmpb $90, %dl +; NOPAD-NEXT: 35: 75 d9 jne 0x10 +; NOPAD-NEXT: 37: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax) +; NOPAD-NEXT: 40: 80 78 04 63 cmpb $99, 4(%rax) +; NOPAD-NEXT: 44: 74 0b je 0x51 +; NOPAD-NEXT: 46: 48 ff c0 incq %rax +; NOPAD-NEXT: 49: eb bd jmp 0x8 +; NOPAD-NEXT: 4b: 0f 1f 44 00 00 nopl (%rax,%rax) +; NOPAD-NEXT: 50: c3 retq +; NOPAD-NEXT: 51: c3 retq