Patchwork refactor common bits of building CALL_EXPRs

login
register
mail settings
Submitter Nathan Froyd
Date March 22, 2011, 12:32 p.m.
Message ID <20110322123223.GB6010@nightcrawler>
Download mbox | patch
Permalink /patch/87909/
State New
Headers show

Comments

Nathan Froyd - March 22, 2011, 12:32 p.m.
The knowledge that building a CALL_EXPR requires three additional
arguments is scattered about tree.c; the patch below centralizes that
knowledge in a common function, build_call_1.  This function can also
take care of setting up the non-argument fields of CALL_EXPRs.

Tested on x86_64-unknown-linux-gnu.  OK to commit?

-Nathan

	* tree.c (build_call_1): New function.
	(build_call_valist, build_call_array_loc, build_call_vec): Call it.
Diego Novillo - March 22, 2011, 12:48 p.m.
On Tue, Mar 22, 2011 at 08:32, Nathan Froyd <froydnj@codesourcery.com> wrote:
> The knowledge that building a CALL_EXPR requires three additional
> arguments is scattered about tree.c; the patch below centralizes that
> knowledge in a common function, build_call_1.  This function can also
> take care of setting up the non-argument fields of CALL_EXPRs.
>
> Tested on x86_64-unknown-linux-gnu.  OK to commit?
>
> -Nathan
>
>        * tree.c (build_call_1): New function.
>        (build_call_valist, build_call_array_loc, build_call_vec): Call it.

OK.


Diego.

Patch

Index: gcc/tree.c
===================================================================
--- gcc/tree.c	(revision 171278)
+++ gcc/tree.c	(working copy)
@@ -9694,6 +9694,23 @@  build_vl_exp_stat (enum tree_code code, 
   return t;
 }
 
+/* Helper function for build_call_* functions; build a CALL_EXPR with
+   indicated RETURN_TYPE, FN, and NARGS, but do not initialize any of
+   the argument slots.  */
+
+static tree
+build_call_1 (tree return_type, tree fn, int nargs)
+{
+  tree t;
+
+  t = build_vl_exp (CALL_EXPR, nargs + 3);
+  TREE_TYPE (t) = return_type;
+  CALL_EXPR_FN (t) = fn;
+  CALL_EXPR_STATIC_CHAIN (t) = NULL;
+
+  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.  */
@@ -9719,10 +9736,7 @@  build_call_valist (tree return_type, tre
   tree t;
   int i;
 
-  t = build_vl_exp (CALL_EXPR, nargs + 3);
-  TREE_TYPE (t) = return_type;
-  CALL_EXPR_FN (t) = fn;
-  CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
+  t = build_call_1 (return_type, fn, nargs);
   for (i = 0; i < nargs; i++)
     CALL_EXPR_ARG (t, i) = va_arg (args, tree);
   process_call_operands (t);
@@ -9740,10 +9754,7 @@  build_call_array_loc (location_t loc, tr
   tree t;
   int i;
 
-  t = build_vl_exp (CALL_EXPR, nargs + 3);
-  TREE_TYPE (t) = return_type;
-  CALL_EXPR_FN (t) = fn;
-  CALL_EXPR_STATIC_CHAIN (t) = NULL_TREE;
+  t = build_call_1 (return_type, fn, nargs);
   for (i = 0; i < nargs; i++)
     CALL_EXPR_ARG (t, i) = args[i];
   process_call_operands (t);
@@ -9759,10 +9770,7 @@  build_call_vec (tree return_type, tree f
   tree ret, t;
   unsigned int ix;
 
-  ret = build_vl_exp (CALL_EXPR, VEC_length (tree, args) + 3);
-  TREE_TYPE (ret) = return_type;
-  CALL_EXPR_FN (ret) = fn;
-  CALL_EXPR_STATIC_CHAIN (ret) = NULL_TREE;
+  ret = build_call_1 (return_type, fn, VEC_length (tree, args));
   FOR_EACH_VEC_ELT (tree, args, ix, t)
     CALL_EXPR_ARG (ret, ix) = t;
   process_call_operands (ret);