summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-06 16:18:40 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-06 16:18:40 +0000
commit914db4b784e45909e13d0c229baf49234e4310bb (patch)
tree81d6fae2161fe976ca587b7a58d10fda41f7e93b
parent3687a208b7bfca87fc95ab9e26fa63d0edf474b5 (diff)
downloadgcc-914db4b784e45909e13d0c229baf49234e4310bb.tar.gz
PR middle-end/56461
* internal.h (struct cpp_buffer): Add to_free field. (_cpp_pop_file_buffer): Add third argument. * files.c (_cpp_stack_file): Set buffer->to_free. (_cpp_pop_file_buffer): Add to_free argument. Free to_free if non-NULL, and if equal to file->buffer_start, also clear file->buffer{,_start,_valid}. * directives.c (_cpp_pop_buffer): Pass buffer->to_free to _cpp_pop_file_buffer. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196497 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libcpp/ChangeLog12
-rw-r--r--libcpp/directives.c4
-rw-r--r--libcpp/files.c17
-rw-r--r--libcpp/internal.h5
4 files changed, 30 insertions, 8 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 3d8473dabb6..e3a6637f095 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,15 @@
+2013-03-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/56461
+ * internal.h (struct cpp_buffer): Add to_free field.
+ (_cpp_pop_file_buffer): Add third argument.
+ * files.c (_cpp_stack_file): Set buffer->to_free.
+ (_cpp_pop_file_buffer): Add to_free argument. Free to_free
+ if non-NULL, and if equal to file->buffer_start, also clear
+ file->buffer{,_start,_valid}.
+ * directives.c (_cpp_pop_buffer): Pass buffer->to_free
+ to _cpp_pop_file_buffer.
+
2013-03-01 Jakub Jelinek <jakub@redhat.com>
PR middle-end/56461
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 46b86085d83..65b2034d0e2 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -2558,6 +2558,7 @@ _cpp_pop_buffer (cpp_reader *pfile)
cpp_buffer *buffer = pfile->buffer;
struct _cpp_file *inc = buffer->file;
struct if_stack *ifs;
+ const unsigned char *to_free;
/* Walk back up the conditional stack till we reach its level at
entry to this file, issuing error messages. */
@@ -2571,6 +2572,7 @@ _cpp_pop_buffer (cpp_reader *pfile)
/* _cpp_do_file_change expects pfile->buffer to be the new one. */
pfile->buffer = buffer->prev;
+ to_free = buffer->to_free;
free (buffer->notes);
/* Free the buffer object now; we may want to push a new buffer
@@ -2579,7 +2581,7 @@ _cpp_pop_buffer (cpp_reader *pfile)
if (inc)
{
- _cpp_pop_file_buffer (pfile, inc);
+ _cpp_pop_file_buffer (pfile, inc, to_free);
_cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0);
}
diff --git a/libcpp/files.c b/libcpp/files.c
index dae5526997f..5c5a0b9b514 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -894,6 +894,7 @@ _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
&& !CPP_OPTION (pfile, directives_only));
buffer->file = file;
buffer->sysp = sysp;
+ buffer->to_free = file->buffer_start;
/* Initialize controlling macro state. */
pfile->mi_valid = true;
@@ -1435,7 +1436,8 @@ cpp_push_default_include (cpp_reader *pfile, const char *fname)
/* Do appropriate cleanup when a file INC's buffer is popped off the
input stack. */
void
-_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
+_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file,
+ const unsigned char *to_free)
{
/* Record the inclusion-preventing macro, which could be NULL
meaning no controlling macro. */
@@ -1445,12 +1447,15 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
/* Invalidate control macros in the #including file. */
pfile->mi_valid = false;
- if (file->buffer_start)
+ if (to_free)
{
- free ((void *) file->buffer_start);
- file->buffer_start = NULL;
- file->buffer = NULL;
- file->buffer_valid = false;
+ if (to_free == file->buffer_start)
+ {
+ file->buffer_start = NULL;
+ file->buffer = NULL;
+ file->buffer_valid = false;
+ }
+ free ((void *) to_free);
}
}
diff --git a/libcpp/internal.h b/libcpp/internal.h
index 7731666aba9..1226dbd982b 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -301,6 +301,8 @@ struct cpp_buffer
const unsigned char *buf; /* Entire character buffer. */
const unsigned char *rlimit; /* Writable byte at end of file. */
+ const unsigned char *to_free; /* Pointer that should be freed when
+ popping the buffer. */
_cpp_line_note *notes; /* Array of notes. */
unsigned int cur_note; /* Next note to process. */
@@ -635,7 +637,8 @@ extern int _cpp_compare_file_date (cpp_reader *, const char *, int);
extern void _cpp_report_missing_guards (cpp_reader *);
extern void _cpp_init_files (cpp_reader *);
extern void _cpp_cleanup_files (cpp_reader *);
-extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *);
+extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *,
+ const unsigned char *);
extern bool _cpp_save_file_entries (cpp_reader *pfile, FILE *f);
extern bool _cpp_read_file_entries (cpp_reader *, FILE *);
extern const char *_cpp_get_file_name (_cpp_file *);