aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2006-08-26 21:38:46 +0000
committerJoseph Myers <joseph@codesourcery.com>2006-08-26 21:38:46 +0000
commit3963bf55bf93a20f7ef8a091956d318dba9d701b (patch)
treea5124e3c47e8d988de14e9615b356c0d0eb3b461
parent3db484397faef5324e93e03bb930721509cec60a (diff)
PR c++/24009
* input.h (restore_input_file_stack): Declare. (INPUT_FILE_STACK_BITS): Define. * toplev.c (fs_p, input_file_stack_history, input_file_stack_restored, restore_input_file_stack): New. (push_srcloc, pop_srcloc): Check for input_file_stack_tick overflowing INPUT_FILE_STACK_BITS bits. Save new state of stack. (pop_srcloc): Don't free old state of stack. cp: * parser.c (struct cp_token): Add input_file_stack_index. (eof_token): Update. (cp_lexer_get_preprocessor_token): Save input_file_stack_tick. (cp_lexer_set_source_position_from_token): Restore input file stack. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@116479 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/parser.c9
-rw-r--r--gcc/input.h4
-rw-r--r--gcc/toplev.c36
5 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5014f6aee5e..7e4cd7ce31a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2006-08-26 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c++/24009
+ * input.h (restore_input_file_stack): Declare.
+ (INPUT_FILE_STACK_BITS): Define.
+ * toplev.c (fs_p, input_file_stack_history,
+ input_file_stack_restored, restore_input_file_stack): New.
+ (push_srcloc, pop_srcloc): Check for input_file_stack_tick
+ overflowing INPUT_FILE_STACK_BITS bits. Save new state of stack.
+ (pop_srcloc): Don't free old state of stack.
+
2006-08-26 David Edelsohn <edelsohn@gnu.org>
PR target/27544
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e219547c545..5c8b1cb1564 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2006-08-26 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c++/24009
+ * parser.c (struct cp_token): Add input_file_stack_index.
+ (eof_token): Update.
+ (cp_lexer_get_preprocessor_token): Save input_file_stack_tick.
+ (cp_lexer_set_source_position_from_token): Restore input file
+ stack.
+
2006-08-26 Lee Millward <lee.millward@codesourcery.com>
PR c++/28736
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 4e62340a0e9..a97518ac9a5 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -66,6 +66,8 @@ typedef struct cp_token GTY (())
KEYWORD is RID_MAX) iff this name was looked up and found to be
ambiguous. An error has already been reported. */
BOOL_BITFIELD ambiguous_p : 1;
+ /* The input file stack index at which this token was found. */
+ unsigned input_file_stack_index : INPUT_FILE_STACK_BITS;
/* The value associated with this token, if any. */
tree value;
/* The location at which this token was found. */
@@ -79,7 +81,7 @@ DEF_VEC_ALLOC_P (cp_token_position,heap);
static const cp_token eof_token =
{
- CPP_EOF, RID_MAX, 0, PRAGMA_NONE, 0, 0, false, NULL_TREE,
+ CPP_EOF, RID_MAX, 0, PRAGMA_NONE, 0, 0, false, 0, NULL_TREE,
#if USE_MAPPED_LOCATION
0
#else
@@ -393,6 +395,7 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
/* Get a new token from the preprocessor. */
token->type
= c_lex_with_flags (&token->value, &token->location, &token->flags);
+ token->input_file_stack_index = input_file_stack_tick;
token->keyword = RID_MAX;
token->pragma_kind = PRAGMA_NONE;
token->in_system_header = in_system_header;
@@ -450,7 +453,8 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
}
}
-/* Update the globals input_location and in_system_header from TOKEN. */
+/* Update the globals input_location and in_system_header and the
+ input file stack from TOKEN. */
static inline void
cp_lexer_set_source_position_from_token (cp_token *token)
{
@@ -458,6 +462,7 @@ cp_lexer_set_source_position_from_token (cp_token *token)
{
input_location = token->location;
in_system_header = token->in_system_header;
+ restore_input_file_stack (token->input_file_stack_index);
}
}
diff --git a/gcc/input.h b/gcc/input.h
index 0ca3ccfd733..2fea1a65c9b 100644
--- a/gcc/input.h
+++ b/gcc/input.h
@@ -84,6 +84,7 @@ extern void push_srcloc (location_t);
extern void push_srcloc (const char *name, int line);
#endif /* ! USE_MAPPED_LOCATION */
extern void pop_srcloc (void);
+extern void restore_input_file_stack (int);
#define LOCATION_FILE(LOC) ((expand_location (LOC)).file)
#define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
@@ -98,4 +99,7 @@ extern struct file_stack *input_file_stack;
/* Incremented on each change to input_file_stack. */
extern int input_file_stack_tick;
+/* The number of bits available for input_file_stack_tick. */
+#define INPUT_FILE_STACK_BITS 31
+
#endif
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 55019ed5413..53fcdfe580c 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -164,6 +164,16 @@ struct file_stack *input_file_stack;
/* Incremented on each change to input_file_stack. */
int input_file_stack_tick;
+/* Record of input_file_stack at each tick. */
+typedef struct file_stack *fs_p;
+DEF_VEC_P(fs_p);
+DEF_VEC_ALLOC_P(fs_p,heap);
+static VEC(fs_p,heap) *input_file_stack_history;
+
+/* Whether input_file_stack has been restored to a previous state (in
+ which case there should be no more pushing). */
+static bool input_file_stack_restored;
+
/* Name to use as base of names for dump output files. */
const char *dump_base_name;
@@ -951,6 +961,10 @@ push_srcloc (const char *file, int line)
{
struct file_stack *fs;
+ gcc_assert (!input_file_stack_restored);
+ if (input_file_stack_tick == (int) ((1U << INPUT_FILE_STACK_BITS) - 1))
+ sorry ("GCC supports only %d input file changes", input_file_stack_tick);
+
fs = XNEW (struct file_stack);
fs->location = input_location;
fs->next = input_file_stack;
@@ -962,6 +976,7 @@ push_srcloc (const char *file, int line)
#endif
input_file_stack = fs;
input_file_stack_tick++;
+ VEC_safe_push (fs_p, heap, input_file_stack_history, input_file_stack);
}
/* Pop the top entry off the stack of presently open source files.
@@ -973,11 +988,30 @@ pop_srcloc (void)
{
struct file_stack *fs;
+ gcc_assert (!input_file_stack_restored);
+ if (input_file_stack_tick == (int) ((1U << INPUT_FILE_STACK_BITS) - 1))
+ sorry ("GCC supports only %d input file changes", input_file_stack_tick);
+
fs = input_file_stack;
input_location = fs->location;
input_file_stack = fs->next;
- free (fs);
input_file_stack_tick++;
+ VEC_safe_push (fs_p, heap, input_file_stack_history, input_file_stack);
+}
+
+/* Restore the input file stack to its state as of TICK, for the sake
+ of diagnostics after processing the whole input. Once this has
+ been called, push_srcloc and pop_srcloc may no longer be
+ called. */
+void
+restore_input_file_stack (int tick)
+{
+ if (tick == 0)
+ input_file_stack = NULL;
+ else
+ input_file_stack = VEC_index (fs_p, input_file_stack_history, tick - 1);
+ input_file_stack_tick = tick;
+ input_file_stack_restored = true;
}
/* Compile an entire translation unit. Write a file of assembly