summaryrefslogtreecommitdiff
path: root/test/MC
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-01-30 04:46:24 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-01-30 04:46:24 +0000
commit7a38b33decb80eff92060b7ad95ff1b877f685c3 (patch)
tree38e81c5521ec7a49f8cae28f2658171f49bd3026 /test/MC
parent2c9ed5d050b5c57bfed35bd82c23f46c714d10c0 (diff)
downloadllvm-7a38b33decb80eff92060b7ad95ff1b877f685c3.tar.gz
llvm-7a38b33decb80eff92060b7ad95ff1b877f685c3.tar.bz2
llvm-7a38b33decb80eff92060b7ad95ff1b877f685c3.tar.xz
ARM IAS: support .movsp
.movsp is an ARM unwinding directive that indicates to the unwinder that a register contains an offset from the current stack pointer. If the offset is unspecified, it defaults to zero. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200449 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/MC')
-rw-r--r--test/MC/ARM/eh-directive-movsp-diagnostics.s102
-rw-r--r--test/MC/ARM/eh-directive-movsp.s44
2 files changed, 146 insertions, 0 deletions
diff --git a/test/MC/ARM/eh-directive-movsp-diagnostics.s b/test/MC/ARM/eh-directive-movsp-diagnostics.s
new file mode 100644
index 0000000000..519e7d742f
--- /dev/null
+++ b/test/MC/ARM/eh-directive-movsp-diagnostics.s
@@ -0,0 +1,102 @@
+@ RUN: not llvm-mc -triple armv7-eabi -filetype asm -o /dev/null 2>&1 %s \
+@ RUN: | FileCheck %s
+
+ .syntax unified
+ .thumb
+
+ .global false_start
+ .type false_start,%function
+ .thumb_func
+false_start:
+ .movsp r7
+
+@ CHECK: error: .fnstart must precede .movsp directive
+@ CHECK: .movsp r7
+@ CHECK: ^
+
+ .global beyond_saving
+ .type beyond_saving,%function
+ .thumb_func
+beyond_saving:
+ .fnstart
+ .setfp r11, sp, #8
+ add r11, sp, #8
+ .movsp r7
+ mov r7, r11
+ .fnend
+
+@ CHECK: error: unexpected .movsp directive
+@ CHECK: .movsp r7
+@ CHECK: ^
+
+
+ .global sp_invalid
+ .type sp_invalid,%function
+ .thumb_func
+sp_invalid:
+ .fnstart
+ .movsp r13
+ mov sp, sp
+ .fnend
+
+@ CHECK: error: sp and pc are not permitted in .movsp directive
+@ CHECK: .movsp r13
+@ CHECK: ^
+
+
+ .global pc_invalid
+ .type pc_invalid,%function
+ .thumb_func
+pc_invalid:
+ .fnstart
+ .movsp r15
+ mov sp, pc
+ .fnend
+
+@ CHECK: error: sp and pc are not permitted in .movsp directive
+@ CHECK: .movsp r15
+@ CHECK: ^
+
+
+ .global constant_required
+ .type constant_required,%function
+ .thumb_func
+constant_required:
+ .fnstart
+ .movsp r11,
+ mov sp, r11
+ .fnend
+
+@ CHECK: error: expected #constant
+@ CHECK: .movsp r11,
+@ CHECK: ^
+
+
+ .global constant_constant
+ .type constant_constant,%function
+ .thumb_func
+constant_constant:
+ .fnstart
+ .movsp r11, #constant
+ mov sp, r11
+ .fnend
+
+@ CHECK: error: offset must be an immediate constant
+@ CHECK: .movsp r11, #constant
+@ CHECK: ^
+
+
+ .arm
+
+ .global register_required
+ .type register_required,%function
+register_required:
+ .fnstart
+ .movsp #42
+ mov sp, #42
+ .fnend
+
+@ CHECK: error: register expected
+@ CHECK: .movsp #42
+@ CHECK: ^
+
diff --git a/test/MC/ARM/eh-directive-movsp.s b/test/MC/ARM/eh-directive-movsp.s
new file mode 100644
index 0000000000..620f5b769d
--- /dev/null
+++ b/test/MC/ARM/eh-directive-movsp.s
@@ -0,0 +1,44 @@
+@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -s -sd \
+@ RUN: | FileCheck %s
+
+ .syntax unified
+ .thumb
+
+ .section .duplicate
+
+ .global duplicate
+ .type duplicate,%function
+duplicate:
+ .fnstart
+ .setfp sp, sp, #8
+ add sp, sp, #8
+ .movsp r11
+ mov r11, sp
+ .fnend
+
+@ CHECK: Section {
+@ CHECK: Name: .ARM.exidx.duplicate
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 B09B9B80
+@ CHECK: )
+@ CHECK: }
+
+
+ .section .squash
+
+ .global squash
+ .type squash,%function
+squash:
+ .fnstart
+ .movsp ip
+ mov ip, sp
+ .save {fp, ip, lr}
+ stmfd sp!, {fp, ip, lr}
+ .fnend
+
+@ CHECK: Section {
+@ CHECK: Name: .ARM.exidx.squash
+@ CHECK: SectionData (
+@ CHECK: 0000: 00000000 9C808580
+@ CHECK: )
+@ CHECK: }