Convert dw2-const.exp to use the DWARF assembler

Message ID 20260522155505.3363510-1-tromey@adacore.com
State New
Headers
Series Convert dw2-const.exp to use the DWARF assembler |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm fail Test failed

Commit Message

Tom Tromey May 22, 2026, 3:55 p.m. UTC
  This patch converts dw2-const.exp to use the DWARF assembler rather
than a .S file.  The conversion was largely done using the script from
contrib.
---
 gdb/testsuite/gdb.dwarf2/dw2-const.S   | 256 -------------------------
 gdb/testsuite/gdb.dwarf2/dw2-const.exp |  52 ++++-
 2 files changed, 49 insertions(+), 259 deletions(-)
 delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-const.S


base-commit: 1678d7d3d2e4cf83cda5a96334a0326573ad0f7c
  

Comments

Tom de Vries May 23, 2026, 8:56 a.m. UTC | #1
On 5/22/26 5:55 PM, Tom Tromey wrote:
> This patch converts dw2-const.exp to use the DWARF assembler rather
> than a .S file.  The conversion was largely done using the script from
> contrib.

Hi,

I reverse-applied "[gdb/testsuite] Complete 64-bit port of 
gdb.dwarf2/dw2-skip-prologue.exp", then applied this patch.

I ran the test-case, and it went fine.  I check for warnings with 
readelf and llvm-dwarfdump, and that was fine as well.

Then I ran it with target board unix/-m32, and ran into:
...
(gdb) print/x val8^M
$2 = 0x0^M
(gdb) FAIL: gdb.dwarf2/dw2-const.exp: print/x val8
...

Thanks,
- Tom

> ---
>   gdb/testsuite/gdb.dwarf2/dw2-const.S   | 256 -------------------------
>   gdb/testsuite/gdb.dwarf2/dw2-const.exp |  52 ++++-
>   2 files changed, 49 insertions(+), 259 deletions(-)
>   delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-const.S
> 
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-const.S b/gdb/testsuite/gdb.dwarf2/dw2-const.S
> deleted file mode 100644
> index 94cf1acbed6..00000000000
> --- a/gdb/testsuite/gdb.dwarf2/dw2-const.S
> +++ /dev/null
> @@ -1,256 +0,0 @@
> -/* This testcase is part of GDB, the GNU debugger.
> -
> -   Copyright 2010-2026 Free Software Foundation, Inc.
> -
> -   This program is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3 of the License, or
> -   (at your option) any later version.
> -
> -   This program is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   You should have received a copy of the GNU General Public License
> -   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> -
> -/* Dummy function to provide debug information for.  */
> -
> -	.text
> -.Lbegin_text1:
> -	.globl func_cu1
> -	.type func_cu1, %function
> -func_cu1:
> -.Lbegin_func_cu1:
> -	.int 0
> -.Lend_func_cu1:
> -	.size func_cu1, .-func_cu1
> -.Lend_text1:
> -
> -/* Debug information */
> -
> -	.section .debug_info
> -.Lcu1_begin:
> -	/* CU header */
> -	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
> -.Lcu1_start:
> -	.2byte	2				/* DWARF Version */
> -	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
> -	.byte	8				/* Pointer size */
> -
> -	/* CU die */
> -	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
> -	.4byte	.Lline1_begin			/* DW_AT_stmt_list */
> -	.ascii	"file1.txt\0"			/* DW_AT_name */
> -	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
> -	.byte	1				/* DW_AT_language (C) */
> -
> -        .uleb128        0x8                     /* Abbrev: DW_TAG_constant */
> -        .ascii          "twelve\0"              /* DW_AT_name */
> -	.4byte		.Ltype_const-.Lcu1_begin   /* DW_AT_type */
> -        .byte           0xc                     /* DW_AT_const_value */
> -
> -.Ltype_const:
> -        .uleb128        0x9                     /* Abbrev: DW_TAG_const_type */
> -        .4byte           .Ltype_int-.Lcu1_begin /* DW_AT_type */
> -
> -        .uleb128        0xa                     /* Abbrev: DW_TAG_variable */
> -        .ascii          "val8\0"                /* DW_AT_name */
> -        .4byte          .Ltype_const8-.Lcu1_begin   /* DW_AT_type */
> -        .byte           2f - 1f                 /* DW_AT_location */
> -1:      .byte           0x11                    /* DW_OP_consts */
> -#if 0 /* gas encodes it explicitly.  */
> -        .slab128        0xffffffff00000000
> -#endif
> -#if 0 /* gas encoded it correctly - formed GDB FAILed.  */
> -        .sleb128        -4294967296
> -#endif
> -#if 1 /* Rather encode sleb128 by hand.  */
> -        .byte           0x80, 0x80, 0x80, 0x80, 0x70
> -#endif
> -        .byte           0x9f                    /* DW_OP_stack_value */
> -2:
> -
> -.Ltype_const8:
> -        .uleb128        0x9                     /* Abbrev: DW_TAG_const_type */
> -        .4byte           .Ltype_int8-.Lcu1_begin /* DW_AT_type */
> -
> -	/* func_cu1 */
> -	.uleb128	2			/* Abbrev: DW_TAG_subprogram */
> -	.byte		1			/* DW_AT_external */
> -	.byte		1			/* DW_AT_decl_file */
> -	.byte		2			/* DW_AT_decl_line */
> -	.ascii		"func_cu1\0"		/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		1			/* DW_AT_frame_base: length */
> -	.byte		0x55			/* DW_AT_frame_base: DW_OP_reg5 */
> -
> -.Ltype_int:
> -	.uleb128	3			/* Abbrev: DW_TAG_base_type */
> -	.ascii		"int\0"			/* DW_AT_name */
> -	.byte		4			/* DW_AT_byte_size */
> -	.byte		5			/* DW_AT_encoding */
> -
> -.Ltype_int8:
> -	.uleb128	3			/* Abbrev: DW_TAG_base_type */
> -	.ascii		"int8\0"		/* DW_AT_name */
> -	.byte		8			/* DW_AT_byte_size */
> -	.byte		5			/* DW_AT_encoding */
> -
> -	.byte		0			/* End of children of CU */
> -
> -.Lcu1_end:
> -
> -/* Abbrev table */
> -	.section .debug_abbrev
> -.Labbrev1_begin:
> -	.uleb128	1			/* Abbrev code */
> -	.uleb128	0x11			/* DW_TAG_compile_unit */
> -	.byte		1			/* has_children */
> -	.uleb128	0x10			/* DW_AT_stmt_list */
> -	.uleb128	0x6			/* DW_FORM_data4 */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x25			/* DW_AT_producer */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x13			/* DW_AT_language */
> -	.uleb128	0xb			/* DW_FORM_data1 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	2			/* Abbrev code */
> -	.uleb128	0x2e			/* DW_TAG_subprogram */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3f			/* DW_AT_external */
> -	.uleb128	0xc			/* DW_FORM_flag */
> -	.uleb128	0x3a			/* DW_AT_decl_file */
> -	.uleb128	0xb			/* DW_FORM_data1 */
> -	.uleb128	0x3b			/* DW_AT_decl_line */
> -	.uleb128	0xb			/* DW_FORM_data1 */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.uleb128	0x40			/* DW_AT_frame_base */
> -	.uleb128	0xa			/* DW_FORM_block1 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	3			/* Abbrev code */
> -	.uleb128	0x24			/* DW_TAG_base_type */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0xb			/* DW_AT_byte_size */
> -	.uleb128	0xb			/* DW_FORM_data1 */
> -	.uleb128	0x3e			/* DW_AT_encoding */
> -	.uleb128	0xb			/* DW_FORM_data1 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -        .uleb128        0x8                     /* abbrev code */
> -        .uleb128        0x27                    /* TAG: DW_TAG_constant */
> -        .byte           0x0                     /* DW_children_no */
> -        .uleb128        0x3                     /* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -        .uleb128        0x49                    /* DW_AT_type */
> -        .uleb128        0x13                    /* DW_FORM_ref4 */
> -        .uleb128        0x1c                    /* DW_AT_const_value */
> -        .uleb128        0xb                     /* DW_FORM_data1 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -        .uleb128        0x9                     /* abbrev code */
> -        .uleb128        0x26                    /* TAG: DW_TAG_const_type */
> -        .byte           0x0                     /* DW_children_no */
> -        .uleb128        0x49                    /* DW_AT_type */
> -        .uleb128        0x13                    /* DW_FORM_ref4 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	0xa			/* abbrev code */
> -	.uleb128	0x34			/* TAG: DW_TAG_variable */
> -	.byte		0x0			/* DW_children_no */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.uleb128	0x02			/* DW_AT_location */
> -	.uleb128	0xa			/* DW_FORM_block1 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -/* Line table */
> -	.section .debug_line
> -.Lline1_begin:
> -	.4byte		.Lline1_end - .Lline1_start	/* Initial length */
> -.Lline1_start:
> -	.2byte		2			/* Version */
> -	.4byte		.Lline1_lines - .Lline1_hdr	/* header_length */
> -.Lline1_hdr:
> -	.byte		1			/* Minimum insn length */
> -	.byte		1			/* default_is_stmt */
> -	.byte		1			/* line_base */
> -	.byte		1			/* line_range */
> -	.byte		0x10			/* opcode_base */
> -
> -	/* Standard lengths */
> -	.byte		0
> -	.byte		1
> -	.byte		1
> -	.byte		1
> -	.byte		1
> -	.byte		0
> -	.byte		0
> -	.byte		0
> -	.byte		1
> -	.byte		0
> -	.byte		0
> -	.byte		1
> -	.byte		0
> -	.byte		0
> -	.byte		0
> -
> -	/* Include directories */
> -	.byte		0
> -
> -	/* File names */
> -	.ascii		"file1.txt\0"
> -	.uleb128	0
> -	.uleb128	0
> -	.uleb128	0
> -
> -	.byte		0
> -
> -.Lline1_lines:
> -	.byte		0	/* DW_LNE_set_address */
> -	.uleb128	5
> -	.byte		2
> -	.4byte		.Lbegin_func_cu1
> -
> -	.byte		3	/* DW_LNS_advance_line */
> -	.sleb128	3	/* ... to 4 */
> -
> -	.byte		1	/* DW_LNS_copy */
> -
> -	.byte		1	/* DW_LNS_copy (second time as an end-of-prologue marker) */
> -
> -	.byte		0	/* DW_LNE_set_address */
> -	.uleb128	5
> -	.byte		2
> -	.4byte		.Lend_func_cu1
> -
> -	.byte		0	/* DW_LNE_end_of_sequence */
> -	.uleb128	1
> -	.byte		1
> -
> -.Lline1_end:
> -#ifdef __arm__
> -	.section	.note.GNU-stack,"",%progbits
> -#else
> -	.section	.note.GNU-stack,"",@progbits
> -#endif
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-const.exp b/gdb/testsuite/gdb.dwarf2/dw2-const.exp
> index 93ddfaa0f2f..1492b09c93b 100644
> --- a/gdb/testsuite/gdb.dwarf2/dw2-const.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-const.exp
> @@ -17,10 +17,56 @@ load_lib dwarf.exp
>   # This test can only be run on targets which support DWARF-2 and use gas.
>   require dwarf2_support
>   
> -standard_testfile .S
> +standard_testfile main.c -debug.S
>   
> -if {[prepare_for_testing_full "failed to prepare" \
> -	 [list $testfile debug main.c debug $srcfile nodebug]]} {
> +# Set up the DWARF for the test.
> +
> +set asm_file [standard_output_file $srcfile2]
> +Dwarf::assemble $asm_file {
> +    global srcdir subdir srcfile
> +    declare_labels int int8 const_type const_type_2
> +
> +    cu {version 2} {
> +	DW_TAG_compile_unit {
> +	    DW_AT_name file1.txt DW_FORM_string
> +	    DW_AT_producer {GNU C 3.3.3} DW_FORM_string
> +	    DW_AT_language @DW_LANG_C89
> +	} {
> +	    DW_TAG_constant {
> +		DW_AT_name twelve DW_FORM_string
> +		DW_AT_type :$const_type_2
> +		DW_AT_const_value 12 DW_FORM_data1
> +	    }
> +	    const_type_2: DW_TAG_const_type {
> +		DW_AT_type :$int
> +	    }
> +	    DW_TAG_variable {
> +		DW_AT_name val8 DW_FORM_string
> +		DW_AT_type :$const_type
> +		DW_AT_location {
> +		    DW_OP_consts -4294967296
> +		    DW_OP_stack_value
> +		} SPECIAL_expr
> +	    }
> +	    const_type: DW_TAG_const_type {
> +		DW_AT_type :$int8
> +	    }
> +	    int: DW_TAG_base_type {
> +		DW_AT_name int DW_FORM_string
> +		DW_AT_byte_size 4 DW_FORM_data1
> +		DW_AT_encoding @DW_ATE_signed
> +	    }
> +	    int8: DW_TAG_base_type {
> +		DW_AT_name int8 DW_FORM_string
> +		DW_AT_byte_size 8 DW_FORM_data1
> +		DW_AT_encoding @DW_ATE_signed
> +	    }
> +	}
> +    }
> +}
> +
> +if {[prepare_for_testing "failed to prepare" ${testfile} \
> +	 [list $srcfile $asm_file] nodebug]} {
>       return
>   }
>   
> 
> base-commit: 1678d7d3d2e4cf83cda5a96334a0326573ad0f7c
  
Tom Tromey May 29, 2026, 2:58 p.m. UTC | #2
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> Then I ran it with target board unix/-m32, and ran into:
Tom> ...
Tom> (gdb) print/x val8^M
Tom> $2 = 0x0^M
Tom> (gdb) FAIL: gdb.dwarf2/dw2-const.exp: print/x val8
Tom> ...

Yeah, me too.

I wonder if there's some gas oddity here.  The DWARF doesn't seem to be
notably weird or word-size-dependent.  I see in the old .S:

>> -#if 0 /* gas encodes it explicitly.  */
>> -        .slab128        0xffffffff00000000
>> -#endif
>> -#if 0 /* gas encoded it correctly - formed GDB FAILed.  */
>> -        .sleb128        -4294967296
>> -#endif
>> -#if 1 /* Rather encode sleb128 by hand.  */
>> -        .byte           0x80, 0x80, 0x80, 0x80, 0x70
>> -#endif

So hmm.

But maybe this is some kind of extension we would want to support in the
DWARF assembler.

Anyway still looking into this.

Tom
  
Tom de Vries May 30, 2026, 8:13 a.m. UTC | #3
On 5/29/26 4:58 PM, Tom Tromey wrote:
>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
> 
> Tom> Then I ran it with target board unix/-m32, and ran into:
> Tom> ...
> Tom> (gdb) print/x val8^M
> Tom> $2 = 0x0^M
> Tom> (gdb) FAIL: gdb.dwarf2/dw2-const.exp: print/x val8
> Tom> ...
> 
> Yeah, me too.
> 
> I wonder if there's some gas oddity here.  The DWARF doesn't seem to be
> notably weird or word-size-dependent.  I see in the old .S:
> 
>>> -#if 0 /* gas encodes it explicitly.  */
>>> -        .slab128        0xffffffff00000000
>>> -#endif
>>> -#if 0 /* gas encoded it correctly - formed GDB FAILed.  */
>>> -        .sleb128        -4294967296
>>> -#endif
>>> -#if 1 /* Rather encode sleb128 by hand.  */
>>> -        .byte           0x80, 0x80, 0x80, 0x80, 0x70
>>> -#endif
> 
> So hmm.
> 
> But maybe this is some kind of extension we would want to support in the
> DWARF assembler.
> 
> Anyway still looking into this.

I found the reason for the discrepancy.

Before the patch, with unix/m32, the adress size is 8:
...
   Compilation Unit @ offset 0x2df:
    Length:        0x6f (32-bit)
    Version:       2
    Abbrev Offset: 0x1bb
    Pointer Size:  8
  <0><2ea>: Abbrev Number: 1 (DW_TAG_compile_unit)
     <2eb>   DW_AT_stmt_list   : 0x200
     <2ef>   DW_AT_name        : file1.txt
     <2f9>   DW_AT_producer    : GNU C 3.3.3
     <305>   DW_AT_language    : 1       (ANSI C)
...

After the patch, it's 4.

In dwarf_expr_context::execute_stack_op, we do:
...
	case DW_OP_consts:
           op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
           result = offset;
           result_val = value_from_ulongest (address_type, result);
           break;
...
and if address_type has size 4, result_val is 0.

Thanks,
- Tom
  
Tom Tromey June 1, 2026, 3:31 p.m. UTC | #4
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> I found the reason for the discrepancy.

Tom> Before the patch, with unix/m32, the adress size is 8:

Thank you.  I sent a v2 with this change.

Tom
  

Patch

diff --git a/gdb/testsuite/gdb.dwarf2/dw2-const.S b/gdb/testsuite/gdb.dwarf2/dw2-const.S
deleted file mode 100644
index 94cf1acbed6..00000000000
--- a/gdb/testsuite/gdb.dwarf2/dw2-const.S
+++ /dev/null
@@ -1,256 +0,0 @@ 
-/* This testcase is part of GDB, the GNU debugger.
-
-   Copyright 2010-2026 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Dummy function to provide debug information for.  */
-
-	.text
-.Lbegin_text1:
-	.globl func_cu1
-	.type func_cu1, %function
-func_cu1:
-.Lbegin_func_cu1:
-	.int 0
-.Lend_func_cu1:
-	.size func_cu1, .-func_cu1
-.Lend_text1:
-
-/* Debug information */
-
-	.section .debug_info
-.Lcu1_begin:
-	/* CU header */
-	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
-.Lcu1_start:
-	.2byte	2				/* DWARF Version */
-	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
-	.byte	8				/* Pointer size */
-
-	/* CU die */
-	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
-	.4byte	.Lline1_begin			/* DW_AT_stmt_list */
-	.ascii	"file1.txt\0"			/* DW_AT_name */
-	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
-	.byte	1				/* DW_AT_language (C) */
-
-        .uleb128        0x8                     /* Abbrev: DW_TAG_constant */
-        .ascii          "twelve\0"              /* DW_AT_name */
-	.4byte		.Ltype_const-.Lcu1_begin   /* DW_AT_type */
-        .byte           0xc                     /* DW_AT_const_value */
-
-.Ltype_const:
-        .uleb128        0x9                     /* Abbrev: DW_TAG_const_type */
-        .4byte           .Ltype_int-.Lcu1_begin /* DW_AT_type */
-
-        .uleb128        0xa                     /* Abbrev: DW_TAG_variable */
-        .ascii          "val8\0"                /* DW_AT_name */
-        .4byte          .Ltype_const8-.Lcu1_begin   /* DW_AT_type */
-        .byte           2f - 1f                 /* DW_AT_location */
-1:      .byte           0x11                    /* DW_OP_consts */
-#if 0 /* gas encodes it explicitly.  */
-        .slab128        0xffffffff00000000
-#endif
-#if 0 /* gas encoded it correctly - formed GDB FAILed.  */
-        .sleb128        -4294967296
-#endif
-#if 1 /* Rather encode sleb128 by hand.  */
-        .byte           0x80, 0x80, 0x80, 0x80, 0x70
-#endif
-        .byte           0x9f                    /* DW_OP_stack_value */
-2:
-
-.Ltype_const8:
-        .uleb128        0x9                     /* Abbrev: DW_TAG_const_type */
-        .4byte           .Ltype_int8-.Lcu1_begin /* DW_AT_type */
-
-	/* func_cu1 */
-	.uleb128	2			/* Abbrev: DW_TAG_subprogram */
-	.byte		1			/* DW_AT_external */
-	.byte		1			/* DW_AT_decl_file */
-	.byte		2			/* DW_AT_decl_line */
-	.ascii		"func_cu1\0"		/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		1			/* DW_AT_frame_base: length */
-	.byte		0x55			/* DW_AT_frame_base: DW_OP_reg5 */
-
-.Ltype_int:
-	.uleb128	3			/* Abbrev: DW_TAG_base_type */
-	.ascii		"int\0"			/* DW_AT_name */
-	.byte		4			/* DW_AT_byte_size */
-	.byte		5			/* DW_AT_encoding */
-
-.Ltype_int8:
-	.uleb128	3			/* Abbrev: DW_TAG_base_type */
-	.ascii		"int8\0"		/* DW_AT_name */
-	.byte		8			/* DW_AT_byte_size */
-	.byte		5			/* DW_AT_encoding */
-
-	.byte		0			/* End of children of CU */
-
-.Lcu1_end:
-
-/* Abbrev table */
-	.section .debug_abbrev
-.Labbrev1_begin:
-	.uleb128	1			/* Abbrev code */
-	.uleb128	0x11			/* DW_TAG_compile_unit */
-	.byte		1			/* has_children */
-	.uleb128	0x10			/* DW_AT_stmt_list */
-	.uleb128	0x6			/* DW_FORM_data4 */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x25			/* DW_AT_producer */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x13			/* DW_AT_language */
-	.uleb128	0xb			/* DW_FORM_data1 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	2			/* Abbrev code */
-	.uleb128	0x2e			/* DW_TAG_subprogram */
-	.byte		0			/* has_children */
-	.uleb128	0x3f			/* DW_AT_external */
-	.uleb128	0xc			/* DW_FORM_flag */
-	.uleb128	0x3a			/* DW_AT_decl_file */
-	.uleb128	0xb			/* DW_FORM_data1 */
-	.uleb128	0x3b			/* DW_AT_decl_line */
-	.uleb128	0xb			/* DW_FORM_data1 */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.uleb128	0x40			/* DW_AT_frame_base */
-	.uleb128	0xa			/* DW_FORM_block1 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	3			/* Abbrev code */
-	.uleb128	0x24			/* DW_TAG_base_type */
-	.byte		0			/* has_children */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0xb			/* DW_AT_byte_size */
-	.uleb128	0xb			/* DW_FORM_data1 */
-	.uleb128	0x3e			/* DW_AT_encoding */
-	.uleb128	0xb			/* DW_FORM_data1 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-        .uleb128        0x8                     /* abbrev code */
-        .uleb128        0x27                    /* TAG: DW_TAG_constant */
-        .byte           0x0                     /* DW_children_no */
-        .uleb128        0x3                     /* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-        .uleb128        0x49                    /* DW_AT_type */
-        .uleb128        0x13                    /* DW_FORM_ref4 */
-        .uleb128        0x1c                    /* DW_AT_const_value */
-        .uleb128        0xb                     /* DW_FORM_data1 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-        .uleb128        0x9                     /* abbrev code */
-        .uleb128        0x26                    /* TAG: DW_TAG_const_type */
-        .byte           0x0                     /* DW_children_no */
-        .uleb128        0x49                    /* DW_AT_type */
-        .uleb128        0x13                    /* DW_FORM_ref4 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	0xa			/* abbrev code */
-	.uleb128	0x34			/* TAG: DW_TAG_variable */
-	.byte		0x0			/* DW_children_no */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.uleb128	0x02			/* DW_AT_location */
-	.uleb128	0xa			/* DW_FORM_block1 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-/* Line table */
-	.section .debug_line
-.Lline1_begin:
-	.4byte		.Lline1_end - .Lline1_start	/* Initial length */
-.Lline1_start:
-	.2byte		2			/* Version */
-	.4byte		.Lline1_lines - .Lline1_hdr	/* header_length */
-.Lline1_hdr:
-	.byte		1			/* Minimum insn length */
-	.byte		1			/* default_is_stmt */
-	.byte		1			/* line_base */
-	.byte		1			/* line_range */
-	.byte		0x10			/* opcode_base */
-
-	/* Standard lengths */
-	.byte		0
-	.byte		1
-	.byte		1
-	.byte		1
-	.byte		1
-	.byte		0
-	.byte		0
-	.byte		0
-	.byte		1
-	.byte		0
-	.byte		0
-	.byte		1
-	.byte		0
-	.byte		0
-	.byte		0
-
-	/* Include directories */
-	.byte		0
-
-	/* File names */
-	.ascii		"file1.txt\0"
-	.uleb128	0
-	.uleb128	0
-	.uleb128	0
-
-	.byte		0
-
-.Lline1_lines:
-	.byte		0	/* DW_LNE_set_address */
-	.uleb128	5
-	.byte		2
-	.4byte		.Lbegin_func_cu1
-
-	.byte		3	/* DW_LNS_advance_line */
-	.sleb128	3	/* ... to 4 */
-
-	.byte		1	/* DW_LNS_copy */
-
-	.byte		1	/* DW_LNS_copy (second time as an end-of-prologue marker) */
-
-	.byte		0	/* DW_LNE_set_address */
-	.uleb128	5
-	.byte		2
-	.4byte		.Lend_func_cu1
-
-	.byte		0	/* DW_LNE_end_of_sequence */
-	.uleb128	1
-	.byte		1
-
-.Lline1_end:
-#ifdef __arm__
-	.section	.note.GNU-stack,"",%progbits
-#else
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-const.exp b/gdb/testsuite/gdb.dwarf2/dw2-const.exp
index 93ddfaa0f2f..1492b09c93b 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-const.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-const.exp
@@ -17,10 +17,56 @@  load_lib dwarf.exp
 # This test can only be run on targets which support DWARF-2 and use gas.
 require dwarf2_support
 
-standard_testfile .S
+standard_testfile main.c -debug.S
 
-if {[prepare_for_testing_full "failed to prepare" \
-	 [list $testfile debug main.c debug $srcfile nodebug]]} {
+# Set up the DWARF for the test.
+
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    global srcdir subdir srcfile
+    declare_labels int int8 const_type const_type_2
+
+    cu {version 2} {
+	DW_TAG_compile_unit {
+	    DW_AT_name file1.txt DW_FORM_string
+	    DW_AT_producer {GNU C 3.3.3} DW_FORM_string
+	    DW_AT_language @DW_LANG_C89
+	} {
+	    DW_TAG_constant {
+		DW_AT_name twelve DW_FORM_string
+		DW_AT_type :$const_type_2
+		DW_AT_const_value 12 DW_FORM_data1
+	    }
+	    const_type_2: DW_TAG_const_type {
+		DW_AT_type :$int
+	    }
+	    DW_TAG_variable {
+		DW_AT_name val8 DW_FORM_string
+		DW_AT_type :$const_type
+		DW_AT_location {
+		    DW_OP_consts -4294967296
+		    DW_OP_stack_value
+		} SPECIAL_expr
+	    }
+	    const_type: DW_TAG_const_type {
+		DW_AT_type :$int8
+	    }
+	    int: DW_TAG_base_type {
+		DW_AT_name int DW_FORM_string
+		DW_AT_byte_size 4 DW_FORM_data1
+		DW_AT_encoding @DW_ATE_signed
+	    }
+	    int8: DW_TAG_base_type {
+		DW_AT_name int8 DW_FORM_string
+		DW_AT_byte_size 8 DW_FORM_data1
+		DW_AT_encoding @DW_ATE_signed
+	    }
+	}
+    }
+}
+
+if {[prepare_for_testing "failed to prepare" ${testfile} \
+	 [list $srcfile $asm_file] nodebug]} {
     return
 }