diff options
-rw-r--r-- | gcc/cp/coroutines.cc | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/symmetric-transfer-00-basic.C (renamed from gcc/testsuite/g++.dg/coroutines/torture/symmetric-transfer-00-basic.C) | 13 |
2 files changed, 8 insertions, 21 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index e4ba642..0a8e752 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -2377,21 +2377,9 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody, (loc, builtin_decl_explicit (BUILT_IN_CORO_RESUME), 1, addr); /* In order to support an arbitrary number of coroutine continuations, - we must tail call them. However, some targets might not support this - for indirect calls, or calls between DSOs. - FIXME: see if there's an alternate strategy for such targets. */ - /* Now we have the actual call, and we can mark it as a tail. */ + we must tail call them. However, some targets do not support indirect + tail calls to arbitrary callees. See PR94359. */ CALL_EXPR_TAILCALL (resume) = true; - /* Temporarily, switch cfun so that we can use the target hook. */ - push_struct_function (actor); - if (targetm.function_ok_for_sibcall (NULL_TREE, resume)) - { - /* ... and for optimisation levels 0..1, which do not normally tail- - -call, mark it as requiring a tail-call for correctness. */ - if (optimize < 2) - CALL_EXPR_MUST_TAIL_CALL (resume) = true; - } - pop_cfun (); resume = coro_build_cvt_void_expr_stmt (resume, loc); add_stmt (resume); diff --git a/gcc/testsuite/g++.dg/coroutines/torture/symmetric-transfer-00-basic.C b/gcc/testsuite/g++.dg/coroutines/symmetric-transfer-00-basic.C index 6f379c8..b78ae20d 100644 --- a/gcc/testsuite/g++.dg/coroutines/torture/symmetric-transfer-00-basic.C +++ b/gcc/testsuite/g++.dg/coroutines/symmetric-transfer-00-basic.C @@ -1,10 +1,9 @@ -// { dg-do run } -// See PR94359 - some targets are unable to make general indirect tailcalls -// for example, between different DSOs. -// { dg-xfail-run-if "" { hppa*-*-hpux11* } } -// { dg-xfail-run-if "" { ia64-*-linux-gnu } } -// { dg-xfail-run-if "" { { lp64 && { powerpc*-linux-gnu } } || { *-*-aix* } } } -// { dg-xfail-run-if "" { sparc*-*-* } } +// See PR94359, we will need either a general solution to this, or at least +// some hook for targets to opt in, for now the test will work on targets that +// can do the tailcall (which would normally be available for O2+) + +// { dg-do run { target { i?86-*-linux-gnu x86_64-*-linux-gnu *-*-darwin* } } } +// { dg-additional-options "-O2" } #if __has_include(<coroutine>) |