aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-11-19 05:30:59 -0800
committerRichard Henderson <rth@gcc.gnu.org>2014-11-19 05:30:59 -0800
commitf2d3d07ee55fa52b41c1ec08e51269831961a772 (patch)
tree7cca5afeed122318032b1af7171e8154c14590df /gcc/gimplify.c
parentc21df29bcfc04945d3a7be6a0c6e306fc9efc505 (diff)
downloadgcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.zip
gcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.tar.gz
gcc-f2d3d07ee55fa52b41c1ec08e51269831961a772.tar.bz2
Allow the front-end to create calls with a static chain
And, at the same time, allow indirect calls to have a static chain. We'll always eliminate the static chain if we can prove it's unused. * calls.c (prepare_call_address): Allow decl or type for first arg. (expand_call): Pass type to prepare_call_address if no decl. * gimple-fold.c (gimple_fold_call): Eliminate the static chain if the function doesn't use it; fold it otherwise. * gimplify.c (gimplify_call_expr): Gimplify the static chain. * tree-cfg.c (verify_gimple_call): Allow a static chain on indirect function calls. From-SVN: r217770
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 93c06de..c46fb66 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -2432,7 +2432,7 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
}
}
- /* Finally, gimplify the function arguments. */
+ /* Gimplify the function arguments. */
if (nargs > 0)
{
for (i = (PUSH_ARGS_REVERSED ? nargs - 1 : 0);
@@ -2454,6 +2454,21 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
}
}
+ /* Gimplify the static chain. */
+ if (CALL_EXPR_STATIC_CHAIN (*expr_p))
+ {
+ if (fndecl && !DECL_STATIC_CHAIN (fndecl))
+ CALL_EXPR_STATIC_CHAIN (*expr_p) = NULL;
+ else
+ {
+ enum gimplify_status t;
+ t = gimplify_arg (&CALL_EXPR_STATIC_CHAIN (*expr_p), pre_p,
+ EXPR_LOCATION (*expr_p));
+ if (t == GS_ERROR)
+ ret = GS_ERROR;
+ }
+ }
+
/* Verify the function result. */
if (want_value && fndecl
&& VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fnptrtype))))