dbxout.c (DBXOUT_DECR_NESTING): Emit pending bincls, if required.
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. From-SVN: r68787
This commit is contained in:
parent
28570f7ec6
commit
33e9d2aa3d
@ -1,3 +1,27 @@
|
||||
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.
|
||||
|
||||
2003-07-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* c-semantics.c (genrtl_case_label): Fix format specifier bug.
|
||||
|
100
gcc/dbxout.c
100
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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user