DWARF: Add header for .debug_str_offsets table for dwarf_version 5.

DWARF5 defines a small header for .debug_str_offsets.  Since we only use
it for split dwarf .dwo files we don't need to keep track of the actual
index offset in an attribute.

gcc/ChangeLog

	* dwarf2out.c (count_index_strings): New function.
	(output_indirect_strings): Call count_index_strings and generate
	header for dwarf_version >= 5.

From-SVN: r260298
This commit is contained in:
Mark Wielaard 2018-05-16 18:20:08 +00:00 committed by Mark Wielaard
parent c0134358c5
commit bb14f4c6da
2 changed files with 46 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2018-05-16 Mark Wielaard <mark@klomp.org>
* dwarf2out.c (count_index_strings): New function.
(output_indirect_strings): Call count_index_strings and generate
header for dwarf_version >= 5.
2018-05-16 Mark Wielaard <mark@klomp.org>
* dwarf2out.c (dwarf_FORM): New function.

View File

@ -28772,6 +28772,19 @@ output_index_string (indirect_string_node **h, unsigned int *cur_idx)
return 1;
}
/* A helper function for output_indirect_strings. Counts the number
of index strings offsets. Must match the logic of the functions
output_index_string[_offsets] above. */
int
count_index_strings (indirect_string_node **h, unsigned int *last_idx)
{
struct indirect_string_node *node = *h;
if (node->form == dwarf_FORM (DW_FORM_strx) && node->refcount > 0)
*last_idx += 1;
return 1;
}
/* A helper function for dwarf2out_finish called through
htab_traverse. Emit one queued .debug_str string. */
@ -28809,6 +28822,33 @@ output_indirect_strings (void)
output_indirect_string> (DW_FORM_strp);
switch_to_section (debug_str_offsets_section);
/* For DWARF5 the .debug_str_offsets[.dwo] section needs a unit
header. Note that we don't need to generate a label to the
actual index table following the header here, because this is
for the split dwarf case only. In an .dwo file there is only
one string offsets table (and one debug info section). But
if we would start using string offset tables for the main (or
skeleton) unit, then we have to add a DW_AT_str_offsets_base
pointing to the actual index after the header. Split dwarf
units will never have a string offsets base attribute. When
a split unit is moved into a .dwp file the string offsets can
be found through the .debug_cu_index section table. */
if (dwarf_version >= 5)
{
unsigned int last_idx = 0;
unsigned long str_offsets_length;
debug_str_hash->traverse_noresize
<unsigned int *, count_index_strings> (&last_idx);
str_offsets_length = last_idx * DWARF_OFFSET_SIZE + 4;
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
dw2_asm_output_data (4, 0xffffffff,
"Escape value for 64-bit DWARF extension");
dw2_asm_output_data (DWARF_OFFSET_SIZE, str_offsets_length,
"Length of string offsets unit");
dw2_asm_output_data (2, 5, "DWARF string offsets version");
dw2_asm_output_data (2, 0, "Header zero padding");
}
debug_str_hash->traverse_noresize
<unsigned int *, output_index_string_offset> (&offset);
switch_to_section (debug_str_dwo_section);