mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 12:23:31 +08:00
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.
This commit is contained in:

committed by
Nick Clifton

parent
bdd3b953e2
commit
d2a5455807
@ -1,3 +1,14 @@
|
|||||||
|
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>
|
2020-09-07 Mark Wielaard <mark@klomp.org>
|
||||||
|
|
||||||
* dwarf2dbg.c (DWARF2_RNGLISTS_VERSION): New constant.
|
* dwarf2dbg.c (DWARF2_RNGLISTS_VERSION): New constant.
|
||||||
|
@ -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. */
|
/* Emit the directory and file tables for .debug_line. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
out_dir_and_file_list (void)
|
out_dir_and_file_list (segT line_seg, int sizeof_offset)
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
const char *dir;
|
const char *dir;
|
||||||
@ -1984,6 +2006,8 @@ out_dir_and_file_list (void)
|
|||||||
bfd_boolean emit_md5 = FALSE;
|
bfd_boolean emit_md5 = FALSE;
|
||||||
bfd_boolean emit_timestamps = TRUE;
|
bfd_boolean emit_timestamps = TRUE;
|
||||||
bfd_boolean emit_filesize = TRUE;
|
bfd_boolean emit_filesize = TRUE;
|
||||||
|
segT line_str_seg = NULL;
|
||||||
|
symbolS *line_strp;
|
||||||
|
|
||||||
/* Output the Directory Table. */
|
/* Output the Directory Table. */
|
||||||
if (DWARF2_LINE_VERSION >= 5)
|
if (DWARF2_LINE_VERSION >= 5)
|
||||||
@ -1993,9 +2017,9 @@ out_dir_and_file_list (void)
|
|||||||
|
|
||||||
/* Describe the purpose and format of the column. */
|
/* Describe the purpose and format of the column. */
|
||||||
out_uleb128 (DW_LNCT_path);
|
out_uleb128 (DW_LNCT_path);
|
||||||
/* FIXME: it would be better to store these strings in
|
/* Store these strings in the .debug_line_str section so they
|
||||||
the .debug_line_str section and reference them here. */
|
can be shared. */
|
||||||
out_uleb128 (DW_FORM_string);
|
out_uleb128 (DW_FORM_line_strp);
|
||||||
|
|
||||||
/* Now state how many rows there are in the table. We need at
|
/* 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
|
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. */
|
/* Emit directory list. */
|
||||||
if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
|
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
|
/* DWARF5 uses slot zero, but that is only set explicitly
|
||||||
using a .file 0 directive. If that isn't used, but dir
|
using a .file 0 directive. If that isn't used, but dir
|
||||||
one is used, then use that as main file directory.
|
one is used, then use that as main file directory.
|
||||||
@ -2020,17 +2050,26 @@ out_dir_and_file_list (void)
|
|||||||
else
|
else
|
||||||
dir = remap_debug_filename (getpwd ());
|
dir = remap_debug_filename (getpwd ());
|
||||||
|
|
||||||
size = strlen (dir) + 1;
|
line_strp = add_line_strp (line_str_seg, dir);
|
||||||
cp = frag_more (size);
|
subseg_set (line_seg, 0);
|
||||||
memcpy (cp, dir, size);
|
TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
|
||||||
}
|
}
|
||||||
for (i = 1; i < dirs_in_use; ++i)
|
for (i = 1; i < dirs_in_use; ++i)
|
||||||
{
|
{
|
||||||
dir = remap_debug_filename (dirs[i]);
|
dir = remap_debug_filename (dirs[i]);
|
||||||
|
if (DWARF2_LINE_VERSION < 5)
|
||||||
|
{
|
||||||
size = strlen (dir) + 1;
|
size = strlen (dir) + 1;
|
||||||
cp = frag_more (size);
|
cp = frag_more (size);
|
||||||
memcpy (cp, dir, 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)
|
if (DWARF2_LINE_VERSION < 5)
|
||||||
/* Terminate it. */
|
/* Terminate it. */
|
||||||
@ -2066,9 +2105,9 @@ out_dir_and_file_list (void)
|
|||||||
out_byte (columns);
|
out_byte (columns);
|
||||||
/* The format of the file name. */
|
/* The format of the file name. */
|
||||||
out_uleb128 (DW_LNCT_path);
|
out_uleb128 (DW_LNCT_path);
|
||||||
/* FIXME: it would be better to store these strings in
|
/* Store these strings in the .debug_line_str section so they
|
||||||
the .debug_line_str section and reference them here. */
|
can be shared. */
|
||||||
out_uleb128 (DW_FORM_string);
|
out_uleb128 (DW_FORM_line_strp);
|
||||||
|
|
||||||
/* The format of the directory index. */
|
/* The format of the directory index. */
|
||||||
out_uleb128 (DW_LNCT_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,
|
fullfilename = DWARF2_FILE_NAME (files[i].filename,
|
||||||
files[i].dir ? dirs [files [i].dir] : "");
|
files[i].dir ? dirs [files [i].dir] : "");
|
||||||
|
if (DWARF2_LINE_VERSION < 5)
|
||||||
|
{
|
||||||
size = strlen (fullfilename) + 1;
|
size = strlen (fullfilename) + 1;
|
||||||
cp = frag_more (size);
|
cp = frag_more (size);
|
||||||
memcpy (cp, fullfilename, 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. */
|
/* Directory number. */
|
||||||
out_uleb128 (files[i].dir);
|
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. */
|
matches up to the opcode base value we have been using. */
|
||||||
gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
|
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);
|
symbol_set_value_now (prologue_end);
|
||||||
|
|
||||||
|
@ -5,15 +5,15 @@
|
|||||||
#...
|
#...
|
||||||
The Directory Table \(offset 0x.*, lines 3, columns 1\):
|
The Directory Table \(offset 0x.*, lines 3, columns 1\):
|
||||||
Entry Name
|
Entry Name
|
||||||
0 master directory
|
0 \(indirect line string, offset: 0x.*\): master directory
|
||||||
1 secondary directory
|
1 \(indirect line string, offset: 0x.*\): secondary directory
|
||||||
2 /tmp
|
2 \(indirect line string, offset: 0x.*\): /tmp
|
||||||
|
|
||||||
The File Name Table \(offset 0x.*, lines 3, columns 3\):
|
The File Name Table \(offset 0x.*, lines 3, columns 3\):
|
||||||
Entry Dir MD5 Name
|
Entry Dir MD5 Name
|
||||||
0 0 0x00000000000000000000000000000000 master source file
|
0 0 0x00000000000000000000000000000000 \(indirect line string, offset: 0x.*\): master source file
|
||||||
1 1 0x00000000000000000000000000000000 secondary source file
|
1 1 0x00000000000000000000000000000000 \(indirect line string, offset: 0x.*\): secondary source file
|
||||||
2 2 0x95828e8bc4f7404dbf7526fb7bd0f192 foo.c
|
2 2 0x95828e8bc4f7404dbf7526fb7bd0f192 \(indirect line string, offset: 0x.*\): foo.c
|
||||||
#pass
|
#pass
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user