From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1285) id 58B233857C6F; Tue, 7 Sep 2021 13:43:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 58B233857C6F MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Eric Botcazou To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-3383] Fix PR debug/101947 X-Act-Checkin: gcc X-Git-Author: Eric Botcazou X-Git-Refname: refs/heads/master X-Git-Oldrev: ad9fcb961c0705f56907a728c3748c011a0a8048 X-Git-Newrev: 81e9178fe7f8bae4609619b1195765b14eef35b7 Message-Id: <20210907134353.58B233857C6F@sourceware.org> Date: Tue, 7 Sep 2021 13:43:53 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Sep 2021 13:43:53 -0000 https://gcc.gnu.org/g:81e9178fe7f8bae4609619b1195765b14eef35b7 commit r12-3383-g81e9178fe7f8bae4609619b1195765b14eef35b7 Author: Eric Botcazou Date: Tue Sep 7 15:41:49 2021 +0200 Fix PR debug/101947 This is the recent LTO bootstrap failure with Ada enabled. The compiler now generates DW_OP_deref_type for a unit of the Ada front-end, which means that the offset of base types in the CU must be computed during early DWARF too. gcc/ PR debug/101947 * dwarf2out.c (mark_base_types): New overloaded function. (dwarf2out_early_finish): Invoke it on the COMDAT type list as well as the compilation unit, and call move_marked_base_types afterward. Diff: --- gcc/dwarf2out.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4f100606618..fbad269b566 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -30295,6 +30295,40 @@ mark_base_types (dw_loc_descr_ref loc) } } +/* Stripped-down variant of resolve_addr, mark DW_TAG_base_type nodes + referenced from typed stack ops and count how often they are used. */ + +static void +mark_base_types (dw_die_ref die) +{ + dw_die_ref c; + dw_attr_node *a; + dw_loc_list_ref *curr; + unsigned ix; + + FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a) + switch (AT_class (a)) + { + case dw_val_class_loc_list: + curr = AT_loc_list_ptr (a); + while (*curr) + { + mark_base_types ((*curr)->expr); + curr = &(*curr)->dw_loc_next; + } + break; + + case dw_val_class_loc: + mark_base_types (AT_loc (a)); + break; + + default: + break; + } + + FOR_EACH_CHILD (die, c, mark_base_types (c)); +} + /* Comparison function for sorting marked base types. */ static int @@ -32697,6 +32731,7 @@ ctf_debug_do_cu (dw_die_ref die) static void dwarf2out_early_finish (const char *filename) { + comdat_type_node *ctnode; set_early_dwarf s; char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES]; @@ -32776,8 +32811,7 @@ dwarf2out_early_finish (const char *filename) /* For each new comdat type unit, copy declarations for incomplete types to make the new unit self-contained (i.e., no direct references to the main compile unit). */ - for (comdat_type_node *ctnode = comdat_type_list; - ctnode != NULL; ctnode = ctnode->next) + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) copy_decls_for_unworthy_types (ctnode->root_die); copy_decls_for_unworthy_types (comp_unit_die ()); @@ -32792,8 +32826,7 @@ dwarf2out_early_finish (const char *filename) note_variable_value (comp_unit_die ()); for (limbo_die_node *node = cu_die_list; node; node = node->next) note_variable_value (node->die); - for (comdat_type_node *ctnode = comdat_type_list; ctnode != NULL; - ctnode = ctnode->next) + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) note_variable_value (ctnode->root_die); for (limbo_die_node *node = limbo_die_list; node; node = node->next) note_variable_value (node->die); @@ -32845,13 +32878,17 @@ dwarf2out_early_finish (const char *filename) location related output removed and some LTO specific changes. Some refactoring might make both smaller and easier to match up. */ + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) + mark_base_types (ctnode->root_die); + mark_base_types (comp_unit_die ()); + move_marked_base_types (); + /* Traverse the DIE's and add sibling attributes to those DIE's that have children. */ add_sibling_attributes (comp_unit_die ()); for (limbo_die_node *node = limbo_die_list; node; node = node->next) add_sibling_attributes (node->die); - for (comdat_type_node *ctnode = comdat_type_list; - ctnode != NULL; ctnode = ctnode->next) + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) add_sibling_attributes (ctnode->root_die); /* AIX Assembler inserts the length, so adjust the reference to match the @@ -32881,8 +32918,7 @@ dwarf2out_early_finish (const char *filename) output_comp_unit (node->die, 0, NULL); hash_table comdat_type_table (100); - for (comdat_type_node *ctnode = comdat_type_list; - ctnode != NULL; ctnode = ctnode->next) + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) { comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);