This patch is for the google/gcc-4_7 branch. Compute a dwo_id and write the DW_AT_GNU_dwo_id attribute to both the skeleton compile unit DIE and the DWO compile unit DIE.
Tested: passed regression tests. 2012-07-25 Cary Coutant <ccout...@google.com> * gcc/dwarf2out.c (dwo_id_placeholder): Delete. (output_skeleton_debug_sections): Don't write dwo_id here. (dwarf2out_finish): Compute dwo_id and write it to both comp units. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 189868) +++ gcc/dwarf2out.c (working copy) @@ -9132,10 +9132,6 @@ get_skeleton_type_unit (void) return skeleton_type_unit; } -/* The splitter will fill in this value. */ - -unsigned char dwo_id_placeholder[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - /* Output skeleton debug sections that point to the dwo file. */ static void @@ -9148,9 +9144,6 @@ output_skeleton_debug_sections (dw_die_r /* Add attributes common to skeleton compile_units and type_units. */ add_top_level_skeleton_die_attrs (comp_unit); - /* The dwo_id is only for compile_units. */ - add_AT_data8 (comp_unit, DW_AT_GNU_dwo_id, dwo_id_placeholder); - switch_to_section (debug_skeleton_info_section); ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_info_section_label); @@ -23684,8 +23677,24 @@ dwarf2out_finish (const char *filename) if (dwarf_split_debug_info) { - /* Add a place-holder for the dwo_id to the comp-unit die. */ - add_AT_data8 (comp_unit_die (), DW_AT_GNU_dwo_id, dwo_id_placeholder); + int mark; + unsigned char checksum[16]; + struct md5_ctx ctx; + + /* Compute a checksum of the comp_unit to use as the dwo_id. */ + md5_init_ctx (&ctx); + mark = 0; + die_checksum (comp_unit_die (), &ctx, &mark); + unmark_all_dies (comp_unit_die ()); + md5_finish_ctx (&ctx, checksum); + + /* Use the first 8 bytes of the checksum as the dwo_id, + and add it to both comp-unit DIEs. */ + add_AT_data8 (main_comp_unit_die, DW_AT_GNU_dwo_id, checksum); + add_AT_data8 (comp_unit_die (), DW_AT_GNU_dwo_id, checksum); + + /* Add the base offset of the ranges table to the skeleton + comp-unit DIE. */ if (ranges_table_in_use) add_AT_lineptr (main_comp_unit_die, DW_AT_GNU_ranges_base, ranges_section_label); -- This patch is available for review at http://codereview.appspot.com/6442047