c++: Reorganize per-scope lambda discriminators
authorNathan Sidwell <nathan@acm.org>
Mon, 31 Oct 2022 10:11:28 +0000 (06:11 -0400)
committerNathan Sidwell <nathan@acm.org>
Tue, 1 Nov 2022 10:04:48 +0000 (06:04 -0400)
commit0122faae30fe1ad1dfa8c69f3d3f0428b996b600
treeb22a5db786c232d8636ce81e8898afc4a66c7340
parent4acc4c2be84d66075d60736623c3a7134d129eaa
c++: Reorganize per-scope lambda discriminators

We currently use a per-extra-scope counter to discriminate multiple
lambdas in a particular such scope.  This is not ABI compliant.  This
patch merely refactors the existing code to make it easier to drop in
a conformant mangling -- there's no functional change here.  I rename
the LAMBDA_EXPR_DISCIMINATOR to LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR,
foreshadowing that there'll be a new discriminator.  To provide ABI
warnings we'll need to calculate both, and that requires some
repacking of the lambda_expr's fields.  Finally, although we end up
calling the discriminator setter and the scope recorder (nearly)
always consecutively, it's clearer to handle it as two separate
operations.  That also allows us to remove the instantiation
special-case for a null extra-scope.

gcc/cp/
* cp-tree.h (LAMBDA_EXPR_DISCRIMINATOR): Rename to ...
(LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR): ... here.
(struct tree_lambda_expr): Make default_capture_mode &
discriminator_scope bitfields.
(record_null_lambda_scope) Delete.
(record_lambda_scope_discriminator): Declare.
* lambda.cc (struct lambda_discriminator): New struct.
(lambda_scope, lambda_scope_stack): Adjust types.
(lambda_count): Delete.
(struct tree_int): Delete.
(start_lambda_scope, finish_lambda_scope): Adjust.
(record_lambda_scope): Only record the scope.
(record_lambda_scope_discriminator): New.
* mangle.cc (write_closure_type_name): Adjust.
* module.cc (trees_out::core_vals): Likewise,
(trees_in::core_vals): Likewise.
* parser.cc (cp_parser_lambda_expression): Call
record_lambda_scope_discriminator.
* pt.cc (tsubst_lambda_expr): Adjust record_lambda_scope caling.  Call
record_lambda_scope_discriminator. Commonize control flow on tsubsting
the operator function.
libcc1/
* libcp1plugin.cc (plugin_start_closure): Adjust.
gcc/testsuite/
* g++.dg/abi/lambda-sig1-17.C: New.
* g++.dg/abi/lambda-sig1.h: New.
* g++.dg/cpp1y/lambda-mangle-1.C: Extracted to ...
* g++.dg/cpp1y/lambda-mangle-1.h: ... here.
* g++.dg/cpp1y/lambda-mangle-1-11.C: New
* g++.dg/cpp1y/lambda-mangle-1-17.C
12 files changed:
gcc/cp/cp-tree.h
gcc/cp/lambda.cc
gcc/cp/mangle.cc
gcc/cp/module.cc
gcc/cp/parser.cc
gcc/cp/pt.cc
gcc/testsuite/g++.dg/abi/lambda-sig1-17.C [new file with mode: 0644]
gcc/testsuite/g++.dg/abi/lambda-sig1.h [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1-11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1-17.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.h [moved from gcc/testsuite/g++.dg/cpp1y/lambda-mangle-1.C with 98% similarity]
libcc1/libcp1plugin.cc