summaryrefslogtreecommitdiff
path: root/test/MC/ARM/eh-directive-pad.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/MC/ARM/eh-directive-pad.s')
-rw-r--r--test/MC/ARM/eh-directive-pad.s226
1 files changed, 226 insertions, 0 deletions
diff --git a/test/MC/ARM/eh-directive-pad.s b/test/MC/ARM/eh-directive-pad.s
new file mode 100644
index 0000000000..ba850ffe77
--- /dev/null
+++ b/test/MC/ARM/eh-directive-pad.s
@@ -0,0 +1,226 @@
+@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \
+@ RUN: | llvm-readobj -s -sd | FileCheck %s
+
+@ Check for different stack pointer offsets.
+
+@ The .pad directive will track the stack pointer offsets. There are several
+@ ways to encode the stack offsets. We have to test:
+@
+@ offset < 0x00
+@ offset == 0x00
+@ 0x04 <= offset <= 0x100
+@ 0x104 <= offset <= 0x200
+@ 0x204 <= offset
+
+
+ .syntax unified
+
+@-------------------------------------------------------------------------------
+@ TEST1
+@-------------------------------------------------------------------------------
+ .section .TEST1
+ .globl func1
+ .align 2
+ .type func1,%function
+ .fnstart
+func1:
+ .pad #0
+ sub sp, sp, #0
+ add sp, sp, #0
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@-------------------------------------------------------------------------------
+@ The assembler should emit nothing (will be filled up with finish opcode).
+@-------------------------------------------------------------------------------
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST1
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B0B0B000 |........|
+@ CHECK: )
+@ CHECK: }
+
+
+
+@-------------------------------------------------------------------------------
+@ TEST2
+@-------------------------------------------------------------------------------
+ .section .TEST2
+ .globl func2a
+ .align 2
+ .type func2a,%function
+ .fnstart
+func2a:
+ .pad #0x4
+ sub sp, sp, #0x4
+ add sp, sp, #0x4
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func2b
+ .align 2
+ .type func2b,%function
+ .fnstart
+func2b:
+ .pad #0x100
+ sub sp, sp, #0x100
+ add sp, sp, #0x100
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@-------------------------------------------------------------------------------
+@ The assembler should emit ((offset - 4) >> 2).
+@-------------------------------------------------------------------------------
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST2
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B0B00000 00000000 B0B03F00 |..............?.|
+@ CHECK: )
+@ CHECK: }
+
+
+@-------------------------------------------------------------------------------
+@ TEST3
+@-------------------------------------------------------------------------------
+ .section .TEST3
+ .globl func3a
+ .align 2
+ .type func3a,%function
+ .fnstart
+func3a:
+ .pad #0x104
+ sub sp, sp, #0x104
+ add sp, sp, #0x104
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func3b
+ .align 2
+ .type func3b,%function
+ .fnstart
+func3b:
+ .pad #0x200
+ sub sp, sp, #0x200
+ add sp, sp, #0x200
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@-------------------------------------------------------------------------------
+@ The assembler should emit 0x3F and ((offset - 0x104) >> 2).
+@-------------------------------------------------------------------------------
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST3
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B0003F00 00000000 B03F3F00 |......?......??.|
+@ CHECK: )
+@ CHECK: }
+
+
+
+@-------------------------------------------------------------------------------
+@ TEST4
+@-------------------------------------------------------------------------------
+ .section .TEST4
+ .globl func4a
+ .align 2
+ .type func4a,%function
+ .fnstart
+func4a:
+ .pad #0x204
+ sub sp, sp, #0x204
+ add sp, sp, #0x204
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func4b
+ .align 2
+ .type func4b,%function
+ .fnstart
+func4b:
+ .pad #0x580
+ sub sp, sp, #0x580
+ add sp, sp, #0x580
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@-------------------------------------------------------------------------------
+@ The assembler should emit 0xB2 and the ULEB128 encoding of
+@ ((offset - 0x204) >> 2).
+@-------------------------------------------------------------------------------
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST4
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B000B200 00000000 01DFB200 |................|
+@ CHECK: )
+@ CHECK: }
+
+
+
+@-------------------------------------------------------------------------------
+@ TEST5
+@-------------------------------------------------------------------------------
+ .section .TEST5
+ .globl func4a
+ .align 2
+ .type func4a,%function
+ .fnstart
+func5a:
+ .pad #-0x4
+ add sp, sp, #0x4
+ sub sp, sp, #0x4
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func5b
+ .align 2
+ .type func5b,%function
+ .fnstart
+func5b:
+ .pad #-0x104
+ add sp, sp, #0x104
+ sub sp, sp, #0x4
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+ .globl func5c
+ .align 2
+ .type func5c,%function
+ .fnstart
+func5c:
+ .pad #-0x204
+ add sp, sp, #0x204
+ sub sp, sp, #0x4
+ bx lr
+ .personality __gxx_personality_v0
+ .handlerdata
+ .fnend
+
+@-------------------------------------------------------------------------------
+@ The assembler should emit (0x40 | (-offset - 4)) >> 2. When (-offset - 4)
+@ is greater than 0x3f, then multiple 0x7f should be emitted.
+@-------------------------------------------------------------------------------
+@ CHECK: Section {
+@ CHECK: Name: .ARM.extab.TEST5
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B0B04000 00000000 B0407F00 |......@......@..|
+@ CHECK: 0010: 00000000 407F7F00 |....@...|
+@ CHECK: )
+@ CHECK: }