Re: [PATCH] Fix possible alignment issue with dw2-dir-file-name test case

Andreas Arnez
2014-01-20T19:47:16Z

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)
{