You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.8 KiB
69 lines
2.8 KiB
commit 2d6f0de676f46ebd8bb7d98a0093aa081e17e94b |
|
Author: Yao Qi <yao@codesourcery.com> |
|
Date: Mon Jun 30 11:47:51 2014 +0800 |
|
|
|
Tweak gdb.trace/tfile.c for thumb mode |
|
|
|
We see the fail below happens on thumb related multi-libs |
|
(-mthumb -march={armv4t,armv7-a}), |
|
|
|
target tfile tfile-basic.tf ^M |
|
warning: Uploaded tracepoint 1 has no source location, using raw address^M |
|
warning: Breakpoint address adjusted from 0x00008959 to 0x00008958.^M |
|
Tracepoint 3 at 0x8958: file /scratch/yqi/arm-none-linux-gnueabi/src/gdb-trunk/gdb/testsuite/gdb.trace/tfile.c, line 91.^M |
|
Created tracepoint 3 for target's tracepoint 1 at 0x8959.^M |
|
warning: Breakpoint address adjusted from 0x00008959 to 0x00008958.^M |
|
warning: Breakpoint address adjusted from 0x00008959 to 0x00008958.^M |
|
warning: Breakpoint address adjusted from 0x00008959 to 0x00008958.^M |
|
(gdb) FAIL: gdb.trace/tfile.exp: complete-command 'target tfile' |
|
|
|
The address of write_basic_trace_file is two-bytes aligned, |
|
|
|
(gdb) p write_basic_trace_file |
|
$1 = {void (void)} 0x8958 <write_basic_trace_file> |
|
|
|
but the ld sets the LSB of every reference to the function address |
|
(indicating the address is in thumb mode), so "&write_basic_trace_file" |
|
in the program becomes 0x8959, which is saved in the trace file. That |
|
is why the warnnings are emitted. |
|
|
|
This patch is to clear the LSB of the function address written to trace |
|
file in thumb and thumb2 mode. This patch fixes the fail above. |
|
|
|
gdb/testsuite: |
|
|
|
2014-07-10 Yao Qi <yao@codesourcery.com> |
|
|
|
* gdb.trace/tfile.c (write_basic_trace_file) |
|
[__thumb__||__thumb2__]: Clear the Thumb bit of the function |
|
address written to trace file. |
|
|
|
Index: gdb-7.6.1/gdb/testsuite/gdb.trace/tfile.c |
|
=================================================================== |
|
--- gdb-7.6.1.orig/gdb/testsuite/gdb.trace/tfile.c |
|
+++ gdb-7.6.1/gdb/testsuite/gdb.trace/tfile.c |
|
@@ -68,6 +68,7 @@ write_basic_trace_file (void) |
|
{ |
|
int fd, int_x; |
|
short short_x; |
|
+ long func_addr; |
|
|
|
fd = start_trace_file ("basic.tf"); |
|
|
|
@@ -86,8 +87,14 @@ write_basic_trace_file (void) |
|
/* Dump tracepoint definitions, in syntax similar to that used |
|
for reconnection uploads. */ |
|
/* FIXME need a portable way to print function address in hex */ |
|
- snprintf (spbuf, sizeof spbuf, "tp T1:%lx:E:0:0\n", |
|
- (long) &write_basic_trace_file); |
|
+ func_addr = (long) &write_basic_trace_file; |
|
+#if defined(__thumb__) || defined(__thumb2__) |
|
+ /* Although Thumb functions are two-byte aligned, function |
|
+ pointers have the Thumb bit set. Clear it. */ |
|
+ func_addr &= ~1; |
|
+#endif |
|
+ |
|
+ snprintf (spbuf, sizeof spbuf, "tp T1:%lx:E:0:0\n", func_addr); |
|
write (fd, spbuf, strlen (spbuf)); |
|
/* (Note that we would only need actions defined if we wanted to |
|
test tdump.) */
|
|
|