summaryrefslogtreecommitdiff
path: root/libcpp/pch.c
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2010-09-29 18:18:38 +0000
committerKai Tietz <ktietz@gcc.gnu.org>2010-09-29 20:18:38 +0200
commitd687413849f10f957c782eb4de2a54f3e78a7aae (patch)
treea94ac27b289fa25455ae4117a0a74ade6430a227 /libcpp/pch.c
parenta0c6102d2935c97d834296038b1485f8841aa708 (diff)
re PR preprocessor/45362 (Dangling reference about saved cpp_macro for push/pop macro)
2010-09-29 Kai Tietz <kai.tietz@onevision.com> PR preprocessor/45362 * directives.c (cpp_pop_definition): Make static. (do_pragma_push_macro): Reworked to store text definition. (do_pragma_pop_macro): Add free text definition. (cpp_push_definition): Removed. * include/cpplib.h (cpp_push_definition): Removed. (cpp_pop_definition): Likewise. * internal.h (def_pragma_macro): Remove member 'value' and add new members 'definition', 'line', 'syshdr', 'sued' and 'is_undef'. * pch.c (_cpp_restore_pushed_macros): Rework to work on text definition and store additional macro flags. (_cpp_save_pushed_macros): Likewise. From-SVN: r164729
Diffstat (limited to 'libcpp/pch.c')
-rw-r--r--libcpp/pch.c87
1 files changed, 38 insertions, 49 deletions
diff --git a/libcpp/pch.c b/libcpp/pch.c
index a6d8cea38d3..653e5c96adf 100644
--- a/libcpp/pch.c
+++ b/libcpp/pch.c
@@ -399,8 +399,6 @@ _cpp_restore_pushed_macros (cpp_reader *r, FILE *f)
size_t i;
struct def_pragma_macro *p;
size_t nlen;
- cpp_hashnode *h = NULL;
- cpp_macro *m;
uchar *defn;
size_t defnlen;
@@ -413,49 +411,35 @@ _cpp_restore_pushed_macros (cpp_reader *r, FILE *f)
if (fread (&nlen, sizeof (nlen), 1, f) != 1)
return 0;
p = XNEW (struct def_pragma_macro);
+ memset (p, 0, sizeof (struct def_pragma_macro));
p->name = XNEWVAR (char, nlen + 1);
p->name[nlen] = 0;
if (fread (p->name, nlen, 1, f) != 1)
return 0;
- /* Save old state. */
- m = cpp_push_definition (r, p->name);
if (fread (&defnlen, sizeof (defnlen), 1, f) != 1)
return 0;
- defn = XNEWVAR (uchar, defnlen + 2);
- defn[defnlen] = '\n';
- defn[defnlen + 1] = 0;
-
- if (fread (defn, defnlen, 1, f) != 1)
- return 0;
- cpp_pop_definition (r, p->name, NULL);
- {
- size_t namelen;
- uchar *dn;
+ if (defnlen == 0)
+ p->is_undef = 1;
+ else
+ {
+ defn = XNEWVEC (uchar, defnlen + 1);
+ defn[defnlen] = 0;
- namelen = ustrcspn (defn, "( \n");
- h = cpp_lookup (r, defn, namelen);
- dn = defn + namelen;
+ if (fread (defn, defnlen, 1, f) != 1)
+ return 0;
- h->type = NT_VOID;
- h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED|NODE_USED);
- if (cpp_push_buffer (r, dn, ustrchr (dn, '\n') - dn, true)
- != NULL)
- {
- _cpp_clean_line (r);
- if (!_cpp_create_definition (r, h))
- abort ();
- _cpp_pop_buffer (r);
- }
- else
- abort ();
- }
- p->value = cpp_push_definition (r, p->name);
+ p->definition = defn;
+ if (fread (&(p->line), sizeof (source_location), 1, f) != 1)
+ return 0;
+ defnlen = 0;
+ if (fread (&defnlen, sizeof (defnlen), 1, f) != 1)
+ return 0;
+ p->syshdr = ((defnlen & 1) != 0 ? 1 : 0);
+ p->used = ((defnlen & 2) != 0 ? 1 : 0);
+ }
- free (defn);
p->next = r->pushed_macros;
r->pushed_macros = p;
- /* Restore current state. */
- cpp_pop_definition (r, p->name, m);
}
return 1;
}
@@ -466,10 +450,7 @@ _cpp_save_pushed_macros (cpp_reader *r, FILE *f)
size_t count_saved = 0;
size_t i;
struct def_pragma_macro *p,**pp;
- cpp_hashnode *node;
- cpp_macro *m;
size_t defnlen;
- const uchar *defn;
/* Get count. */
p = r->pushed_macros;
@@ -496,22 +477,30 @@ _cpp_save_pushed_macros (cpp_reader *r, FILE *f)
}
for (i = 0; i < count_saved; i++)
{
- /* Save old state. */
- m = cpp_push_definition (r, pp[i]->name);
- /* Set temporary macro name to saved state. */
- cpp_pop_definition (r, pp[i]->name, pp[i]->value);
- node = _cpp_lex_identifier (r, pp[i]->name);
defnlen = strlen (pp[i]->name);
if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1
|| fwrite (pp[i]->name, defnlen, 1, f) != 1)
return 0;
- defn = cpp_macro_definition (r, node);
- defnlen = ustrlen (defn);
- if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1
- || fwrite (defn, defnlen, 1, f) != 1)
- return 0;
- /* Restore current state. */
- cpp_pop_definition (r, pp[i]->name, m);
+ if (pp[i]->is_undef)
+ {
+ defnlen = 0;
+ if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1)
+ return 0;
+ }
+ else
+ {
+ defnlen = ustrlen (pp[i]->definition);
+ if (fwrite (&defnlen, sizeof (size_t), 1, f) != 1
+ || fwrite (pp[i]->definition, defnlen, 1, f) != 1)
+ return 0;
+ if (fwrite (&(pp[i]->line), sizeof (source_location), 1, f) != 1)
+ return 0;
+ defnlen = 0;
+ defnlen |= (pp[i]->syshdr != 0 ? 1 : 0);
+ defnlen |= (pp[i]->used != 0 ? 2 : 0);
+ if (fwrite (&defnlen, sizeof (defnlen), 1, f) != 1)
+ return 0;
+ }
}
return 1;
}