diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-13 11:58:12 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-13 11:58:12 +0000 |
commit | ce016e273825134bee8e22c8cbc1cef79e01b009 (patch) | |
tree | 2607d28f3c7bdd021c6aea3fa2f50204b08590b4 /gcc/gimple-streamer-in.c | |
parent | 26fc128eab91ae40894877a81973aeef3ef71fae (diff) | |
download | gcc-ce016e273825134bee8e22c8cbc1cef79e01b009.tar.gz |
2013-11-13 Richard Biener <rguenther@suse.de>
* gimple-streamer-out.c (output_gimple_stmt): Also wrap
decls in ADDR_EXPR operands inside a MEM_REF and optimize that.
* gimple-streamer-in.c (input_gimple_stmt): Remove now dead
code dealing with type mismatches inside component reference
chains.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204740 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple-streamer-in.c')
-rw-r--r-- | gcc/gimple-streamer-in.c | 80 |
1 files changed, 1 insertions, 79 deletions
diff --git a/gcc/gimple-streamer-in.c b/gcc/gimple-streamer-in.c index 2a19aab44fe..2dae1e43c0c 100644 --- a/gcc/gimple-streamer-in.c +++ b/gcc/gimple-streamer-in.c @@ -158,85 +158,7 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in, if (TREE_CODE (*opp) == ADDR_EXPR) opp = &TREE_OPERAND (*opp, 0); while (handled_component_p (*opp)) - { - if (TREE_CODE (*opp) == COMPONENT_REF) - { - /* Fixup FIELD_DECLs in COMPONENT_REFs, they are not handled - by decl merging. */ - tree field, type, tem; - tree closest_match = NULL_TREE; - field = TREE_OPERAND (*opp, 1); - type = DECL_CONTEXT (field); - for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem)) - { - if (TREE_CODE (tem) != FIELD_DECL) - continue; - if (tem == field) - break; - if (DECL_NONADDRESSABLE_P (tem) - == DECL_NONADDRESSABLE_P (field) - && gimple_compare_field_offset (tem, field)) - { - if (types_compatible_p (TREE_TYPE (tem), - TREE_TYPE (field))) - break; - else - closest_match = tem; - } - } - /* In case of type mismatches across units we can fail - to unify some types and thus not find a proper - field-decl here. */ - if (tem == NULL_TREE) - { - /* Thus, emit a ODR violation warning. */ - if (warning_at (gimple_location (stmt), 0, - "use of type %<%E%> with two mismatching " - "declarations at field %<%E%>", - type, TREE_OPERAND (*opp, 1))) - { - if (TYPE_FIELDS (type)) - inform (DECL_SOURCE_LOCATION (TYPE_FIELDS (type)), - "original type declared here"); - inform (DECL_SOURCE_LOCATION (TREE_OPERAND (*opp, 1)), - "field in mismatching type declared here"); - if (TYPE_NAME (TREE_TYPE (field)) - && (TREE_CODE (TYPE_NAME (TREE_TYPE (field))) - == TYPE_DECL)) - inform (DECL_SOURCE_LOCATION - (TYPE_NAME (TREE_TYPE (field))), - "type of field declared here"); - if (closest_match - && TYPE_NAME (TREE_TYPE (closest_match)) - && (TREE_CODE (TYPE_NAME - (TREE_TYPE (closest_match))) == TYPE_DECL)) - inform (DECL_SOURCE_LOCATION - (TYPE_NAME (TREE_TYPE (closest_match))), - "type of mismatching field declared here"); - } - /* And finally fixup the types. */ - TREE_OPERAND (*opp, 0) - = build1 (VIEW_CONVERT_EXPR, type, - TREE_OPERAND (*opp, 0)); - } - else - TREE_OPERAND (*opp, 1) = tem; - } - else if ((TREE_CODE (*opp) == ARRAY_REF - || TREE_CODE (*opp) == ARRAY_RANGE_REF) - && (TREE_CODE (TREE_TYPE (TREE_OPERAND (*opp, 0))) - != ARRAY_TYPE)) - { - /* And ARRAY_REFs to objects that had mismatched types - during symbol merging to avoid ICEs. */ - TREE_OPERAND (*opp, 0) - = build1 (VIEW_CONVERT_EXPR, - build_array_type (TREE_TYPE (*opp), NULL_TREE), - TREE_OPERAND (*opp, 0)); - } - - opp = &TREE_OPERAND (*opp, 0); - } + opp = &TREE_OPERAND (*opp, 0); /* At LTO output time we wrap all global decls in MEM_REFs to allow seamless replacement with prevailing decls. Undo this here if the prevailing decl allows for this. |