gas: Use the directory name in .file 0
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 9 Sep 2021 16:14:42 +0000 (09:14 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 10 Sep 2021 01:56:44 +0000 (18:56 -0700)
DWARF5 allows .file 0 to take an optional directory name.  Set the entry
0 of the directory table to the directory name in .file 0.

PR gas/28266
* dwarf2dbg.c (get_directory_table_entry): Add an argument for
the directory name in .file 0 and use it, instead of PWD.
(allocate_filenum): Pass NULL to get_directory_table_entry.
(allocate_filename_to_slot): Pass the incoming dirname to
get_directory_table_entry.
* testsuite/gas/elf/dwarf-5-file0-2.d: New file.
* testsuite/gas/elf/dwarf-5-file0-2.s: Likewise.
* testsuite/gas/elf/elf.exp: Run dwarf-5-file0-2.

gas/dwarf2dbg.c
gas/testsuite/gas/elf/dwarf-5-file0-2.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf-5-file0-2.s [new file with mode: 0644]
gas/testsuite/gas/elf/elf.exp

index 8f5248534ad68019dee87d230a33589d5ce917eb..9e3437b894829714fefd557d405bb4e9580787fd 100644 (file)
@@ -592,6 +592,7 @@ get_basename (const char * pathname)
 
 static unsigned int
 get_directory_table_entry (const char *dirname,
+                          const char *file0_dirname,
                           size_t dirlen,
                           bool can_use_zero)
 {
@@ -621,7 +622,7 @@ get_directory_table_entry (const char *dirname,
     {
       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)
            {
@@ -630,7 +631,8 @@ get_directory_table_entry (const char *dirname,
                 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
@@ -726,7 +728,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.  */
@@ -766,6 +768,7 @@ allocate_filename_to_slot (const char *dirname,
   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.  */
@@ -856,7 +859,8 @@ allocate_filename_to_slot (const char *dirname,
       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 --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 (file)
index 0000000..4b3ed29
--- /dev/null
@@ -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 (file)
index 0000000..135a03b
--- /dev/null
@@ -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
index 18bc1db8c703a76031aa4028765b613b5f3414fe..2485008d56938d59925479c2411adce0694ef74b 100644 (file)
@@ -297,6 +297,7 @@ if { [is_elf_format] } then {
     run_dump_test "dwarf2-19" $dump_opts
     run_dump_test "dwarf2-20" $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