diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2007-02-15 18:50:49 -0500 |
---|---|---|
committer | Sandra Loosemore <sandra@gcc.gnu.org> | 2007-02-15 18:50:49 -0500 |
commit | 5039610b9630459799b24f64fb9ffdd810b8eee9 (patch) | |
tree | 4c9dae557e2aa52bff7b845dd7b1270c19be7a2f /gcc/java | |
parent | dc90f45b24a668f465d50a4db2253c7b84cd1c2d (diff) | |
download | gcc-5039610b9630459799b24f64fb9ffdd810b8eee9.tar.gz |
tree.h (enum tree_code_class): Add tcc_vl_exp.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* tree.h (enum tree_code_class): Add tcc_vl_exp.
(VL_EXP_CLASS_P): New.
(TREE_OPERAND_CHECK): Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH.
(TREE_OPERAND_CHECK_CODE): Likewise.
(GIMPLE_STMT_OPERAND_CHECK): Likewise.
(TREE_RTL_OPERAND_CHECK): Likewise.
(tree_operand_check_failed): Make second parameter the whole tree
instead of its code. Fixed callers.
(VL_EXP_CHECK): New.
(TREE_OPERAND_LENGTH): New.
(VL_EXP_OPERAND_LENGTH): New.
(CALL_EXPR_FN): New.
(CALL_EXPR_STATIC_CHAIN): New.
(CALL_EXPR_ARGS): New.
(CALL_EXPR_ARG): New.
(call_expr_nargs): New.
(CALL_EXPR_ARGP): New.
(build_nt_call_list): Declare.
(build_vl_exp_stat): Declare.
(build_vl_exp): New.
(build_call_list): Declare.
(build_call_nary): Declare.
(build_call_valist): Declare.
(build_call_array): Declare.
(call_expr_arg): Declare.
(call_expr_argp): Declare.
(call_expr_arglist): Declare.
(fold_build_call_list): Declare.
(fold_build_call_list_initializer): Declare.
(fold_call_expr): Declare to replace fold_builtin.
(fold_builtin_fputs): Update to agree with modified definition.
(fold_builtin_strcpy): Likewise.
(fold_builtin_strncpy): Likewise.
(fold_builtin_memory_chk): Likewise.
(fold_builtin_stxcpy_chk): Likewise.
(fold_builtin_strncpy_chk): Likewise.
(fold_builtin_next_arg): Likewise.
(fold_build_call_expr): Declare.
(fold_builtin_call_list): Declare.
(fold_builtin_call_valist): Declare.
(build_call_expr): Declare.
(validate_arglist): Update to agree with modified definition.
(tree_operand_length): New.
(call_expr_arg_iterator): New.
(init_call_expr_arg_iterator): New.
(next_call_expr_arg): New.
(first_call_expr_arg): New.
(more_call_expr_args_p): New.
(FOR_EACH_CALL_EXPR_ARG): New.
* tree.c (tree_code_class_string): Add entries for tcc_vl_exp
and tcc_gimple_stmt.
(tree_code_size): Update documentation. Use sizeof (tree) rather
than sizeof (char *).
(tree_size): Likewise. Add case for tcc_vl_exp.
(tree_node_structure): Add case for tcc_vl_exp.
(contains_placeholder_p): Likewise.
(substitute_in_expr): Likewise.
(substitute_placeholder_in_expr): Likewise.
(stabilize_reference_1): Likewise.
(build3_stat): Remove logic for CALL_EXPRs. Replace with assertion
to diagnose breakage of this interface for constructing CALL_EXPRs.
(build_nt): Add similar assertion here.
(build_nt_call_list): New.
(simple_cst_equal) <CALL_EXPR>: Rewrite to use new accessors.
(iterative_hash_expr): Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH.
(get_callee_fndecl): Use new CALL_EXPR accessors.
(tree_operand_check_failed): Change parameters to pass entire node
instead of its code, so that we can call TREE_OPERAND_LENGTH on it.
(process_call_operands): New.
(build_vl_exp_stat): New.
(build_call_list): New.
(build_call_nary): New.
(build_call_valist): New.
(build_call_array): New.
(walk_tree): Use TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
(call_expr_arglist): New.
* tree.def (CALL_EXPR): Change representation of CALL_EXPRs to use
tcc_vl_exp instead of a fixed-size tcc_expression.
* doc/c-tree.texi (CALL_EXPR): Document new representation and
accessors for CALL_EXPRs.
(AGGR_INIT_EXPR): Likewise.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* builtins.c (c_strlen): Return NULL_TREE instead of 0.
(expand_builtin_nonlocal_goto): Change parameter to be entire
CALL_EXPR instead of an arglist. Use new CALL_EXPR accessors.
(expand_builtin_prefetch): Likewise.
(expand_builtin_classify_type): Likewise.
(mathfn_built_in): Return NULL_TREE instead of 0.
(expand_errno_check): Use new CALL_EXPR accessors.
(expand_builtin_mathfn): Use new CALL_EXPR accessors and constructors.
Return NULL_RTX instead of 0.
(expand_builtin_mathfn_2): Likewise.
(expand_builtin_mathfn_3): Likewise.
(expand_builtin_interclass_mathfn): Likewise.
(expand_builtin_sincos): Likewise.
(expand_builtin_cexpi): Likewise.
(expand_builtin_int_roundingfn): Likewise.
(expand_builtin_int_roundingfn_2): Likewise.
(expand_builtin_pow): Likewise.
(expand_builtin_powi): Likewise.
(expand_builtin_strlen): Pass entire CALL_EXPR as parameter instead
of arglist, fixing callers appropriately. Use new CALL_EXPR
accessors and constructors. Return NULL_RTX instead of 0.
(expand_builtin_strstr): Likewise.
(expand_builtin_strchr): Likewise.
(expand_builtin_strrchr): Likewise.
(expand_builtin_strpbrk): Likewise.
(expand_builtin_memcpy): Likewise.
(expand_builtin_mempcpy): Likewise.
(expand_builtin_mempcpy_args): New.
(expand_builtin_memmove): Similarly to expand_builtin_mempcpy.
(expand_builtin_memmove_args): New.
(expand_builtin_bcopy): Similarly to expand_builtin_mempcpy.
(expand_movstr): Likewise.
(expand_builtin_strcpy): Likewise.
(expand_builtin_strcpy_args): New.
(expand_builtin_stpcpy): Similarly to expand_builtin_strcpy.
(expand_builtin_strncpy): Likewise.
(expand_builtin_memset): Likewise.
(expand_builtin_memset_args): New.
(expand_builtin_bzero): Similarly to expand_builtin_memset.
(expand_builtin_memcmp): Likewise.
(expand_builtin_strcmp): Likewise.
(expand_builtin_strncmp): Likewise.
(expand_builtin_strcat): Likewise.
(expand_builtin_strncat): Likewise.
(expand_builtin_strspn): Likewise.
(expand_builtin_strcspn): Likewise.
(expand_builtin_args_info): Likewise.
(expand_builtin_va_start): Likewise.
(gimplify_va_arg_expr): Likewise.
(expand_builtin_va_end): Likewise.
(expand_builtin_va_copy): Likewise.
(expand_builtin_frame_address): Likewise.
(expand_builtin_alloca): Likewise.
(expand_builtin_bswap): Likewise.
(expand_builtin_unop): Likewise.
(expand_builtin_fputs): Likewise.
(expand_builtin_expect): Likewise.
(expand_builtin_fabs): Likewise.
(expand_builtin_copysign): Likewise.
(expand_builtin_printf): Likewise.
(expand_builtin_fprintf): Likewise.
(expand_builtin_sprintf): Likewise.
(expand_builtin_init_trampoline): Likewise.
(expand_builtin_signbit): Likewise.
(expand_builtin_fork_or_exec): Likewise.
(expand_builtin_sync_operation): Likewise.
(expand_builtin_compare_and_swap): Likewise.
(expand_builtin_lock_test_and_set): Likewise.
(expand_builtin_lock_release): Likewise.
(expand_builtin): Likewise.
(builtin_mathfn_code): Likewise.
(fold_builtin_constant_p): Pass call arguments individually instead
of as an arglist, fixing callers appropriately. Use new CALL_EXPR
accessors and constructors. Return NULL_TREE instead of 0.
(fold_builtin_expect): Likewise.
(fold_builtin_classify_type): Likewise.
(fold_builtin_strlen): Likewise.
(fold_builtin_nan): Likewise.
(integer_valued_real_p): Likewise.
(fold_trunc_transparent_mathfn): Likewise.
(fold_fixed_mathfn): Likewise.
(fold_builtin_cabs): Likewise.
(fold_builtin_sqrt): Likewise.
(fold_builtin_cbrt): Likewise.
(fold_builtin_cos): Likewise.
(fold_builtin_cosh): Likewise.
(fold_builtin_tan): Likewise.
(fold_builtin_sincos): Likewise.
(fold_builtin_cexp): Likewise.
(fold_builtin_trunc): Likewise.
(fold_builtin_floor): Likewise.
(fold_builtin_ceil): Likewise.
(fold_builtin_round): Likewise.
(fold_builtin_int_roundingfn): Likewise.
(fold_builtin_bitop): Likewise.
(fold_builtin_bswap): Likewise.
(fold_builtin_logarithm): Likewise.
(fold_builtin_hypot): Likewise.
(fold_builtin_pow): Likewise.
(fold_builtin_powi): Likewise.
(fold_builtin_exponent): Likewise.
(fold_builtin_memset): Likewise.
(fold_builtin_bzero): Likewise.
(fold_builtin_memory_op): Likewise.
(fold_builtin_bcopy): Deleted; call site changed to invoke
fold_builtin_memory_op directly.
(fold_builtin_strcpy): Similarly as for fold_builtin_memory_op.
(fold_builtin_strncpy): Likewise.
(fold_builtin_memcmp): Likewise.
(fold_builtin_strcmp): Likewise.
(fold_builtin_strncmp): Likewise.
(fold_builtin_signbit): Likewise.
(fold_builtin_copysign): Likewise.
(fold_builtin_isascii): Likewise.
(fold_builtin_toascii): Likewise.
(fold_builtin_isdigit): Likewise.
(fold_builtin_fabs): Likewise.
(fold_builtin_abs): Likewise.
(fold_builtin_fmin_fmax): Likewise.
(fold_builtin_carg): Likewise.
(fold_builtin_classify): Likewise.
(fold_builtin_unordered_cmp): Likewise.
(fold_builtin_0, fold_builtin_2, fold_builtin_3, fold_builtin_4):
New functions split out from fold_builtin_1.
(fold_builtin_n): New.
(fold_builtin_varargs): New.
(fold_builtin): Deleted. Most callers changed to use fold_call_expr
instead.
(fold_call_expr): New.
(build_function_call_expr): Rewrite to use new helper function.
(fold_builtin_call_list): New.
(build_call_expr): New.
(fold_builtin_call_valist): New.
(rewrite_call_expr): New.
(validate_arg): New.
(validate_arglist): Change parameter to be entire CALL_EXPR instead
of an arglist. Change return type to bool. Use new CALL_EXPR
accessors.
(fold_builtin_strstr): Pass call arguments individually instead
of as an arglist, fixing callers appropriately. Use new CALL_EXPR
accessors and constructors. Return NULL_TREE instead of 0.
(fold_builtin_strchr): Likewise.
(fold_builtin_strrchr): Likewise.
(fold_builtin_strpbrk): Likewise.
(fold_builtin_strcat): Likewise.
(fold_builtin_strncat): Likewise.
(fold_builtin_strspn): Likewise.
(fold_builtin_strcspn): Likewise.
(fold_builtin_fputs): Likewise.
(fold_builtin_next_arg): Likewise.
(fold_builtin_sprintf): Likewise.
(expand_builtin_object_size): Use new CALL_EXPR accessors. Use
NULL_RTX instead of 0.
(expand_builtin_memory_chk): Likewise.
(maybe_emit_chk_warning): Likewise.
(maybe_emit_sprintf_chk_warning): Likewise.
(fold_builtin_object_size): Pass call arguments individually instead
of as an arglist, fixing callers appropriately. Use new CALL_EXPR
accessors and constructors. Return NULL_TREE instead of 0.
(fold_builtin_memory_chk): Likewise.
(fold_builtin_stxcpy_chk): Likewise.
(fold_builtin_strncpy_chk): Likewise.
(fold_builtin_strcat_chk): Likewise.
(fold_builtin_strcat_chk): Likewise.
(fold_builtin_strncat_chk): Likewise.
(fold_builtin_sprintf_chk): Likewise.
(fold_builtin_snprintf_chk): Likewise.
(fold_builtin_printf): Likewise.
(fold_builtin_vprintf): Likewise.
* fold-const.c (negate_expr_p): Use new CALL_EXPR accessors and
constructors.
(operand_equal_p): Add separate tcc_vl_exp/CALL_EXPR case.
(make_range): Use TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
(extract_muldiv_1): Add VL_EXP_CLASS_P case.
(fold_mathfn_compare): Use new CALL_EXPR accessors and constructors.
(fold_unary): Likewise.
(fold_binary): Likewise.
(fold_ternary): Remove CALL_EXPR case, since they are no longer
ternary expressions.
(fold): Add logic for tcc_vl_exp.
(fold_checksum_tree): Make it know about tcc_vl_exp. Use
TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
(fold_build3_stat): Add assertion to flag broken interface for
constructing CALL_EXPRs.
(fold_build_call_list): New.
(fold_build_call_list_initializer): New.
(tree_expr_nonnegative_p): Use new CALL_EXPR accessors and
constructors.
(fold_strip_sign_ops): Likewise.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* tree-dump.c (dequeue_and_dump) <CALL_EXPR>: Use new CALL_EXPR
accessors and dump arguments explicitly.
* tree-pretty-print.c (do_niy): Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH.
(dump_generic_node): Use new CALL_EXPR accessors and walk arguments
explicitly.
(print_call_name): Use new CALL_EXPR accessors.
* print-tree.c (print_node): Add case tcc_vl_exp. Print
CALL_EXPR arguments explicitly instead of as a list. Use
TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
* tree-vrp.c (stmt_interesting_for_vrp): Use new CALL_EXPR accessors.
(vrp_visit_stmt): Likewise.
* tree-ssa-loop-im.c (outermost_invariant_loop_expr): Make it
know about tcc_vl_exp. Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH.
(force_move_till_expr): Likewise.
* targhooks.c (default_external_stack_protect_fail): Use
build_call_expr instead of build_function_call_expr.
(default_hidden_stack_protect_fail): Likewise.
* tree-complex.c (expand_complex_libcall): Use build_call_expr to
build the call.
* cgraphbuild.c (build_cgraph_edges): Use new CALL_EXPR accessors
and walk arguments explicitly.
* tree-ssa-loop-niter.c (simplify_replace_tree): Use
TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
(expand_simple_operations): Likewise.
(infer_loop_bounds_from_array): Use new CALL_EXPR accessors.
* gengtype.c (adjust_field_tree_exp): Use TREE_OPERAND_LENGTH instead
of TREE_CODE_LENGTH.
(walk_type): Tweak walking of arrays not to blow up on CALL_EXPRs.
* optabs.c (expand_widen_pattern-expr): Use TREE_OPERAND_LENGTH
instead of TREE_CODE_LENGTH.
* value_prof.c (tree_ic): Use new CALL_EXPR accessors.
(tree_ic_transform): Likewise.
(interesting_stringop_to_profile_p): Pass entire CALL_EXPR as
parameter instead of arglist. Fix callers.
(tree_stringop_fixed_value): Use new CALL_EXPR accessors.
(tree_stringops_transform): Likewise.
(tree_indirect_call_to_profile): Likewise.
(tree_stringops_values_to_profile): Likewise.
* tree-tailcall.c (find_tail_calls): Use new CALL_EXPR iterator.
(eliminate_tail_call): Likewise.
* ipa-cp.c (ipcp_update_callgraph): Use new CALL_EXPR accessors.
* tree-scalar-evolution.c (chrec_contains_symbols_defined_in_loop):
Use TREE_OPERAND_LENGTH and generalize to handle any number of
operands.
(instantiate_parameters_1): Can't handle tcc_vl_exp here.
* omp-low.c (build_omp_barrier): Use build_call_expr.
(lower_rec_input_clauses): Likewise.
(lower_reduction_clauses): Likewise.
(expand_parallel_call): Likewise.
(maybe_catch_exception): Likewise.
(expand_omp_for_generic): Likewise.
(expand_omp_for_static_nochunk): Likewise.
(expand_omp_sections): Likewise.
(lower_omp_single_simple): Likewise.
(lower_omp_single_copy): Likewise.
(lower_omp_master): Likewise.
(lower_omp_ordered): Likewise.
(lower_omp_critical): Likewise.
* ipa-reference.c (check-call): Use new CALL_EXPR iterator.
(scan_for_static_refs): Create tcc_vl_exp case for CALL_EXPR.
* tree-gimple.c (is_gimple_call_addr): Fix doc.
(recalculate_side_effects): Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH. Add tcc_vl_exp case.
* tree-chrec.c (chrec_contains_symbols): Use TREE_OPERAND_LENGTH
and generalize to handle any number of operands.
(chrec_contains_undetermined): Likewise.
(tree_contains_chrecs): Likewise.
(evolution_function_is_invariant_rec_p): Use TREE_OPERAND_LENGTH.
* cgraphunit.c (update_call_expr): Use new CALL_EXPR accessors.
* tree-ssa-ccp.c (ccp_fold): Use new CALL_EXPR accessors. Use
fold_call_expr instead of fold_builtin.
(ccp_fold_builtin): Likewise. Update calls into builtins.c to
match declarations there.
(fold_stmt): Use new CALL_EXPR constructor and accessors. Doc
updates.
* tree-ssa-loop-ivopts.c (expr_invariant_in_loop_p): Use
TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
* ipa-pure-const.c (check_call): Use new CALL_EXPR accessors.
(scan_function): Add case tcc_vl_exp for CALL_EXPR.
* tree-stdarg.c (execute_optimize_stdarg): Use new CALL_EXPR
accessors.
* tree-ssa-math-opts.c (execute_cse_sincos_1): Use build_call_expr.
(execute_cse_sincos): Use new CALL_EXPR accessors.
* tree-ssa-alias.c (find_used_portions): Use new CALL_EXPR iterator.
* gimple-low.c (lower_function_body): Use build_call_expr.
(lower_builtin_setjmp): Likewise.
* expr.c (emit_block_move_via_libcall): Use build_call_expr.
(set_storage_via_libcall): Likewise.
(safe_from_p): Add tcc_vl_exp case. Use TREE_OPERAND_LENGTH
instead of TREE_CODE_LENGTH.
(expand_expr_real_1): Use new CALL_EXPR accessors.
* tree-browser.c (store_child_info): Use TREE_OPERAND_LENGTH and
generalize to handle any number of operands.
(TB_parent_eq): Likewise.
* predict.c (expr_expected_value): Use new CALL_EXPR accessors.
(strip_builtin_expect): Likewise.
* function.c (gimplify_parameters): Use build_call_expr.
* tree-vectorizer.c (vect_is_simple_reduction): Use TREE_OPERAND_LENGTH
instead of TREE_CODE_LENGTH.
* ipa-type-escape.c (check_call): Use new CALL_EXPR iterators.
(scan_for_refs): Add case tcc_vl_exp for CALL_EXPR.
* tree-data-ref.c (get_references_in_stmt): Use new CALL_EXPR
iterators.
* gimplify.c (build_stack_save_restore): Use build_call_expr.
(gimplify_decl_expr): Likewise.
(gimplify_call_expr): Use fold_call_expr instead of fold_builtin.
Use new CALL_EXPR iterators.
(gimplify_modify_expr_to_memcpy): Use build_call_expr.
(gimplify_modify_expr_to_memset): Likewise.
(gimplify_variable_sized_compare): Likewise.
(gimplify_omp_atomic_fetch_op): Likewise.
(gimplify_omp_atomic_pipeline): Likewise.
(gimplify_omp_atomic_mutex): Likewise.
(gimplify_function_tree): Likewise.
* calls.c (alloca_call_p): Use new CALL_EXPR accessors.
(call_expr_flags): Likewise.
(expand_call): Likewise.
* except.c (expand_builtin_eh_return_data_regno): Pass entire
CALL_EXPR as parameter instead of arglist. Use new CALL_EXPR
accessors.
* coverage.c (create_coverage): Use build_call_expr.
* tree-ssa-pre.c (expression_node_pool, list_node_pool): Delete.
(temp_call_expr_obstack): New.
(pool_copy_list): Delete.
(temp_copy_call_expr): New.
(phi_translate): Add case tcc_vl_exp for CALL_EXPR. Use new
CALL_EXPR accessors. Get rid of special goo for copying argument
lists and use temp_copy_call_expr instead.
(valid_in_sets): Add case tcc_vl_exp for CALL_EXPR. Use new
CALL_EXPR accessors.
(create_expression_by_pieces): Likewise. Use build_call_array
to construct the result instead of fold_build3.
(create_value_expr_from): Add tcc_vl_exp. Delete special goo for
dealing with argument lists.
(init_pre): Remove references to expression_node_pool and
list_node_pool. Init temp_call_expr_obstack instead.
(fini_pre): Remove references to expression_node_pool and
list_node_pool.
* tree-sra.c (sra_walk_call_expr): Use new CALL_EXPR accessors
and walk arguments explicitly instead of as a list.
* tree-mudflap.c (mf_build_check_statement_for): Use build_call_expr.
(mx_register_decls): Likewise.
(mudflap_register_call): Likewise.
(mudflap_finish_file): Likewise.
* ipa-prop.c (ipa_callsite_compute_count): Use new CALL_EXPR accessors.
(ipa_callsite_compute_param): Likewise.
* tree-vect-patterns.c (vect_recog_pow_pattern): Use new CALL_EXPR
accessors and constructor.
* tree-nested.c (convert_nl_goto_reference): Use new CALL_EXPR
accessors and constructor.
(convert_tramp_reference): Likewise.
(convert_call_expr): Likewise.
(finalize_nesting_tree_1): Likewise.
* tree-ssa.c (tree_ssa_useless_type_conversion): Use new CALL_EXPR
accessors.
* tree-ssa-loop-prefetch.c (issue_prefetch_ref): Use build_call_expr.
* tree-inline.c (initialize_inlined_parameters): Pass entire
CALL_EXPR as parameter instead of arglist. Use new CALL_EXPR
accessors.
(estimate_num_insns_1): Use new CALL_EXPR accessors.
(expand_call_inline): Tidy up call to initialize_inlined_parameters.
* tree-vect-transform.c (vect_create_epilog_for_reduction): Use
TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
(vectorizable_reduction): Likewise.
(vectorizable_call): Use new CALL_EXPR iterators.
(vectorizable_conversion): Use build_call_expr.
(vectorizable_operation): Use TREE_OPERAND_LENGTH.
(vect_gen_widened_results_half): Use build_call_expr.
(vect_setup_realignment): Likewise.
(vectorizable_live_operation): Use TREE_OPERAND_LENGTH.
* tree-object-size.c (alloc_object_size): Use new CALL_EXPR accessors.
(pass_through_call): Likewise.
(compute_object_sizes): Likewise. Use fold_call_expr instead of
fold_builtin.
* tree-profile.c (tree_gen_interval_profiler): Use build_call_expr.
(tree_gen_pow2_profiler): Likewise.
(tree_gen_one_value_profiler): Likewise.
(tree_gen_ic_func_profiler): Likewise.
(tree_gen_average_profiler): Likewise.
(tree_gen_ior_profiler): Likewise.
* tree-ssa-structalias.c (get_constraint_for): Add case tcc_vl_exp.
(find_func_aliases): Use new CALL_EXPR accessors. Add case
tcc_vl_exp. Use TREE_OPERAND_LENGTH instead of TREE_CODE_LENGTH.
* tree-ssa-reassoc.c (get_rank): Use TREE_OPERAND_LENGTH instead
of TREE_CODE_LENGTH.
* stmt.c (warn_if_unused_value): Use TREE_OPERAND_LENGTH instead
of TREE_CODE_LENGTH.
* convert.c (convert_to_real): Use new CALL_EXPR accessors and
constructor.
(convert_to_integer): Likewise.
* tree-ssa-operands.c (get_call_expr_operands): Use new CALL_EXPR
accessors.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* config/alpha/alpha.c (alpha_expand_builtin): Use new CALL_EXPR
accessors.
* config/frv/frv.c (frv_expand_builtin): Likewise.
* config/s390/s390.c (s390_expand_builtin): Likewise.
* config/sparc/sparc.c (sparc_gimplify_va_arg): Use build_call_expr.
(sparc_expand_builtin): Use new CALL_EXPR accessors.
* config/i386/i386.c (ix86_function_ok_for_sibcall): Likewise.
(ix86_expand_binop_builtin): Pass entire CALL_EXPR as parameter
instead of arglist. Use new CALL_EXPR accessors on it. Fix callers.
(ix86_expand_store_builtin): Likewise.
(ix86_expand_unop_builtin): Likewise.
(ix86_expand_unop1_builtin): Likewise.
(ix86_expand_sse_compare): Likewise.
(ix86_expand_sse_comi): Likewise.
(ix86_expand_vec_init_builtin): Likewise.
(ix86_expand_vec_ext_builtin): Likewise.
(ix86_expand_vec_set_builtin): Likewise.
(ix86_expand_builtin): Use new CALL_EXPR accessors.
* config/sh/sh.c (sh_expand_builtin): Use new CALL_EXPR accessors.
* config/c4x/c4x.c (c4x_expand_builtin): Likewise.
* config/iq2000/iq2000.c (expand_one_builtin): Pass entire CALL_EXPR
instead of arglist. Use new CALL_EXPR accessors. Fix callers.
(iq2000_expand_builtin): Use new CALL_EXPR accessors.
* config/rs6000/rs6000-c.c (altivec_build_resolved_builtin): Use
build_call_expr.
* config/rs6000/rs6000.c (rs6000_gimplify_va_arg): Likewise.
(rs6000_expand_unop_builtin): Pass entire CALL_EXPR instead of
arglist. Use new CALL_EXPR accessors. Fix callers.
(altivec_expand_abs_builtin): Likewise.
(rs6000_expand_binop_builtin): Likewise.
(altivec_expand_predicate_builtin): Likewise.
(altivec_expand_lv_builtin): Likewise.
(spe_expand_stv_builtin): Likewise.
(altivec_expand_stv_builtin): Likewise.
(rs6000_expand_ternop_builtin): Likewise.
(altivec_expand_ld_builtin): Use new CALL_EXPR accessors.
(altivec_expand_st_builtin): Likewise.
(altivec_expand_dst_builtin): Likewise.
(altivec_expand_vec_init_builtin): Pass entire CALL_EXPR instead of
arglist. Use new CALL_EXPR accessors. Fix callers.
(altivec_expand_vec_set_builtin): Likewise.
(altivec_expand_vec_ext_builtin): Likewise.
(altivec_expand_builtin): Use new CALL_EXPR accessors.
(spe_expand_builtin): Likewise.
(spe_expand_predicate_builtin): Pass entire CALL_EXPR instead of
arglist. Use new CALL_EXPR accessors. Fix callers.
(spe_expand_evsel_builtin): Likewise.
(rs6000_expand_builtin): Use new CALL_EXPR accessors. VCFUX and
FCFSX cases must construct whole new CALL_EXPR, not just arglist.
* config/arm/arm.c (arm_expand_binop_builtin): Pass entire CALL_EXPR
instead of arglist. Use new CALL_EXPR accessors. Fix callers.
(arm_expand_unop_builtin): Likewise.
(arm_expand_builtin): Use new CALL_EXPR accessors.
* config/mips/mips.c (mips_expand_builtin): Use new CALL_EXPR
accessors.
* config/bfin/bfin.c (bfin_expand_binop_builtin): Pass entire CALL_EXPR
instead of arglist. Use new CALL_EXPR accessors. Fix callers.
(bfin_expand_unop_builtin): Likewise.
(bfin_expand_builtin): Use new CALL_EXPR accessors.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* c-semantics.c (build_stmt): Add internal diagnostic check.
* c-pretty-print.c (pp_c_postfix_expression): Use new CALL_EXPR
accessors. Print arguments explicitly instead of as a list.
* c-typeck.c (build_function_call): Use new CALL_EXPR constructors.
* c-omp.c (c_finish_omp_barrier): Use build_call_expr.
(c_finish_omp_flish): Likewise.
* c-common.c (verify_tree): Use new CALL_EXPR accessors. Traverse
arguments explicitly instead of as a list. Use TREE_OPERAND_LENGTH
instead of TREE_CODE_LENGTH.
(check_function_arguments_recurse): Use new CALL_EXPR accessors.
(c_warn_unused_result): Likewise.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* cp-tree.def (AGGR_INIT_EXPR): Adjust documentation.
Change class to tcc_vl_exp.
* call.c (build_call): Use build_call_list instead
of build3.
(build_over_call): Likewise.
(build_new_method_call): Use build_min_non_dep_call_list
instead of build_min_non_dep.
* error.c (dump_call_expr_args): New function.
(dump_aggr_init_expr_args): New function.
(dump_expr) <AGGR_INIT_EXPR, CALL_EXPR, INDIRECT_REF>: Use them.
Update to use new CALL_EXPR and AGGR_INIT_EXPR accessor macros.
* cvt.c (convert_to_void): Use build_call_array instead
of build3; use new AGGR_INIT_EXPR accessor macros.
* mangle.c (write_expression): Use TREE_OPERAND_LENGTH
instead of TREE_CODE_LENGTH.
* dump.c (cp_dump_tree) <AGGR_INIT_EXPR>: Update to use new
AGGR_INIT_EXPR accessor macros.
* cp-gimplify.c (cp_gimplify_init_expr): Use
AGGR_INIT_EXPR_SLOT to set the slot operand.
* cp-tree.h (AGGR_INIT_EXPR_FN): New macro.
(AGGR_INIT_EXPR_SLOT): New macro.
(AGGR_INIT_EXPR_ARG): New macro.
(aggr_init_expr_nargs): New macro.
(AGGR_INIT_EXPR_ARGP): New macro.
(aggr_init_expr_arg_iterator): New.
(init_aggr_init_expr_arg_iterator): New.
(next_aggr_init_expr_arg): New.
(first_aggr_init_expr_arg): New.
(more_aggr_init_expr_args_p): New.
(FOR_EACH_AGGR_INIT_EXPR_ARG): New.
(stabilize_aggr_init): New declaration.
(build_min_non_dep_call_list): Likewise.
* tree.c (process_aggr_init_operands): New function.
(build_aggr_init_array) New function.
(build_cplus_new): Update to use new CALL_EXPR and
AGGR_INIT_EXPR accessor macros. Replace use of build3 with
build_aggr_init_array.
(build_min_non_dep_call_list) New function.
(build_min_nt): Assert input code parameter is not a variable
length expression class.
(build_min, build_min_non_dep): Likewise.
(cp_tree_equal) <CALL_EXPR>: Iterate through the arguments
to check for equality instead of recursing. Handle tcc_vl_exp
tree code classes.
(stabilize_call): Update to only handle CALL_EXPRs, not
AGGR_INIT_EXPRs; use new CALL_EXPR accessor macros.
(stabilize_aggr_init): New function.
(stabilize_init): Use it.
* cxx-pretty-print.c (pp_cxx_postfix_expression)
<AGGR_INIT_EXPR, CALL_EXPR>: Update to use new CALL_EXPR and
AGGR_INIT_EXPR accessor macros and argument iterators.
* pt.c (tsubst_copy) <CALL_EXPR>: Replace build_nt with
build_vl_exp. Iterate through the operands, recursively
processing each one.
(tsubst_copy_and_build) <CALL_EXPR>: Update to use new
CALL_EXPR accessor macros.
(value_dependent_expression_p) <default>: Handle tcc_vl_exp
tree code classes. Use TREE_OPERAND_LENGTH instead of
TREE_CODE_LENGTH.
* semantics.c (finish_call_expr): Use build_nt_call_list
instead of build_nt.
(simplify_aggr_init_expr): Update to use new AGGR_INIT_EXPR
accessor macros. Use build_call_array to construct the
CALL_EXPR node instead of build3
* decl2.c (build_offset_ref_call_from_tree): Use
build_nt_call_list and build_min_non_dep_call_list instead
of build_min_nt and build_min_non_dep.
* parser.c (cp_parser_postfix_expression) <CPP_OPEN_PAREN>:
Use build_nt_call_list instead of build_min_nt.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* java-tree.h (BUILD_MONITOR_ENTER): Use build_call_nary instead
of build3.
(BUILD_MONITOR_EXIT): Likewise.
* java-gimplify.c (java_gimplify_component_ref): Use build_call_expr.
(java_gimplify_modify_expr): Likewise.
* class.c (cache_this_class_ref): Use build_call_expr.
(build_static_field_ref): Likewise.
(emit_indirect_register_classes): Likewise.
(emit_register_classes): Likewise.
* resource.c (write_resource_constructor): Use build_call_expr.
* builtins.c (builtin_creator_function): Change interpretation of
the second parameter to be the whole CALL_EXPR instead of the arglist.
(max_builtin): Tweak parameter list. Use new CALL_EXPR accessors.
(min_builtin): Likewise.
(abs_builtin): Likewise.
(java_build_function_call_expr): Likewise.
(convert_real): Likewise.
(UNMARSHAL3): Likewise.
(UNMARSHAL4): Likewise.
(UNMARSHAL5): Likewise.
(build_arglist_for_builtin): Delete. Fix callers to use
build_call_expr instead.
(putObject_builtin): Tweak parameter list. Use new CALL_EXPR
accessors.
(compareAndSwapInt_builtin): Likewise.
(compareAndSwapLong_builtin): Likewise.
(compareAndSwapObject_builtin): Likewise.
(putVolatile_builtin): Likewise.
(getVolatile_builtin): Likewise.
(VMSupportsCS8_builtin): Likewise.
(check_for_builtin): Pass entire CALL_EXPR to builtin expander
instead of arglist.
* expr.c (build_java_athrow): Use build_call_nary instead of build3.
(build_java_throw_out_of_bounds_exception): Likewise.
(java_check_reference): Likewise.
(build_java_arraystore_check): Likewise.
(build_newarray): Likewise.
(build_anewarray): Likewise.
(expand_java_multinewarray): Use build_call_list instead of build3.
(build_java_monitor): Use build_call_nary instead of build3.
(java_create_object): Likewise.
(expand_java_NEW): Likewise.
(build_instanceof): Likewise.
(expand_java_CHECKCAST): Likewise.
(build_java_soft_divmod): Likewise.
(build_java_binop): Likewise.
(build_field_ref): Likewise.
(build_class_init): Likewise.
(rewrite_arglist_getcaller): Use build_call_expr.
(build_invokeinterface): Use build_call_nary instead of build3.
(expand_invoke): Use build_call_list instead of build3.
(build_jni_stub): Use build_call_nary, build_call_list, or
build_call_expr instead of build3.
(expand_java_field_op): Use build_call_expr instead of build3.
(force_evaluation_order): Use new CALL_EXPR accessors.
* lang.c (java_get_callee_fndecl): Use new CALL_EXPR accessors.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* objc-act.c (receiver_is_class_object): Use new CALL_EXPR accessors.
(objc_get_callee_fndecl): Likewise.
2007-02-15 Sandra Loosemore <sandra@codesourcery.com>
Brooks Moses <brooks.moses@codesourcery.com>
Lee Millward <lee.millward@codesourcery.com>
* trans-expr.c (gfc_conv_power_op): Use build_call_expr.
(gfc_conv_string_tmp): Likewise.
(gfc_conv_concat_op): Likewise.
(gfc_build_compare_string): Likewise.
(gfc_conv_function_call): Use build_call_list instead of build3.
* trans-array.c (gfc_trans_allocate_array_storage): Use
build_call_expr.
(gfc_grow_array): Likewise.
(gfc_trans_array_ctor_element): Likewise.
(gfc_trans_array_constructor_value): Likewise.
(gfc_array_allocate): Likewise.
(gfc_array_deallocate): Likewise.
(gfc_trans_auto_array_allocation): Likewise.
(gfc_trans_dummy_array_bias): Likewise.
(gfc_conv_array_parameter): Likewise.
(gfc_trans_dealloc_allocated): Likewise.
(gfc_duplicate_allocatable): Likewise.
* trans-openmp.c (gfc_trans_omp_barrier): Use build_call_expr.
(gfc_trans_omp_flush): Likewise.
* trans-stmt.c (gfc_conv_elementel_dependencies): Use build_call_expr.
(gfc_trans_pause): Likewise.
(gfc_trans_stop): Likewise.
(gfc_trans_character_select): Likewise.
(gfc_do_allocate): Likewise.
(gfc_trans_assign_need_temp): Likewise.
(gfc_trans_pointer_assign_need_temp): Likewise.
(gfc_trans_forall_1): Likewise.
(gfc_trans_where_2): Likewise.
(gfc_trans_allocate): Likewise.
(gfc_trans_deallocate): Likewise.
* trans.c (gfc_trans_runtime_check): Use build_call_expr.
* trans-io.c (gfc_trans_open): Use build_call_expr.
(gfc_trans_close): Likewise.
(build_filepos): Likewise.
(gfc_trans_inquire): Likewise.
(NML_FIRST_ARG): Delete.
(NML_ADD_ARG): Delete.
(transfer_namelist_element): Use build_call_expr.
(build_dt): Likewise.
(gfc_trans_dt_end): Likewise.
(transfer_expr): Likewise.
(transfer_array-desc): Likewise.
* trans-decl.c (gfc_generate_function_code): Use build_call_expr.
(gfc_generate_constructors): Likewise.
* trans-intrinsic.c (gfc_conv_intrinsic_ctime): Use build_call_expr.
(gfc_conv_intrinsic_fdate): Likewise.
(gfc_conv_intrinsic_ttynam): Likewise.
(gfc_conv_intrinsic_array_transfer): Likewise.
(gfc_conv_associated): Likewise.
(gfc_conv_intrinsic_si_kind): Likewise.
(gfc_conv_intrinsic_trim): Likewise.
(gfc_conv_intrinsic_repeat: Likewise.
(gfc_conv_intrinsic_iargc): Likewise.
Co-Authored-By: Brooks Moses <brooks.moses@codesourcery.com>
Co-Authored-By: Lee Millward <lee.millward@codesourcery.com>
From-SVN: r122018
Diffstat (limited to 'gcc/java')
-rw-r--r-- | gcc/java/ChangeLog | 67 | ||||
-rw-r--r-- | gcc/java/builtins.c | 199 | ||||
-rw-r--r-- | gcc/java/class.c | 32 | ||||
-rw-r--r-- | gcc/java/expr.c | 270 | ||||
-rw-r--r-- | gcc/java/java-gimplify.c | 11 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 20 | ||||
-rw-r--r-- | gcc/java/lang.c | 2 | ||||
-rw-r--r-- | gcc/java/resource.c | 3 |
8 files changed, 292 insertions, 312 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index f9ef73fb28e..39fe758bf48 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,70 @@ +2007-02-15 Sandra Loosemore <sandra@codesourcery.com> + Brooks Moses <brooks.moses@codesourcery.com> + Lee Millward <lee.millward@codesourcery.com> + + * java-tree.h (BUILD_MONITOR_ENTER): Use build_call_nary instead + of build3. + (BUILD_MONITOR_EXIT): Likewise. + + * java-gimplify.c (java_gimplify_component_ref): Use build_call_expr. + (java_gimplify_modify_expr): Likewise. + + * class.c (cache_this_class_ref): Use build_call_expr. + (build_static_field_ref): Likewise. + (emit_indirect_register_classes): Likewise. + (emit_register_classes): Likewise. + + * resource.c (write_resource_constructor): Use build_call_expr. + + * builtins.c (builtin_creator_function): Change interpretation of + the second parameter to be the whole CALL_EXPR instead of the arglist. + (max_builtin): Tweak parameter list. Use new CALL_EXPR accessors. + (min_builtin): Likewise. + (abs_builtin): Likewise. + (java_build_function_call_expr): Likewise. + (convert_real): Likewise. + (UNMARSHAL3): Likewise. + (UNMARSHAL4): Likewise. + (UNMARSHAL5): Likewise. + (build_arglist_for_builtin): Delete. Fix callers to use + build_call_expr instead. + (putObject_builtin): Tweak parameter list. Use new CALL_EXPR + accessors. + (compareAndSwapInt_builtin): Likewise. + (compareAndSwapLong_builtin): Likewise. + (compareAndSwapObject_builtin): Likewise. + (putVolatile_builtin): Likewise. + (getVolatile_builtin): Likewise. + (VMSupportsCS8_builtin): Likewise. + (check_for_builtin): Pass entire CALL_EXPR to builtin expander + instead of arglist. + + * expr.c (build_java_athrow): Use build_call_nary instead of build3. + (build_java_throw_out_of_bounds_exception): Likewise. + (java_check_reference): Likewise. + (build_java_arraystore_check): Likewise. + (build_newarray): Likewise. + (build_anewarray): Likewise. + (expand_java_multinewarray): Use build_call_list instead of build3. + (build_java_monitor): Use build_call_nary instead of build3. + (java_create_object): Likewise. + (expand_java_NEW): Likewise. + (build_instanceof): Likewise. + (expand_java_CHECKCAST): Likewise. + (build_java_soft_divmod): Likewise. + (build_java_binop): Likewise. + (build_field_ref): Likewise. + (build_class_init): Likewise. + (rewrite_arglist_getcaller): Use build_call_expr. + (build_invokeinterface): Use build_call_nary instead of build3. + (expand_invoke): Use build_call_list instead of build3. + (build_jni_stub): Use build_call_nary, build_call_list, or + build_call_expr instead of build3. + (expand_java_field_op): Use build_call_expr instead of build3. + (force_evaluation_order): Use new CALL_EXPR accessors. + + * lang.c (java_get_callee_fndecl): Use new CALL_EXPR accessors. + 2007-02-15 David Daney <ddaney@avtrex.com> * Make-lang.in (JAVA_MANFILES): Add doc/gc-analyze.1. diff --git a/gcc/java/builtins.c b/gcc/java/builtins.c index ef8854ae2e6..cfbab665192 100644 --- a/gcc/java/builtins.c +++ b/gcc/java/builtins.c @@ -60,7 +60,8 @@ static tree VMSupportsCS8_builtin (tree, tree); /* Functions of this type are used to inline a given call. Such a function should either return an expression, if the call is to be inlined, or NULL_TREE if a real call should be emitted. Arguments - are method return type and arguments to call. */ + are method return type and the original CALL_EXPR containing the + arguments to the call. */ typedef tree builtin_creator_function (tree, tree); /* Hold a char*, before initialization, or a tree, after @@ -130,50 +131,73 @@ static GTY(()) struct builtin_record java_builtins[] = /* Internal functions which implement various builtin conversions. */ static tree -max_builtin (tree method_return_type, tree method_arguments) +max_builtin (tree method_return_type, tree orig_call) { /* MAX_EXPR does not handle -0.0 in the Java style. */ if (TREE_CODE (method_return_type) == REAL_TYPE) return NULL_TREE; return fold_build2 (MAX_EXPR, method_return_type, - TREE_VALUE (method_arguments), - TREE_VALUE (TREE_CHAIN (method_arguments))); + CALL_EXPR_ARG (orig_call, 0), + CALL_EXPR_ARG (orig_call, 1)); } static tree -min_builtin (tree method_return_type, tree method_arguments) +min_builtin (tree method_return_type, tree orig_call) { /* MIN_EXPR does not handle -0.0 in the Java style. */ if (TREE_CODE (method_return_type) == REAL_TYPE) return NULL_TREE; return fold_build2 (MIN_EXPR, method_return_type, - TREE_VALUE (method_arguments), - TREE_VALUE (TREE_CHAIN (method_arguments))); + CALL_EXPR_ARG (orig_call, 0), + CALL_EXPR_ARG (orig_call, 1)); } static tree -abs_builtin (tree method_return_type, tree method_arguments) +abs_builtin (tree method_return_type, tree orig_call) { return fold_build1 (ABS_EXPR, method_return_type, - TREE_VALUE (method_arguments)); + CALL_EXPR_ARG (orig_call, 0)); } -/* Mostly copied from ../builtins.c. */ +/* Construct a new call to FN using the arguments from ORIG_CALL. */ + static tree -java_build_function_call_expr (tree fn, tree arglist) +java_build_function_call_expr (tree fn, tree orig_call) { - tree call_expr; - - call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); - return fold_build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)), - call_expr, arglist, NULL_TREE); + int nargs = call_expr_nargs (orig_call); + switch (nargs) + { + /* Although we could handle the 0-3 argument cases using the general + logic in the default case, splitting them out permits folding to + be performed without constructing a temporary CALL_EXPR. */ + case 0: + return build_call_expr (fn, 0); + case 1: + return build_call_expr (fn, 1, CALL_EXPR_ARG (orig_call, 0)); + case 2: + return build_call_expr (fn, 2, + CALL_EXPR_ARG (orig_call, 0), + CALL_EXPR_ARG (orig_call, 1)); + case 3: + return build_call_expr (fn, 3, + CALL_EXPR_ARG (orig_call, 0), + CALL_EXPR_ARG (orig_call, 1), + CALL_EXPR_ARG (orig_call, 2)); + default: + { + tree fntype = TREE_TYPE (fn); + fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fn); + return fold (build_call_array (TREE_TYPE (fntype), + fn, nargs, CALL_EXPR_ARGP (orig_call))); + } + } } static tree -convert_real (tree method_return_type, tree method_arguments) +convert_real (tree method_return_type, tree orig_call) { return build1 (VIEW_CONVERT_EXPR, method_return_type, - TREE_VALUE (method_arguments)); + CALL_EXPR_ARG (orig_call, 0)); } @@ -191,76 +215,51 @@ convert_real (tree method_return_type, tree method_arguments) */ -/* Macros to unmarshal arguments from a TREE_LIST into a few +/* Macros to unmarshal arguments from a CALL_EXPR into a few variables. We also convert the offset arg from a long to an integer that is the same size as a pointer. */ -#define UNMARSHAL3(METHOD_ARGUMENTS) \ +#define UNMARSHAL3(METHOD_CALL) \ tree this_arg, obj_arg, offset_arg; \ do \ { \ - tree chain = METHOD_ARGUMENTS; \ - this_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ - obj_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ + tree orig_method_call = METHOD_CALL; \ + this_arg = CALL_EXPR_ARG (orig_method_call, 0); \ + obj_arg = CALL_EXPR_ARG (orig_method_call, 1); \ offset_arg = fold_convert (java_type_for_size (POINTER_SIZE, 0), \ - TREE_VALUE (chain)); \ + CALL_EXPR_ARG (orig_method_call, 2)); \ } \ while (0) -#define UNMARSHAL4(METHOD_ARGUMENTS) \ +#define UNMARSHAL4(METHOD_CALL) \ tree value_type, this_arg, obj_arg, offset_arg, value_arg; \ do \ { \ - tree chain = METHOD_ARGUMENTS; \ - this_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ - obj_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ + tree orig_method_call = METHOD_CALL; \ + this_arg = CALL_EXPR_ARG (orig_method_call, 0); \ + obj_arg = CALL_EXPR_ARG (orig_method_call, 1); \ offset_arg = fold_convert (java_type_for_size (POINTER_SIZE, 0), \ - TREE_VALUE (chain)); \ - chain = TREE_CHAIN (chain); \ - value_arg = TREE_VALUE (chain); \ + CALL_EXPR_ARG (orig_method_call, 2)); \ + value_arg = CALL_EXPR_ARG (orig_method_call, 3); \ value_type = TREE_TYPE (value_arg); \ } \ while (0) -#define UNMARSHAL5(METHOD_ARGUMENTS) \ +#define UNMARSHAL5(METHOD_CALL) \ tree value_type, this_arg, obj_arg, offset_arg, expected_arg, value_arg; \ do \ { \ - tree chain = METHOD_ARGUMENTS; \ - this_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ - obj_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ + tree orig_method_call = METHOD_CALL; \ + this_arg = CALL_EXPR_ARG (orig_method_call, 0); \ + obj_arg = CALL_EXPR_ARG (orig_method_call, 1); \ offset_arg = fold_convert (java_type_for_size (POINTER_SIZE, 0), \ - TREE_VALUE (chain)); \ - chain = TREE_CHAIN (chain); \ - expected_arg = TREE_VALUE (chain); \ - chain = TREE_CHAIN (chain); \ - value_arg = TREE_VALUE (chain); \ + CALL_EXPR_ARG (orig_method_call, 2)); \ + expected_arg = CALL_EXPR_ARG (orig_method_call, 3); \ + value_arg = CALL_EXPR_ARG (orig_method_call, 4); \ value_type = TREE_TYPE (value_arg); \ } \ while (0) -/* Construct an arglist from a call. */ - -static tree -build_arglist_for_builtin (tree arg, ...) -{ - va_list ap; - tree nextarg; - tree newarglist = build_tree_list (NULL_TREE, arg); - - va_start(ap, arg); - while ((nextarg = va_arg(ap, tree))) - newarglist = tree_cons (NULL_TREE, nextarg, newarglist); - - return nreverse (newarglist); -} - /* Add an address to an offset, forming a sum. */ static tree @@ -286,10 +285,10 @@ build_check_this (tree stmt, tree this_arg) static tree putObject_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { tree addr, stmt; - UNMARSHAL4 (method_arguments); + UNMARSHAL4 (orig_call); addr = build_addr_sum (value_type, obj_arg, offset_arg); stmt = fold_build2 (MODIFY_EXPR, value_type, @@ -302,22 +301,18 @@ putObject_builtin (tree method_return_type ATTRIBUTE_UNUSED, static tree compareAndSwapInt_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { enum machine_mode mode = TYPE_MODE (int_type_node); if (sync_compare_and_swap_cc[mode] != CODE_FOR_nothing || sync_compare_and_swap[mode] != CODE_FOR_nothing) { - tree newarglist, addr, stmt; - UNMARSHAL5 (method_arguments); + tree addr, stmt; + UNMARSHAL5 (orig_call); addr = build_addr_sum (int_type_node, obj_arg, offset_arg); - - newarglist - = build_arglist_for_builtin (addr, expected_arg, value_arg, NULL_TREE); - stmt = (build_function_call_expr - (built_in_decls[BUILT_IN_BOOL_COMPARE_AND_SWAP_4], - newarglist)); + stmt = build_call_expr (built_in_decls[BUILT_IN_BOOL_COMPARE_AND_SWAP_4], + 3, addr, expected_arg, value_arg); return build_check_this (stmt, this_arg); } @@ -326,22 +321,18 @@ compareAndSwapInt_builtin (tree method_return_type ATTRIBUTE_UNUSED, static tree compareAndSwapLong_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { enum machine_mode mode = TYPE_MODE (long_type_node); if (sync_compare_and_swap_cc[mode] != CODE_FOR_nothing || sync_compare_and_swap[mode] != CODE_FOR_nothing) { - tree newarglist, addr, stmt; - UNMARSHAL5 (method_arguments); + tree addr, stmt; + UNMARSHAL5 (orig_call); addr = build_addr_sum (long_type_node, obj_arg, offset_arg); - - newarglist - = build_arglist_for_builtin (addr, expected_arg, value_arg, NULL_TREE); - stmt = (build_function_call_expr - (built_in_decls[BUILT_IN_BOOL_COMPARE_AND_SWAP_8], - newarglist)); + stmt = build_call_expr (built_in_decls[BUILT_IN_BOOL_COMPARE_AND_SWAP_8], + 3, addr, expected_arg, value_arg); return build_check_this (stmt, this_arg); } @@ -349,27 +340,23 @@ compareAndSwapLong_builtin (tree method_return_type ATTRIBUTE_UNUSED, } static tree compareAndSwapObject_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { enum machine_mode mode = TYPE_MODE (ptr_type_node); if (sync_compare_and_swap_cc[mode] != CODE_FOR_nothing || sync_compare_and_swap[mode] != CODE_FOR_nothing) { - tree newarglist, addr, stmt; + tree addr, stmt; int builtin; - UNMARSHAL5 (method_arguments); + UNMARSHAL5 (orig_call); builtin = (POINTER_SIZE == 32 ? BUILT_IN_BOOL_COMPARE_AND_SWAP_4 : BUILT_IN_BOOL_COMPARE_AND_SWAP_8); addr = build_addr_sum (value_type, obj_arg, offset_arg); - - newarglist - = build_arglist_for_builtin (addr, expected_arg, value_arg, NULL_TREE); - stmt = (build_function_call_expr - (built_in_decls[builtin], - newarglist)); + stmt = build_call_expr (built_in_decls[builtin], + 3, addr, expected_arg, value_arg); return build_check_this (stmt, this_arg); } @@ -378,20 +365,17 @@ compareAndSwapObject_builtin (tree method_return_type ATTRIBUTE_UNUSED, static tree putVolatile_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { - tree newarglist, addr, stmt, modify_stmt; - UNMARSHAL4 (method_arguments); + tree addr, stmt, modify_stmt; + UNMARSHAL4 (orig_call); addr = build_addr_sum (value_type, obj_arg, offset_arg); addr = fold_convert (build_pointer_type (build_type_variant (value_type, 0, 1)), addr); - newarglist = NULL_TREE; - stmt = (build_function_call_expr - (built_in_decls[BUILT_IN_SYNCHRONIZE], - newarglist)); + stmt = build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0); modify_stmt = fold_build2 (MODIFY_EXPR, value_type, build_java_indirect_ref (value_type, addr, flag_check_references), @@ -404,20 +388,17 @@ putVolatile_builtin (tree method_return_type ATTRIBUTE_UNUSED, static tree getVolatile_builtin (tree method_return_type ATTRIBUTE_UNUSED, - tree method_arguments) + tree orig_call) { - tree newarglist, addr, stmt, modify_stmt, tmp; - UNMARSHAL3 (method_arguments); + tree addr, stmt, modify_stmt, tmp; + UNMARSHAL3 (orig_call); addr = build_addr_sum (method_return_type, obj_arg, offset_arg); addr = fold_convert (build_pointer_type (build_type_variant (method_return_type, 0, 1)), addr); - newarglist = NULL_TREE; - stmt = (build_function_call_expr - (built_in_decls[BUILT_IN_SYNCHRONIZE], - newarglist)); + stmt = build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0); tmp = build_decl (VAR_DECL, NULL, method_return_type); DECL_IGNORED_P (tmp) = 1; @@ -437,7 +418,7 @@ getVolatile_builtin (tree method_return_type ATTRIBUTE_UNUSED, static tree VMSupportsCS8_builtin (tree method_return_type, - tree method_arguments ATTRIBUTE_UNUSED) + tree orig_call ATTRIBUTE_UNUSED) { enum machine_mode mode = TYPE_MODE (long_type_node); gcc_assert (method_return_type == boolean_type_node); @@ -596,7 +577,6 @@ check_for_builtin (tree method, tree call) if (optimize && TREE_CODE (call) == CALL_EXPR) { int i; - tree method_arguments = TREE_OPERAND (call, 1); tree method_class = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method))); tree method_name = DECL_NAME (method); tree method_return_type = TREE_TYPE (TREE_TYPE (method)); @@ -611,8 +591,7 @@ check_for_builtin (tree method, tree call) if (java_builtins[i].creator != NULL) { tree result - = (*java_builtins[i].creator) (method_return_type, - method_arguments); + = (*java_builtins[i].creator) (method_return_type, call); return result == NULL_TREE ? call : result; } @@ -623,7 +602,7 @@ check_for_builtin (tree method, tree call) fn = built_in_decls[java_builtins[i].builtin_code]; if (fn == NULL_TREE) return call; - return java_build_function_call_expr (fn, method_arguments); + return java_build_function_call_expr (fn, call); } } } diff --git a/gcc/java/class.c b/gcc/java/class.c index 804c239fcfa..85cdeb49e1e 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1039,10 +1039,8 @@ cache_this_class_ref (tree fndecl) && ! DECL_CLINIT_P (fndecl) && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl)))) { - tree init = build3 (CALL_EXPR, void_type_node, - build_address_of (soft_initclass_node), - build_tree_list (NULL_TREE, this_classdollar), - NULL_TREE); + tree init = build_call_expr (soft_initclass_node, 1, + this_classdollar); java_add_stmt (init); } } @@ -1177,20 +1175,16 @@ build_static_field_ref (tree fdecl) int cpool_index = alloc_constant_fieldref (output_class, fdecl); tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl); - tree test - = build3 (CALL_EXPR, boolean_type_node, - build_address_of (built_in_decls[BUILT_IN_EXPECT]), - tree_cons (NULL_TREE, build2 (EQ_EXPR, boolean_type_node, - cache_entry, null_pointer_node), - build_tree_list (NULL_TREE, boolean_false_node)), - NULL_TREE); + tree test + = build_call_expr (built_in_decls[BUILT_IN_EXPECT], 2, + build2 (EQ_EXPR, boolean_type_node, + cache_entry, null_pointer_node), + boolean_false_node); tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index); tree init - = build3 (CALL_EXPR, ptr_type_node, - build_address_of (soft_resolvepoolentry_node), - tree_cons (NULL_TREE, build_class_ref (output_class), - build_tree_list (NULL_TREE, cpool_index_cst)), - NULL_TREE); + = build_call_expr (soft_resolvepoolentry_node, 2, + build_class_ref (output_class), + cpool_index_cst); init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init); init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry); init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init); @@ -2693,8 +2687,7 @@ emit_indirect_register_classes (tree *list_p) TREE_PUBLIC (t) = 1; DECL_EXTERNAL (t) = 1; register_class_fn = t; - t = tree_cons (NULL, reg_class_list, NULL); - t = build_function_call_expr (register_class_fn, t); + t = build_call_expr (register_class_fn, 1, reg_class_list); append_to_statement_list (t, list_p); } @@ -2759,8 +2752,7 @@ emit_register_classes (tree *list_p) for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i) { t = build_fold_addr_expr (klass); - t = tree_cons (NULL, t, NULL); - t = build_function_call_expr (register_class_fn, t); + t = build_call_expr (register_class_fn, 1, t); append_to_statement_list (t, list_p); } } diff --git a/gcc/java/expr.c b/gcc/java/expr.c index ed5103f5988..46300efd07a 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -716,11 +716,9 @@ build_java_athrow (tree node) { tree call; - call = build3 (CALL_EXPR, - void_type_node, - build_address_of (throw_node), - build_tree_list (NULL_TREE, node), - NULL_TREE); + call = build_call_nary (void_type_node, + build_address_of (throw_node), + 1, node); TREE_SIDE_EFFECTS (call) = 1; java_add_stmt (call); java_stack_pop (stack_pointer); @@ -799,9 +797,9 @@ encode_newarray_type (tree type) static tree build_java_throw_out_of_bounds_exception (tree index) { - tree node = build3 (CALL_EXPR, int_type_node, - build_address_of (soft_badarrayindex_node), - build_tree_list (NULL_TREE, index), NULL_TREE); + tree node = build_call_nary (int_type_node, + build_address_of (soft_badarrayindex_node), + 1, index); TREE_SIDE_EFFECTS (node) = 1; /* Allows expansion within ANDIF */ return (node); } @@ -850,9 +848,9 @@ java_check_reference (tree expr, int check) expr = build3 (COND_EXPR, TREE_TYPE (expr), build2 (EQ_EXPR, boolean_type_node, expr, null_pointer_node), - build3 (CALL_EXPR, void_type_node, - build_address_of (soft_nullpointer_node), - NULL_TREE, NULL_TREE), + build_call_nary (void_type_node, + build_address_of (soft_nullpointer_node), + 0), expr); } @@ -1014,11 +1012,9 @@ build_java_arraystore_check (tree array, tree object) } /* Build an invocation of _Jv_CheckArrayStore */ - check = build3 (CALL_EXPR, void_type_node, - build_address_of (soft_checkarraystore_node), - tree_cons (NULL_TREE, array, - build_tree_list (NULL_TREE, object)), - NULL_TREE); + check = build_call_nary (void_type_node, + build_address_of (soft_checkarraystore_node), + 2, array, object); TREE_SIDE_EFFECTS (check) = 1; return check; @@ -1060,12 +1056,9 @@ build_newarray (int atype_value, tree length) some work. */ type_arg = build_class_ref (prim_type); - return build3 (CALL_EXPR, promote_type (type), - build_address_of (soft_newarray_node), - tree_cons (NULL_TREE, - type_arg, - build_tree_list (NULL_TREE, length)), - NULL_TREE); + return build_call_nary (promote_type (type), + build_address_of (soft_newarray_node), + 2, type_arg, length); } /* Generates anewarray from a given CLASS_TYPE. Gets from the stack the size @@ -1079,13 +1072,12 @@ build_anewarray (tree class_type, tree length) host_integerp (length, 0) ? tree_low_cst (length, 0) : -1); - return build3 (CALL_EXPR, promote_type (type), - build_address_of (soft_anewarray_node), - tree_cons (NULL_TREE, length, - tree_cons (NULL_TREE, build_class_ref (class_type), - build_tree_list (NULL_TREE, - null_pointer_node))), - NULL_TREE); + return build_call_nary (promote_type (type), + build_address_of (soft_anewarray_node), + 3, + length, + build_class_ref (class_type), + null_pointer_node); } /* Return a node the evaluates 'new TYPE[LENGTH]'. */ @@ -1112,14 +1104,15 @@ expand_java_multianewarray (tree class_type, int ndim) for( i = 0; i < ndim; i++ ) args = tree_cons (NULL_TREE, pop_value (int_type_node), args); - push_value (build3 (CALL_EXPR, - promote_type (class_type), - build_address_of (soft_multianewarray_node), - tree_cons (NULL_TREE, build_class_ref (class_type), - tree_cons (NULL_TREE, - build_int_cst (NULL_TREE, ndim), - args)), - NULL_TREE)); + args = tree_cons (NULL_TREE, + build_class_ref (class_type), + tree_cons (NULL_TREE, + build_int_cst (NULL_TREE, ndim), + args)); + + push_value (build_call_list (promote_type (class_type), + build_address_of (soft_multianewarray_node), + args)); } /* ARRAY[INDEX] <- RHS. build_java_check_indexed_type makes sure that @@ -1246,11 +1239,9 @@ expand_java_array_length (void) static tree build_java_monitor (tree call, tree object) { - return build3 (CALL_EXPR, - void_type_node, - build_address_of (call), - build_tree_list (NULL_TREE, object), - NULL_TREE); + return build_call_nary (void_type_node, + build_address_of (call), + 1, object); } /* Emit code for one of the PUSHC instructions. */ @@ -1347,10 +1338,9 @@ java_create_object (tree type) ? alloc_object_node : alloc_no_finalizer_node); - return build3 (CALL_EXPR, promote_type (type), - build_address_of (alloc_node), - build_tree_list (NULL_TREE, build_class_ref (type)), - NULL_TREE); + return build_call_nary (promote_type (type), + build_address_of (alloc_node), + 1, build_class_ref (type)); } static void @@ -1363,10 +1353,9 @@ expand_java_NEW (tree type) if (! CLASS_LOADED_P (type)) load_class (type, 1); safe_layout_class (type); - push_value (build3 (CALL_EXPR, promote_type (type), - build_address_of (alloc_node), - build_tree_list (NULL_TREE, build_class_ref (type)), - NULL_TREE)); + push_value (build_call_nary (promote_type (type), + build_address_of (alloc_node), + 1, build_class_ref (type))); } /* This returns an expression which will extract the class of an @@ -1445,12 +1434,9 @@ build_instanceof (tree value, tree type) } else { - expr = build3 (CALL_EXPR, itype, - build_address_of (soft_instanceof_node), - tree_cons (NULL_TREE, value, - build_tree_list (NULL_TREE, - build_class_ref (type))), - NULL_TREE); + expr = build_call_nary (itype, + build_address_of (soft_instanceof_node), + 2, value, build_class_ref (type)); } TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (value); return expr; @@ -1468,11 +1454,9 @@ static void expand_java_CHECKCAST (tree type) { tree value = pop_value (ptr_type_node); - value = build3 (CALL_EXPR, promote_type (type), - build_address_of (soft_checkcast_node), - tree_cons (NULL_TREE, build_class_ref (type), - build_tree_list (NULL_TREE, value)), - NULL_TREE); + value = build_call_nary (promote_type (type), + build_address_of (soft_checkcast_node), + 2, build_class_ref (type), value); push_value (value); } @@ -1527,12 +1511,7 @@ build_java_soft_divmod (enum tree_code op, tree type, tree op1, tree op2) } gcc_assert (call); - call = build3 (CALL_EXPR, type, - build_address_of (call), - tree_cons (NULL_TREE, arg1, - build_tree_list (NULL_TREE, arg2)), - NULL_TREE); - + call = build_call_nary (type, build_address_of (call), 2, arg1, arg2); return call; } @@ -1595,11 +1574,9 @@ build_java_binop (enum tree_code op, tree type, tree arg1, tree arg2) arg1 = convert (double_type_node, arg1); arg2 = convert (double_type_node, arg2); } - call = build3 (CALL_EXPR, double_type_node, - build_address_of (soft_fmod_node), - tree_cons (NULL_TREE, arg1, - build_tree_list (NULL_TREE, arg2)), - NULL_TREE); + call = build_call_nary (double_type_node, + build_address_of (soft_fmod_node), + 2, arg1, arg2); if (type != double_type_node) call = convert (type, call); return call; @@ -1759,10 +1736,9 @@ build_field_ref (tree self_value, tree self_class, tree name) = build3 (COND_EXPR, TREE_TYPE (field_offset), build2 (EQ_EXPR, boolean_type_node, field_offset, integer_zero_node), - build3 (CALL_EXPR, void_type_node, - build_address_of (soft_nosuchfield_node), - build_tree_list (NULL_TREE, otable_index), - NULL_TREE), + build_call_nary (void_type_node, + build_address_of (soft_nosuchfield_node), + 1, otable_index), field_offset); field_offset = fold (convert (sizetype, field_offset)); @@ -1998,10 +1974,9 @@ build_class_init (tree clas, tree expr) if (always_initialize_class_p) { - init = build3 (CALL_EXPR, void_type_node, - build_address_of (soft_initclass_node), - build_tree_list (NULL_TREE, build_class_ref (clas)), - NULL_TREE); + init = build_call_nary (void_type_node, + build_address_of (soft_initclass_node), + 1, build_class_ref (clas)); TREE_SIDE_EFFECTS (init) = 1; } else @@ -2031,10 +2006,9 @@ build_class_init (tree clas, tree expr) *init_test_decl = decl; } - init = build3 (CALL_EXPR, void_type_node, - build_address_of (soft_initclass_node), - build_tree_list (NULL_TREE, build_class_ref (clas)), - NULL_TREE); + init = build_call_nary (void_type_node, + build_address_of (soft_initclass_node), + 1, build_class_ref (clas)); TREE_SIDE_EFFECTS (init) = 1; init = build3 (COND_EXPR, void_type_node, build2 (EQ_EXPR, boolean_type_node, @@ -2084,9 +2058,8 @@ static tree rewrite_arglist_getcaller (tree arglist) { tree retaddr - = (build_function_call_expr - (built_in_decls[BUILT_IN_RETURN_ADDRESS], - build_tree_list (NULL_TREE, integer_zero_node))); + = build_call_expr (built_in_decls[BUILT_IN_RETURN_ADDRESS], + 1, integer_zero_node); DECL_INLINE (current_function_decl) = 0; @@ -2356,7 +2329,6 @@ static GTY(()) tree class_ident; tree build_invokeinterface (tree dtable, tree method) { - tree lookup_arg; tree interface; tree idx; @@ -2401,13 +2373,9 @@ build_invokeinterface (tree dtable, tree method) interface = build_class_ref (interface); } - lookup_arg = tree_cons (NULL_TREE, dtable, - tree_cons (NULL_TREE, interface, - build_tree_list (NULL_TREE, idx))); - - return build3 (CALL_EXPR, ptr_type_node, - build_address_of (soft_lookupinterfacemethod_node), - lookup_arg, NULL_TREE); + return build_call_nary (ptr_type_node, + build_address_of (soft_lookupinterfacemethod_node), + 3, dtable, interface, idx); } /* Expand one of the invoke_* opcodes. @@ -2590,8 +2558,7 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED) else func = build1 (NOP_EXPR, build_pointer_type (method_type), func); - call = build3 (CALL_EXPR, TREE_TYPE (method_type), - func, arg_list, NULL_TREE); + call = build_call_list (TREE_TYPE (method_type), func, arg_list); TREE_SIDE_EFFECTS (call) = 1; call = check_for_builtin (method, call); @@ -2616,7 +2583,8 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED) tree build_jni_stub (tree method) { - tree jnifunc, call, args, body, lookup_arg, method_sig, arg_types; + tree jnifunc, call, args, body, method_sig, arg_types; + tree jniarg0, jniarg1, jniarg2, jniarg3; tree jni_func_type, tem; tree env_var, res_var = NULL_TREE, block; tree method_args, res_type; @@ -2671,10 +2639,9 @@ build_jni_stub (tree method) /* Compute the local `env' by calling _Jv_GetJNIEnvNewFrame. */ body = build2 (MODIFY_EXPR, ptr_type_node, env_var, - build3 (CALL_EXPR, ptr_type_node, - build_address_of (soft_getjnienvnewframe_node), - build_tree_list (NULL_TREE, klass), - NULL_TREE)); + build_call_nary (ptr_type_node, + build_address_of (soft_getjnienvnewframe_node), + 1, klass)); CAN_COMPLETE_NORMALLY (body) = 1; /* All the arguments to this method become arguments to the @@ -2713,18 +2680,14 @@ build_jni_stub (tree method) /* We call _Jv_LookupJNIMethod to find the actual underlying function pointer. _Jv_LookupJNIMethod will throw the appropriate exception if this function is not found at runtime. */ - tem = build_tree_list (NULL_TREE, build_int_cst (NULL_TREE, args_size)); method_sig = build_java_signature (TREE_TYPE (method)); - lookup_arg = tree_cons (NULL_TREE, - build_utf8_ref (unmangle_classname - (IDENTIFIER_POINTER (method_sig), - IDENTIFIER_LENGTH (method_sig))), - tem); - tem = DECL_NAME (method); - lookup_arg - = tree_cons (NULL_TREE, klass, - tree_cons (NULL_TREE, build_utf8_ref (tem), lookup_arg)); - + jniarg0 = klass; + jniarg1 = build_utf8_ref (DECL_NAME (method)); + jniarg2 = build_utf8_ref (unmangle_classname + (IDENTIFIER_POINTER (method_sig), + IDENTIFIER_LENGTH (method_sig))); + jniarg3 = build_int_cst (NULL_TREE, args_size); + tem = build_function_type (TREE_TYPE (TREE_TYPE (method)), arg_types); #ifdef MODIFY_JNI_METHOD_CALL @@ -2736,16 +2699,18 @@ build_jni_stub (tree method) jnifunc = build3 (COND_EXPR, ptr_type_node, meth_var, meth_var, build2 (MODIFY_EXPR, ptr_type_node, meth_var, - build3 (CALL_EXPR, ptr_type_node, - build_address_of - (soft_lookupjnimethod_node), - lookup_arg, NULL_TREE))); + build_call_nary (ptr_type_node, + build_address_of + (soft_lookupjnimethod_node), + 4, + jniarg0, jniarg1, + jniarg2, jniarg3))); /* Now we make the actual JNI call via the resulting function pointer. */ - call = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)), - build1 (NOP_EXPR, jni_func_type, jnifunc), - args, NULL_TREE); + call = build_call_list (TREE_TYPE (TREE_TYPE (method)), + build1 (NOP_EXPR, jni_func_type, jnifunc), + args); /* If the JNI call returned a result, capture it here. If we had to unwrap JNI object results, we would do that here. */ @@ -2754,10 +2719,9 @@ build_jni_stub (tree method) /* If the call returns an object, it may return a JNI weak reference, in which case we must unwrap it. */ if (! JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_TYPE (method)))) - call = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)), - build_address_of (soft_unwrapjni_node), - build_tree_list (NULL_TREE, call), - NULL_TREE); + call = build_call_nary (TREE_TYPE (TREE_TYPE (method)), + build_address_of (soft_unwrapjni_node), + 1, call); call = build2 (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)), res_var, call); } @@ -2769,10 +2733,9 @@ build_jni_stub (tree method) TREE_SIDE_EFFECTS (body) = 1; /* Now free the environment we allocated. */ - call = build3 (CALL_EXPR, ptr_type_node, - build_address_of (soft_jnipopsystemframe_node), - build_tree_list (NULL_TREE, env_var), - NULL_TREE); + call = build_call_nary (ptr_type_node, + build_address_of (soft_jnipopsystemframe_node), + 1, env_var); TREE_SIDE_EFFECTS (call) = 1; CAN_COMPLETE_NORMALLY (call) = 1; body = build2 (COMPOUND_EXPR, void_type_node, body, call); @@ -2805,11 +2768,8 @@ build_jni_stub (tree method) && (! METHOD_PRIVATE (method) || INNER_CLASS_P (DECL_CONTEXT (method)))) { - tree init = build3 (CALL_EXPR, void_type_node, - build_address_of (soft_initclass_node), - build_tree_list (NULL_TREE, - klass), - NULL_TREE); + tree init = build_call_expr (soft_initclass_node, 1, + klass); body = build2 (COMPOUND_EXPR, void_type_node, init, body); TREE_SIDE_EFFECTS (body) = 1; } @@ -2943,11 +2903,8 @@ expand_java_field_op (int is_static, int is_putting, int field_ref_index) field_ref, new_value); if (TREE_THIS_VOLATILE (field_decl)) - java_add_stmt - (build3 - (CALL_EXPR, void_type_node, - build_address_of (built_in_decls[BUILT_IN_SYNCHRONIZE]), - NULL_TREE, NULL_TREE)); + java_add_stmt + (build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0)); java_add_stmt (modify_expr); } @@ -2965,10 +2922,7 @@ expand_java_field_op (int is_static, int is_putting, int field_ref_index) if (TREE_THIS_VOLATILE (field_decl)) java_add_stmt - (build3 - (CALL_EXPR, void_type_node, - build_address_of (built_in_decls[BUILT_IN_SYNCHRONIZE]), - NULL_TREE, NULL_TREE)); + (build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0)); push_value (temp); } @@ -3725,40 +3679,36 @@ force_evaluation_order (tree node) && TREE_CODE (TREE_OPERAND (node, 0)) == CALL_EXPR && TREE_CODE (TREE_OPERAND (node, 1)) == SAVE_EXPR)) { - tree arg, cmp; + tree call, cmp; + int i, nargs; - arg = node; - - /* Position arg properly, account for wrapped around ctors. */ + /* Account for wrapped around ctors. */ if (TREE_CODE (node) == COMPOUND_EXPR) - arg = TREE_OPERAND (node, 0); - - arg = TREE_OPERAND (arg, 1); - - /* An empty argument list is ok, just ignore it. */ - if (!arg) - return node; + call = TREE_OPERAND (node, 0); + else + call = node; - /* Not having a list of arguments here is an error. */ - gcc_assert (TREE_CODE (arg) == TREE_LIST); + nargs = call_expr_nargs (call); /* This reverses the evaluation order. This is a desired effect. */ - for (cmp = NULL_TREE; arg; arg = TREE_CHAIN (arg)) + for (i = 0, cmp = NULL_TREE; i < nargs; i++) { + tree arg = CALL_EXPR_ARG (call, i); /* Promote types smaller than integer. This is required by some ABIs. */ - tree type = TREE_TYPE (TREE_VALUE (arg)); + tree type = TREE_TYPE (arg); tree saved; if (targetm.calls.promote_prototypes (type) && INTEGRAL_TYPE_P (type) && INT_CST_LT_UNSIGNED (TYPE_SIZE (type), TYPE_SIZE (integer_type_node))) - TREE_VALUE (arg) = fold_convert (integer_type_node, TREE_VALUE (arg)); + arg = fold_convert (integer_type_node, arg); - saved = save_expr (force_evaluation_order (TREE_VALUE (arg))); + saved = save_expr (force_evaluation_order (arg)); cmp = (cmp == NULL_TREE ? saved : build2 (COMPOUND_EXPR, void_type_node, cmp, saved)); - TREE_VALUE (arg) = saved; + + CALL_EXPR_ARG (call, i) = saved; } if (cmp && TREE_CODE (cmp) == COMPOUND_EXPR) diff --git a/gcc/java/java-gimplify.c b/gcc/java/java-gimplify.c index 96e900934e3..eeda04c3363 100644 --- a/gcc/java/java-gimplify.c +++ b/gcc/java/java-gimplify.c @@ -212,10 +212,7 @@ java_gimplify_component_ref (tree *expr_p, tree *pre_p, tree *post_p) if (stat == GS_ERROR) return stat; - sync_expr - = build3 (CALL_EXPR, void_type_node, - build_address_of (built_in_decls[BUILT_IN_SYNCHRONIZE]), - NULL_TREE, NULL_TREE); + sync_expr = build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0); TREE_SIDE_EFFECTS (sync_expr) = 1; *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p), sync_expr, *expr_p); @@ -255,10 +252,8 @@ java_gimplify_modify_expr (tree *modify_expr_p, tree *pre_p, tree *post_p) */ enum gimplify_status stat; - tree sync_expr - = build3 (CALL_EXPR, void_type_node, - build_address_of (built_in_decls[BUILT_IN_SYNCHRONIZE]), - NULL_TREE, NULL_TREE); + tree sync_expr = + build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0); TREE_SIDE_EFFECTS (sync_expr) = 1; stat = gimplify_expr (&rhs, pre_p, post_p, diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 732e0cde115..4a413712fe2 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1626,20 +1626,18 @@ extern tree *type_map; #define BUILD_MONITOR_ENTER(WHERE, ARG) \ { \ - (WHERE) = build3 (CALL_EXPR, int_type_node, \ - build_address_of (soft_monitorenter_node), \ - build_tree_list (NULL_TREE, (ARG)), \ - NULL_TREE); \ + (WHERE) = build_call_nary (int_type_node, \ + build_address_of (soft_monitorenter_node), \ + 1, (ARG)); \ TREE_SIDE_EFFECTS (WHERE) = 1; \ } -#define BUILD_MONITOR_EXIT(WHERE, ARG) \ - { \ - (WHERE) = build3 (CALL_EXPR, int_type_node, \ - build_address_of (soft_monitorexit_node), \ - build_tree_list (NULL_TREE, (ARG)), \ - NULL_TREE); \ - TREE_SIDE_EFFECTS (WHERE) = 1; \ +#define BUILD_MONITOR_EXIT(WHERE, ARG) \ + { \ + (WHERE) = build_call_nary (int_type_node, \ + build_address_of (soft_monitorexit_node), \ + 1, (ARG)); \ + TREE_SIDE_EFFECTS (WHERE) = 1; \ } /* True when we can perform static class initialization optimization */ diff --git a/gcc/java/lang.c b/gcc/java/lang.c index 51459c53dd7..b1912cc1128 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -989,7 +989,7 @@ java_get_callee_fndecl (tree call_expr) if (TREE_CODE (call_expr) != CALL_EXPR) return NULL; - method = TREE_OPERAND (call_expr, 0); + method = CALL_EXPR_FN (call_expr); STRIP_NOPS (method); if (TREE_CODE (method) != ARRAY_REF) return NULL; diff --git a/gcc/java/resource.c b/gcc/java/resource.c index b0b941cc8dc..91bbdc5c30d 100644 --- a/gcc/java/resource.c +++ b/gcc/java/resource.c @@ -116,8 +116,7 @@ write_resource_constructor (tree *list_p) for (iter = nreverse (resources); iter ; iter = TREE_CHAIN (iter)) { t = build_fold_addr_expr (TREE_VALUE (iter)); - t = tree_cons (NULL, t, NULL); - t = build_function_call_expr (register_resource_fn, t); + t = build_call_expr (register_resource_fn, 1, t); append_to_statement_list (t, list_p); } } |