aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-10-17 11:47:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-10-17 11:47:56 +0000
commit57e4ba8488a4f3ef96fa7d985f3319ec3bf01870 (patch)
tree5f2c05e10cf62e9694f8a7dd24def3a5520b8342
parentd622b427fa4c83d1ae9ca44ccf5d76acfc55c059 (diff)
downloadgcc-57e4ba8488a4f3ef96fa7d985f3319ec3bf01870.zip
gcc-57e4ba8488a4f3ef96fa7d985f3319ec3bf01870.tar.gz
gcc-57e4ba8488a4f3ef96fa7d985f3319ec3bf01870.tar.bz2
lto-streamer-in.c (input_gimple_stmt): Fixup FIELD_DECL operands in COMPONENT_REFs.
2009-10-17 Richard Guenther <rguenther@suse.de> * lto-streamer-in.c (input_gimple_stmt): Fixup FIELD_DECL operands in COMPONENT_REFs. From-SVN: r152937
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lto-streamer-in.c30
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aed9418..084ec33 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-17 Richard Guenther <rguenther@suse.de>
+
+ * lto-streamer-in.c (input_gimple_stmt): Fixup FIELD_DECL
+ operands in COMPONENT_REFs.
+
2009-10-17 Anatoly Sokolov <aesok@post.ru>
* targhooks.c (default_libcall_value): Don't use LIBCALL_VALUE macro
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 71faf0f..45be0c2 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -1061,6 +1061,36 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
{
tree op = lto_input_tree (ib, data_in);
gimple_set_op (stmt, i, op);
+
+ /* Fixup FIELD_DECLs. */
+ while (op && handled_component_p (op))
+ {
+ if (TREE_CODE (op) == COMPONENT_REF)
+ {
+ tree field, type, tem;
+ field = TREE_OPERAND (op, 1);
+ type = DECL_CONTEXT (field);
+ for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
+ {
+ if (tem == field
+ || (TREE_TYPE (tem) == TREE_TYPE (field)
+ && (DECL_FIELD_OFFSET (tem)
+ == DECL_FIELD_OFFSET (field))
+ && (DECL_FIELD_BIT_OFFSET (tem)
+ == DECL_FIELD_BIT_OFFSET (field))
+ && (DECL_OFFSET_ALIGN (tem)
+ == DECL_OFFSET_ALIGN (field))))
+ break;
+ }
+ /* In case of type mismatches across units we can fail
+ to unify some types and thus not find a proper
+ field-decl here. Just do nothing in this case. */
+ if (tem != NULL_TREE)
+ TREE_OPERAND (op, 1) = tem;
+ }
+
+ op = TREE_OPERAND (op, 0);
+ }
}
break;