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]

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


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


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