gdb/testsuite: modernize gdb.dwarf2/dw2-noloc.exp

Message ID 20240103171605.1048532-1-blarsen@redhat.com
State New
Headers
Series gdb/testsuite: modernize gdb.dwarf2/dw2-noloc.exp |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Testing passed

Commit Message

Guinevere Larsen Jan. 3, 2024, 5:16 p.m. UTC
  The test gdb.dwarf2/dw2-noloc.exp predates the dwarf assembler, and uses
some unreliable assumptions about where global labels get put.
Specifically, when using clang to compile the test, both labels it uses
to gauge the adresses of the main function get reshuffled to be side-by-side,
and the debug information ends up making it look like main's high pc is equal
to low pc, meaning we never enter the main function's scope, and that leads to
22 failures because the "main_*" variables are technically never in scope.

This patch modernizes the aforementioned test to use the dwarf
assembler, which removes all failures when using clang.  It also renames
the .c file to be more inline with current standard.
---
 gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c |  28 --
 gdb/testsuite/gdb.dwarf2/dw2-noloc.S      | 331 ----------------------
 gdb/testsuite/gdb.dwarf2/dw2-noloc.c      |  44 +++
 gdb/testsuite/gdb.dwarf2/dw2-noloc.exp    | 192 ++++++++++++-
 4 files changed, 235 insertions(+), 360 deletions(-)
 delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
 delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc.S
 create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc.c
  

Comments

Guinevere Larsen Jan. 17, 2024, 8:54 a.m. UTC | #1
On 03/01/2024 18:16, Guinevere Larsen wrote:
> The test gdb.dwarf2/dw2-noloc.exp predates the dwarf assembler, and uses
> some unreliable assumptions about where global labels get put.
> Specifically, when using clang to compile the test, both labels it uses
> to gauge the adresses of the main function get reshuffled to be side-by-side,
> and the debug information ends up making it look like main's high pc is equal
> to low pc, meaning we never enter the main function's scope, and that leads to
> 22 failures because the "main_*" variables are technically never in scope.
>
> This patch modernizes the aforementioned test to use the dwarf
> assembler, which removes all failures when using clang.  It also renames
> the .c file to be more inline with current standard.
Ping!
> ---
>   gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c |  28 --
>   gdb/testsuite/gdb.dwarf2/dw2-noloc.S      | 331 ----------------------
>   gdb/testsuite/gdb.dwarf2/dw2-noloc.c      |  44 +++
>   gdb/testsuite/gdb.dwarf2/dw2-noloc.exp    | 192 ++++++++++++-
>   4 files changed, 235 insertions(+), 360 deletions(-)
>   delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
>   delete mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc.S
>   create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-noloc.c
>
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c b/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
> deleted file mode 100644
> index 9c080fa36b3..00000000000
> --- a/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -/* This testcase is part of GDB, the GNU debugger.
> -
> -   Copyright 2009-2023 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/>.  */
> -
> -asm (".globl cu_text_start");
> -asm ("cu_text_start:");
> -
> -int
> -main (void)
> -{
> -  return 0;
> -}
> -
> -asm (".globl cu_text_end");
> -asm ("cu_text_end:");
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S b/gdb/testsuite/gdb.dwarf2/dw2-noloc.S
> deleted file mode 100644
> index d9e31d30ed9..00000000000
> --- a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S
> +++ /dev/null
> @@ -1,331 +0,0 @@
> -/* This testcase is part of GDB, the GNU debugger.
> -
> -   Copyright 2007-2023 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/>.  */
> -
> -	.data
> -
> -	.globl	file_locaddr_resolvable
> -file_locaddr_resolvable:
> -	.globl	file_locempty_resolvable
> -file_locempty_resolvable:
> -	.globl	file_locno_resolvable
> -file_locno_resolvable:
> -	.globl	file_extern_locaddr_resolvable
> -file_extern_locaddr_resolvable:
> -	.globl	file_extern_locempty_resolvable
> -file_extern_locempty_resolvable:
> -	.globl	file_extern_locno_resolvable
> -file_extern_locno_resolvable:
> -	.globl	main_local_locaddr_resolvable
> -main_local_locaddr_resolvable:
> -	.globl	main_local_locempty_resolvable
> -main_local_locempty_resolvable:
> -	.globl	main_local_locno_resolvable
> -main_local_locno_resolvable:
> -	.globl	main_extern_locaddr_resolvable
> -main_extern_locaddr_resolvable:
> -	.globl	main_extern_locno_resolvable
> -main_extern_locno_resolvable:
> -	.globl	main_extern_locempty_resolvable
> -main_extern_locempty_resolvable:
> -
> -resolvable:
> -	.4byte	1234567890
> -
> -/* 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	4				/* Pointer size */
> -
> -	/* CU die */
> -	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
> -	.4byte	cu_text_end			/* DW_AT_high_pc */
> -	.4byte	cu_text_start			/* DW_AT_low_pc */
> -	.ascii	"file1.txt\0"			/* DW_AT_name */
> -	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
> -	.byte	1				/* DW_AT_language (C) */
> -
> -.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 */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"file_locaddr_resolvable\0"	/* DW_AT_name */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"file_locaddr_unresolvable\0"	/* DW_AT_name */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"file_locempty_resolvable\0"	/* DW_AT_name */
> -	.byte		0			/* DW_AT_location */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"file_locempty_unresolvable\0"	/* DW_AT_name */
> -	.byte		0			/* DW_AT_location */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
> -	.ascii		"file_locno_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
> -	.ascii		"file_locno_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"file_extern_locaddr_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"file_extern_locaddr_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"file_extern_locempty_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		0			/* DW_AT_location */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"file_extern_locempty_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		0			/* DW_AT_location */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
> -	.ascii		"file_extern_locno_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
> -	.ascii		"file_extern_locno_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		1			/* DW_AT_external */
> -
> -	/* main */
> -	.uleb128	6			/* Abbrev: DW_TAG_subprogram */
> -	.byte		1			/* DW_AT_decl_file */
> -	.byte		2			/* DW_AT_decl_line */
> -	.ascii		"main\0"		/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.4byte		cu_text_start		/* DW_AT_low_pc */
> -	.4byte		cu_text_end		/* DW_AT_high_pc */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"main_local_locaddr_resolvable\0"	/* DW_AT_name */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"main_local_locaddr_unresolvable\0"	/* DW_AT_name */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"main_local_locempty_resolvable\0"	/* DW_AT_name */
> -	.byte		0			/* DW_AT_location */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
> -	.ascii		"main_local_locempty_unresolvable\0"	/* DW_AT_name */
> -	.byte		0			/* DW_AT_location */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
> -	.ascii		"main_local_locno_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
> -	.ascii		"main_local_locno_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"main_extern_locaddr_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"main_extern_locaddr_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		2f - 1f			/* DW_AT_location */
> -1:	.byte		3			/*   DW_OP_addr */
> -	.4byte		resolvable		/*   <addr> */
> -2:	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"main_extern_locempty_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		0			/* DW_AT_location */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
> -	.ascii		"main_extern_locempty_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		0			/* DW_AT_location */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
> -	.ascii		"main_extern_locno_resolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		1			/* DW_AT_external */
> -
> -	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
> -	.ascii		"main_extern_locno_unresolvable\0"	/* DW_AT_name */
> -	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
> -	.byte		1			/* DW_AT_external */
> -
> -	.byte		0			/* End of children of main */
> -
> -	.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	0x12			/* DW_AT_high_pc */
> -	.uleb128	0x1			/* DW_FORM_addr */
> -	.uleb128	0x11			/* DW_AT_low_pc */
> -	.uleb128	0x1			/* DW_FORM_addr */
> -	.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	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	4			/* Abbrev code (extern) */
> -	.uleb128	0x34			/* DW_TAG_variable */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.uleb128	0x3f			/* DW_AT_external */
> -	.uleb128	0xc			/* DW_FORM_flag */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	5			/* Abbrev code (bare) */
> -	.uleb128	0x34			/* DW_TAG_variable */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	6			/* Abbrev code */
> -	.uleb128	0x2e			/* DW_TAG_subprogram */
> -	.byte		1			/* has_children */
> -	.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	0x11			/* DW_AT_low_pc */
> -	.uleb128	0x1			/* DW_FORM_addr */
> -	.uleb128	0x12			/* DW_AT_high_pc */
> -	.uleb128	0x1			/* DW_FORM_addr */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	7			/* Abbrev code (location) */
> -	.uleb128	0x34			/* DW_TAG_variable */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x2			/* DW_AT_location */
> -	.uleb128	0xa			/* DW_FORM_block1 */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.uleb128	8			/* Abbrev code (location+extern) */
> -	.uleb128	0x34			/* DW_TAG_variable */
> -	.byte		0			/* has_children */
> -	.uleb128	0x3			/* DW_AT_name */
> -	.uleb128	0x8			/* DW_FORM_string */
> -	.uleb128	0x49			/* DW_AT_type */
> -	.uleb128	0x13			/* DW_FORM_ref4 */
> -	.uleb128	0x2			/* DW_AT_location */
> -	.uleb128	0xa			/* DW_FORM_block1 */
> -	.uleb128	0x3f			/* DW_AT_external */
> -	.uleb128	0xc			/* DW_FORM_flag */
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -
> -	.byte		0x0			/* Terminator */
> -	.byte		0x0			/* Terminator */
> -#ifdef __arm__
> -	.section	.note.GNU-stack,"",%progbits
> -#else
> -	.section	.note.GNU-stack,"",@progbits
> -#endif
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.c b/gdb/testsuite/gdb.dwarf2/dw2-noloc.c
> new file mode 100644
> index 00000000000..42332244e9b
> --- /dev/null
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-noloc.c
> @@ -0,0 +1,44 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2009-2023 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/>.  */
> +
> +/* This is the value that all variables should have, here for convenience. */
> +#define VALUE 1234567890
> +
> +/* These variables are here so that gcc adds them to the .symtab section
> +   on its own, instead of needing the DWARF assembler.  */
> +int file_locno_resolvable = VALUE;
> +int file_locempty_resolvable = VALUE;
> +int file_locaddr_resolvable = VALUE;
> +int main_local_locno_resolvable = VALUE;
> +int main_local_locempty_resolvable = VALUE;
> +int main_local_locaddr_resolvable = VALUE;
> +/* Despite these variables being marked as external in the debuginfo, if
> +   we do have them as external, the compiler won't add them to the .symtab
> +   section.  */
> +/* extern */ int file_extern_locno_resolvable = VALUE;
> +/* extern */ int file_extern_locempty_resolvable = VALUE;
> +/* extern */ int file_extern_locaddr_resolvable = VALUE;
> +/* extern */ int main_extern_locno_resolvable = VALUE;
> +/* extern */ int main_extern_locempty_resolvable = VALUE;
> +/* extern */ int main_extern_locaddr_resolvable = VALUE;
> +
> +int
> +main (void)
> +{
> +  asm ("main_label: .global main_label");
> +  return 0;					/* main start */
> +}
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp b/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
> index b10050f59b0..dad89095213 100644
> --- a/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
> @@ -17,7 +17,197 @@ load_lib dwarf.exp
>   # This test can only be run on targets which support DWARF-2 and use gas.
>   require dwarf2_support
>   
> -if { [prepare_for_testing "failed to prepare" "dw2-noloc" {dw2-noloc-main.c dw2-noloc.S} {nodebug}] } {
> +standard_testfile .c .S
> +set asm_file [standard_output_file $srcfile2]
> +
> +Dwarf::assemble $asm_file {
> +    global srcdir subdir srcfile srcfile2
> +    declare_labels lines_label
> +
> +    get_func_info main
> +
> +    cu {} {
> +	compile_unit {
> +	    {language @DW_LANG_C}
> +	    {name $srcfile}
> +	    {stmt_list ${lines_label} DW_FORM_sec_offset}
> +	} {
> +	    declare_labels integer_label
> +	    set int_size [get_sizeof "int" 4]
> +	    integer_label: DW_TAG_base_type {
> +		{DW_AT_byte_size $int_size DW_FORM_sdata}
> +		{DW_AT_encoding @DW_ATE_signed}
> +		{DW_AT_name int}
> +	    }
> +
> +	    DW_TAG_subprogram {
> +		{external 1 flag}
> +		{name main}
> +		{low_pc $main_start addr}
> +		{high_pc "$main_start + $main_len" addr}
> +	    }
> +
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locno_resolvable}
> +		{DW_AT_type :$integer_label}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locno_unresolvable}
> +		{DW_AT_type :$integer_label}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locempty_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locempty_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locaddr_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol file_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_locaddr_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol file_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locno_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locno_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locempty_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locempty_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locaddr_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name file_extern_locaddr_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locno_resolvable}
> +		{DW_AT_type :$integer_label}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locno_unresolvable}
> +		{DW_AT_type :$integer_label}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locempty_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locempty_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locaddr_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_local_locaddr_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locno_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locno_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locempty_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locempty_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {} DW_FORM_block1}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locaddr_resolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +	    DW_TAG_variable {
> +		{DW_AT_name main_extern_locaddr_unresolvable}
> +		{DW_AT_type :$integer_label}
> +		{DW_AT_external 1 flag}
> +		{DW_AT_location {
> +		    DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable]
> +		} SPECIAL_expr}
> +	    }
> +	}
> +    }
> +
> +    lines {version 5} lines_label {
> +	set diridx [include_dir "${srcdir}/${subdir}"]
> +	file_name "$srcfile" $diridx
> +
> +	program {
> +	    DW_LNS_set_file $diridx
> +	    DW_LNE_set_address $main_start
> +	    line [gdb_get_line_number "main start"]
> +	    DW_LNS_set_prologue_end
> +	    DW_LNS_copy
> +	}
> +    }
> +}
> +
> +if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $asm_file] {nodebug}] } {
>       return -1
>   }
>
  
Tom Tromey Jan. 19, 2024, 5:14 p.m. UTC | #2
>>>>> "Guinevere" == Guinevere Larsen <blarsen@redhat.com> writes:

Guinevere> The test gdb.dwarf2/dw2-noloc.exp predates the dwarf assembler, and uses
Guinevere> some unreliable assumptions about where global labels get put.
Guinevere> Specifically, when using clang to compile the test, both labels it uses
Guinevere> to gauge the adresses of the main function get reshuffled to be side-by-side,
Guinevere> and the debug information ends up making it look like main's high pc is equal
Guinevere> to low pc, meaning we never enter the main function's scope, and that leads to
Guinevere> 22 failures because the "main_*" variables are technically never in scope.

Guinevere> This patch modernizes the aforementioned test to use the dwarf
Guinevere> assembler, which removes all failures when using clang.  It also renames
Guinevere> the .c file to be more inline with current standard.

Thank you for doing this.  It's great whenever we can get rid of one of
these .S files.

Approved-By: Tom Tromey <tom@tromey.com>

Tom
  
Guinevere Larsen Jan. 22, 2024, 10:32 a.m. UTC | #3
On 19/01/2024 18:14, Tom Tromey wrote:
>>>>>> "Guinevere" == Guinevere Larsen <blarsen@redhat.com> writes:
> Guinevere> The test gdb.dwarf2/dw2-noloc.exp predates the dwarf assembler, and uses
> Guinevere> some unreliable assumptions about where global labels get put.
> Guinevere> Specifically, when using clang to compile the test, both labels it uses
> Guinevere> to gauge the adresses of the main function get reshuffled to be side-by-side,
> Guinevere> and the debug information ends up making it look like main's high pc is equal
> Guinevere> to low pc, meaning we never enter the main function's scope, and that leads to
> Guinevere> 22 failures because the "main_*" variables are technically never in scope.
>
> Guinevere> This patch modernizes the aforementioned test to use the dwarf
> Guinevere> assembler, which removes all failures when using clang.  It also renames
> Guinevere> the .c file to be more inline with current standard.
>
> Thank you for doing this.  It's great whenever we can get rid of one of
> these .S files.
>
> Approved-By: Tom Tromey <tom@tromey.com>
>
> Tom
>
Thanks, pushed!
  

Patch

diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c b/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
deleted file mode 100644
index 9c080fa36b3..00000000000
--- a/gdb/testsuite/gdb.dwarf2/dw2-noloc-main.c
+++ /dev/null
@@ -1,28 +0,0 @@ 
-/* This testcase is part of GDB, the GNU debugger.
-
-   Copyright 2009-2023 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/>.  */
-
-asm (".globl cu_text_start");
-asm ("cu_text_start:");
-
-int
-main (void)
-{
-  return 0;
-}
-
-asm (".globl cu_text_end");
-asm ("cu_text_end:");
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S b/gdb/testsuite/gdb.dwarf2/dw2-noloc.S
deleted file mode 100644
index d9e31d30ed9..00000000000
--- a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S
+++ /dev/null
@@ -1,331 +0,0 @@ 
-/* This testcase is part of GDB, the GNU debugger.
-
-   Copyright 2007-2023 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/>.  */
-
-	.data
-
-	.globl	file_locaddr_resolvable
-file_locaddr_resolvable:
-	.globl	file_locempty_resolvable
-file_locempty_resolvable:
-	.globl	file_locno_resolvable
-file_locno_resolvable:
-	.globl	file_extern_locaddr_resolvable
-file_extern_locaddr_resolvable:
-	.globl	file_extern_locempty_resolvable
-file_extern_locempty_resolvable:
-	.globl	file_extern_locno_resolvable
-file_extern_locno_resolvable:
-	.globl	main_local_locaddr_resolvable
-main_local_locaddr_resolvable:
-	.globl	main_local_locempty_resolvable
-main_local_locempty_resolvable:
-	.globl	main_local_locno_resolvable
-main_local_locno_resolvable:
-	.globl	main_extern_locaddr_resolvable
-main_extern_locaddr_resolvable:
-	.globl	main_extern_locno_resolvable
-main_extern_locno_resolvable:
-	.globl	main_extern_locempty_resolvable
-main_extern_locempty_resolvable:
-
-resolvable:
-	.4byte	1234567890
-
-/* 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	4				/* Pointer size */
-
-	/* CU die */
-	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
-	.4byte	cu_text_end			/* DW_AT_high_pc */
-	.4byte	cu_text_start			/* DW_AT_low_pc */
-	.ascii	"file1.txt\0"			/* DW_AT_name */
-	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
-	.byte	1				/* DW_AT_language (C) */
-
-.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 */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"file_locaddr_resolvable\0"	/* DW_AT_name */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"file_locaddr_unresolvable\0"	/* DW_AT_name */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"file_locempty_resolvable\0"	/* DW_AT_name */
-	.byte		0			/* DW_AT_location */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"file_locempty_unresolvable\0"	/* DW_AT_name */
-	.byte		0			/* DW_AT_location */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
-	.ascii		"file_locno_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
-	.ascii		"file_locno_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"file_extern_locaddr_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"file_extern_locaddr_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"file_extern_locempty_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		0			/* DW_AT_location */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"file_extern_locempty_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		0			/* DW_AT_location */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
-	.ascii		"file_extern_locno_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
-	.ascii		"file_extern_locno_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		1			/* DW_AT_external */
-
-	/* main */
-	.uleb128	6			/* Abbrev: DW_TAG_subprogram */
-	.byte		1			/* DW_AT_decl_file */
-	.byte		2			/* DW_AT_decl_line */
-	.ascii		"main\0"		/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.4byte		cu_text_start		/* DW_AT_low_pc */
-	.4byte		cu_text_end		/* DW_AT_high_pc */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"main_local_locaddr_resolvable\0"	/* DW_AT_name */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"main_local_locaddr_unresolvable\0"	/* DW_AT_name */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"main_local_locempty_resolvable\0"	/* DW_AT_name */
-	.byte		0			/* DW_AT_location */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-	.ascii		"main_local_locempty_unresolvable\0"	/* DW_AT_name */
-	.byte		0			/* DW_AT_location */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
-	.ascii		"main_local_locno_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	5			/* Abbrev: DW_TAG_variable (bare) */
-	.ascii		"main_local_locno_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"main_extern_locaddr_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"main_extern_locaddr_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		2f - 1f			/* DW_AT_location */
-1:	.byte		3			/*   DW_OP_addr */
-	.4byte		resolvable		/*   <addr> */
-2:	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"main_extern_locempty_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		0			/* DW_AT_location */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	8			/* Abbrev: DW_TAG_variable (location+extern) */
-	.ascii		"main_extern_locempty_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		0			/* DW_AT_location */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
-	.ascii		"main_extern_locno_resolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		1			/* DW_AT_external */
-
-	.uleb128	4			/* Abbrev: DW_TAG_variable (extern) */
-	.ascii		"main_extern_locno_unresolvable\0"	/* DW_AT_name */
-	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-	.byte		1			/* DW_AT_external */
-
-	.byte		0			/* End of children of main */
-
-	.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	0x12			/* DW_AT_high_pc */
-	.uleb128	0x1			/* DW_FORM_addr */
-	.uleb128	0x11			/* DW_AT_low_pc */
-	.uleb128	0x1			/* DW_FORM_addr */
-	.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	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	4			/* Abbrev code (extern) */
-	.uleb128	0x34			/* DW_TAG_variable */
-	.byte		0			/* has_children */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.uleb128	0x3f			/* DW_AT_external */
-	.uleb128	0xc			/* DW_FORM_flag */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	5			/* Abbrev code (bare) */
-	.uleb128	0x34			/* DW_TAG_variable */
-	.byte		0			/* has_children */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	6			/* Abbrev code */
-	.uleb128	0x2e			/* DW_TAG_subprogram */
-	.byte		1			/* has_children */
-	.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	0x11			/* DW_AT_low_pc */
-	.uleb128	0x1			/* DW_FORM_addr */
-	.uleb128	0x12			/* DW_AT_high_pc */
-	.uleb128	0x1			/* DW_FORM_addr */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	7			/* Abbrev code (location) */
-	.uleb128	0x34			/* DW_TAG_variable */
-	.byte		0			/* has_children */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x2			/* DW_AT_location */
-	.uleb128	0xa			/* DW_FORM_block1 */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.uleb128	8			/* Abbrev code (location+extern) */
-	.uleb128	0x34			/* DW_TAG_variable */
-	.byte		0			/* has_children */
-	.uleb128	0x3			/* DW_AT_name */
-	.uleb128	0x8			/* DW_FORM_string */
-	.uleb128	0x49			/* DW_AT_type */
-	.uleb128	0x13			/* DW_FORM_ref4 */
-	.uleb128	0x2			/* DW_AT_location */
-	.uleb128	0xa			/* DW_FORM_block1 */
-	.uleb128	0x3f			/* DW_AT_external */
-	.uleb128	0xc			/* DW_FORM_flag */
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-
-	.byte		0x0			/* Terminator */
-	.byte		0x0			/* Terminator */
-#ifdef __arm__
-	.section	.note.GNU-stack,"",%progbits
-#else
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.c b/gdb/testsuite/gdb.dwarf2/dw2-noloc.c
new file mode 100644
index 00000000000..42332244e9b
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-noloc.c
@@ -0,0 +1,44 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009-2023 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/>.  */
+
+/* This is the value that all variables should have, here for convenience. */
+#define VALUE 1234567890
+
+/* These variables are here so that gcc adds them to the .symtab section
+   on its own, instead of needing the DWARF assembler.  */
+int file_locno_resolvable = VALUE;
+int file_locempty_resolvable = VALUE;
+int file_locaddr_resolvable = VALUE;
+int main_local_locno_resolvable = VALUE;
+int main_local_locempty_resolvable = VALUE;
+int main_local_locaddr_resolvable = VALUE;
+/* Despite these variables being marked as external in the debuginfo, if
+   we do have them as external, the compiler won't add them to the .symtab
+   section.  */
+/* extern */ int file_extern_locno_resolvable = VALUE;
+/* extern */ int file_extern_locempty_resolvable = VALUE;
+/* extern */ int file_extern_locaddr_resolvable = VALUE;
+/* extern */ int main_extern_locno_resolvable = VALUE;
+/* extern */ int main_extern_locempty_resolvable = VALUE;
+/* extern */ int main_extern_locaddr_resolvable = VALUE;
+
+int
+main (void)
+{
+  asm ("main_label: .global main_label");
+  return 0;					/* main start */
+}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp b/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
index b10050f59b0..dad89095213 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-noloc.exp
@@ -17,7 +17,197 @@  load_lib dwarf.exp
 # This test can only be run on targets which support DWARF-2 and use gas.
 require dwarf2_support
 
-if { [prepare_for_testing "failed to prepare" "dw2-noloc" {dw2-noloc-main.c dw2-noloc.S} {nodebug}] } {
+standard_testfile .c .S
+set asm_file [standard_output_file $srcfile2]
+
+Dwarf::assemble $asm_file {
+    global srcdir subdir srcfile srcfile2
+    declare_labels lines_label
+
+    get_func_info main
+
+    cu {} {
+	compile_unit {
+	    {language @DW_LANG_C}
+	    {name $srcfile}
+	    {stmt_list ${lines_label} DW_FORM_sec_offset}
+	} {
+	    declare_labels integer_label
+	    set int_size [get_sizeof "int" 4]
+	    integer_label: DW_TAG_base_type {
+		{DW_AT_byte_size $int_size DW_FORM_sdata}
+		{DW_AT_encoding @DW_ATE_signed}
+		{DW_AT_name int}
+	    }
+
+	    DW_TAG_subprogram {
+		{external 1 flag}
+		{name main}
+		{low_pc $main_start addr}
+		{high_pc "$main_start + $main_len" addr}
+	    }
+
+	    DW_TAG_variable {
+		{DW_AT_name file_locno_resolvable}
+		{DW_AT_type :$integer_label}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_locno_unresolvable}
+		{DW_AT_type :$integer_label}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_locempty_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_locempty_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_locaddr_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol file_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_locaddr_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol file_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locno_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locno_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locempty_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locempty_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locaddr_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name file_extern_locaddr_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locno_resolvable}
+		{DW_AT_type :$integer_label}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locno_unresolvable}
+		{DW_AT_type :$integer_label}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locempty_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locempty_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locaddr_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_local_locaddr_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locno_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locno_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locempty_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locempty_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {} DW_FORM_block1}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locaddr_resolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+	    DW_TAG_variable {
+		{DW_AT_name main_extern_locaddr_unresolvable}
+		{DW_AT_type :$integer_label}
+		{DW_AT_external 1 flag}
+		{DW_AT_location {
+		    DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable]
+		} SPECIAL_expr}
+	    }
+	}
+    }
+
+    lines {version 5} lines_label {
+	set diridx [include_dir "${srcdir}/${subdir}"]
+	file_name "$srcfile" $diridx
+
+	program {
+	    DW_LNS_set_file $diridx
+	    DW_LNE_set_address $main_start
+	    line [gdb_get_line_number "main start"]
+	    DW_LNS_set_prologue_end
+	    DW_LNS_copy
+	}
+    }
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $asm_file] {nodebug}] } {
     return -1
 }