diff options
author | dpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-01 19:04:18 +0000 |
---|---|---|
committer | dpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-01 19:04:18 +0000 |
commit | 51cec3390af9294fe069d3fe876778cbfb50cb53 (patch) | |
tree | 19310319c49d2025d297ca1c1fbba1a65167bd45 /gcc/dbxout.c | |
parent | 60138398aad9b61f6dade76210369ff71286a3a6 (diff) | |
download | gcc-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.c | 100 |
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) { |