aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2020-09-07 14:03:20 +0100
committerNick Clifton <nickc@redhat.com>2020-09-07 14:03:20 +0100
commitd2a54558074287721ce9e47142f7fa92bda15531 (patch)
treec8bb313bdfd20f3105bc554434624ca7e3562433 /gas
parentbdd3b953e24c3d2bc55e06e30e0ef5e0ff829e3f (diff)
downloadgdb-d2a54558074287721ce9e47142f7fa92bda15531.zip
gdb-d2a54558074287721ce9e47142f7fa92bda15531.tar.gz
gdb-d2a54558074287721ce9e47142f7fa92bda15531.tar.bz2
gas: Output directory and file names in .debug_line_str for DWARF5
* dwarf2dbg.c (add_line_strp): New function. (out_dir_and_file_list): Take line_seg and sizeof_offset as arguments, Use DW_FORM_line_strp for dir and file. Call add_line_strp and set symbol offset for DWARF2_LINE_VERSION 5. (out_debug_line): Call out_dir_and_file_list with line_seg and sizeof_offset. * gas/testsuite/gas/elf/dwarf-5-file0.d: Expect indirect line strings.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/dwarf2dbg.c82
-rw-r--r--gas/testsuite/gas/elf/dwarf-5-file0.d12
3 files changed, 82 insertions, 23 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5e82f68..117f7e0 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,16 @@
2020-09-07 Mark Wielaard <mark@klomp.org>
+ * dwarf2dbg.c (add_line_strp): New function.
+ (out_dir_and_file_list): Take line_seg and sizeof_offset as
+ arguments, Use DW_FORM_line_strp for dir and file. Call
+ add_line_strp and set symbol offset for DWARF2_LINE_VERSION 5.
+ (out_debug_line): Call out_dir_and_file_list with line_seg and
+ sizeof_offset.
+ * gas/testsuite/gas/elf/dwarf-5-file0.d: Expect indirect line
+ strings.
+
+2020-09-07 Mark Wielaard <mark@klomp.org>
+
* dwarf2dbg.c (DWARF2_RNGLISTS_VERSION): New constant.
(out_debug_ranges): Add ranges_sym argument and set it.
(out_debug_rnglists): New function.
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index ac0ee20..e0ea399 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -1972,10 +1972,32 @@ process_entries (segT seg, struct line_entry *e)
}
}
+/* Switch to LINE_STR_SEG and output the given STR. Return the
+ symbol pointing to the new string in the section. */
+
+static symbolS *
+add_line_strp (segT line_str_seg, const char *str)
+{
+ char *cp;
+ size_t size;
+ symbolS *sym;
+
+ subseg_set (line_str_seg, 0);
+
+ sym = symbol_temp_new_now_octets ();
+
+ size = strlen (str) + 1;
+ cp = frag_more (size);
+ memcpy (cp, str, size);
+
+ return sym;
+}
+
+
/* Emit the directory and file tables for .debug_line. */
static void
-out_dir_and_file_list (void)
+out_dir_and_file_list (segT line_seg, int sizeof_offset)
{
size_t size;
const char *dir;
@@ -1984,6 +2006,8 @@ out_dir_and_file_list (void)
bfd_boolean emit_md5 = FALSE;
bfd_boolean emit_timestamps = TRUE;
bfd_boolean emit_filesize = TRUE;
+ segT line_str_seg = NULL;
+ symbolS *line_strp;
/* Output the Directory Table. */
if (DWARF2_LINE_VERSION >= 5)
@@ -1993,9 +2017,9 @@ out_dir_and_file_list (void)
/* Describe the purpose and format of the column. */
out_uleb128 (DW_LNCT_path);
- /* FIXME: it would be better to store these strings in
- the .debug_line_str section and reference them here. */
- out_uleb128 (DW_FORM_string);
+ /* Store these strings in the .debug_line_str section so they
+ can be shared. */
+ out_uleb128 (DW_FORM_line_strp);
/* Now state how many rows there are in the table. We need at
least 1 if there is one or more file names to store the
@@ -2009,6 +2033,12 @@ out_dir_and_file_list (void)
/* Emit directory list. */
if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
{
+ line_str_seg = subseg_new (".debug_line_str", 0);
+ bfd_set_section_flags (line_str_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
+ | SEC_MERGE | SEC_STRINGS);
+ line_str_seg->entsize = 1;
+
/* DWARF5 uses slot zero, but that is only set explicitly
using a .file 0 directive. If that isn't used, but dir
one is used, then use that as main file directory.
@@ -2020,16 +2050,25 @@ out_dir_and_file_list (void)
else
dir = remap_debug_filename (getpwd ());
- size = strlen (dir) + 1;
- cp = frag_more (size);
- memcpy (cp, dir, size);
+ line_strp = add_line_strp (line_str_seg, dir);
+ subseg_set (line_seg, 0);
+ TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
}
for (i = 1; i < dirs_in_use; ++i)
{
dir = remap_debug_filename (dirs[i]);
- size = strlen (dir) + 1;
- cp = frag_more (size);
- memcpy (cp, dir, size);
+ if (DWARF2_LINE_VERSION < 5)
+ {
+ size = strlen (dir) + 1;
+ cp = frag_more (size);
+ memcpy (cp, dir, size);
+ }
+ else
+ {
+ line_strp = add_line_strp (line_str_seg, dir);
+ subseg_set (line_seg, 0);
+ TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
+ }
}
if (DWARF2_LINE_VERSION < 5)
@@ -2066,9 +2105,9 @@ out_dir_and_file_list (void)
out_byte (columns);
/* The format of the file name. */
out_uleb128 (DW_LNCT_path);
- /* FIXME: it would be better to store these strings in
- the .debug_line_str section and reference them here. */
- out_uleb128 (DW_FORM_string);
+ /* Store these strings in the .debug_line_str section so they
+ can be shared. */
+ out_uleb128 (DW_FORM_line_strp);
/* The format of the directory index. */
out_uleb128 (DW_LNCT_directory_index);
@@ -2122,9 +2161,18 @@ out_dir_and_file_list (void)
fullfilename = DWARF2_FILE_NAME (files[i].filename,
files[i].dir ? dirs [files [i].dir] : "");
- size = strlen (fullfilename) + 1;
- cp = frag_more (size);
- memcpy (cp, fullfilename, size);
+ if (DWARF2_LINE_VERSION < 5)
+ {
+ size = strlen (fullfilename) + 1;
+ cp = frag_more (size);
+ memcpy (cp, fullfilename, size);
+ }
+ else
+ {
+ line_strp = add_line_strp (line_str_seg, fullfilename);
+ subseg_set (line_seg, 0);
+ TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
+ }
/* Directory number. */
out_uleb128 (files[i].dir);
@@ -2282,7 +2330,7 @@ out_debug_line (segT line_seg)
matches up to the opcode base value we have been using. */
gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
- out_dir_and_file_list ();
+ out_dir_and_file_list (line_seg, sizeof_offset);
symbol_set_value_now (prologue_end);
diff --git a/gas/testsuite/gas/elf/dwarf-5-file0.d b/gas/testsuite/gas/elf/dwarf-5-file0.d
index 3dffa63..5d76b7b 100644
--- a/gas/testsuite/gas/elf/dwarf-5-file0.d
+++ b/gas/testsuite/gas/elf/dwarf-5-file0.d
@@ -5,15 +5,15 @@
#...
The Directory Table \(offset 0x.*, lines 3, columns 1\):
Entry Name
- 0 master directory
- 1 secondary directory
- 2 /tmp
+ 0 \(indirect line string, offset: 0x.*\): master directory
+ 1 \(indirect line string, offset: 0x.*\): secondary directory
+ 2 \(indirect line string, offset: 0x.*\): /tmp
The File Name Table \(offset 0x.*, lines 3, columns 3\):
Entry Dir MD5 Name
- 0 0 0x00000000000000000000000000000000 master source file
- 1 1 0x00000000000000000000000000000000 secondary source file
- 2 2 0x95828e8bc4f7404dbf7526fb7bd0f192 foo.c
+ 0 0 0x00000000000000000000000000000000 \(indirect line string, offset: 0x.*\): master source file
+ 1 1 0x00000000000000000000000000000000 \(indirect line string, offset: 0x.*\): secondary source file
+ 2 2 0x95828e8bc4f7404dbf7526fb7bd0f192 \(indirect line string, offset: 0x.*\): foo.c
#pass