summaryrefslogtreecommitdiff
path: root/gcc/dbxout.c
diff options
context:
space:
mode:
authordpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-07-01 19:04:18 +0000
committerdpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-07-01 19:04:18 +0000
commit51cec3390af9294fe069d3fe876778cbfb50cb53 (patch)
tree19310319c49d2025d297ca1c1fbba1a65167bd45 /gcc/dbxout.c
parent60138398aad9b61f6dade76210369ff71286a3a6 (diff)
downloadgcc-51cec3390af9294fe069d3fe876778cbfb50cb53.tar.gz
2003-07-01 Devang Patel <dpatel@apple.com>
* dbxout.c (DBXOUT_DECR_NESTING): Emit pending bincls, if required. (binclstatus): New. (struct dbx_file): New members - bincl_status, pending_bincl_name and prev. (pending_bincls): New. (dbxout_init): Initialize new dbx_file members. (dbxout_start_source_file): Same. (emit_bincl_stab): New function. (emit_pending_bincls): Same. (emit_pending_bincls_if_required): Same. (dbxout_end_source_file): Emit EINCL stab only if BINCL is already processed. (dbxout_begin_block): Emit pending BINCL stabs. (dbxout_end_block): Same. (dbxout_function_decl): Same. (dbxout_continue): Same. (dbxout_type): Same. (dbxout_class_name_qualifiers): Same. (dbxout_symbol): Same. (dbxout_symbol_location): Same. (dbxout_parms): Same. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68787 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dbxout.c')
-rw-r--r--gcc/dbxout.c100
1 files changed, 94 insertions, 6 deletions
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index 6e561862f90..603b8fafc9c 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -96,7 +96,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#undef DBXOUT_DECR_NESTING
#define DBXOUT_DECR_NESTING \
if (--debug_nesting == 0 && symbol_queue_index > 0) \
- debug_flush_symbol_queue ()
+ { emit_pending_bincls_if_required (); debug_flush_symbol_queue (); }
#undef DBXOUT_DECR_NESTING_AND_RETURN
#define DBXOUT_DECR_NESTING_AND_RETURN(x) \
@@ -179,6 +179,8 @@ static GTY(()) int typevec_len;
static GTY(()) int next_type_number;
+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. */
@@ -188,8 +190,14 @@ struct dbx_file GTY(())
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. */
};
+/* If zero then there is no pending BINCL. */
+static int pending_bincls = 0;
+
/* This is the top of the stack. */
static GTY(()) struct dbx_file *current_file;
@@ -307,6 +315,10 @@ static int current_sym_nchars;
#define CONTIN do { } while (0)
#endif
+static void emit_bincl_stab (const char *c);
+static void emit_pending_bincls (void);
+static inline void emit_pending_bincls_if_required (void);
+
static void dbxout_init (const char *);
static void dbxout_finish (const char *);
static void dbxout_start_source_file (unsigned, const char *);
@@ -502,6 +514,9 @@ dbxout_init (const char *input_file_name)
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
/* Make sure that types `int' and `char' have numbers 1 and 2.
@@ -542,6 +557,59 @@ dbxout_typedefs (tree syms)
}
}
+/* Emit BINCL stab using given name. */
+static void
+emit_bincl_stab (const char *name)
+{
+ fprintf (asmfile, "%s", ASM_STABS_OP);
+ output_quoted_string (asmfile, name);
+ fprintf (asmfile, ",%d,0,0,0\n", N_BINCL);
+}
+
+/* If there are pending bincls then it is time to emit all of them. */
+
+static inline void
+emit_pending_bincls_if_required ()
+{
+#ifdef DBX_USE_BINCL
+ if (pending_bincls)
+ emit_pending_bincls ();
+#endif
+}
+
+/* Emit all pending bincls. */
+
+static void
+emit_pending_bincls ()
+{
+ 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;
+}
+
/* Change to reading from a new source file. Generate a N_BINCL stab. */
static void
@@ -552,12 +620,16 @@ dbxout_start_source_file (unsigned int line ATTRIBUTE_UNUSED,
struct dbx_file *n = (struct dbx_file *) ggc_alloc (sizeof *n);
n->next = current_file;
- n->file_number = next_file_number++;
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;
+ current_file->prev = n;
+ n->bincl_status = BINCL_PENDING;
+ n->pending_bincl_name = filename;
+ pending_bincls = 1;
current_file = n;
- fprintf (asmfile, "%s", ASM_STABS_OP);
- output_quoted_string (asmfile, filename);
- fprintf (asmfile, ",%d,0,0,0\n", N_BINCL);
#endif
}
@@ -567,7 +639,10 @@ static void
dbxout_end_source_file (unsigned int line ATTRIBUTE_UNUSED)
{
#ifdef DBX_USE_BINCL
- fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
+ /* Emit EINCL stab only if BINCL is not pending. */
+ if (current_file->bincl_status == BINCL_PROCESSED)
+ fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
+ current_file->bincl_status = BINCL_NOT_REQUIRED;
current_file = current_file->next;
#endif
}
@@ -652,6 +727,7 @@ dbxout_source_line (unsigned int lineno, const char *filename)
static void
dbxout_begin_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
{
+ emit_pending_bincls_if_required ();
(*targetm.asm_out.internal_label) (asmfile, "LBB", n);
}
@@ -660,6 +736,7 @@ dbxout_begin_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
static void
dbxout_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
{
+ emit_pending_bincls_if_required ();
(*targetm.asm_out.internal_label) (asmfile, "LBE", n);
}
@@ -672,6 +749,7 @@ dbxout_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
static void
dbxout_function_decl (tree decl)
{
+ emit_pending_bincls_if_required ();
#ifndef DBX_FUNCTION_FIRST
dbxout_begin_function (decl);
#endif
@@ -798,6 +876,7 @@ dbxout_type_index (tree type)
static void
dbxout_continue (void)
{
+ emit_pending_bincls_if_required ();
#ifdef DBX_CONTIN_CHAR
fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
#else
@@ -1183,6 +1262,7 @@ dbxout_type (tree type, int full)
}
#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
@@ -1977,6 +2057,8 @@ dbxout_class_name_qualifiers (tree decl)
{
tree name = TYPE_NAME (context);
+ emit_pending_bincls_if_required ();
+
if (TREE_CODE (name) == TYPE_DECL)
{
dbxout_class_name_qualifiers (name);
@@ -2069,6 +2151,8 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
debug_queue_symbol (TYPE_NAME (t));
}
+ emit_pending_bincls_if_required ();
+
dbxout_prepare_symbol (decl);
/* The output will always start with the symbol name,
@@ -2341,6 +2425,8 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
int letter = 0;
int regno = -1;
+ emit_pending_bincls_if_required ();
+
/* Don't mention a variable at all
if it was completely optimized into nothingness.
@@ -2654,6 +2740,8 @@ 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)
{