Commit 88dad228 by Jason Merrill

x

From-SVN: r13209
parent d2872d37
...@@ -1324,6 +1324,10 @@ pushtag (name, type) ...@@ -1324,6 +1324,10 @@ pushtag (name, type)
tagged type. */ tagged type. */
TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type)); TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
/* An approximation for now, so we can tell this is a function-scope tag.
This will be updated in poplevel. */
TYPE_CONTEXT (type) = DECL_CONTEXT (TYPE_STUB_DECL (type));
} }
/* Handle when a new declaration NEWDECL /* Handle when a new declaration NEWDECL
......
...@@ -5793,18 +5793,16 @@ add_bit_size_attribute (die, decl) ...@@ -5793,18 +5793,16 @@ add_bit_size_attribute (die, decl)
(unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl))); (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
} }
/* If the compiled language is GNU C, then add a 'prototyped' /* If the compiled language is ANSI C, then add a 'prototyped'
attribute, if arg types are given for the parameters of a function. */ attribute, if arg types are given for the parameters of a function. */
inline void inline void
add_prototyped_attribute (die, func_type) add_prototyped_attribute (die, func_type)
register dw_die_ref die; register dw_die_ref die;
register tree func_type; register tree func_type;
{ {
if ((strcmp (language_string, "GNU C") == 0) if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89
&& (TYPE_ARG_TYPES (func_type) != NULL)) && TYPE_ARG_TYPES (func_type) != NULL)
{ add_AT_flag (die, DW_AT_prototyped, 1);
add_AT_flag (die, DW_AT_prototyped, 0);
}
} }
...@@ -5893,6 +5891,11 @@ scope_die_for (t, context_die) ...@@ -5893,6 +5891,11 @@ scope_die_for (t, context_die)
register tree containing_scope; register tree containing_scope;
register unsigned long i; register unsigned long i;
/* Function-local tags and functions get stuck in limbo until they are
fixed up by decls_for_scope. */
if (context_die == NULL)
return NULL;
/* Walk back up the declaration tree looking for a place to define /* Walk back up the declaration tree looking for a place to define
this type. */ this type. */
if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
...@@ -6037,7 +6040,7 @@ decl_start_label (decl) ...@@ -6037,7 +6040,7 @@ decl_start_label (decl)
/* These routines generate the internnal representation of the DIE's for /* These routines generate the internnal representation of the DIE's for
the compilation unit. Debugging information is collected by walking the compilation unit. Debugging information is collected by walking
the declaration trees passed in from dwarf2out_file_scope_decl(). */ the declaration trees passed in from dwarf2out_decl(). */
static void static void
gen_array_type_die (type, context_die) gen_array_type_die (type, context_die)
...@@ -6489,6 +6492,10 @@ gen_subprogram_die (decl, context_die) ...@@ -6489,6 +6492,10 @@ gen_subprogram_die (decl, context_die)
fp_loc = new_loc_descr (DW_OP_reg0 + fp_reg); fp_loc = new_loc_descr (DW_OP_reg0 + fp_reg);
add_AT_loc (subr_die, DW_AT_frame_base, fp_loc); add_AT_loc (subr_die, DW_AT_frame_base, fp_loc);
if (current_function_needs_context)
add_AT_loc (subr_die, DW_AT_static_link,
loc_descriptor (lookup_static_chain (decl)));
#ifdef DWARF_GNU_EXTENSIONS #ifdef DWARF_GNU_EXTENSIONS
ASM_GENERATE_INTERNAL_LABEL (label_id, BODY_BEGIN_LABEL, ASM_GENERATE_INTERNAL_LABEL (label_id, BODY_BEGIN_LABEL,
current_funcdef_number); current_funcdef_number);
...@@ -7325,13 +7332,28 @@ decls_for_scope (stmt, context_die, depth) ...@@ -7325,13 +7332,28 @@ decls_for_scope (stmt, context_die, depth)
next_block_number++; next_block_number++;
} }
/* Output the DIEs to represent all of the data objects, functions, /* Output the DIEs to represent all of the data objects and typedefs
typedefs, and tagged types declared directly within this block but not declared directly within this block but not within any nested
within any nested sub-blocks. */ sub-blocks. Also, nested function and tag DIEs have been
generated with a parent of NULL; fix that up now. */
for (decl = BLOCK_VARS (stmt); for (decl = BLOCK_VARS (stmt);
decl != NULL; decl = TREE_CHAIN (decl)) decl != NULL; decl = TREE_CHAIN (decl))
{ {
gen_decl_die (decl, context_die); if (TREE_CODE (decl) == FUNCTION_DECL)
{
register dw_die_ref die = lookup_decl_die (decl);
add_child_die (context_die, die);
}
else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl))
{
register dw_die_ref die = lookup_type_die (TREE_TYPE (decl));
if (die)
add_child_die (context_die, die);
else
gen_decl_die (decl, context_die);
}
else
gen_decl_die (decl, context_die);
} }
/* Output the DIEs to represent all sub-blocks (and the items declared /* Output the DIEs to represent all sub-blocks (and the items declared
...@@ -7478,10 +7500,11 @@ gen_decl_die (decl, context_die) ...@@ -7478,10 +7500,11 @@ gen_decl_die (decl, context_die)
/***************** Debug Information Generation Hooks ***********************/ /***************** Debug Information Generation Hooks ***********************/
void void
dwarf2out_file_scope_decl (decl, set_finalizing) dwarf2out_decl (decl)
register tree decl; register tree decl;
register int set_finalizing;
{ {
register dw_die_ref context_die = comp_unit_die;
if (TREE_CODE (decl) == ERROR_MARK) if (TREE_CODE (decl) == ERROR_MARK)
{ {
return; return;
...@@ -7544,6 +7567,13 @@ dwarf2out_file_scope_decl (decl, set_finalizing) ...@@ -7544,6 +7567,13 @@ dwarf2out_file_scope_decl (decl, set_finalizing)
{ {
return; return;
} }
/* If we're a nested function, initially use a parent of NULL; if we're
a plain function, this will be fixed up in decls_for_scope. If
we're a method, it will be ignored, since we already have a DIE. */
if (decl_function_context (decl))
context_die = NULL;
break; break;
case VAR_DECL: case VAR_DECL:
...@@ -7574,17 +7604,22 @@ dwarf2out_file_scope_decl (decl, set_finalizing) ...@@ -7574,17 +7604,22 @@ dwarf2out_file_scope_decl (decl, set_finalizing)
if (DECL_SOURCE_LINE (decl) == 0) if (DECL_SOURCE_LINE (decl) == 0)
return; return;
/* If we are in terse mode, don't generate any DIEs to represent any /* If we are in terse mode, don't generate any DIEs for types. */
actual typedefs. */
if (debug_info_level <= DINFO_LEVEL_TERSE) if (debug_info_level <= DINFO_LEVEL_TERSE)
return; return;
/* If we're a function-scope tag, initially use a parent of NULL;
this will be fixed up in decls_for_scope. */
if (decl_function_context (decl))
context_die = NULL;
break; break;
default: default:
return; return;
} }
gen_decl_die (decl, comp_unit_die); gen_decl_die (decl, context_die);
if (TREE_CODE (decl) == FUNCTION_DECL if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_INITIAL (decl) != NULL) && DECL_INITIAL (decl) != NULL)
......
...@@ -2538,7 +2538,7 @@ compile_file (name) ...@@ -2538,7 +2538,7 @@ compile_file (name)
if (write_symbols == DWARF2_DEBUG if (write_symbols == DWARF2_DEBUG
&& (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl))) && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
TIMEVAR (symout_time, dwarf2out_file_scope_decl (decl, 1)); TIMEVAR (symout_time, dwarf2out_decl (decl));
#endif #endif
} }
} }
...@@ -2782,9 +2782,8 @@ rest_of_type_compilation (type, toplev) ...@@ -2782,9 +2782,8 @@ rest_of_type_compilation (type, toplev)
TIMEVAR (symout_time, dwarfout_file_scope_decl (TYPE_STUB_DECL (type), 0)); TIMEVAR (symout_time, dwarfout_file_scope_decl (TYPE_STUB_DECL (type), 0));
#endif #endif
#ifdef DWARF2_DEBUGGING_INFO #ifdef DWARF2_DEBUGGING_INFO
/* Don't write out function-scope types here. */ if (write_symbols == DWARF2_DEBUG)
if (write_symbols == DWARF2_DEBUG && toplev) TIMEVAR (symout_time, dwarf2out_decl (TYPE_STUB_DECL (type)));
TIMEVAR (symout_time, dwarf2out_file_scope_decl (TYPE_STUB_DECL (type), 0));
#endif #endif
} }
...@@ -2900,7 +2899,7 @@ rest_of_compilation (decl) ...@@ -2900,7 +2899,7 @@ rest_of_compilation (decl)
if (write_symbols == DWARF2_DEBUG) if (write_symbols == DWARF2_DEBUG)
{ {
set_decl_abstract_flags (decl, 1); set_decl_abstract_flags (decl, 1);
TIMEVAR (symout_time, dwarf2out_file_scope_decl (decl, 0)); TIMEVAR (symout_time, dwarf2out_decl (decl));
set_decl_abstract_flags (decl, 0); set_decl_abstract_flags (decl, 0);
} }
#endif #endif
...@@ -2934,7 +2933,7 @@ rest_of_compilation (decl) ...@@ -2934,7 +2933,7 @@ rest_of_compilation (decl)
if (write_symbols == DWARF2_DEBUG) if (write_symbols == DWARF2_DEBUG)
{ {
set_decl_abstract_flags (decl, 1); set_decl_abstract_flags (decl, 1);
TIMEVAR (symout_time, dwarf2out_file_scope_decl (decl, 0)); TIMEVAR (symout_time, dwarf2out_decl (decl));
set_decl_abstract_flags (decl, 0); set_decl_abstract_flags (decl, 0);
} }
#endif #endif
...@@ -3431,7 +3430,7 @@ rest_of_compilation (decl) ...@@ -3431,7 +3430,7 @@ rest_of_compilation (decl)
#ifdef DWARF2_DEBUGGING_INFO #ifdef DWARF2_DEBUGGING_INFO
if (write_symbols == DWARF2_DEBUG) if (write_symbols == DWARF2_DEBUG)
TIMEVAR (symout_time, dwarf2out_file_scope_decl (decl, 0)); TIMEVAR (symout_time, dwarf2out_decl (decl));
#endif #endif
exit_rest_of_compilation: exit_rest_of_compilation:
......
...@@ -1183,7 +1183,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data) ...@@ -1183,7 +1183,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#ifdef DWARF2_DEBUGGING_INFO #ifdef DWARF2_DEBUGGING_INFO
if (write_symbols == DWARF2_DEBUG && top_level if (write_symbols == DWARF2_DEBUG && top_level
&& DECL_CONTEXT (decl)) && DECL_CONTEXT (decl))
dwarf2out_file_scope_decl (decl, 0); dwarf2out_decl (decl);
#endif #endif
} }
...@@ -1316,7 +1316,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data) ...@@ -1316,7 +1316,7 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#ifdef DWARF2_DEBUGGING_INFO #ifdef DWARF2_DEBUGGING_INFO
if (write_symbols == DWARF2_DEBUG && top_level if (write_symbols == DWARF2_DEBUG && top_level
&& DECL_CONTEXT (decl)) && DECL_CONTEXT (decl))
dwarf2out_file_scope_decl (decl, 0); dwarf2out_decl (decl);
#endif #endif
/* Only output DWARF debugging information for record-scope variables /* Only output DWARF debugging information for record-scope variables
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment