diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2015-11-18 21:55:11 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2015-11-18 21:55:11 +0000 |
commit | 642357660ae1f36651519fb41f81a997f5fdae53 (patch) | |
tree | 1b06a2606d86dae56336dcdd2fd3e60bee7c93db /gcc/ada/gcc-interface/utils.c | |
parent | 5d306e55e09af218e1698a8e427638f717af4f3d (diff) | |
download | gcc-642357660ae1f36651519fb41f81a997f5fdae53.zip gcc-642357660ae1f36651519fb41f81a997f5fdae53.tar.gz gcc-642357660ae1f36651519fb41f81a997f5fdae53.tar.bz2 |
ada-tree.h (DECL_INVARIANT_P): New macro.
* gcc-interface/ada-tree.h (DECL_INVARIANT_P): New macro.
* gcc-interface/gigi.h (enum standard_datatypes): Remove
ADT_longjmp_decl and add ADT_not_handled_by_others_decl.
(longjmp_decl): Delete.
(not_handled_by_others_decl): New macro.
(build_simple_component_ref): Delete.
(build_component_ref): Adjust prototype.
* gcc-interface/decl.c (gnat_to_gnu_entity): Adjust calls to
build_component_ref.
(gnat_to_gnu_field): Set DECL_INVARIANT_P on discriminants
without default value.
* gcc-interface/trans.c (gigi): Reorder initialization sequence
and add not_handled_by_others_decl.
(Attribute_to_gnu): Adjust calls to build_component_ref.
(Subprogram_Body_to_gnu): Likewise.
(Call_to_gnu): Likewise.
(Exception_Handler_to_gnu_sjlj): Likewise.
(gnat_to_gnu): Likewise.
(range_check_info_d): Add inserted_cond field.
(Loop_Statement_to_gnu): Make two passes on the recorded range checks.
(build_noreturn_cond): New static function.
(Raise_Error_to_gnu): Record range checks in loops at -O1 and above.
(make_invariant): New static function.
(Loop_Statement_to_gnu): Use it to compute invariant expressions for
the loop bounds if possible, but do not require it if loop unswitching
is enabled.
* gcc-interface/utils.c (convert_to_fat_pointer): Likewise.
(convert): Likewise.
(maybe_unconstrained_array): Likewise. Call it instead of
build_simple_component_ref and add guard for CONSTRUCTORs.
(unchecked_convert): Likewise.
* gcc-interface/utils2.c (compare_fat_pointers): Likewise.
(build_simple_component_ref): Remove COMPONENT parameter, unify
code dealing with VIEW_CONVERT_EXPR and make it more general,
remove special treatment for CONSTRUCTORs of template types.
(build_component_ref): Remove COMPONENT parameter and adjust call
to build_simple_component_ref.
(maybe_wrap_malloc): Likewise.
(build_allocator): Likewise.
(gnat_invariant_expr): Look through overflow checks, deal with
addition and subtraction of constants and take into account
DECL_INVARIANT_P for the COMPONENT_REF case.
From-SVN: r230575
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index b032ae0..aa2fdf2 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -3970,11 +3970,9 @@ convert_to_fat_pointer (tree type, tree expr) expr = build_unary_op (INDIRECT_REF, NULL_TREE, expr); template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, - build_component_ref (expr, NULL_TREE, field, - false)); + build_component_ref (expr, field, false)); expr = build_unary_op (ADDR_EXPR, NULL_TREE, - build_component_ref (expr, NULL_TREE, - DECL_CHAIN (field), + build_component_ref (expr, DECL_CHAIN (field), false)); } } @@ -4110,8 +4108,7 @@ convert (tree type, tree expr) /* Otherwise, build an explicit component reference. */ else - unpadded - = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false); + unpadded = build_component_ref (expr, TYPE_FIELDS (etype), false); return convert (type, unpadded); } @@ -4132,8 +4129,8 @@ convert (tree type, tree expr) if (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype) && code != UNCONSTRAINED_ARRAY_TYPE && TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (etype)) - return convert (type, build_component_ref (expr, NULL_TREE, - TYPE_FIELDS (etype), false)); + return + convert (type, build_component_ref (expr, TYPE_FIELDS (etype), false)); /* If converting to a type that contains a template, convert to the data type and then build the template. */ @@ -4393,7 +4390,7 @@ convert (tree type, tree expr) do { tree field = TYPE_FIELDS (child_etype); if (DECL_NAME (field) == parent_name_id && TREE_TYPE (field) == type) - return build_component_ref (expr, NULL_TREE, field, false); + return build_component_ref (expr, field, false); child_etype = TREE_TYPE (field); } while (TREE_CODE (child_etype) == RECORD_TYPE); } @@ -4489,8 +4486,7 @@ convert (tree type, tree expr) /* If converting fat pointer to normal or thin pointer, get the pointer to the array and then convert it. */ if (TYPE_IS_FAT_POINTER_P (etype)) - expr - = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false); + expr = build_component_ref (expr, TYPE_FIELDS (etype), false); return fold (convert_to_pointer (type, expr)); @@ -4715,13 +4711,11 @@ maybe_unconstrained_array (tree exp) tree op1 = build_unary_op (INDIRECT_REF, NULL_TREE, build_component_ref (TREE_OPERAND (exp, 1), - NULL_TREE, TYPE_FIELDS (type), false)); tree op2 = build_unary_op (INDIRECT_REF, NULL_TREE, build_component_ref (TREE_OPERAND (exp, 2), - NULL_TREE, TYPE_FIELDS (type), false)); @@ -4732,8 +4726,8 @@ maybe_unconstrained_array (tree exp) else { exp = build_unary_op (INDIRECT_REF, NULL_TREE, - build_component_ref (exp, NULL_TREE, - TYPE_FIELDS (type), + build_component_ref (exp, + TYPE_FIELDS (type), false)); TREE_READONLY (exp) = read_only; TREE_THIS_NOTRAP (exp) = no_trap; @@ -4754,18 +4748,23 @@ maybe_unconstrained_array (tree exp) && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (TYPE_FIELDS (type)))) { exp = convert (TREE_TYPE (TYPE_FIELDS (type)), exp); + code = TREE_CODE (exp); type = TREE_TYPE (exp); } if (TYPE_CONTAINS_TEMPLATE_P (type)) { - exp = build_simple_component_ref (exp, NULL_TREE, - DECL_CHAIN (TYPE_FIELDS (type)), - false); + /* If the array initializer is a box, return NULL_TREE. */ + if (code == CONSTRUCTOR && CONSTRUCTOR_NELTS (exp) < 2) + return NULL_TREE; + + exp = build_component_ref (exp, DECL_CHAIN (TYPE_FIELDS (type)), + false); + type = TREE_TYPE (exp); /* If the array type is padded, convert to the unpadded type. */ - if (exp && TYPE_IS_PADDING_P (TREE_TYPE (exp))) - exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp); + if (TYPE_IS_PADDING_P (type)) + exp = convert (TREE_TYPE (TYPE_FIELDS (type)), exp); } break; @@ -4915,7 +4914,7 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) finish_record_type (rec_type, field, 1, false); expr = unchecked_convert (rec_type, expr, notrunc_p); - expr = build_component_ref (expr, NULL_TREE, field, false); + expr = build_component_ref (expr, field, false); expr = fold_build1 (NOP_EXPR, type, expr); } @@ -4986,8 +4985,7 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) tree rec_type = maybe_pad_type (type, TYPE_SIZE (etype), 0, Empty, false, false, false, true); expr = unchecked_convert (rec_type, expr, notrunc_p); - expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (rec_type), - false); + expr = build_component_ref (expr, TYPE_FIELDS (rec_type), false); } } |