aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.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/tree-cfg.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/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 9dd8961..71a828c 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -3333,22 +3333,14 @@ verify_gimple_call (gimple stmt)
return true;
}
- /* If there is a static chain argument, this should not be an indirect
- call, and the decl should have DECL_STATIC_CHAIN set. */
- if (gimple_call_chain (stmt))
+ /* If there is a static chain argument, the call should either be
+ indirect, or the decl should have DECL_STATIC_CHAIN set. */
+ if (gimple_call_chain (stmt)
+ && fndecl
+ && !DECL_STATIC_CHAIN (fndecl))
{
- if (!gimple_call_fndecl (stmt))
- {
- error ("static chain in indirect gimple call");
- return true;
- }
- fn = TREE_OPERAND (fn, 0);
-
- if (!DECL_STATIC_CHAIN (fn))
- {
- error ("static chain with function that doesn%'t use one");
- return true;
- }
+ error ("static chain with function that doesn%'t use one");
+ return true;
}
/* ??? The C frontend passes unpromoted arguments in case it