This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Skip gdb.base/func-ptrs.exp in thumb mode


This test case was added
https://sourceware.org/ml/gdb-patches/2014-10/msg00088.html to teach
GDB to treat ISA bit on MIPS.  I thought we can do the same for ARM
thumb mode, but I failed to do so due to the difference of mips16
and thumb.

As Maciej described in
https://sourceware.org/ml/gdb-patches/2012-05/msg00515.html
"Any instruction executed at an even address is interpreted as a
standard MIPS instruction (the address still has to have its bit
 #1 clear), any instruction executed at an odd address is
interpreted as a MIPS16 instruction.", it is natural to have
instructions at odd addresses, see the disassembly in current GDB
for mips16 code,

(gdb) disassemble incr
Dump of assembler code for function incr:
   0x0040055d <+0>:	save	a0,32,ra,s1
   0x00400561 <+4>:	addiu	s1,sp,16
   0x00400563 <+6>:	jal	0x400551 <sentinel>

However, arm does the trick by using the right branch instruction
(bx and blx) together with setting the LSB in the target address.
The instructions are still at even addresses.

Due to this difference on address, we have troubles mapping stop
address to line table on thumb mode, because we've set the LSB in
address in line table, as what we did for mips, but the stop address
reported by the hardware is still an even one, so we'll get a fail,

Breakpoint 3, 0x00008604 in incr (i=-1) at /home/yao/SourceCode/gnu/gdb/git/gdb/testsuite/gdb.base/func-ptrs.c:37^M
37      {^M
(gdb) FAIL: gdb.base/func-ptrs.exp: continue to incr, first time

the hex 0x00008604 is unexpected by the test, because it is not the
starting address of line table entry, so the hex is printed,

3          37 0x00000000000085fd
4          38 0x0000000000008605
5          39 0x0000000000008609

In fact, my prototype GDB works well except on this address-line
mapping.  I didn't try to tweak target to report the address with
LSB set, because it makes no sense on ARM thumb mode.

gdb/testsuite:

2016-06-13  Yao Qi  <yao.qi@linaro.org>

	* gdb.base/func-ptrs.c [__thumb__]: Set supported to 0.
	[!__thumb__]: Set supported to 1.
	* gdb.base/func-ptrs.exp: Return early if variable supported
	value is 0.
---
 gdb/testsuite/gdb.base/func-ptrs.c   | 11 +++++++++++
 gdb/testsuite/gdb.base/func-ptrs.exp |  4 ++++
 2 files changed, 15 insertions(+)

diff --git a/gdb/testsuite/gdb.base/func-ptrs.c b/gdb/testsuite/gdb.base/func-ptrs.c
index 8a93c48..39efe2b 100644
--- a/gdb/testsuite/gdb.base/func-ptrs.c
+++ b/gdb/testsuite/gdb.base/func-ptrs.c
@@ -15,6 +15,17 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#if defined(__thumb__)
+/* In ARM, the last bit of the target address of branch indicates the
+   program mode is ARM or THUMB.  However, the last bit of the symbol
+   isn't set even in THUMB mode, so if we assign the function to a
+   function pointer in GDB, the last bit of the target address isn't
+   set.  */
+int supported = 0;
+#else
+int supported = 1;
+#endif
+
 void
 sentinel (void)
 {
diff --git a/gdb/testsuite/gdb.base/func-ptrs.exp b/gdb/testsuite/gdb.base/func-ptrs.exp
index a3b55a8748..b3ea1ce 100644
--- a/gdb/testsuite/gdb.base/func-ptrs.exp
+++ b/gdb/testsuite/gdb.base/func-ptrs.exp
@@ -24,6 +24,10 @@ if { ![runto_main] } {
     return -1
 }
 
+if { 0 == [get_integer_valueof "supported" "0"] } {
+    unsupported "function pointer assignment is not supported"
+    return 1
+}
 
 # First set our breakpoints.
 
-- 
1.9.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]