/* 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
   Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.  */


/* Output dbx-format symbol table data.
   This consists of many symbol table entries, each of them
   a .stabs assembler pseudo-op with four operands:
   a "name" which is really a description of one symbol and its type,
   a "code", which is a symbol defined in stab.h whose name starts with N_,
   an unused operand always 0,
   and a "value" which is an address or an offset.
   The name is enclosed in doublequote characters.

   Each function, variable, typedef, and structure tag
   has a symbol table entry to define it.
   The beginning and end of each level of name scoping within
   a function are also marked by special symbol table entries.

   The "name" consists of the symbol name, a colon, a kind-of-symbol letter,
   and a data type number.  The data type number may be followed by
   "=" and a type definition; normally this will happen the first time
   the type number is mentioned.  The type definition may refer to
   other types by number, and those type numbers may be followed
   by "=" and nested definitions.

   This can make the "name" quite long.
   When a name is more than 80 characters, we split the .stabs pseudo-op
   into two .stabs pseudo-ops, both sharing the same "code" and "value".
   The first one is marked as continued with a double-backslash at the
   end of its "name".

   The kind-of-symbol letter distinguished function names from global
   variables from file-scope variables from parameters from auto
   variables in memory from typedef names from register variables.
   See `dbxout_symbol'.

   The "code" is mostly redundant with the kind-of-symbol letter
   that goes in the "name", but not entirely: for symbols located
   in static storage, the "code" says which segment the address is in,
   which controls how it is relocated.

   The "value" for a symbol in static storage
   is the core address of the symbol (actually, the assembler
   label for the symbol).  For a symbol located in a stack slot
   it is the stack offset; for one in a register, the register number.
   For a typedef symbol, it is zero.

   If DEBUG_SYMS_TEXT is defined, all debugging symbols must be
   output while in the text section.

   For more on data type definitions, see `dbxout_type'.  */

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"

#include "tree.h"
#include "rtl.h"
#include "flags.h"
#include "regs.h"
#include "insn-config.h"
#include "reload.h"
#include "output.h"
#include "dbxout.h"
#include "toplev.h"
#include "tm_p.h"
#include "ggc.h"
#include "debug.h"
#include "function.h"
#include "target.h"
#include "langhooks.h"
#include "obstack.h"
#include "expr.h"

#ifdef XCOFF_DEBUGGING_INFO
#include "xcoffout.h"
#endif

#define DBXOUT_DECR_NESTING \
  if (--debug_nesting == 0 && symbol_queue_index > 0) \
    { emit_pending_bincls_if_required (); debug_flush_symbol_queue (); }

#define DBXOUT_DECR_NESTING_AND_RETURN(x) \
  do {--debug_nesting; return (x);} while (0)

#ifndef ASM_STABS_OP
# ifdef XCOFF_DEBUGGING_INFO
#  define ASM_STABS_OP "\t.stabx\t"
# else
#  define ASM_STABS_OP "\t.stabs\t"
# endif
#endif

#ifndef ASM_STABN_OP
#define ASM_STABN_OP "\t.stabn\t"
#endif

#ifndef ASM_STABD_OP
#define ASM_STABD_OP "\t.stabd\t"
#endif

#ifndef DBX_TYPE_DECL_STABS_CODE
#define DBX_TYPE_DECL_STABS_CODE N_LSYM
#endif

#ifndef DBX_STATIC_CONST_VAR_CODE
#define DBX_STATIC_CONST_VAR_CODE N_FUN
#endif

#ifndef DBX_REGPARM_STABS_CODE
#define DBX_REGPARM_STABS_CODE N_RSYM
#endif

#ifndef DBX_REGPARM_STABS_LETTER
#define DBX_REGPARM_STABS_LETTER 'P'
#endif

#ifndef NO_DBX_FUNCTION_END
#define NO_DBX_FUNCTION_END 0
#endif

#ifndef NO_DBX_BNSYM_ENSYM
#define NO_DBX_BNSYM_ENSYM 0
#endif

#ifndef NO_DBX_MAIN_SOURCE_DIRECTORY
#define NO_DBX_MAIN_SOURCE_DIRECTORY 0
#endif

#ifndef DBX_BLOCKS_FUNCTION_RELATIVE
#define DBX_BLOCKS_FUNCTION_RELATIVE 0
#endif

#ifndef DBX_LINES_FUNCTION_RELATIVE
#define DBX_LINES_FUNCTION_RELATIVE 0
#endif

#ifndef DBX_CONTIN_LENGTH
#define DBX_CONTIN_LENGTH 80
#endif

#ifndef DBX_CONTIN_CHAR
#define DBX_CONTIN_CHAR '\\'
#endif

/* APPLE LOCAL dbxout_type rewrite.  */
enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED, TYPE_QUEUED};

/* Structure recording information about a C data type.
   The status element says whether we have yet output
   the definition of the type.  TYPE_XREF says we have
   output it as a cross-reference only.
   The file_number and type_number elements are used if DBX_USE_BINCL
   is defined.  */

struct typeinfo GTY(())
{
  enum typestatus status;
  int file_number;
  int type_number;
  /* APPLE LOCAL dbxout_type rewrite.  */
  int q_type_number;
};

/* Vector recording information about C data types.
   When we first notice a data type (a tree node),
   we assign it a number using next_type_number.
   That is its index in this vector.  */

static GTY ((length ("typevec_len"))) struct typeinfo *typevec;

/* Number of elements of space allocated in `typevec'.  */

static GTY(()) int typevec_len;

/* In dbx output, each type gets a unique number.
   This is the number for the next type output.
   The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field.  */

static GTY(()) int next_type_number;

/* APPLE LOCAL begin dbxout_type rewrite.  */
struct  qualified_typeinfo GTY(())
{
  int pointer_type;
  int function_type;
  int reference_type;
  int const_type;
  int volatile_type;
};

static GTY ((length ("q_typevec_len"))) struct qualified_typeinfo *q_typevec;
static GTY(()) int q_typevec_len;
static GTY(()) int next_q_type_number;
static int dbxout_next_q_type_number (void);
/* APPLE LOCAL end dbxout_type rewrite.  */
/* The C front end may call dbxout_symbol before dbxout_init runs.
   We save all such decls in this list and output them when we get
   to dbxout_init.  */

static GTY(()) tree preinit_symbols;

/* APPLE LOCAL 4215975 */
static GTY(()) tree anon_place_holder;
enum binclstatus {BINCL_NOT_REQUIRED, BINCL_PENDING, BINCL_PROCESSED};

/* When using N_BINCL in dbx output, each type number is actually a
   pair of the file number and the type number within the file.
   This is a stack of input files.  */

struct dbx_file
{
  struct dbx_file *next;
  int file_number;
  int next_type_number;
  enum binclstatus bincl_status;  /* Keep track of lazy bincl.  */
  const char *pending_bincl_name; /* Name of bincl.  */
  struct dbx_file *prev;          /* Chain to traverse all pending bincls.  */
};

/* 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
   should always be 0 because we should not have needed any file numbers
   yet.  */

#if (defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)) \
    && defined (DBX_USE_BINCL)
static struct dbx_file *current_file;
#endif

/* APPLE LOCAL begin ss2 */
/* This is the output file used by dbxout routines.  */
static FILE *dbx_out_file;
/* APPLE LOCAL end ss2 */
/* This is the next file number to use.  */

static GTY(()) int next_file_number;

/* A counter for dbxout_function_end.  */

static GTY(()) int scope_labelno;

/* A counter for dbxout_source_line.  */

static GTY(()) int dbxout_source_line_counter;

/* Number for the next N_SOL filename stabs label.  The number 0 is reserved
   for the N_SO filename stabs label.  */

static GTY(()) int source_label_number = 1;

/* Last source file name mentioned in a NOTE insn.  */

static GTY(()) const char *lastfile;

/* Used by PCH machinery to detect if 'lastfile' should be reset to
   base_input_file.  */
static GTY(()) int lastfile_is_base;

/* Typical USG systems don't have stab.h, and they also have
   no use for DBX-format debugging info.  */

#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)

#ifdef DBX_USE_BINCL
/* If zero then there is no pending BINCL.  */
static int pending_bincls = 0;
#endif

/* The original input file name.  */
static const char *base_input_file;

#ifdef DEBUG_SYMS_TEXT
#define FORCE_TEXT switch_to_section (current_function_section ())
#else
#define FORCE_TEXT
#endif

#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) \
 (MEM_P (DECL_INCOMING_RTL (PARM)))

/* A C expression for the integer offset value of an automatic variable
   (N_LSYM) having address X (an RTX).  */
#ifndef DEBUGGER_AUTO_OFFSET
#define DEBUGGER_AUTO_OFFSET(X) \
  (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
#endif

/* A C expression for the integer offset value of an argument (N_PSYM)
   having address X (an RTX).  The nominal offset is OFFSET.  */
#ifndef DEBUGGER_ARG_OFFSET
#define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
#endif

/* This obstack holds the stab string currently being constructed.  We
   build it up here, then write it out, so we can split long lines up
   properly (see dbxout_finish_complex_stabs).  */
static struct obstack stabstr_ob;
static size_t stabstr_last_contin_point;

#ifdef DBX_USE_BINCL
static void emit_bincl_stab             (const char *c);
static void emit_pending_bincls         (void);
#endif
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);
static void dbxout_typedefs (tree);
static void dbxout_type_index (tree);
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);
/* APPLE LOCAL begin dbxout_type rewrite.  */
static bool dbxout_type (tree, int);
static bool dbxout_partial_type (tree, tree);
static void dbxout_complete_type (tree, tree);
static void dbxout_type_xref (tree);
static void dbxout_pointer_type (tree);
static void dbxout_void_type (tree);
static void dbxout_integer_type (tree);
static void dbxout_real_type (tree);
static void dbxout_boolean_type (tree);
static void dbxout_complex_type (tree);
static void dbxout_function_type (tree);
static void dbxout_reference_type (tree);
static int dbxout_reusable_type (tree);
static void dbxout_note_q_type (tree);
static void dbxout_next_type_number (tree);
#ifdef DBX_NO_XREFS
static bool dbxout_cross_ref_type_p (tree);
#endif
static void dbxout_type_with_name (tree);
static void dbxout_queue_type (tree);
static void dbxout_free_type_queue (void);
/* APPLE LOCAL end dbxout_type rewrite.  */
static bool print_int_cst_bounds_in_octal_p (tree);
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_block (tree, int, tree);
static void dbxout_global_decl (tree);
static void dbxout_type_decl (tree, int);
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_begin_prologue (unsigned int, const char *);
static void dbxout_source_file (const char *);
static void dbxout_function_end (tree);
static void dbxout_begin_function (tree);
static void dbxout_begin_block (unsigned, unsigned);
static void dbxout_end_block (unsigned, unsigned);
static void dbxout_function_decl (tree);

const struct gcc_debug_hooks dbx_debug_hooks =
{
  dbxout_init,
  dbxout_finish,
  debug_nothing_int_charstar,
  debug_nothing_int_charstar,
  dbxout_start_source_file,
  dbxout_end_source_file,
  dbxout_begin_block,
  dbxout_end_block,
  debug_true_tree,		         /* ignore_block */
  dbxout_source_line,		         /* source_line */
  dbxout_begin_prologue,	         /* begin_prologue */
  debug_nothing_int_charstar,	         /* end_prologue */
  debug_nothing_int_charstar,	         /* end_epilogue */
#ifdef DBX_FUNCTION_FIRST
  dbxout_begin_function,
#else
  debug_nothing_tree,		         /* begin_function */
#endif
  debug_nothing_int,		         /* end_function */
  dbxout_function_decl,
  dbxout_global_decl,		         /* global_decl */
  dbxout_type_decl,			 /* type_decl */
  debug_nothing_tree_tree,               /* imported_module_or_decl */
  debug_nothing_tree,		         /* deferred_inline_function */
  debug_nothing_tree,		         /* outlining_inline_function */
  debug_nothing_rtx,		         /* label */
  dbxout_handle_pch,		         /* handle_pch */
  debug_nothing_rtx,		         /* var_location */
  /* APPLE LOCAL opt diary */
  debug_nothing_od_msg_loc,              /* Optimization Diary Entry */
  debug_nothing_void,                    /* switch_text_section */
  0                                      /* start_end_main_source_file */
};
#endif /* DBX_DEBUGGING_INFO  */

#if defined (XCOFF_DEBUGGING_INFO)
const struct gcc_debug_hooks xcoff_debug_hooks =
{
  dbxout_init,
  dbxout_finish,
  debug_nothing_int_charstar,
  debug_nothing_int_charstar,
  dbxout_start_source_file,
  dbxout_end_source_file,
  xcoffout_begin_block,
  xcoffout_end_block,
  debug_true_tree,		         /* ignore_block */
  xcoffout_source_line,
  xcoffout_begin_prologue,	         /* begin_prologue */
  debug_nothing_int_charstar,	         /* end_prologue */
  xcoffout_end_epilogue,
  debug_nothing_tree,		         /* begin_function */
  xcoffout_end_function,
  debug_nothing_tree,		         /* function_decl */
  dbxout_global_decl,		         /* global_decl */
  dbxout_type_decl,			 /* type_decl */
  debug_nothing_tree_tree,               /* imported_module_or_decl */
  debug_nothing_tree,		         /* deferred_inline_function */
  debug_nothing_tree,		         /* outlining_inline_function */
  debug_nothing_rtx,		         /* label */
  dbxout_handle_pch,		         /* handle_pch */
  debug_nothing_rtx,		         /* var_location */
  /* APPLE LOCAL opt diary */
  debug_nothing_od_msg_loc,              /* Optimization Diary Entry */
  debug_nothing_void,                    /* switch_text_section */
  0                                      /* start_end_main_source_file */
};
#endif /* XCOFF_DEBUGGING_INFO  */

/* Numeric formatting helper macro.  Note that this does not handle
   hexadecimal.  */
#define NUMBER_FMT_LOOP(P, NUM, BASE)		\
  do						\
    {						\
      int digit = NUM % BASE;			\
      NUM /= BASE;				\
      *--P = digit + '0';			\
    }						\
  while (NUM > 0)

/* APPLE LOCAL ss2 */
/* Utility: write a decimal integer NUM to dbx_out_file.  */
void
dbxout_int (int num)
{
  char buf[64];
  char *p = buf + sizeof buf;
  unsigned int unum;

  if (num == 0)
    {
      /* APPLE LOCAL ss2 */
      putc ('0', dbx_out_file);
      return;
    }
  if (num < 0)
    {
      /* APPLE LOCAL ss2 */
      putc ('-', dbx_out_file);
      unum = -num;
    }
  else
    unum = num;

  NUMBER_FMT_LOOP (p, unum, 10);

  while (p < buf + sizeof buf)
    {
      /* APPLE LOCAL ss2 */
      putc (*p, dbx_out_file);
      p++;
    }
}


/* Primitives for emitting simple stabs directives.  All other stabs
   routines should use these functions instead of directly emitting
   stabs.  They are exported because machine-dependent code may need
   to invoke them, e.g. in a DBX_OUTPUT_* macro whose definition
   forwards to code in CPU.c.  */

/* The following functions should all be called immediately after one
   of the dbxout_begin_stab* functions (below).  They write out
   various things as the value of a stab.  */

/* Write out a literal zero as the value of a stab.  */
void
dbxout_stab_value_zero (void)
{
  /* APPLE LOCAL ss2 */
  fputs ("0\n", dbx_out_file);
}

/* Write out the label LABEL as the value of a stab.  */
void
dbxout_stab_value_label (const char *label)
{
  /* APPLE LOCAL begin ss2 */
  assemble_name (dbx_out_file, label);
  putc ('\n', dbx_out_file);
  /* APPLE LOCAL end ss2 */
}

/* Write out the difference of two labels, LABEL - BASE, as the value
   of a stab.  */
void
dbxout_stab_value_label_diff (const char *label, const char *base)
{
  /* APPLE LOCAL begin ss2 */
  assemble_name (dbx_out_file, label);
  putc ('-', dbx_out_file);
  assemble_name (dbx_out_file, base);
  putc ('\n', dbx_out_file);
  /* APPLE LOCAL end ss2 */
}

/* Write out an internal label as the value of a stab, and immediately
   emit that internal label.  This should be used only when
   dbxout_stabd will not work.  STEM is the name stem of the label,
   COUNTERP is a pointer to a counter variable which will be used to
   guarantee label uniqueness.  */
void
dbxout_stab_value_internal_label (const char *stem, int *counterp)
{
  char label[100];
  int counter = counterp ? (*counterp)++ : 0;

  ASM_GENERATE_INTERNAL_LABEL (label, stem, counter);
  dbxout_stab_value_label (label);
  /* APPLE LOCAL ss2 */
  targetm.asm_out.internal_label (dbx_out_file, stem, counter);
}

/* Write out the difference between BASE and an internal label as the
   value of a stab, and immediately emit that internal label.  STEM and
   COUNTERP are as for dbxout_stab_value_internal_label.  */
void
dbxout_stab_value_internal_label_diff (const char *stem, int *counterp,
				       const char *base)
{
  char label[100];
  int counter = counterp ? (*counterp)++ : 0;

  ASM_GENERATE_INTERNAL_LABEL (label, stem, counter);
  dbxout_stab_value_label_diff (label, base);
  /* APPLE LOCAL ss2 */
  targetm.asm_out.internal_label (dbx_out_file, stem, counter);
}

/* The following functions produce specific kinds of stab directives.  */

/* APPLE LOCAL ss2 */
/* Write a .stabd directive with type STYPE and desc SDESC to dbx_out_file.  */
void
dbxout_stabd (int stype, int sdesc)
{
  /* APPLE LOCAL ss2 */
  fputs (ASM_STABD_OP, dbx_out_file);
  dbxout_int (stype);
  /* APPLE LOCAL ss2 */
  fputs (",0,", dbx_out_file);
  dbxout_int (sdesc);
  /* APPLE LOCAL ss2 */
  putc ('\n', dbx_out_file);
}

/* Write a .stabn directive with type STYPE.  This function stops
   short of emitting the value field, which is the responsibility of
   the caller (normally it will be either a symbol or the difference
   of two symbols).  */

void
dbxout_begin_stabn (int stype)
{
  /* APPLE LOCAL ss2 */
  fputs (ASM_STABN_OP, dbx_out_file);
  dbxout_int (stype);
  /* APPLE LOCAL ss2 */
  fputs (",0,0,", dbx_out_file);
}

/* Write a .stabn directive with type N_SLINE and desc LINE.  As above,
   the value field is the responsibility of the caller.  */
void
dbxout_begin_stabn_sline (int lineno)
{
  /* APPLE LOCAL ss2 */
  fputs (ASM_STABN_OP, dbx_out_file);
  dbxout_int (N_SLINE);
  /* APPLE LOCAL ss2 */
  fputs (",0,", dbx_out_file);
  dbxout_int (lineno);
  /* APPLE LOCAL ss2 */
  putc (',', dbx_out_file);
}

/* Begin a .stabs directive with string "", type STYPE, and desc and
   other fields 0.  The value field is the responsibility of the
   caller.  This function cannot be used for .stabx directives.  */
void
dbxout_begin_empty_stabs (int stype)
{
  /* APPLE LOCAL begin ss2 */
  fputs (ASM_STABS_OP, dbx_out_file);
  fputs ("\"\",", dbx_out_file);
  /* APPLE LOCAL end ss2 */
  dbxout_int (stype);
  /* APPLE LOCAL ss2 */
  fputs (",0,0,", dbx_out_file);
}

/* Begin a .stabs directive with string STR, type STYPE, and desc 0.
   The value field is the responsibility of the caller.  */
void
dbxout_begin_simple_stabs (const char *str, int stype)
{
  /* APPLE LOCAL begin ss2 */
  fputs (ASM_STABS_OP, dbx_out_file);
  output_quoted_string (dbx_out_file, str);
  putc (',', dbx_out_file);
  /* APPLE LOCAL end ss2 */
  dbxout_int (stype);
  /* APPLE LOCAL ss2 */
  fputs (",0,0,", dbx_out_file);
}

/* As above but use SDESC for the desc field.  */
void
dbxout_begin_simple_stabs_desc (const char *str, int stype, int sdesc)
{
  /* APPLE LOCAL begin ss2 */
  fputs (ASM_STABS_OP, dbx_out_file);
  output_quoted_string (dbx_out_file, str);
  putc (',', dbx_out_file);
  /* APPLE LOCAL end ss2 */
  dbxout_int (stype);
  /* APPLE LOCAL ss2 */
  fputs (",0,", dbx_out_file);
  dbxout_int (sdesc);
  /* APPLE LOCAL ss2 */
  putc (',', dbx_out_file);
}

/* The next set of functions are entirely concerned with production of
   "complex" .stabs directives: that is, .stabs directives whose
   strings have to be constructed piecemeal.  dbxout_type,
   dbxout_symbol, etc. use these routines heavily.  The string is queued
   up in an obstack, then written out by dbxout_finish_complex_stabs, which
   is also responsible for splitting it up if it exceeds DBX_CONTIN_LENGTH.
   (You might think it would be more efficient to go straight to stdio
   when DBX_CONTIN_LENGTH is 0 (i.e. no length limit) but that turns
   out not to be the case, and anyway this needs fewer #ifdefs.)  */

/* Begin a complex .stabs directive.  If we can, write the initial
   APPLE LOCAL ss2
   ASM_STABS_OP to the dbx_out_file.  */

static void
dbxout_begin_complex_stabs (void)
{
  emit_pending_bincls_if_required ();
  FORCE_TEXT;
  /* APPLE LOCAL ss2 */
  fputs (ASM_STABS_OP, dbx_out_file);
  /* APPLE LOCAL ss2 */
  putc ('"', dbx_out_file);
  gcc_assert (stabstr_last_contin_point == 0);
}

/* As above, but do not force text or emit pending bincls.  This is
   used by dbxout_symbol_location, which needs to do something else.  */
static void
dbxout_begin_complex_stabs_noforcetext (void)
{
  /* APPLE LOCAL ss2 */
  fputs (ASM_STABS_OP, dbx_out_file);
  /* APPLE LOCAL ss2 */
  putc ('"', dbx_out_file);
  gcc_assert (stabstr_last_contin_point == 0);
}

/* Add CHR, a single character, to the string being built.  */
#define stabstr_C(chr) obstack_1grow (&stabstr_ob, chr)

/* Add STR, a normal C string, to the string being built.  */
#define stabstr_S(str) obstack_grow (&stabstr_ob, str, strlen(str))

/* Add the text of ID, an IDENTIFIER_NODE, to the string being built.  */
/* APPLE LOCAL begin 4310696 */
static void
stabstr_I (tree id)
{

  if ((strcmp (lang_hooks.name, "GNU C++") == 0
       || strcmp (lang_hooks.name, "GNU Objective-C++") == 0)
      && IDENTIFIER_LENGTH (id) > 2
      && strncmp ("$_", IDENTIFIER_POINTER (id), 2) == 0)
    obstack_grow (&stabstr_ob, "$_", 2);
  else  
      obstack_grow (&stabstr_ob, IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id));
}
/* APPLE LOCAL end 4310696 */
/* Add NUM, a signed decimal number, to the string being built.  */
static void
stabstr_D (HOST_WIDE_INT num)
{
  char buf[64];
  char *p = buf + sizeof buf;
  unsigned int unum;

  if (num == 0)
    {
      stabstr_C ('0');
      return;
    }
  if (num < 0)
    {
      stabstr_C ('-');
      unum = -num;
    }
  else
    unum = num;

  NUMBER_FMT_LOOP (p, unum, 10);

  obstack_grow (&stabstr_ob, p, (buf + sizeof buf) - p);
}

/* Add NUM, an unsigned decimal number, to the string being built.  */
static void
stabstr_U (unsigned HOST_WIDE_INT num)
{
  char buf[64];
  char *p = buf + sizeof buf;
  if (num == 0)
    {
      stabstr_C ('0');
      return;
    }
  NUMBER_FMT_LOOP (p, num, 10);
  obstack_grow (&stabstr_ob, p, (buf + sizeof buf) - p);
}

/* Add CST, an INTEGER_CST tree, to the string being built as an
   unsigned octal number.  This routine handles values which are
   larger than a single HOST_WIDE_INT.  */
static void
stabstr_O (tree cst)
{
  unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (cst);
  unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (cst);

  char buf[128];
  char *p = buf + sizeof buf;

  /* GDB wants constants with no extra leading "1" bits, so
     we need to remove any sign-extension that might be
     present.  */
  {
    const unsigned int width = TYPE_PRECISION (TREE_TYPE (cst));
    if (width == HOST_BITS_PER_WIDE_INT * 2)
      ;
    else if (width > HOST_BITS_PER_WIDE_INT)
      high &= (((HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT)) - 1);
    else if (width == HOST_BITS_PER_WIDE_INT)
      high = 0;
    else
      high = 0, low &= (((HOST_WIDE_INT) 1 << width) - 1);
  }

  /* Leading zero for base indicator.  */
  stabstr_C ('0');

  /* If the value is zero, the base indicator will serve as the value
     all by itself.  */
  if (high == 0 && low == 0)
    return;

  /* If the high half is zero, we need only print the low half normally.  */
  if (high == 0)
    NUMBER_FMT_LOOP (p, low, 8);
  else
    {
      /* When high != 0, we need to print enough zeroes from low to
	 give the digits from high their proper place-values.  Hence
	 NUMBER_FMT_LOOP cannot be used.  */
      const int n_digits = HOST_BITS_PER_WIDE_INT / 3;
      int i;

      for (i = 1; i <= n_digits; i++)
	{
	  unsigned int digit = low % 8;
	  low /= 8;
	  *--p = '0' + digit;
	}

      /* Octal digits carry exactly three bits of information.  The
	 width of a HOST_WIDE_INT is not normally a multiple of three.
	 Therefore, the next digit printed probably needs to carry
	 information from both low and high.  */
      if (HOST_BITS_PER_WIDE_INT % 3 != 0)
	{
	  const int n_leftover_bits = HOST_BITS_PER_WIDE_INT % 3;
	  const int n_bits_from_high = 3 - n_leftover_bits;

	  const unsigned HOST_WIDE_INT
	    low_mask = (((unsigned HOST_WIDE_INT)1) << n_leftover_bits) - 1;
	  const unsigned HOST_WIDE_INT
	    high_mask = (((unsigned HOST_WIDE_INT)1) << n_bits_from_high) - 1;

	  unsigned int digit;

	  /* At this point, only the bottom n_leftover_bits bits of low
	     should be set.  */
	  gcc_assert (!(low & ~low_mask));

	  digit = (low | ((high & high_mask) << n_leftover_bits));
	  high >>= n_bits_from_high;

	  *--p = '0' + digit;
	}

      /* Now we can format high in the normal manner.  However, if
	 the only bits of high that were set were handled by the
	 digit split between low and high, high will now be zero, and
	 we don't want to print extra digits in that case.  */
      if (high)
	NUMBER_FMT_LOOP (p, high, 8);
    }

  obstack_grow (&stabstr_ob, p, (buf + sizeof buf) - p);
}

/* Called whenever it is safe to break a stabs string into multiple
   .stabs directives.  If the current string has exceeded the limit
   set by DBX_CONTIN_LENGTH, mark the current position in the buffer
   as a continuation point by inserting DBX_CONTIN_CHAR (doubled if
   it is a backslash) and a null character.  */
static inline void
stabstr_continue (void)
{
  if (DBX_CONTIN_LENGTH > 0
      && obstack_object_size (&stabstr_ob) - stabstr_last_contin_point
	 > DBX_CONTIN_LENGTH)
    {
      if (DBX_CONTIN_CHAR == '\\')
	obstack_1grow (&stabstr_ob, '\\');
      obstack_1grow (&stabstr_ob, DBX_CONTIN_CHAR);
      obstack_1grow (&stabstr_ob, '\0');
      stabstr_last_contin_point = obstack_object_size (&stabstr_ob);
    }
}
#define CONTIN stabstr_continue ()

/* Macro subroutine of dbxout_finish_complex_stabs, which emits
   all of the arguments to the .stabs directive after the string.
   Overridden by xcoffout.h.  CODE is the stabs code for this symbol;
   LINE is the source line to write into the desc field (in extended
   mode); SYM is the symbol itself.

   ADDR, LABEL, and NUMBER are three different ways to represent the
   stabs value field.  At most one of these should be nonzero.

     ADDR is used most of the time; it represents the value as an
     RTL address constant.

     LABEL is used (currently) only for N_CATCH stabs; it represents
     the value as a string suitable for assemble_name.

     NUMBER is used when the value is an offset from an implicit base
     pointer (e.g. for a stack variable), or an index (e.g. for a
     register variable).  It represents the value as a decimal integer.  */

#ifndef DBX_FINISH_STABS
#define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER)	\
do {								\
  int line_ = use_gnu_debug_info_extensions ? LINE : 0;		\
/* APPLE LOCAL begin ss2 */                                     \
  dbxout_int (CODE);						\
  fputs (",0,", dbx_out_file);					\
  dbxout_int (line_);						\
  putc (',', dbx_out_file);					\
  if (ADDR)							\
    output_addr_const (dbx_out_file, ADDR);			\
  else if (LABEL)						\
    assemble_name (dbx_out_file, LABEL);			\
  else								\
    dbxout_int (NUMBER);					\
  putc ('\n', dbx_out_file);					\
/* APPLE LOCAL end ss2 */                                       \
} while (0)
#endif

/* Finish the emission of a complex .stabs directive.  When DBX_CONTIN_LENGTH
   is zero, this has only to emit the close quote and the remainder of
   the arguments.  When it is nonzero, the string has been marshalled in
   stabstr_ob, and this routine is responsible for breaking it up into
   DBX_CONTIN_LENGTH-sized chunks.

   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,
			     rtx addr, const char *label, int number)
{
  int line ATTRIBUTE_UNUSED;
  char *str;
  size_t len;

  line = sym ? DECL_SOURCE_LINE (sym) : 0;
  if (DBX_CONTIN_LENGTH > 0)
    {
      char *chunk;
      size_t chunklen;

      /* Nul-terminate the growing string, then get its size and
	 address.  */
      obstack_1grow (&stabstr_ob, '\0');

      len = obstack_object_size (&stabstr_ob);
      chunk = str = XOBFINISH (&stabstr_ob, char *);

      /* Within the buffer are a sequence of NUL-separated strings,
	 each of which is to be written out as a separate stab
	 directive.  */
      for (;;)
	{
	  chunklen = strlen (chunk);
	  /* APPLE LOCAL ss2 */
	  fwrite (chunk, 1, chunklen, dbx_out_file);
	  /* APPLE LOCAL ss2 */
	  fputs ("\",", dbx_out_file);

	  /* Must add an extra byte to account for the NUL separator.  */
	  chunk += chunklen + 1;
	  len   -= chunklen + 1;

	  /* Only put a line number on the last stab in the sequence.  */
	  DBX_FINISH_STABS (sym, code, len == 0 ? line : 0,
			    addr, label, number);
	  if (len == 0)
	    break;

	  /* APPLE LOCAL ss2 */
	  fputs (ASM_STABS_OP, dbx_out_file);
	  /* APPLE LOCAL ss2 */
	  putc ('"', dbx_out_file);
	}
      stabstr_last_contin_point = 0;
    }
  else
    {
      /* No continuations - we can put the whole string out at once.
	 It is faster to augment the string with the close quote and
	 comma than to do a two-character fputs.  */
      obstack_grow (&stabstr_ob, "\",", 2);
      len = obstack_object_size (&stabstr_ob);
      str = XOBFINISH (&stabstr_ob, char *);
      
      /* APPLE LOCAL ss2 */
      fwrite (str, 1, len, dbx_out_file);
      DBX_FINISH_STABS (sym, code, line, addr, label, number);
    }
  obstack_free (&stabstr_ob, str);
}

#if defined (DBX_DEBUGGING_INFO)

static void
dbxout_function_end (tree decl)
{
  char lscope_label_name[100];

  /* APPLE LOCAL dbxout_type rewrite.  */
  dbxout_flush_type_queue ();
  /* 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.  */
  ASM_GENERATE_INTERNAL_LABEL (lscope_label_name, "Lscope", scope_labelno);
  /* APPLE LOCAL ss2 */
  targetm.asm_out.internal_label (dbx_out_file, "Lscope", scope_labelno);

  /* The N_FUN tag at the end of the function is a GNU extension,
     which may be undesirable, and is unnecessary if we do not have
     named sections.  */
  if (!use_gnu_debug_info_extensions
      || NO_DBX_FUNCTION_END
      || !targetm.have_named_sections
      || DECL_IGNORED_P (decl))
    return;

  /* By convention, GCC will mark the end of a function with an N_FUN
     symbol and an empty string.  */
  if (flag_reorder_blocks_and_partition)
    {
      dbxout_begin_empty_stabs (N_FUN);
      dbxout_stab_value_label_diff (cfun->hot_section_end_label, 
				    cfun->hot_section_label);
      dbxout_begin_empty_stabs (N_FUN);
      dbxout_stab_value_label_diff (cfun->cold_section_end_label, 
				    cfun->cold_section_label);
    }
  else
    {
      char begin_label[20];
      /* Reference current function start using LFBB.  */
      ASM_GENERATE_INTERNAL_LABEL (begin_label, "LFBB", scope_labelno);
      dbxout_begin_empty_stabs (N_FUN);
      dbxout_stab_value_label_diff (lscope_label_name, begin_label);
    }

  /* APPLE LOCAL begin Essential Symbols */
  if (!NO_DBX_BNSYM_ENSYM)
    {
      dbxout_flush_type_queue ();
      dbxout_stabd (N_ENSYM, 0);
    }
  /* APPLE LOCAL end Essential Symbols */
}
#endif /* DBX_DEBUGGING_INFO */

/* Get lang description for N_SO stab.  */
static unsigned int ATTRIBUTE_UNUSED
get_lang_number (void)
{
  const char *language_string = lang_hooks.name;

  if (strcmp (language_string, "GNU C") == 0)
    return N_SO_C;
  else if (strcmp (language_string, "GNU C++") == 0)
    return N_SO_CC;
  else if (strcmp (language_string, "GNU F77") == 0)
    return N_SO_FORTRAN;
  else if (strcmp (language_string, "GNU F95") == 0)
    return N_SO_FORTRAN90; /* CHECKME */
  else if (strcmp (language_string, "GNU Pascal") == 0)
    return N_SO_PASCAL;
  else if (strcmp (language_string, "GNU Objective-C") == 0)
    return N_SO_OBJC;
  else if (strcmp (language_string, "GNU Objective-C++") == 0)
    return N_SO_OBJCPLUS;
  else
    return 0;

}

/* At the beginning of compilation, start writing the symbol table.
   Initialize `typevec' and output the standard data types of C.  */

static void
dbxout_init (const char *input_file_name)
{
  char ltext_label_name[100];
  bool used_ltext_label_name = false;
  tree syms = lang_hooks.decls.getdecls ();

  typevec_len = 100;
  typevec = ggc_calloc (typevec_len, sizeof typevec[0]);

  /* APPLE LOCAL begin dbxout_type rewrite.  */
  q_typevec_len = 100;
  q_typevec = ggc_calloc (q_typevec_len, sizeof q_typevec[0]);
  /* APPLE LOCAL end dbxout_type rewrite.  */
  /* APPLE LOCAL begin ss2 */
  /* Open dbx_out_file */
  if (flag_save_repository
      && flag_pch_file 
      && !flag_debug_only_used_symbols
      && asm_file_name 
      && strcmp (asm_file_name, "-"))
    {
      dbx_out_file = fopen (asm_file_name, "w+b");
      if (dbx_out_file == 0)
	fatal_error ("can%'t open %s for writing: %m", asm_file_name);
    }
  else
    dbx_out_file = asm_out_file;
  /* APPLE LOCAL end ss2 */
  /* stabstr_ob contains one string, which will be just fine with
     1-byte alignment.  */
  obstack_specify_allocation (&stabstr_ob, 0, 1, xmalloc, free);

  /* Convert Ltext into the appropriate format for local labels in case
     the system doesn't insert underscores in front of user generated
     labels.  */
  ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);

  /* Put the current working directory in an N_SO symbol.  */
  if (use_gnu_debug_info_extensions && !NO_DBX_MAIN_SOURCE_DIRECTORY)
    {
      static const char *cwd;

      if (!cwd)
	{
	  cwd = get_src_pwd ();
	  if (cwd[0] == '\0')
	    cwd = "/";
	  else if (!IS_DIR_SEPARATOR (cwd[strlen (cwd) - 1]))
	    cwd = concat (cwd, "/", NULL);
	}
#ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
      /* APPLE LOCAL ss2 */
      DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (dbx_out_file, cwd);
#else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
      dbxout_begin_simple_stabs_desc (cwd, N_SO, get_lang_number ());
      dbxout_stab_value_label (ltext_label_name);
      used_ltext_label_name = true;
#endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
    }

#ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
  /* APPLE LOCAL ss2 */
  DBX_OUTPUT_MAIN_SOURCE_FILENAME (dbx_out_file, input_file_name);
#else
  dbxout_begin_simple_stabs_desc (input_file_name, N_SO, get_lang_number ());
  dbxout_stab_value_label (ltext_label_name);
  used_ltext_label_name = true;
#endif

  if (used_ltext_label_name)
    {
      switch_to_section (text_section);
      /* APPLE LOCAL ss2 */
      targetm.asm_out.internal_label (dbx_out_file, "Ltext", 0);
    }

  /* APPLE LOCAL begin symbol separation, dwarf 4386531 */
  dbxout_begin_empty_stabs (N_OSO);
  dbxout_stab_value_zero ();
  /* APPLE LOCAL end symbol separation, dwarf 4386531 */

  /* Emit an N_OPT stab to indicate that this file was compiled by GCC.
     The string used is historical.  */
#ifndef NO_DBX_GCC_MARKER
  dbxout_begin_simple_stabs ("gcc2_compiled.", N_OPT);
  dbxout_stab_value_zero ();
#endif

  base_input_file = lastfile = input_file_name;

  next_type_number = 1;

#ifdef DBX_USE_BINCL
  current_file = XNEW (struct dbx_file);
  current_file->next = NULL;
  current_file->file_number = 0;
  current_file->next_type_number = 1;
  next_file_number = 1;
  current_file->prev = NULL;
  current_file->bincl_status = BINCL_NOT_REQUIRED;
  current_file->pending_bincl_name = NULL;
#endif

/* APPLE LOCAL begin gdb only used symbols */
#ifndef DBX_ONLY_USED_SYMBOLS
      dbxout_symbol (TYPE_NAME (integer_type_node), 0);
      dbxout_symbol (TYPE_NAME (char_type_node), 0);
#endif
/* APPLE LOCAL end gdb only used symbols */

  /* Get all permanent types that have typedef names, and output them
     all, except for those already output.  Some language front ends
     put these declarations in the top-level scope; some do not;
     the latter are responsible for calling debug_hooks->type_decl from
     their record_builtin_type function.  */
  dbxout_typedefs (syms);

  if (preinit_symbols)
    {
      tree t;
      for (t = nreverse (preinit_symbols); t; t = TREE_CHAIN (t))
	dbxout_symbol (TREE_VALUE (t), 0);
      preinit_symbols = 0;
    }
  /* APPLE LOCAL begin dbxout_type rewrite.  */
  dbxout_queue_type (void_type_node);
  dbxout_flush_type_queue ();
  /* APPLE LOCAL end dbxout_type rewrite.  */
  /* APPLE LOCAL 4215975 */
  anon_place_holder = get_identifier ("__anon__");
}

/* Output any typedef names for types described by TYPE_DECLs in SYMS.  */

static void
dbxout_typedefs (tree syms)
{
  for (; syms != NULL_TREE; syms = TREE_CHAIN (syms))
    {
      if (TREE_CODE (syms) == TYPE_DECL)
	{
	  tree type = TREE_TYPE (syms);
	  if (TYPE_NAME (type)
	      && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
	      && COMPLETE_OR_VOID_TYPE_P (type)
	      && ! TREE_ASM_WRITTEN (TYPE_NAME (type)))
	    dbxout_symbol (TYPE_NAME (type), 0);
	}
    }
}

#ifdef DBX_USE_BINCL
/* Emit BINCL stab using given name.  */
static void
emit_bincl_stab (const char *name)
{
  /* APPLE LOCAL ss2 */
  static unsigned int dbx_checksum;
  dbxout_begin_simple_stabs (name, N_BINCL);
  
  /* APPLE LOCAL begin ss2 */
  if (flag_save_repository 
      && flag_pch_file 
      && !flag_debug_only_used_symbols)
    {
      /* Include dummy checksum with BINCL stab while creating
	 symbol repoistory. Add corrosponding EXCL stab in
	 asm file.  */
      dbx_checksum = crc32_string (42, name);
      
      fprintf (asm_out_file, "%s", ASM_STABS_OP);
      output_quoted_string (asm_out_file, name);
      fprintf (asm_out_file, ",%d,0,0,%d\n", N_EXCL, dbx_checksum);

      fprintf (dbx_out_file, "%d\n", dbx_checksum);
    }
  else
    dbxout_stab_value_zero ();
  /* APPLE LOCAL end ss2 */
}

/* If there are pending bincls then it is time to emit all of them.  */

static inline void
emit_pending_bincls_if_required (void)
{
  if (pending_bincls)
    emit_pending_bincls ();
}

/* Emit all pending bincls.  */

static void
emit_pending_bincls (void)
{
  struct dbx_file *f = current_file;

  /* Find first pending bincl.  */
  while (f->bincl_status == BINCL_PENDING)
    f = f->next;

  /* Now emit all bincls.  */
  f = f->prev;

  while (f)
    {
      if (f->bincl_status == BINCL_PENDING)
        {
          emit_bincl_stab (f->pending_bincl_name);

	  /* Update file number and status.  */
          f->file_number = next_file_number++;
          f->bincl_status = BINCL_PROCESSED;
        }
      if (f == current_file)
        break;
      f = f->prev;
    }

  /* All pending bincls have been emitted.  */
  pending_bincls = 0;
}

#else

static inline void
emit_pending_bincls_if_required (void) {}
#endif

/* Change to reading from a new source file.  Generate a N_BINCL stab.  */

static void
dbxout_start_source_file (unsigned int line ATTRIBUTE_UNUSED,
			  const char *filename ATTRIBUTE_UNUSED)
{
#ifdef DBX_USE_BINCL
  struct dbx_file *n = XNEW (struct dbx_file);

  /* APPLE LOCAL dbxout_type rewrite.  */
  dbxout_flush_type_queue ();
  n->next = current_file;
  n->next_type_number = 1;
  /* Do not assign file number now. 
     Delay it until we actually emit BINCL.  */
  n->file_number = 0;
  n->prev = NULL;
  /* APPLE LOCAL begin bincl 4549901 */
  if (current_file)
    current_file->prev = n;
  /* APPLE LOCAL end bincl 4549901 */
  n->bincl_status = BINCL_PENDING;
  n->pending_bincl_name = filename;
  pending_bincls = 1;
  current_file = n;
#endif
}

/* Revert to reading a previous source file.  Generate a N_EINCL stab.  */

static void
dbxout_end_source_file (unsigned int line ATTRIBUTE_UNUSED)
{
  /* APPLE LOCAL dbxout_type rewrite.  */
  dbxout_flush_type_queue ();
#ifdef DBX_USE_BINCL
  /* APPLE LOCAL begin 4547137 */
  if (!current_file)
    return;
  /* APPLE LOCAL end 4547137 */
  /* Emit EINCL stab only if BINCL is not pending.  */
  if (current_file->bincl_status == BINCL_PROCESSED)
    {
      dbxout_begin_stabn (N_EINCL);
      dbxout_stab_value_zero ();
    }
  current_file->bincl_status = BINCL_NOT_REQUIRED;
  current_file = current_file->next;
  /* APPLE LOCAL begin bincl 4549901 */
  if (current_file == 0)
    pending_bincls = 0;
  /* APPLE LOCAL end bincl 4549901 */
#endif
}

/* Handle a few odd cases that occur when trying to make PCH files work.  */

static void
dbxout_handle_pch (unsigned at_end)
{
  if (! at_end)
    {
      /* When using the PCH, this file will be included, so we need to output
	 a BINCL.  */
      dbxout_start_source_file (0, lastfile);

      /* The base file when using the PCH won't be the same as
	 the base file when it's being generated.  */
      lastfile = NULL;
    }
  else
    {
      /* ... and an EINCL.  */
      dbxout_end_source_file (0);

      /* Deal with cases where 'lastfile' was never actually changed.  */
      lastfile_is_base = lastfile == NULL;
    }
}

#if defined (DBX_DEBUGGING_INFO)
/* Output debugging info to FILE to switch to sourcefile FILENAME.  */

static void
dbxout_source_file (const char *filename)
{
  if (lastfile == 0 && lastfile_is_base)
    {
      lastfile = base_input_file;
      lastfile_is_base = 0;
    }

  if (filename && (lastfile == 0 || strcmp (filename, lastfile)))
    {
      /* Don't change section amid function.  */
      if (current_function_decl == NULL_TREE)
	switch_to_section (text_section);

      dbxout_begin_simple_stabs (filename, N_SOL);
      dbxout_stab_value_internal_label ("Ltext", &source_label_number);
      lastfile = filename;
    }
}

/* Output N_BNSYM, line number symbol entry, and local symbol at 
   function scope  */

static void
dbxout_begin_prologue (unsigned int lineno, const char *filename)
{
  if (use_gnu_debug_info_extensions
      && !NO_DBX_FUNCTION_END
      /* APPLE LOCAL Essential Symbols */
      && !NO_DBX_BNSYM_ENSYM)
    dbxout_stabd (N_BNSYM, 0);

  /* pre-increment the scope counter */
  scope_labelno++;

  dbxout_source_line (lineno, filename);
  /* 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);
}

/* Output a line number symbol entry for source file FILENAME and line
   number LINENO.  */

static void
dbxout_source_line (unsigned int lineno, const char *filename)
{
  dbxout_source_file (filename);

#ifdef DBX_OUTPUT_SOURCE_LINE
  /* APPLE LOCAL ss2 */
  DBX_OUTPUT_SOURCE_LINE (dbx_out_file, lineno, dbxout_source_line_counter);
#else
  if (DBX_LINES_FUNCTION_RELATIVE)
    {
      char begin_label[20];
      dbxout_begin_stabn_sline (lineno);
      /* Reference current function start using LFBB.  */
      ASM_GENERATE_INTERNAL_LABEL (begin_label, "LFBB", scope_labelno); 
      dbxout_stab_value_internal_label_diff ("LM", &dbxout_source_line_counter,
					     begin_label);
    }
  else
    dbxout_stabd (N_SLINE, lineno);
#endif
}

/* Describe the beginning of an internal block within a function.  */

static void
dbxout_begin_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
{
  emit_pending_bincls_if_required ();
  /* APPLE LOCAL ss2 */
  targetm.asm_out.internal_label (dbx_out_file, "LBB", n);
}

/* Describe the end line-number of an internal block within a function.  */

static void
dbxout_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
{
  emit_pending_bincls_if_required ();
  /* APPLE LOCAL ss2 */
  targetm.asm_out.internal_label (dbx_out_file, "LBE", n);
}

/* Output dbx data for a function definition.
   This includes a definition of the function name itself (a symbol),
   definitions of the parameters (locating them in the parameter list)
   and then output the block that makes up the function's body
   (including all the auto variables of the function).  */

static void
dbxout_function_decl (tree decl)
{
  emit_pending_bincls_if_required ();
#ifndef DBX_FUNCTION_FIRST
  dbxout_begin_function (decl);
#endif
  dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
  dbxout_function_end (decl);
}

#endif /* DBX_DEBUGGING_INFO  */

/* Debug information for a global DECL.  Called from toplev.c after
   compilation proper has finished.  */
static void
dbxout_global_decl (tree decl)
{
  if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
    {
      int saved_tree_used = TREE_USED (decl);
      TREE_USED (decl) = 1;
      dbxout_symbol (decl, 0);
      TREE_USED (decl) = saved_tree_used;
    }
}

/* This is just a function-type adapter; dbxout_symbol does exactly
   what we want but returns an int.  */
static void
dbxout_type_decl (tree decl, int local)
{
  dbxout_symbol (decl, local);
}

/* At the end of compilation, finish writing the symbol table.
   The default is to call debug_free_queue but do nothing else.  */

static void
dbxout_finish (const char *filename ATTRIBUTE_UNUSED)
{
  /* APPLE LOCAL dbxout_type rewrite.  */
  dbxout_free_type_queue ();
#ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
  /* APPLE LOCAL ss2 */
  DBX_OUTPUT_MAIN_SOURCE_FILE_END (dbx_out_file, filename);
#elif defined DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
 {
   switch_to_section (text_section);
   dbxout_begin_empty_stabs (N_SO);
   dbxout_stab_value_internal_label ("Letext", 0);
 }
#endif
  debug_free_queue ();

  /* APPLE LOCAL begin ss2 */
  if (flag_save_repository
      && flag_pch_file && !flag_debug_only_used_symbols)
    {
      /* Close dbx_out_file now here. toplev.c takes care of asm file.  */
      if (ferror (dbx_out_file) != 0)
	fatal_error ("error writing to %s: %m", asm_file_name);
      if (fclose (dbx_out_file) != 0)
	fatal_error ("error closing %s: %m", asm_file_name);
    }
}
  /* APPLE LOCAL end ss2 */

/* APPLE LOCAL begin dbxout_type rewrite.  */
/* If TYPE is a qualified type then note this info in
   q_typevec.  */
static void
dbxout_note_q_type (tree type)
{
  tree ttype = TREE_TYPE (type);
  int t_number = TYPE_SYMTAB_ADDRESS (type);
  int tt_number = TYPE_SYMTAB_ADDRESS (ttype);
  int q_number = typevec[t_number].q_type_number;

  /* consts and volatiles are not yet handled.  */
  if (TYPE_QUALS (type))
    return;

  if (q_number == 0)
    q_number = dbxout_next_q_type_number ();

  switch (TREE_CODE (type))
    {
    case FUNCTION_TYPE:
      if (q_typevec[q_number].function_type == 0)
	{
	  q_typevec[q_number].function_type = t_number;
	  typevec[tt_number].q_type_number = q_number;
	}
      break;
    case POINTER_TYPE:
      if (q_typevec[q_number].pointer_type == 0)
	{
	  q_typevec[q_number].pointer_type = t_number;
	  typevec[tt_number].q_type_number = q_number;
	}
      break;
    case REFERENCE_TYPE:
      if (q_typevec[q_number].reference_type == 0)
	{
	  q_typevec[q_number].reference_type = t_number;
	  typevec[tt_number].q_type_number = q_number;
	}
      break;
    default:
      gcc_unreachable ();
      break;
    }
}

/* Returned q_typevec index number for TYPE if it is
   reusuable.
   If TYPE is a FUNCTION_TYPE of VOID_TYPE and if we
   have already seen another  FUNCTION_TYPE OTHER_TYPE whose 
   type is also VOID_TYPE  then we can reuse OTHER_TYPE's type 
   number for TYPE.  */
static int 
dbxout_reusable_type (tree type)
{
  tree t;
  int q_no = 0;
  /* consts and volatiles are not yet handled.  */
  if (TYPE_QUALS (type))
    return 0;

  t = TREE_TYPE (type);
  if (t && TYPE_SYMTAB_ADDRESS (t) == 0)
    return 0;

  switch (TREE_CODE (type))
    {
    case FUNCTION_TYPE:
      q_no = typevec[TYPE_SYMTAB_ADDRESS (t)].q_type_number;
      if (q_no && q_typevec[q_no].function_type)
	return q_typevec[q_no].function_type;
      break;
    case POINTER_TYPE:
      q_no = typevec[TYPE_SYMTAB_ADDRESS (t)].q_type_number;
      if (q_no && q_typevec[q_no].pointer_type)
	return q_typevec[q_no].pointer_type;
      break;
    case REFERENCE_TYPE:
      q_no = typevec[TYPE_SYMTAB_ADDRESS (t)].q_type_number;
      if (q_no && q_typevec[q_no].reference_type)
	return q_typevec[q_no].reference_type;
      break;
    default:
      break;
    }
  return 0;
}
/* APPLE LOCAL end dbxout_type rewrite.  */
/* Output the index of a type.  */

static void
dbxout_type_index (tree type)
{
  /* APPLE LOCAL begin dbxout_type rewrite.  */
  struct typeinfo *t = NULL;

  if (TYPE_SYMTAB_ADDRESS (type) == 0)
  {
    int r = dbxout_reusable_type (type);
    if (r)
	TYPE_SYMTAB_ADDRESS (type) = r;
    dbxout_next_type_number (type);
  }
#ifndef DBX_USE_BINCL
  stabstr_D (TYPE_SYMTAB_ADDRESS (type));
#else

  t = &typevec[TYPE_SYMTAB_ADDRESS (type)];
  /* APPLE LOCAL end dbxout_type rewrite.  */
  stabstr_C ('(');
  stabstr_D (t->file_number);
  stabstr_C (',');
  stabstr_D (t->type_number);
  stabstr_C (')');
#endif
}



/* Used in several places: evaluates to '0' for a private decl,
   '1' for a protected decl, '2' for a public decl.  */
#define DECL_ACCESSIBILITY_CHAR(DECL) \
(TREE_PRIVATE (DECL) ? '0' : TREE_PROTECTED (DECL) ? '1' : '2')

/* Subroutine of `dbxout_type'.  Output the type fields of TYPE.
   This must be a separate function because anonymous unions require
   recursive calls.  */

static void
dbxout_type_fields (tree type)
{
  tree tem;

  /* Output the name, type, position (in bits), size (in bits) of each
     field that we can support.  */
  for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
    {
      /* If one of the nodes is an error_mark or its type is then
	 return early.  */
      if (tem == error_mark_node || TREE_TYPE (tem) == error_mark_node)
	return;

      /* Omit here local type decls until we know how to support them.  */
      if (TREE_CODE (tem) == TYPE_DECL
	  /* Omit here the nameless fields that are used to skip bits.  */
	  || DECL_IGNORED_P (tem)
	  /* Omit fields whose position or size are variable or too large to
	     represent.  */
	  || (TREE_CODE (tem) == FIELD_DECL
	      && (! host_integerp (bit_position (tem), 0)
		  || ! DECL_SIZE (tem)
		  || ! host_integerp (DECL_SIZE (tem), 1))))
	continue;

      else if (TREE_CODE (tem) != CONST_DECL)
	{
	  /* Continue the line if necessary,
	     but not before the first field.  */
	  if (tem != TYPE_FIELDS (type))
	    CONTIN;
	  /* APPLE LOCAL begin 4174833 */
	  /* If we are outputting fields for an Objective-C class, we need
	     to output all fields in superclasses as well; gdb does not
	     currently grok Objective-C type hierarchies.  */
	  else if (TREE_CODE (TREE_TYPE (tem)) == RECORD_TYPE
		   && !strncmp (lang_hooks.name, "GNU Objective-C", 15))
	    {
	      /* NB: Non-C-based languages will need to provide a stub
		 for objc_is_class_name().  */
	      extern tree objc_is_class_name (tree);

	      if (objc_is_class_name (TYPE_NAME (type))
		  && objc_is_class_name (TYPE_NAME (TREE_TYPE (tem))))
		{
		  dbxout_type_fields (TREE_TYPE (tem));
		  continue;
		}
	    }
	  /* APPLE LOCAL end 4174833 */

	  if (DECL_NAME (tem))
	    stabstr_I (DECL_NAME (tem));
	  stabstr_C (':');

	  if (use_gnu_debug_info_extensions
	      && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem)
		  || TREE_CODE (tem) != FIELD_DECL))
	    {
	      stabstr_C ('/');
	      stabstr_C (DECL_ACCESSIBILITY_CHAR (tem));
	    }

	  dbxout_type ((TREE_CODE (tem) == FIELD_DECL
			&& DECL_BIT_FIELD_TYPE (tem))
		       ? DECL_BIT_FIELD_TYPE (tem) : TREE_TYPE (tem), 0);

	  if (TREE_CODE (tem) == VAR_DECL)
	    {
	      if (TREE_STATIC (tem) && use_gnu_debug_info_extensions)
		{
		  tree name = DECL_ASSEMBLER_NAME (tem);

		  stabstr_C (':');
		  stabstr_I (name);
		  stabstr_C (';');
		}
	      else
		/* If TEM is non-static, GDB won't understand it.  */
		stabstr_S (",0,0;");
	    }
	  else
	    {
	      stabstr_C (',');
	      stabstr_D (int_bit_position (tem));
	      stabstr_C (',');
	      stabstr_D (tree_low_cst (DECL_SIZE (tem), 1));
	      stabstr_C (';');
	    }
	}
    }
}

/* Subroutine of `dbxout_type_methods'.  Output debug info about the
   method described DECL.  */

static void
dbxout_type_method_1 (tree decl)
{
  char c1 = 'A', c2;

  if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
    c2 = '?';
  else /* it's a METHOD_TYPE.  */
    {
      tree firstarg = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)));
      /* A for normal functions.
	 B for `const' member functions.
	 C for `volatile' member functions.
	 D for `const volatile' member functions.  */
      if (TYPE_READONLY (TREE_TYPE (firstarg)))
	c1 += 1;
      if (TYPE_VOLATILE (TREE_TYPE (firstarg)))
	c1 += 2;

      if (DECL_VINDEX (decl))
	c2 = '*';
      else
	c2 = '.';
    }

  /* ??? Output the mangled name, which contains an encoding of the
     method's type signature.  May not be necessary anymore.  */
  stabstr_C (':');
  stabstr_I (DECL_ASSEMBLER_NAME (decl));
  stabstr_C (';');
  stabstr_C (DECL_ACCESSIBILITY_CHAR (decl));
  stabstr_C (c1);
  stabstr_C (c2);

  if (DECL_VINDEX (decl) && host_integerp (DECL_VINDEX (decl), 0))
    {
      stabstr_D (tree_low_cst (DECL_VINDEX (decl), 0));
      stabstr_C (';');
      dbxout_type (DECL_CONTEXT (decl), 0);
      stabstr_C (';');
    }
}

/* Subroutine of `dbxout_type'.  Output debug info about the methods defined
   in TYPE.  */

static void
dbxout_type_methods (tree type)
{
  /* C++: put out the method names and their parameter lists */
  tree methods = TYPE_METHODS (type);
  tree fndecl;
  tree last;

  if (methods == NULL_TREE)
    return;

  if (TREE_CODE (methods) != TREE_VEC)
    fndecl = methods;
  else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
    fndecl = TREE_VEC_ELT (methods, 0);
  else
    fndecl = TREE_VEC_ELT (methods, 1);

  while (fndecl)
    {
      int need_prefix = 1;

      /* Group together all the methods for the same operation.
	 These differ in the types of the arguments.  */
      for (last = NULL_TREE;
	   fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
	   fndecl = TREE_CHAIN (fndecl))
	/* Output the name of the field (after overloading), as
	   well as the name of the field before overloading, along
	   with its parameter list */
	{
	  /* Skip methods that aren't FUNCTION_DECLs.  (In C++, these
	     include TEMPLATE_DECLs.)  The debugger doesn't know what
	     to do with such entities anyhow.  */
	  if (TREE_CODE (fndecl) != FUNCTION_DECL)
	    continue;

	  CONTIN;

	  last = fndecl;

	  /* Also ignore abstract methods; those are only interesting to
	     the DWARF backends.  */
	  if (DECL_IGNORED_P (fndecl) || DECL_ABSTRACT (fndecl))
	    continue;

	  /* Redundantly output the plain name, since that's what gdb
	     expects.  */
	  if (need_prefix)
	    {
	      stabstr_I (DECL_NAME (fndecl));
	      stabstr_S ("::");
	      need_prefix = 0;
	    }

	  dbxout_type (TREE_TYPE (fndecl), 0);
	  dbxout_type_method_1 (fndecl);
	}
      if (!need_prefix)
	stabstr_C (';');
    }
}

/* Emit a "range" type specification, which has the form:
   "r<index type>;<lower bound>;<upper bound>;".
   TYPE is an INTEGER_TYPE.  */

static void
dbxout_range_type (tree type)
{
  stabstr_C ('r');
  if (TREE_TYPE (type))
    dbxout_type (TREE_TYPE (type), 0);
  else if (TREE_CODE (type) != INTEGER_TYPE)
    dbxout_type (type, 0); /* E.g. Pascal's ARRAY [BOOLEAN] of INTEGER */
  else
    {
      /* Traditionally, we made sure 'int' was type 1, and builtin types
	 were defined to be sub-ranges of int.  Unfortunately, this
	 does not allow us to distinguish true sub-ranges from integer
	 types.  So, instead we define integer (non-sub-range) types as
	 sub-ranges of themselves.  This matters for Chill.  If this isn't
	 a subrange type, then we want to define it in terms of itself.
	 However, in C, this may be an anonymous integer type, and we don't
	 want to emit debug info referring to it.  Just calling
	 dbxout_type_index won't work anyways, because the type hasn't been
	 defined yet.  We make this work for both cases by checked to see
	 whether this is a defined type, referring to it if it is, and using
	 'int' otherwise.  */
      if (TYPE_SYMTAB_ADDRESS (type) != 0)
	dbxout_type_index (type);
      else
	dbxout_type_index (integer_type_node);
    }

  stabstr_C (';');
  if (TYPE_MIN_VALUE (type) != 0
      && host_integerp (TYPE_MIN_VALUE (type), 0))
    {
      if (print_int_cst_bounds_in_octal_p (type))
        stabstr_O (TYPE_MIN_VALUE (type));
      else
        stabstr_D (tree_low_cst (TYPE_MIN_VALUE (type), 0));
    }
  else
    stabstr_C ('0');

  stabstr_C (';');
  if (TYPE_MAX_VALUE (type) != 0
      && host_integerp (TYPE_MAX_VALUE (type), 0))
    {
      if (print_int_cst_bounds_in_octal_p (type))
        stabstr_O (TYPE_MAX_VALUE (type));
      else
        stabstr_D (tree_low_cst (TYPE_MAX_VALUE (type), 0));
      stabstr_C (';');
    }
  else
    stabstr_S ("-1;");
}


/* APPLE LOCAL begin dbxout_type rewrite.  */
/* Output a reference to a type.

   If FLAG is zero then do not try to describe entire type definition.
   Instead, queue the type for full type description.

   If FLAG is nonzero then describe entire type.  

   Return TRUE if partial type description along with cross reference
   is emitted. Return FALSE otherwise.  */

static bool
dbxout_type (tree type, int flag)
{
  tree main_variant;
  bool vector_type = false;

  /* 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'.  */
  if (type == error_mark_node) 
    type = integer_type_node; 

  if (TREE_CODE (type) == VECTOR_TYPE)
    {
      /* The frontend feeds us a representation for the vector as a struct
	 containing an array.  Pull out the array type.  */
      type = TREE_TYPE (TYPE_FIELDS (TYPE_DEBUG_REPRESENTATION_TYPE (type)));
      vector_type = true;
    }

  /* Try to find the "main variant" of this type with the same name.  */
  if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 
      && DECL_ORIGINAL_TYPE (TYPE_NAME (type))) 
    main_variant = TREE_TYPE (TYPE_NAME (type)); 
  else 
    main_variant = TYPE_MAIN_VARIANT (type); 
 
  /* If we are not using extensions, stabs does not distinguish const and 
     volatile, so there is no need to make them separate types.  */ 
  if (!use_gnu_debug_info_extensions) 
    type = main_variant; 
   
  /* If TYPE_DECL_SUPPRESS_DEBUG is set then emit partial type only.  */
  if (TYPE_NAME (type)
      && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
      && TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type))
      && flag == 1)
    flag = 0;

  if (flag == 1  || flag == 2)
    dbxout_complete_type (type, main_variant);
  else if ( flag == 0)
    return dbxout_partial_type (type, main_variant);
  else
    gcc_unreachable ();
  return false;
}

/* Emit partial type description. Queue actual type to describe it
   entirely in new separate stab.  Return true if type is cross referenced.  */

static bool
dbxout_partial_type (tree type, tree main_variant)
{
  bool result = false;
  dbxout_type_index (type);

#ifdef DBX_TYPE_DEFINED
  if (DBX_TYPE_DEFINED (type))
    return result;
#endif

  switch (typevec[TYPE_SYMTAB_ADDRESS (type)].status)
    {
    case TYPE_UNSEEN:
      break;
    case TYPE_XREF:
    case TYPE_DEFINED:
    case TYPE_QUEUED:
	return result;
      break;
    }

#ifdef DBX_NO_XREFS
  /* For systems where dbx output does not allow the `=xsNAME:' syntax,
     leave the type-number completely undefined rather than output
     a cross-reference.  If we have already used GNU debug info extensions,
     then it is OK to output a cross reference.  This is necessary to get
     proper C++ debug output.  */
  if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
       || TREE_CODE (type) == QUAL_UNION_TYPE
       || TREE_CODE (type) == ENUMERAL_TYPE)
      && ! use_gnu_debug_info_extensions)
    /* We must use the same test here as we use twice below when deciding
       whether to emit a cross-reference.  */
    if (dbxout_cross_ref_type_p (type))
      {
	typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
	result = true;
	return result;
      }
#endif

  /* Handle const qualified types.  */
  if (TYPE_READONLY (type) > TYPE_READONLY (main_variant))
    {
      dbxout_queue_type (type);
      return result;
    }

  /* Handle volatile qualified types.  */
  if (TYPE_VOLATILE (type) > TYPE_VOLATILE (main_variant))
    {
      dbxout_queue_type (type);
      return result;
    }

  if (flag_debug_only_used_symbols
      && TYPE_NAME (type)
      && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
    {
      tree tree_type = TREE_TYPE (TYPE_NAME (type));
      tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
      if (tree_type)
      {
	switch (TREE_CODE (tree_type))
	  {
	  case ENUMERAL_TYPE:
	  case RECORD_TYPE:
	  case UNION_TYPE:
	  case QUAL_UNION_TYPE:
	    dbxout_next_type_number (tree_type);
	    typevec[TYPE_SYMTAB_ADDRESS (tree_type)].status = TYPE_XREF;
	    dbxout_type_xref (tree_type);
	    result = true;
	    if (orig_type
		&& TYPE_STUB_DECL (orig_type)
		&& ! DECL_IGNORED_P (TYPE_STUB_DECL (orig_type)))
	      debug_queue_symbol (TYPE_STUB_DECL (orig_type));
	    break;
	  default:
	    break;
	  }
      }
      if (orig_type)
	dbxout_queue_type (orig_type);
      dbxout_queue_type (type);
      return result;
    }

  switch (TREE_CODE (type))
    {
    case VOID_TYPE:
    case LANG_TYPE:
      /* APPLE LOCAL blocks 6034272 */
    case BLOCK_POINTER_TYPE:
      dbxout_void_type (type);
      break;

    case RECORD_TYPE:
    case UNION_TYPE:
    case QUAL_UNION_TYPE:
    case ENUMERAL_TYPE:

      /* Put the TYPE_DECL node pointed by TYPE_STUB_DECL into queue.  */
      if (TYPE_STUB_DECL (type)
	  && DECL_P (TYPE_STUB_DECL (type))
	  && ! DECL_IGNORED_P (TYPE_STUB_DECL (type)))
	debug_queue_symbol (TYPE_STUB_DECL (type));

      /* Handle original type, if any.  */
      if (main_variant != TYPE_MAIN_VARIANT (type))
	{
	  tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
	  if (flag_debug_only_used_symbols)
	    {
	      if (TYPE_STUB_DECL (orig_type)
		  && !DECL_IGNORED_P (TYPE_STUB_DECL (orig_type)))
		debug_queue_symbol (TYPE_STUB_DECL (orig_type));
	    }
	  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
	  dbxout_type_xref (orig_type);
	  dbxout_queue_type (orig_type);
	  return result; 
	}

      dbxout_queue_type (type);
      break;

    case INTEGER_TYPE:
      dbxout_integer_type (type);
      break;

    case REAL_TYPE:
      dbxout_real_type (type);
      break;

    case BOOLEAN_TYPE:
      dbxout_boolean_type (type);
      break;

    case COMPLEX_TYPE:
      dbxout_complex_type (type);
      break;

    case VECTOR_TYPE:
    case ARRAY_TYPE:
    case OFFSET_TYPE:
      dbxout_queue_type (type);
      break;

    case POINTER_TYPE:
    case REFERENCE_TYPE:
    case FUNCTION_TYPE:
      dbxout_note_q_type (type);
      dbxout_queue_type (type);
      break;

    case METHOD_TYPE:
      stabstr_C ('=');
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      if (use_gnu_debug_info_extensions)
	{
	  stabstr_C ('#');

	  /* Write the argument types out longhand.  */
	  dbxout_type (TYPE_METHOD_BASETYPE (type), 1);
	  stabstr_C (',');
	  dbxout_type (TREE_TYPE (type), 0);
	  dbxout_args (TYPE_ARG_TYPES (type));
	  stabstr_C (';');
	}
      else
	/* Treat it as a function type.  */
	dbxout_type (TREE_TYPE (type), 1);
      break;


    default:
      gcc_unreachable ();
    }

  return result;
}

/* Describe complete type definition.  */

static void
dbxout_complete_type (tree type, tree main_variant)
{
  tree tem; 
  bool vector_type = false;
  
  dbxout_type_index (type);

#ifdef DBX_TYPE_DEFINED
  if (DBX_TYPE_DEFINED (type))
    return;
#endif

  switch (typevec[TYPE_SYMTAB_ADDRESS (type)].status)
    {
    case TYPE_UNSEEN:
    case TYPE_QUEUED:
      break;
    case TYPE_XREF:
      /* If we have already had a cross reference,
	 and either that's all we want or that's the best we could do,
	 don't repeat the cross reference.
	 Sun dbx crashes if we do.  */
      if (!COMPLETE_TYPE_P (type)
	  /* No way in DBX fmt to describe a variable size.  */
	  || ! host_integerp (TYPE_SIZE (type), 1))
	return;
      break;
    case TYPE_DEFINED:
      return;
    }

#ifdef DBX_NO_XREFS
  /* For systems where dbx output does not allow the `=xsNAME:' syntax,
     leave the type-number completely undefined rather than output
     a cross-reference.  If we have already used GNU debug info extensions,
     then it is OK to output a cross reference.  This is necessary to get
     proper C++ debug output.  */
  if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
       || TREE_CODE (type) == QUAL_UNION_TYPE
       || TREE_CODE (type) == ENUMERAL_TYPE)
      && ! use_gnu_debug_info_extensions)
    /* We must use the same test here as we use twice below when deciding
       whether to emit a cross-reference.  */
    if (dbxout_cross_ref_type_p (type))
      {
	typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
	return;
      }
#endif

  /* Handle const qualified types.  */
  if (TYPE_READONLY (type) > TYPE_READONLY (main_variant))
    {
      tree ttype;

      stabstr_C ('=');
      stabstr_C ('k');
      ttype = build_type_variant (type, 0, TYPE_VOLATILE (type)); /* ??? */

      dbxout_next_type_number (ttype);      
      dbxout_type_index (ttype);
      dbxout_queue_type (ttype);

      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      return;
    }

  /* Handle volatile qualified types.  */
  if (TYPE_VOLATILE (type) > TYPE_VOLATILE (main_variant))
    {
      tree ttype;

      stabstr_C ('=');

      /* In Objective-C, EH handling mechanism volatizes variables.
	 It is implementation detail and no need to put that info
	 into stabs. This is true for Objective-C++ also. strncmp 
	 check validates both languages.  */
      if (strncmp (lang_hooks.name, "GNU Objective-C", 15)
	  || !lookup_attribute ("objc_volatilized", TYPE_ATTRIBUTES (type)))
	stabstr_C ('B');
      ttype = build_type_variant (type, 0, TYPE_READONLY (type)); /* ??? */

      dbxout_next_type_number (ttype);      
      dbxout_type_index (ttype);
      dbxout_queue_type (ttype);
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      return;
    }

  /* If there is another, original type available for this type then
     just emit type index number and queue original type for now.  */
  if (TYPE_NAME (type)
      && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
      && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
    {
      tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
      stabstr_C ('=');

      dbxout_type_index (orig_type);

      dbxout_queue_type (orig_type);
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      return;
    }

  switch (TREE_CODE (type))
    {
    case VOID_TYPE:
    case LANG_TYPE:
      /* APPLE LOCAL blocks 6034272 */
    case BLOCK_POINTER_TYPE:
      dbxout_void_type (type);
      break;

    case POINTER_TYPE:
      dbxout_pointer_type (type);
      break;

    case RECORD_TYPE:
    case UNION_TYPE:
    case QUAL_UNION_TYPE:
      {
      tree binfo = TYPE_BINFO (type);

      /* If TYPE_STUB_DECL is set and not ignored than it consider it as a used
	 symbol and put it in symbol queue.  */
      if (TYPE_STUB_DECL (type)
	  && DECL_P (TYPE_STUB_DECL (type))
	  && ! DECL_IGNORED_P (TYPE_STUB_DECL (type))
	  && flag_debug_only_used_symbols)
	debug_queue_symbol (TYPE_STUB_DECL (type));

      if (!COMPLETE_TYPE_P (type)
	  /* No way in DBX fmt to describe a variable size.  */
	  || ! host_integerp (TYPE_SIZE (type), 1))
	{
	  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
	  if (use_gnu_debug_info_extensions)
	    dbxout_type_xref (type);
	  
	  return;
	}
      
      stabstr_C ('=');
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      
      /* Identify record or union, and print its size.  */
      stabstr_C ((TREE_CODE (type) == RECORD_TYPE) ? 's' : 'u');
      stabstr_D (int_size_in_bytes (type));
      
      /* APPLE LOCAL begin 4174833 */
      /* If we are outputting fields for an Objective-C class, we must
	 not output any references to superclasses; gdb does not
	 currently grok Objective-C type hierarchies.  */
      if (TREE_CODE (type) == RECORD_TYPE
	  && !strncmp (lang_hooks.name, "GNU Objective-C", 15))
	{
	  /* NB: Non-C-based languages will need to provide a stub
	     for objc_is_class_name().  */
	  extern tree objc_is_class_name (tree);
	  
	  if (objc_is_class_name (TYPE_NAME (type)))
	    binfo = NULL_TREE;
	}
      
      /* APPLE LOCAL end 4174833 */
      if (binfo)
	{
	  int i;
	  tree child;
	  VEC (tree,gc) *accesses = BINFO_BASE_ACCESSES (binfo);
	  
	  if (use_gnu_debug_info_extensions)
	    {
	      if (BINFO_N_BASE_BINFOS (binfo))
		{
		  stabstr_C ('!');
		  stabstr_U (BINFO_N_BASE_BINFOS (binfo));
		  stabstr_C (',');
		}
	    }
	  for (i = 0; BINFO_BASE_ITERATE (binfo, i, child); i++)
	    {
	      tree access = (accesses ? VEC_index (tree, accesses, i)
			     : access_public_node);
	      
	      if (use_gnu_debug_info_extensions)
		{
		  stabstr_C (BINFO_VIRTUAL_P (child) ? '1' : '0');
		  stabstr_C (access == access_public_node ? '2' :
			     access == access_protected_node
			     ? '1' :'0');
		  if (BINFO_VIRTUAL_P (child)
		      && (strcmp (lang_hooks.name, "GNU C++") == 0
			  || strcmp (lang_hooks.name, "GNU Objective-C++") == 0))
		    /* For a virtual base, print the (negative)
		       offset within the vtable where we must look
		       to find the necessary adjustment.  */
		    stabstr_D
		      (tree_low_cst (BINFO_VPTR_FIELD (child), 0)
		       * BITS_PER_UNIT);
		  else
		    stabstr_D (tree_low_cst (BINFO_OFFSET (child), 0)
			       * BITS_PER_UNIT);
		  stabstr_C (',');
		  if (!dbxout_type (BINFO_TYPE (child), 0))
		    dbxout_type_xref (BINFO_TYPE (child));
		  stabstr_C (';');
		}
	      else
		{
		  /* Print out the base class information with
		     fields which have the same names at the types
		     they hold.  */
		  dbxout_type_name (BINFO_TYPE (child));
		  stabstr_C (':');
		  dbxout_type (BINFO_TYPE (child), 0);
		  stabstr_C (',');
		  stabstr_D (tree_low_cst (BINFO_OFFSET (child), 0)
			     * BITS_PER_UNIT);
		  stabstr_C (',');
		  stabstr_D
		    (tree_low_cst (TYPE_SIZE (BINFO_TYPE (child)), 0)
		     * BITS_PER_UNIT);
		  stabstr_C (';');
		}
	    }
	}
      
      /* Write out the field declarations.  */
      dbxout_type_fields (type);
      if (use_gnu_debug_info_extensions && TYPE_METHODS (type) != NULL_TREE)
	{
	  dbxout_type_methods (type);
	}
      
      stabstr_C (';');
      
      if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
	  /* Avoid the ~ if we don't really need it--it confuses dbx.  */
	  && TYPE_VFIELD (type))
	{
	  
	  /* We need to write out info about what field this class
	     uses as its "main" vtable pointer field, because if this
	     field is inherited from a base class, GDB cannot necessarily
	     figure out which field it's using in time.  */
	  stabstr_S ("~%");
	  dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0);
	  stabstr_C (';');
	}
      }
       break;
       
    case ENUMERAL_TYPE:

      /* If TYPE_STUB_DECL is set and not ignored than it consider it as a used
	 symbol and put it in symbol queue.  */
      if (TYPE_STUB_DECL (type)
	  && DECL_P (TYPE_STUB_DECL (type))
	  && ! DECL_IGNORED_P (TYPE_STUB_DECL (type))
	  && flag_debug_only_used_symbols)
	debug_queue_symbol (TYPE_STUB_DECL (type));

      if (!COMPLETE_TYPE_P (type)
	  /* No way in DBX fmt to describe a variable size.  */
	  || ! host_integerp (TYPE_SIZE (type), 1))
	{
	  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
	  if (use_gnu_debug_info_extensions)
	    dbxout_type_xref (type);
	  
	  return;
	}
      

      if (main_variant != TYPE_MAIN_VARIANT (type))
	{
	  tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
	  if (flag_debug_only_used_symbols)
	    {

	      if (TYPE_STUB_DECL (orig_type)
		  && !DECL_IGNORED_P (TYPE_STUB_DECL (orig_type)))
		debug_queue_symbol (TYPE_STUB_DECL (orig_type));
	    }

	  stabstr_C ('=');
	  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;

	  dbxout_type_index (orig_type);
	  dbxout_queue_type (orig_type);
	  return;
	}

      stabstr_C ('=');
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;

      if (use_gnu_debug_info_extensions
	  && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
	{
	  stabstr_S ("@s");
	  stabstr_D (TYPE_PRECISION (type));
	  stabstr_C (';');
	}

      stabstr_C ('e');
      for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
	{
	  stabstr_I (TREE_PURPOSE (tem));
	  stabstr_C (':');

	  if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == 0)
	    stabstr_D (TREE_INT_CST_LOW (TREE_VALUE (tem)));
	  else if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == -1
		   && (HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_VALUE (tem)) < 0)
	    stabstr_D (TREE_INT_CST_LOW (TREE_VALUE (tem)));
	  else
	    stabstr_O (TREE_VALUE (tem));

	  stabstr_C (',');
	  if (TREE_CHAIN (tem) != 0)
	    CONTIN;
	}

      stabstr_C (';');
      break;

    case INTEGER_TYPE:
      dbxout_integer_type (type);
      break;

    case REAL_TYPE:
      dbxout_real_type (type);
      break;

    case BOOLEAN_TYPE:
      dbxout_boolean_type (type);
      break;

    case COMPLEX_TYPE:
      dbxout_complex_type (type);
      break;

    case FUNCTION_TYPE:
      dbxout_function_type (type);
      break;

    case REFERENCE_TYPE:
      dbxout_reference_type (type);
      break;

    case VECTOR_TYPE:
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      /* The frontend feeds us a representation for the vector as a struct
	 containing an array.  Pull out the array type.  */
      type = TREE_TYPE (TYPE_FIELDS (TYPE_DEBUG_REPRESENTATION_TYPE (type)));
      vector_type = true;
      /* Fall through  .. */
    case ARRAY_TYPE:

      stabstr_C ('=');      
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      if (TYPE_PACKED (type) && use_gnu_debug_info_extensions)
	{
	  stabstr_S ("@s");
	  stabstr_D (BITS_PER_UNIT * int_size_in_bytes (type));
	  stabstr_S (";@S;S");
	  dbxout_type (TYPE_DOMAIN (type), 0);
	}

      if (use_gnu_debug_info_extensions && vector_type)
	stabstr_S ("@V;");

      /* Output "a" followed by a range type definition
	 for the index type of the array
	 followed by a reference to the target-type.
	 ar1;0;N;M for a C array of type M and size N+1.  */
      /* Check if a character string type, which in Chill is
	 different from an array of characters.  */
      if (TYPE_STRING_FLAG (type) && use_gnu_debug_info_extensions)
	{
	  stabstr_S ("@S;");
	}
      tem = TYPE_DOMAIN (type);
      if (tem == NULL)
	{
	  stabstr_S ("ar");
	  dbxout_type_index (integer_type_node);
	  stabstr_S (";0;-1;");
	}
      else
	{
	  stabstr_C ('a');
	  dbxout_range_type (tem);
	}

      dbxout_type_index (TREE_TYPE (type));
	
      dbxout_queue_type (TREE_TYPE (type));
      break;

    case METHOD_TYPE:
      stabstr_C ('=');
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      if (use_gnu_debug_info_extensions)
	{
	  stabstr_C ('#');

	  /* Write the argument types out longhand.  */
	  dbxout_type (TYPE_METHOD_BASETYPE (type), 1);
	  stabstr_C (',');
	  dbxout_type (TREE_TYPE (type), 1);
	  dbxout_args (TYPE_ARG_TYPES (type));
	  stabstr_C (';');
	}
      else
	/* Treat it as a function type.  */
	dbxout_type (TREE_TYPE (type), 1);
      break;

    case OFFSET_TYPE:
      stabstr_C ('=');
      typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
      if (use_gnu_debug_info_extensions)
	{
	  stabstr_C ('@');
	  dbxout_type (TYPE_OFFSET_BASETYPE (type), 0);
	  stabstr_C (',');
	  dbxout_type (TREE_TYPE (type), 0);
	}
      else
	/* Should print as an int, because it is really just an offset.  */
	dbxout_type (integer_type_node, 0);
      break;

    default:
      gcc_unreachable ();
    }
}

/* Output cross reference for TYPE.  */

static void
dbxout_type_xref (tree type)
{
  static int anonymous_type_number = 0;
  stabstr_C ('=');
  switch (TREE_CODE (type))
    {
    case RECORD_TYPE:
      stabstr_S ("xs");
      break;
    case UNION_TYPE:
    case QUAL_UNION_TYPE:
      stabstr_S ("xu");
      break;
    case ENUMERAL_TYPE:
      stabstr_S ("xe");
      break;
    default:
      gcc_unreachable ();
    }

  /* APPLE LOCAL begin 5597292 */
  if (TYPE_NAME (type) != 0
      && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
	  || DECL_NAME (TYPE_NAME (type)) != 0))
  /* APPLE LOCAL end 5597292 */
    dbxout_type_name (type);
  else
    {
      stabstr_S ("$$");
      stabstr_D (anonymous_type_number++);
    }
  stabstr_C (':');
  return;
}

/* Describe TYPE as pointer type.  */

static void
dbxout_pointer_type (tree type)
{
  tree ttype;
	
  stabstr_C ('=');
  stabstr_C ('*');
  ttype = TREE_TYPE (type);
  
  dbxout_type_index (ttype);

  dbxout_queue_type (ttype);
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
  return;
}

/* For a void type, just define it as itself; i.e., "5=5".
   This makes us consider it defined
   without saying what it is.  The debugger will make it
   a void type when the reference is seen, and nothing will
   ever override that default.  */

static void
dbxout_void_type (tree type)
{
  stabstr_C ('=');
  dbxout_type_index (type);
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
}

/* Describe TYPE as an integer type.  */

static void
dbxout_integer_type (tree type)
{
  stabstr_C ('=');
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
  if (type == char_type_node && ! TYPE_UNSIGNED (type))
    {
      /* Output the type `char' as a subrange of itself!
	 I don't understand this definition, just copied it
	 from the output of pcc.
	 This used to use `r2' explicitly and we used to
	 take care to make sure that `char' was type number 2.  */
      stabstr_C ('r');
      dbxout_type_index (type);
      stabstr_S (";0;127;");
    }
  
  /* If this is a subtype of another integer type, always prefer to
     write it as a subtype.  */
  else if (TREE_TYPE (type) != 0
	   && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE)
    {
      /* If the size is non-standard, say what it is if we can use
	 GDB extensions.  */
      
      if (use_gnu_debug_info_extensions
	  && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
	{
	  stabstr_S ("@s");
	  stabstr_D (TYPE_PRECISION (type));
	  stabstr_C (';');
	}
      
      dbxout_range_type (type);
    }
  
  else
    {
      /* If the size is non-standard, say what it is if we can use
	 GDB extensions.  */
      
      if (use_gnu_debug_info_extensions
	  && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
	{
	  stabstr_S ("@s");
	  stabstr_D (TYPE_PRECISION (type));
	  stabstr_C (';');
	    }
      
	  if (print_int_cst_bounds_in_octal_p (type))
	    {
	      stabstr_C ('r');
	      
              /* If this type derives from another type, output type index of
		 parent type. This is particularly important when parent type
		 is an enumerated type, because not generating the parent type
		 index would transform the definition of this enumerated type
		 into a plain unsigned type.  */
              if (TREE_TYPE (type) != 0)
                dbxout_type_index (TREE_TYPE (type));
              else
                dbxout_type_index (type);
	      
	      stabstr_C (';');
	      stabstr_O (TYPE_MIN_VALUE (type));
	      stabstr_C (';');
	      stabstr_O (TYPE_MAX_VALUE (type));
	      stabstr_C (';');
	    }
	  
	  else
	    /* Output other integer types as subranges of `int'.  */
	    dbxout_range_type (type);
    }
  return;
}

/* Describe TYPE as a real type.  */

static void
dbxout_real_type (tree type)
{
  stabstr_C ('=');
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
  /* This used to say `r1' and we used to take care
     to make sure that `int' was type number 1.  */
  stabstr_C ('r');
  dbxout_type_index (integer_type_node);
  stabstr_C (';');
  stabstr_D (int_size_in_bytes (type));
  stabstr_S (";0;");
  return;
}

/* Describe type as a boolean type.  */

static void
dbxout_boolean_type (tree type)
{
  stabstr_C ('=');
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
  if (use_gnu_debug_info_extensions)
    {
      stabstr_S ("@s");
      stabstr_D (BITS_PER_UNIT * int_size_in_bytes (type));
      stabstr_S (";-16;");
    }
  else /* Define as enumeral type (False, True) */
    stabstr_S ("eFalse:0,True:1,;");
  return;
}

/* Describe type as a complex type.  */

static void
dbxout_complex_type (tree type)
{
  stabstr_C ('=');
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
  /* Differs from the REAL_TYPE by its new data type number.
     R3 is NF_COMPLEX.  We don't try to use any of the other NF_*
     codes since gdb doesn't care anyway.  */
  
  if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
    {
      stabstr_S ("R3;");
      stabstr_D (2 * int_size_in_bytes (TREE_TYPE (type)));
      stabstr_S (";0;");
    }
  else
    {
      /* Output a complex integer type as a structure,
	 pending some other way to do it.  */
      stabstr_C ('s');
      stabstr_D (int_size_in_bytes (type));
      
      stabstr_S ("real:");
      dbxout_type (TREE_TYPE (type), 0);
      stabstr_S (",0,");
      stabstr_D (TYPE_PRECISION (TREE_TYPE (type)));
      
      stabstr_S (";imag:");
      dbxout_type (TREE_TYPE (type), 0);
      stabstr_C (',');
      stabstr_D (TYPE_PRECISION (TREE_TYPE (type)));
      stabstr_C (',');
      stabstr_D (TYPE_PRECISION (TREE_TYPE (type)));
      stabstr_S (";;");
    }
}

/* Describe TYPE as a function type.  */

static void
dbxout_function_type (tree type)
{
  tree ttype;
  
  stabstr_C ('=');
  stabstr_C ('f');
  ttype = TREE_TYPE (type);
  
  dbxout_type_index (ttype);
  
  dbxout_queue_type (ttype);
  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;

  return;
}

/* Describe TYPE as a reference type.  */

static void
dbxout_reference_type (tree type)
{
  tree ttype;
  
  stabstr_C ('=');
  if (use_gnu_debug_info_extensions)
    {
      stabstr_C ('&');
    }
  else
    stabstr_C ('*');
  
  ttype = TREE_TYPE (type);
  
  dbxout_type_index (ttype);
  
  dbxout_queue_type (ttype);
  /*  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;*/
  return;
}

/*  Assigne next type number as the type number for TYPE.  */

static void
dbxout_next_type_number (tree type)
{

  if (TYPE_SYMTAB_ADDRESS (type) != 0)
    return;

  TYPE_SYMTAB_ADDRESS (type) = next_type_number++;

  if (next_type_number == typevec_len)
    {
      typevec
	= ggc_realloc (typevec, (typevec_len * 2 * sizeof typevec[0]));
      memset (typevec + typevec_len, 0, typevec_len * sizeof typevec[0]);
      typevec_len *= 2;
    }
  
#ifdef DBX_USE_BINCL
  emit_pending_bincls_if_required ();
      typevec[TYPE_SYMTAB_ADDRESS (type)].file_number
	= current_file->file_number;
      typevec[TYPE_SYMTAB_ADDRESS (type)].type_number
	= current_file->next_type_number++;
#endif
}

/*  Return next qualified type num ber.  */

static int
dbxout_next_q_type_number (void)
{

  next_q_type_number++;

  if (next_q_type_number == q_typevec_len)
    {
      q_typevec
	= ggc_realloc (q_typevec, (q_typevec_len * 2 * sizeof q_typevec[0]));
      memset (q_typevec + q_typevec_len, 0, q_typevec_len * sizeof q_typevec[0]);
      q_typevec_len *= 2;
    }
  return next_q_type_number;
}

/* APPLE LOCAL end dbxout_type rewrite.  */

/* Return nonzero if the given type represents an integer whose bounds
   should be printed in octal format.  */

static bool
print_int_cst_bounds_in_octal_p (tree type)
{
  /* 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
     the bounds the usual way, write them in octal.  Note the test is for
     the *target's* size of "long", not that of the host.  The host test
     is just to make sure we can write it out in case the host wide int
     is narrower than the target "long".

     For unsigned types, we use octal if they are the same size or larger.
     This is because we print the bounds as signed decimal, and hence they
     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
      && (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node)
	  || ((TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
	      && TYPE_UNSIGNED (type))
	  || TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT
	  || (TYPE_PRECISION (type) == HOST_BITS_PER_WIDE_INT
	      && TYPE_UNSIGNED (type))))
    return TRUE;
  else
    return FALSE;
}

/* Output the name of type TYPE, with no punctuation.
   Such names can be set up either by typedef declarations
   or by struct, enum and union tags.  */

static void
dbxout_type_name (tree type)
{
  tree t = TYPE_NAME (type);
  
  gcc_assert (t);
  switch (TREE_CODE (t))
    {
    case IDENTIFIER_NODE:
      break;
    case TYPE_DECL:
      t = DECL_NAME (t);
      break;
    default:
      gcc_unreachable ();
    }

  stabstr_I (t);
}

/* Output leading leading struct or class names needed for qualifying
   type whose scope is limited to a struct or class.  */

static void
dbxout_class_name_qualifiers (tree decl)
{
  tree context = decl_type_context (decl);

  if (context != NULL_TREE
      && TREE_CODE(context) == RECORD_TYPE
      && TYPE_NAME (context) != 0
      && (TREE_CODE (TYPE_NAME (context)) == IDENTIFIER_NODE
          || (DECL_NAME (TYPE_NAME (context)) != 0)))
    {
      tree name = TYPE_NAME (context);

      if (TREE_CODE (name) == TYPE_DECL)
	{
	  dbxout_class_name_qualifiers (name);
	  name = DECL_NAME (name);
	}
      stabstr_I (name);
      stabstr_S ("::");
    }
}

/* This is a specialized subset of expand_expr for use by dbxout_symbol in
   evaluating DECL_VALUE_EXPR.  In particular, we stop if we find decls that
   havn't been expanded, or if the expression is getting so complex we won't
   be able to represent it in stabs anyway.  Returns NULL on failure.  */

static rtx
dbxout_expand_expr (tree expr)
{
  switch (TREE_CODE (expr))
    {
    case VAR_DECL:
    case PARM_DECL:
      if (DECL_HAS_VALUE_EXPR_P (expr))
	return dbxout_expand_expr (DECL_VALUE_EXPR (expr));
      /* FALLTHRU */

    case CONST_DECL:
    case RESULT_DECL:
      return DECL_RTL_IF_SET (expr);

    case INTEGER_CST:
      return expand_expr (expr, NULL_RTX, VOIDmode, EXPAND_INITIALIZER);

    case COMPONENT_REF:
    case ARRAY_REF:
    case ARRAY_RANGE_REF:
    case BIT_FIELD_REF:
      {
	enum machine_mode mode;
	HOST_WIDE_INT bitsize, bitpos;
	tree offset, tem;
	int volatilep = 0, unsignedp = 0;
	rtx x;

	tem = get_inner_reference (expr, &bitsize, &bitpos, &offset,
				   &mode, &unsignedp, &volatilep, true);

	x = dbxout_expand_expr (tem);
	if (x == NULL || !MEM_P (x))
	  return NULL;
	if (offset != NULL)
	  {
	    if (!host_integerp (offset, 0))
	      return NULL;
	    x = adjust_address_nv (x, mode, tree_low_cst (offset, 0));
	  }
	if (bitpos != 0)
	  x = adjust_address_nv (x, mode, bitpos / BITS_PER_UNIT);

	return x;
      }

    default:
      return NULL;
    }
}

/* Helper function for output_used_types.  Queue one entry from the
   used types hash to be output.  */

static int
output_used_types_helper (void **slot, void *data)
{
  tree type = *slot;
  VEC(tree, heap) **types_p = data;

  if ((TREE_CODE (type) == RECORD_TYPE
       || TREE_CODE (type) == UNION_TYPE
       || TREE_CODE (type) == QUAL_UNION_TYPE
       || TREE_CODE (type) == ENUMERAL_TYPE)
      && TYPE_STUB_DECL (type)
      && DECL_P (TYPE_STUB_DECL (type))
      && ! DECL_IGNORED_P (TYPE_STUB_DECL (type)))
    VEC_quick_push (tree, *types_p, TYPE_STUB_DECL (type));
  else if (TYPE_NAME (type)
	   && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
    VEC_quick_push (tree, *types_p, TYPE_NAME (type));

  return 1;
}

/* This is a qsort callback which sorts types and declarations into a
   predictable order (types, then declarations, sorted by UID
   within).  */

static int
output_types_sort (const void *pa, const void *pb)
{
  const tree lhs = *((const tree *)pa);
  const tree rhs = *((const tree *)pb);

  if (TYPE_P (lhs))
    {
      if (TYPE_P (rhs))
	return TYPE_UID (lhs) - TYPE_UID (rhs);
      else
	return 1;
    }
  else
    {
      if (TYPE_P (rhs))
	return -1;
      else
	return DECL_UID (lhs) - DECL_UID (rhs);
    }
}


/* Force all types used by this function to be output in debug
   information.  */

static void
output_used_types (void)
{
  if (cfun && cfun->used_types_hash)
    {
      VEC(tree, heap) *types;
      int i;
      tree type;

      types = VEC_alloc (tree, heap, htab_elements (cfun->used_types_hash));
      htab_traverse (cfun->used_types_hash, output_used_types_helper, &types);

      /* Sort by UID to prevent dependence on hash table ordering.  */
      qsort (VEC_address (tree, types), VEC_length (tree, types),
	     sizeof (tree), output_types_sort);

      for (i = 0; VEC_iterate (tree, types, i, type); i++)
	debug_queue_symbol (type);

      VEC_free (tree, heap, types);
    }
}

/* Output a .stabs for the symbol defined by DECL,
   which must be a ..._DECL node in the normal namespace.
   It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
   LOCAL is nonzero if the scope is less than the entire file.
   Return 1 if a stabs might have been emitted.  */

int
dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
{
  tree type = TREE_TYPE (decl);
  tree context = NULL_TREE;
  int result = 0;
  rtx decl_rtl;

  /* "Intercept" dbxout_symbol() calls like we do all debug_hooks.  */
  ++debug_nesting;

  /* Ignore nameless syms, but don't ignore type tags.  */

  if ((DECL_NAME (decl) == 0 && TREE_CODE (decl) != TYPE_DECL)
      || DECL_IGNORED_P (decl))
    DBXOUT_DECR_NESTING_AND_RETURN (0);

  /* If we are to generate only the symbols actually used then such
     symbol nodes are flagged with TREE_USED.  Ignore any that
     aren't flaged as TREE_USED.  */

  if (flag_debug_only_used_symbols
      && (!TREE_USED (decl)
          && (TREE_CODE (decl) != VAR_DECL || !DECL_INITIAL (decl))))
    DBXOUT_DECR_NESTING_AND_RETURN (0);

  /* If dbxout_init has not yet run, queue this symbol for later.  */
  if (!typevec)
    {
      preinit_symbols = tree_cons (0, decl, preinit_symbols);
      DBXOUT_DECR_NESTING_AND_RETURN (0);
    }

  if (flag_debug_only_used_symbols)
    {
      tree t;

      /* We now have a used symbol.  We need to generate the info for
         the symbol's type in addition to the symbol itself.  These
         type symbols are queued to be generated after were done with
         the symbol itself (otherwise they would fight over the
         stabstr obstack).

         Note, because the TREE_TYPE(type) might be something like a
         pointer to a named type we need to look for the first name
         we see following the TREE_TYPE chain.  */

      t = type;
      while (POINTER_TYPE_P (t))
        t = TREE_TYPE (t);

      /* RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, and ENUMERAL_TYPE
         need special treatment.  The TYPE_STUB_DECL field in these
         types generally represents the tag name type we want to
         output.  In addition there  could be a typedef type with
         a different name.  In that case we also want to output
         that.  */

      if (TREE_CODE (t) == RECORD_TYPE
           || TREE_CODE (t) == UNION_TYPE
           || TREE_CODE (t) == QUAL_UNION_TYPE
           || TREE_CODE (t) == ENUMERAL_TYPE)
        {
	    if (TYPE_STUB_DECL (t)
		&& TYPE_STUB_DECL (t) != decl
		&& DECL_P (TYPE_STUB_DECL (t))
		&& ! DECL_IGNORED_P (TYPE_STUB_DECL (t)))
	    {
	      debug_queue_symbol (TYPE_STUB_DECL (t));
	      if (TYPE_NAME (t)
		  && TYPE_NAME (t) != TYPE_STUB_DECL (t)
		  && TYPE_NAME (t) != decl
		  && DECL_P (TYPE_NAME (t)))
		debug_queue_symbol (TYPE_NAME (t));
	    }
	}
      else if (TYPE_NAME (t)
	       && TYPE_NAME (t) != decl
	       && DECL_P (TYPE_NAME (t)))
        debug_queue_symbol (TYPE_NAME (t));
    }

  emit_pending_bincls_if_required ();

  switch (TREE_CODE (decl))
    {
    case CONST_DECL:
      /* Enum values are defined by defining the enum type.  */
      break;

    case FUNCTION_DECL:
      decl_rtl = DECL_RTL_IF_SET (decl);
      if (!decl_rtl)
	DBXOUT_DECR_NESTING_AND_RETURN (0);
      if (DECL_EXTERNAL (decl))
	break;
      /* Don't mention a nested function under its parent.  */
      context = decl_function_context (decl);
      if (context == current_function_decl)
	break;
      /* Don't mention an inline instance of a nested function.  */
      if (context && DECL_FROM_INLINE (decl))
	break;
      if (!MEM_P (decl_rtl)
	  || GET_CODE (XEXP (decl_rtl, 0)) != SYMBOL_REF)
	break;

      if (flag_debug_only_used_symbols)
	output_used_types ();

      dbxout_begin_complex_stabs ();
      stabstr_I (DECL_ASSEMBLER_NAME (decl));
      stabstr_S (TREE_PUBLIC (decl) ? ":F" : ":f");
      result = 1;

      if (TREE_TYPE (type))
	dbxout_type (TREE_TYPE (type), 0);
      else
	dbxout_type (void_type_node, 0);

      /* For a nested function, when that function is compiled,
	 mention the containing function name
	 as well as (since dbx wants it) our own assembler-name.  */
      if (context != 0)
	{
	  stabstr_C (',');
	  stabstr_I (DECL_ASSEMBLER_NAME (decl));
	  stabstr_C (',');
	  stabstr_I (DECL_NAME (context));
	}

      dbxout_finish_complex_stabs (decl, N_FUN, XEXP (decl_rtl, 0), 0, 0);
      break;

    case TYPE_DECL:
      /* Don't output the same typedef twice.
         And don't output what language-specific stuff doesn't want output.  */
      if (TREE_ASM_WRITTEN (decl) || TYPE_DECL_SUPPRESS_DEBUG (decl))
	DBXOUT_DECR_NESTING_AND_RETURN (0);

      /* Don't output typedefs for types with magic type numbers (XCOFF).  */
#ifdef DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER
      {
	int fundamental_type_number =
	  DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER (decl);

	if (fundamental_type_number != 0)
	  {
	    TREE_ASM_WRITTEN (decl) = 1;
	    TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = fundamental_type_number;
	    DBXOUT_DECR_NESTING_AND_RETURN (0);
	  }
      }
#endif
      FORCE_TEXT;
      result = 1;
      {
	int tag_needed = 1;
	int did_output = 0;

            /* APPLE LOCAL begin gdb only used symbols */
	if (DECL_NAME (decl)
#ifdef DBX_ONLY_USED_SYMBOLS
            /* Do not generate a tag for incomplete records */
            && (COMPLETE_TYPE_P (type) || TREE_CODE (type) == VOID_TYPE)
#endif
           )
            /* APPLE LOCAL end gdb only used symbols */
	  {
	    /* Nonzero means we must output a tag as well as a typedef.  */
	    tag_needed = 0;

	    /* Handle the case of a C++ structure or union
	       where the TYPE_NAME is a TYPE_DECL
	       which gives both a typedef name and a tag.  */
	    /* dbx requires the tag first and the typedef second.  */
	    if ((TREE_CODE (type) == RECORD_TYPE
		 || TREE_CODE (type) == UNION_TYPE
		 || TREE_CODE (type) == QUAL_UNION_TYPE)
		&& TYPE_NAME (type) == decl
		&& !use_gnu_debug_info_extensions
		&& !TREE_ASM_WRITTEN (TYPE_NAME (type))
		/* Distinguish the implicit typedefs of C++
		   from explicit ones that might be found in C.  */
		&& DECL_ARTIFICIAL (decl)
                /* Do not generate a tag for incomplete records.  */
                && COMPLETE_TYPE_P (type)
		/* Do not generate a tag for records of variable size,
		   since this type can not be properly described in the
		   DBX format, and it confuses some tools such as objdump.  */
		&& host_integerp (TYPE_SIZE (type), 1))
	      {
		tree name = TYPE_NAME (type);
		if (TREE_CODE (name) == TYPE_DECL)
		  name = DECL_NAME (name);

		dbxout_begin_complex_stabs ();
		stabstr_I (name);
		stabstr_S (":T");
		dbxout_type (type, 1);
		dbxout_finish_complex_stabs (0, DBX_TYPE_DECL_STABS_CODE,
					     0, 0, 0);
	      }

	    dbxout_begin_complex_stabs ();

	    /* Output leading class/struct qualifiers.  */
	    if (use_gnu_debug_info_extensions)
	      dbxout_class_name_qualifiers (decl);

	    /* Output typedef name.  */
	    /* APPLE LOCAL begin 4215975 */
	    if (DECL_NAME (decl) == anon_place_holder)
	      DECL_NAME (decl) = NULL_TREE;
	    else
	      stabstr_I (DECL_NAME (decl));
	    /* APPLE LOCAL end 4215975 */
	    stabstr_C (':');

	    /* Short cut way to output a tag also.  */
	    if ((TREE_CODE (type) == RECORD_TYPE
		 || TREE_CODE (type) == UNION_TYPE
		 || TREE_CODE (type) == QUAL_UNION_TYPE)
		&& TYPE_NAME (type) == decl
		/* Distinguish the implicit typedefs of C++
		   from explicit ones that might be found in C.  */
		&& DECL_ARTIFICIAL (decl))
	      {
		if (use_gnu_debug_info_extensions)
		  {
		    stabstr_C ('T');
		    TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
		  }
	      }

	    stabstr_C ('t');
	    dbxout_type (type, 1);
	    dbxout_finish_complex_stabs (decl, DBX_TYPE_DECL_STABS_CODE,
					 0, 0, 0);
	    did_output = 1;
	  }

	/* Don't output a tag if this is an incomplete type.  This prevents
	   the sun4 Sun OS 4.x dbx from crashing.  */

	if (tag_needed && TYPE_NAME (type) != 0
	    && (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
		|| (DECL_NAME (TYPE_NAME (type)) != 0))
	    && COMPLETE_TYPE_P (type)
	    /* APPLE LOCAL begin dbxout_type rewrite.  */
	    && !TREE_ASM_WRITTEN (TYPE_NAME (type))
	    && (TYPE_SYMTAB_ADDRESS (type) == 0
		|| typevec[TYPE_SYMTAB_ADDRESS (type)].status != TYPE_DEFINED))
	    /* APPLE LOCAL end dbxout_type rewrite.  */
	  {
	    /* For a TYPE_DECL with no name, but the type has a name,
	       output a tag.
	       This is what represents `struct foo' with no typedef.  */
	    /* In C++, the name of a type is the corresponding typedef.
	       In C, it is an IDENTIFIER_NODE.  */
	    tree name = TYPE_NAME (type);
	    if (TREE_CODE (name) == TYPE_DECL)
	      name = DECL_NAME (name);

	    dbxout_begin_complex_stabs ();
	    stabstr_I (name);
	    stabstr_S (":T");
	    dbxout_type (type, 1);
	    dbxout_finish_complex_stabs (0, DBX_TYPE_DECL_STABS_CODE, 0, 0, 0);
	    did_output = 1;
	  }

	/* If an enum type has no name, it cannot be referred to, but
	   we must output it anyway, to record the enumeration
	   constants.  */

	if (!did_output && TREE_CODE (type) == ENUMERAL_TYPE)
	  {
	    dbxout_begin_complex_stabs ();
	    /* Some debuggers fail when given NULL names, so give this a
	       harmless name of " " (Why not "(anon)"?).  */
	    stabstr_S (" :T");
	    dbxout_type (type, 1);
	    dbxout_finish_complex_stabs (0, DBX_TYPE_DECL_STABS_CODE, 0, 0, 0);
	  }

	/* Prevent duplicate output of a typedef.  */
	/* APPLE LOCAL begin 4209318 */
	if (did_output)
	  TREE_ASM_WRITTEN (decl) = 1;
	/* APPLE LOCAL end 4209318 */
	break;
      }

    case PARM_DECL:
      /* Parm decls go in their own separate chains
	 and are output by dbxout_reg_parms and dbxout_parms.  */
      gcc_unreachable ();

    case RESULT_DECL:
    case VAR_DECL:
      /* Don't mention a variable that is external.
	 Let the file that defines it describe it.  */
      if (DECL_EXTERNAL (decl))
	break;

      /* If the variable is really a constant
	 and not written in memory, inform the debugger.

	 ??? Why do we skip emitting the type and location in this case?  */
      if (TREE_STATIC (decl) && TREE_READONLY (decl)
	  && DECL_INITIAL (decl) != 0
	  && host_integerp (DECL_INITIAL (decl), 0)
	  && ! TREE_ASM_WRITTEN (decl)
	  && (DECL_CONTEXT (decl) == NULL_TREE
	      || TREE_CODE (DECL_CONTEXT (decl)) == BLOCK
	      || TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
	  && TREE_PUBLIC (decl) == 0)
	{
	  /* The sun4 assembler does not grok this.  */

	  if (TREE_CODE (TREE_TYPE (decl)) == INTEGER_TYPE
	      || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
	    {
	      HOST_WIDE_INT ival = TREE_INT_CST_LOW (DECL_INITIAL (decl));

	      dbxout_begin_complex_stabs ();
	      dbxout_symbol_name (decl, NULL, 'c');
	      stabstr_S ("=i");
	      stabstr_D (ival);
	      dbxout_finish_complex_stabs (0, N_LSYM, 0, 0, 0);
	      DBXOUT_DECR_NESTING;
	      return 1;
	    }
	  else
	    break;
	}
      /* else it is something we handle like a normal variable.  */

      decl_rtl = dbxout_expand_expr (decl);
      if (!decl_rtl)
	DBXOUT_DECR_NESTING_AND_RETURN (0);

      decl_rtl = eliminate_regs (decl_rtl, 0, NULL_RTX);
#ifdef LEAF_REG_REMAP
      if (current_function_uses_only_leaf_regs)
	leaf_renumber_regs_insn (decl_rtl);
#endif

      result = dbxout_symbol_location (decl, type, 0, decl_rtl);
      break;

    default:
      break;
    }
  DBXOUT_DECR_NESTING;
  return result;
}

/* Output the stab for DECL, a VAR_DECL, RESULT_DECL or PARM_DECL.
   Add SUFFIX to its name, if SUFFIX is not 0.
   Describe the variable as residing in HOME
   (usually HOME is DECL_RTL (DECL), but not always).
   Returns 1 if the stab was really emitted.  */

static int
dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
{
  int letter = 0;
  STAB_CODE_TYPE code;
  rtx addr = 0;
  int number = 0;
  int regno = -1;

  /* Don't mention a variable at all
     if it was completely optimized into nothingness.

     If the decl was from an inline function, then its rtl
     is not identically the rtl that was used in this
     particular compilation.  */
  if (GET_CODE (home) == SUBREG)
    {
      rtx value = home;

      while (GET_CODE (value) == SUBREG)
	value = SUBREG_REG (value);
      if (REG_P (value))
	{
	  if (REGNO (value) >= FIRST_PSEUDO_REGISTER)
	    return 0;
	}
      home = alter_subreg (&home);
    }
  if (REG_P (home))
    {
      regno = REGNO (home);
      if (regno >= FIRST_PSEUDO_REGISTER)
	return 0;
    }

  /* The kind-of-variable letter depends on where
     the variable is and on the scope of its name:
     G and N_GSYM for static storage and global scope,
     S for static storage and file scope,
     V for static storage and local scope,
     for those two, use N_LCSYM if data is in bss segment,
     N_STSYM if in data segment, N_FUN otherwise.
     (We used N_FUN originally, then changed to N_STSYM
     to please GDB.  However, it seems that confused ld.
     Now GDB has been fixed to like N_FUN, says Kingdon.)
     no letter at all, and N_LSYM, for auto variable,
     r and N_RSYM for register variable.  */

  if (MEM_P (home) && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
    {
      if (TREE_PUBLIC (decl))
	{
	  letter = 'G';
	  code = N_GSYM;
	}
      else
	{
	  addr = XEXP (home, 0);

	  letter = decl_function_context (decl) ? 'V' : 'S';

	  /* Some ports can transform a symbol ref into a label ref,
	     because the symbol ref is too far away and has to be
	     dumped into a constant pool.  Alternatively, the symbol
	     in the constant pool might be referenced by a different
	     symbol.  */
	  if (GET_CODE (addr) == SYMBOL_REF
	      && CONSTANT_POOL_ADDRESS_P (addr))
	    {
	      bool marked;
	      rtx tmp = get_pool_constant_mark (addr, &marked);

	      if (GET_CODE (tmp) == SYMBOL_REF)
		{
		  addr = tmp;
		  if (CONSTANT_POOL_ADDRESS_P (addr))
		    get_pool_constant_mark (addr, &marked);
		  else
		    marked = true;
		}
	      else if (GET_CODE (tmp) == LABEL_REF)
		{
		  addr = tmp;
		  marked = true;
		}

	      /* If all references to the constant pool were optimized
		 out, we just ignore the symbol.  */
	      if (!marked)
		return 0;
	    }

	  /* This should be the same condition as in assemble_variable, but
	     we don't have access to dont_output_data here.  So, instead,
	     we rely on the fact that error_mark_node initializers always
	     end up in bss for C++ and never end up in bss for C.  */
	  if (DECL_INITIAL (decl) == 0
	      /* APPLE LOCAL ObjC++ */
	      /* Should we do this for Objective C++?  */
	      || (!strcmp (lang_hooks.name, "GNU C++")
		  && DECL_INITIAL (decl) == error_mark_node))
	    code = N_LCSYM;
	  else if (DECL_IN_TEXT_SECTION (decl))
	    /* This is not quite right, but it's the closest
	       of all the codes that Unix defines.  */
	    code = DBX_STATIC_CONST_VAR_CODE;
	  else
	    {
	      /* Ultrix `as' seems to need this.  */
#ifdef DBX_STATIC_STAB_DATA_SECTION
	      switch_to_section (data_section);
#endif
	      code = N_STSYM;
	    }
	}
    }
  else if (regno >= 0)
    {
      letter = 'r';
      code = N_RSYM;
      number = DBX_REGISTER_NUMBER (regno);
    }
  else if (MEM_P (home)
	   && (MEM_P (XEXP (home, 0))
	       || (REG_P (XEXP (home, 0))
		   && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
		   && REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
		   && REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
#endif
		   )))
    /* If the value is indirect by memory or by a register
       that isn't the frame pointer
       then it means the object is variable-sized and address through
       that register or stack slot.  DBX has no way to represent this
       so all we can do is output the variable as a pointer.
       If it's not a parameter, ignore it.  */
    {
      if (REG_P (XEXP (home, 0)))
	{
	  letter = 'r';
	  code = N_RSYM;
	  if (REGNO (XEXP (home, 0)) >= FIRST_PSEUDO_REGISTER)
	    return 0;
	  number = DBX_REGISTER_NUMBER (REGNO (XEXP (home, 0)));
	}
      else
	{
	  code = N_LSYM;
	  /* RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
	     We want the value of that CONST_INT.  */
	  number = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (home, 0), 0));
	}

      /* Effectively do build_pointer_type, but don't cache this type,
	 since it might be temporary whereas the type it points to
	 might have been saved for inlining.  */
      /* Don't use REFERENCE_TYPE because dbx can't handle that.  */
      type = make_node (POINTER_TYPE);
      TREE_TYPE (type) = TREE_TYPE (decl);
    }
  else if (MEM_P (home)
	   && REG_P (XEXP (home, 0)))
    {
      code = N_LSYM;
      number = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
    }
  else if (MEM_P (home)
	   && GET_CODE (XEXP (home, 0)) == PLUS
	   && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
    {
      code = N_LSYM;
      /* RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
	 We want the value of that CONST_INT.  */
      number = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
    }
  else if (MEM_P (home)
	   && GET_CODE (XEXP (home, 0)) == CONST)
    {
      /* Handle an obscure case which can arise when optimizing and
	 when there are few available registers.  (This is *always*
	 the case for i386/i486 targets).  The RTL looks like
	 (MEM (CONST ...)) even though this variable is a local `auto'
	 or a local `register' variable.  In effect, what has happened
	 is that the reload pass has seen that all assignments and
	 references for one such a local variable can be replaced by
	 equivalent assignments and references to some static storage
	 variable, thereby avoiding the need for a register.  In such
	 cases we're forced to lie to debuggers and tell them that
	 this variable was itself `static'.  */
      code = N_LCSYM;
      letter = 'V';
      addr = XEXP (XEXP (home, 0), 0);
    }
  else if (GET_CODE (home) == CONCAT)
    {
      tree subtype;

      /* If TYPE is not a COMPLEX_TYPE (it might be a RECORD_TYPE,
	 for example), then there is no easy way to figure out
	 what SUBTYPE should be.  So, we give up.  */
      if (TREE_CODE (type) != COMPLEX_TYPE)
	return 0;

      subtype = TREE_TYPE (type);

      /* If the variable's storage is in two parts,
	 output each as a separate stab with a modified name.  */
      if (WORDS_BIG_ENDIAN)
	dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 0));
      else
	dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 0));

      if (WORDS_BIG_ENDIAN)
	dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 1));
      else
	dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 1));
      return 1;
    }
  else
    /* Address might be a MEM, when DECL is a variable-sized object.
       Or it might be const0_rtx, meaning previous passes
       want us to ignore this variable.  */
    return 0;

  /* Ok, start a symtab entry and output the variable name.  */
  emit_pending_bincls_if_required ();
  FORCE_TEXT;

#ifdef DBX_STATIC_BLOCK_START
  /* APPLE LOCAL ss2 */
  DBX_STATIC_BLOCK_START (dbx_out_file, code);
#endif

  dbxout_begin_complex_stabs_noforcetext ();
  dbxout_symbol_name (decl, suffix, letter);
  dbxout_type (type, 0);
  dbxout_finish_complex_stabs (decl, code, addr, 0, number);

#ifdef DBX_STATIC_BLOCK_END
  /* APPLE LOCAL ss2 */
  DBX_STATIC_BLOCK_END (dbx_out_file, code);
#endif
  return 1;
}

/* Output the symbol name of DECL for a stabs, with suffix SUFFIX.
   Then output LETTER to indicate the kind of location the symbol has.  */

static void
dbxout_symbol_name (tree decl, const char *suffix, int letter)
{
  tree name;

  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
       or a namespace member, we must put out the mangled name instead of the
       DECL_NAME.  Note also that static member (variable) names DO NOT begin
       with underscores in .stabs directives.  */
    name = DECL_ASSEMBLER_NAME (decl);
  else
    /* ...but if we're function-local, we don't want to include the junk
       added by ASM_FORMAT_PRIVATE_NAME.  */
    name = DECL_NAME (decl);

  if (name)
    stabstr_I (name);
  else
    stabstr_S ("(anon)");

  if (suffix)
    stabstr_S (suffix);
  stabstr_C (':');
  if (letter)
    stabstr_C (letter);
}

/* Output definitions of all the decls in a chain. Return nonzero if
   anything was output */

int
dbxout_syms (tree syms)
{
  int result = 0;
  while (syms)
    {
      result += dbxout_symbol (syms, 1);
      syms = TREE_CHAIN (syms);
    }
  return result;
}

/* The following two functions output definitions of function parameters.
   Each parameter gets a definition locating it in the parameter list.
   Each parameter that is a register variable gets a second definition
   locating it in the register.

   Printing or argument lists in gdb uses the definitions that
   locate in the parameter list.  But reference to the variable in
   expressions uses preferentially the definition as a register.  */

/* Output definitions, referring to storage in the parmlist,
   of all the parms in PARMS, which is a chain of PARM_DECL nodes.  */

void
dbxout_parms (tree parms)
{
  ++debug_nesting;
  emit_pending_bincls_if_required ();

  for (; parms; parms = TREE_CHAIN (parms))
    if (DECL_NAME (parms)
	&& TREE_TYPE (parms) != error_mark_node
	&& DECL_RTL_SET_P (parms)
	&& DECL_INCOMING_RTL (parms))
      {
	tree eff_type;
	char letter;
	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));
#ifdef LEAF_REG_REMAP
	if (current_function_uses_only_leaf_regs)
	  {
	    leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms));
	    leaf_renumber_regs_insn (DECL_RTL (parms));
	  }
#endif

	if (PARM_PASSED_IN_MEMORY (parms))
	  {
	    rtx inrtl = XEXP (DECL_INCOMING_RTL (parms), 0);

	    /* ??? Here we assume that the parm address is indexed
	       off the frame pointer or arg pointer.
	       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)
	      number = INTVAL (XEXP (inrtl, 1));
	    else
	      number = 0;

	    code = N_PSYM;
	    number = DEBUGGER_ARG_OFFSET (number, inrtl);
	    letter = 'p';

	    /* It is quite tempting to use TREE_TYPE (parms) instead
	       of DECL_ARG_TYPE (parms) for the eff_type, so that gcc
	       reports the actual type of the parameter, rather than
	       the promoted type.  This certainly makes GDB's life
	       easier, at least for some ports.  The change is a bad
	       idea however, since GDB expects to be able access the
	       type without performing any conversions.  So for
	       example, if we were passing a float to an unprototyped
	       function, gcc will store a double on the stack, but if
	       we emit a stab saying the type is a float, then gdb
	       will only read in a single value, and this will produce
	       an erroneous value.  */
	    eff_type = DECL_ARG_TYPE (parms);
	  }
	else if (REG_P (DECL_RTL (parms)))
	  {
	    rtx best_rtl;

	    /* Parm passed in registers and lives in registers or nowhere.  */
	    code = DBX_REGPARM_STABS_CODE;
	    letter = DBX_REGPARM_STABS_LETTER;

	    /* For parms passed in registers, it is better to use the
	       declared type of the variable, not the type it arrived in.  */
	    eff_type = TREE_TYPE (parms);

	    /* If parm lives in a register, use that register; pretend
	       the parm was passed there.  It would be more consistent
	       to describe the register where the parm was passed, but
	       in practice that register usually holds something else.
	       If the parm lives nowhere, use the register where it
	       was passed.  */
	    if (REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
	      best_rtl = DECL_RTL (parms);
	    else
	      best_rtl = DECL_INCOMING_RTL (parms);

	    number = DBX_REGISTER_NUMBER (REGNO (best_rtl));
	  }
	else if (MEM_P (DECL_RTL (parms))
		 && REG_P (XEXP (DECL_RTL (parms), 0))
		 && REGNO (XEXP (DECL_RTL (parms), 0)) != HARD_FRAME_POINTER_REGNUM
		 && REGNO (XEXP (DECL_RTL (parms), 0)) != STACK_POINTER_REGNUM
#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
		 && REGNO (XEXP (DECL_RTL (parms), 0)) != ARG_POINTER_REGNUM
#endif
		 )
	  {
	    /* Parm was passed via invisible reference.
	       That is, its address was passed in a register.
	       Output it as if it lived in that register.
	       The debugger will know from the type
	       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);
	    eff_type = TREE_TYPE (parms);

	    /* DECL_RTL looks like (MEM (REG...).  Get the register number.
	       If it is an unallocated pseudo-reg, then use the register where
	       it was passed instead.
	       ??? Why is DBX_REGISTER_NUMBER not used here?  */

	    if (REGNO (XEXP (DECL_RTL (parms), 0)) < FIRST_PSEUDO_REGISTER)
	      number = REGNO (XEXP (DECL_RTL (parms), 0));
	    else
	      number = REGNO (DECL_INCOMING_RTL (parms));
	  }
	else if (MEM_P (DECL_RTL (parms))
		 && MEM_P (XEXP (DECL_RTL (parms), 0)))
	  {
	    /* Parm was passed via invisible reference, with the reference
	       living on the stack.  DECL_RTL looks like
	       (MEM (MEM (PLUS (REG ...) (CONST_INT ...)))) or it
	       could look like (MEM (MEM (REG))).  */

	    code = N_PSYM;
	    letter = 'v';
	    eff_type = TREE_TYPE (parms);

	    if (!REG_P (XEXP (XEXP (DECL_RTL (parms), 0), 0)))
	      number = INTVAL (XEXP (XEXP (XEXP (DECL_RTL (parms), 0), 0), 1));
	    else
	      number = 0;

	    number = DEBUGGER_ARG_OFFSET (number,
					  XEXP (XEXP (DECL_RTL (parms), 0), 0));
	  }
	else if (MEM_P (DECL_RTL (parms))
		 && XEXP (DECL_RTL (parms), 0) != const0_rtx
		 /* ??? A constant address for a parm can happen
		    when the reg it lives in is equiv to a constant in memory.
		    Should make this not happen, after 2.4.  */
		 && ! CONSTANT_P (XEXP (DECL_RTL (parms), 0)))
	  {
	    /* Parm was passed in registers but lives on the stack.  */

	    code = N_PSYM;
	    letter = 'p';
	    eff_type = TREE_TYPE (parms);

	    /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
	       in which case we want the value of that CONST_INT,
	       or (MEM (REG ...)),
	       in which case we use a value of zero.  */
	    if (!REG_P (XEXP (DECL_RTL (parms), 0)))
	      number = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
	    else
	      number = 0;

	    /* APPLE LOCAL begin ARM prefer SP to FP */
	    /* I'm not sure why this wasn't here in the first place --
	       we surely need it.  */
	    number = DEBUGGER_ARG_OFFSET (number,
					  XEXP (DECL_RTL (parms), 0));
	    /* APPLE LOCAL end ARM prefer SP to FP */

	    /* Make a big endian correction if the mode of the type of the
	       parameter is not the same as the mode of the rtl.  */
	    if (BYTES_BIG_ENDIAN
		&& TYPE_MODE (TREE_TYPE (parms)) != GET_MODE (DECL_RTL (parms))
		&& GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms))) < UNITS_PER_WORD)
	      number += (GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))
			 - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms))));
	  }
	else
	  /* ??? We don't know how to represent this argument.  */
	  continue;

	dbxout_begin_complex_stabs ();
	    
	if (DECL_NAME (parms))
	  {
	    stabstr_I (DECL_NAME (parms));
	    stabstr_C (':');
	  }
	else
	  stabstr_S ("(anon):");
	stabstr_C (letter);
	dbxout_type (eff_type, 0);
	dbxout_finish_complex_stabs (parms, code, 0, 0, number);
      }
  DBXOUT_DECR_NESTING;
}

/* Output definitions for the places where parms live during the function,
   when different from where they were passed, when the parms were passed
   in memory.

   It is not useful to do this for parms passed in registers
   that live during the function in different registers, because it is
   impossible to look in the passed register for the passed value,
   so we use the within-the-function register to begin with.

   PARMS is a chain of PARM_DECL nodes.  */

void
dbxout_reg_parms (tree parms)
{
  ++debug_nesting;

  for (; parms; parms = TREE_CHAIN (parms))
    if (DECL_NAME (parms) && PARM_PASSED_IN_MEMORY (parms))
      {
	/* Report parms that live in registers during the function
	   but were passed in memory.  */
	if (REG_P (DECL_RTL (parms))
	    && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
	  dbxout_symbol_location (parms, TREE_TYPE (parms),
				  0, DECL_RTL (parms));
	else if (GET_CODE (DECL_RTL (parms)) == CONCAT)
	  dbxout_symbol_location (parms, TREE_TYPE (parms),
				  0, DECL_RTL (parms));
	/* Report parms that live in memory but not where they were passed.  */
	else if (MEM_P (DECL_RTL (parms))
		 && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
	  dbxout_symbol_location (parms, TREE_TYPE (parms),
				  0, DECL_RTL (parms));
      }
  DBXOUT_DECR_NESTING;
}

/* Given a chain of ..._TYPE nodes (as come in a parameter list),
   output definitions of those names, in raw form */

static void
dbxout_args (tree args)
{
  while (args)
    {
      stabstr_C (',');
      dbxout_type (TREE_VALUE (args), 0);
      args = TREE_CHAIN (args);
    }
}

/* Subroutine of dbxout_block.  Emit an N_LBRAC stab referencing LABEL.
   BEGIN_LABEL is the name of the beginning of the function, which may
   be required.  */
static void
dbx_output_lbrac (const char *label,
		  const char *begin_label ATTRIBUTE_UNUSED)
{
  dbxout_begin_stabn (N_LBRAC);
  if (DBX_BLOCKS_FUNCTION_RELATIVE)
    dbxout_stab_value_label_diff (label, begin_label);
  else
    dbxout_stab_value_label (label);
}

/* Subroutine of dbxout_block.  Emit an N_RBRAC stab referencing LABEL.
   BEGIN_LABEL is the name of the beginning of the function, which may
   be required.  */
static void
dbx_output_rbrac (const char *label,
		  const char *begin_label ATTRIBUTE_UNUSED)
{
  dbxout_begin_stabn (N_RBRAC);
  if (DBX_BLOCKS_FUNCTION_RELATIVE)
    dbxout_stab_value_label_diff (label, begin_label);
  else
    dbxout_stab_value_label (label);
}

/* Output everything about a symbol block (a BLOCK node
   that represents a scope level),
   including recursive output of contained blocks.

   BLOCK is the BLOCK node.
   DEPTH is its depth within containing symbol blocks.
   ARGS is usually zero; but for the outermost block of the
   body of a function, it is a chain of PARM_DECLs for the function parameters.
   We output definitions of all the register parms
   as if they were local variables of that block.

   If -g1 was used, we count blocks just the same, but output nothing
   except for the outermost block.

   Actually, BLOCK may be several blocks chained together.
   We handle them all in sequence.  */

static void
dbxout_block (tree block, int depth, tree args)
{
  char begin_label[20];
  /* Reference current function start using LFBB.  */
  ASM_GENERATE_INTERNAL_LABEL (begin_label, "LFBB", scope_labelno);

  while (block)
    {
      /* Ignore blocks never expanded or otherwise marked as real.  */
      if (TREE_USED (block) && TREE_ASM_WRITTEN (block))
	{
	  int did_output;
	  int blocknum = BLOCK_NUMBER (block);

	  /* In dbx format, the syms of a block come before the N_LBRAC.
	     If nothing is output, we don't need the N_LBRAC, either.  */
	  did_output = 0;
	  if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
	    did_output = dbxout_syms (BLOCK_VARS (block));
	  if (args)
	    dbxout_reg_parms (args);

	  /* Now output an N_LBRAC symbol to represent the beginning of
	     the block.  Use the block's tree-walk order to generate
	     the assembler symbols LBBn and LBEn
	     that final will define around the code in this block.  */
	  if (did_output)
	    {
	      char buf[20];
	      const char *scope_start;

	      if (depth == 0)
		/* The outermost block doesn't get LBB labels; use
		   the LFBB local symbol emitted by dbxout_begin_prologue.  */
		scope_start = begin_label;
	      else
		{
		  ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum);
		  scope_start = buf;
		}

	      if (BLOCK_HANDLER_BLOCK (block))
		{
		  /* A catch block.  Must precede N_LBRAC.  */
		  tree decl = BLOCK_VARS (block);
		  while (decl)
		    {
		      dbxout_begin_complex_stabs ();
		      stabstr_I (DECL_NAME (decl));
		      stabstr_S (":C1");
		      dbxout_finish_complex_stabs (0, N_CATCH, 0,
						   scope_start, 0);
		      decl = TREE_CHAIN (decl);
		    }
		}
	      dbx_output_lbrac (scope_start, begin_label);
	    }

	  /* Output the subblocks.  */
	  dbxout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);

	  /* Refer to the marker for the end of the block.  */
	  if (did_output)
	    {
	      char buf[100];
	      if (depth == 0)
		/* The outermost block doesn't get LBE labels;
		   use the "scope" label which will be emitted
		   by dbxout_function_end.  */
		ASM_GENERATE_INTERNAL_LABEL (buf, "Lscope", scope_labelno);
	      else
		ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum);

	      dbx_output_rbrac (buf, begin_label);
	    }
	}
      block = BLOCK_CHAIN (block);
    }
}

/* APPLE LOCAL begin dbxout_type rewrite.  */
/* Return TRUE if it is suitable to describe TYPE as cross referenced.  */

#ifdef DBX_NO_XREFS
static bool
dbxout_cross_ref_type_p (tree type)
{
  return ((TYPE_NAME (type) != 0
	   && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
		 && DECL_IGNORED_P (TYPE_NAME (type))))
	  || !COMPLETE_TYPE_P (type)
	  /* No way in DBX fmt to describe a variable size.  */
	  || ! host_integerp (TYPE_SIZE (type), 1));
}
#endif

/* Output type description in a new LSYM stab along with its name.  */

static void
dbxout_type_with_name (tree type)
{

  /* Avoid repetition.  */
  if (TYPE_SYMTAB_ADDRESS (type) != 0
      && typevec[TYPE_SYMTAB_ADDRESS (type)].status == TYPE_DEFINED)
    return;
  
  dbxout_begin_complex_stabs ();
  if (!TYPE_VOLATILE (type)
      && !TYPE_READONLY (type)
      && TYPE_NAME (type)
      && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
      && DECL_NAME (TYPE_NAME (type))
      && COMPLETE_TYPE_P (type))
    {
      stabstr_I (DECL_NAME (TYPE_NAME (type)));
      stabstr_C (':');
      stabstr_C ('t');
    }
  else if ((TREE_CODE (type) == RECORD_TYPE
	   || TREE_CODE (type) == UNION_TYPE
	   || TREE_CODE (type) == QUAL_UNION_TYPE
	   || TREE_CODE (type) == ENUMERAL_TYPE)
	   && COMPLETE_TYPE_P (type)
	   && !TYPE_QUALS (type))
    {
      if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) != TYPE_DECL)
	stabstr_I (TYPE_NAME (type));
      else if (TYPE_NAME (type)
	       && DECL_NAME (TYPE_NAME (type)))
	stabstr_I (DECL_NAME (TYPE_NAME (type)));
      stabstr_C (':');
      stabstr_C ('T');
    }
  else 
    {
      stabstr_C (':');
      stabstr_C ('t');
    }
  dbxout_type (type, 2);
  dbxout_finish_complex_stabs (0, N_LSYM, 0, 0, 0);
}

static GTY ((length ("type_queue_index"))) tree *type_queue;
static GTY (()) int type_queue_index = 0;
static GTY (()) int type_queue_size = 0;

/* Generate the type definitions for queued up types.  */

void
dbxout_flush_type_queue (void)
{
  int i;

  for (i = 0; i < type_queue_index; ++i) 
    {
      tree type = type_queue[i];
      dbxout_type_with_name (type);
    }
  type_queue_index = 0;
}


/* Add TYPE into the queue.  */

static void
dbxout_queue_type (tree type)
{
  /* Get the type number first.  */
  dbxout_next_type_number (type);

  if (typevec[TYPE_SYMTAB_ADDRESS (type)].status == TYPE_QUEUED
      || typevec[TYPE_SYMTAB_ADDRESS (type)].status == TYPE_DEFINED)
    return;

  typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_QUEUED;
  if (type_queue_index >= type_queue_size)
    {
      type_queue_size += 10;
      type_queue = ggc_realloc (type_queue,
			     type_queue_size * sizeof (tree));
    }

  type_queue[type_queue_index++] = type;
}

/* Flush remaining types and free the queue.  */

static void
dbxout_free_type_queue (void)
{
  dbxout_flush_type_queue ();
  if (type_queue)
    {
      ggc_free (type_queue);
      type_queue = NULL;
      type_queue_size = 0;
    }
}
/* APPLE LOCAL end dbxout_type rewrite.  */

/* Output the information about a function and its arguments and result.
   Usually this follows the function's code,
   but on some systems, it comes before.  */

#if defined (DBX_DEBUGGING_INFO)
static void
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)
    {
      int saved_tree_used2 = TREE_USED (DECL_RESULT (decl));
      TREE_USED (DECL_RESULT (decl)) = 1;
      dbxout_symbol (decl, 0);
      TREE_USED (DECL_RESULT (decl)) = saved_tree_used2;
    }
  else
    dbxout_symbol (decl, 0);
  TREE_USED (decl) = saved_tree_used1;

  dbxout_parms (DECL_ARGUMENTS (decl));
  if (DECL_NAME (DECL_RESULT (decl)) != 0)
    dbxout_symbol (DECL_RESULT (decl), 1);
}
#endif /* DBX_DEBUGGING_INFO */

#endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */

#include "gt-dbxout.h"
