From 4fa3602bd53183badf1d259128a5f951f32db8cb Mon Sep 17 00:00:00 2001
From: Paul Brook <paul@codesourcery.com>
Date: Sat, 16 Sep 2006 16:24:28 +0000
Subject: [PATCH] 2006-09-16  Paul Brook  <paul@codesourcery.com>

	gas/
	* config/tc-arm.c (s_arm_unwind_movsp): Add offset argument.
	* doc/c-arm.texi (movsp): Document offset argument.

	gas/testsuite/
	* gas/arm/unwind.s: Test two argument form of .movsp.
	* gas/arm/unwind.d: Update expected output.
	* gas/arm/unwind_vxworks.d: Ditto.
---
 gas/ChangeLog                          |  5 +++++
 gas/config/tc-arm.c                    | 13 ++++++++++++-
 gas/doc/c-arm.texi                     |  6 ++++--
 gas/testsuite/ChangeLog                |  6 ++++++
 gas/testsuite/gas/arm/unwind.d         |  8 ++++++--
 gas/testsuite/gas/arm/unwind.s         | 14 ++++++++++++++
 gas/testsuite/gas/arm/unwind_vxworks.d |  6 +++++-
 7 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 56bdc8ac1ca..5ea2728bc3c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-16  Paul Brook  <paul@codesourcery.com>
+
+	* config/tc-arm.c (s_arm_unwind_movsp): Add offset argument.
+	* doc/c-arm.texi (movsp): Document offset argument.
+
 2006-09-16  Paul Brook  <paul@codesourcery.com>
 
 	* config/tc-arm.c (thumb32_negate_data_op): Consistently use
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index e8fe7cfb916..f203e79a7d5 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -3628,6 +3628,7 @@ s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
 {
   int reg;
   valueT op;
+  int offset;
 
   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
   if (reg == FAIL)
@@ -3636,6 +3637,16 @@ s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
       ignore_rest_of_line ();
       return;
     }
+
+  /* Optional constant.	 */
+  if (skip_past_comma (&input_line_pointer) != FAIL)
+    {
+      if (immediate_for_directive (&offset) == FAIL)
+	return;
+    }
+  else
+    offset = 0;
+
   demand_empty_rest_of_line ();
 
   if (reg == REG_SP || reg == REG_PC)
@@ -3653,7 +3664,7 @@ s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
 
   /* Record the information for later.	*/
   unwind.fp_reg = reg;
-  unwind.fp_offset = unwind.frame_size;
+  unwind.fp_offset = unwind.frame_size - offset;
   unwind.sp_restored = 1;
 }
 
diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi
index d9b7b26125a..7fede6cf9f9 100644
--- a/gas/doc/c-arm.texi
+++ b/gas/doc/c-arm.texi
@@ -545,8 +545,10 @@ A positive value indicates the function prologue allocated stack space by
 decrementing the stack pointer.
 
 @cindex @code{.movsp} directive, ARM
-@item .movsp @var{reg}
-Tell the unwinder that @var{reg} contains the current stack pointer.
+@item .movsp @var{reg} [, #@var{offset}]
+Tell the unwinder that @var{reg} contains an offset from the current
+stack pointer.  If @var{offset} is not specified then it is assumed to be
+zero.
 
 @cindex @code{.setfp} directive, ARM
 @item .setfp @var{fpreg}, @var{spreg} [, #@var{offset}]
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 93c5f2936eb..506b7055863 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-09-16  Paul Brook  <paul@codesourcery.com>
+
+	* gas/arm/unwind.s: Test two argument form of .movsp.
+	* gas/arm/unwind.d: Update expected output.
+	* gas/arm/unwind_vxworks.d: Ditto.
+
 2006-09-08  Kazu Hirata  <kazu@codesourcery.com>
 
 	* lib/gas-dg.exp (gas-dg-test): Treat $dir as a literal.
diff --git a/gas/testsuite/gas/arm/unwind.d b/gas/testsuite/gas/arm/unwind.d
index e7a9036d64d..060f7ba56af 100644
--- a/gas/testsuite/gas/arm/unwind.d
+++ b/gas/testsuite/gas/arm/unwind.d
@@ -25,18 +25,22 @@ OFFSET   TYPE              VALUE
 0000001c R_ARM_PREL31      .ARM.extab.*
 00000020 R_ARM_PREL31      .text.*
 00000028 R_ARM_PREL31      .text.*
+00000030 R_ARM_PREL31      .text.*
+00000034 R_ARM_PREL31      .ARM.extab.*
 
 
 Contents of section .text:
  0000 (0000a0e3 0100a0e3 0200a0e3 0300a0e3|e3a00000 e3a00001 e3a00002 e3a00003)  .*
- 0010 (04200520|20052004)                             .*
+ 0010 (04200520 0600a0e3|20052004 e3a00006)                    .*
 Contents of section .ARM.extab:
  0000 (449b0181 b0b08086|81019b44 8680b0b0) 00000000 00000000  .*
  0010 (8402b101 b0b0b005 2a000000 00c60281|01b10284 05b0b0b0 0000002a 8102c600)  .*
- 0020 (d0c6c1c1 b0b0c0c6|c1c1c6d0 c6c0b0b0) 00000000           .*
+ 0020 (d0c6c1c1 b0b0c0c6|c1c1c6d0 c6c0b0b0) 00000000 (429b0181|81019b42)  .*
+ 0030 (b0008086|868000b0) 00000000                    .*
 Contents of section .ARM.exidx:
  0000 00000000 (b0b0a880 04000000|80a8b0b0 00000004) 00000000  .*
  0010 (08000000 0c000000 0c000000 1c000000|00000008 0000000c 0000000c 0000001c)  .*
  0020 (10000000 08849780 12000000 b00fb180|00000010 80978408 00000012 80b10fb0)  .*
+ 0030 (14000000 2c000000|00000014 0000002c)                    .*
 # Ignore .ARM.attributes section
 #...
diff --git a/gas/testsuite/gas/arm/unwind.s b/gas/testsuite/gas/arm/unwind.s
index f0503788b3a..bbd73a157d9 100644
--- a/gas/testsuite/gas/arm/unwind.s
+++ b/gas/testsuite/gas/arm/unwind.s
@@ -51,3 +51,17 @@ foo5:	@ Save r0-r3 only.
 	.save {r0, r1, r2, r3}
 	mov r0, #5
 	.fnend
+	.code 32
+foo6:	@ Nested function with frame pointer
+	.fnstart
+	.pad #4
+	@push {ip}
+	.movsp ip, #4
+	@mov ip, sp
+	.pad #4
+	.save {fp, ip, lr}
+	@stmfd sp!, {fp, ip, lr, pc}
+	.setfp fp, ip, #-8
+	@sub fp, ip, #8
+	mov r0, #6
+	.fnend
diff --git a/gas/testsuite/gas/arm/unwind_vxworks.d b/gas/testsuite/gas/arm/unwind_vxworks.d
index 4e4b215ad39..11817cf48c1 100644
--- a/gas/testsuite/gas/arm/unwind_vxworks.d
+++ b/gas/testsuite/gas/arm/unwind_vxworks.d
@@ -24,6 +24,8 @@ OFFSET   TYPE              VALUE
 0000001c R_ARM_PREL31      .ARM.extab.*\+0x0000001c
 00000020 R_ARM_PREL31      .text.*\+0x00000010
 00000028 R_ARM_PREL31      .text.*\+0x00000012
+00000030 R_ARM_PREL31      .text.*\+0x00000014
+00000034 R_ARM_PREL31      .ARM.extab.*\+0x0000002c
 
 
 Contents of section .text:
@@ -32,10 +34,12 @@ Contents of section .text:
 Contents of section .ARM.extab:
  0000 (449b0181 b0b08086|81019b44 8680b0b0) 00000000 00000000  .*
  0010 (8402b101 b0b0b005 2a000000 00c60281|01b10284 05b0b0b0 0000002a 8102c600)  .*
- 0020 (d0c6c1c1 b0b0c0c6|c1c1c6d0 c6c0b0b0) 00000000           .*
+ 0020 (d0c6c1c1 b0b0c0c6|c1c1c6d0 c6c0b0b0) 00000000 (429b0181|81019b42)  .*
+ 0030 (b0008086|868000b0) 00000000                    .*
 Contents of section .ARM.exidx:
  0000 00000000 (b0b0a880|80a8b0b0) 00000000 00000000  .*
  0010 00000000 00000000 00000000 00000000  .*
  0020 00000000 (08849780|80978408) 00000000 (b00fb180|80b10fb0)  .*
+ 0030 00000000 00000000                    .*
 # Ignore .ARM.attributes section
 #...