From ab72d377280d1c1bb77611de60d1fb6df785e998 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 16 Oct 1996 21:45:08 +0000 Subject: [PATCH] scoping From-SVN: r12972 --- gcc/dwarf2out.c | 124 +++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 64 deletions(-) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 1558adec1f56..582e20989df0 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4970,20 +4970,20 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die) if (is_const_type) { - mod_type_die = new_die (DW_TAG_const_type, context_die); + mod_type_die = new_die (DW_TAG_const_type, comp_unit_die); sub_die = modified_type_die (build_type_variant (type, 0, is_volatile_type), 0, is_volatile_type, context_die); } else if (is_volatile_type) { - mod_type_die = new_die (DW_TAG_volatile_type, context_die); + mod_type_die = new_die (DW_TAG_volatile_type, comp_unit_die); sub_die = modified_type_die (TYPE_MAIN_VARIANT (type), 0, 0, context_die); } else if (code == POINTER_TYPE) { - mod_type_die = new_die (DW_TAG_pointer_type, context_die); + mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die); add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); #if 0 add_AT_unsigned (mod_type_die, DW_AT_address_class, 0); @@ -4996,7 +4996,7 @@ modified_type_die (type, is_const_type, is_volatile_type, context_die) } else if (code == REFERENCE_TYPE) { - mod_type_die = new_die (DW_TAG_reference_type, context_die); + mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die); add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); #if 0 add_AT_unsigned (mod_type_die, DW_AT_address_class, 0); @@ -6080,8 +6080,8 @@ push_decl_scope (scope) /* Return the DIE for the scope the immediately contains this declaration. */ static dw_die_ref -scope_die_for_type (type, context_die) - register tree type; +scope_die_for (t, context_die) + register tree t; register dw_die_ref context_die; { register dw_die_ref scope_die = NULL; @@ -6090,24 +6090,33 @@ scope_die_for_type (type, context_die) /* Walk back up the declaration tree looking for a place to define this type. */ - containing_scope = TYPE_CONTEXT (type); + if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') + containing_scope = TYPE_CONTEXT (t); + else if (TREE_CODE (t) == FUNCTION_DECL && DECL_VIRTUAL_P (t)) + containing_scope = decl_class_context (t); + else + containing_scope = DECL_CONTEXT (t); + if (containing_scope == NULL) { scope_die = comp_unit_die; } else { - for (i = decl_scope_depth - 1, scope_die = context_die; - i >= 0 - && scope_die != NULL - && decl_scope_table[i] != containing_scope; - --i, scope_die = scope_die->die_parent) + for (i = decl_scope_depth, scope_die = context_die; + i > 0 && decl_scope_table[i - 1] != containing_scope; + scope_die = scope_die->die_parent) { - /* nothing */ ; + if (scope_die->die_tag == DW_TAG_lexical_block) + /* nothing */ ; + else + --i; } - if (scope_die == NULL) + if (i == 0) { - scope_die = context_die; + assert (scope_die == comp_unit_die); + assert (TREE_CODE_CLASS (TREE_CODE (containing_scope)) == 't'); + assert (TREE_ASM_WRITTEN (containing_scope)); } } return scope_die; @@ -6133,7 +6142,6 @@ add_type_attribute (object_die, type, decl_const, decl_volatile, context_die) register dw_die_ref context_die; { register enum tree_code code = TREE_CODE (type); - register dw_die_ref scope_die = NULL; register dw_die_ref type_die = NULL; if (code == ERROR_MARK) @@ -6149,11 +6157,10 @@ add_type_attribute (object_die, type, decl_const, decl_volatile, context_die) return; } - scope_die = scope_die_for_type (type, context_die); type_die = modified_type_die (type, decl_const || TYPE_READONLY (type), decl_volatile || TYPE_VOLATILE (type), - scope_die); + context_die); if (type_die != NULL) { add_AT_die_ref (object_die, DW_AT_type, type_die); @@ -6236,14 +6243,10 @@ gen_array_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref scope_die = scope_die_for_type (type, context_die); - register dw_die_ref array_die = lookup_type_die (type); + register dw_die_ref scope_die = scope_die_for (type, context_die); + register dw_die_ref array_die = new_die (DW_TAG_array_type, scope_die); register tree element_type; - if (array_die) - return; - - array_die = new_die (DW_TAG_array_type, scope_die); #if 0 /* We default the array ordering. SDB will probably do the right things even if DW_AT_ordering is not present. It's not even @@ -6281,10 +6284,8 @@ gen_set_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref type_die = lookup_type_die (type); - if (type_die) - return; - type_die = new_die (DW_TAG_set_type, scope_die_for_type (type, context_die)); + register dw_die_ref type_die = new_die + (DW_TAG_set_type, scope_die_for (type, context_die)); equate_type_number_to_die (type, type_die); add_type_attribute (type_die, TREE_TYPE (type), 0, 0, context_die); } @@ -6324,7 +6325,7 @@ gen_inlined_enumeration_type_die (type, context_die) { register dw_die_ref type_die; type_die = new_die (DW_TAG_enumeration_type, - scope_die_for_type (type, context_die)); + scope_die_for (type, context_die)); assert (TREE_ASM_WRITTEN (type)); add_abstract_origin_attribute (type_die, type); } @@ -6337,7 +6338,7 @@ gen_inlined_structure_type_die (type, context_die) { register dw_die_ref type_die; type_die = new_die (DW_TAG_structure_type, - scope_die_for_type (type, context_die)); + scope_die_for (type, context_die)); assert (TREE_ASM_WRITTEN (type)); add_abstract_origin_attribute (type_die, type); } @@ -6350,7 +6351,7 @@ gen_inlined_union_type_die (type, context_die) { register dw_die_ref type_die; type_die = new_die (DW_TAG_union_type, - scope_die_for_type (type, context_die)); + scope_die_for (type, context_die)); assert (TREE_ASM_WRITTEN (type)); add_abstract_origin_attribute (type_die, type); } @@ -6371,7 +6372,7 @@ gen_enumeration_type_die (type, is_complete, context_die) if (type_die == NULL) { type_die = new_die (DW_TAG_enumeration_type, - scope_die_for_type (type, context_die)); + scope_die_for (type, context_die)); equate_type_number_to_die (type, type_die); add_name_attribute (type_die, type_tag (type)); } @@ -6599,7 +6600,8 @@ gen_subprogram_die (decl, context_die) } else { - subr_die = new_die (DW_TAG_subprogram, context_die); + subr_die = new_die (DW_TAG_subprogram, + scope_die_for (decl, context_die)); if (TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)) { add_AT_flag (subr_die, DW_AT_external, 1); @@ -6686,6 +6688,7 @@ gen_subprogram_die (decl, context_die) FUNCTION_TYPE node ends with a void_type_node then there should *not* be an ellipsis at the end. */ + push_decl_scope (decl); /* In the case where we are describing a mere function declaration, all we need to do here (and all we *can* do here) is to describe the *types* of its formal parameters. */ @@ -6777,6 +6780,7 @@ gen_subprogram_die (decl, context_die) } #endif } + pop_decl_scope (); } /* Generate a DIE to represent a declared data object. */ @@ -6912,13 +6916,16 @@ gen_inlined_subroutine_die (stmt, context_die, depth) { register dw_die_ref subr_die = new_die (DW_TAG_inlined_subroutine, context_die); + register tree decl = block_ultimate_origin (stmt); char label[MAX_ARTIFICIAL_LABEL_BYTES]; - add_abstract_origin_attribute (subr_die, block_ultimate_origin (stmt)); + add_abstract_origin_attribute (subr_die, decl); sprintf (label, BLOCK_BEGIN_LABEL_FMT, next_block_number); add_AT_lbl_id (subr_die, DW_AT_low_pc, label); sprintf (label, BLOCK_END_LABEL_FMT, next_block_number); add_AT_lbl_id (subr_die, DW_AT_high_pc, label); + push_decl_scope (decl); decls_for_scope (stmt, subr_die, depth); + pop_decl_scope (); current_function_has_inlines = 1; } } @@ -6944,8 +6951,9 @@ gen_field_die (decl, context_die) add_data_member_location_attribute (decl_die, decl); } -/* Don't generate either pointer_type DIEs or reference_type DIEs. - Use modified type DIE's instead. +#if 0 +/* Don't generate either pointer_type DIEs or reference_type DIEs here. + Use modified_type_die instead. We keep this code here just in case these types of DIEs may be needed to represent certain things in other languages (e.g. Pascal) someday. */ static void @@ -6953,16 +6961,14 @@ gen_pointer_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref ptr_die = lookup_type_die (type); - if (ptr_die) - return; - ptr_die = new_die (DW_TAG_pointer_type, context_die); + register dw_die_ref ptr_die = new_die (DW_TAG_pointer_type, context_die); equate_type_number_to_die (type, ptr_die); add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die); + add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); } -/* Don't generate either pointer_type DIEs or reference_type DIEs. - Use modified type DIE's instead. +/* Don't generate either pointer_type DIEs or reference_type DIEs here. + Use modified_type_die instead. We keep this code here just in case these types of DIEs may be needed to represent certain things in other languages (e.g. Pascal) someday. */ static void @@ -6970,13 +6976,12 @@ gen_reference_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref ref_die = lookup_type_die (type); - if (ref_die) - return; - ref_die = new_die (DW_TAG_reference_type, context_die); + register dw_die_ref ref_die = new_die (DW_TAG_reference_type, context_die); equate_type_number_to_die (type, ref_die); add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die); + add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); } +#endif /* Generate a DIE for a pointer to a member type. */ static void @@ -6984,10 +6989,8 @@ gen_ptr_to_mbr_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref ptr_die = lookup_type_die (type); - if (ptr_die) - return; - ptr_die = new_die (DW_TAG_ptr_to_member_type, context_die); + register dw_die_ref ptr_die = new_die + (DW_TAG_ptr_to_member_type, context_die); equate_type_number_to_die (type, ptr_die); add_AT_die_ref (ptr_die, DW_AT_containing_type, lookup_type_die (TYPE_OFFSET_BASETYPE (type))); @@ -7056,11 +7059,8 @@ gen_string_type_die (type, context_die) register tree type; register dw_die_ref context_die; { - register dw_die_ref type_die = lookup_type_die (type); - if (type_die) - return; - type_die = new_die (DW_TAG_string_type, - scope_die_for_type (type, context_die)); + register dw_die_ref type_die = new_die + (DW_TAG_string_type, scope_die_for (type, context_die)); equate_type_number_to_die (type, type_die); /* Fudge the string length attribute for now. */ @@ -7140,7 +7140,7 @@ gen_struct_or_union_type_die (type, is_complete, context_die) { type_die = new_die (TREE_CODE (type) == RECORD_TYPE ? DW_TAG_structure_type : DW_TAG_union_type, - scope_die_for_type (type, context_die)); + scope_die_for (type, context_die)); equate_type_number_to_die (type, type_die); add_name_attribute (type_die, type_tag (type)); } @@ -7159,7 +7159,9 @@ gen_struct_or_union_type_die (type, is_complete, context_die) if (TYPE_SIZE (type)) { add_byte_size_attribute (type_die, type); + push_decl_scope (type); gen_member_die (type, type_die); + pop_decl_scope (); } } else @@ -7173,10 +7175,7 @@ gen_subroutine_type_die (type, context_die) register dw_die_ref context_die; { register tree return_type = TREE_TYPE (type); - register dw_die_ref subr_die = lookup_type_die (type); - if (subr_die) - return; - subr_die = new_die (DW_TAG_subroutine_type, context_die); + register dw_die_ref subr_die = new_die (DW_TAG_subroutine_type, context_die); equate_type_number_to_die (type, subr_die); add_prototyped_attribute (subr_die, type); add_type_attribute (subr_die, return_type, 0, 0, context_die); @@ -7191,8 +7190,7 @@ gen_typedef_die (decl, context_die) { register tree origin = decl_ultimate_origin (decl); register dw_die_ref type_die; - type_die = new_die (DW_TAG_typedef, - scope_die_for_type (decl, context_die)); + type_die = new_die (DW_TAG_typedef, scope_die_for (decl, context_die)); if (origin != NULL) { add_abstract_origin_attribute (type_die, origin); @@ -7562,7 +7560,6 @@ gen_decl_die (decl, context_die) return; } - push_decl_scope (DECL_CONTEXT (decl)); switch (TREE_CODE (decl)) { case CONST_DECL: @@ -7680,7 +7677,6 @@ gen_decl_die (decl, context_die) default: abort (); } - pop_decl_scope (); } /***************** Debug Information Generation Hooks ***********************/ -- 2.43.5