]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Adjust mangling of __alignof__ [PR88115]
authorPatrick Palka <ppalka@redhat.com>
Wed, 31 Mar 2021 02:57:11 +0000 (22:57 -0400)
committerPatrick Palka <ppalka@redhat.com>
Wed, 31 Mar 2021 02:57:11 +0000 (22:57 -0400)
r11-4926 made __alignof__ get mangled differently from alignof,
encoding __alignof__ as a vendor extended operator.  But this
mangling is problematic for the reasons mentioned in
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88115#c6.

This patch changes our mangling of __alignof__ to instead use the
new "vendor extended expression" syntax that's proposed in
https://github.com/itanium-cxx-abi/cxx-abi/issues/112.  Clang does
the same thing already, so after this patch Clang and GCC agree
about the mangling of __alignof__(type) and __alignof__(expr).

gcc/cp/ChangeLog:

PR c++/88115
* mangle.c (write_expression): Adjust the mangling of
__alignof__.

include/ChangeLog:

PR c++/88115
* demangle.h (enum demangle_component_type): Add
DEMANGLE_COMPONENT_VENDOR_EXPR.

libiberty/ChangeLog:

PR c++/88115
* cp-demangle.c (d_dump, d_make_comp, d_expression_1)
(d_count_templates_scopes): Handle DEMANGLE_COMPONENT_VENDOR_EXPR.
(d_print_comp_inner): Likewise.
<case DEMANGLE_COMPONENT_EXTENDED_OPERATOR>: Revert r11-4926
change.
<case DEMANGLE_COMPONENT_UNARY>: Likewise.
* testsuite/demangle-expected: Adjust __alignof__ tests.

gcc/testsuite/ChangeLog:

PR c++/88115
* g++.dg/cpp0x/alignof7.C: Adjust expected mangling.

gcc/cp/mangle.c
gcc/testsuite/g++.dg/cpp0x/alignof7.C
include/demangle.h
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 0a9e5aa79a027b421a411ffa655a51d4390837cd..57ce9a6710f26d0d0017bd093db7bb7fc67b7047 100644 (file)
@@ -3124,11 +3124,9 @@ write_expression (tree expr)
          if (abi_version_at_least (15))
            {
              /* We used to mangle __alignof__ like alignof.  */
-             write_string ("v111__alignof__");
-             if (TYPE_P (TREE_OPERAND (expr, 0)))
-               write_type (TREE_OPERAND (expr, 0));
-             else
-               write_expression (TREE_OPERAND (expr, 0));
+             write_string ("u11__alignof__");
+             write_template_arg (TREE_OPERAND (expr, 0));
+             write_char ('E');
              return;
            }
        }
index a4d7f24a4d754d2c99e4c9c775f23871379d6684..2369b879392de2beac02349ffeb0187a470079ed 100644 (file)
@@ -18,5 +18,5 @@ template void f4<int>(std::size_t);
 
 // { dg-final { scan-assembler "_Z2f1IiEvDTatT_E" } }
 // { dg-final { scan-assembler "_Z2f2IiEvDTaztlT_EE" } }
-// { dg-final { scan-assembler "_Z2f3IiEvDTv111__alignof__T_E" } }
-// { dg-final { scan-assembler "_Z2f4IiEvDTv111__alignof__tlT_EE" } }
+// { dg-final { scan-assembler "_Z2f3IiEvDTu11__alignof__T_EE" } }
+// { dg-final { scan-assembler "_Z2f4IiEvDTu11__alignof__XtlT_EEEE" } }
index 23b47265d946b1771a753e427a0a7962274ac119..295d58cb4541d4a7200d92086454c5048329ba36 100644 (file)
@@ -408,6 +408,9 @@ enum demangle_component_type
      number which involves neither modifying the mangled string nor
      allocating a new copy of the literal in memory.  */
   DEMANGLE_COMPONENT_LITERAL_NEG,
+  /* A vendor's builtin expression.  The left subtree holds the
+     expression's name, and the right subtree is a argument list.  */
+  DEMANGLE_COMPONENT_VENDOR_EXPR,
   /* A libgcj compiled resource.  The left subtree is the name of the
      resource.  */
   DEMANGLE_COMPONENT_JAVA_RESOURCE,
index d3e798455cc6a3a21f19314a76af26b189c44a3e..33490f60285467c104bc3eca98ed9815ea28ed00 100644 (file)
@@ -815,6 +815,9 @@ d_dump (struct demangle_component *dc, int indent)
     case DEMANGLE_COMPONENT_LITERAL_NEG:
       printf ("negative literal\n");
       break;
+    case DEMANGLE_COMPONENT_VENDOR_EXPR:
+      printf ("vendor expression\n");
+      break;
     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
       printf ("java resource\n");
       break;
@@ -976,6 +979,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type,
     case DEMANGLE_COMPONENT_TRINARY_ARG1:
     case DEMANGLE_COMPONENT_LITERAL:
     case DEMANGLE_COMPONENT_LITERAL_NEG:
+    case DEMANGLE_COMPONENT_VENDOR_EXPR:
     case DEMANGLE_COMPONENT_COMPOUND_NAME:
     case DEMANGLE_COMPONENT_VECTOR_TYPE:
     case DEMANGLE_COMPONENT_CLONE:
@@ -3344,6 +3348,7 @@ d_unresolved_name (struct d_info *di)
                ::= cl <expression>+ E
                 ::= st <type>
                 ::= <template-param>
+               ::= u <source-name> <template-arg>* E # vendor extended expression
                ::= <unresolved-name>
                 ::= <expr-primary>
 
@@ -3425,6 +3430,15 @@ d_expression_1 (struct d_info *di)
       return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST,
                          type, d_exprlist (di, 'E'));
     }
+  else if (peek == 'u')
+    {
+      /* A vendor extended expression.  */
+      struct demangle_component *name, *args;
+      d_advance (di, 1);
+      name = d_source_name (di);
+      args = d_template_args_1 (di);
+      return d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_EXPR, name, args);
+    }
   else
     {
       struct demangle_component *op;
@@ -4229,6 +4243,7 @@ d_count_templates_scopes (struct d_print_info *dpi,
     case DEMANGLE_COMPONENT_TRINARY_ARG2:
     case DEMANGLE_COMPONENT_LITERAL:
     case DEMANGLE_COMPONENT_LITERAL_NEG:
+    case DEMANGLE_COMPONENT_VENDOR_EXPR:
     case DEMANGLE_COMPONENT_JAVA_RESOURCE:
     case DEMANGLE_COMPONENT_COMPOUND_NAME:
     case DEMANGLE_COMPONENT_DECLTYPE:
@@ -5509,18 +5524,9 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
       }
 
     case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
-      {
-       struct demangle_component *name = dc->u.s_extended_operator.name;
-       if (name->type == DEMANGLE_COMPONENT_NAME
-           && !strncmp (name->u.s_name.s, "__alignof__", name->u.s_name.len))
-         d_print_comp (dpi, options, dc->u.s_extended_operator.name);
-       else
-         {
-           d_append_string (dpi, "operator ");
-           d_print_comp (dpi, options, dc->u.s_extended_operator.name);
-         }
-       return;
-      }
+      d_append_string (dpi, "operator ");
+      d_print_comp (dpi, options, dc->u.s_extended_operator.name);
+      return;
 
     case DEMANGLE_COMPONENT_CONVERSION:
       d_append_string (dpi, "operator ");
@@ -5585,14 +5591,8 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
        if (code && !strcmp (code, "gs"))
          /* Avoid parens after '::'.  */
          d_print_comp (dpi, options, operand);
-       else if ((code && !strcmp (code, "st"))
-                || (op->type == DEMANGLE_COMPONENT_EXTENDED_OPERATOR
-                    && (op->u.s_extended_operator.name->type
-                        == DEMANGLE_COMPONENT_NAME)
-                    && !strncmp (op->u.s_extended_operator.name->u.s_name.s,
-                                 "__alignof__",
-                                 op->u.s_extended_operator.name->u.s_name.len)))
-         /* Always print parens for sizeof (type) and __alignof__.  */
+       else if (code && !strcmp (code, "st"))
+         /* Always print parens for sizeof (type).  */
          {
            d_append_char (dpi, '(');
            d_print_comp (dpi, options, operand);
@@ -5805,6 +5805,13 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
       }
       return;
 
+    case DEMANGLE_COMPONENT_VENDOR_EXPR:
+      d_print_comp (dpi, options, d_left (dc));
+      d_append_char (dpi, '(');
+      d_print_comp (dpi, options, d_right (dc));
+      d_append_char (dpi, ')');
+      return;
+
     case DEMANGLE_COMPONENT_NUMBER:
       d_append_num (dpi, dc->u.s_number.number);
       return;
index e6b5b64b9a9bc31a1cbf75b80e4b25407116dd82..19a0d621bc01123f526aa48f1f5a6f2875d91b8e 100644 (file)
@@ -1471,10 +1471,10 @@ _Z2F2IZ1FvEUlvE_EN1AIT_E1XES2_
 A<F()::{lambda()#1}>::X F2<F()::{lambda()#1}>(F()::{lambda()#1})
 
 # PR 88115
-_Z1fIiEvDTv111__alignof__T_E
+_Z1fIiEvDTu11__alignof__T_EE
 void f<int>(decltype (__alignof__(int)))
 
-_Z1fIiEvDTv111__alignof__tlT_EE
+_Z1fIiEvDTu11__alignof__XtlT_EEEE
 void f<int>(decltype (__alignof__(int{})))
 
 _Z1gI1AEv1SIXadsrT_oncviEE