aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/coroutines.cc16
-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>)