diff options
Diffstat (limited to 'gcc/tree-nested.c')
-rw-r--r-- | gcc/tree-nested.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 24d3e74..1f32e1f 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -157,8 +157,13 @@ static tree build_addr (tree exp) { tree base = exp; - while (TREE_CODE (base) == COMPONENT_REF || TREE_CODE (base) == ARRAY_REF) + + if (TREE_CODE (base) == REALPART_EXPR || TREE_CODE (base) == IMAGPART_EXPR) base = TREE_OPERAND (base, 0); + else + while (handled_component_p (base)) + base = TREE_OPERAND (base, 0); + if (DECL_P (base)) TREE_ADDRESSABLE (base) = 1; @@ -550,6 +555,7 @@ walk_stmts (struct walk_stmt_info *wi, tree *tp) break; case CATCH_EXPR: walk_stmts (wi, &CATCH_BODY (t)); + break; case EH_FILTER_EXPR: walk_stmts (wi, &EH_FILTER_FAILURE (t)); break; @@ -657,7 +663,7 @@ get_static_chain (struct nesting_info *info, tree target_context, tree field = get_chain_field (i); x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); - x = build (COMPONENT_REF, TREE_TYPE (field), x, field); + x = build (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); x = init_tmp_var (info, x, tsi); } } @@ -691,14 +697,14 @@ get_frame_field (struct nesting_info *info, tree target_context, tree field = get_chain_field (i); x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); - x = build (COMPONENT_REF, TREE_TYPE (field), x, field); + x = build (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); x = init_tmp_var (info, x, tsi); } x = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (x)), x); } - x = build (COMPONENT_REF, TREE_TYPE (field), x, field); + x = build (COMPONENT_REF, TREE_TYPE (field), x, field, NULL_TREE); return x; } @@ -800,10 +806,13 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data) break; case ARRAY_REF: + case ARRAY_RANGE_REF: wi->val_only = false; walk_tree (&TREE_OPERAND (t, 0), convert_nonlocal_reference, wi, NULL); wi->val_only = true; walk_tree (&TREE_OPERAND (t, 1), convert_nonlocal_reference, wi, NULL); + walk_tree (&TREE_OPERAND (t, 2), convert_nonlocal_reference, wi, NULL); + walk_tree (&TREE_OPERAND (t, 3), convert_nonlocal_reference, wi, NULL); break; case BIT_FIELD_REF: @@ -932,10 +941,13 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) break; case ARRAY_REF: + case ARRAY_RANGE_REF: wi->val_only = false; walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL); wi->val_only = true; walk_tree (&TREE_OPERAND (t, 1), convert_local_reference, wi, NULL); + walk_tree (&TREE_OPERAND (t, 2), convert_local_reference, wi, NULL); + walk_tree (&TREE_OPERAND (t, 3), convert_local_reference, wi, NULL); break; case BIT_FIELD_REF: @@ -1242,7 +1254,7 @@ finalize_nesting_tree_1 (struct nesting_info *root) x = p; y = build (COMPONENT_REF, TREE_TYPE (field), - root->frame_decl, field); + root->frame_decl, field, NULL_TREE); x = build (MODIFY_EXPR, TREE_TYPE (field), y, x); append_to_statement_list (x, &stmt_list); } @@ -1252,9 +1264,8 @@ finalize_nesting_tree_1 (struct nesting_info *root) from chain_decl. */ if (root->chain_field) { - tree x; - x = build (COMPONENT_REF, TREE_TYPE (root->chain_field), - root->frame_decl, root->chain_field); + tree x = build (COMPONENT_REF, TREE_TYPE (root->chain_field), + root->frame_decl, root->chain_field, NULL_TREE); x = build (MODIFY_EXPR, TREE_TYPE (x), x, get_chain_decl (root)); append_to_statement_list (x, &stmt_list); } @@ -1281,7 +1292,7 @@ finalize_nesting_tree_1 (struct nesting_info *root) arg = tree_cons (NULL, x, arg); x = build (COMPONENT_REF, TREE_TYPE (field), - root->frame_decl, field); + root->frame_decl, field, NULL_TREE); x = build_addr (x); arg = tree_cons (NULL, x, arg); |