diff options
author | Yao Qi <yao.qi@linaro.org> | 2015-04-10 10:33:01 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2015-04-10 10:33:01 +0100 |
commit | ef713951c571c8490ca57c17c88785c6df1ed840 (patch) | |
tree | 04c543ebae288bd41e2187b401aaa8cda5372c3a /gdb/testsuite/gdb.arch/arm-disp-step.exp | |
parent | 906d60cf467b2d5a20ff04dbc4805a84ef313229 (diff) | |
download | gdb-ef713951c571c8490ca57c17c88785c6df1ed840.zip gdb-ef713951c571c8490ca57c17c88785c6df1ed840.tar.gz gdb-ef713951c571c8490ca57c17c88785c6df1ed840.tar.bz2 |
[arm] Fix displaced stepping for thumb alu reg instruction
Recent patch series "V2 All-stop on top of non-stop" causes a SIGSEGV
in the test case,
> -PASS: gdb.base/info-shared.exp: continue to breakpoint: library function #4
> +FAIL: gdb.base/info-shared.exp: continue to breakpoint: library function #4
>
> continue^M
> Continuing.^M
> ^M
> Program received signal SIGSEGV, Segmentation fault.^M
> 0x40021564 in ?? () gdb/testsuite/gdb.base/info-shared-solib1.so^M
> (gdb) FAIL: gdb.base/info-shared.exp: continue to breakpoint: library function #4
and an ARM displaced stepping bug is exposed. It can be reproduced by
the modified gdb.arch/arm-disp-step.exp as below,
continue^M
Continuing.^M
^M
Program received signal SIGSEGV, Segmentation fault.^M
0xa713cfcc in ?? ()^M
(gdb) FAIL: gdb.arch/arm-disp-step.exp: continue to breakpoint: continue to test_add_rn_pc_end
This patch is to fix it.
gdb:
2015-04-10 Yao Qi <yao.qi@linaro.org>
* arm-tdep.c (install_alu_reg): Update comment.
(thumb_copy_alu_reg): Remove local variable rn. Update
debugging message. Use r2 instead of r1 in the modified
instruction.
gdb/testsuite:
2015-04-10 Yao Qi <yao.qi@linaro.org>
* gdb.arch/arm-disp-step.S (main): Call test_add_rn_pc.
(test_add_rn_pc): New function.
* gdb.arch/arm-disp-step.exp (test_add_rn_pc): New proc.
(top level): Invoke test_add_rn_pc.
Diffstat (limited to 'gdb/testsuite/gdb.arch/arm-disp-step.exp')
-rw-r--r-- | gdb/testsuite/gdb.arch/arm-disp-step.exp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.exp b/gdb/testsuite/gdb.arch/arm-disp-step.exp index 7eac4d1..e191f73 100644 --- a/gdb/testsuite/gdb.arch/arm-disp-step.exp +++ b/gdb/testsuite/gdb.arch/arm-disp-step.exp @@ -371,6 +371,45 @@ proc test_str_pc {} { ".*bx lr.*" } +# Test 16 bit thumb instruction 'add rd, pc'. + +proc test_add_rn_pc {} { + global srcfile gdb_prompt + + set test "break test_add_rn_pc" + gdb_test_multiple "break *test_add_rn_pc" $test { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { + pass $test + } + -re "No symbol.*\r\n$gdb_prompt $" { + return + } + } + + gdb_continue_to_breakpoint "continue to test_add_rn_pc" \ + ".*mov.*r3, 4.*" + + gdb_test "break *test_add_rn_pc_start" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_add_rn_pc_start" + + gdb_continue_to_breakpoint "continue to test_add_rn_pc_start" \ + ".*add.*r3,.*pc.*" + + set pc_val [get_integer_valueof "\$pc" 0] + + gdb_test "break *test_add_rn_pc_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_add_rn_pc_end" + + gdb_continue_to_breakpoint "continue to test_add_rn_pc_end" \ + ".*bx lr.*" + + set r3_val [get_integer_valueof "\$r3" 0] + # Test the value in r3 is correct. + gdb_assert { [expr {$pc_val + 4 + 4} == $r3_val] } +} + # Get things started. clean_restart ${testfile} @@ -410,6 +449,8 @@ test_pop_pc test_str_pc +test_add_rn_pc + ########################################## # Done, run program to exit. |