diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-19 13:30:59 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-19 13:30:59 +0000 |
commit | 156cc902a8276c9aa89fb472320a55260c0225da (patch) | |
tree | 7cca5afeed122318032b1af7171e8154c14590df /gcc/gimplify.c | |
parent | 8d54d6a02be288addf25cba1c3e053de6c019de3 (diff) | |
download | gcc-156cc902a8276c9aa89fb472320a55260c0225da.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217770 138bc75d-0d04-0410-961f-82ee72b054a4
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 93c06debda5..c46fb663ef1 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)))) |