This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: [PATCH] remove build_call_list from Ada/Java/middle-end
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Nathan Froyd <froydnj at codesourcery dot com>
- Cc: gcc-patches at gcc dot gnu dot org, java-patches at gcc dot gnu dot org
- Date: Mon, 17 May 2010 11:49:26 +0200
- Subject: Re: [PATCH] remove build_call_list from Ada/Java/middle-end
- References: <20100517004003.GM5834@codesourcery.com>
On Mon, May 17, 2010 at 2:40 AM, Nathan Froyd <froydnj@codesourcery.com> wrote:
> The patch below removes all calls to build_call_list from the Ada and
> Java front-ends. ?Since those are the last remaining uses of
> build_call_list, build_call_list can be removed from the compiler
> entirely. ?One less obstacle to removing TREE_LIST...
>
> Regtested on x86_64-unknown-linux-gnu. ?OK to commit?
The middle-end parts are ok.
Thanks,
Richard.
> -Nathan
>
> gcc/
> ? ? ? ?* tree.h (build_call_list): Remove.
> ? ? ? ?* tree.c (build_call_list): Remove.
>
> gcc/ada/
> ? ? ? ?* gcc-interface/trans.c (call_to_gnu): Use build_call_vec instead of
> ? ? ? ?build_call_list.
> ? ? ? ?* gcc-interface/utils.c (build_function_stub): Likewise.
>
> gcc/java/
> ? ? ? ?* expr.c (expand_java_multianewarray): Use build_call_vec instead of
> ? ? ? ?build_call_list.
> ? ? ? ?(pop_arguments): Return a VEC instead of a tree. ?Take a method type
> ? ? ? ?rather than a list of argument types.
> ? ? ? ?(rewrite_rule): Change signature. of rewrite_arglist member.
> ? ? ? ?(rewrite_arglist_getcaller): Update signature.
> ? ? ? ?(rewrite_arglist_getclass): Likewise.
> ? ? ? ?(maybe_rewrite_invocation): Update for rewrite_arglist change.
> ? ? ? ?(build_known_method_ref): Take a VEC instead of a tree.
> ? ? ? ?(invoke_build_dtable): Likewise.
> ? ? ? ?(expand_invoke): Update calls to pop_arguments. ?Use build_call_vec
> ? ? ? ?instead of build_call_list.
> ? ? ? ?(build_jni_stub): Use build_call_vec instead of build_call_list.
> ? ? ? ?* java-tree.h (maybe_rewrite_invocation): Update declaration.
> ? ? ? ?(build_known_method_ref): Likewise.
> ? ? ? ?(invoke_build_dtable): Likewise.
>
> gcc/cp/
> ? ? ? ?* tree.c (build_min_non_dep_call_vec): Update comment.
>
> diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
> index c6bad43..22772b9 100644
> --- a/gcc/ada/gcc-interface/trans.c
> +++ b/gcc/ada/gcc-interface/trans.c
> @@ -2619,7 +2619,7 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
> ? tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_subprog);
> ? Entity_Id gnat_formal;
> ? Node_Id gnat_actual;
> - ?tree gnu_actual_list = NULL_TREE;
> + ?VEC(tree,gc) *gnu_actual_vec = NULL;
> ? tree gnu_name_list = NULL_TREE;
> ? tree gnu_before_list = NULL_TREE;
> ? tree gnu_after_list = NULL_TREE;
> @@ -2969,11 +2969,11 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
> ? ? ? ? ? ?gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
> ? ? ? ?}
>
> - ? ? ?gnu_actual_list = tree_cons (NULL_TREE, gnu_actual, gnu_actual_list);
> + ? ? ?VEC_safe_push (tree, gc, gnu_actual_vec, gnu_actual);
> ? ? }
>
> - ?gnu_call = build_call_list (TREE_TYPE (gnu_subprog_type), gnu_subprog_addr,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? nreverse (gnu_actual_list));
> + ?gnu_call = build_call_vec (TREE_TYPE (gnu_subprog_type), gnu_subprog_addr,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? gnu_actual_vec);
> ? set_expr_location_from_node (gnu_call, gnat_node);
>
> ? /* If it's a function call, the result is the call expression unless a target
> diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
> index 4b11923..4e91542 100644
> --- a/gcc/ada/gcc-interface/utils.c
> +++ b/gcc/ada/gcc-interface/utils.c
> @@ -3245,12 +3245,12 @@ void
> ?build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
> ?{
> ? tree gnu_subprog_type, gnu_subprog_addr, gnu_subprog_call;
> - ?tree gnu_stub_param, gnu_param_list, gnu_arg_types, gnu_param;
> + ?tree gnu_stub_param, gnu_arg_types, gnu_param;
> ? tree gnu_stub_decl = DECL_FUNCTION_STUB (gnu_subprog);
> ? tree gnu_body;
> + ?VEC(tree,gc) *gnu_param_vec = NULL;
>
> ? gnu_subprog_type = TREE_TYPE (gnu_subprog);
> - ?gnu_param_list = NULL_TREE;
>
> ? begin_subprog_body (gnu_stub_decl);
> ? gnat_pushlevel ();
> @@ -3274,7 +3274,7 @@ build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
> ? ? ? else
> ? ? ? ?gnu_param = gnu_stub_param;
>
> - ? ? ?gnu_param_list = tree_cons (NULL_TREE, gnu_param, gnu_param_list);
> + ? ? ?VEC_safe_push (tree, gc, gnu_param_vec, gnu_param);
> ? ? }
>
> ? gnu_body = end_stmt_group ();
> @@ -3282,9 +3282,8 @@ build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
> ? /* Invoke the internal subprogram. ?*/
> ? gnu_subprog_addr = build1 (ADDR_EXPR, build_pointer_type (gnu_subprog_type),
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? gnu_subprog);
> - ?gnu_subprog_call = build_call_list (TREE_TYPE (gnu_subprog_type),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gnu_subprog_addr,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nreverse (gnu_param_list));
> + ?gnu_subprog_call = build_call_vec (TREE_TYPE (gnu_subprog_type),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gnu_subprog_addr, gnu_param_vec);
>
> ? /* Propagate the return value, if any. ?*/
> ? if (VOID_TYPE_P (TREE_TYPE (gnu_subprog_type)))
> diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
> index 67bbd60..bfe65b8 100644
> --- a/gcc/cp/tree.c
> +++ b/gcc/cp/tree.c
> @@ -1905,9 +1905,9 @@ build_min_non_dep (enum tree_code code, tree non_dep, ...)
> ? return t;
> ?}
>
> -/* Similar to `build_call_list', but for template definitions of non-dependent
> - ? expressions. NON_DEP is the non-dependent expression that has been
> - ? built. ?*/
> +/* Similar to `build_nt_call_vec', but for template definitions of
> + ? non-dependent expressions. NON_DEP is the non-dependent expression
> + ? that has been built. ?*/
>
> ?tree
> ?build_min_non_dep_call_vec (tree non_dep, tree fn, VEC(tree,gc) *argvec)
> diff --git a/gcc/java/expr.c b/gcc/java/expr.c
> index a6a3f39..5eacd64 100644
> --- a/gcc/java/expr.c
> +++ b/gcc/java/expr.c
> @@ -75,7 +75,7 @@ static void expand_cond (enum tree_code, tree, int);
> ?static void expand_java_goto (int);
> ?static tree expand_java_switch (tree, int);
> ?static void expand_java_add_case (tree, int, int);
> -static tree pop_arguments (tree);
> +static VEC(tree,gc) *pop_arguments (tree);
> ?static void expand_invoke (int, int, int);
> ?static void expand_java_field_op (int, int, int);
> ?static void java_push_constant_from_pool (struct JCF *, int);
> @@ -1128,20 +1128,21 @@ static void
> ?expand_java_multianewarray (tree class_type, int ndim)
> ?{
> ? int i;
> - ?tree args = build_tree_list( NULL_TREE, null_pointer_node );
> + ?VEC(tree,gc) *args = NULL;
>
> - ?for( i = 0; i < ndim; i++ )
> - ? ?args = tree_cons (NULL_TREE, pop_value (int_type_node), args);
> + ?VEC_safe_grow (tree, gc, args, 3 + ndim);
>
> - ?args = tree_cons (NULL_TREE,
> - ? ? ? ? ? ? ? ? ? build_class_ref (class_type),
> - ? ? ? ? ? ? ? ? ? tree_cons (NULL_TREE,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?build_int_cst (NULL_TREE, ndim),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?args));
> + ?VEC_replace (tree, args, 0, build_class_ref (class_type));
> + ?VEC_replace (tree, args, 1, build_int_cst (NULL_TREE, ndim));
>
> - ?push_value (build_call_list (promote_type (class_type),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?build_address_of (soft_multianewarray_node),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?args));
> + ?for(i = ndim - 1; i >= 0; i-- )
> + ? ?VEC_replace (tree, args, (unsigned)(2 + i), pop_value (int_type_node));
> +
> + ?VEC_replace (tree, args, 2 + ndim, null_pointer_node);
> +
> + ?push_value (build_call_vec (promote_type (class_type),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?build_address_of (soft_multianewarray_node),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?args));
> ?}
>
> ?/* ?ARRAY[INDEX] <- RHS. build_java_check_indexed_type makes sure that
> @@ -1931,16 +1932,28 @@ expand_java_add_case (tree switch_expr, int match, int target_pc)
> ? append_to_statement_list (x, &SWITCH_BODY (switch_expr));
> ?}
>
> -static tree
> -pop_arguments (tree arg_types)
> +static VEC(tree,gc) *
> +pop_arguments (tree method_type)
> ?{
> - ?if (arg_types == end_params_node)
> - ? ?return NULL_TREE;
> - ?if (TREE_CODE (arg_types) == TREE_LIST)
> + ?function_args_iterator fnai;
> + ?tree type;
> + ?VEC(tree,gc) *args = NULL;
> + ?int arity;
> +
> + ?FOREACH_FUNCTION_ARGS (method_type, type, fnai)
> + ? ?{
> + ? ? ?/* XXX: leaky abstraction. ?*/
> + ? ? ?if (type == void_type_node)
> + ? ? ? ?break;
> +
> + ? ? ?VEC_safe_push (tree, gc, args, type);
> + ? ?}
> +
> + ?arity = VEC_length (tree, typestack);
> +
> + ?while (arity--)
> ? ? {
> - ? ? ?tree tail = pop_arguments (TREE_CHAIN (arg_types));
> - ? ? ?tree type = TREE_VALUE (arg_types);
> - ? ? ?tree arg = pop_value (type);
> + ? ? ?tree arg = pop_value (VEC_index (tree, args, arity));
>
> ? ? ? /* We simply cast each argument to its proper type. ?This is
> ? ? ? ? needed since we lose type information coming out of the
> @@ -1952,9 +1965,11 @@ pop_arguments (tree arg_types)
> ? ? ? ? ? ? ? && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
> ? ? ? ? ? ? ? && INTEGRAL_TYPE_P (type))
> ? ? ? ?arg = convert (integer_type_node, arg);
> - ? ? ?return tree_cons (NULL_TREE, arg, tail);
> +
> + ? ? ?VEC_replace (tree, args, arity, arg);
> ? ? }
> - ?gcc_unreachable ();
> +
> + ?return args;
> ?}
>
> ?/* Attach to PTR (a block) the declaration found in ENTRY. */
> @@ -2079,34 +2094,30 @@ typedef struct
> ? const char *new_classname;
> ? const char *new_signature;
> ? int flags;
> - ?tree (*rewrite_arglist) (tree arglist);
> + ?void (*rewrite_arglist) (VEC(tree,gc) **);
> ?} rewrite_rule;
>
> ?/* Add __builtin_return_address(0) to the end of an arglist. ?*/
>
>
> -static tree
> -rewrite_arglist_getcaller (tree arglist)
> +static void
> +rewrite_arglist_getcaller (VEC(tree,gc) **arglist)
> ?{
> ? tree retaddr
> ? ? = build_call_expr (built_in_decls[BUILT_IN_RETURN_ADDRESS],
> ? ? ? ? ? ? ? ? ? ? ? 1, integer_zero_node);
>
> ? DECL_UNINLINABLE (current_function_decl) = 1;
> -
> - ?return chainon (arglist,
> - ? ? ? ? ? ? ? ? tree_cons (NULL_TREE, retaddr,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL_TREE));
> +
> + ?VEC_safe_push (tree, gc, *arglist, retaddr);
> ?}
>
> ?/* Add this.class to the end of an arglist. ?*/
>
> -static tree
> -rewrite_arglist_getclass (tree arglist)
> +static void
> +rewrite_arglist_getclass (VEC(tree,gc) **arglist)
> ?{
> - ?return chainon (arglist,
> - ? ? ? ? ? ? ? ? tree_cons (NULL_TREE, build_class_ref (output_class),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL_TREE));
> + ?VEC_safe_push (tree, gc, *arglist, build_class_ref (output_class));
> ?}
>
> ?static rewrite_rule rules[] =
> @@ -2157,7 +2168,7 @@ special_method_p (tree candidate_method)
> ? ?method, update SPECIAL.*/
>
> ?void
> -maybe_rewrite_invocation (tree *method_p, tree *arg_list_p,
> +maybe_rewrite_invocation (tree *method_p, VEC(tree,gc) **arg_list_p,
> ? ? ? ? ? ? ? ? ? ? ? ? ?tree *method_signature_p, tree *special)
> ?{
> ? tree context = DECL_NAME (TYPE_NAME (DECL_CONTEXT (*method_p)));
> @@ -2190,7 +2201,7 @@ maybe_rewrite_invocation (tree *method_p, tree *arg_list_p,
> ? ? ? ? ? ? ?*method_p = maybe_method;
> ? ? ? ? ? ? ?gcc_assert (*method_p);
> ? ? ? ? ? ? ?if (p->rewrite_arglist)
> - ? ? ? ? ? ? ? *arg_list_p = p->rewrite_arglist (*arg_list_p);
> + ? ? ? ? ? ? ? p->rewrite_arglist (arg_list_p);
> ? ? ? ? ? ? ?*method_signature_p = get_identifier (p->new_signature);
> ? ? ? ? ? ? ?*special = integer_one_node;
>
> @@ -2205,7 +2216,7 @@ maybe_rewrite_invocation (tree *method_p, tree *arg_list_p,
> ?tree
> ?build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
> ? ? ? ? ? ? ? ? ? ? ? ?tree self_type, tree method_signature ATTRIBUTE_UNUSED,
> - ? ? ? ? ? ? ? ? ? ? ? tree arg_list ATTRIBUTE_UNUSED, tree special)
> + ? ? ? ? ? ? ? ? ? ? ? VEC(tree,gc) *arg_list ATTRIBUTE_UNUSED, tree special)
> ?{
> ? tree func;
> ? if (is_compiled_class (self_type))
> @@ -2282,18 +2293,19 @@ build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
> ?}
>
> ?tree
> -invoke_build_dtable (int is_invoke_interface, tree arg_list)
> +invoke_build_dtable (int is_invoke_interface, VEC(tree,gc) *arg_list)
> ?{
> ? tree dtable, objectref;
> + ?tree saved = save_expr (VEC_index (tree, arg_list, 0));
>
> - ?TREE_VALUE (arg_list) = save_expr (TREE_VALUE (arg_list));
> + ?VEC_replace (tree, arg_list, 0, saved);
>
> ? /* If we're dealing with interfaces and if the objectref
> ? ? ?argument is an array then get the dispatch table of the class
> ? ? ?Object rather than the one from the objectref. ?*/
> ? objectref = (is_invoke_interface
> - ? ? ? ? ? ? ?&& is_array_type_p (TREE_TYPE (TREE_VALUE (arg_list)))
> - ? ? ? ? ? ? ?? build_class_ref (object_type_node) : TREE_VALUE (arg_list));
> + ? ? ? ? ? ? ?&& is_array_type_p (TREE_TYPE (saved))
> + ? ? ? ? ? ? ?? build_class_ref (object_type_node) : saved);
>
> ? if (dtable_ident == NULL_TREE)
> ? ? dtable_ident = get_identifier ("vtable");
> @@ -2461,7 +2473,8 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
> ? ? ? ? ? ? ? ? ? ? ? ? ? method_ref_index));
> ? const char *const self_name
> ? ? = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (self_type)));
> - ?tree call, func, method, arg_list, method_type;
> + ?tree call, func, method, method_type;
> + ?VEC(tree,gc) *arg_list;
> ? tree check = NULL_TREE;
>
> ? tree special = NULL_TREE;
> @@ -2568,7 +2581,7 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
> ? ? ? ? just pop the arguments, push a properly-typed zero, and
> ? ? ? ? continue. ?*/
> ? ? ? method_type = get_type_from_signature (method_signature);
> - ? ? ?pop_arguments (TYPE_ARG_TYPES (method_type));
> + ? ? ?pop_arguments (method_type);
> ? ? ? if (opcode != OPCODE_invokestatic)
> ? ? ? ?pop_type (self_type);
> ? ? ? method_type = promote_type (TREE_TYPE (method_type));
> @@ -2577,7 +2590,7 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
> ? ? }
>
> ? method_type = TREE_TYPE (method);
> - ?arg_list = pop_arguments (TYPE_ARG_TYPES (method_type));
> + ?arg_list = pop_arguments (method_type);
> ? flush_quick_stack ();
>
> ? maybe_rewrite_invocation (&method, &arg_list, &method_signature,
> @@ -2602,8 +2615,8 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
> ? ? ? ? We do omit the check if we're calling <init>. ?*/
> ? ? ? /* We use a SAVE_EXPR here to make sure we only evaluate
> ? ? ? ? the new `self' expression once. ?*/
> - ? ? ?tree save_arg = save_expr (TREE_VALUE (arg_list));
> - ? ? ?TREE_VALUE (arg_list) = save_arg;
> + ? ? ?tree save_arg = save_expr (VEC_index (tree, arg_list, 0));
> + ? ? ?VEC_replace (tree, arg_list, 0, save_arg);
> ? ? ? check = java_check_reference (save_arg, ! DECL_INIT_P (method));
> ? ? ? func = build_known_method_ref (method, method_type, self_type,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? method_signature, arg_list, special);
> @@ -2623,7 +2636,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 = build_call_list (TREE_TYPE (method_type), func, arg_list);
> + ?call = build_call_vec (TREE_TYPE (method_type), func, arg_list);
> ? TREE_SIDE_EFFECTS (call) = 1;
> ? call = check_for_builtin (method, call);
>
> @@ -2648,14 +2661,14 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
> ?tree
> ?build_jni_stub (tree method)
> ?{
> - ?tree jnifunc, call, args, body, method_sig, arg_types;
> + ?tree jnifunc, call, 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;
> ? tree meth_var;
> ? tree bind;
> -
> + ?VEC(tree,gc) *args = NULL;
> ? int args_size = 0;
>
> ? tree klass = DECL_CONTEXT (method);
> @@ -2689,10 +2702,22 @@ build_jni_stub (tree method)
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?build_address_of (soft_getjnienvnewframe_node),
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1, klass));
>
> + ?/* The JNIEnv structure is the first argument to the JNI function. ?*/
> + ?args_size += int_size_in_bytes (TREE_TYPE (env_var));
> + ?VEC_safe_push (tree, gc, args, env_var);
> +
> + ?/* For a static method the second argument is the class. ?For a
> + ? ? non-static method the second argument is `this'; that is already
> + ? ? available in the argument list. ?*/
> + ?if (METHOD_STATIC (method))
> + ? ?{
> + ? ? ?args_size += int_size_in_bytes (TREE_TYPE (klass));
> + ? ? ?VEC_safe_push (tree, gc, args, klass);
> + ? ?}
> +
> ? /* All the arguments to this method become arguments to the
> ? ? ?underlying JNI function. ?If we had to wrap object arguments in a
> ? ? ?special way, we would do that here. ?*/
> - ?args = NULL_TREE;
> ? for (tem = method_args; tem != NULL_TREE; tem = TREE_CHAIN (tem))
> ? ? {
> ? ? ? int arg_bits = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tem)));
> @@ -2702,24 +2727,14 @@ build_jni_stub (tree method)
> ?#endif
> ? ? ? args_size += (arg_bits / BITS_PER_UNIT);
>
> - ? ? ?args = tree_cons (NULL_TREE, tem, args);
> + ? ? ?VEC_safe_push (tree, gc, args, tem);
> ? ? }
> - ?args = nreverse (args);
> ? arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
>
> - ?/* For a static method the second argument is the class. ?For a
> - ? ? non-static method the second argument is `this'; that is already
> - ? ? available in the argument list. ?*/
> + ?/* Argument types for static methods and the JNIEnv structure.
> + ? ? FIXME: Write and use build_function_type_vec to avoid this. ?*/
> ? if (METHOD_STATIC (method))
> - ? ?{
> - ? ? ?args_size += int_size_in_bytes (TREE_TYPE (klass));
> - ? ? ?args = tree_cons (NULL_TREE, klass, args);
> - ? ? ?arg_types = tree_cons (NULL_TREE, object_ptr_type_node, arg_types);
> - ? ?}
> -
> - ?/* The JNIEnv structure is the first argument to the JNI function. ?*/
> - ?args_size += int_size_in_bytes (TREE_TYPE (env_var));
> - ?args = tree_cons (NULL_TREE, env_var, args);
> + ? ?arg_types = tree_cons (NULL_TREE, object_ptr_type_node, arg_types);
> ? arg_types = tree_cons (NULL_TREE, ptr_type_node, arg_types);
>
> ? /* We call _Jv_LookupJNIMethod to find the actual underlying
> @@ -2774,8 +2789,7 @@ build_jni_stub (tree method)
>
> ? /* Now we make the actual JNI call via the resulting function
> ? ? ?pointer. ? ?*/
> - ?call = build_call_list (TREE_TYPE (TREE_TYPE (method)),
> - ? ? ? ? ? ? ? ? ? ? ? ? jnifunc, args);
> + ?call = build_call_vec (TREE_TYPE (TREE_TYPE (method)), 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. ?*/
> diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
> index 8ffe242..26e6268 100644
> --- a/gcc/java/java-tree.h
> +++ b/gcc/java/java-tree.h
> @@ -1067,14 +1067,14 @@ extern void initialize_builtins (void);
>
> ?extern tree lookup_name (tree);
> ?extern bool special_method_p (tree);
> -extern void maybe_rewrite_invocation (tree *, tree *, tree *, tree *);
> -extern tree build_known_method_ref (tree, tree, tree, tree, tree, tree);
> +extern void maybe_rewrite_invocation (tree *, VEC(tree,gc) **, tree *, tree *);
> +extern tree build_known_method_ref (tree, tree, tree, tree, VEC(tree,gc) *, tree);
> ?extern tree build_class_init (tree, tree);
> ?extern int attach_init_test_initialization_flags (void **, void *);
> ?extern tree build_invokevirtual (tree, tree, tree);
> ?extern tree build_invokeinterface (tree, tree);
> ?extern tree build_jni_stub (tree);
> -extern tree invoke_build_dtable (int, tree);
> +extern tree invoke_build_dtable (int, VEC(tree,gc) *);
> ?extern tree build_field_ref (tree, tree, tree);
> ?extern tree java_modify_addr_for_volatile (tree);
> ?extern void pushdecl_force_head (tree);
> diff --git a/gcc/tree.c b/gcc/tree.c
> index c45e807..a7e483e 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -9501,27 +9501,6 @@ build_vl_exp_stat (enum tree_code code, int len MEM_STAT_DECL)
> ? return t;
> ?}
>
> -
> -/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE
> - ? and FN and a null static chain slot. ?ARGLIST is a TREE_LIST of the
> - ? arguments. ?*/
> -
> -tree
> -build_call_list (tree return_type, tree fn, tree arglist)
> -{
> - ?tree t;
> - ?int i;
> -
> - ?t = build_vl_exp (CALL_EXPR, list_length (arglist) + 3);
> - ?TREE_TYPE (t) = return_type;
> - ?CALL_EXPR_FN (t) = fn;
> - ?CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
> - ?for (i = 0; arglist; arglist = TREE_CHAIN (arglist), i++)
> - ? ?CALL_EXPR_ARG (t, i) = TREE_VALUE (arglist);
> - ?process_call_operands (t);
> - ?return t;
> -}
> -
> ?/* Build a CALL_EXPR of class tcc_vl_exp with the indicated RETURN_TYPE and
> ? ?FN and a null static chain slot. ?NARGS is the number of call arguments
> ? ?which are specified as "..." arguments. ?*/
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 7eed68f..253e6ef 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -4040,7 +4040,6 @@ extern tree build_omp_clause (location_t, enum omp_clause_code);
> ?extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL);
> ?#define build_vl_exp(c,n) build_vl_exp_stat (c,n MEM_STAT_INFO)
>
> -extern tree build_call_list (tree, tree, tree);
> ?extern tree build_call_nary (tree, tree, int, ...);
> ?extern tree build_call_valist (tree, tree, int, va_list);
> ?#define build_call_array(T1,T2,N,T3)\
>