* [PATCH] c++: Adjust mangling of __alignof__ [PR88115]
@ 2021-03-30 19:17 Patrick Palka
2021-03-30 20:56 ` Jason Merrill
0 siblings, 1 reply; 2+ messages in thread
From: Patrick Palka @ 2021-03-30 19:17 UTC (permalink / raw)
To: gcc-patches
We currently mangle __alignof__ as a vendor extended operator,
but that's problematic for the reasons mentioned in
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88115#c6.
This patch changes the 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 both GCC and Clang agree
about the mangling of __alignof__(type) and __alignof__(expr).
Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?
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__ mangling
tests.
gcc/testsuite/ChangeLog:
PR c++/88115
* g++.dg/cpp0x/alignof7.C: Adjust expected mangling.
---
gcc/cp/mangle.c | 8 ++---
gcc/testsuite/g++.dg/cpp0x/alignof7.C | 4 +--
include/demangle.h | 3 ++
libiberty/cp-demangle.c | 47 +++++++++++++++------------
libiberty/testsuite/demangle-expected | 4 +--
5 files changed, 37 insertions(+), 29 deletions(-)
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 0a9e5aa79a0..57ce9a6710f 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -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;
}
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof7.C b/gcc/testsuite/g++.dg/cpp0x/alignof7.C
index a4d7f24a4d7..2369b879392 100644
--- a/gcc/testsuite/g++.dg/cpp0x/alignof7.C
+++ b/gcc/testsuite/g++.dg/cpp0x/alignof7.C
@@ -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" } }
diff --git a/include/demangle.h b/include/demangle.h
index 23b47265d94..b45234e6887 100644
--- a/include/demangle.h
+++ b/include/demangle.h
@@ -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 name of
+ the type, and the right subtree is a template argument list. */
+ DEMANGLE_COMPONENT_VENDOR_EXPR,
/* A libgcj compiled resource. The left subtree is the name of the
resource. */
DEMANGLE_COMPONENT_JAVA_RESOURCE,
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index d3e798455cc..a528b7b5ed3 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:
@@ -3345,6 +3349,7 @@ d_unresolved_name (struct d_info *di)
::= st <type>
::= <template-param>
::= <unresolved-name>
+ ::= u <source-name> <template-arg>* E # vendor extended expression
::= <expr-primary>
<braced-expression> ::= <expression>
@@ -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
--
2.31.1.133.g84d06cdc06
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] c++: Adjust mangling of __alignof__ [PR88115]
2021-03-30 19:17 [PATCH] c++: Adjust mangling of __alignof__ [PR88115] Patrick Palka
@ 2021-03-30 20:56 ` Jason Merrill
0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2021-03-30 20:56 UTC (permalink / raw)
To: Patrick Palka, gcc-patches
On 3/30/21 3:17 PM, Patrick Palka wrote:
> We currently mangle __alignof__ as a vendor extended operator,
> but that's problematic for the reasons mentioned in
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88115#c6.
>
> This patch changes the 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 both GCC and Clang agree
> about the mangling of __alignof__(type) and __alignof__(expr).
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk?
OK.
> 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__ mangling
> tests.
>
> gcc/testsuite/ChangeLog:
>
> PR c++/88115
> * g++.dg/cpp0x/alignof7.C: Adjust expected mangling.
> ---
> gcc/cp/mangle.c | 8 ++---
> gcc/testsuite/g++.dg/cpp0x/alignof7.C | 4 +--
> include/demangle.h | 3 ++
> libiberty/cp-demangle.c | 47 +++++++++++++++------------
> libiberty/testsuite/demangle-expected | 4 +--
> 5 files changed, 37 insertions(+), 29 deletions(-)
>
> diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
> index 0a9e5aa79a0..57ce9a6710f 100644
> --- a/gcc/cp/mangle.c
> +++ b/gcc/cp/mangle.c
> @@ -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;
> }
> }
> diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof7.C b/gcc/testsuite/g++.dg/cpp0x/alignof7.C
> index a4d7f24a4d7..2369b879392 100644
> --- a/gcc/testsuite/g++.dg/cpp0x/alignof7.C
> +++ b/gcc/testsuite/g++.dg/cpp0x/alignof7.C
> @@ -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" } }
> diff --git a/include/demangle.h b/include/demangle.h
> index 23b47265d94..b45234e6887 100644
> --- a/include/demangle.h
> +++ b/include/demangle.h
> @@ -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 name of
> + the type, and the right subtree is a template argument list. */
> + DEMANGLE_COMPONENT_VENDOR_EXPR,
> /* A libgcj compiled resource. The left subtree is the name of the
> resource. */
> DEMANGLE_COMPONENT_JAVA_RESOURCE,
> diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
> index d3e798455cc..a528b7b5ed3 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:
> @@ -3345,6 +3349,7 @@ d_unresolved_name (struct d_info *di)
> ::= st <type>
> ::= <template-param>
> ::= <unresolved-name>
> + ::= u <source-name> <template-arg>* E # vendor extended expression
> ::= <expr-primary>
>
> <braced-expression> ::= <expression>
> @@ -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
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-03-30 20:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-30 19:17 [PATCH] c++: Adjust mangling of __alignof__ [PR88115] Patrick Palka
2021-03-30 20:56 ` Jason Merrill
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).