[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] coroutines: Bind label_decl of original function to actor function

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 10:43:20 GMT 2020


https://gcc.gnu.org/g:c3ccce5b47f85d70127f5bb894bc5e83f8d2510e

commit c3ccce5b47f85d70127f5bb894bc5e83f8d2510e
Author: JunMa <JunMa@linux.alibaba.com>
Date:   Mon Jan 20 17:46:32 2020 +0800

    coroutines: Bind label_decl of original function to actor function
    
    gcc/cp
        * coroutines.cc (transform_await_wrapper): Set actor funcion as
        new context of label_decl.
        (build_actor_fn): Fill new field of await_xform_data.
    
    gcc/testsuite
        * g++.dg/coroutines/co-await-04-control-flow.C: Add label.

Diff:
---
 gcc/cp/ChangeLog                                              |  6 ++++++
 gcc/cp/coroutines.cc                                          | 11 ++++++++---
 gcc/testsuite/ChangeLog                                       |  4 ++++
 .../g++.dg/coroutines/torture/co-await-04-control-flow.C      |  2 ++
 4 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ed1c64f18fb..4e2b0c5e4e3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-03  Jun Ma <JunMa@linux.alibaba.com>
+
+	* coroutines.cc (transform_await_wrapper): Set actor funcion as
+	new context of label_decl.
+	(build_actor_fn): Fill new field of await_xform_data.
+
 2020-02-02  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/93530 - ICE on invalid alignas in a template.
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f7f85cb7643..62d92d9fc98 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -1580,6 +1580,7 @@ static hash_map<tree, suspend_point_info> *suspend_points;
 
 struct await_xform_data
 {
+  tree actor_fn;   /* Decl for context.  */
   tree actor_frame;
   tree promise_proxy;
   tree real_promise;
@@ -1660,12 +1661,16 @@ transform_await_expr (tree await_expr, await_xform_data *xform)
 static tree
 transform_await_wrapper (tree *stmt, int *do_subtree, void *d)
 {
+  /* Set actor function as new DECL_CONTEXT of label_decl.  */
+  struct await_xform_data *xform = (struct await_xform_data *) d;
+  if (TREE_CODE (*stmt) == LABEL_DECL
+      && DECL_CONTEXT (*stmt) != xform->actor_fn)
+    DECL_CONTEXT (*stmt) = xform->actor_fn;
+
   if (TREE_CODE (*stmt) != CO_AWAIT_EXPR && TREE_CODE (*stmt) != CO_YIELD_EXPR)
     return NULL_TREE;
 
   tree await_expr = *stmt;
-  await_xform_data *xform = (await_xform_data *) d;
-
   *stmt = transform_await_expr (await_expr, xform);
   if (*stmt == error_mark_node)
     *do_subtree = 0;
@@ -2018,7 +2023,7 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody,
      decide where to put things.  */
 
   await_xform_data xform
-    = {actor_frame, promise_proxy, ap, self_h_proxy, ash};
+    = {actor, actor_frame, promise_proxy, ap, self_h_proxy, ash};
 
   /* Get a reference to the initial suspend var in the frame.  */
   transform_await_expr (initial_await, &xform);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 74cbead32fb..5471778da0b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2020-02-03  Jun Ma <JunMa@linux.alibaba.com>
+
+	* g++.dg/coroutines/co-await-04-control-flow.C: Add label.
+
 2020-02-02  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/93530 - ICE on invalid alignas in a template.
diff --git a/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C b/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
index 9bc99e875d0..e8da2d2e2ad 100644
--- a/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
+++ b/gcc/testsuite/g++.dg/coroutines/torture/co-await-04-control-flow.C
@@ -16,9 +16,11 @@ coro1
 f ()
 {
   if (gX < 12) {
+L1:
     gX += y;
     gX += co_await 11;
   } else
+L2:
     gX += co_await 12;
     
   co_return gX;


More information about the Gcc-cvs mailing list