diff options
author | Jason Merrill <jason@redhat.com> | 2001-06-18 12:15:12 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2001-06-18 12:15:12 -0400 |
commit | 0d97bf4c2c4e599beee17c3a99f6dfdd8884d09a (patch) | |
tree | 70263e15f7a28d4f44a057ee1783e8a0095c5f9a /gcc/c-semantics.c | |
parent | 923cbdc322ee080c02b94a95eece0618a2a78b47 (diff) | |
download | gcc-0d97bf4c2c4e599beee17c3a99f6dfdd8884d09a.zip gcc-0d97bf4c2c4e599beee17c3a99f6dfdd8884d09a.tar.gz gcc-0d97bf4c2c4e599beee17c3a99f6dfdd8884d09a.tar.bz2 |
Implement the Named Return Value optimization.
* c-common.h (RETURN_NULLIFIED_P): New macro.
* c-semantics.c (genrtl_return_stmt): Check it.
* cp-tree.h (struct cp_language_function): Add x_return_value.
(current_function_return_value): Now a macro.
* decl.c: Don't define it.
(define_label, finish_case_label): Don't clear it.
(init_decl_processing): Don't register it with GC.
* semantics.c (genrtl_finish_function): Don't check it for
no_return_label. Copy the RTL from the return value to
current_function_return_value and walk, calling...
(nullify_returns_r): ...this new fn.
* typeck.c (check_return_expr): Set current_function_return_value.
* expr.c (clear_storage): Set TREE_NOTHROW on the decl for memset.
(emit_block_move): Likewise.
From-SVN: r43445
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index 6a963a9..eca64ba 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -460,7 +460,15 @@ void genrtl_return_stmt (stmt) tree stmt; { - tree expr = RETURN_EXPR (stmt); + tree expr; + + /* If RETURN_NULLIFIED_P is set, the frontend has arranged to set up + the return value separately, so just return the return value + itself. This is used for the C++ named return value optimization. */ + if (RETURN_NULLIFIED_P (stmt)) + expr = DECL_RESULT (current_function_decl); + else + expr = RETURN_EXPR (stmt); emit_line_note (input_filename, lineno); if (!expr) |