diff options
author | Mark Wielaard <mark@klomp.org> | 2019-07-03 13:08:01 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2019-07-03 13:08:01 +0000 |
commit | 6c47a87b661598cfba79925a6fdd1ebf7737bbdc (patch) | |
tree | e36f5f063bdecf137efda15a7a9e9412f796c7a3 /gcc/dwarf2out.c | |
parent | cc49641a7132b66a8fdf26038aa1343e60473eaa (diff) | |
download | gcc-6c47a87b661598cfba79925a6fdd1ebf7737bbdc.zip gcc-6c47a87b661598cfba79925a6fdd1ebf7737bbdc.tar.gz gcc-6c47a87b661598cfba79925a6fdd1ebf7737bbdc.tar.bz2 |
PR debug/90981 Empty .debug_addr crashes -gdwarf-5 -gsplit-dwarf
Even if there was no, or an empty address list we would try to generate
a header for the .debug_addr section with -gdwarf-5 and -gsplit-dwarf.
The skeleton DIE would also get a (dangling) DW_AT_addr_base in that case.
PR debug/90981
* dwarf2out.c (add_top_level_skeleton_die_attrs): Only add
DW_AT_addr_base if there is actually a .debug_addr section with
addresses.
(output_addr_table): Add DWARF5 table header generation here after
checking there are actually any addresses from...
(dwarf2out_finish): ...here.
* testsuite/g++.dg/pr90981.C: New test.
From-SVN: r273008
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 6e82802..2c4cc6c 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11196,7 +11196,8 @@ add_top_level_skeleton_die_attrs (dw_die_ref die) if (comp_dir != NULL) add_skeleton_AT_string (die, DW_AT_comp_dir, comp_dir); add_AT_pubnames (die); - add_AT_lineptr (die, dwarf_AT (DW_AT_addr_base), debug_addr_section_label); + if (addr_index_table != NULL && addr_index_table->size () > 0) + add_AT_lineptr (die, dwarf_AT (DW_AT_addr_base), debug_addr_section_label); } /* Output skeleton debug sections that point to the dwo file. */ @@ -29109,6 +29110,30 @@ output_addr_table (void) return; switch_to_section (debug_addr_section); + /* GNU DebugFission https://gcc.gnu.org/wiki/DebugFission + which GCC uses to implement -gsplit-dwarf as DWARF GNU extension + before DWARF5, didn't have a header for .debug_addr units. + DWARF5 specifies a small header when address tables are used. */ + if (dwarf_version >= 5) + { + unsigned int last_idx = 0; + unsigned long addrs_length; + + addr_index_table->traverse_noresize + <unsigned int *, count_index_addrs> (&last_idx); + addrs_length = last_idx * DWARF2_ADDR_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, addrs_length, + "Length of Address Unit"); + dw2_asm_output_data (2, 5, "DWARF addr version"); + dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address"); + dw2_asm_output_data (1, 0, "Size of Segment Descriptor"); + } + ASM_OUTPUT_LABEL (asm_out_file, debug_addr_section_label); + addr_index_table ->traverse_noresize<unsigned int *, output_addr_table_entry> (&index); } @@ -31631,30 +31656,6 @@ dwarf2out_finish (const char *filename) ranges_section_label); } - switch_to_section (debug_addr_section); - /* GNU DebugFission https://gcc.gnu.org/wiki/DebugFission - which GCC uses to implement -gsplit-dwarf as DWARF GNU extension - before DWARF5, didn't have a header for .debug_addr units. - DWARF5 specifies a small header when address tables are used. */ - if (dwarf_version >= 5) - { - unsigned int last_idx = 0; - unsigned long addrs_length; - - addr_index_table->traverse_noresize - <unsigned int *, count_index_addrs> (&last_idx); - addrs_length = last_idx * DWARF2_ADDR_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, addrs_length, - "Length of Address Unit"); - dw2_asm_output_data (2, 5, "DWARF addr version"); - dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address"); - dw2_asm_output_data (1, 0, "Size of Segment Descriptor"); - } - ASM_OUTPUT_LABEL (asm_out_file, debug_addr_section_label); output_addr_table (); } |