diff options
Diffstat (limited to 'gcc/ada/utils.c')
-rw-r--r-- | gcc/ada/utils.c | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index 9e848578690..2b5bad74092 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -832,12 +832,13 @@ finish_record_type (tree record_type, tree fieldlist, bool has_rep, case QUAL_UNION_TYPE: ada_size - = fold (build (COND_EXPR, bitsizetype, DECL_QUALIFIER (field), - this_ada_size, ada_size)); - size = fold (build (COND_EXPR, bitsizetype, DECL_QUALIFIER (field), - this_size, size)); - size_unit = fold (build (COND_EXPR, sizetype, DECL_QUALIFIER (field), - this_size_unit, size_unit)); + = fold (build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field), + this_ada_size, ada_size)); + size = fold (build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field), + this_size, size)); + size_unit = fold (build3 (COND_EXPR, sizetype, + DECL_QUALIFIER (field), + this_size_unit, size_unit)); break; case RECORD_TYPE: @@ -1073,15 +1074,15 @@ merge_sizes (tree last_size, tree first_bit, tree size, bool special, } else - new = fold (build (COND_EXPR, type, TREE_OPERAND (size, 0), - integer_zerop (TREE_OPERAND (size, 1)) - ? last_size : merge_sizes (last_size, first_bit, - TREE_OPERAND (size, 1), - 1, has_rep), - integer_zerop (TREE_OPERAND (size, 2)) - ? last_size : merge_sizes (last_size, first_bit, - TREE_OPERAND (size, 2), - 1, has_rep))); + new = fold (build3 (COND_EXPR, type, TREE_OPERAND (size, 0), + integer_zerop (TREE_OPERAND (size, 1)) + ? last_size : merge_sizes (last_size, first_bit, + TREE_OPERAND (size, 1), + 1, has_rep), + integer_zerop (TREE_OPERAND (size, 2)) + ? last_size : merge_sizes (last_size, first_bit, + TREE_OPERAND (size, 2), + 1, has_rep))); /* We don't need any NON_VALUE_EXPRs and they can confuse us (especially when fed through substitute_in_expr) into thinking that a constant @@ -1157,12 +1158,14 @@ split_plus (tree in, tree *pvar) RETURNS_UNCONSTRAINED is nonzero if the function returns an unconstrained object. RETURNS_BY_REF is nonzero if the function returns by reference. RETURNS_WITH_DSP is nonzero if the function is to return with a - depressed stack pointer. */ + depressed stack pointer. RETURNS_BY_TARGET_PTR is true if the function + is to be passed (as its first parameter) the address of the place to copy + its result. */ tree create_subprog_type (tree return_type, tree param_decl_list, tree cico_list, bool returns_unconstrained, bool returns_by_ref, - bool returns_with_dsp) + bool returns_with_dsp, bool returns_by_target_ptr) { /* A chain of TREE_LIST nodes whose TREE_VALUEs are the data type nodes of the subprogram formal parameters. This list is generated by traversing the @@ -1193,13 +1196,15 @@ create_subprog_type (tree return_type, tree param_decl_list, tree cico_list, RETURNS_UNCONSTRAINED and RETURNS_BY_REF. */ if (TYPE_CI_CO_LIST (type) || cico_list || TYPE_RETURNS_UNCONSTRAINED_P (type) != returns_unconstrained - || TYPE_RETURNS_BY_REF_P (type) != returns_by_ref) + || TYPE_RETURNS_BY_REF_P (type) != returns_by_ref + || TYPE_RETURNS_BY_TARGET_PTR_P (type) != returns_by_target_ptr) type = copy_type (type); TYPE_CI_CO_LIST (type) = cico_list; TYPE_RETURNS_UNCONSTRAINED_P (type) = returns_unconstrained; TYPE_RETURNS_STACK_DEPRESSED (type) = returns_with_dsp; TYPE_RETURNS_BY_REF_P (type) = returns_by_ref; + TYPE_RETURNS_BY_TARGET_PTR_P (type) = returns_by_target_ptr; return type; } @@ -1342,10 +1347,12 @@ create_var_decl (tree var_name, tree asm_name, tree type, tree var_init, TREE_THIS_VOLATILE (var_decl) = TREE_SIDE_EFFECTS (var_decl) = TYPE_VOLATILE (type); - /* At the global binding level we need to allocate static storage for the - variable if and only if its not external. If we are not at the top level + /* If it's public and not external, always allocate storage for it. + At the global binding level we need to allocate static storage for the + variable if and only if it's not external. If we are not at the top level we allocate automatic storage unless requested not to. */ - TREE_STATIC (var_decl) = global_bindings_p () ? !extern_flag : static_flag; + TREE_STATIC (var_decl) + = public_flag || (global_bindings_p () ? !extern_flag : static_flag); if (asm_name) SET_DECL_ASSEMBLER_NAME (var_decl, asm_name); @@ -2066,19 +2073,19 @@ max_size (tree exp, bool max_p) && !TREE_CONSTANT (rhs)) return lhs; else - return fold (build (code, type, lhs, rhs)); + return fold (build2 (code, type, lhs, rhs)); } case 3: if (code == SAVE_EXPR) return exp; else if (code == COND_EXPR) - return fold (build (max_p ? MAX_EXPR : MIN_EXPR, type, - max_size (TREE_OPERAND (exp, 1), max_p), - max_size (TREE_OPERAND (exp, 2), max_p))); + return fold (build2 (max_p ? MAX_EXPR : MIN_EXPR, type, + max_size (TREE_OPERAND (exp, 1), max_p), + max_size (TREE_OPERAND (exp, 2), max_p))); else if (code == CALL_EXPR && TREE_OPERAND (exp, 1)) - return build (CALL_EXPR, type, TREE_OPERAND (exp, 0), - max_size (TREE_OPERAND (exp, 1), max_p), NULL); + return build3 (CALL_EXPR, type, TREE_OPERAND (exp, 0), + max_size (TREE_OPERAND (exp, 1), max_p), NULL); } } @@ -2307,7 +2314,7 @@ build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity) build_pointer_type_for_mode (type, SImode, false), record_type, build1 (ADDR_EXPR, build_pointer_type_for_mode (type, SImode, false), - build (PLACEHOLDER_EXPR, type)))); + build0 (PLACEHOLDER_EXPR, type)))); switch (mech) { @@ -2368,12 +2375,12 @@ build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity) size_in_bytes (type))); /* Now build a pointer to the 0,0,0... element. */ - tem = build (PLACEHOLDER_EXPR, type); + tem = build0 (PLACEHOLDER_EXPR, type); for (i = 0, inner_type = type; i < ndim; i++, inner_type = TREE_TYPE (inner_type)) - tem = build (ARRAY_REF, TREE_TYPE (inner_type), tem, - convert (TYPE_DOMAIN (inner_type), size_zero_node), - NULL_TREE, NULL_TREE); + tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem, + convert (TYPE_DOMAIN (inner_type), size_zero_node), + NULL_TREE, NULL_TREE); field_list = chainon (field_list, @@ -2596,9 +2603,9 @@ update_pointer_to (tree old_type, tree new_type) is now a very "heavy" routine to do this, so it should be replaced at some point. */ ptr_temp_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (ptr))); - new_ref = build (COMPONENT_REF, ptr_temp_type, - build (PLACEHOLDER_EXPR, ptr), - TREE_CHAIN (TYPE_FIELDS (ptr)), NULL_TREE); + new_ref = build3 (COMPONENT_REF, ptr_temp_type, + build0 (PLACEHOLDER_EXPR, ptr), + TREE_CHAIN (TYPE_FIELDS (ptr)), NULL_TREE); update_pointer_to (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (ptr))), @@ -2801,10 +2808,11 @@ convert (tree type, tree expr) /* If the input is a biased type, adjust first. */ if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype)) - return convert (type, fold (build (PLUS_EXPR, TREE_TYPE (etype), - fold (build1 (NOP_EXPR, - TREE_TYPE (etype), expr)), - TYPE_MIN_VALUE (etype)))); + return convert (type, fold (build2 (PLUS_EXPR, TREE_TYPE (etype), + fold (build1 (NOP_EXPR, + TREE_TYPE (etype), + expr)), + TYPE_MIN_VALUE (etype)))); /* If the input is a left-justified modular type, we need to extract the actual object before converting it to any other type with the @@ -2936,9 +2944,9 @@ convert (tree type, tree expr) return unchecked_convert (type, expr, false); else if (TYPE_BIASED_REPRESENTATION_P (type)) return fold (build1 (CONVERT_EXPR, type, - fold (build (MINUS_EXPR, TREE_TYPE (type), - convert (TREE_TYPE (type), expr), - TYPE_MIN_VALUE (type))))); + fold (build2 (MINUS_EXPR, TREE_TYPE (type), + convert (TREE_TYPE (type), expr), + TYPE_MIN_VALUE (type))))); /* ... fall through ... */ |