[PATCH v2] dwarf: Dump .debug_loclists only for DWARF-5

H.J. Lu hjl.tools@gmail.com
Mon Mar 24 16:18:46 GMT 2025


.debug_loclists section is loaded into debug_information as DWARF-5 debug
info and .debug_loc section is loaded into debug_information as pre-DWARF-5
debug info.  When dumping .debug_loc section, we should only process
pre-DWARF-5 debug info in debug_information.  When dumping .debug_loclists
section, we should only process DWARF-5 info in debug_information.

binutils/

	PR binutils/32809
	* dwarf.c (display_debug_loc): Dump .debug_loclists only for
	DWARF-5.

ld/

	PR binutils/32809
	* testsuite/ld-x86-64/dwarf4.s: New file.
	* testsuite/ld-x86-64/dwarf5a.s: Likewise.
	* testsuite/ld-x86-64/dwarf5b.s: Likewise.
	* testsuite/ld-x86-64/pr32809.d: Likewise.
	* testsuite/ld-x86-64/x86-64.exp: Run pr32809.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
 binutils/dwarf.c                  |  14 +-
 ld/testsuite/ld-x86-64/dwarf4.s   | 309 +++++++++++++++++++++++++
 ld/testsuite/ld-x86-64/dwarf5a.s  | 360 ++++++++++++++++++++++++++++++
 ld/testsuite/ld-x86-64/dwarf5b.s  | 303 +++++++++++++++++++++++++
 ld/testsuite/ld-x86-64/pr32809.d  |  71 ++++++
 ld/testsuite/ld-x86-64/x86-64.exp |   1 +
 6 files changed, 1056 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-x86-64/dwarf4.s
 create mode 100644 ld/testsuite/ld-x86-64/dwarf5a.s
 create mode 100644 ld/testsuite/ld-x86-64/dwarf5b.s
 create mode 100644 ld/testsuite/ld-x86-64/pr32809.d

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 08bb623e405..fb09b866798 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -7324,7 +7324,7 @@ display_debug_loc (struct dwarf_section *section, void *file)
   unsigned int *array = NULL;
   const char *suffix = strrchr (section->name, '.');
   bool is_dwo = false;
-  int is_loclists = strstr (section->name, "debug_loclists") != NULL;
+  bool is_loclists = strstr (section->name, "debug_loclists") != NULL;
   uint64_t next_header_offset = 0;
 
   if (suffix && strcmp (suffix, ".dwo") == 0)
@@ -7450,6 +7450,16 @@ display_debug_loc (struct dwarf_section *section, void *file)
       debug_info *debug_info_p = debug_information + i;
       uint32_t offset_count;
 
+      /* .debug_loclists section is loaded into debug_information as
+	 DWARF-5 debug info and .debug_loc section is loaded into
+	 debug_information as pre-DWARF-5 debug info.  When dumping
+	 .debug_loc section, we should only process pre-DWARF-5 debug
+	 info in debug_information.  When dumping .debug_loclists
+	 section, we should only process DWARF-5 info in
+	 debug_information.  */
+      if ((debug_info_p->dwarf_version >= 5) != is_loclists)
+	continue;
+
       if (!locs_sorted)
 	{
 	  for (k = 0; k < debug_info_p->num_loc_offsets; k++)
@@ -7462,7 +7472,7 @@ display_debug_loc (struct dwarf_section *section, void *file)
 
       /* .debug_loclists has a per-unit header.
 	 Update start if we are detecting it.  */
-      if (debug_info_p->dwarf_version == 5)
+      if (debug_info_p->dwarf_version >= 5)
 	{
 	  j = locs_sorted ? 0 : array [0];
 
diff --git a/ld/testsuite/ld-x86-64/dwarf4.s b/ld/testsuite/ld-x86-64/dwarf4.s
new file mode 100644
index 00000000000..6af7272c94b
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/dwarf4.s
@@ -0,0 +1,309 @@
+	.file	"dwarf4.c"
+	.text
+.Ltext0:
+	.file 1 "dwarf4.c"
+	.p2align 4
+	.globl	foo
+	.type	foo, @function
+foo:
+.LVL0:
+.LFB0:
+	.loc 1 3 17 view -0
+	.cfi_startproc
+	.loc 1 4 3 view .LVU1
+	.loc 1 5 3 view .LVU2
+	.loc 1 3 17 is_stmt 0 view .LVU3
+	subq	$8, %rsp
+	.cfi_def_cfa_offset 16
+	.loc 1 5 3 view .LVU4
+	xorl	%eax, %eax
+	call	bar
+.LVL1:
+	.loc 1 6 3 is_stmt 1 view .LVU5
+	.loc 1 7 3 view .LVU6
+	xorl	%eax, %eax
+	.loc 1 9 1 is_stmt 0 view .LVU7
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 8
+	.loc 1 7 3 view .LVU8
+	jmp	bar
+.LVL2:
+	.cfi_endproc
+.LFE0:
+	.size	foo, .-foo
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x9e
+	.value	0x4
+	.long	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.long	.LASF0
+	.byte	0xc
+	.long	.LASF1
+	.long	.LASF2
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.long	.Ldebug_line0
+	.uleb128 0x2
+	.string	"bar"
+	.byte	0x1
+	.byte	0x1
+	.byte	0xd
+	.long	0x3b
+	.uleb128 0x3
+	.byte	0
+	.uleb128 0x4
+	.string	"foo"
+	.byte	0x1
+	.byte	0x3
+	.byte	0x6
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.uleb128 0x1
+	.byte	0x9c
+	.long	0x9a
+	.uleb128 0x5
+	.string	"p"
+	.byte	0x1
+	.byte	0x3
+	.byte	0xe
+	.long	0x9a
+	.long	.LLST0
+	.long	.LVUS0
+	.uleb128 0x6
+	.long	.LASF3
+	.byte	0x1
+	.byte	0x4
+	.byte	0x7
+	.long	0x9a
+	.long	.LLST1
+	.long	.LVUS1
+	.uleb128 0x7
+	.quad	.LVL1
+	.long	0x2d
+	.uleb128 0x8
+	.quad	.LVL2
+	.long	0x2d
+	.byte	0
+	.uleb128 0x9
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.uleb128 0x2137
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.uleb128 0x2137
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LVUS0:
+	.uleb128 0
+	.uleb128 .LVU5
+	.uleb128 .LVU5
+	.uleb128 0
+.LLST0:
+	.quad	.LVL0-.Ltext0
+	.quad	.LVL1-1-.Ltext0
+	.value	0x1
+	.byte	0x55
+	.quad	.LVL1-1-.Ltext0
+	.quad	.LFE0-.Ltext0
+	.value	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x55
+	.byte	0x9f
+	.quad	0
+	.quad	0
+.LVUS1:
+	.uleb128 .LVU2
+	.uleb128 .LVU5
+	.uleb128 .LVU5
+	.uleb128 .LVU6
+	.uleb128 .LVU6
+	.uleb128 0
+.LLST1:
+	.quad	.LVL0-.Ltext0
+	.quad	.LVL1-1-.Ltext0
+	.value	0x1
+	.byte	0x55
+	.quad	.LVL1-1-.Ltext0
+	.quad	.LVL1-.Ltext0
+	.value	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x55
+	.byte	0x9f
+	.quad	.LVL1-.Ltext0
+	.quad	.LFE0-.Ltext0
+	.value	0x3
+	.byte	0x8
+	.byte	0x7b
+	.byte	0x9f
+	.quad	0
+	.quad	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.quad	0
+	.quad	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF0:
+	.string	"GNU C17 14.2.1 20250210 (Red Hat 14.2.1-8) -mtune=generic -march=x86-64 -g -gdwarf-4 -O2"
+.LASF1:
+	.string	"dwarf4.c"
+.LASF3:
+	.string	"local"
+.LASF2:
+	.string	"/export/home/hjl/bugs/binutils/pr32809"
+	.ident	"GCC: (GNU) 14.2.1 20250210 (Red Hat 14.2.1-8)"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/dwarf5a.s b/ld/testsuite/ld-x86-64/dwarf5a.s
new file mode 100644
index 00000000000..38f07f4bb67
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/dwarf5a.s
@@ -0,0 +1,360 @@
+	.file	"dwarf5a.c"
+	.text
+.Ltext0:
+	.file 0 "/export/home/hjl/bugs/binutils/pr32809" "dwarf5a.c"
+	.section	.text.startup,"ax",@progbits
+	.p2align 4
+	.globl	main
+	.type	main, @function
+main:
+.LFB0:
+	.file 1 "dwarf5a.c"
+	.loc 1 5 12 view -0
+	.cfi_startproc
+	.loc 1 6 3 view .LVU1
+.LVL0:
+	.loc 1 7 3 view .LVU2
+	.loc 1 5 12 is_stmt 0 view .LVU3
+	subq	$8, %rsp
+	.cfi_def_cfa_offset 16
+	.loc 1 7 3 view .LVU4
+	movl	$1, %edi
+	call	foo
+.LVL1:
+	.loc 1 8 3 is_stmt 1 view .LVU5
+	.loc 1 9 3 view .LVU6
+	movl	$2, %edi
+	call	foo
+.LVL2:
+	.loc 1 10 3 view .LVU7
+	.loc 1 11 3 view .LVU8
+	.loc 1 12 1 is_stmt 0 view .LVU9
+	xorl	%eax, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 8
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	main, .-main
+	.globl	global
+	.bss
+	.align 4
+	.type	global, @object
+	.size	global, 4
+global:
+	.zero	4
+	.text
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0xb3
+	.value	0x5
+	.byte	0x1
+	.byte	0x8
+	.long	.Ldebug_abbrev0
+	.uleb128 0x2
+	.long	.LASF4
+	.byte	0x1d
+	.long	.LASF0
+	.long	.LASF1
+	.long	.LLRL1
+	.quad	0
+	.long	.Ldebug_line0
+	.uleb128 0x3
+	.long	.LASF2
+	.byte	0x1
+	.byte	0x3
+	.byte	0x5
+	.long	0x40
+	.uleb128 0x9
+	.byte	0x3
+	.quad	global
+	.uleb128 0x4
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x5
+	.string	"foo"
+	.byte	0x1
+	.byte	0x1
+	.byte	0xd
+	.long	0x59
+	.uleb128 0x6
+	.long	0x40
+	.byte	0
+	.uleb128 0x7
+	.long	.LASF5
+	.byte	0x1
+	.byte	0x5
+	.byte	0x5
+	.long	0x40
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.uleb128 0x1
+	.byte	0x9c
+	.uleb128 0x8
+	.long	.LASF3
+	.byte	0x1
+	.byte	0x6
+	.byte	0x7
+	.long	0x40
+	.long	.LLST0
+	.long	.LVUS0
+	.uleb128 0x9
+	.quad	.LVL1
+	.long	0x47
+	.long	0xa2
+	.uleb128 0x1
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.uleb128 0xa
+	.quad	.LVL2
+	.long	0x47
+	.uleb128 0x1
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x49
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x7e
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x1f
+	.uleb128 0x1b
+	.uleb128 0x1f
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x7a
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.uleb128 0x2137
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x48
+	.byte	0x1
+	.uleb128 0x7d
+	.uleb128 0x1
+	.uleb128 0x7f
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0x48
+	.byte	0x1
+	.uleb128 0x7d
+	.uleb128 0x1
+	.uleb128 0x7f
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loclists,"",@progbits
+	.long	.Ldebug_loc3-.Ldebug_loc2
+.Ldebug_loc2:
+	.value	0x5
+	.byte	0x8
+	.byte	0
+	.long	0
+.Ldebug_loc0:
+.LVUS0:
+	.uleb128 .LVU2
+	.uleb128 .LVU5
+	.uleb128 .LVU6
+	.uleb128 .LVU8
+	.uleb128 .LVU8
+	.uleb128 0
+.LLST0:
+	.byte	0x6
+	.quad	.LVL0
+	.byte	0x4
+	.uleb128 .LVL0-.LVL0
+	.uleb128 .LVL1-1-.LVL0
+	.uleb128 0x9
+	.byte	0x3
+	.quad	global
+	.byte	0x4
+	.uleb128 .LVL1-.LVL0
+	.uleb128 .LVL2-.LVL0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7b
+	.byte	0x9f
+	.byte	0x4
+	.uleb128 .LVL2-.LVL0
+	.uleb128 .LFE0-.LVL0
+	.uleb128 0x4
+	.byte	0xa
+	.value	0x1c8
+	.byte	0x9f
+	.byte	0
+.Ldebug_loc3:
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.quad	0
+	.quad	0
+	.section	.debug_rnglists,"",@progbits
+.Ldebug_ranges0:
+	.long	.Ldebug_ranges3-.Ldebug_ranges2
+.Ldebug_ranges2:
+	.value	0x5
+	.byte	0x8
+	.byte	0
+	.long	0
+.LLRL1:
+	.byte	0x7
+	.quad	.LFB0
+	.uleb128 .LFE0-.LFB0
+	.byte	0
+.Ldebug_ranges3:
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF3:
+	.string	"local"
+.LASF4:
+	.string	"GNU C17 14.2.1 20250210 (Red Hat 14.2.1-8) -mtune=generic -march=x86-64 -g -gdwarf-5 -O2"
+.LASF2:
+	.string	"global"
+.LASF5:
+	.string	"main"
+	.section	.debug_line_str,"MS",@progbits,1
+.LASF0:
+	.string	"dwarf5a.c"
+.LASF1:
+	.string	"/export/home/hjl/bugs/binutils/pr32809"
+	.ident	"GCC: (GNU) 14.2.1 20250210 (Red Hat 14.2.1-8)"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/dwarf5b.s b/ld/testsuite/ld-x86-64/dwarf5b.s
new file mode 100644
index 00000000000..456ff706dee
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/dwarf5b.s
@@ -0,0 +1,303 @@
+	.file	"dwarf5b.c"
+	.text
+.Ltext0:
+	.file 0 "/export/home/hjl/bugs/binutils/pr32809" "dwarf5b.c"
+	.p2align 4
+	.globl	bar
+	.type	bar, @function
+bar:
+.LFB0:
+	.file 1 "dwarf5b.c"
+	.loc 1 7 1 view -0
+	.cfi_startproc
+	.loc 1 8 3 view .LVU1
+.LVL0:
+	.loc 1 9 3 view .LVU2
+	.loc 1 7 1 is_stmt 0 view .LVU3
+	subq	$8, %rsp
+	.cfi_def_cfa_offset 16
+	.loc 1 9 3 view .LVU4
+	movl	global(%rip), %edi
+	call	foo
+.LVL1:
+	.loc 1 10 3 is_stmt 1 view .LVU5
+	.loc 1 11 3 view .LVU6
+	movl	$123, %edi
+	.loc 1 13 1 is_stmt 0 view .LVU7
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 8
+	.loc 1 11 3 view .LVU8
+	jmp	foo
+.LVL2:
+	.cfi_endproc
+.LFE0:
+	.size	bar, .-bar
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0xa0
+	.value	0x5
+	.byte	0x1
+	.byte	0x8
+	.long	.Ldebug_abbrev0
+	.uleb128 0x1
+	.long	.LASF4
+	.byte	0x1d
+	.long	.LASF0
+	.long	.LASF1
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.long	.Ldebug_line0
+	.uleb128 0x2
+	.long	.LASF2
+	.byte	0x1
+	.byte	0x3
+	.byte	0xc
+	.long	0x3a
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x4
+	.string	"foo"
+	.byte	0x1
+	.byte	0x1
+	.byte	0xd
+	.long	0x53
+	.uleb128 0x5
+	.long	0x3a
+	.byte	0
+	.uleb128 0x6
+	.string	"bar"
+	.byte	0x1
+	.byte	0x6
+	.byte	0x1
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.uleb128 0x1
+	.byte	0x9c
+	.uleb128 0x7
+	.long	.LASF3
+	.byte	0x1
+	.byte	0x8
+	.byte	0x7
+	.long	0x3a
+	.long	.LLST0
+	.long	.LVUS0
+	.uleb128 0x8
+	.quad	.LVL1
+	.long	0x41
+	.uleb128 0x9
+	.quad	.LVL2
+	.long	0x41
+	.uleb128 0xa
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7b
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x1f
+	.uleb128 0x1b
+	.uleb128 0x1f
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x7a
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x39
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.uleb128 0x2137
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0x48
+	.byte	0
+	.uleb128 0x7d
+	.uleb128 0x1
+	.uleb128 0x7f
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x48
+	.byte	0x1
+	.uleb128 0x7d
+	.uleb128 0x1
+	.uleb128 0x82
+	.uleb128 0x19
+	.uleb128 0x7f
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0x49
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x7e
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loclists,"",@progbits
+	.long	.Ldebug_loc3-.Ldebug_loc2
+.Ldebug_loc2:
+	.value	0x5
+	.byte	0x8
+	.byte	0
+	.long	0
+.Ldebug_loc0:
+.LVUS0:
+	.uleb128 .LVU6
+	.uleb128 0
+.LLST0:
+	.byte	0x4
+	.uleb128 .LVL1-.Ltext0
+	.uleb128 .LFE0-.Ltext0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7b
+	.byte	0x9f
+	.byte	0
+.Ldebug_loc3:
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.quad	0
+	.quad	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF3:
+	.string	"local"
+.LASF4:
+	.string	"GNU C17 14.2.1 20250210 (Red Hat 14.2.1-8) -mtune=generic -march=x86-64 -g -gdwarf-5 -O2"
+.LASF2:
+	.string	"global"
+	.section	.debug_line_str,"MS",@progbits,1
+.LASF1:
+	.string	"/export/home/hjl/bugs/binutils/pr32809"
+.LASF0:
+	.string	"dwarf5b.c"
+	.ident	"GCC: (GNU) 14.2.1 20250210 (Red Hat 14.2.1-8)"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/pr32809.d b/ld/testsuite/ld-x86-64/pr32809.d
new file mode 100644
index 00000000000..c424ec4cebc
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr32809.d
@@ -0,0 +1,71 @@
+#source: dwarf5a.s
+#source: dwarf4.s
+#source: dwarf5b.s
+#as: --64
+#ld: -r
+#readelf: --wide --debug-dump=loc
+
+Contents of the .*ebug_loc section:
+
+    Offset   Begin            End              Expression
+
+    00000000 v000000000000000 v000000000000000 location view pair
+    00000002 v000000000000000 v000000000000000 location view pair
+
+    00000004 v000000000000000 v000000000000000 views at 00000000 for:
+             0000000000000000 000000000000000a \(DW_OP_reg5 \(rdi\)\)
+    00000017 v000000000000000 v000000000000000 views at 00000002 for:
+             000000000000000a 0000000000000016 \(DW_OP_GNU_entry_value: \(DW_OP_reg5 \(rdi\)\); DW_OP_stack_value\)
+    0000002d <End of list>
+
+    0000003d v000000000000002 v000000000000000 location view pair
+    0000003f v000000000000000 v000000000000001 location view pair
+    00000041 v000000000000001 v000000000000000 location view pair
+
+    00000043 v000000000000002 v000000000000000 views at 0000003d for:
+             0000000000000000 000000000000000a \(DW_OP_reg5 \(rdi\)\)
+    00000056 v000000000000000 v000000000000001 views at 0000003f for:
+             000000000000000a 000000000000000b \(DW_OP_GNU_entry_value: \(DW_OP_reg5 \(rdi\)\); DW_OP_stack_value\)
+    0000006c v000000000000001 v000000000000000 views at 00000041 for:
+             000000000000000b 0000000000000016 \(DW_OP_const1u: 123; DW_OP_stack_value\)
+    00000081 <End of list>
+
+Contents of the .*ebug_loclists section:
+
+Table at Offset 0
+  Length:          0x34
+  DWARF version:   5
+  Address size:    8
+  Segment size:    0
+  Offset entries:  0
+
+    Offset   Begin            End              Expression
+
+    0000000c v000000000000002 v000000000000000 location view pair
+    0000000e v000000000000001 v000000000000001 location view pair
+    00000010 v000000000000001 v000000000000000 location view pair
+
+    00000012 0000000000000000 \(base address\)
+    0000001b v000000000000002 v000000000000000 views at 0000000c for:
+             0000000000000000 000000000000000d \(DW_OP_addr: 0\)
+    00000028 v000000000000001 v000000000000001 views at 0000000e for:
+             000000000000000e 0000000000000018 \(DW_OP_const1u: 123; DW_OP_stack_value\)
+    0000002f v000000000000001 v000000000000000 views at 00000010 for:
+             0000000000000018 000000000000001f \(DW_OP_const2u: 456; DW_OP_stack_value\)
+    00000037 <End of list>
+Table at Offset 0x38
+  Length:          0x12
+  DWARF version:   5
+  Address size:    8
+  Segment size:    0
+  Offset entries:  0
+
+    Offset   Begin            End              Expression
+
+    00000044 v000000000000001 v000000000000000 location view pair
+
+    00000046 v000000000000001 v000000000000000 views at 00000044 for:
+             000000000000002f 000000000000003d \(DW_OP_const1u: 123; DW_OP_stack_value\)
+    0000004d <End of list>
+
+#pass
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 01d6459b5d7..7fe3d224ad2 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -563,6 +563,7 @@ run_dump_test "pr32591-3"
 run_dump_test "pr32591-3-x32"
 run_dump_test "pr32591-4"
 run_dump_test "pr32591-4-x32"
+run_dump_test "pr32809"
 
 if { ![skip_sframe_tests] } {
     run_dump_test "sframe-simple-1"
-- 
2.49.0



More information about the Binutils mailing list