This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Fix possible alignment issue with dw2-dir-file-name test case
- From: Andreas Arnez <arnez at linux dot vnet dot ibm dot com>
- To: Pedro Alves <alves dot ped at gmail dot com>
- Cc: Pedro Alves <palves at redhat dot com>, Edjunior Barbosa Machado <emachado at linux dot vnet dot ibm dot com>, Jan Kratochvil <jan dot kratochvil at redhat dot com>, gdb-patches at sourceware dot org, Ulrich Weigand <uweigand at de dot ibm dot com>, Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>, Omair Javaid <omair dot javaid at linaro dot org>
- Date: Mon, 20 Jan 2014 20:47:04 +0100
- Subject: Re: [PATCH] Fix possible alignment issue with dw2-dir-file-name test case
- Authentication-results: sourceware.org; auth=none
- References: <87a9f65p73 dot fsf at br87z6lw dot de dot ibm dot com> <52CFD97A dot 4040009 at redhat dot com> <87mwj352p5 dot fsf at br87z6lw dot de dot ibm dot com> <20140110145327 dot GA23695 at host2 dot jankratochvil dot net> <52D014B7 dot 6040305 at redhat dot com> <52D6FEA9 dot 6010605 at linux dot vnet dot ibm dot com> <52D7EEA9 dot 4030006 at redhat dot com> <874n5232yj dot fsf at br87z6lw dot de dot ibm dot com> <52D971DA dot 90807 at redhat dot com> <52D97460 dot 1040206 at gmail dot com>
On Fri, Jan 17 2014, Pedro Alves wrote:
> BTW,
>
> (adding Omair)
>
> On 01/17/2014 05:58 PM, Andreas Arnez wrote:
>> +/* Notes: (1) The '*_start' label below is needed because 'name' may
>> + point to a function descriptor instead of to the actual code. (2)
>> + The '.balign' should specify the highest possible function
>> + alignment across all supported architectures, such that the label
>> + never points into the alignment gap. */
>> +
>> #define FUNC(name) \
>> - void \
>> + asm (".balign 8"); \
>> + asm (#name "_start: .globl " #name "_start\n"); \
>> + static void \
>> name (void) \
>
> Not sure you were following the
> "testsuite/gdb.dwarf2: Fix for dw2-ifort-parameter failure on ARM"
> thread. Seems to me this exact same thing should be done to
> dw2-ifort-parameter.c. I assume that test is currently failing
> on ppc64 for the exact same reason, and that if it's not failing
> on S390 with current gcc, it'll be by lucky alignment. I believe
> this approach should fix Thumb there as well. Can you guys
> coordinate on handling that test? Thanks.
I haven't been following this thread, but the test case indeed fails on
s390x (64 bit) -- not just with a new GCC.
* On s390x, the test case fails like this:
Breakpoint 1, 0x00000000800005d2 in func (param=<error reading
variable: Cannot access memory at address 0x0>)
(gdb) p/x param
Cannot access memory at address 0x0
Note that the debug info looks correct, and all addresses fit into
four bytes. Still, the failure disappears when changing the DWARF
pointer size to 8. Thus it seems that the address size mismatch
causes confusion somewhere in GDB on big-endian systems.
* On PPC64, 'func' and 'main' are function descriptors and don't point
to the actual code. Thus the usage of these symbols in
dw2-ifort-parameter-debug.S is broken (similar to what has been
discussed in the thread, I think). But once this is fixed, the issue
above is surfaced.
For illustration, the patch below "fixes" both issues on PPC64.
However, for a real fix I think we should find the root cause for the
first issue (which I haven't dug much into yet).
-----
Modified gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S
index c7dd9be..7e65c70 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter-debug.S
@@ -22,21 +22,21 @@
.Lcu1_start:
.2byte 2 /* DWARF Version */
.4byte .Labbrev1_begin /* Offset into abbrev section */
- .byte 4 /* Pointer size */
+ .byte 8 /* Pointer size */
/* CU die */
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
.ascii "file1.txt\0" /* DW_AT_name */
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
.byte 1 /* DW_AT_language (C) */
- .4byte func /* DW_AT_low_pc */
- .4byte main /* DW_AT_high_pc */
+ .8byte func_start /* DW_AT_low_pc */
+ .8byte func_end /* DW_AT_high_pc */
.uleb128 2 /* Abbrev: DW_TAG_subprogram */
.byte 1 /* DW_AT_external */
.ascii "func\0" /* DW_AT_name */
- .4byte func /* DW_AT_low_pc */
- .4byte main /* DW_AT_high_pc */
+ .8byte func_start /* DW_AT_low_pc */
+ .8byte func_end /* DW_AT_high_pc */
.uleb128 3 /* Abbrev: DW_TAG_formal_parameter */
.ascii "param\0" /* DW_AT_name */
@@ -44,7 +44,7 @@
.4byte .Ltype_int - .Lcu1_begin /* DW_AT_type */
.byte 2f - 1f /* DW_AT_location */
1: .byte 3 /* DW_OP_addr */
- .4byte ptr /* <addr> */
+ .8byte ptr /* <addr> */
.byte 0x6 /* DW_OP_deref */
2:
Modified gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c
index 361c44d..4474814 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.c
@@ -18,11 +18,17 @@
int value = 0xdeadf00d;
int *ptr = &value;
-void
+asm (".section \".text\"");
+asm (".balign 8");
+asm ("func_start: .globl func_start");
+
+static void
func (void)
{
}
+asm ("func_end: .globl func_end");
+
int
main (void)
{