Commit df026186 by Geoffrey Keating Committed by Geoffrey Keating

c-pch.c: Include flags.h.

	* c-pch.c: Include flags.h.  Add comments to routines.
	(struct c_pch_validity): New.
	(get_ident): Update PCH file version number.
	(pch_init): Output current debugging type.
	(c_common_valid_pch): Check debugging type.
	* Makefile.in (c-pch.o): Update dependencies.
	* flags.h (debug_type_names): Declare.
	* toplev.c (debug_type_names): Move out of decode_g_option.

From-SVN: r65499
parent ba05abd3
...@@ -2,6 +2,15 @@ ...@@ -2,6 +2,15 @@
* doc/extend.texi (Empty Structures): New. * doc/extend.texi (Empty Structures): New.
* c-pch.c: Include flags.h. Add comments to routines.
(struct c_pch_validity): New.
(get_ident): Update PCH file version number.
(pch_init): Output current debugging type.
(c_common_valid_pch): Check debugging type.
* Makefile.in (c-pch.o): Update dependencies.
* flags.h (debug_type_names): Declare.
* toplev.c (debug_type_names): Move out of decode_g_option.
2003-04-11 Eric Christopher <echristo@redhat.com> 2003-04-11 Eric Christopher <echristo@redhat.com>
* emit-rtl.c (gen_rtx): Fix typos. * emit-rtl.c (gen_rtx): Fix typos.
......
...@@ -1336,7 +1336,8 @@ c-dump.o : c-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ ...@@ -1336,7 +1336,8 @@ c-dump.o : c-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(C_TREE_H) tree-dump.h $(C_TREE_H) tree-dump.h
c-pch.o : c-pch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(CPPLIB_H) $(TREE_H) \ c-pch.o : c-pch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(CPPLIB_H) $(TREE_H) \
c-common.h output.h toplev.h c-pragma.h $(GGC_H) debug.h langhooks.h c-common.h output.h toplev.h c-pragma.h $(GGC_H) debug.h langhooks.h \
flags.h
# Language-independent files. # Language-independent files.
......
...@@ -23,6 +23,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -23,6 +23,7 @@ Boston, MA 02111-1307, USA. */
#include "coretypes.h" #include "coretypes.h"
#include "cpplib.h" #include "cpplib.h"
#include "tree.h" #include "tree.h"
#include "flags.h"
#include "c-common.h" #include "c-common.h"
#include "output.h" #include "output.h"
#include "toplev.h" #include "toplev.h"
...@@ -31,6 +32,11 @@ Boston, MA 02111-1307, USA. */ ...@@ -31,6 +32,11 @@ Boston, MA 02111-1307, USA. */
#include "ggc.h" #include "ggc.h"
#include "langhooks.h" #include "langhooks.h"
struct c_pch_validity
{
unsigned char debug_info_type;
};
struct c_pch_header struct c_pch_header
{ {
unsigned long asm_size; unsigned long asm_size;
...@@ -45,11 +51,16 @@ static long asm_file_startpos; ...@@ -45,11 +51,16 @@ static long asm_file_startpos;
static const char * get_ident PARAMS((void)); static const char * get_ident PARAMS((void));
/* Compute an appropriate 8-byte magic number for the PCH file, so that
utilities like file(1) can identify it, and so that GCC can quickly
ignore non-PCH files and PCH files that are of a completely different
format. */
static const char * static const char *
get_ident() get_ident()
{ {
static char result[IDENT_LENGTH]; static char result[IDENT_LENGTH];
static const char template[IDENT_LENGTH] = "gpch.010"; static const char template[IDENT_LENGTH] = "gpch.011";
memcpy (result, template, IDENT_LENGTH); memcpy (result, template, IDENT_LENGTH);
if (c_language == clk_c) if (c_language == clk_c)
...@@ -61,19 +72,26 @@ get_ident() ...@@ -61,19 +72,26 @@ get_ident()
return result; return result;
} }
/* Prepare to write a PCH file. This is called at the start of
compilation. */
void void
pch_init () pch_init ()
{ {
FILE *f; FILE *f;
struct c_pch_validity v;
if (! pch_file)
return;
if (pch_file)
{
f = fopen (pch_file, "w+b"); f = fopen (pch_file, "w+b");
if (f == NULL) if (f == NULL)
fatal_io_error ("can't open %s", pch_file); fatal_io_error ("can't open %s", pch_file);
pch_outfile = f; pch_outfile = f;
if (fwrite (get_ident(), IDENT_LENGTH, 1, f) != 1) v.debug_info_type = write_symbols;
if (fwrite (get_ident(), IDENT_LENGTH, 1, f) != 1
|| fwrite (&v, sizeof (v), 1, f) != 1)
fatal_io_error ("can't write to %s", pch_file); fatal_io_error ("can't write to %s", pch_file);
/* We need to be able to re-read the output. */ /* We need to be able to re-read the output. */
...@@ -88,9 +106,11 @@ pch_init () ...@@ -88,9 +106,11 @@ pch_init ()
(*debug_hooks->handle_pch) (0); (*debug_hooks->handle_pch) (0);
cpp_save_state (parse_in, f); cpp_save_state (parse_in, f);
}
} }
/* Write the PCH file. This is called at the end of a compilation which
will produce a PCH file. */
void void
c_common_write_pch () c_common_write_pch ()
{ {
...@@ -134,6 +154,9 @@ c_common_write_pch () ...@@ -134,6 +154,9 @@ c_common_write_pch ()
fclose (pch_outfile); fclose (pch_outfile);
} }
/* Check the PCH file called NAME, open on FD, to see if it can be used
in this compilation. */
int int
c_common_valid_pch (pfile, name, fd) c_common_valid_pch (pfile, name, fd)
cpp_reader *pfile; cpp_reader *pfile;
...@@ -144,12 +167,13 @@ c_common_valid_pch (pfile, name, fd) ...@@ -144,12 +167,13 @@ c_common_valid_pch (pfile, name, fd)
int result; int result;
char ident[IDENT_LENGTH]; char ident[IDENT_LENGTH];
const char *pch_ident; const char *pch_ident;
struct c_pch_validity v;
if (! allow_pch) if (! allow_pch)
return 2; return 2;
/* Perform a quick test of whether this is a valid /* Perform a quick test of whether this is a valid
precompiled header for C. */ precompiled header for the current language. */
sizeread = read (fd, ident, IDENT_LENGTH); sizeread = read (fd, ident, IDENT_LENGTH);
if (sizeread == -1) if (sizeread == -1)
...@@ -181,6 +205,26 @@ c_common_valid_pch (pfile, name, fd) ...@@ -181,6 +205,26 @@ c_common_valid_pch (pfile, name, fd)
return 2; return 2;
} }
if (read (fd, &v, sizeof (v)) != sizeof (v))
{
fatal_io_error ("can't read %s", name);
return 2;
}
/* The allowable debug info combinations are that either the PCH file
was built with the same as is being used now, or the PCH file was
built for some kind of debug info but now none is in use. */
if (v.debug_info_type != write_symbols
&& write_symbols != NO_DEBUG)
{
if (cpp_get_options (pfile)->warn_invalid_pch)
cpp_error (pfile, DL_WARNING,
"%s: created with -g%s, but used with -g%s", name,
debug_type_names[v.debug_info_type],
debug_type_names[write_symbols]);
return 2;
}
/* Check the preprocessor macros are the same as when the PCH was /* Check the preprocessor macros are the same as when the PCH was
generated. */ generated. */
...@@ -191,6 +235,9 @@ c_common_valid_pch (pfile, name, fd) ...@@ -191,6 +235,9 @@ c_common_valid_pch (pfile, name, fd)
return result == 0; return result == 0;
} }
/* Load in the PCH file NAME, open on FD. It was originally searched for
by ORIG_NAME. */
void void
c_common_read_pch (pfile, name, fd, orig_name) c_common_read_pch (pfile, name, fd, orig_name)
cpp_reader *pfile; cpp_reader *pfile;
......
...@@ -41,6 +41,9 @@ enum debug_info_type ...@@ -41,6 +41,9 @@ enum debug_info_type
/* Specify which kind of debugging info to generate. */ /* Specify which kind of debugging info to generate. */
extern enum debug_info_type write_symbols; extern enum debug_info_type write_symbols;
/* Names of debug_info_type, for error messages. */
extern const char *const debug_type_names[];
enum debug_info_level enum debug_info_level
{ {
DINFO_LEVEL_NONE, /* Write no debugging info. */ DINFO_LEVEL_NONE, /* Write no debugging info. */
......
...@@ -4268,6 +4268,12 @@ decode_W_option (arg) ...@@ -4268,6 +4268,12 @@ decode_W_option (arg)
return 1; return 1;
} }
/* Indexed by enum debug_info_type. */
const char *const debug_type_names[] =
{
"none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
};
/* Parse a -g... command line switch. ARG is the value after the -g. /* Parse a -g... command line switch. ARG is the value after the -g.
It is safe to access 'ARG - 2' to generate the full switch name. It is safe to access 'ARG - 2' to generate the full switch name.
Return the number of strings consumed. */ Return the number of strings consumed. */
...@@ -4287,11 +4293,6 @@ decode_g_option (arg) ...@@ -4287,11 +4293,6 @@ decode_g_option (arg)
-g and -ggdb don't explicitly set the debugging format so -g and -ggdb don't explicitly set the debugging format so
-gdwarf -g3 is equivalent to -gdwarf3. */ -gdwarf -g3 is equivalent to -gdwarf3. */
static int type_explicitly_set_p = 0; static int type_explicitly_set_p = 0;
/* Indexed by enum debug_info_type. */
static const char *const debug_type_names[] =
{
"none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
};
/* The maximum admissible debug level value. */ /* The maximum admissible debug level value. */
static const unsigned max_debug_level = 3; static const unsigned max_debug_level = 3;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment