X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fsdbout.c;h=4d42da9221eeae2305e5b2daa95e2abed80a6e47;hb=595afebdab4178820580b10fd829cad8a42914bd;hp=6d9689ceff0a43db60d8d2bea339ba0a24fb8bb7;hpb=5493cb9ab6c5e787f31e54d400c418b3becba440;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/sdbout.c b/gcc/sdbout.c index 6d9689ceff0..4d42da9221e 100644 --- a/gcc/sdbout.c +++ b/gcc/sdbout.c @@ -1,6 +1,7 @@ /* Output sdb-format symbol table information from GNU compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. This file is part of GCC. @@ -47,7 +48,7 @@ AT&T C compiler. From the example below I would conclude the following: #include "debug.h" #include "tree.h" #include "ggc.h" -#include "varray.h" +#include "vec.h" static GTY(()) tree anonymous_types; @@ -57,7 +58,7 @@ static GTY(()) int unnamed_struct_number; /* Declarations whose debug info was deferred till end of compilation. */ -static GTY(()) varray_type deferred_global_decls; +static GTY(()) VEC(tree,gc) *deferred_global_decls; /* The C front end may call sdbout_symbol before sdbout_init runs. We save all such decls in this list and output them when we get @@ -74,7 +75,7 @@ static GTY(()) bool sdbout_initialized; #include "insn-config.h" #include "reload.h" #include "output.h" -#include "toplev.h" +#include "diagnostic-core.h" #include "tm_p.h" #include "gsyms.h" #include "langhooks.h" @@ -116,7 +117,7 @@ static void sdbout_start_source_file (unsigned int, const char *); static void sdbout_end_source_file (unsigned int); static void sdbout_begin_block (unsigned int, unsigned int); static void sdbout_end_block (unsigned int, unsigned int); -static void sdbout_source_line (unsigned int, const char *); +static void sdbout_source_line (unsigned int, const char *, int, bool); static void sdbout_end_epilogue (unsigned int, const char *); static void sdbout_global_decl (tree); #ifndef MIPS_DEBUGGING_INFO @@ -306,6 +307,7 @@ const struct gcc_debug_hooks sdb_debug_hooks = { sdbout_init, /* init */ sdbout_finish, /* finish */ + debug_nothing_void, /* assembly_start */ debug_nothing_int_charstar, /* define */ debug_nothing_int_charstar, /* undef */ sdbout_start_source_file, /* start_source_file */ @@ -323,20 +325,23 @@ const struct gcc_debug_hooks sdb_debug_hooks = sdbout_begin_prologue, /* begin_prologue */ debug_nothing_int_charstar, /* end_prologue */ #endif + debug_nothing_int_charstar, /* begin_epilogue */ sdbout_end_epilogue, /* end_epilogue */ sdbout_begin_function, /* begin_function */ sdbout_end_function, /* end_function */ debug_nothing_tree, /* function_decl */ sdbout_global_decl, /* global_decl */ sdbout_symbol, /* type_decl */ - debug_nothing_tree_tree, /* imported_module_or_decl */ + debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ debug_nothing_tree, /* deferred_inline_function */ debug_nothing_tree, /* outlining_inline_function */ sdbout_label, /* label */ debug_nothing_int, /* handle_pch */ debug_nothing_rtx, /* var_location */ debug_nothing_void, /* switch_text_section */ - 0 /* start_end_main_source_file */ + debug_nothing_tree_tree, /* set_name */ + 0, /* start_end_main_source_file */ + TYPE_SYMTAB_IS_POINTER /* tree_type_symtab_field */ }; /* Return a unique string to name an anonymous type. */ @@ -486,6 +491,7 @@ plain_type_1 (tree type, int level) switch (TREE_CODE (type)) { case VOID_TYPE: + case NULLPTR_TYPE: return T_VOID; case BOOLEAN_TYPE: case INTEGER_TYPE: @@ -769,7 +775,7 @@ sdbout_symbol (tree decl, int local) return; SET_DECL_RTL (decl, - eliminate_regs (DECL_RTL (decl), 0, NULL_RTX)); + eliminate_regs (DECL_RTL (decl), VOIDmode, NULL_RTX)); #ifdef LEAF_REG_REMAP if (current_function_uses_only_leaf_regs) leaf_renumber_regs_insn (DECL_RTL (decl)); @@ -896,7 +902,7 @@ sdbout_symbol (tree decl, int local) else if (MEM_P (value) && ((GET_CODE (XEXP (value, 0)) == PLUS && REG_P (XEXP (XEXP (value, 0), 0)) - && GET_CODE (XEXP (XEXP (value, 0), 1)) == CONST_INT) + && CONST_INT_P (XEXP (XEXP (value, 0), 1))) /* This is for variables which are at offset zero from the frame pointer. This happens on the Alpha. Non-frame pointer registers are excluded above. */ @@ -1149,7 +1155,7 @@ sdbout_one_type (tree type) { tree child_type = BINFO_TYPE (child); tree child_type_name; - + if (TYPE_NAME (child_type) == 0) continue; if (TREE_CODE (TYPE_NAME (child_type)) == IDENTIFIER_NODE) @@ -1177,14 +1183,21 @@ sdbout_one_type (tree type) if (TREE_CODE (type) == ENUMERAL_TYPE) { for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem)) - if (host_integerp (TREE_VALUE (tem), 0)) - { - PUT_SDB_DEF (IDENTIFIER_POINTER (TREE_PURPOSE (tem))); - PUT_SDB_INT_VAL (tree_low_cst (TREE_VALUE (tem), 0)); - PUT_SDB_SCL (C_MOE); - PUT_SDB_TYPE (T_MOE); - PUT_SDB_ENDEF; - } + { + tree value = TREE_VALUE (tem); + + if (TREE_CODE (value) == CONST_DECL) + value = DECL_INITIAL (value); + + if (host_integerp (value, 0)) + { + PUT_SDB_DEF (IDENTIFIER_POINTER (TREE_PURPOSE (tem))); + PUT_SDB_INT_VAL (tree_low_cst (value, 0)); + PUT_SDB_SCL (C_MOE); + PUT_SDB_TYPE (T_MOE); + PUT_SDB_ENDEF; + } + } } else /* record or union type */ for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem)) @@ -1228,10 +1241,10 @@ sdbout_one_type (tree type) PUT_SDB_SIZE (size); PUT_SDB_ENDEF; break; - - default: - break; } + + default: + break; } } @@ -1251,7 +1264,10 @@ static void sdbout_parms (tree parms) { for (; parms; parms = TREE_CHAIN (parms)) - if (DECL_NAME (parms)) + if (DECL_NAME (parms) + && TREE_TYPE (parms) != error_mark_node + && DECL_RTL_SET_P (parms) + && DECL_INCOMING_RTL (parms)) { int current_sym_value = 0; const char *name = IDENTIFIER_POINTER (DECL_NAME (parms)); @@ -1262,9 +1278,9 @@ sdbout_parms (tree parms) /* 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); + = eliminate_regs (DECL_INCOMING_RTL (parms), VOIDmode, NULL_RTX); SET_DECL_RTL (parms, - eliminate_regs (DECL_RTL (parms), 0, NULL_RTX)); + eliminate_regs (DECL_RTL (parms), VOIDmode, NULL_RTX)); if (PARM_PASSED_IN_MEMORY (parms)) { @@ -1276,7 +1292,7 @@ sdbout_parms (tree parms) If that is not true, we produce meaningless results, but do not crash. */ if (GET_CODE (addr) == PLUS - && GET_CODE (XEXP (addr, 1)) == CONST_INT) + && CONST_INT_P (XEXP (addr, 1))) current_sym_value = INTVAL (XEXP (addr, 1)); else current_sym_value = 0; @@ -1383,7 +1399,10 @@ static void sdbout_reg_parms (tree parms) { for (; parms; parms = TREE_CHAIN (parms)) - if (DECL_NAME (parms)) + if (DECL_NAME (parms) + && TREE_TYPE (parms) != error_mark_node + && DECL_RTL_SET_P (parms) + && DECL_INCOMING_RTL (parms)) { const char *name = IDENTIFIER_POINTER (DECL_NAME (parms)); @@ -1404,7 +1423,7 @@ sdbout_reg_parms (tree parms) /* Report parms that live in memory but not where they were passed. */ else if (MEM_P (DECL_RTL (parms)) && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS - && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT + && CONST_INT_P (XEXP (XEXP (DECL_RTL (parms), 0), 1)) && PARM_PASSED_IN_MEMORY (parms) && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms))) { @@ -1450,7 +1469,7 @@ sdbout_global_decl (tree decl) if (!DECL_INITIAL (decl) || !TREE_PUBLIC (decl)) sdbout_symbol (decl, 0); else - VARRAY_PUSH_TREE (deferred_global_decls, decl); + VEC_safe_push (tree, gc, deferred_global_decls, decl); /* Output COFF information for non-global file-scope initialized variables. */ @@ -1466,9 +1485,10 @@ static void sdbout_finish (const char *main_filename ATTRIBUTE_UNUSED) { size_t i; + tree decl; - for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_global_decls); i++) - sdbout_symbol (VARRAY_TREE (deferred_global_decls, i), 0); + FOR_EACH_VEC_ELT (tree, deferred_global_decls, i, decl) + sdbout_symbol (decl, 0); } /* Describe the beginning of an internal block within a function. @@ -1532,7 +1552,9 @@ sdbout_end_block (unsigned int line, unsigned int n ATTRIBUTE_UNUSED) number LINE. */ static void -sdbout_source_line (unsigned int line, const char *filename ATTRIBUTE_UNUSED) +sdbout_source_line (unsigned int line, const char *filename ATTRIBUTE_UNUSED, + int discriminator ATTRIBUTE_UNUSED, + bool is_stmt ATTRIBUTE_UNUSED) { /* COFF relative line numbers must be positive. */ if ((int) line > sdb_begin_function_line) @@ -1636,7 +1658,7 @@ sdbout_start_source_file (unsigned int line ATTRIBUTE_UNUSED, const char *filename ATTRIBUTE_UNUSED) { #ifdef MIPS_DEBUGGING_INFO - struct sdb_file *n = xmalloc (sizeof *n); + struct sdb_file *n = XNEW (struct sdb_file); n->next = current_file; n->name = filename; @@ -1668,12 +1690,12 @@ sdbout_init (const char *input_file_name ATTRIBUTE_UNUSED) tree t; #ifdef MIPS_DEBUGGING_INFO - current_file = xmalloc (sizeof *current_file); + current_file = XNEW (struct sdb_file); current_file->next = NULL; current_file->name = input_file_name; #endif - VARRAY_TREE_INIT (deferred_global_decls, 12, "deferred_global_decls"); + deferred_global_decls = VEC_alloc (tree, gc, 12); /* Emit debug information which was queued by sdbout_symbol before we got here. */ @@ -1684,11 +1706,6 @@ sdbout_init (const char *input_file_name ATTRIBUTE_UNUSED) preinit_symbols = 0; } -#else /* SDB_DEBUGGING_INFO */ - -/* This should never be used, but its address is needed for comparisons. */ -const struct gcc_debug_hooks sdb_debug_hooks; - #endif /* SDB_DEBUGGING_INFO */ #include "gt-sdbout.h"