Index: gcc/gcc/dbxout.c |
diff --git a/gcc/gcc/dbxout.c b/gcc/gcc/dbxout.c |
index 9fda9712d5723cdb9a381ef0491bc74788e6cf1e..a314e7b4430dca73c70faee7f9757422948124c1 100644 |
--- a/gcc/gcc/dbxout.c |
+++ b/gcc/gcc/dbxout.c |
@@ -1,6 +1,6 @@ |
/* Output dbx-format symbol table information from GNU compiler. |
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, |
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -171,8 +171,7 @@ enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED}; |
The file_number and type_number elements are used if DBX_USE_BINCL |
is defined. */ |
-struct typeinfo GTY(()) |
-{ |
+struct GTY(()) typeinfo { |
enum typestatus status; |
int file_number; |
int type_number; |
@@ -217,8 +216,8 @@ struct dbx_file |
struct dbx_file *prev; /* Chain to traverse all pending bincls. */ |
}; |
-/* This is the top of the stack. |
- |
+/* This is the top of the stack. |
+ |
This is not saved for PCH, because restoring a PCH should not change it. |
next_file_number does have to be saved, because the PCH may use some |
file numbers; however, just before restoring a PCH, next_file_number |
@@ -276,8 +275,6 @@ static const char *base_input_file; |
#include "gstab.h" |
-#define STAB_CODE_TYPE enum __stab_debug_code |
- |
/* 1 if PARM is passed to this function in memory. */ |
#define PARM_PASSED_IN_MEMORY(PARM) \ |
@@ -309,7 +306,7 @@ static void emit_pending_bincls (void); |
static inline void emit_pending_bincls_if_required (void); |
static void dbxout_init (const char *); |
- |
+ |
static void dbxout_finish (const char *); |
static void dbxout_start_source_file (unsigned, const char *); |
static void dbxout_end_source_file (unsigned); |
@@ -319,15 +316,15 @@ static void dbxout_args (tree); |
static void dbxout_type_fields (tree); |
static void dbxout_type_method_1 (tree); |
static void dbxout_type_methods (tree); |
-static void dbxout_range_type (tree); |
+static void dbxout_range_type (tree, tree, tree); |
static void dbxout_type (tree, int); |
-static bool print_int_cst_bounds_in_octal_p (tree); |
+static bool print_int_cst_bounds_in_octal_p (tree, tree, tree); |
static bool is_fortran (void); |
static void dbxout_type_name (tree); |
static void dbxout_class_name_qualifiers (tree); |
static int dbxout_symbol_location (tree, tree, const char *, rtx); |
static void dbxout_symbol_name (tree, const char *, int); |
-static void dbxout_common_name (tree, const char *, STAB_CODE_TYPE); |
+static void dbxout_common_name (tree, const char *, stab_code_type); |
static const char *dbxout_common_check (tree, int *); |
static void dbxout_global_decl (tree); |
static void dbxout_type_decl (tree, int); |
@@ -336,7 +333,7 @@ static void dbxout_handle_pch (unsigned); |
/* The debug hooks structure. */ |
#if defined (DBX_DEBUGGING_INFO) |
-static void dbxout_source_line (unsigned int, const char *); |
+static void dbxout_source_line (unsigned int, const char *, int, bool); |
static void dbxout_begin_prologue (unsigned int, const char *); |
static void dbxout_source_file (const char *); |
static void dbxout_function_end (tree); |
@@ -377,6 +374,11 @@ const struct gcc_debug_hooks dbx_debug_hooks = |
dbxout_handle_pch, /* handle_pch */ |
debug_nothing_rtx, /* var_location */ |
debug_nothing_void, /* switch_text_section */ |
+ debug_nothing_tree, /* direct_call */ |
+ debug_nothing_tree_int, /* virtual_call_token */ |
+ debug_nothing_rtx_rtx, /* copy_call_info */ |
+ debug_nothing_uid, /* virtual_call */ |
+ debug_nothing_tree_tree, /* set_name */ |
0 /* start_end_main_source_file */ |
}; |
#endif /* DBX_DEBUGGING_INFO */ |
@@ -410,6 +412,11 @@ const struct gcc_debug_hooks xcoff_debug_hooks = |
dbxout_handle_pch, /* handle_pch */ |
debug_nothing_rtx, /* var_location */ |
debug_nothing_void, /* switch_text_section */ |
+ debug_nothing_tree, /* direct_call */ |
+ debug_nothing_tree_int, /* virtual_call_token */ |
+ debug_nothing_rtx_rtx, /* copy_call_info */ |
+ debug_nothing_uid, /* virtual_call */ |
+ debug_nothing_tree_tree, /* set_name */ |
0 /* start_end_main_source_file */ |
}; |
#endif /* XCOFF_DEBUGGING_INFO */ |
@@ -841,9 +848,9 @@ do { \ |
SYM is the DECL of the symbol under consideration; it is used only |
for its DECL_SOURCE_LINE. The other arguments are all passed directly |
to DBX_FINISH_STABS; see above for details. */ |
- |
+ |
static void |
-dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code, |
+dbxout_finish_complex_stabs (tree sym, stab_code_type code, |
rtx addr, const char *label, int number) |
{ |
int line ATTRIBUTE_UNUSED; |
@@ -895,7 +902,7 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code, |
obstack_grow (&stabstr_ob, "\",", 2); |
len = obstack_object_size (&stabstr_ob); |
str = XOBFINISH (&stabstr_ob, char *); |
- |
+ |
fwrite (str, 1, len, asm_out_file); |
DBX_FINISH_STABS (sym, code, line, addr, label, number); |
} |
@@ -905,14 +912,14 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code, |
#if defined (DBX_DEBUGGING_INFO) |
static void |
-dbxout_function_end (tree decl) |
+dbxout_function_end (tree decl ATTRIBUTE_UNUSED) |
{ |
char lscope_label_name[100]; |
/* The Lscope label must be emitted even if we aren't doing anything |
else; dbxout_block needs it. */ |
switch_to_section (function_section (current_function_decl)); |
- |
+ |
/* Convert Lscope into the appropriate format for local labels in case |
the system doesn't insert underscores in front of user generated |
labels. */ |
@@ -924,8 +931,7 @@ dbxout_function_end (tree decl) |
named sections. */ |
if (!use_gnu_debug_info_extensions |
|| NO_DBX_FUNCTION_END |
- || !targetm.have_named_sections |
- || DECL_IGNORED_P (decl)) |
+ || !targetm.have_named_sections) |
return; |
/* By convention, GCC will mark the end of a function with an N_FUN |
@@ -933,10 +939,10 @@ dbxout_function_end (tree decl) |
if (flag_reorder_blocks_and_partition) |
{ |
dbxout_begin_empty_stabs (N_FUN); |
- dbxout_stab_value_label_diff (crtl->subsections.hot_section_end_label, |
+ dbxout_stab_value_label_diff (crtl->subsections.hot_section_end_label, |
crtl->subsections.hot_section_label); |
dbxout_begin_empty_stabs (N_FUN); |
- dbxout_stab_value_label_diff (crtl->subsections.cold_section_end_label, |
+ dbxout_stab_value_label_diff (crtl->subsections.cold_section_end_label, |
crtl->subsections.cold_section_label); |
} |
else |
@@ -1172,7 +1178,7 @@ dbxout_start_source_file (unsigned int line ATTRIBUTE_UNUSED, |
n->next = current_file; |
n->next_type_number = 1; |
- /* Do not assign file number now. |
+ /* Do not assign file number now. |
Delay it until we actually emit BINCL. */ |
n->file_number = 0; |
n->prev = NULL; |
@@ -1253,7 +1259,7 @@ dbxout_source_file (const char *filename) |
} |
} |
-/* Output N_BNSYM, line number symbol entry, and local symbol at |
+/* Output N_BNSYM, line number symbol entry, and local symbol at |
function scope */ |
static void |
@@ -1268,8 +1274,8 @@ dbxout_begin_prologue (unsigned int lineno, const char *filename) |
/* pre-increment the scope counter */ |
scope_labelno++; |
- dbxout_source_line (lineno, filename); |
- /* Output function begin block at function scope, referenced |
+ dbxout_source_line (lineno, filename, 0, true); |
+ /* Output function begin block at function scope, referenced |
by dbxout_block, dbxout_source_line and dbxout_function_end. */ |
emit_pending_bincls_if_required (); |
targetm.asm_out.internal_label (asm_out_file, "LFBB", scope_labelno); |
@@ -1279,7 +1285,9 @@ dbxout_begin_prologue (unsigned int lineno, const char *filename) |
number LINENO. */ |
static void |
-dbxout_source_line (unsigned int lineno, const char *filename) |
+dbxout_source_line (unsigned int lineno, const char *filename, |
+ int discriminator ATTRIBUTE_UNUSED, |
+ bool is_stmt ATTRIBUTE_UNUSED) |
{ |
dbxout_source_file (filename); |
@@ -1291,7 +1299,7 @@ dbxout_source_line (unsigned int lineno, const char *filename) |
char begin_label[20]; |
dbxout_begin_stabn_sline (lineno); |
/* Reference current function start using LFBB. */ |
- ASM_GENERATE_INTERNAL_LABEL (begin_label, "LFBB", scope_labelno); |
+ ASM_GENERATE_INTERNAL_LABEL (begin_label, "LFBB", scope_labelno); |
dbxout_stab_value_internal_label_diff ("LM", &dbxout_source_line_counter, |
begin_label); |
} |
@@ -1594,10 +1602,10 @@ dbxout_type_methods (tree type) |
/* Emit a "range" type specification, which has the form: |
"r<index type>;<lower bound>;<upper bound>;". |
- TYPE is an INTEGER_TYPE. */ |
+ TYPE is an INTEGER_TYPE, LOW and HIGH are the bounds. */ |
static void |
-dbxout_range_type (tree type) |
+dbxout_range_type (tree type, tree low, tree high) |
{ |
stabstr_C ('r'); |
if (TREE_TYPE (type)) |
@@ -1625,25 +1633,23 @@ dbxout_range_type (tree type) |
} |
stabstr_C (';'); |
- if (TYPE_MIN_VALUE (type) != 0 |
- && host_integerp (TYPE_MIN_VALUE (type), 0)) |
+ if (low && host_integerp (low, 0)) |
{ |
- if (print_int_cst_bounds_in_octal_p (type)) |
- stabstr_O (TYPE_MIN_VALUE (type)); |
+ if (print_int_cst_bounds_in_octal_p (type, low, high)) |
+ stabstr_O (low); |
else |
- stabstr_D (tree_low_cst (TYPE_MIN_VALUE (type), 0)); |
+ stabstr_D (tree_low_cst (low, 0)); |
} |
else |
stabstr_C ('0'); |
stabstr_C (';'); |
- if (TYPE_MAX_VALUE (type) != 0 |
- && host_integerp (TYPE_MAX_VALUE (type), 0)) |
+ if (high && host_integerp (high, 0)) |
{ |
- if (print_int_cst_bounds_in_octal_p (type)) |
- stabstr_O (TYPE_MAX_VALUE (type)); |
+ if (print_int_cst_bounds_in_octal_p (type, low, high)) |
+ stabstr_O (high); |
else |
- stabstr_D (tree_low_cst (TYPE_MAX_VALUE (type), 0)); |
+ stabstr_D (tree_low_cst (high, 0)); |
stabstr_C (';'); |
} |
else |
@@ -1664,10 +1670,9 @@ dbxout_range_type (tree type) |
static void |
dbxout_type (tree type, int full) |
{ |
- tree tem; |
- tree main_variant; |
static int anonymous_type_number = 0; |
bool vector_type = false; |
+ tree tem, main_variant, low, high; |
if (TREE_CODE (type) == VECTOR_TYPE) |
{ |
@@ -1677,6 +1682,27 @@ dbxout_type (tree type, int full) |
vector_type = true; |
} |
+ if (TREE_CODE (type) == INTEGER_TYPE) |
+ { |
+ if (TREE_TYPE (type) == 0) |
+ { |
+ low = TYPE_MIN_VALUE (type); |
+ high = TYPE_MAX_VALUE (type); |
+ } |
+ |
+ else if (subrange_type_for_debug_p (type, &low, &high)) |
+ ; |
+ |
+ /* If this is a subtype that should not be emitted as a subrange type, |
+ use the base type. */ |
+ else |
+ { |
+ type = TREE_TYPE (type); |
+ low = TYPE_MIN_VALUE (type); |
+ high = TYPE_MAX_VALUE (type); |
+ } |
+ } |
+ |
/* If there was an input error and we don't really have a type, |
avoid crashing and write something that is at least valid |
by assuming `int'. */ |
@@ -1878,7 +1904,7 @@ dbxout_type (tree type, int full) |
stabstr_C (';'); |
} |
- dbxout_range_type (type); |
+ dbxout_range_type (type, low, high); |
} |
else |
@@ -1894,7 +1920,7 @@ dbxout_type (tree type, int full) |
stabstr_C (';'); |
} |
- if (print_int_cst_bounds_in_octal_p (type)) |
+ if (print_int_cst_bounds_in_octal_p (type, low, high)) |
{ |
stabstr_C ('r'); |
@@ -1909,15 +1935,15 @@ dbxout_type (tree type, int full) |
dbxout_type_index (type); |
stabstr_C (';'); |
- stabstr_O (TYPE_MIN_VALUE (type)); |
+ stabstr_O (low); |
stabstr_C (';'); |
- stabstr_O (TYPE_MAX_VALUE (type)); |
+ stabstr_O (high); |
stabstr_C (';'); |
} |
else |
/* Output other integer types as subranges of `int'. */ |
- dbxout_range_type (type); |
+ dbxout_range_type (type, low, high); |
} |
break; |
@@ -2011,7 +2037,7 @@ dbxout_type (tree type, int full) |
else |
{ |
stabstr_C ('a'); |
- dbxout_range_type (tem); |
+ dbxout_range_type (tem, TYPE_MIN_VALUE (tem), TYPE_MAX_VALUE (tem)); |
} |
dbxout_type (TREE_TYPE (type), 0); |
@@ -2067,7 +2093,7 @@ dbxout_type (tree type, int full) |
int i; |
tree child; |
VEC(tree,gc) *accesses = BINFO_BASE_ACCESSES (binfo); |
- |
+ |
if (use_gnu_debug_info_extensions) |
{ |
if (BINFO_N_BASE_BINFOS (binfo)) |
@@ -2259,7 +2285,7 @@ dbxout_type (tree type, int full) |
should be printed in octal format. */ |
static bool |
-print_int_cst_bounds_in_octal_p (tree type) |
+print_int_cst_bounds_in_octal_p (tree type, tree low, tree high) |
{ |
/* If we can use GDB extensions and the size is wider than a long |
(the size used by GDB to read them) or we may have trouble writing |
@@ -2273,10 +2299,8 @@ print_int_cst_bounds_in_octal_p (tree type) |
can't span same size unsigned types. */ |
if (use_gnu_debug_info_extensions |
- && TYPE_MIN_VALUE (type) != 0 |
- && TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST |
- && TYPE_MAX_VALUE (type) != 0 |
- && TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST |
+ && low && TREE_CODE (low) == INTEGER_CST |
+ && high && TREE_CODE (high) == INTEGER_CST |
&& (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node) |
|| ((TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) |
&& TYPE_UNSIGNED (type)) |
@@ -2296,7 +2320,7 @@ static void |
dbxout_type_name (tree type) |
{ |
tree t = TYPE_NAME (type); |
- |
+ |
gcc_assert (t); |
switch (TREE_CODE (t)) |
{ |
@@ -2817,7 +2841,7 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED) |
if (!decl_rtl) |
DBXOUT_DECR_NESTING_AND_RETURN (0); |
- decl_rtl = eliminate_regs (decl_rtl, 0, NULL_RTX); |
+ decl_rtl = eliminate_regs (decl_rtl, VOIDmode, NULL_RTX); |
#ifdef LEAF_REG_REMAP |
if (current_function_uses_only_leaf_regs) |
leaf_renumber_regs_insn (decl_rtl); |
@@ -2843,7 +2867,7 @@ static int |
dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home) |
{ |
int letter = 0; |
- STAB_CODE_TYPE code; |
+ stab_code_type code; |
rtx addr = 0; |
int number = 0; |
int regno = -1; |
@@ -3023,7 +3047,7 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home) |
} |
else if (MEM_P (home) |
&& GET_CODE (XEXP (home, 0)) == PLUS |
- && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT) |
+ && CONST_INT_P (XEXP (XEXP (home, 0), 1))) |
{ |
code = N_LSYM; |
/* RTL looks like (MEM (PLUS (REG...) (CONST_INT...))) |
@@ -3114,7 +3138,7 @@ dbxout_symbol_name (tree decl, const char *suffix, int letter) |
{ |
tree name; |
- if (DECL_CONTEXT (decl) |
+ if (DECL_CONTEXT (decl) |
&& (TYPE_P (DECL_CONTEXT (decl)) |
|| TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)) |
/* One slight hitch: if this is a VAR_DECL which is a class member |
@@ -3148,7 +3172,7 @@ dbxout_symbol_name (tree decl, const char *suffix, int letter) |
emits the N_BCOMM and N_ECOMM stabs. */ |
static void |
-dbxout_common_name (tree decl, const char *name, STAB_CODE_TYPE op) |
+dbxout_common_name (tree decl, const char *name, stab_code_type op) |
{ |
dbxout_begin_complex_stabs (); |
stabstr_S (name); |
@@ -3166,24 +3190,23 @@ dbxout_common_check (tree decl, int *value) |
rtx home; |
rtx sym_addr; |
const char *name = NULL; |
- |
- /* If the decl isn't a VAR_DECL, or if it isn't public or static, or if |
+ |
+ /* If the decl isn't a VAR_DECL, or if it isn't static, or if |
it does not have a value (the offset into the common area), or if it |
is thread local (as opposed to global) then it isn't common, and shouldn't |
be handled as such. |
- |
+ |
??? DECL_THREAD_LOCAL_P check prevents problems with improper .stabs |
for thread-local symbols. Can be handled via same mechanism as used |
in dwarf2out.c. */ |
if (TREE_CODE (decl) != VAR_DECL |
- || !TREE_PUBLIC(decl) |
|| !TREE_STATIC(decl) |
|| !DECL_HAS_VALUE_EXPR_P(decl) |
|| DECL_THREAD_LOCAL_P (decl) |
|| !is_fortran ()) |
return NULL; |
- home = DECL_RTL (decl); |
+ home = DECL_RTL (decl); |
if (home == NULL_RTX || GET_CODE (home) != MEM) |
return NULL; |
@@ -3209,7 +3232,7 @@ dbxout_common_check (tree decl, int *value) |
switch (GET_CODE (sym_addr)) |
{ |
case PLUS: |
- if (GET_CODE (XEXP (sym_addr, 0)) == CONST_INT) |
+ if (CONST_INT_P (XEXP (sym_addr, 0))) |
{ |
name = |
targetm.strip_name_encoding(XSTR (XEXP (sym_addr, 1), 0)); |
@@ -3316,14 +3339,15 @@ dbxout_parms (tree parms) |
{ |
tree eff_type; |
char letter; |
- STAB_CODE_TYPE code; |
+ stab_code_type code; |
int number; |
/* Perform any necessary register eliminations on the parameter's rtl, |
so that the debugging output will be accurate. */ |
DECL_INCOMING_RTL (parms) |
- = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX); |
- SET_DECL_RTL (parms, eliminate_regs (DECL_RTL (parms), 0, NULL_RTX)); |
+ = eliminate_regs (DECL_INCOMING_RTL (parms), VOIDmode, NULL_RTX); |
+ SET_DECL_RTL (parms, |
+ eliminate_regs (DECL_RTL (parms), VOIDmode, NULL_RTX)); |
#ifdef LEAF_REG_REMAP |
if (current_function_uses_only_leaf_regs) |
{ |
@@ -3341,7 +3365,7 @@ dbxout_parms (tree parms) |
If that is not true, we produce meaningless results, |
but do not crash. */ |
if (GET_CODE (inrtl) == PLUS |
- && GET_CODE (XEXP (inrtl, 1)) == CONST_INT) |
+ && CONST_INT_P (XEXP (inrtl, 1))) |
number = INTVAL (XEXP (inrtl, 1)); |
else |
number = 0; |
@@ -3407,7 +3431,7 @@ dbxout_parms (tree parms) |
that it was actually passed by invisible reference. */ |
code = DBX_REGPARM_STABS_CODE; |
- |
+ |
/* GDB likes this marked with a special letter. */ |
letter = (use_gnu_debug_info_extensions |
? 'a' : DBX_REGPARM_STABS_LETTER); |
@@ -3478,7 +3502,7 @@ dbxout_parms (tree parms) |
continue; |
dbxout_begin_complex_stabs (); |
- |
+ |
if (DECL_NAME (parms)) |
{ |
stabstr_I (DECL_NAME (parms)); |
@@ -3667,9 +3691,6 @@ dbxout_begin_function (tree decl) |
{ |
int saved_tree_used1; |
- if (DECL_IGNORED_P (decl)) |
- return; |
- |
saved_tree_used1 = TREE_USED (decl); |
TREE_USED (decl) = 1; |
if (DECL_NAME (DECL_RESULT (decl)) != 0) |