diff options
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 13 | ||||
-rw-r--r-- | gas/doc/c-arm.texi | 6 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/unwind.d | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/unwind.s | 14 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/unwind_vxworks.d | 6 |
7 files changed, 52 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 56bdc8a..5ea2728 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,10 @@ 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 unsigned int to avoid 64-bit host problems. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index e8fe7cf..f203e79 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 d9b7b26..7fede6c 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 93c5f29..506b705 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 e7a9036..060f7ba 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 f050378..bbd73a1 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 4e4b215..11817cf4 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 #... |