From 0bedf4fb30066e5e1d4342a1d3914dae7d37cba7 Mon Sep 17 00:00:00 2001 From: obrien Date: Thu, 26 Aug 1999 09:30:50 +0000 Subject: Virgin import of gcc from EGCS 1.1.2 --- contrib/gcc/sdbout.c | 196 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 154 insertions(+), 42 deletions(-) (limited to 'contrib/gcc/sdbout.c') diff --git a/contrib/gcc/sdbout.c b/contrib/gcc/sdbout.c index 8fdb72c..62559a9 100644 --- a/contrib/gcc/sdbout.c +++ b/contrib/gcc/sdbout.c @@ -1,5 +1,5 @@ /* Output sdb-format symbol table information from GNU compiler. - Copyright (C) 1988, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1988, 92-97, 1998 Free Software Foundation, Inc. This file is part of GNU CC. @@ -44,25 +44,30 @@ AT&T C compiler. From the example below I would conclude the following: #ifdef SDB_DEBUGGING_INFO +#include "system.h" #include "tree.h" #include "rtl.h" -#include #include "regs.h" +#include "defaults.h" #include "flags.h" #include "insn-config.h" #include "reload.h" +#include "output.h" +#include "toplev.h" -/* Mips systems use the SDB functions to dump out symbols, but - do not supply usable syms.h include files. */ -#if defined(USG) && !defined(MIPS) && !defined (hpux) && !defined(_WIN32) && !defined(__linux__) +/* Mips systems use the SDB functions to dump out symbols, but do not + supply usable syms.h include files. Which syms.h file to use is a + target parameter so don't use the native one if we're cross compiling. */ + +#if defined(USG) && !defined(MIPS) && !defined (hpux) && !defined(_WIN32) && !defined(__linux__) && !defined(CROSS_COMPILE) #include /* Use T_INT if we don't have T_VOID. */ #ifndef T_VOID #define T_VOID T_INT #endif -#else /* not USG, or MIPS */ +#else #include "gsyms.h" -#endif /* not USG, or MIPS */ +#endif /* #include used to be this instead of syms.h. */ @@ -97,16 +102,22 @@ extern FILE *asm_out_file; extern tree current_function_decl; -void sdbout_init (); -void sdbout_symbol (); -void sdbout_types(); - -static void sdbout_typedefs (); -static void sdbout_syms (); -static void sdbout_one_type (); -static void sdbout_queue_anonymous_type (); -static void sdbout_dequeue_anonymous_types (); -static int plain_type_1 (); +#include "sdbout.h" + +static char *gen_fake_label PROTO((void)); +static int plain_type PROTO((tree)); +static int template_name_p PROTO((tree)); +static void sdbout_record_type_name PROTO((tree)); +static int plain_type_1 PROTO((tree, int)); +static void sdbout_block PROTO((tree)); +static void sdbout_syms PROTO((tree)); +static void sdbout_queue_anonymous_type PROTO((tree)); +static void sdbout_dequeue_anonymous_types PROTO((void)); +static void sdbout_type PROTO((tree)); +static void sdbout_field_types PROTO((tree)); +static void sdbout_one_type PROTO((tree)); +static void sdbout_parms PROTO((tree)); +static void sdbout_reg_parms PROTO((tree)); /* Define the default sizes for various types. */ @@ -162,7 +173,13 @@ static int plain_type_1 (); #endif #ifndef PUT_SDB_INT_VAL -#define PUT_SDB_INT_VAL(a) fprintf (asm_out_file, "\t.val\t%d%s", (a), SDB_DELIM) +#define PUT_SDB_INT_VAL(a) \ + do { \ + fputs ("\t.val\t", asm_out_file); \ + fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(a)); \ + fprintf (asm_out_file, "%s", SDB_DELIM); \ + } while (0) + #endif #ifndef PUT_SDB_VAL @@ -192,7 +209,12 @@ do { fprintf (asm_out_file, "\t.def\t"); \ #endif #ifndef PUT_SDB_SIZE -#define PUT_SDB_SIZE(a) fprintf(asm_out_file, "\t.size\t%d%s", a, SDB_DELIM) +#define PUT_SDB_SIZE(a) \ + do { \ + fputs ("\t.size\t", asm_out_file); \ + fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(a)); \ + fprintf (asm_out_file, "%s", SDB_DELIM); \ + } while(0) #endif #ifndef PUT_SDB_START_DIM @@ -277,6 +299,38 @@ do { fprintf (asm_out_file, "\t.def\t"); \ /* Ensure we don't output a negative line number. */ #define MAKE_LINE_SAFE(line) \ if (line <= sdb_begin_function_line) line = sdb_begin_function_line + 1 + +/* Perform linker optimization of merging header file definitions together + for targets with MIPS_DEBUGGING_INFO defined. This won't work without a + post 960826 version of GAS. Nothing breaks with earlier versions of GAS, + the optimization just won't be done. The native assembler already has the + necessary support. */ + +#ifdef MIPS_DEBUGGING_INFO + +#ifndef PUT_SDB_SRC_FILE +#define PUT_SDB_SRC_FILE(FILENAME) \ +output_file_directive (asm_out_file, (FILENAME)) +#endif + +/* ECOFF linkers have an optimization that does the same kind of thing as + N_BINCL/E_INCL in stabs: eliminate duplicate debug information in the + executable. To achieve this, GCC must output a .file for each file + name change. */ + +/* This is a stack of input files. */ + +struct sdb_file +{ + struct sdb_file *next; + char *name; +}; + +/* This is the top of the stack. */ + +static struct sdb_file *current_file; + +#endif /* MIPS_DEBUGGING_INFO */ /* Set up for SDB output at the start of compilation. */ @@ -286,6 +340,12 @@ sdbout_init (asm_file, input_file_name, syms) char *input_file_name; tree syms; { +#ifdef MIPS_DEBUGGING_INFO + current_file = (struct sdb_file *) xmalloc (sizeof *current_file); + current_file->next = NULL; + current_file->name = input_file_name; +#endif + #ifdef RMS_QUICK_HACK_1 tree t; for (t = syms; t; t = TREE_CHAIN (t)) @@ -293,13 +353,6 @@ sdbout_init (asm_file, input_file_name, syms) && !strcmp (IDENTIFIER_POINTER (DECL_NAME (t)), "__vtbl_ptr_type")) sdbout_symbol (t, 0); #endif - -#if 0 /* Nothing need be output for the predefined types. */ - /* Get all permanent types that have typedef names, - and output them all, except for those already output. */ - - sdbout_typedefs (syms); -#endif } #if 0 @@ -489,10 +542,14 @@ plain_type_1 (type, level) { char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); + if (!strcmp (name, "char")) + return T_CHAR; if (!strcmp (name, "unsigned char")) return T_UCHAR; if (!strcmp (name, "signed char")) return T_CHAR; + if (!strcmp (name, "int")) + return T_INT; if (!strcmp (name, "unsigned int")) return T_UINT; if (!strcmp (name, "short int")) @@ -505,12 +562,12 @@ plain_type_1 (type, level) return T_ULONG; } + if (size == INT_TYPE_SIZE) + return (TREE_UNSIGNED (type) ? T_UINT : T_INT); if (size == CHAR_TYPE_SIZE) return (TREE_UNSIGNED (type) ? T_UCHAR : T_CHAR); if (size == SHORT_TYPE_SIZE) return (TREE_UNSIGNED (type) ? T_USHORT : T_SHORT); - if (size == INT_TYPE_SIZE) - return (TREE_UNSIGNED (type) ? T_UINT : T_INT); if (size == LONG_TYPE_SIZE) return (TREE_UNSIGNED (type) ? T_ULONG : T_LONG); if (size == LONG_LONG_TYPE_SIZE) /* better than nothing */ @@ -520,11 +577,18 @@ plain_type_1 (type, level) case REAL_TYPE: { - int size = int_size_in_bytes (type) * BITS_PER_UNIT; - if (size == FLOAT_TYPE_SIZE) + int precision = TYPE_PRECISION (type); + if (precision == FLOAT_TYPE_SIZE) return T_FLOAT; - if (size == DOUBLE_TYPE_SIZE) + if (precision == DOUBLE_TYPE_SIZE) return T_DOUBLE; +#ifdef EXTENDED_SDB_BASIC_TYPES + if (precision == LONG_DOUBLE_TYPE_SIZE) + return T_LNGDBL; +#else + if (precision == LONG_DOUBLE_TYPE_SIZE) + return T_DOUBLE; /* better than nothing */ +#endif return 0; } @@ -538,7 +602,11 @@ plain_type_1 (type, level) if (sdb_n_dims < SDB_MAX_DIM) sdb_dims[sdb_n_dims++] = (TYPE_DOMAIN (type) - ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1 + && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) + && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST + && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST + ? (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1) : 0); return PUSH_DERIVED_LEVEL (DT_ARY, m); } @@ -564,8 +632,8 @@ plain_type_1 (type, level) only if the .def has already been finished. At least on 386, the Unix assembler cannot handle forward references to tags. */ - /* But the 88100, it requires them, sigh... */ - /* And the MIPS requires unknown refs as well... */ + /* But the 88100, it requires them, sigh... */ + /* And the MIPS requires unknown refs as well... */ tag = KNOWN_TYPE_TAG (type); PUT_SDB_TAG (tag); /* These 3 lines used to follow the close brace. @@ -691,7 +759,10 @@ sdbout_symbol (decl, local) context = decl_function_context (decl); if (context == current_function_decl) return; - if (DECL_EXTERNAL (decl)) + /* Check DECL_INITIAL to distinguish declarations from definitions. + Don't output debug info here for declarations; they will have + a DECL_INITIAL value of 0. */ + if (! DECL_INITIAL (decl)) return; if (GET_CODE (DECL_RTL (decl)) != MEM || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF) @@ -898,6 +969,9 @@ sdbout_symbol (decl, local) return; } break; + + default: + break; } PUT_SDB_TYPE (plain_type (type)); PUT_SDB_ENDEF; @@ -936,7 +1010,7 @@ sdbout_toplevel_data (decl) #ifdef SDB_ALLOW_FORWARD_REFERENCES -/* Machinery to record and output anonymous types. */ +/* Machinery to record and output anonymous types. */ static tree anonymous_types; @@ -1006,8 +1080,9 @@ sdbout_field_types (type) tree type; { tree tail; + for (tail = TYPE_FIELDS (type); tail; tail = TREE_CHAIN (tail)) - if (TREE_CODE (TREE_TYPE (tail)) == POINTER_TYPE) + if (POINTER_TYPE_P (TREE_TYPE (tail))) sdbout_one_type (TREE_TYPE (TREE_TYPE (tail))); else sdbout_one_type (TREE_TYPE (tail)); @@ -1113,6 +1188,9 @@ sdbout_one_type (type) PUT_SDB_TYPE (T_ENUM); member_scl = C_MOE; break; + + default: + break; } PUT_SDB_SIZE (size); @@ -1205,6 +1283,9 @@ sdbout_one_type (type) PUT_SDB_SIZE (size); PUT_SDB_ENDEF; break; + + default: + break; } } } @@ -1236,8 +1317,8 @@ sdbout_parms (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); + DECL_INCOMING_RTL (parms) + = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX); DECL_RTL (parms) = eliminate_regs (DECL_RTL (parms), 0, NULL_RTX); if (PARM_PASSED_IN_MEMORY (parms)) @@ -1315,7 +1396,7 @@ sdbout_parms (parms) PUT_SDB_DEF (name); PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (REGNO (best_rtl))); PUT_SDB_SCL (C_REGPARM); - PUT_SDB_TYPE (plain_type (TREE_TYPE (parms), 0)); + PUT_SDB_TYPE (plain_type (TREE_TYPE (parms))); PUT_SDB_ENDEF; } else if (GET_CODE (DECL_RTL (parms)) == MEM @@ -1338,7 +1419,7 @@ sdbout_parms (parms) PUT_SDB_INT_VAL (DEBUGGER_ARG_OFFSET (current_sym_value, XEXP (DECL_RTL (parms), 0))); PUT_SDB_SCL (C_ARG); - PUT_SDB_TYPE (plain_type (TREE_TYPE (parms), 0)); + PUT_SDB_TYPE (plain_type (TREE_TYPE (parms))); PUT_SDB_ENDEF; } } @@ -1376,7 +1457,7 @@ sdbout_reg_parms (parms) PUT_SDB_DEF (name); PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms)))); PUT_SDB_SCL (C_REG); - PUT_SDB_TYPE (plain_type (TREE_TYPE (parms), 0)); + PUT_SDB_TYPE (plain_type (TREE_TYPE (parms))); PUT_SDB_ENDEF; } /* Report parms that live in memory but not where they were passed. */ @@ -1544,4 +1625,35 @@ sdbout_label (insn) PUT_SDB_ENDEF; } +/* Change to reading from a new source file. */ + +void +sdbout_start_new_source_file (filename) + char *filename; +{ +#ifdef MIPS_DEBUGGING_INFO + struct sdb_file *n = (struct sdb_file *) xmalloc (sizeof *n); + + n->next = current_file; + n->name = filename; + current_file = n; + PUT_SDB_SRC_FILE (filename); +#endif +} + +/* Revert to reading a previous source file. */ + +void +sdbout_resume_previous_source_file () +{ +#ifdef MIPS_DEBUGGING_INFO + struct sdb_file *next; + + next = current_file->next; + free (current_file); + current_file = next; + PUT_SDB_SRC_FILE (current_file->name); +#endif +} + #endif /* SDB_DEBUGGING_INFO */ -- cgit v1.1