Hi Jason,

> On 30 Mar 2023, at 00:53, Jason Merrill <ja...@redhat.com> wrote:
> 
> On 3/26/23 12:54, Iain Sandoe wrote:
>> Tested on x86_64-darwin21, x86-64-linux-gnu

>>  +/* This is used to make a stable, but unique-per-function, sequence number 
>> for
>> +   each TARGET_EXPR slot variable that we 'promote' to a frame entry.  It 
>> needs
>> +   to be stable because the frame type is visible to LTO ODR checking.  */
>> +static unsigned tmpno = 0;
> 
> How about using temps_used->elements() for the index instead of a separate 
> static counter?

That’s a good idea (the only slightly weird effect is that the count does not 
start at 0, 
because we’ve added one or more entries by the time we get to produce a name, 
but
that does not affect functionality).

re-tested on x86_64-darwin21, as below,
OK for trunk?
thanks
Iain

===

[PATCH] c++,coroutines: Stabilize names of promoted slot vars  [PR101118].

When we need to 'promote' a value (i.e. store it in the coroutine frame) it
is given a frame entry name.  This was based on the DECL_UID for slot vars.
However, when LTO is used, the names from multiple TUs become visible at the
same time, and the DECL_UIDs usually differ between units.  This leads to a
"ODR mismatch" warning for the frame type.

The fix here is to use the current promoted temporaries count to produce
the name, this is stable between TUs and computed per coroutine.

Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>

        PR c++/101118

gcc/cp/ChangeLog:

        * coroutines.cc (flatten_await_stmt): Use the current count of
        promoted temporaries to build a unique name for the frame entries.
---
 gcc/cp/coroutines.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index a2189e43db8..9f546db7437 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -2889,7 +2889,7 @@ flatten_await_stmt (var_nest_node *n, hash_set<tree> 
*promoted,
          tree init = t;
          temps_used->add (init);
          tree var_type = TREE_TYPE (init);
-         char *buf = xasprintf ("D.%d", DECL_UID (TREE_OPERAND (init, 0)));
+         char *buf = xasprintf ("T%03u", temps_used->elements());
          tree var = build_lang_decl (VAR_DECL, get_identifier (buf), var_type);
          DECL_ARTIFICIAL (var) = true;
          free (buf);
— 


Reply via email to