This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

dbxout & pch improvements


Getting DBX output just right with PCH in a subtle way was proving
somewhere between "too hard" and "impossible".  So, I gave up on
subtlety, and hit it with a big hammer.  It seems to work for
everything I threw at it.

Plus, I finally get to commit the static-3 testcase which checks the
basic block counter.

Bootstrapped & tested on powerpc-darwin.

-- 
- Geoffrey Keating <geoffk at apple dot com>

===File ~/patches/gcc-pchdbxreal.patch======================
2003-04-04  Geoffrey Keating  <geoffk at apple dot 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 at apple dot 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.

Index: gcc/c-pch.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-pch.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 c-pch.c
--- gcc/c-pch.c	13 Mar 2003 03:48:27 -0000	1.6
+++ gcc/c-pch.c	5 Apr 2003 06:14:14 -0000
@@ -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
      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
   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
     return;
 
   fclose (f);
-
-  (*debug_hooks->end_source_file) (lineno);
 }
Index: gcc/dbxout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dbxout.c,v
retrieving revision 1.135
diff -u -p -u -p -r1.135 dbxout.c
--- gcc/dbxout.c	4 Apr 2003 22:34:52 -0000	1.135
+++ gcc/dbxout.c	5 Apr 2003 06:14:14 -0000
@@ -189,32 +189,41 @@ static GTY(()) struct dbx_file *current_
 
 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
 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_h
   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
   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  */
 
@@ -383,7 +395,6 @@ const struct gcc_debug_hooks xcoff_debug
 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: gcc/debug.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/debug.c,v
retrieving revision 1.11
diff -u -p -u -p -r1.11 debug.c
--- gcc/debug.c	16 Dec 2002 18:19:20 -0000	1.11
+++ gcc/debug.c	5 Apr 2003 06:14:14 -0000
@@ -43,7 +43,8 @@ const struct gcc_debug_hooks do_nothing_
   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: gcc/debug.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/debug.h,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 debug.h
--- gcc/debug.h	14 Sep 2002 15:51:42 -0000	1.12
+++ gcc/debug.h	5 Apr 2003 06:14:14 -0000
@@ -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: gcc/dwarf2out.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
retrieving revision 1.416
diff -u -p -u -p -r1.416 dwarf2out.c
--- gcc/dwarf2out.c	3 Apr 2003 19:03:08 -0000	1.416
+++ gcc/dwarf2out.c	5 Apr 2003 06:14:15 -0000
@@ -3282,7 +3282,8 @@ const struct gcc_debug_hooks dwarf2_debu
      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
 
Index: gcc/dwarfout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dwarfout.c,v
retrieving revision 1.121
diff -u -p -u -p -r1.121 dwarfout.c
--- gcc/dwarfout.c	20 Feb 2003 17:51:39 -0000	1.121
+++ gcc/dwarfout.c	5 Apr 2003 06:14:16 -0000
@@ -1294,7 +1294,8 @@ const struct gcc_debug_hooks dwarf_debug
   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 */
 };
 
 /************************ general utility functions **************************/
Index: gcc/sdbout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/sdbout.c,v
retrieving revision 1.74
diff -u -p -u -p -r1.74 sdbout.c
--- gcc/sdbout.c	16 Jan 2003 15:58:27 -0000	1.74
+++ gcc/sdbout.c	5 Apr 2003 06:14:16 -0000
@@ -333,7 +333,8 @@ const struct gcc_debug_hooks sdb_debug_h
   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 */
 };
 
 #if 0
Index: gcc/vmsdbgout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/vmsdbgout.c,v
retrieving revision 1.24
diff -u -p -u -p -r1.24 vmsdbgout.c
--- gcc/vmsdbgout.c	13 Mar 2003 03:48:31 -0000	1.24
+++ gcc/vmsdbgout.c	5 Apr 2003 06:14:16 -0000
@@ -189,7 +189,8 @@ const struct gcc_debug_hooks vmsdbg_debu
    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
Index: gcc/testsuite/gcc.dg/pch/pch.exp
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.dg/pch/pch.exp,v
retrieving revision 1.5
diff -u -p -u -p -r1.5 pch.exp
--- gcc/testsuite/gcc.dg/pch/pch.exp	28 Feb 2003 23:06:10 -0000	1.5
+++ gcc/testsuite/gcc.dg/pch/pch.exp	5 Apr 2003 06:15:32 -0000
@@ -41,8 +41,11 @@ foreach test [lsort [glob -nocomplain $s
     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.
Index: gcc/testsuite/gcc.dg/pch/static-3.c
===================================================================
RCS file: gcc/testsuite/gcc.dg/pch/static-3.c
diff -N gcc/testsuite/gcc.dg/pch/static-3.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/testsuite/gcc.dg/pch/static-3.c	5 Apr 2003 06:15:32 -0000
@@ -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;
+}
Index: gcc/testsuite/gcc.dg/pch/static-3.hs
===================================================================
RCS file: gcc/testsuite/gcc.dg/pch/static-3.hs
diff -N gcc/testsuite/gcc.dg/pch/static-3.hs
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/testsuite/gcc.dg/pch/static-3.hs	5 Apr 2003 06:15:32 -0000
@@ -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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]