gdb.dwarf2: Testsuite 64-bit pointer truncation fixes

Message ID alpine.DEB.1.10.1410122308450.19130@tp.orcam.me.uk
State Superseded
Headers

Commit Message

Maciej W. Rozycki Oct. 12, 2014, 10:26 p.m. UTC
  Hi,

 Here are fixes for some issues I discovered in DWARF-2 tests with 64-bit 
MIPS targets:

(gdb) PASS: gdb.dwarf2/dw2-case-insensitive.exp: set case-sensitive off
info functions fUnC_lang
All functions matching regular expression "fUnC_lang":

File file1.txt:
foo FUNC_lang(void);

Non-debugging symbols:
0x0000000120000b20  FUNC_lang_start
0x0000000120000b40  FUNC_lang_end
(gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: regexp case-sensitive off
p fuNC_lang
Cannot access memory at address 0x20000b20
(gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: p fuNC_lang
p fuNC_symtab
$1 = {<text variable, no debug info>} 0x120000b40 <FUNC_symtab>
(gdb) PASS: gdb.dwarf2/dw2-case-insensitive.exp: p fuNC_symtab
break fuNC_lang
Cannot access memory at address 0x20000b20
(gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: setting breakpoint at fuNC_lang

and:

(gdb) continue
Continuing.

Breakpoint 1, 0x0000000120000c0c in main ()
(gdb) break func
Breakpoint 2 at 0x20000ad0: func. (3 locations)
(gdb) continue
Continuing.
Warning:
Cannot insert breakpoint 2.
Cannot access memory at address 0x20000ad0
Cannot insert breakpoint 2.
Cannot access memory at address 0x20000b60

(gdb) FAIL: gdb.dwarf2/dw2-skip-prologue.exp: continue to breakpoint: func
info break $bpnum
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   <MULTIPLE>
2.1                         y     0x0000000020000ad0 in func at main.c:5
2.2                         y     0x0000000020000b60
2.3                         y     0x0000000120000adc <func+12>
(gdb) FAIL: gdb.dwarf2/dw2-skip-prologue.exp: 2 locations found

Address truncation is obvious from these logs.  The fixes follow previous 
art across our test suite and should therefore be rather obvious.

 Regression tested with the mips-linux-gnu target and the following 
multilibs:

-EB
-EB -msoft-float
-EB -mips16
-EB -mips16 -msoft-float
-EB -mmicromips
-EB -mmicromips -msoft-float
-EB -mabi=n32
-EB -mabi=n32 -msoft-float
-EB -mabi=64
-EB -mabi=64 -msoft-float

and the -EL variants of same, fixing the 5 failures noted above for each 
of the `-mabi=64' multilibs and with no changes otherwise.

 OK to apply?

2014-10-12  Maciej W. Rozycki  <macro@codesourcery.com>

	gdb/testsuite/
	* gdb.dwarf2/dw2-case-insensitive-debug.S: Handle 64-bit pointers.
	* gdb.dwarf2/dw2-case-insensitive.exp: Update accordingly.
	* gdb.dwarf2/dw2-skip-prologue.S: Handle 64-bit pointers.
	* gdb.dwarf2/dw2-skip-prologue.exp: Update accordingly.

  Maciej

gdb-dwarf2-test-64bit.diff
  

Comments

Doug Evans Oct. 13, 2014, 6:49 p.m. UTC | #1
On Sun, Oct 12, 2014 at 3:26 PM, Maciej W. Rozycki
<macro@codesourcery.com> wrote:
> Hi,
>
>  Here are fixes for some issues I discovered in DWARF-2 tests with 64-bit
> MIPS targets:
>
> (gdb) PASS: gdb.dwarf2/dw2-case-insensitive.exp: set case-sensitive off
> info functions fUnC_lang
> All functions matching regular expression "fUnC_lang":
>
> File file1.txt:
> foo FUNC_lang(void);
>
> Non-debugging symbols:
> 0x0000000120000b20  FUNC_lang_start
> 0x0000000120000b40  FUNC_lang_end
> (gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: regexp case-sensitive off
> p fuNC_lang
> Cannot access memory at address 0x20000b20
> (gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: p fuNC_lang
> p fuNC_symtab
> $1 = {<text variable, no debug info>} 0x120000b40 <FUNC_symtab>
> (gdb) PASS: gdb.dwarf2/dw2-case-insensitive.exp: p fuNC_symtab
> break fuNC_lang
> Cannot access memory at address 0x20000b20
> (gdb) FAIL: gdb.dwarf2/dw2-case-insensitive.exp: setting breakpoint at fuNC_lang
>
> and:
>
> (gdb) continue
> Continuing.
>
> Breakpoint 1, 0x0000000120000c0c in main ()
> (gdb) break func
> Breakpoint 2 at 0x20000ad0: func. (3 locations)
> (gdb) continue
> Continuing.
> Warning:
> Cannot insert breakpoint 2.
> Cannot access memory at address 0x20000ad0
> Cannot insert breakpoint 2.
> Cannot access memory at address 0x20000b60
>
> (gdb) FAIL: gdb.dwarf2/dw2-skip-prologue.exp: continue to breakpoint: func
> info break $bpnum
> Num     Type           Disp Enb Address            What
> 2       breakpoint     keep y   <MULTIPLE>
> 2.1                         y     0x0000000020000ad0 in func at main.c:5
> 2.2                         y     0x0000000020000b60
> 2.3                         y     0x0000000120000adc <func+12>
> (gdb) FAIL: gdb.dwarf2/dw2-skip-prologue.exp: 2 locations found
>
> Address truncation is obvious from these logs.  The fixes follow previous
> art across our test suite and should therefore be rather obvious.
>
>  Regression tested with the mips-linux-gnu target and the following
> multilibs:
>
> -EB
> -EB -msoft-float
> -EB -mips16
> -EB -mips16 -msoft-float
> -EB -mmicromips
> -EB -mmicromips -msoft-float
> -EB -mabi=n32
> -EB -mabi=n32 -msoft-float
> -EB -mabi=64
> -EB -mabi=64 -msoft-float
>
> and the -EL variants of same, fixing the 5 failures noted above for each
> of the `-mabi=64' multilibs and with no changes otherwise.
>
>  OK to apply?
>
> 2014-10-12  Maciej W. Rozycki  <macro@codesourcery.com>
>
>         gdb/testsuite/
>         * gdb.dwarf2/dw2-case-insensitive-debug.S: Handle 64-bit pointers.
>         * gdb.dwarf2/dw2-case-insensitive.exp: Update accordingly.
>         * gdb.dwarf2/dw2-skip-prologue.S: Handle 64-bit pointers.
>         * gdb.dwarf2/dw2-skip-prologue.exp: Update accordingly.

Hi.

I'm of two minds on this.
On the one hand, what's the cost/benefit ratio of going down the road
of portable assembler testcases?
On the other hand, once someone has put in the effort for one
particular testcase, as long as it doesn't place a long term burden on
maintaining that testcase it's not that big a deal.  [If we're going
to impose something on new tests then I would want it written down in
the testsuite coding standards wiki, but that can be a separate
discussion.  We should write something down anyway.]

Although I think there's a limit to how far down the road we should
go, I'm ok with this patch.

>
>   Maciej
>
> gdb-dwarf2-test-64bit.diff
> Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S
> ===================================================================
> --- gdb-fsf-trunk-quilt.orig/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S      2014-10-03 04:33:45.000000000 +0100
> +++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S   2014-10-03 04:51:44.547540632 +0100
> @@ -15,6 +15,14 @@
>     You should have received a copy of the GNU General Public License
>     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
>
> +#if PTRBITS == 64
> +# define PTRBYTE .8byte
> +#elif PTRBITS == 32
> +# define PTRBYTE .4byte
> +#else
> +# error Unsupported pointer size
> +#endif
> +

Nit: The argument to #error is a series of preprocessor tokens, so

#error it's not ok

is not ok.  We don't have a convention (that I can remember) of always
making the error text a string, but I do like this convention.

Can you change the #error's to use a string?
[And I'll look into making and documenting this convention.
After some grepping, it is more prevalent than not quoting.]

So, LGTM with that change.
  

Patch

Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S	2014-10-03 04:33:45.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S	2014-10-03 04:51:44.547540632 +0100
@@ -15,6 +15,14 @@ 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#if PTRBITS == 64
+# define PTRBYTE .8byte
+#elif PTRBITS == 32
+# define PTRBYTE .4byte
+#else
+# error Unsupported pointer size
+#endif
+
 	.section .debug_info
 .Lcu1_begin:
 	/* CU header */
@@ -22,21 +30,21 @@ 
 .Lcu1_start:
 	.2byte	2				/* DWARF Version */
 	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
-	.byte	4				/* Pointer size */
+	.byte	PTRBITS / 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	8				/* DW_AT_language (DW_LANG_Fortran90) */
-	.4byte		cu_text_start		/* DW_AT_low_pc */
-	.4byte		cu_text_end		/* DW_AT_high_pc */
+	PTRBYTE		cu_text_start		/* DW_AT_low_pc */
+	PTRBYTE		cu_text_end		/* DW_AT_high_pc */
 
 	.uleb128	3			/* Abbrev: DW_TAG_subprogram */
 	.byte		1			/* DW_AT_external */
 	.ascii		"FUNC_lang\0"		/* DW_AT_name */
-	.4byte		FUNC_lang_start		/* DW_AT_low_pc */
-	.4byte		FUNC_lang_end		/* DW_AT_high_pc */
+	PTRBYTE		FUNC_lang_start		/* DW_AT_low_pc */
+	PTRBYTE		FUNC_lang_end		/* DW_AT_high_pc */
 	.byte		1			/* DW_AT_prototyped */
 	.4byte		.Ltype - .Lcu1_begin	/* DW_AT_type */
 
Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive.exp
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive.exp	2014-10-03 04:33:45.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive.exp	2014-10-03 04:50:33.537698613 +0100
@@ -21,8 +21,15 @@  if {![dwarf2_support]} {
 
 standard_testfile .c dw2-case-insensitive-debug.S
 
+if [is_ilp32_target] {
+    set ptrbits 32
+} else {
+    set ptrbits 64
+}
+
 if { [prepare_for_testing ${testfile}.exp ${testfile} \
-	  [list $srcfile $srcfile2] {nodebug}] } {
+	  [list $srcfile $srcfile2] \
+	  [list nodebug additional_flags=-DPTRBITS=$ptrbits]] } {
     return -1
 }
 
Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S	2014-10-03 04:33:45.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S	2014-10-03 04:50:33.537698613 +0100
@@ -15,6 +15,14 @@ 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#if PTRBITS == 64
+# define PTRBYTE .8byte
+#elif PTRBITS == 32
+# define PTRBYTE .4byte
+#else
+# error Unsupported pointer size
+#endif
+
 	.section .debug_info
 .Lcu1_begin:
 	/* CU header */
@@ -22,13 +30,13 @@ 
 .Lcu1_start:
 	.2byte	2				/* DWARF Version */
 	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
-	.byte	4				/* Pointer size */
+	.byte	PTRBITS / 8			/* Pointer size */
 
 	/* CU die */
 	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
 	.4byte	.Lline1_begin			/* DW_AT_stmt_list */
-	.4byte	func_start			/* DW_AT_low_pc */
-	.4byte	func_end			/* DW_AT_high_pc */
+	PTRBYTE	func_start			/* DW_AT_low_pc */
+	PTRBYTE	func_end			/* DW_AT_high_pc */
 	.ascii	"main.c\0"			/* DW_AT_name */
 	.ascii	"GNU C 4.5.0\0"			/* DW_AT_producer must be >= 4.5  */
 	.byte	2				/* DW_AT_language (DW_LANG_C) */
@@ -37,8 +45,8 @@ 
 	.byte		1			/* DW_AT_external */
 	.ascii		"func\0"		/* DW_AT_name */
 	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.4byte		func_start		/* DW_AT_low_pc */
-	.4byte		func_end		/* DW_AT_high_pc */
+	PTRBYTE		func_start		/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
 
 /* GDB `has_loclist' detection of -O2 -g code needs to see a DW_AT_location
    location list.  There may exist -O2 -g CUs still not needing/using any such
@@ -51,16 +59,16 @@ 
 
 	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
 	.ascii		"inlined\0"		/* DW_AT_name */
-	.4byte		func0			/* DW_AT_low_pc */
-	.4byte		func1			/* DW_AT_high_pc */
+	PTRBYTE		func0			/* DW_AT_low_pc */
+	PTRBYTE		func1			/* DW_AT_high_pc */
 	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
 	.byte		1			/* DW_AT_call_file */
 	.byte		8			/* DW_AT_call_line */
 
 	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
 	.ascii		"inlined2\0"		/* DW_AT_name */
-	.4byte		func2			/* DW_AT_low_pc */
-	.4byte		func3			/* DW_AT_high_pc */
+	PTRBYTE		func2			/* DW_AT_low_pc */
+	PTRBYTE		func3			/* DW_AT_high_pc */
 	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
 	.byte		1			/* DW_AT_call_file */
 	.byte		11			/* DW_AT_call_line */
@@ -68,8 +76,8 @@ 
 #ifdef INLINED
 	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
 	.ascii		"otherinline\0"		/* DW_AT_name */
-	.4byte		func3			/* DW_AT_low_pc */
-	.4byte		func_end		/* DW_AT_high_pc */
+	PTRBYTE		func3			/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
 	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
 	.byte		1			/* DW_AT_call_file */
 	.byte		9			/* DW_AT_call_line */
@@ -77,8 +85,8 @@ 
 
 #ifdef LEXICAL
 	.uleb128	5			/* Abbrev: DW_TAG_lexical_block */
-	.4byte		func3			/* DW_AT_low_pc */
-	.4byte		func_end		/* DW_AT_high_pc */
+	PTRBYTE		func3			/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
 
 	/* GDB would otherwise ignore the DW_TAG_lexical_block.  */
 	.uleb128	6			/* Abbrev: DW_TAG_variable */
@@ -97,8 +105,8 @@ 
 	.byte		1			/* DW_AT_external */
 	.ascii		"func\0"		/* DW_AT_name */
 	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.4byte		fund_start		/* DW_AT_low_pc */
-	.4byte		fund_end		/* DW_AT_high_pc */
+	PTRBYTE		fund_start		/* DW_AT_low_pc */
+	PTRBYTE		fund_end		/* DW_AT_high_pc */
 
 	.byte		0			/* End of children of DW_TAG_subprogram */
 
@@ -117,7 +125,7 @@ 
 	/* Reset the location list base address first.  */
 	.4byte		-1, 0
 
-	.4byte		func_start, func_end
+	PTRBYTE		func_start, func_end
 	.2byte		2f-1f
 1:	.byte		0x50	/* DW_OP_reg0 */
 2:
@@ -277,7 +285,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func_start
+	PTRBYTE		func_start
 	.byte		3	/* DW_LNS_advance_line */
 	.sleb128	4	/* ... to 5 */
 	.byte		1	/* DW_LNS_copy */
@@ -285,7 +293,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func0
+	PTRBYTE		func0
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	2
 	.byte		3	/* DW_LNS_advance_line */
@@ -295,7 +303,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func1
+	PTRBYTE		func1
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	1
 	.byte		3	/* DW_LNS_advance_line */
@@ -305,7 +313,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func2
+	PTRBYTE		func2
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	2
 	.byte		3	/* DW_LNS_advance_line */
@@ -315,7 +323,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func3
+	PTRBYTE		func3
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	1
 	.byte		3	/* DW_LNS_advance_line */
@@ -325,14 +333,14 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		func_end
+	PTRBYTE		func_end
 
 /* Equivalent copy but renamed s/func/fund/.  */
 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund_start
+	PTRBYTE		fund_start
 	.byte		3	/* DW_LNS_advance_line */
 	.sleb128	-4	/* ... to 5 */
 	.byte		1	/* DW_LNS_copy */
@@ -340,7 +348,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund0
+	PTRBYTE		fund0
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	2
 	.byte		3	/* DW_LNS_advance_line */
@@ -350,7 +358,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund1
+	PTRBYTE		fund1
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	1
 	.byte		3	/* DW_LNS_advance_line */
@@ -360,7 +368,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund2
+	PTRBYTE		fund2
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	2
 	.byte		3	/* DW_LNS_advance_line */
@@ -370,7 +378,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund3
+	PTRBYTE		fund3
 	.byte		4	/* DW_LNS_set_file */
 	.uleb128	1
 	.byte		3	/* DW_LNS_advance_line */
@@ -380,7 +388,7 @@ 
 	.byte		0	/* DW_LNE_set_address */
 	.uleb128	5
 	.byte		2
-	.4byte		fund_end
+	PTRBYTE		fund_end
 
 /* Line numbering end.  */
 
Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.exp
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.exp	2014-10-03 04:33:45.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.exp	2014-10-03 04:50:33.537698613 +0100
@@ -39,7 +39,16 @@  if {![dwarf2_support]} {
 standard_testfile
 set executable ${testfile}
 
-if {[build_executable ${testfile}.exp ${executable} "${testfile}.c ${testfile}.S" {additional_flags=-DINLINED}] == -1} {
+if [is_ilp32_target] {
+    set ptrbits 32
+} else {
+    set ptrbits 64
+}
+
+if { [build_executable ${testfile}.exp ${executable} \
+	  "${testfile}.c ${testfile}.S" \
+	  [list additional_flags=-DINLINED \
+		additional_flags=-DPTRBITS=$ptrbits]] == -1 } {
     return -1
 }