aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2021-07-07 19:56:20 +0100
committerIain Sandoe <iain@sandoe.co.uk>2021-07-09 19:14:11 +0100
commitd5b1bb0d197f9141a0f0e510f8d1b598c3df9552 (patch)
tree22b02a9c6fa868894952050897b2d432ef99f625 /gcc
parent59045273cc648e354ba72f9188f69927f00802e2 (diff)
downloadgcc-d5b1bb0d197f9141a0f0e510f8d1b598c3df9552.zip
gcc-d5b1bb0d197f9141a0f0e510f8d1b598c3df9552.tar.gz
gcc-d5b1bb0d197f9141a0f0e510f8d1b598c3df9552.tar.bz2
coroutines: Factor code. Match original source location in helpers [NFC].
This is primarily a source code refactoring, the only change is to ensure that the outlined functions are marked to begin at the same line as the original. Otherwise, they get the default (which seems to be input_location, which corresponds to the closing brace at the point that this is done). Having the source location point to that confuses some debuggers. This is a contributory fix to: PR c++/99215 - coroutines: debugging with gdb Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> gcc/cp/ChangeLog: * coroutines.cc (build_actor_fn): Move common code to act_des_fn. (build_destroy_fn): Likewise. (act_des_fn): Build the void return here. Ensure that the source location matches the original function.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/coroutines.cc29
1 files changed, 15 insertions, 14 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f5ae2d6..54ffdc8 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -2155,13 +2155,6 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody,
/* One param, the coro frame pointer. */
tree actor_fp = DECL_ARGUMENTS (actor);
- /* A void return. */
- tree resdecl = build_decl (loc, RESULT_DECL, 0, void_type_node);
- DECL_ARTIFICIAL (resdecl) = 1;
- DECL_IGNORED_P (resdecl) = 1;
- DECL_RESULT (actor) = resdecl;
- DECL_COROUTINE_P (actor) = 1;
-
/* We have a definition here. */
TREE_STATIC (actor) = 1;
@@ -2532,15 +2525,8 @@ build_destroy_fn (location_t loc, tree coro_frame_type, tree destroy,
/* One param, the coro frame pointer. */
tree destr_fp = DECL_ARGUMENTS (destroy);
- /* A void return. */
- tree resdecl = build_decl (loc, RESULT_DECL, 0, void_type_node);
- DECL_ARTIFICIAL (resdecl) = 1;
- DECL_IGNORED_P (resdecl) = 1;
- DECL_RESULT (destroy) = resdecl;
-
/* We have a definition here. */
TREE_STATIC (destroy) = 1;
- DECL_COROUTINE_P (destroy) = 1;
tree destr_outer = push_stmt_list ();
current_stmt_tree ()->stmts_are_full_exprs_p = 1;
@@ -4000,15 +3986,19 @@ static tree
act_des_fn (tree orig, tree fn_type, tree coro_frame_ptr, const char* name)
{
tree fn_name = get_fn_local_identifier (orig, name);
+ location_t loc = DECL_SOURCE_LOCATION (orig);
tree fn = build_lang_decl (FUNCTION_DECL, fn_name, fn_type);
DECL_CONTEXT (fn) = DECL_CONTEXT (orig);
+ DECL_SOURCE_LOCATION (fn) = loc;
DECL_ARTIFICIAL (fn) = true;
DECL_INITIAL (fn) = error_mark_node;
+
tree id = get_identifier ("frame_ptr");
tree fp = build_lang_decl (PARM_DECL, id, coro_frame_ptr);
DECL_CONTEXT (fp) = fn;
DECL_ARG_TYPE (fp) = type_passed_as (coro_frame_ptr);
DECL_ARGUMENTS (fn) = fp;
+
/* Copy selected attributes from the original function. */
TREE_USED (fn) = TREE_USED (orig);
if (DECL_SECTION_NAME (orig))
@@ -4020,6 +4010,17 @@ act_des_fn (tree orig, tree fn_type, tree coro_frame_ptr, const char* name)
DECL_USER_ALIGN (fn) = DECL_USER_ALIGN (orig);
/* Apply attributes from the original fn. */
DECL_ATTRIBUTES (fn) = copy_list (DECL_ATTRIBUTES (orig));
+
+ /* A void return. */
+ tree resdecl = build_decl (loc, RESULT_DECL, 0, void_type_node);
+ DECL_CONTEXT (resdecl) = fn;
+ DECL_ARTIFICIAL (resdecl) = 1;
+ DECL_IGNORED_P (resdecl) = 1;
+ DECL_RESULT (fn) = resdecl;
+
+ /* This is a coroutine component. */
+ DECL_COROUTINE_P (fn) = 1;
+
return fn;
}