Mercurial > hg > CbC > CbC_gcc
diff gcc/dbxout.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | 855418dad1a3 |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/dbxout.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/dbxout.c Fri Feb 12 23:39:51 2010 +0900 @@ -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 @@ 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 *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 @@ #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 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_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 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ #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 @@ 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 @@ 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 @@ 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 @@ } } -/* 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 @@ /* 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 @@ 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 @@ 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 @@ /* 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 @@ } 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 @@ 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 @@ 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 @@ stabstr_C (';'); } - dbxout_range_type (type); + dbxout_range_type (type, low, high); } else @@ -1894,7 +1920,7 @@ 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_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 @@ 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 @@ 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 @@ 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 @@ 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 @@ dbxout_type_name (tree type) { tree t = TYPE_NAME (type); - + gcc_assert (t); switch (TREE_CODE (t)) { @@ -2817,7 +2841,7 @@ 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 @@ 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 @@ } 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 @@ { 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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 @@ 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 @@ continue; dbxout_begin_complex_stabs (); - + if (DECL_NAME (parms)) { stabstr_I (DECL_NAME (parms)); @@ -3667,9 +3691,6 @@ { 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)