diff options
author | Mark Wielaard <mark@klomp.org> | 2018-05-16 18:20:08 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2018-05-16 18:20:08 +0000 |
commit | bb14f4c6da3da116c7b88c482daadaf3522870e8 (patch) | |
tree | 3bb789d93570fae93640b2818905fbb60acf8e72 | |
parent | c0134358c5a8a9a92b10d08f2c43f5876d9a0d07 (diff) | |
download | gcc-bb14f4c6da3da116c7b88c482daadaf3522870e8.zip gcc-bb14f4c6da3da116c7b88c482daadaf3522870e8.tar.gz gcc-bb14f4c6da3da116c7b88c482daadaf3522870e8.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 40 |
2 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b63bfc0..cf9cbcc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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. (set_indirect_string): Use dwarf_FORM. (reset_indirect_string): Likewise. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 1b15930..c05bfe4 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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); |