diff options
author | Richard Henderson <rth@redhat.com> | 2014-11-19 05:30:59 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2014-11-19 05:30:59 -0800 |
commit | f2d3d07ee55fa52b41c1ec08e51269831961a772 (patch) | |
tree | 7cca5afeed122318032b1af7171e8154c14590df /gcc/gimplify.c | |
parent | c21df29bcfc04945d3a7be6a0c6e306fc9efc505 (diff) | |
download | gcc-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.c | 17 |
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)))) |