gcc/gcc48-pr54117.patch

264 lines
8.0 KiB
Diff

2013-02-13 Jakub Jelinek <jakub@redhat.com>
PR pch/54117
Revert
2012-07-14 Steven Bosscher <steven@gcc.gnu.org>
* toplev.c (init_asm_output): Open asm_out_file in 'w' mode.
* c-pch.c (CHECK_NO_ASM_OUT_DURING_PCH): Do not define.
Remove code conditional on it.
2012-07-01 Uros Bizjak <ubizjak@gmail.com>
* c-pch.c (c_common_write_pch): Remove unused variables.
2012-06-21 Steven Bosscher <steven@gcc.gnu.org>
* c-common.h (c_common_print_pch_checksum): Remove.
* c-pch.c: Do not include output.h.
(CHECK_NO_ASM_OUT_DURING_PCH): Define and add FIXME.
(asm_out_file): Define iff CHECK_NO_ASM_OUT_DURING_PCH isdefined.
(asm_file_startpos): Define iff CHECK_NO_ASM_OUT_DURING_PCH is defined.
(struct c_pch_header): Remove.
(get_ident): Update gpch version.
(pch_init): Do not print executable_checksum to asm_out_file.
Do not fail if there is no asm_out_file to read back from. Set
asm_file_startpos only if CHECK_NO_ASM_OUT_DURING_PCH is defined.
(c_common_write_pch): Verify that nothing was written to asm_out_file
since pch_init was called. Do not write a c_pch_header, and do not
copy from asm_out_file to the PCH.
(c_common_read_pch): Do not read a c_pch_header, and do not restore
the content of asm_out_file from the PCH.
(c_common_print_pch_checksum): Remove.
* c-opts.c (c_common_init): Print out executable_checksum directly.
--- gcc/toplev.c.jj 2013-02-13 09:29:16.197757222 +0100
+++ gcc/toplev.c 2013-02-13 11:34:38.855800182 +0100
@@ -912,7 +912,7 @@ init_asm_output (const char *name)
if (!strcmp (asm_file_name, "-"))
asm_out_file = stdout;
else
- asm_out_file = fopen (asm_file_name, "w");
+ asm_out_file = fopen (asm_file_name, "w+b");
if (asm_out_file == 0)
fatal_error ("can%'t open %s for writing: %m", asm_file_name);
}
--- gcc/c-family/c-pch.c.jj 2013-02-13 09:29:16.065757956 +0100
+++ gcc/c-family/c-pch.c 2013-02-13 11:34:45.552761549 +0100
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3.
#include "tree.h"
#include "flags.h"
#include "c-common.h"
+#include "output.h" /* for asm_out_file */
#include "debug.h"
#include "c-pragma.h"
#include "ggc.h"
@@ -67,11 +68,19 @@ struct c_pch_validity
size_t target_data_length;
};
+struct c_pch_header
+{
+ unsigned long asm_size;
+};
+
#define IDENT_LENGTH 8
/* The file we'll be writing the PCH to. */
static FILE *pch_outfile;
+/* The position in the assembler output file when pch_init was called. */
+static long asm_file_startpos;
+
static const char *get_ident (void);
/* Compute an appropriate 8-byte magic number for the PCH file, so that
@@ -83,7 +92,7 @@ static const char *
get_ident (void)
{
static char result[IDENT_LENGTH];
- static const char templ[] = "gpch.014";
+ static const char templ[] = "gpch.013";
static const char c_language_chars[] = "Co+O";
memcpy (result, templ, IDENT_LENGTH);
@@ -97,7 +106,9 @@ get_ident (void)
static bool pch_ready_to_save_cpp_state = false;
/* Prepare to write a PCH file, if one is being written. This is
- called at the start of compilation. */
+ called at the start of compilation.
+
+ Also, print out the executable checksum if -fverbose-asm is in effect. */
void
pch_init (void)
@@ -107,6 +118,15 @@ pch_init (void)
void *target_validity;
static const char partial_pch[] = "gpcWrite";
+#ifdef ASM_COMMENT_START
+ if (flag_verbose_asm)
+ {
+ fprintf (asm_out_file, "%s ", ASM_COMMENT_START);
+ c_common_print_pch_checksum (asm_out_file);
+ fputc ('\n', asm_out_file);
+ }
+#endif
+
if (!pch_file)
return;
@@ -136,6 +156,14 @@ pch_init (void)
|| fwrite (target_validity, v.target_data_length, 1, f) != 1)
fatal_error ("can%'t write to %s: %m", pch_file);
+ /* We need to be able to re-read the output. */
+ /* The driver always provides a valid -o option. */
+ if (asm_file_name == NULL
+ || strcmp (asm_file_name, "-") == 0)
+ fatal_error ("%qs is not a valid output file", asm_file_name);
+
+ asm_file_startpos = ftell (asm_out_file);
+
/* Let the debugging format deal with the PCHness. */
(*debug_hooks->handle_pch) (0);
@@ -172,6 +200,11 @@ pch_cpp_save_state (void)
void
c_common_write_pch (void)
{
+ char *buf;
+ long asm_file_end;
+ long written;
+ struct c_pch_header h;
+
timevar_push (TV_PCH_SAVE);
targetm.prepare_pch_save ();
@@ -180,6 +213,34 @@ c_common_write_pch (void)
cpp_write_pch_deps (parse_in, pch_outfile);
+ asm_file_end = ftell (asm_out_file);
+ h.asm_size = asm_file_end - asm_file_startpos;
+
+ if (fwrite (&h, sizeof (h), 1, pch_outfile) != 1)
+ fatal_error ("can%'t write %s: %m", pch_file);
+
+ buf = XNEWVEC (char, 16384);
+
+ if (fseek (asm_out_file, asm_file_startpos, SEEK_SET) != 0)
+ fatal_error ("can%'t seek in %s: %m", asm_file_name);
+
+ for (written = asm_file_startpos; written < asm_file_end; )
+ {
+ long size = asm_file_end - written;
+ if (size > 16384)
+ size = 16384;
+ if (fread (buf, size, 1, asm_out_file) != 1)
+ fatal_error ("can%'t read %s: %m", asm_file_name);
+ if (fwrite (buf, size, 1, pch_outfile) != 1)
+ fatal_error ("can%'t write %s: %m", pch_file);
+ written += size;
+ }
+ free (buf);
+ /* asm_out_file can be written afterwards, so fseek to clear
+ _IOREAD flag. */
+ if (fseek (asm_out_file, 0, SEEK_END) != 0)
+ fatal_error ("can%'t seek in %s: %m", asm_file_name);
+
gt_pch_save (pch_outfile);
timevar_push (TV_PCH_CPP_SAVE);
@@ -341,6 +402,7 @@ c_common_read_pch (cpp_reader *pfile, co
int fd, const char *orig_name ATTRIBUTE_UNUSED)
{
FILE *f;
+ struct c_pch_header h;
struct save_macro_data *smd;
expanded_location saved_loc;
bool saved_trace_includes;
@@ -357,6 +419,38 @@ c_common_read_pch (cpp_reader *pfile, co
cpp_get_callbacks (parse_in)->valid_pch = NULL;
+ if (fread (&h, sizeof (h), 1, f) != 1)
+ {
+ cpp_errno (pfile, CPP_DL_ERROR, "reading");
+ fclose (f);
+ goto end;
+ }
+
+ if (!flag_preprocess_only)
+ {
+ unsigned long written;
+ char * buf = XNEWVEC (char, 16384);
+
+ for (written = 0; written < h.asm_size; )
+ {
+ long size = h.asm_size - written;
+ if (size > 16384)
+ size = 16384;
+ if (fread (buf, size, 1, f) != 1
+ || fwrite (buf, size, 1, asm_out_file) != 1)
+ cpp_errno (pfile, CPP_DL_ERROR, "reading");
+ written += size;
+ }
+ free (buf);
+ }
+ else
+ {
+ /* If we're preprocessing, don't write to a NULL
+ asm_out_file. */
+ if (fseek (f, h.asm_size, SEEK_CUR) != 0)
+ cpp_errno (pfile, CPP_DL_ERROR, "seeking");
+ }
+
/* Save the location and then restore it after reading the PCH. */
saved_loc = expand_location (line_table->highest_line);
saved_trace_includes = line_table->trace_includes;
@@ -435,3 +529,14 @@ c_common_pch_pragma (cpp_reader *pfile,
close (fd);
}
+/* Print out executable_checksum[]. */
+
+void
+c_common_print_pch_checksum (FILE *f)
+{
+ int i;
+ fputs ("Compiler executable checksum: ", f);
+ for (i = 0; i < 16; i++)
+ fprintf (f, "%02x", executable_checksum[i]);
+ putc ('\n', f);
+}
--- gcc/c-family/c-opts.c.jj 2013-02-13 09:29:16.110757723 +0100
+++ gcc/c-family/c-opts.c 2013-02-13 11:34:45.551761562 +0100
@@ -999,13 +999,7 @@ c_common_init (void)
cpp_init_iconv (parse_in);
if (version_flag)
- {
- int i;
- fputs ("Compiler executable checksum: ", stderr);
- for (i = 0; i < 16; i++)
- fprintf (stderr, "%02x", executable_checksum[i]);
- putc ('\n', stderr);
- }
+ c_common_print_pch_checksum (stderr);
/* Has to wait until now so that cpplib has its hash table. */
init_pragma ();
--- gcc/c-family/c-common.h.jj 2013-02-13 09:29:16.152757462 +0100
+++ gcc/c-family/c-common.h 2013-02-13 11:34:45.551761562 +0100
@@ -1011,6 +1011,7 @@ extern void c_common_read_pch (cpp_reade
extern void c_common_write_pch (void);
extern void c_common_no_more_pch (void);
extern void c_common_pch_pragma (cpp_reader *pfile, const char *);
+extern void c_common_print_pch_checksum (FILE *f);
/* In *-checksum.c */
extern const unsigned char executable_checksum[16];