Tweak gdb.trace/tfile.c for thumb mode
Commit Message
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 warnings 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-06-30 Yao Qi <yao@codesourcery.com>
* gdb.trace/tfile.c (write_basic_trace_file): Clear the lsb of
the function address written to trace file.
---
gdb/testsuite/gdb.trace/tfile.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
Comments
On 06/30/2014 11:50 AM, Yao Qi wrote:
> 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 warnings 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-06-30 Yao Qi <yao@codesourcery.com>
>
> * gdb.trace/tfile.c (write_basic_trace_file): Clear the lsb of
> the function address written to trace file.
Ping?
Update the changelog entry a little,
2014-07-09 Yao Qi <yao@codesourcery.com>
* gdb.trace/tfile.c (write_basic_trace_file)
[__thumb__||__thumb2__]: Clear the lsb of the function address
written to trace file.
On 06/30/2014 04:50 AM, Yao Qi wrote:
> + /* Although the thumb functions are two-bytes aligned, ld sets the
> + bit 0 of these function references. Clear the bit 0. */
> +#if defined(__thumb__) || defined(__thumb2__)
> + func_addr &= ~1;
> +#endif
I suggest putting the comment within the #if block, and write:
#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
(This bit is widely known as the "Thumb bit", so call it that,
and remove a few "the"'s that sound odd to me, and say
"two-byte aligned".)
Otherwise looks good.
Thanks,
@@ -91,6 +91,7 @@ write_basic_trace_file (void)
{
int fd, int_x;
short short_x;
+ long func_addr;
fd = start_trace_file (TFILE_DIR "tfile-basic.tf");
@@ -109,8 +110,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;
+ /* Although the thumb functions are two-bytes aligned, ld sets the
+ bit 0 of these function references. Clear the bit 0. */
+#if defined(__thumb__) || defined(__thumb2__)
+ 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.) */