middle-end: Avoid using DECL_UID in ASM_FORMAT_PRIVATE_NAME [PR94223]
authorJakub Jelinek <jakub@redhat.com>
Wed, 25 Mar 2020 08:18:33 +0000 (09:18 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 25 Mar 2020 08:18:33 +0000 (09:18 +0100)
As mentioned in the PR, we don't guarantee DECL_UID to be the same between
corresponding decls in -g and -g0 builds, -g can create more decls and all
that is guaranteed is that the DECL_UIDs of the corresponding decls compare
the same.
The following testcase gets a -fcompare-debug failure because these
functions use DECL_UID as the number in ASM_FORMAT_PRIVATE_NAME.

The patch fixes it by using just a sequential number there instead.
I don't think this can be called during PCH writing, this only happens for
non-public decls and the C/C++ FEs shouldn't mangling those at that point
(furthermore C++ FE uses a different set_decl_assembler_name hook and this
one is something only the gimplifier calls on C.NNNN temporaries.

2020-03-25  Jakub Jelinek  <jakub@redhat.com>

PR c++/94223
* langhooks.c (lhd_set_decl_assembler_name): Use a static ulong
counter instead of DECL_UID.

* lto-lang.c (lto_set_decl_assembler_name): Use a static ulong
counter instead of DECL_UID.

* g++.dg/opt/pr94223.C: New test.

gcc/ChangeLog
gcc/langhooks.c
gcc/lto/ChangeLog
gcc/lto/lto-lang.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr94223.C [new file with mode: 0644]

index 4a0e473afd736c69dc567136d6422be76cf59974..cde4653c0304d3a986ceab50ebf87e3e6c021439 100644 (file)
@@ -1,5 +1,9 @@
 2020-03-25  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/94223
+       * langhooks.c (lhd_set_decl_assembler_name): Use a static ulong
+       counter instead of DECL_UID.
+
        PR tree-optimization/94300
        * tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): If pd.offset
        is positive, make sure that off + size isn't larger than needed_len.
index 640bd012d1c5881094920f4514cb23829bf081e2..5e3216da63129b9e2779b43596efdc7d889cd163 100644 (file)
@@ -160,16 +160,17 @@ lhd_set_decl_assembler_name (tree decl)
 
      Can't use just the variable's own name for a variable whose scope
      is less than the whole compilation.  Concatenate a distinguishing
-     number - we use the DECL_UID.  */
+     number.  */
 
   if (TREE_PUBLIC (decl) || DECL_FILE_SCOPE_P (decl))
     id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
   else
     {
       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
+      static unsigned long num;
       char *label;
 
-      ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+      ASM_FORMAT_PRIVATE_NAME (label, name, num++);
       id = get_identifier (label);
     }
 
index 619a42d5142330e6259fae2992449e38f9116e2f..4171a3dc4aede05126a15079c04598b2a4f0776d 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/94223
+       * lto-lang.c (lto_set_decl_assembler_name): Use a static ulong
+       counter instead of DECL_UID.
+
 2020-03-24  Tobias Burnus  <tobias@codesourcery.com>
 
        PR libgomp/81689
index a5638e7a2a00135f6ad9fa3cdca94b5523d33b2e..a3e841850edf7cb620a24f59594843b6b6669f05 100644 (file)
@@ -1179,8 +1179,9 @@ lto_set_decl_assembler_name (tree decl)
     {
       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
       char *label;
+      static unsigned long num;
 
-      ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
+      ASM_FORMAT_PRIVATE_NAME (label, name, num++);
       id = get_identifier (label);
     }
 
index 2a39af6feabd7a6e51424d6dfdde7cb1ff49d8db..048f830409e2024cd93d47d69c93ca8d9148da32 100644 (file)
@@ -1,5 +1,8 @@
 2020-03-25  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/94223
+       * g++.dg/opt/pr94223.C: New test.
+
        PR tree-optimization/94300
        * gcc.target/i386/avx512f-pr94300.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/opt/pr94223.C b/gcc/testsuite/g++.dg/opt/pr94223.C
new file mode 100644 (file)
index 0000000..0de012d
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/94223
+// { dg-do compile }
+// { dg-options "-O0 -std=c++2a -fcompare-debug" }
+
+#include "../cpp1z/init-statement6.C"