aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Berlin <dan@cgsoftware.com>2001-09-22 15:54:53 +0000
committerDaniel Berlin <dan@cgsoftware.com>2001-09-22 15:54:53 +0000
commit29f8365f6d260454e3693246e737376620740b4b (patch)
treecb207757684757484f64664a9f1835fe7830bacf
parent41a249b5bf32f7d2cff59ad22870a5253f0ee45c (diff)
Unpickling C trees now works perfectly, excluding DECL_RTL
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/tree-serialize-branch@45755 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c-decl.c25
-rw-r--r--gcc/tree.c8
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index e617d6c0ce9..5a93d571432 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -6979,6 +6979,31 @@ lang_unpickle_tree (t)
i->error_locus = read_tree (i->error_locus);
i->limbo_value = read_tree (i->limbo_value);
}
+ else if (TYPE_P (t) && TYPE_LANG_SPECIFIC (t))
+ {
+ datum key, data;
+ key.dptr = (char *) &TYPE_LANG_SPECIFIC (t);
+ key.dsize = sizeof (&TYPE_LANG_SPECIFIC (t));
+ data = dbm_fetch (datafile, key);
+ if (!data.dptr)
+ abort();
+ memcpy (TYPE_LANG_SPECIFIC (t), data.dptr, data.dsize);
+ }
+ else if (DECL_P (t) && DECL_LANG_SPECIFIC (t))
+ {
+ struct lang_decl *ld;
+ datum key, data;
+ key.dptr = (char *) &DECL_LANG_SPECIFIC (t);
+ key.dsize = sizeof (&DECL_LANG_SPECIFIC (t));
+ data = dbm_fetch (datafile, key);
+ if (!data.dptr)
+ abort();
+ ld = (struct lang_decl *)ggc_alloc_cleared (sizeof (struct lang_decl));
+ memcpy (ld, data.dptr, data.dsize);
+ DECL_LANG_SPECIFIC (t) = ld;
+ ld->base.saved_tree = read_tree (ld->base.saved_tree);
+ ld->pending_sizes = read_tree (ld->pending_sizes);
+ }
}
void
diff --git a/gcc/tree.c b/gcc/tree.c
index f44a896908d..a2af124fbaa 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5150,6 +5150,12 @@ unpickle_tree (id)
DECL_VINDEX (buffer) = read_tree (DECL_VINDEX (buffer));
if (TREE_CODE (buffer) == FIELD_DECL)
buffer->decl.u2.t = read_tree (buffer->decl.u2.t);
+ if (TREE_CODE (buffer) == FUNCTION_DECL
+ || (TREE_CODE (buffer) == VAR_DECL
+ && (TREE_STATIC (buffer)
+ || DECL_EXTERNAL (buffer)
+ || TREE_PUBLIC (buffer))))
+ DECL_ASSEMBLER_NAME (buffer);
/*FIXME: if it's PARM_DECL, u2 is an RTL */
/*FIXME: Handle lang specific */
break;
@@ -5275,8 +5281,10 @@ pickle_tree (t)
DECL_MACHINE_ATTRIBUTES (buffer) =
(tree) write_tree (&DECL_MACHINE_ATTRIBUTES (buffer));
DECL_VINDEX (buffer) = (tree) write_tree (&DECL_VINDEX (buffer));
+#if 0
if (DECL_ASSEMBLER_NAME_SET_P (t))
DECL_ASSEMBLER_NAME (buffer) = (tree) write_tree (&DECL_ASSEMBLER_NAME (buffer));
+#endif
if (TREE_CODE (buffer) == FIELD_DECL)
buffer->decl.u2.t = (tree) write_tree (&buffer->decl.u2.t);
lang_pickle_tree (buffer, t);