mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
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.
This commit is contained in:
parent
0bbf0edbfc
commit
a3bf6ce7f2
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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" } }
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user