From 6ca1b1476715499432ef8ea211fa0ea5c0e412c4 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 22 Aug 2012 19:47:58 +0000 Subject: [PATCH] * arm-tdep.c (thumb_get_next_pc_raw): Mask off low bits for bx pc and blx pc. testsuite: * gdb.arch/thumb-bx-pc.S: New file. * gdb.arch/thumb-bx-pc.exp: New file. --- gdb/ChangeLog | 5 +++++ gdb/arm-tdep.c | 2 +- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.arch/thumb-bx-pc.S | 34 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/thumb-bx-pc.exp | 41 ++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.arch/thumb-bx-pc.S create mode 100644 gdb/testsuite/gdb.arch/thumb-bx-pc.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d6e8cf6..3c6dba9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-08-22 Joseph Myers + + * arm-tdep.c (thumb_get_next_pc_raw): Mask off low bits for bx pc + and blx pc. + 2012-08-22 Khoo Yit Phang Add a new "python-interactive" command that starts a standard diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 063c1db..cddb88c 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -4540,7 +4540,7 @@ thumb_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc) else if ((inst1 & 0xff00) == 0x4700) /* bx REG, blx REG */ { if (bits (inst1, 3, 6) == 0x0f) - nextpc = pc_val; + nextpc = UNMAKE_THUMB_ADDR (pc_val); else nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6)); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5874404..6360f98 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-08-22 Joseph Myers + + * gdb.arch/thumb-bx-pc.S: New file. + * gdb.arch/thumb-bx-pc.exp: New file. + 2012-08-22 Tom Tromey * gdb.base/maint.exp: Update. diff --git a/gdb/testsuite/gdb.arch/thumb-bx-pc.S b/gdb/testsuite/gdb.arch/thumb-bx-pc.S new file mode 100644 index 0000000..437e66e --- /dev/null +++ b/gdb/testsuite/gdb.arch/thumb-bx-pc.S @@ -0,0 +1,34 @@ +/* Test PC adjustment from Thumb-mode "bx pc" instruction. + + Copyright 2012 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + .syntax unified + .thumb + .text + .p2align 2 + .global main + .thumb + .thumb_func + .type main, %function +main: + bx pc + nop +.code 32 + mov r0, #0 + bx lr + .size main, .-main diff --git a/gdb/testsuite/gdb.arch/thumb-bx-pc.exp b/gdb/testsuite/gdb.arch/thumb-bx-pc.exp new file mode 100644 index 0000000..5a6b477 --- /dev/null +++ b/gdb/testsuite/gdb.arch/thumb-bx-pc.exp @@ -0,0 +1,41 @@ +# Copyright 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test PC adjustment from Thumb-mode "bx pc" instruction. + +if {![istarget arm*-*]} then { + verbose "Skipping ARM tests." + return +} + +set testfile "thumb-bx-pc" +set srcfile ${testfile}.S +set opts {} + +if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] { + untested "Failed to compile $srcfile" + return -1 +} + +if ![runto_main] then { + untested "could not run to main" + return -1 +} + +gdb_test "stepi" "$hex in main \\(\\)" "stepi for bx pc" + +gdb_test "x /i \$pc" \ + "$hex :\[ \t\]+mov\[ \t\]+r0,\[ \t\]+#0.*" \ + "stepi reached correct instruction" -- 2.7.4