diff --git a/gas/testsuite/gas/elf/dwarf-5-file0-2.d b/gas/testsuite/gas/elf/dwarf-5-file0-2.d new file mode 100644 index 00000000000..4b3ed29f4c9 --- /dev/null +++ b/gas/testsuite/gas/elf/dwarf-5-file0-2.d @@ -0,0 +1,15 @@ +#as: --gdwarf-5 +#name: DWARF5 .file 0 dir file +#readelf: -wl + +#... + The Directory Table \(offset 0x.*, lines 1, columns 1\): + Entry Name +#... + 0 \(indirect line string, offset: 0x.*\): /example + + The File Name Table \(offset 0x.*, lines 2, columns 2\): + Entry Dir Name + 0 0 \(indirect line string, offset: 0x.*\): test.c + 1 0 \(indirect line string, offset: 0x.*\): test.c +#pass diff --git a/gas/testsuite/gas/elf/dwarf-5-file0-2.s b/gas/testsuite/gas/elf/dwarf-5-file0-2.s new file mode 100644 index 00000000000..135a03bf493 --- /dev/null +++ b/gas/testsuite/gas/elf/dwarf-5-file0-2.s @@ -0,0 +1,111 @@ + .file "test.c" + .text +.Ltext0: + .file 0 "/example" "test.c" + .globl x + .section .bss + .balign 4 + .type x, @object + .size x, 4 +x: + .zero 4 + .text +.Letext0: + .file 1 "test.c" + .section .debug_info,"",%progbits +.Ldebug_info0: + .long 0x32 + .2byte 0x5 + .byte 0x1 + .byte 0x4 + .long .Ldebug_abbrev0 + .uleb128 0x1 + .long .LASF2 + .byte 0x1d + .long .LASF0 + .long .LASF1 + .long .Ldebug_line0 + .uleb128 0x2 + .string "x" + .byte 0x1 + .byte 0x1 + .byte 0x5 + .long 0x2e + .uleb128 0x5 + .byte 0x3 + .long x + .uleb128 0x3 + .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 0x1f + .uleb128 0x1b + .uleb128 0x1f + .uleb128 0x10 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .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 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",%progbits + .long 0x14 + .2byte 0x2 + .long .Ldebug_info0 + .byte 0x4 + .byte 0 + .2byte 0 + .2byte 0 + .long 0 + .long 0 + .section .debug_line,"",%progbits +.Ldebug_line0: + .section .debug_str,"MS",%progbits,1 +.LASF2: + .string "GNU C17 11.2.1 -g" + .section .debug_line_str,"MS",%progbits,1 +.LASF1: + .string "/example" +.LASF0: + .string "test.c" + .ident "GCC: (GNU) 11.2.1" + .section .note.GNU-stack,"",%progbits diff --git a/gas/testsuite/gas/elf/dwarf-5-file0-2.s b/gas/testsuite/gas/elf/dwarf-5-file0-2.s index 135a03bf493..bab4a16b56b 100644 --- a/gas/testsuite/gas/elf/dwarf-5-file0-2.s +++ b/gas/testsuite/gas/elf/dwarf-5-file0-2.s @@ -5,7 +5,7 @@ .globl x .section .bss .balign 4 - .type x, @object + .type x, %object .size x, 4 x: .zero 4 @@ -14,30 +14,30 @@ x: .file 1 "test.c" .section .debug_info,"",%progbits .Ldebug_info0: - .long 0x32 + .4byte 0x32 .2byte 0x5 .byte 0x1 .byte 0x4 - .long .Ldebug_abbrev0 + .4byte .Ldebug_abbrev0 .uleb128 0x1 - .long .LASF2 + .4byte .LASF2 .byte 0x1d - .long .LASF0 - .long .LASF1 - .long .Ldebug_line0 + .4byte .LASF0 + .4byte .LASF1 + .4byte .Ldebug_line0 .uleb128 0x2 - .string "x" + .asciz "x" .byte 0x1 .byte 0x1 .byte 0x5 - .long 0x2e + .4byte 0x2e .uleb128 0x5 .byte 0x3 - .long x + .4byte x .uleb128 0x3 .byte 0x4 .byte 0x5 - .string "int" + .asciz "int" .byte 0 .section .debug_abbrev,"",%progbits .Ldebug_abbrev0: @@ -88,24 +88,24 @@ x: .byte 0 .byte 0 .section .debug_aranges,"",%progbits - .long 0x14 + .4byte 0x14 .2byte 0x2 - .long .Ldebug_info0 + .4byte .Ldebug_info0 .byte 0x4 .byte 0 .2byte 0 .2byte 0 - .long 0 - .long 0 + .4byte 0 + .4byte 0 .section .debug_line,"",%progbits .Ldebug_line0: .section .debug_str,"MS",%progbits,1 .LASF2: - .string "GNU C17 11.2.1 -g" + .asciz "GNU C17 11.2.1 -g" .section .debug_line_str,"MS",%progbits,1 .LASF1: - .string "/example" + .asciz "/example" .LASF0: - .string "test.c" + .asciz "test.c" .ident "GCC: (GNU) 11.2.1" .section .note.GNU-stack,"",%progbits diff -rup binutils.orig/gas/dwarf2dbg.c binutils-2.35.2/gas/dwarf2dbg.c --- binutils.orig/gas/dwarf2dbg.c 2021-11-08 14:59:19.759524743 +0000 +++ binutils-2.35.2/gas/dwarf2dbg.c 2021-11-08 15:00:55.179909708 +0000 @@ -588,6 +588,7 @@ get_basename (const char * pathname) static unsigned int get_directory_table_entry (const char * dirname, + const char * file0_dirname, size_t dirlen, bfd_boolean can_use_zero) { @@ -617,7 +618,7 @@ get_directory_table_entry (const char * { if (dirs == NULL || dirs[0] == NULL) { - const char * pwd = getpwd (); + const char * pwd = file0_dirname ? file0_dirname : getpwd (); if (dwarf_level >= 5 && strcmp (dirname, pwd) != 0) { @@ -626,7 +627,7 @@ get_directory_table_entry (const char * directory). Since we are about to create a directory entry that is not the same, allocate the current directory first. FIXME: Alternatively we could generate an error message here. */ - (void) get_directory_table_entry (pwd, strlen (pwd), TRUE); + (void) get_directory_table_entry (pwd, NULL, strlen (pwd), TRUE); d = 1; } else @@ -722,7 +723,7 @@ allocate_filenum (const char * pathname) file = get_basename (pathname); dir_len = file - pathname; - dir = get_directory_table_entry (pathname, dir_len, FALSE); + dir = get_directory_table_entry (pathname, NULL, dir_len, FALSE); /* Do not use slot-0. That is specifically reserved for use by the '.file 0 "name"' directive. */ @@ -762,6 +763,7 @@ allocate_filename_to_slot (const char * const char *file; size_t dirlen; unsigned int i, d; + const char *file0_dirname = dirname; /* Short circuit the common case of adding the same pathname as last time. */ @@ -836,7 +838,8 @@ allocate_filename_to_slot (const char * file = filename; } - d = get_directory_table_entry (dirname, dirlen, num == 0); + d = get_directory_table_entry (dirname, file0_dirname, dirlen, + num == 0); i = num; if (! assign_file_to_slot (i, file, d)) diff -rup binutils.orig/gas/testsuite/gas/elf/elf.exp binutils-2.35.2/gas/testsuite/gas/elf/elf.exp --- binutils.orig/gas/testsuite/gas/elf/elf.exp 2021-11-08 14:59:19.856524118 +0000 +++ binutils-2.35.2/gas/testsuite/gas/elf/elf.exp 2021-11-08 14:59:36.225418609 +0000 @@ -274,6 +274,7 @@ if { [is_elf_format] } then { run_dump_test "dwarf2-18" $dump_opts run_dump_test "dwarf2-19" $dump_opts run_dump_test "dwarf-5-file0" $dump_opts + run_dump_test "dwarf-5-file0-2" $dump_opts run_dump_test "dwarf-5-dir0" $dump_opts run_dump_test "dwarf-4-cu" $dump_opts run_dump_test "dwarf-5-cu" $dump_opts