dbxout.c (scope_labelno): Add GTY.
authorGeoffrey Keating <geoffk@apple.com>
Sat, 5 Apr 2003 07:01:51 +0000 (07:01 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Sat, 5 Apr 2003 07:01:51 +0000 (07:01 +0000)
2003-04-04  Geoffrey Keating  <geoffk@apple.com>

* dbxout.c (scope_labelno): Add GTY.
(have_used_extensions): Add GTY.
(source_label_number): Add GTY.
(lastfile): Add GTY.
(lastfile_is_base): New.
(base_input_file): New.
(dbxout_handle_pch): New.
(dbx_debug_hooks): Add handle_pch.
(xcoff_debug_hooks): Likewise.
(dbxout_function_end): Remove scope_labelno.
(dbxout_init): Set base_input_file.
(dbxout_handle_pch): New.
(dbxout_source_file): Honour lastfile_is_base.
* dwarfout.c (dwarf_debug_hooks): Add dummy handle_pch.
* sdbout.c (sdb_debug_hooks): Add dummy handle_pch.
* vmsdbgout.c (vmsdbg_debug_hooks): Add dummy handle_pch.
* dwarf2out.c (dwarf2_debug_hooks): Add dummy handle_pch.
* debug.c (do_nothing_debug_hooks): Add dummy handle_pch.
* debug.h (struct gcc_debug_hooks): Add handle_pch.
* c-pch.c (pch_init): Don't call start_source_file, but do call
handle_pch.
(c_common_write_pch): Call handle_pch.
(c_common_read_pch): Don't call start_source_file,
or end_source_file.

Index: gcc/testsuite/ChangeLog
2003-04-04  Geoffrey Keating  <geoffk@apple.com>

* gcc.dg/pch/static-3.c: New.
* gcc.dg/pch/static-3.hs: New.
* gcc.dg/pch/pch.exp: Test with -O0 -g too.

From-SVN: r65266

13 files changed:
gcc/ChangeLog
gcc/c-pch.c
gcc/dbxout.c
gcc/debug.c
gcc/debug.h
gcc/dwarf2out.c
gcc/dwarfout.c
gcc/sdbout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pch/pch.exp
gcc/testsuite/gcc.dg/pch/static-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pch/static-3.hs [new file with mode: 0644]
gcc/vmsdbgout.c

index 6dba14569f2270502326f70a681cb8a567cf32ae..8802ff6455f122e6750917139136f75d5a15779c 100644 (file)
@@ -1,3 +1,30 @@
+2003-04-04  Geoffrey Keating  <geoffk@apple.com>
+
+       * dbxout.c (scope_labelno): Add GTY.
+       (have_used_extensions): Add GTY.
+       (source_label_number): Add GTY.
+       (lastfile): Add GTY.
+       (lastfile_is_base): New.
+       (base_input_file): New.
+       (dbxout_handle_pch): New.
+       (dbx_debug_hooks): Add handle_pch.
+       (xcoff_debug_hooks): Likewise.
+       (dbxout_function_end): Remove scope_labelno.
+       (dbxout_init): Set base_input_file.
+       (dbxout_handle_pch): New.
+       (dbxout_source_file): Honour lastfile_is_base.
+       * dwarfout.c (dwarf_debug_hooks): Add dummy handle_pch.
+       * sdbout.c (sdb_debug_hooks): Add dummy handle_pch.
+       * vmsdbgout.c (vmsdbg_debug_hooks): Add dummy handle_pch.
+       * dwarf2out.c (dwarf2_debug_hooks): Add dummy handle_pch.
+       * debug.c (do_nothing_debug_hooks): Add dummy handle_pch.
+       * debug.h (struct gcc_debug_hooks): Add handle_pch.
+       * c-pch.c (pch_init): Don't call start_source_file, but do call
+       handle_pch.
+       (c_common_write_pch): Call handle_pch.
+       (c_common_read_pch): Don't call start_source_file,
+       or end_source_file.     
+
 Fri Apr  4 17:43:52 2003  Olivier Hainque <hainque@act-europe.fr>
 
         * emit-rtl.c (get_mem_attrs): Adjust alignment tests determining
index 821eddba0888b355cb2b407851cd7bdc7a81d860..27a299ffd3ea8cfb1d8f85cc9392f4d3d49ec7c9 100644 (file)
@@ -68,10 +68,6 @@ pch_init ()
   
   if (pch_file)
     {
-      /* We're precompiling a header file, so when it's actually used,
-        it'll be at least one level deep.  */
-      (*debug_hooks->start_source_file) (lineno, input_filename);
-
       f = fopen (pch_file, "w+b");
       if (f == NULL)
        fatal_io_error ("can't open %s", pch_file);
@@ -88,6 +84,9 @@ pch_init ()
 
       asm_file_startpos = ftell (asm_out_file);
       
+      /* Let the debugging format deal with the PCHness.  */
+      (*debug_hooks->handle_pch) (0);
+
       cpp_save_state (parse_in, f);
     }
 }
@@ -100,6 +99,8 @@ c_common_write_pch ()
   long written;
   struct c_pch_header h;
 
+  (*debug_hooks->handle_pch) (1);
+
   cpp_write_pch_deps (parse_in, pch_outfile);
 
   asm_file_end = ftell (asm_out_file);
@@ -195,7 +196,7 @@ c_common_read_pch (pfile, name, fd, orig_name)
      cpp_reader *pfile;
      const char *name;
      int fd;
-     const char *orig_name;
+     const char *orig_name ATTRIBUTE_UNUSED;
 {
   FILE *f;
   struct c_pch_header h;
@@ -203,10 +204,6 @@ c_common_read_pch (pfile, name, fd, orig_name)
   unsigned long written;
   struct save_macro_data *smd;
   
-  /* Before we wrote the file, we started a source file, so we have to start
-     one here to match.  */
-  (*debug_hooks->start_source_file) (lineno, orig_name);
-  
   f = fdopen (fd, "rb");
   if (f == NULL)
     {
@@ -243,6 +240,4 @@ c_common_read_pch (pfile, name, fd, orig_name)
     return;
 
   fclose (f);
-
-  (*debug_hooks->end_source_file) (lineno);
 }
index 58208fffad2e8d1a5568b193574b84d6de635e85..3f5ace0648468c59c4234ce730264d9b1c61f8c7 100644 (file)
@@ -189,32 +189,41 @@ static GTY(()) struct dbx_file *current_file;
 
 static GTY(()) int next_file_number;
 
-/* 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)
-
-/* Last source file name mentioned in a NOTE insn.  */
-
-static const char *lastfile;
+/* A counter for dbxout_function_end.  */
 
-/* Current working directory.  */
-
-static const char *cwd;
+static GTY(()) int scope_labelno;
 
 /* Nonzero if we have actually used any of the GDB extensions
    to the debugging format.  The idea is that we use them for the
    first time only if there's a strong reason, but once we have done that,
    we use them whenever convenient.  */
 
-static int have_used_extensions = 0;
+static GTY(()) int have_used_extensions = 0;
 
 /* Number for the next N_SOL filename stabs label.  The number 0 is reserved
    for the N_SO filename stabs label.  */
 
-#if defined (DBX_DEBUGGING_INFO) && !defined (DBX_OUTPUT_SOURCE_FILENAME)
-static int source_label_number = 1;
-#endif
+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)
+
+/* The original input file name.  */
+static const char *base_input_file;
+
+/* Current working directory.  */
+
+static const char *cwd;
 
 #ifdef DEBUG_SYMS_TEXT
 #define FORCE_TEXT function_section (current_function_decl);
@@ -323,6 +332,7 @@ static void dbxout_begin_function   PARAMS ((tree));
 static void dbxout_begin_block         PARAMS ((unsigned, unsigned));
 static void dbxout_end_block           PARAMS ((unsigned, unsigned));
 static void dbxout_function_decl       PARAMS ((tree));
+static void dbxout_handle_pch          PARAMS ((unsigned));
 
 const struct gcc_debug_hooks dbx_debug_hooks =
 {
@@ -349,7 +359,8 @@ const struct gcc_debug_hooks dbx_debug_hooks =
   dbxout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
-  debug_nothing_rtx            /* label */
+  debug_nothing_rtx,           /* label */
+  dbxout_handle_pch            /* handle_pch */
 };
 #endif /* DBX_DEBUGGING_INFO  */
 
@@ -375,7 +386,8 @@ const struct gcc_debug_hooks xcoff_debug_hooks =
   dbxout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
-  debug_nothing_rtx            /* label */
+  debug_nothing_rtx,           /* label */
+  dbxout_handle_pch            /* handle_pch */
 };
 #endif /* XCOFF_DEBUGGING_INFO  */
 \f
@@ -383,7 +395,6 @@ const struct gcc_debug_hooks xcoff_debug_hooks =
 static void
 dbxout_function_end ()
 {
-  static int scope_labelno = 0;
   char lscope_label_name[100];
   /* Convert Ltext into the appropriate format for local labels in case
      the system doesn't insert underscores in front of user generated
@@ -473,7 +484,7 @@ dbxout_init (input_file_name)
           ASM_STABS_OP, STABS_GCC_MARKER, N_OPT);
 #endif
 
-  lastfile = input_file_name;
+  base_input_file = lastfile = input_file_name;
 
   next_type_number = 1;
 
@@ -559,6 +570,31 @@ dbxout_end_source_file (line)
 #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.  */
 
@@ -567,6 +603,12 @@ dbxout_source_file (file, filename)
      FILE *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)))
     {
 #ifdef DBX_OUTPUT_SOURCE_FILENAME
index 6a9c39251539c2639b83a21a4935204382f321f9..ca17373dbdd6d517e04d17bc14352fb6aa8dd321 100644 (file)
@@ -43,7 +43,8 @@ const struct gcc_debug_hooks do_nothing_debug_hooks =
   debug_nothing_tree,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
-  debug_nothing_rtx            /* label */
+  debug_nothing_rtx,           /* label */
+  debug_nothing_int            /* handle_pch */
 };
 
 /* This file contains implementations of each debug hook that do
index 11c996fddd05f1bbcfa832fa6c4e75ebc9487bc4..2793e302115f07ec6c07ead9c54edfd7c6084237 100644 (file)
@@ -101,6 +101,10 @@ struct gcc_debug_hooks
   /* Called from final_scan_insn for any CODE_LABEL insn whose
      LABEL_NAME is non-null.  */
   void (* label) PARAMS ((rtx));
+
+  /* Called after the start and before the end of writing a PCH file.  
+     The parameter is 0 if after the start, 1 if before the end.  */
+  void (* handle_pch) PARAMS ((unsigned int));
 };
 
 extern const struct gcc_debug_hooks *debug_hooks;
index dcc7d6e3709ce8fc5a5ef073ad50e0764a7287c0..8a9b9fd918f0826943f72a26deb3203496f65d58 100644 (file)
@@ -3282,7 +3282,8 @@ const struct gcc_debug_hooks dwarf2_debug_hooks =
      emitting the abstract description of inline functions until
      something tries to reference them.  */
   dwarf2out_abstract_function, /* outlining_inline_function */
-  debug_nothing_rtx            /* label */
+  debug_nothing_rtx,           /* label */
+  debug_nothing_int            /* handle_pch */
 };
 #endif
 \f
index 8f456f7ee7e6b6f4c6e058a0b5de0bb3fe2d743f..b6d150f04a9a8fdafd9494c5d6a695b36a61c5c8 100644 (file)
@@ -1294,7 +1294,8 @@ const struct gcc_debug_hooks dwarf_debug_hooks =
   dwarfout_global_decl,
   dwarfout_deferred_inline_function,
   debug_nothing_tree,          /* outlining_inline_function */
-  debug_nothing_rtx            /* label */
+  debug_nothing_rtx,           /* label */
+  debug_nothing_int            /* handle_pch */
 };
 \f
 /************************ general utility functions **************************/
index 30565b3dca1fba31c181709e9ec29455167a0e27..aaba3601dc462029602fe1b20cbbdd729c4bf68f 100644 (file)
@@ -333,7 +333,8 @@ const struct gcc_debug_hooks sdb_debug_hooks =
   sdbout_global_decl,          /* global_decl */
   debug_nothing_tree,          /* deferred_inline_function */
   debug_nothing_tree,          /* outlining_inline_function */
-  sdbout_label
+  sdbout_label,                        /* label */
+  debug_nothing_int            /* handle_pch */
 };
 \f
 #if 0
index 1d5fdd799602b2fd60c983fc16825531a8fec6ef..24f448944a9e922fc160053f6c80fde1f7198de8 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-04  Geoffrey Keating  <geoffk@apple.com>
+
+       * gcc.dg/pch/static-3.c: New.
+       * gcc.dg/pch/static-3.hs: New.
+       * gcc.dg/pch/pch.exp: Test with -O0 -g too.
+
 2003-04-04  Richard Henderson  <rth@redhat.com>
 
        * g++.dg/eh/forced1.C: Use _Unwind_SjLj_ForcedUnwind as appropriate.
index 7a5aacaac569f0afb6dda1f309ef37bd730b4bce..543d6147d7be2c31a53885e3c65c3c5f25b59a3f 100644 (file)
@@ -41,8 +41,11 @@ foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
     catch { file delete "$bname.s-gch" }
 
     # We don't try to use the loop-optimizing options, since they are highly
-    # unlikely to make any difference to PCH.
-    foreach flags $torture_without_loops {
+    # unlikely to make any difference to PCH.  However, we do want to
+    # add -O0 -g, since users who want PCH usually want debugging and quick
+    # compiles.
+    set pch_torture [concat [list {-O0 -g}] $torture_without_loops]
+    foreach flags $pch_torture {
        verbose "Testing $nshort, $flags" 1
 
        # For the header files, the default is to precompile.
diff --git a/gcc/testsuite/gcc.dg/pch/static-3.c b/gcc/testsuite/gcc.dg/pch/static-3.c
new file mode 100644 (file)
index 0000000..eae0ab0
--- /dev/null
@@ -0,0 +1,8 @@
+#include "static-3.h"
+int bar(int *a)
+{
+  int i, tot;
+  for (i = tot = 0; i < 100; i++)
+    tot += a[i];
+  return tot;
+}
diff --git a/gcc/testsuite/gcc.dg/pch/static-3.hs b/gcc/testsuite/gcc.dg/pch/static-3.hs
new file mode 100644 (file)
index 0000000..b881945
--- /dev/null
@@ -0,0 +1,7 @@
+static int foo(int *a)
+{
+  int i, tot;
+  for (i = tot = 0; i < 100; i++)
+    tot += a[i];
+  return tot;
+}
index ae3fa17255e926a958a9a14ef70013ea94695d64..7824698ffd280b54683ddce84aa624b41a5fdadf 100644 (file)
@@ -189,7 +189,8 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
    vmsdbgout_global_decl,
    debug_nothing_tree,         /* deferred_inline_function */
    vmsdbgout_abstract_function,
-   debug_nothing_rtx           /* label */
+   debug_nothing_rtx,          /* label */
+   debug_nothing_int           /* handle_pch */
 };
 
 /* Definitions of defaults for assembler-dependent names of various