From: Mark Wielaard Date: Mon, 7 Sep 2020 13:03:20 +0000 (+0100) Subject: gas: Output directory and file names in .debug_line_str for DWARF5 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d2a54558074287721ce9e47142f7fa92bda15531;p=binutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 5e82f683715..117f7e00a0c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2020-09-07 Mark Wielaard + + * 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 * dwarf2dbg.c (DWARF2_RNGLISTS_VERSION): New constant. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index ac0ee201f25..e0ea3991b45 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 3dffa63965b..5d76b7bcd14 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