diff options
author | Mark Wielaard <mark@klomp.org> | 2020-09-07 14:03:20 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-09-07 14:03:20 +0100 |
commit | d2a54558074287721ce9e47142f7fa92bda15531 (patch) | |
tree | c8bb313bdfd20f3105bc554434624ca7e3562433 /gas | |
parent | bdd3b953e24c3d2bc55e06e30e0ef5e0ff829e3f (diff) | |
download | gdb-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/ChangeLog | 11 | ||||
-rw-r--r-- | gas/dwarf2dbg.c | 82 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/dwarf-5-file0.d | 12 |
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 |