diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-01-14 09:36:43 +0000 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-01-14 09:36:43 +0000 |
commit | 1b451dda5f8905b26bafafe00423335d4fffe8dd (patch) | |
tree | 8cfa5c475efdfc65af696a902f24cacfb5522521 /gdb/gdbserver | |
parent | fccbac73f9328cdde552d8dd82927481a60c388b (diff) | |
download | gdb-1b451dda5f8905b26bafafe00423335d4fffe8dd.zip gdb-1b451dda5f8905b26bafafe00423335d4fffe8dd.tar.gz gdb-1b451dda5f8905b26bafafe00423335d4fffe8dd.tar.bz2 |
[ARM] Make thumb2_breakpoint static again
This patch makes thumb2_breakpoint static. When writing this patch,
I find the only reason we keep thumb2_breakpoint extern is that it
is used as an argument passed to arm_gdbserver_get_next_pcs. However,
field arm_thumb2_breakpoint is only used in a null check in
thumb_get_next_pcs_raw, so I wonder why do need to pass thumb2_breakpoint
to arm_gdbserver_get_next_pcs.
thumb2_breakpoint was added by Daniel Jacobowitz in order to support
single-step IT block
https://sourceware.org/ml/gdb-patches/2010-01/msg00624.html the logic
there was if we have 32-bit thumb-2 breakpoint defined, we can safely
single-step IT block, otherwise, we can't. Daniel didn't want to use
16-bit thumb BKPT instruction, because it triggers even on instruction
which should be executed. Secondly, using 16-bit thumb illegal
instruction on top of 32-bit thumb instruction may break the meaning of
original IT blocks, because the other 16-bit can be regarded as an
instruction. See more explanations from Daniel's kernel patch
http://www.spinics.net/lists/arm-kernel/msg80476.html
Let us back to this patch, GDB/GDBserver can safely single step
IT block if thumb2_breakpoint is defined, but the single step logic
doesn't have to know the thumb-2 breakpoint instruction. Only
breakpoint insertion mechanism decides to use which breakpoint
instruction. In the software single step code, instead of pass
thumb2_breakpoint, we can pass a boolean variable
has_thumb2_breakpoint indicate whether the target has thumb-2
breakpoint defined, which is equivalent to the original code.
Regression tested on arm-linux. No regression.
gdb:
2016-01-14 Yao Qi <yao.qi@linaro.org>
* arch/arm-get-next-pcs.c (arm_get_next_pcs_ctor): Change
argument arm_thumb2_breakpoint to has_thumb2_breakpoint.
(thumb_get_next_pcs_raw): Check has_thumb2_breakpoint
instead.
* arch/arm-get-next-pcs.h (struct arm_get_next_pcs)
<arm_thumb2_breakpoint>: Remove.
<has_thumb2_breakpoint>: New field.
(arm_get_next_pcs_ctor): Update declaration.
* arm-linux-tdep.c (arm_linux_software_single_step): Pass
1 to arm_get_next_pcs_ctor.
* arm-tdep.c (arm_software_single_step): Pass 0 to
arm_get_next_pcs_ctor.
gdb/gdbserver:
2016-01-14 Yao Qi <yao.qi@linaro.org>
* linux-aarch32-low.c (thumb2_breakpoint): Make it static.
* linux-aarch32-low.h (thumb2_breakpoint): Remove declaration.
* linux-arm-low.c (arm_gdbserver_get_next_pcs): Pass 1 to
arm_get_next_pcs_ctor.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/gdbserver/linux-aarch32-low.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/linux-aarch32-low.h | 2 | ||||
-rw-r--r-- | gdb/gdbserver/linux-arm-low.c | 2 |
4 files changed, 9 insertions, 4 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 757424c..a76bb14 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2016-01-14 Yao Qi <yao.qi@linaro.org> + + * linux-aarch32-low.c (thumb2_breakpoint): Make it static. + * linux-aarch32-low.h (thumb2_breakpoint): Remove declaration. + * linux-arm-low.c (arm_gdbserver_get_next_pcs): Pass 1 to + arm_get_next_pcs_ctor. + 2016-01-12 Josh Stone <jistone@redhat.com> Philippe Waroquiers <philippe.waroquiers@skynet.be> diff --git a/gdb/gdbserver/linux-aarch32-low.c b/gdb/gdbserver/linux-aarch32-low.c index ed66e08..2bbbb24 100644 --- a/gdb/gdbserver/linux-aarch32-low.c +++ b/gdb/gdbserver/linux-aarch32-low.c @@ -45,7 +45,7 @@ static const unsigned long arm_breakpoint = arm_abi_breakpoint; #define arm_breakpoint_len 4 static const unsigned short thumb_breakpoint = 0xde01; #define thumb_breakpoint_len 2 -const unsigned short thumb2_breakpoint[] = { 0xf7f0, 0xa000 }; +static const unsigned short thumb2_breakpoint[] = { 0xf7f0, 0xa000 }; #define thumb2_breakpoint_len 4 /* Some older versions of GNU/Linux and Android do not define diff --git a/gdb/gdbserver/linux-aarch32-low.h b/gdb/gdbserver/linux-aarch32-low.h index 5c68454..434a523 100644 --- a/gdb/gdbserver/linux-aarch32-low.h +++ b/gdb/gdbserver/linux-aarch32-low.h @@ -15,8 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -extern const unsigned short thumb2_breakpoint[]; - extern struct regs_info regs_info_aarch32; void arm_fill_gregset (struct regcache *regcache, void *buf); diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c index d967e58..927a6fa 100644 --- a/gdb/gdbserver/linux-arm-low.c +++ b/gdb/gdbserver/linux-arm-low.c @@ -942,7 +942,7 @@ arm_gdbserver_get_next_pcs (CORE_ADDR pc, struct regcache *regcache) /* Byte order is ignored assumed as host. */ 0, 0, - (const gdb_byte *) &thumb2_breakpoint, + 1, regcache); next_pcs = arm_get_next_pcs (&next_pcs_ctx, pc); |