summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2021-03-30 22:57:11 -0400
committerPatrick Palka <ppalka@redhat.com>2021-03-30 22:57:11 -0400
commita3bf6ce7f2e17f2c977c13df23eb718e7b433dcd (patch)
tree6530f01c3cbe5630c0e79f11dbc363933ec0980d /libiberty
parent0bbf0edbfc782f8e4e416d5fbd1b52a515adb585 (diff)
c++: Adjust mangling of __alignof__ [PR88115]
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.
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/cp-demangle.c47
-rw-r--r--libiberty/testsuite/demangle-expected4
2 files changed, 29 insertions, 22 deletions
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index d3e798455cc..33490f60285 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -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;
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index e6b5b64b9a9..19a0d621bc0 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -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