dbxout.c (DBXOUT_DECR_NESTING): Emit pending bincls, if required.
authorDevang Patel <dpatel@apple.com>
Tue, 1 Jul 2003 19:04:18 +0000 (12:04 -0700)
committerDevang Patel <dpatel@gcc.gnu.org>
Tue, 1 Jul 2003 19:04:18 +0000 (12:04 -0700)
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

gcc/ChangeLog
gcc/dbxout.c

index 89ae7451030d66a6b6952566dcd3a07235e7d0b4..f846aebf69cce154a4aa3c00f02c52af6bb59d3e 100644 (file)
@@ -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.
index 6e561862f902eb81c084c72a07dcf36a7a440007..603b8fafc9ccb77193d35c7ab929e32381b1a0ef 100644 (file)
@@ -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)
       {