]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/mangle.c
c++: Emit DFP typeinfos even when DFP is disabled [PR92906]
[thirdparty/gcc.git] / gcc / cp / mangle.c
CommitLineData
352b8bab 1/* Name mangling for the 3.0 -*- C++ -*- ABI.
8d9254fc 2 Copyright (C) 2000-2020 Free Software Foundation, Inc.
5c31de12 3 Written by Alex Samuel <samuel@codesourcery.com>
1f6e1acc 4
f5adbb8d 5 This file is part of GCC.
1f6e1acc 6
f5adbb8d 7 GCC is free software; you can redistribute it and/or modify it
1f6e1acc 8 under the terms of the GNU General Public License as published by
e77f031d 9 the Free Software Foundation; either version 3, or (at your option)
1f6e1acc
AS
10 any later version.
11
f5adbb8d 12 GCC is distributed in the hope that it will be useful, but
1f6e1acc
AS
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
e77f031d
NC
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
1f6e1acc
AS
20
21/* This file implements mangling of C++ names according to the IA64
22 C++ ABI specification. A mangled name encodes a function or
23 variable's name, scope, type, and/or template arguments into a text
24 identifier. This identifier is used as the function's or
25 variable's linkage name, to preserve compatibility between C++'s
26 language features (templates, scoping, and overloading) and C
27 linkers.
28
29 Additionally, g++ uses mangled names internally. To support this,
30 mangling of types is allowed, even though the mangled name of a
31 type should not appear by itself as an exported name. Ditto for
32 uninstantiated templates.
33
34 The primary entry point for this module is mangle_decl, which
35 returns an identifier containing the mangled name for a decl.
36 Additional entry points are provided to build mangled names of
37 particular constructs when the appropriate decl for that construct
38 is not available. These are:
39
0cbd7506
MS
40 mangle_typeinfo_for_type: typeinfo data
41 mangle_typeinfo_string_for_type: typeinfo type name
42 mangle_vtbl_for_type: virtual table data
43 mangle_vtt_for_type: VTT data
44 mangle_ctor_vtbl_for_type: `C-in-B' constructor virtual table data
3db45ab5 45 mangle_thunk: thunk function or entry */
1f6e1acc
AS
46
47#include "config.h"
48#include "system.h"
4977bab6 49#include "coretypes.h"
2adfab87
AM
50#include "target.h"
51#include "vtable-verify.h"
2adfab87 52#include "cp-tree.h"
2adfab87
AM
53#include "stringpool.h"
54#include "cgraph.h"
d8a2d370 55#include "stor-layout.h"
57782ad8 56#include "flags.h"
603eaec4 57#include "attribs.h"
1f6e1acc
AS
58
59/* Debugging support. */
60
61/* Define DEBUG_MANGLE to enable very verbose trace messages. */
62#ifndef DEBUG_MANGLE
63#define DEBUG_MANGLE 0
64#endif
65
66/* Macros for tracing the write_* functions. */
67#if DEBUG_MANGLE
68# define MANGLE_TRACE(FN, INPUT) \
ff0b0e4c 69 fprintf (stderr, " %-24s: %-24s\n", (FN), (INPUT))
1f6e1acc
AS
70# define MANGLE_TRACE_TREE(FN, NODE) \
71 fprintf (stderr, " %-24s: %-24s (%p)\n", \
5806f481 72 (FN), get_tree_code_name (TREE_CODE (NODE)), (void *) (NODE))
1f6e1acc
AS
73#else
74# define MANGLE_TRACE(FN, INPUT)
75# define MANGLE_TRACE_TREE(FN, NODE)
76#endif
77
838dfd8a 78/* Nonzero if NODE is a class template-id. We can't rely on
722bed0f
AS
79 CLASSTYPE_USE_TEMPLATE here because of tricky bugs in the parser
80 that hard to distinguish A<T> from A, where A<T> is the type as
81 instantiated outside of the template, and A is the type used
f0f33848 82 without parameters inside the template. */
6397d80b 83#define CLASSTYPE_TEMPLATE_ID_P(NODE) \
776ff3ef
NS
84 (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \
85 || (CLASS_TYPE_P (NODE) \
86 && CLASSTYPE_TEMPLATE_INFO (NODE) != NULL \
87 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))
1f6e1acc 88
a75f1574
JM
89/* For deciding whether to set G.need_abi_warning, we need to consider both
90 warn_abi_version and flag_abi_compat_version. */
91#define abi_warn_or_compat_version_crosses(N) \
92 (abi_version_crosses (N) || abi_compat_version_crosses (N))
93
7ab8c647
JM
94/* And sometimes we can simplify the code path if we don't need to worry about
95 previous ABIs. */
96#define abi_flag_at_least(flag,N) (flag == 0 || flag >= N)
97#define any_abi_below(N) \
98 (!abi_version_at_least (N) \
99 || !abi_flag_at_least (warn_abi_version, (N)) \
100 || !abi_flag_at_least (flag_abi_compat_version, (N)))
101
1f6e1acc 102/* Things we only need one of. This module is not reentrant. */
a79683d5 103struct GTY(()) globals {
1f6e1acc
AS
104 /* An array of the current substitution candidates, in the order
105 we've seen them. */
9771b263 106 vec<tree, va_gc> *substitutions;
8c152bad 107
6397d80b 108 /* The entity that is being mangled. */
2b8fe4a0 109 tree GTY ((skip)) entity;
6397d80b 110
67e18edb
JM
111 /* How many parameter scopes we are inside. */
112 int parm_depth;
113
6397d80b
MM
114 /* True if the mangling will be different in a future version of the
115 ABI. */
116 bool need_abi_warning;
51dc6603
JM
117
118 /* True if the mangling will be different in C++17 mode. */
7b936140 119 bool need_cxx17_warning;
a79683d5 120};
2b8fe4a0
MM
121
122static GTY (()) globals G;
123
124/* The obstack on which we build mangled names. */
125static struct obstack *mangle_obstack;
126
127/* The obstack on which we build mangled names that are not going to
128 be IDENTIFIER_NODEs. */
129static struct obstack name_obstack;
130
bb5ecf29
MM
131/* The first object on the name_obstack; we use this to free memory
132 allocated on the name_obstack. */
2b8fe4a0 133static void *name_base;
1f6e1acc
AS
134
135/* Indices into subst_identifiers. These are identifiers used in
136 special substitution rules. */
137typedef enum
138{
139 SUBID_ALLOCATOR,
140 SUBID_BASIC_STRING,
141 SUBID_CHAR_TRAITS,
142 SUBID_BASIC_ISTREAM,
143 SUBID_BASIC_OSTREAM,
144 SUBID_BASIC_IOSTREAM,
145 SUBID_MAX
146}
147substitution_identifier_index_t;
148
149/* For quick substitution checks, look up these common identifiers
150 once only. */
0de298af 151static GTY(()) tree subst_identifiers[SUBID_MAX];
1f6e1acc
AS
152
153/* Single-letter codes for builtin integer types, defined in
154 <builtin-type>. These are indexed by integer_type_kind values. */
eb6b51b9 155static const char
1f6e1acc
AS
156integer_type_codes[itk_none] =
157{
158 'c', /* itk_char */
159 'a', /* itk_signed_char */
160 'h', /* itk_unsigned_char */
161 's', /* itk_short */
162 't', /* itk_unsigned_short */
163 'i', /* itk_int */
164 'j', /* itk_unsigned_int */
165 'l', /* itk_long */
166 'm', /* itk_unsigned_long */
167 'x', /* itk_long_long */
a6766312 168 'y', /* itk_unsigned_long_long */
78a7c317
DD
169 /* __intN types are handled separately */
170 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
1f6e1acc
AS
171};
172
89aec4b1 173static int decl_is_template_id (const tree, tree* const);
722bed0f 174
1f6e1acc
AS
175/* Functions for handling substitutions. */
176
89aec4b1
NN
177static inline tree canonicalize_for_substitution (tree);
178static void add_substitution (tree);
179static inline int is_std_substitution (const tree,
180 const substitution_identifier_index_t);
181static inline int is_std_substitution_char (const tree,
182 const substitution_identifier_index_t);
183static int find_substitution (tree);
184static void mangle_call_offset (const tree, const tree);
1f6e1acc
AS
185
186/* Functions for emitting mangled representations of things. */
187
5fd80fbc 188static void write_mangled_name (const tree, bool);
89aec4b1
NN
189static void write_encoding (const tree);
190static void write_name (tree, const int);
7dbb85a7 191static void write_abi_tags (tree);
89aec4b1
NN
192static void write_unscoped_name (const tree);
193static void write_unscoped_template_name (const tree);
194static void write_nested_name (const tree);
195static void write_prefix (const tree);
196static void write_template_prefix (const tree);
2982147e 197static void write_unqualified_name (tree);
89aec4b1
NN
198static void write_conversion_operator_name (const tree);
199static void write_source_name (tree);
3ce4f9e4 200static void write_literal_operator_name (tree);
d5f4eddd
JM
201static void write_unnamed_type_name (const tree);
202static void write_closure_type_name (const tree);
89aec4b1
NN
203static int hwint_to_ascii (unsigned HOST_WIDE_INT, const unsigned int, char *,
204 const unsigned int);
205static void write_number (unsigned HOST_WIDE_INT, const int,
206 const unsigned int);
d5f4eddd 207static void write_compact_number (int num);
89aec4b1
NN
208static void write_integer_cst (const tree);
209static void write_real_cst (const tree);
210static void write_identifier (const char *);
211static void write_special_name_constructor (const tree);
212static void write_special_name_destructor (const tree);
213static void write_type (tree);
214static int write_CV_qualifiers_for_type (const tree);
215static void write_builtin_type (tree);
216static void write_function_type (const tree);
217static void write_bare_function_type (const tree, const int, const tree);
218static void write_method_parms (tree, const int, const tree);
219static void write_class_enum_type (const tree);
220static void write_template_args (tree);
221static void write_expression (tree);
222static void write_template_arg_literal (const tree);
223static void write_template_arg (tree);
224static void write_template_template_arg (const tree);
225static void write_array_type (const tree);
226static void write_pointer_to_member_type (const tree);
227static void write_template_param (const tree);
228static void write_template_template_param (const tree);
229static void write_substitution (const int);
230static int discriminator_for_local_entity (tree);
231static int discriminator_for_string_literal (tree, tree);
232static void write_discriminator (const int);
d5f4eddd 233static void write_local_name (tree, const tree, const tree);
89aec4b1 234static void dump_substitution_candidates (void);
dae4174e 235static tree mangle_decl_string (const tree);
328eae1c 236static void maybe_check_abi_tags (tree, tree = NULL_TREE, int = 10);
7ab8c647 237static bool equal_abi_tags (tree, tree);
1f6e1acc
AS
238
239/* Control functions. */
240
dae4174e 241static inline void start_mangling (const tree);
89aec4b1 242static tree mangle_special_for_type (const tree, const char *);
1f6e1acc
AS
243
244/* Append a single character to the end of the mangled
245 representation. */
0cbd7506 246#define write_char(CHAR) \
2b8fe4a0 247 obstack_1grow (mangle_obstack, (CHAR))
1f6e1acc 248
c6002625 249/* Append a sized buffer to the end of the mangled representation. */
0cbd7506 250#define write_chars(CHAR, LEN) \
2b8fe4a0 251 obstack_grow (mangle_obstack, (CHAR), (LEN))
0576ec13 252
1f6e1acc
AS
253/* Append a NUL-terminated string to the end of the mangled
254 representation. */
0cbd7506 255#define write_string(STRING) \
2b8fe4a0 256 obstack_grow (mangle_obstack, (STRING), strlen (STRING))
1f6e1acc 257
838dfd8a 258/* Nonzero if NODE1 and NODE2 are both TREE_LIST nodes and have the
459c43ad 259 same purpose (context, which may be a type) and value (template
1f6e1acc
AS
260 decl). See write_template_prefix for more information on what this
261 is used for. */
0cbd7506
MS
262#define NESTED_TEMPLATE_MATCH(NODE1, NODE2) \
263 (TREE_CODE (NODE1) == TREE_LIST \
264 && TREE_CODE (NODE2) == TREE_LIST \
265 && ((TYPE_P (TREE_PURPOSE (NODE1)) \
266 && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2))) \
267 || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2)) \
1f6e1acc
AS
268 && TREE_VALUE (NODE1) == TREE_VALUE (NODE2))
269
82a362d0 270/* Write out an unsigned quantity in base 10. */
0cbd7506 271#define write_unsigned_number(NUMBER) \
ff0b0e4c 272 write_number ((NUMBER), /*unsigned_p=*/1, 10)
82a362d0 273
a9c2f3d9
JM
274/* If DECL is a template instance (including the uninstantiated template
275 itself), return nonzero and, if TEMPLATE_INFO is non-NULL, set
276 *TEMPLATE_INFO to its template info. Otherwise return zero. */
722bed0f
AS
277
278static int
89aec4b1 279decl_is_template_id (const tree decl, tree* const template_info)
722bed0f
AS
280{
281 if (TREE_CODE (decl) == TYPE_DECL)
282 {
283 /* TYPE_DECLs are handled specially. Look at its type to decide
284 if this is a template instantiation. */
89aec4b1 285 const tree type = TREE_TYPE (decl);
722bed0f
AS
286
287 if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_ID_P (type))
288 {
289 if (template_info != NULL)
290 /* For a templated TYPE_DECL, the template info is hanging
291 off the type. */
6397d80b 292 *template_info = TYPE_TEMPLATE_INFO (type);
722bed0f
AS
293 return 1;
294 }
c8094d83 295 }
722bed0f
AS
296 else
297 {
298 /* Check if this is a primary template. */
299 if (DECL_LANG_SPECIFIC (decl) != NULL
a9c2f3d9
JM
300 && VAR_OR_FUNCTION_DECL_P (decl)
301 && DECL_TEMPLATE_INFO (decl)
722bed0f
AS
302 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl))
303 && TREE_CODE (decl) != TEMPLATE_DECL)
304 {
305 if (template_info != NULL)
306 /* For most templated decls, the template info is hanging
307 off the decl. */
308 *template_info = DECL_TEMPLATE_INFO (decl);
309 return 1;
310 }
311 }
312
313 /* It's not a template id. */
314 return 0;
315}
316
1f6e1acc
AS
317/* Produce debugging output of current substitution candidates. */
318
319static void
edaf3e03 320dump_substitution_candidates (void)
1f6e1acc
AS
321{
322 unsigned i;
6e1141d7 323 tree el;
1f6e1acc
AS
324
325 fprintf (stderr, " ++ substitutions ");
9771b263 326 FOR_EACH_VEC_ELT (*G.substitutions, i, el)
1f6e1acc 327 {
1f6e1acc
AS
328 const char *name = "???";
329
330 if (i > 0)
331 fprintf (stderr, " ");
332 if (DECL_P (el))
333 name = IDENTIFIER_POINTER (DECL_NAME (el));
334 else if (TREE_CODE (el) == TREE_LIST)
335 name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el)));
336 else if (TYPE_NAME (el))
fe9208ef 337 name = TYPE_NAME_STRING (el);
1f6e1acc 338 fprintf (stderr, " S%d_ = ", i - 1);
c8094d83
MS
339 if (TYPE_P (el) &&
340 (CP_TYPE_RESTRICT_P (el)
341 || CP_TYPE_VOLATILE_P (el)
1f6e1acc
AS
342 || CP_TYPE_CONST_P (el)))
343 fprintf (stderr, "CV-");
c8094d83 344 fprintf (stderr, "%s (%s at %p)\n",
5806f481 345 name, get_tree_code_name (TREE_CODE (el)), (void *) el);
1f6e1acc
AS
346 }
347}
348
51dc6603
JM
349/* <exception-spec> ::=
350 Do -- non-throwing exception specification
351 DO <expression> E -- computed (instantiation-dependent) noexcept
352 Dw <type>* E -- throw (types) */
353
354static void
355write_exception_spec (tree spec)
356{
357
358 if (!spec || spec == noexcept_false_spec)
359 /* Nothing. */
360 return;
361
362 if (!flag_noexcept_type)
363 {
7b936140 364 G.need_cxx17_warning = true;
51dc6603
JM
365 return;
366 }
367
2c65d990 368 if (spec == noexcept_true_spec || spec == empty_except_spec)
51dc6603 369 write_string ("Do");
2c65d990 370 else if (tree expr = TREE_PURPOSE (spec))
51dc6603 371 {
2c65d990
NS
372 /* noexcept (expr) */
373 gcc_assert (uses_template_parms (expr));
51dc6603 374 write_string ("DO");
2c65d990 375 write_expression (expr);
51dc6603
JM
376 write_char ('E');
377 }
378 else
379 {
2c65d990 380 /* throw (type-list) */
51dc6603
JM
381 write_string ("Dw");
382 for (tree t = spec; t; t = TREE_CHAIN (t))
383 write_type (TREE_VALUE (t));
384 write_char ('E');
385 }
386}
387
1f6e1acc
AS
388/* Both decls and types can be substitution candidates, but sometimes
389 they refer to the same thing. For instance, a TYPE_DECL and
390 RECORD_TYPE for the same class refer to the same thing, and should
34cd5ae7 391 be treated accordingly in substitutions. This function returns a
1f6e1acc
AS
392 canonicalized tree node representing NODE that is used when adding
393 and substitution candidates and finding matches. */
394
395static inline tree
89aec4b1 396canonicalize_for_substitution (tree node)
1f6e1acc
AS
397{
398 /* For a TYPE_DECL, use the type instead. */
399 if (TREE_CODE (node) == TYPE_DECL)
400 node = TREE_TYPE (node);
cd41d410
DS
401 if (TYPE_P (node)
402 && TYPE_CANONICAL (node) != node
403 && TYPE_MAIN_VARIANT (node) != node)
8caa8b65 404 {
e0f0935b 405 tree orig = node;
cd41d410
DS
406 /* Here we want to strip the topmost typedef only.
407 We need to do that so is_std_substitution can do proper
408 name matching. */
8caa8b65
JM
409 if (TREE_CODE (node) == FUNCTION_TYPE)
410 /* Use build_qualified_type and TYPE_QUALS here to preserve
411 the old buggy mangling of attribute noreturn with abi<5. */
412 node = build_qualified_type (TYPE_MAIN_VARIANT (node),
413 TYPE_QUALS (node));
414 else
415 node = cp_build_qualified_type (TYPE_MAIN_VARIANT (node),
416 cp_type_quals (node));
7bdc7e06 417 if (FUNC_OR_METHOD_TYPE_P (node))
51dc6603
JM
418 {
419 node = build_ref_qualified_type (node, type_memfn_rqual (orig));
420 tree r = canonical_eh_spec (TYPE_RAISES_EXCEPTIONS (orig));
421 if (flag_noexcept_type)
422 node = build_exception_variant (node, r);
423 else
424 /* Set the warning flag if appropriate. */
425 write_exception_spec (r);
426 }
8caa8b65 427 }
1f6e1acc
AS
428 return node;
429}
430
431/* Add NODE as a substitution candidate. NODE must not already be on
432 the list of candidates. */
433
434static void
89aec4b1 435add_substitution (tree node)
1f6e1acc
AS
436{
437 tree c;
438
439 if (DEBUG_MANGLE)
c8094d83 440 fprintf (stderr, " ++ add_substitution (%s at %10p)\n",
5806f481 441 get_tree_code_name (TREE_CODE (node)), (void *) node);
1f6e1acc
AS
442
443 /* Get the canonicalized substitution candidate for NODE. */
444 c = canonicalize_for_substitution (node);
445 if (DEBUG_MANGLE && c != node)
446 fprintf (stderr, " ++ using candidate (%s at %10p)\n",
5806f481 447 get_tree_code_name (TREE_CODE (node)), (void *) node);
1f6e1acc
AS
448 node = c;
449
1f6e1acc 450 /* Make sure NODE isn't already a candidate. */
595278be
MM
451 if (flag_checking)
452 {
453 int i;
454 tree candidate;
455
456 FOR_EACH_VEC_SAFE_ELT (G.substitutions, i, candidate)
457 {
458 gcc_assert (!(DECL_P (node) && node == candidate));
459 gcc_assert (!(TYPE_P (node) && TYPE_P (candidate)
8dc2b103 460 && same_type_p (node, candidate)));
595278be
MM
461 }
462 }
1f6e1acc
AS
463
464 /* Put the decl onto the varray of substitution candidates. */
9771b263 465 vec_safe_push (G.substitutions, node);
1f6e1acc
AS
466
467 if (DEBUG_MANGLE)
468 dump_substitution_candidates ();
469}
470
838dfd8a 471/* Helper function for find_substitution. Returns nonzero if NODE,
1f6e1acc
AS
472 which may be a decl or a CLASS_TYPE, is a template-id with template
473 name of substitution_index[INDEX] in the ::std namespace. */
474
c8094d83 475static inline int
89aec4b1
NN
476is_std_substitution (const tree node,
477 const substitution_identifier_index_t index)
1f6e1acc
AS
478{
479 tree type = NULL;
480 tree decl = NULL;
481
482 if (DECL_P (node))
483 {
484 type = TREE_TYPE (node);
485 decl = node;
486 }
487 else if (CLASS_TYPE_P (node))
488 {
489 type = node;
490 decl = TYPE_NAME (node);
491 }
c8094d83 492 else
1f6e1acc
AS
493 /* These are not the droids you're looking for. */
494 return 0;
495
459c43ad 496 return (DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))
c8094d83 497 && TYPE_LANG_SPECIFIC (type)
6397d80b 498 && TYPE_TEMPLATE_INFO (type)
c8094d83 499 && (DECL_NAME (TYPE_TI_TEMPLATE (type))
459c43ad 500 == subst_identifiers[index]));
1f6e1acc
AS
501}
502
884929e2
JM
503/* Return the ABI tags (the TREE_VALUE of the "abi_tag" attribute entry) for T,
504 which can be a decl or type. */
505
506static tree
507get_abi_tags (tree t)
508{
509 if (!t || TREE_CODE (t) == NAMESPACE_DECL)
510 return NULL_TREE;
511
512 if (DECL_P (t) && DECL_DECLARES_TYPE_P (t))
513 t = TREE_TYPE (t);
514
515 tree attrs;
516 if (TYPE_P (t))
517 attrs = TYPE_ATTRIBUTES (t);
518 else
519 attrs = DECL_ATTRIBUTES (t);
520
521 tree tags = lookup_attribute ("abi_tag", attrs);
522 if (tags)
523 tags = TREE_VALUE (tags);
524 return tags;
525}
526
838dfd8a 527/* Helper function for find_substitution. Returns nonzero if NODE,
1f6e1acc
AS
528 which may be a decl or a CLASS_TYPE, is the template-id
529 ::std::identifier<char>, where identifier is
530 substitution_index[INDEX]. */
531
532static inline int
89aec4b1
NN
533is_std_substitution_char (const tree node,
534 const substitution_identifier_index_t index)
1f6e1acc
AS
535{
536 tree args;
537 /* Check NODE's name is ::std::identifier. */
538 if (!is_std_substitution (node, index))
539 return 0;
540 /* Figure out its template args. */
541 if (DECL_P (node))
c8094d83 542 args = DECL_TI_ARGS (node);
1f6e1acc
AS
543 else if (CLASS_TYPE_P (node))
544 args = CLASSTYPE_TI_ARGS (node);
545 else
546 /* Oops, not a template. */
547 return 0;
548 /* NODE's template arg list should be <char>. */
c8094d83 549 return
1f6e1acc
AS
550 TREE_VEC_LENGTH (args) == 1
551 && TREE_VEC_ELT (args, 0) == char_type_node;
552}
553
554/* Check whether a substitution should be used to represent NODE in
555 the mangling.
556
557 First, check standard special-case substitutions.
558
c8094d83 559 <substitution> ::= St
0cbd7506 560 # ::std
1f6e1acc 561
0cbd7506 562 ::= Sa
1f6e1acc
AS
563 # ::std::allocator
564
0cbd7506
MS
565 ::= Sb
566 # ::std::basic_string
1f6e1acc 567
0cbd7506
MS
568 ::= Ss
569 # ::std::basic_string<char,
1f6e1acc
AS
570 ::std::char_traits<char>,
571 ::std::allocator<char> >
572
0cbd7506
MS
573 ::= Si
574 # ::std::basic_istream<char, ::std::char_traits<char> >
1f6e1acc 575
0cbd7506
MS
576 ::= So
577 # ::std::basic_ostream<char, ::std::char_traits<char> >
1f6e1acc 578
0cbd7506
MS
579 ::= Sd
580 # ::std::basic_iostream<char, ::std::char_traits<char> >
1f6e1acc
AS
581
582 Then examine the stack of currently available substitution
583 candidates for entities appearing earlier in the same mangling
584
585 If a substitution is found, write its mangled representation and
838dfd8a 586 return nonzero. If none is found, just return zero. */
1f6e1acc
AS
587
588static int
89aec4b1 589find_substitution (tree node)
1f6e1acc
AS
590{
591 int i;
9771b263 592 const int size = vec_safe_length (G.substitutions);
1f6e1acc
AS
593 tree decl;
594 tree type;
00eaaa50 595 const char *abbr = NULL;
1f6e1acc
AS
596
597 if (DEBUG_MANGLE)
598 fprintf (stderr, " ++ find_substitution (%s at %p)\n",
5806f481 599 get_tree_code_name (TREE_CODE (node)), (void *) node);
1f6e1acc
AS
600
601 /* Obtain the canonicalized substitution representation for NODE.
602 This is what we'll compare against. */
603 node = canonicalize_for_substitution (node);
604
605 /* Check for builtin substitutions. */
606
607 decl = TYPE_P (node) ? TYPE_NAME (node) : node;
608 type = TYPE_P (node) ? node : TREE_TYPE (node);
609
610 /* Check for std::allocator. */
c8094d83 611 if (decl
459c43ad
MM
612 && is_std_substitution (decl, SUBID_ALLOCATOR)
613 && !CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl)))
00eaaa50 614 abbr = "Sa";
1f6e1acc
AS
615
616 /* Check for std::basic_string. */
00eaaa50 617 else if (decl && is_std_substitution (decl, SUBID_BASIC_STRING))
1f6e1acc 618 {
82a362d0 619 if (TYPE_P (node))
1f6e1acc 620 {
c8094d83
MS
621 /* If this is a type (i.e. a fully-qualified template-id),
622 check for
0cbd7506
MS
623 std::basic_string <char,
624 std::char_traits<char>,
1f6e1acc 625 std::allocator<char> > . */
89d684bb 626 if (cp_type_quals (type) == TYPE_UNQUALIFIED
1f6e1acc
AS
627 && CLASSTYPE_USE_TEMPLATE (type))
628 {
629 tree args = CLASSTYPE_TI_ARGS (type);
630 if (TREE_VEC_LENGTH (args) == 3
bece74bd 631 && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
1f6e1acc
AS
632 && is_std_substitution_char (TREE_VEC_ELT (args, 1),
633 SUBID_CHAR_TRAITS)
634 && is_std_substitution_char (TREE_VEC_ELT (args, 2),
635 SUBID_ALLOCATOR))
00eaaa50 636 abbr = "Ss";
1f6e1acc
AS
637 }
638 }
639 else
640 /* Substitute for the template name only if this isn't a type. */
00eaaa50 641 abbr = "Sb";
1f6e1acc
AS
642 }
643
644 /* Check for basic_{i,o,io}stream. */
00eaaa50
JM
645 else if (TYPE_P (node)
646 && cp_type_quals (type) == TYPE_UNQUALIFIED
647 && CLASS_TYPE_P (type)
648 && CLASSTYPE_USE_TEMPLATE (type)
649 && CLASSTYPE_TEMPLATE_INFO (type) != NULL)
1f6e1acc 650 {
c8094d83 651 /* First, check for the template
1f6e1acc
AS
652 args <char, std::char_traits<char> > . */
653 tree args = CLASSTYPE_TI_ARGS (type);
654 if (TREE_VEC_LENGTH (args) == 2
6df5158a 655 && TYPE_P (TREE_VEC_ELT (args, 0))
bece74bd 656 && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
1f6e1acc
AS
657 && is_std_substitution_char (TREE_VEC_ELT (args, 1),
658 SUBID_CHAR_TRAITS))
659 {
660 /* Got them. Is this basic_istream? */
3beac910 661 if (is_std_substitution (decl, SUBID_BASIC_ISTREAM))
00eaaa50 662 abbr = "Si";
1f6e1acc 663 /* Or basic_ostream? */
3beac910 664 else if (is_std_substitution (decl, SUBID_BASIC_OSTREAM))
00eaaa50 665 abbr = "So";
1f6e1acc 666 /* Or basic_iostream? */
3beac910 667 else if (is_std_substitution (decl, SUBID_BASIC_IOSTREAM))
00eaaa50 668 abbr = "Sd";
1f6e1acc
AS
669 }
670 }
671
672 /* Check for namespace std. */
00eaaa50 673 else if (decl && DECL_NAMESPACE_STD_P (decl))
1f6e1acc
AS
674 {
675 write_string ("St");
676 return 1;
677 }
678
00eaaa50 679 tree tags = NULL_TREE;
cbe4c88c 680 if (OVERLOAD_TYPE_P (node) || DECL_CLASS_TEMPLATE_P (node))
884929e2 681 tags = get_abi_tags (type);
1f6e1acc 682 /* Now check the list of available substitutions for this mangling
c6002625 683 operation. */
00eaaa50 684 if (!abbr || tags) for (i = 0; i < size; ++i)
1f6e1acc 685 {
9771b263 686 tree candidate = (*G.substitutions)[i];
1f6e1acc
AS
687 /* NODE is a matched to a candidate if it's the same decl node or
688 if it's the same type. */
689 if (decl == candidate
b34e0e6f 690 || (TYPE_P (candidate) && type && TYPE_P (node)
1f6e1acc
AS
691 && same_type_p (type, candidate))
692 || NESTED_TEMPLATE_MATCH (node, candidate))
693 {
694 write_substitution (i);
695 return 1;
696 }
697 }
698
00eaaa50
JM
699 if (!abbr)
700 /* No substitution found. */
701 return 0;
702
703 write_string (abbr);
704 if (tags)
705 {
706 /* If there are ABI tags on the abbreviation, it becomes
707 a substitution candidate. */
708 write_abi_tags (tags);
709 add_substitution (node);
710 }
711 return 1;
1f6e1acc
AS
712}
713
7cb73573
JM
714/* Returns whether DECL's symbol name should be the plain unqualified-id
715 rather than a more complicated mangled name. */
716
717static bool
718unmangled_name_p (const tree decl)
719{
720 if (TREE_CODE (decl) == FUNCTION_DECL)
721 {
722 /* The names of `extern "C"' functions are not mangled. */
723 return (DECL_EXTERN_C_FUNCTION_P (decl)
724 /* But overloaded operator names *are* mangled. */
725 && !DECL_OVERLOADED_OPERATOR_P (decl));
726 }
727 else if (VAR_P (decl))
728 {
729 /* static variables are mangled. */
730 if (!DECL_EXTERNAL_LINKAGE_P (decl))
731 return false;
732
733 /* extern "C" declarations aren't mangled. */
734 if (DECL_EXTERN_C_P (decl))
735 return true;
736
737 /* Other variables at non-global scope are mangled. */
738 if (CP_DECL_CONTEXT (decl) != global_namespace)
739 return false;
740
741 /* Variable template instantiations are mangled. */
742 if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
743 && variable_template_p (DECL_TI_TEMPLATE (decl)))
744 return false;
745
746 /* Declarations with ABI tags are mangled. */
884929e2 747 if (get_abi_tags (decl))
7cb73573
JM
748 return false;
749
750 /* The names of non-static global variables aren't mangled. */
751 return true;
752 }
753
754 return false;
755}
1f6e1acc 756
5fd80fbc
NS
757/* TOP_LEVEL is true, if this is being called at outermost level of
758 mangling. It should be false when mangling a decl appearing in an
759 expression within some other mangling.
c8094d83 760
5fd80fbc 761 <mangled-name> ::= _Z <encoding> */
1f6e1acc 762
965514bd 763static void
5fd80fbc 764write_mangled_name (const tree decl, bool top_level)
1f6e1acc
AS
765{
766 MANGLE_TRACE_TREE ("mangled-name", decl);
767
7cb73573 768 check_abi_tags (decl);
c8094d83 769
7cb73573
JM
770 if (unmangled_name_p (decl))
771 {
5fd80fbc
NS
772 if (top_level)
773 write_string (IDENTIFIER_POINTER (DECL_NAME (decl)));
774 else
775 {
776 /* The standard notes: "The <encoding> of an extern "C"
0cbd7506
MS
777 function is treated like global-scope data, i.e. as its
778 <source-name> without a type." We cannot write
779 overloaded operators that way though, because it contains
780 characters invalid in assembler. */
90d84934 781 write_string ("_Z");
5fd80fbc
NS
782 write_source_name (DECL_NAME (decl));
783 }
784 }
1f6e1acc 785 else
1f6e1acc
AS
786 {
787 write_string ("_Z");
788 write_encoding (decl);
789 }
790}
791
7cb73573
JM
792/* Returns true if the return type of DECL is part of its signature, and
793 therefore its mangling. */
794
795bool
796mangle_return_type_p (tree decl)
797{
798 return (!DECL_CONSTRUCTOR_P (decl)
799 && !DECL_DESTRUCTOR_P (decl)
800 && !DECL_CONV_FN_P (decl)
801 && decl_is_template_id (decl, NULL));
802}
803
1f6e1acc 804/* <encoding> ::= <function name> <bare-function-type>
bece74bd 805 ::= <data name> */
1f6e1acc
AS
806
807static void
89aec4b1 808write_encoding (const tree decl)
1f6e1acc
AS
809{
810 MANGLE_TRACE_TREE ("encoding", decl);
811
1f6e1acc
AS
812 if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
813 {
324ffb8c
JJ
814 /* For overloaded operators write just the mangled name
815 without arguments. */
816 if (DECL_OVERLOADED_OPERATOR_P (decl))
817 write_name (decl, /*ignore_local_scope=*/0);
818 else
819 write_source_name (DECL_NAME (decl));
1f6e1acc
AS
820 return;
821 }
822
f0f33848 823 write_name (decl, /*ignore_local_scope=*/0);
1f6e1acc
AS
824 if (TREE_CODE (decl) == FUNCTION_DECL)
825 {
826 tree fn_type;
4a5e0ed9 827 tree d;
51dc6603 828 bool tmpl = decl_is_template_id (decl, NULL);
1f6e1acc 829
51dc6603 830 if (tmpl)
4a5e0ed9
MM
831 {
832 fn_type = get_mostly_instantiated_function_type (decl);
833 /* FN_TYPE will not have parameter types for in-charge or
834 VTT parameters. Therefore, we pass NULL_TREE to
835 write_bare_function_type -- otherwise, it will get
836 confused about which artificial parameters to skip. */
837 d = NULL_TREE;
838 }
1f6e1acc 839 else
4a5e0ed9
MM
840 {
841 fn_type = TREE_TYPE (decl);
842 d = decl;
843 }
1f6e1acc 844
c8094d83 845 write_bare_function_type (fn_type,
7cb73573 846 mangle_return_type_p (decl),
4a5e0ed9 847 d);
1f6e1acc 848 }
1f6e1acc
AS
849}
850
d5f4eddd
JM
851/* Lambdas can have a bit more context for mangling, specifically VAR_DECL
852 or PARM_DECL context, which doesn't belong in DECL_CONTEXT. */
853
854static tree
855decl_mangling_context (tree decl)
856{
5b880ea6
RO
857 tree tcontext = targetm.cxx.decl_mangling_context (decl);
858
859 if (tcontext != NULL_TREE)
860 return tcontext;
861
cae7c960
JM
862 if (TREE_CODE (decl) == TEMPLATE_DECL
863 && DECL_TEMPLATE_RESULT (decl))
864 decl = DECL_TEMPLATE_RESULT (decl);
865
d5f4eddd
JM
866 if (TREE_CODE (decl) == TYPE_DECL
867 && LAMBDA_TYPE_P (TREE_TYPE (decl)))
868 {
869 tree extra = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl));
870 if (extra)
871 return extra;
872 }
6602e109 873 else if (template_type_parameter_p (decl))
e96ce650
DS
874 /* template type parms have no mangling context. */
875 return NULL_TREE;
b3f44388
JJ
876
877 tcontext = CP_DECL_CONTEXT (decl);
878
879 /* Ignore the artificial declare reduction functions. */
880 if (tcontext
881 && TREE_CODE (tcontext) == FUNCTION_DECL
882 && DECL_OMP_DECLARE_REDUCTION_P (tcontext))
883 return decl_mangling_context (tcontext);
884
885 return tcontext;
d5f4eddd
JM
886}
887
1f6e1acc 888/* <name> ::= <unscoped-name>
0cbd7506 889 ::= <unscoped-template-name> <template-args>
1f6e1acc 890 ::= <nested-name>
c8094d83 891 ::= <local-name>
f0f33848 892
838dfd8a 893 If IGNORE_LOCAL_SCOPE is nonzero, this production of <name> is
f0f33848
AS
894 called from <local-name>, which mangles the enclosing scope
895 elsewhere and then uses this function to mangle just the part
896 underneath the function scope. So don't use the <local-name>
897 production, to avoid an infinite recursion. */
1f6e1acc
AS
898
899static void
89aec4b1 900write_name (tree decl, const int ignore_local_scope)
1f6e1acc 901{
82a362d0
CS
902 tree context;
903
1f6e1acc
AS
904 MANGLE_TRACE_TREE ("name", decl);
905
722bed0f
AS
906 if (TREE_CODE (decl) == TYPE_DECL)
907 {
908 /* In case this is a typedef, fish out the corresponding
909 TYPE_DECL for the main variant. */
910 decl = TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl)));
722bed0f 911 }
d5f4eddd
JM
912
913 context = decl_mangling_context (decl);
61e6d522 914
88e594b6
JM
915 gcc_assert (context != NULL_TREE);
916
a75f1574 917 if (abi_warn_or_compat_version_crosses (7)
62984918
JM
918 && ignore_local_scope
919 && TREE_CODE (context) == PARM_DECL)
920 G.need_abi_warning = 1;
921
beac9b93
AS
922 /* A decl in :: or ::std scope is treated specially. The former is
923 mangled using <unscoped-name> or <unscoped-template-name>, the
924 latter with a special substitution. Also, a name that is
925 directly in a local function scope is also mangled with
926 <unscoped-name> rather than a full <nested-name>. */
88e594b6 927 if (context == global_namespace
beac9b93 928 || DECL_NAMESPACE_STD_P (context)
622aac0b
JM
929 || (ignore_local_scope
930 && (TREE_CODE (context) == FUNCTION_DECL
931 || (abi_version_at_least (7)
932 && TREE_CODE (context) == PARM_DECL))))
1f6e1acc 933 {
722bed0f
AS
934 tree template_info;
935 /* Is this a template instance? */
936 if (decl_is_template_id (decl, &template_info))
1f6e1acc 937 {
722bed0f
AS
938 /* Yes: use <unscoped-template-name>. */
939 write_unscoped_template_name (TI_TEMPLATE (template_info));
940 write_template_args (TI_ARGS (template_info));
1f6e1acc
AS
941 }
942 else
943 /* Everything else gets an <unqualified-name>. */
944 write_unscoped_name (decl);
945 }
1f6e1acc 946 else
f0f33848
AS
947 {
948 /* Handle local names, unless we asked not to (that is, invoked
0cbd7506
MS
949 under <local-name>, to handle only the part of the name under
950 the local scope). */
f0f33848 951 if (!ignore_local_scope)
0cbd7506 952 {
f0f33848
AS
953 /* Scan up the list of scope context, looking for a
954 function. If we find one, this entity is in local
955 function scope. local_entity tracks context one scope
956 level down, so it will contain the element that's
957 directly in that function's scope, either decl or one of
958 its enclosing scopes. */
959 tree local_entity = decl;
88e594b6 960 while (context != global_namespace)
f0f33848
AS
961 {
962 /* Make sure we're always dealing with decls. */
88e594b6 963 if (TYPE_P (context))
f0f33848
AS
964 context = TYPE_NAME (context);
965 /* Is this a function? */
d5f4eddd
JM
966 if (TREE_CODE (context) == FUNCTION_DECL
967 || TREE_CODE (context) == PARM_DECL)
f0f33848
AS
968 {
969 /* Yes, we have local scope. Use the <local-name>
970 production for the innermost function scope. */
971 write_local_name (context, local_entity, decl);
972 return;
973 }
974 /* Up one scope level. */
975 local_entity = context;
d5f4eddd 976 context = decl_mangling_context (context);
f0f33848
AS
977 }
978
979 /* No local scope found? Fall through to <nested-name>. */
980 }
981
982 /* Other decls get a <nested-name> to encode their scope. */
983 write_nested_name (decl);
984 }
1f6e1acc
AS
985}
986
987/* <unscoped-name> ::= <unqualified-name>
0cbd7506 988 ::= St <unqualified-name> # ::std:: */
1f6e1acc
AS
989
990static void
89aec4b1 991write_unscoped_name (const tree decl)
1f6e1acc 992{
5b880ea6 993 tree context = decl_mangling_context (decl);
1f6e1acc
AS
994
995 MANGLE_TRACE_TREE ("unscoped-name", decl);
996
997 /* Is DECL in ::std? */
998 if (DECL_NAMESPACE_STD_P (context))
999 {
1000 write_string ("St");
1001 write_unqualified_name (decl);
1002 }
8dc2b103
NS
1003 else
1004 {
1005 /* If not, it should be either in the global namespace, or directly
88e594b6
JM
1006 in a local function scope. A lambda can also be mangled in the
1007 scope of a default argument. */
c8094d83 1008 gcc_assert (context == global_namespace
88e594b6 1009 || TREE_CODE (context) == PARM_DECL
8dc2b103 1010 || TREE_CODE (context) == FUNCTION_DECL);
c8094d83 1011
8dc2b103
NS
1012 write_unqualified_name (decl);
1013 }
1f6e1acc
AS
1014}
1015
1016/* <unscoped-template-name> ::= <unscoped-name>
0cbd7506 1017 ::= <substitution> */
1f6e1acc
AS
1018
1019static void
89aec4b1 1020write_unscoped_template_name (const tree decl)
1f6e1acc
AS
1021{
1022 MANGLE_TRACE_TREE ("unscoped-template-name", decl);
1023
1024 if (find_substitution (decl))
1025 return;
1026 write_unscoped_name (decl);
1027 add_substitution (decl);
1028}
1029
1030/* Write the nested name, including CV-qualifiers, of DECL.
1031
e0f0935b
JM
1032 <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1033 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1f6e1acc 1034
e0f0935b
JM
1035 <ref-qualifier> ::= R # & ref-qualifier
1036 ::= O # && ref-qualifier
1f6e1acc
AS
1037 <CV-qualifiers> ::= [r] [V] [K] */
1038
1039static void
89aec4b1 1040write_nested_name (const tree decl)
1f6e1acc 1041{
722bed0f
AS
1042 tree template_info;
1043
1f6e1acc
AS
1044 MANGLE_TRACE_TREE ("nested-name", decl);
1045
1046 write_char ('N');
c8094d83 1047
1f6e1acc 1048 /* Write CV-qualifiers, if this is a member function. */
c8094d83 1049 if (TREE_CODE (decl) == FUNCTION_DECL
1f6e1acc
AS
1050 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
1051 {
1052 if (DECL_VOLATILE_MEMFUNC_P (decl))
1053 write_char ('V');
1054 if (DECL_CONST_MEMFUNC_P (decl))
1055 write_char ('K');
e0f0935b
JM
1056 if (FUNCTION_REF_QUALIFIED (TREE_TYPE (decl)))
1057 {
1058 if (FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
1059 write_char ('O');
1060 else
1061 write_char ('R');
1062 }
1f6e1acc
AS
1063 }
1064
722bed0f
AS
1065 /* Is this a template instance? */
1066 if (decl_is_template_id (decl, &template_info))
1f6e1acc 1067 {
722bed0f 1068 /* Yes, use <template-prefix>. */
1f6e1acc 1069 write_template_prefix (decl);
722bed0f 1070 write_template_args (TI_ARGS (template_info));
1f6e1acc 1071 }
a03c9bf1 1072 else if ((!abi_version_at_least (10) || TREE_CODE (decl) == TYPE_DECL)
d15364ce 1073 && TREE_CODE (TREE_TYPE (decl)) == TYPENAME_TYPE)
38179091
JM
1074 {
1075 tree name = TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl));
1076 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1077 {
1078 write_template_prefix (decl);
1079 write_template_args (TREE_OPERAND (name, 1));
1080 }
1081 else
1082 {
dd94dde7 1083 write_prefix (decl_mangling_context (decl));
38179091
JM
1084 write_unqualified_name (decl);
1085 }
1086 }
1f6e1acc
AS
1087 else
1088 {
722bed0f 1089 /* No, just use <prefix> */
b34e0e6f 1090 write_prefix (decl_mangling_context (decl));
f0f33848 1091 write_unqualified_name (decl);
1f6e1acc
AS
1092 }
1093 write_char ('E');
1094}
1095
6397d80b 1096/* <prefix> ::= <prefix> <unqualified-name>
0cbd7506
MS
1097 ::= <template-param>
1098 ::= <template-prefix> <template-args>
4bbff96e 1099 ::= <decltype>
1f6e1acc
AS
1100 ::= # empty
1101 ::= <substitution> */
1102
1103static void
89aec4b1 1104write_prefix (const tree node)
1f6e1acc
AS
1105{
1106 tree decl;
722bed0f
AS
1107 /* Non-NULL if NODE represents a template-id. */
1108 tree template_info = NULL;
1109
1f6e1acc
AS
1110 if (node == NULL
1111 || node == global_namespace)
1112 return;
1113
d5f4eddd
JM
1114 MANGLE_TRACE_TREE ("prefix", node);
1115
4bbff96e
JM
1116 if (TREE_CODE (node) == DECLTYPE_TYPE)
1117 {
1118 write_type (node);
1119 return;
1120 }
1121
1f6e1acc
AS
1122 if (find_substitution (node))
1123 return;
1124
722bed0f 1125 if (DECL_P (node))
1f6e1acc 1126 {
d5f4eddd 1127 /* If this is a function or parm decl, that means we've hit function
f0f33848
AS
1128 scope, so this prefix must be for a local name. In this
1129 case, we're under the <local-name> production, which encodes
1130 the enclosing function scope elsewhere. So don't continue
1131 here. */
d5f4eddd
JM
1132 if (TREE_CODE (node) == FUNCTION_DECL
1133 || TREE_CODE (node) == PARM_DECL)
f0f33848
AS
1134 return;
1135
722bed0f
AS
1136 decl = node;
1137 decl_is_template_id (decl, &template_info);
1f6e1acc 1138 }
722bed0f 1139 else
722bed0f 1140 {
6397d80b 1141 /* Node is a type. */
722bed0f
AS
1142 decl = TYPE_NAME (node);
1143 if (CLASSTYPE_TEMPLATE_ID_P (node))
6397d80b 1144 template_info = TYPE_TEMPLATE_INFO (node);
722bed0f
AS
1145 }
1146
90d84934 1147 if (TREE_CODE (node) == TEMPLATE_TYPE_PARM)
6397d80b
MM
1148 write_template_param (node);
1149 else if (template_info != NULL)
722bed0f 1150 /* Templated. */
1f6e1acc 1151 {
722bed0f
AS
1152 write_template_prefix (decl);
1153 write_template_args (TI_ARGS (template_info));
1f6e1acc 1154 }
38179091
JM
1155 else if (TREE_CODE (TREE_TYPE (decl)) == TYPENAME_TYPE)
1156 {
1157 tree name = TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl));
1158 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1159 {
1160 write_template_prefix (decl);
1161 write_template_args (TREE_OPERAND (name, 1));
1162 }
1163 else
1164 {
dd94dde7 1165 write_prefix (decl_mangling_context (decl));
38179091
JM
1166 write_unqualified_name (decl);
1167 }
1168 }
1f6e1acc
AS
1169 else
1170 /* Not templated. */
1171 {
d5f4eddd 1172 write_prefix (decl_mangling_context (decl));
f0f33848 1173 write_unqualified_name (decl);
5a6ccc94 1174 if (VAR_P (decl)
d5f4eddd
JM
1175 || TREE_CODE (decl) == FIELD_DECL)
1176 {
1177 /* <data-member-prefix> := <member source-name> M */
1178 write_char ('M');
1179 return;
1180 }
1f6e1acc
AS
1181 }
1182
1183 add_substitution (node);
1184}
1185
1186/* <template-prefix> ::= <prefix> <template component>
0cbd7506
MS
1187 ::= <template-param>
1188 ::= <substitution> */
1f6e1acc
AS
1189
1190static void
89aec4b1 1191write_template_prefix (const tree node)
1f6e1acc
AS
1192{
1193 tree decl = DECL_P (node) ? node : TYPE_NAME (node);
1194 tree type = DECL_P (node) ? TREE_TYPE (node) : node;
dd94dde7 1195 tree context = decl_mangling_context (decl);
722bed0f 1196 tree template_info;
be93747e 1197 tree templ;
1f6e1acc
AS
1198 tree substitution;
1199
1200 MANGLE_TRACE_TREE ("template-prefix", node);
1201
1202 /* Find the template decl. */
722bed0f 1203 if (decl_is_template_id (decl, &template_info))
be93747e 1204 templ = TI_TEMPLATE (template_info);
38179091
JM
1205 else if (TREE_CODE (type) == TYPENAME_TYPE)
1206 /* For a typename type, all we have is the name. */
1207 templ = DECL_NAME (decl);
1f6e1acc 1208 else
8dc2b103
NS
1209 {
1210 gcc_assert (CLASSTYPE_TEMPLATE_ID_P (type));
c8094d83 1211
be93747e 1212 templ = TYPE_TI_TEMPLATE (type);
8dc2b103 1213 }
1f6e1acc 1214
459c43ad
MM
1215 /* For a member template, though, the template name for the
1216 innermost name must have all the outer template levels
1217 instantiated. For instance, consider
1218
1219 template<typename T> struct Outer {
1220 template<typename U> struct Inner {};
1221 };
1222
1223 The template name for `Inner' in `Outer<int>::Inner<float>' is
1224 `Outer<int>::Inner<U>'. In g++, we don't instantiate the template
1225 levels separately, so there's no TEMPLATE_DECL available for this
1226 (there's only `Outer<T>::Inner<U>').
1227
1228 In order to get the substitutions right, we create a special
1229 TREE_LIST to represent the substitution candidate for a nested
1230 template. The TREE_PURPOSE is the template's context, fully
1231 instantiated, and the TREE_VALUE is the TEMPLATE_DECL for the inner
1232 template.
1233
1234 So, for the example above, `Outer<int>::Inner' is represented as a
1235 substitution candidate by a TREE_LIST whose purpose is `Outer<int>'
1236 and whose value is `Outer<T>::Inner<U>'. */
e7fc41a7 1237 if (context && TYPE_P (context))
be93747e 1238 substitution = build_tree_list (context, templ);
459c43ad 1239 else
be93747e 1240 substitution = templ;
1f6e1acc
AS
1241
1242 if (find_substitution (substitution))
1243 return;
1244
38179091 1245 if (TREE_TYPE (templ)
90d84934 1246 && TREE_CODE (TREE_TYPE (templ)) == TEMPLATE_TEMPLATE_PARM)
be93747e 1247 write_template_param (TREE_TYPE (templ));
6397d80b
MM
1248 else
1249 {
1250 write_prefix (context);
1251 write_unqualified_name (decl);
1252 }
1f6e1acc
AS
1253
1254 add_substitution (substitution);
1255}
1256
70356f77
JJ
1257/* As the list of identifiers for the structured binding declaration
1258 DECL is likely gone, try to recover the DC <source-name>+ E portion
1259 from its mangled name. Return pointer to the DC and set len to
1260 the length up to and including the terminating E. On failure
1261 return NULL. */
1262
1263static const char *
1264find_decomp_unqualified_name (tree decl, size_t *len)
1265{
1266 const char *p = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1267 const char *end = p + IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl));
1268 bool nested = false;
1269 if (strncmp (p, "_Z", 2))
1270 return NULL;
1271 p += 2;
1272 if (!strncmp (p, "St", 2))
1273 p += 2;
1274 else if (*p == 'N')
1275 {
1276 nested = true;
1277 ++p;
1278 while (ISDIGIT (p[0]))
1279 {
1280 char *e;
1281 long num = strtol (p, &e, 10);
1282 if (num >= 1 && num < end - e)
1283 p = e + num;
1284 else
1285 break;
1286 }
1287 }
1288 if (strncmp (p, "DC", 2))
1289 return NULL;
1290 if (nested)
1291 {
1292 if (end[-1] != 'E')
1293 return NULL;
1294 --end;
1295 }
1296 if (end[-1] != 'E')
1297 return NULL;
1298 *len = end - p;
1299 return p;
1300}
1301
1f6e1acc 1302/* We don't need to handle thunks, vtables, or VTTs here. Those are
c8094d83 1303 mangled through special entry points.
1f6e1acc
AS
1304
1305 <unqualified-name> ::= <operator-name>
c8094d83 1306 ::= <special-name>
a2aa65f0 1307 ::= <source-name>
d5f4eddd 1308 ::= <unnamed-type-name>
a2aa65f0
GK
1309 ::= <local-source-name>
1310
1311 <local-source-name> ::= L <source-name> <discriminator> */
1f6e1acc 1312
f000c6a7
JM
1313static void
1314write_unqualified_id (tree identifier)
1315{
84c0088f 1316 if (IDENTIFIER_CONV_OP_P (identifier))
f000c6a7 1317 write_conversion_operator_name (TREE_TYPE (identifier));
183e687a 1318 else if (IDENTIFIER_OVL_OP_P (identifier))
f000c6a7 1319 {
d6dd9d7f
NS
1320 const ovl_op_info_t *ovl_op = IDENTIFIER_OVL_OP_INFO (identifier);
1321 write_string (ovl_op->mangled_name);
f000c6a7 1322 }
3ce4f9e4
ESR
1323 else if (UDLIT_OPER_P (identifier))
1324 write_literal_operator_name (identifier);
f000c6a7
JM
1325 else
1326 write_source_name (identifier);
1327}
1328
1f6e1acc 1329static void
2982147e 1330write_unqualified_name (tree decl)
1f6e1acc
AS
1331{
1332 MANGLE_TRACE_TREE ("unqualified-name", decl);
1333
9dc6f476 1334 if (identifier_p (decl))
f000c6a7
JM
1335 {
1336 write_unqualified_id (decl);
1337 return;
1338 }
1339
7dbb85a7
JM
1340 bool found = false;
1341
b97e8a14 1342 if (DECL_NAME (decl) == NULL_TREE)
b87d79e6 1343 {
7dbb85a7 1344 found = true;
b87d79e6 1345 gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
70356f77
JJ
1346 const char *decomp_str = NULL;
1347 size_t decomp_len = 0;
1348 if (VAR_P (decl)
1349 && DECL_DECOMPOSITION_P (decl)
1350 && DECL_NAME (decl) == NULL_TREE
1351 && DECL_NAMESPACE_SCOPE_P (decl))
1352 decomp_str = find_decomp_unqualified_name (decl, &decomp_len);
1353 if (decomp_str)
1354 write_chars (decomp_str, decomp_len);
1355 else
1356 write_source_name (DECL_ASSEMBLER_NAME (decl));
b87d79e6 1357 }
b97e8a14 1358 else if (DECL_DECLARES_FUNCTION_P (decl))
1f6e1acc 1359 {
7dbb85a7 1360 found = true;
b97e8a14
JM
1361 if (DECL_CONSTRUCTOR_P (decl))
1362 write_special_name_constructor (decl);
1363 else if (DECL_DESTRUCTOR_P (decl))
1364 write_special_name_destructor (decl);
1365 else if (DECL_CONV_FN_P (decl))
83b14b88 1366 {
b97e8a14
JM
1367 /* Conversion operator. Handle it right here.
1368 <operator> ::= cv <type> */
1369 tree type;
1370 if (decl_is_template_id (decl, NULL))
1371 {
1372 tree fn_type;
1373 fn_type = get_mostly_instantiated_function_type (decl);
1374 type = TREE_TYPE (fn_type);
1375 }
2e5e7103 1376 else if (FNDECL_USED_AUTO (decl))
5345ac5a 1377 type = DECL_SAVED_AUTO_RETURN_TYPE (decl);
b97e8a14
JM
1378 else
1379 type = DECL_CONV_FN_TYPE (decl);
1380 write_conversion_operator_name (type);
1381 }
1382 else if (DECL_OVERLOADED_OPERATOR_P (decl))
1383 {
88a819be 1384 const char *mangled_name
ce121158
NS
1385 = (ovl_op_info[DECL_ASSIGNMENT_OPERATOR_P (decl)]
1386 [DECL_OVERLOADED_OPERATOR_CODE_RAW (decl)].mangled_name);
88a819be 1387 write_string (mangled_name);
83b14b88 1388 }
3ce4f9e4
ESR
1389 else if (UDLIT_OPER_P (DECL_NAME (decl)))
1390 write_literal_operator_name (DECL_NAME (decl));
83b14b88 1391 else
b97e8a14 1392 found = false;
1f6e1acc 1393 }
b97e8a14 1394
7dbb85a7
JM
1395 if (found)
1396 /* OK */;
1397 else if (VAR_OR_FUNCTION_DECL_P (decl) && ! TREE_PUBLIC (decl)
1398 && DECL_NAMESPACE_SCOPE_P (decl)
1399 && decl_linkage (decl) == lk_internal)
a2aa65f0
GK
1400 {
1401 MANGLE_TRACE_TREE ("local-source-name", decl);
1402 write_char ('L');
1403 write_source_name (DECL_NAME (decl));
1404 /* The default discriminator is 1, and that's all we ever use,
1405 so there's no code to output one here. */
1406 }
1f6e1acc 1407 else
d5f4eddd
JM
1408 {
1409 tree type = TREE_TYPE (decl);
1410
1411 if (TREE_CODE (decl) == TYPE_DECL
6a7b9203 1412 && TYPE_UNNAMED_P (type))
d5f4eddd
JM
1413 write_unnamed_type_name (type);
1414 else if (TREE_CODE (decl) == TYPE_DECL
1415 && LAMBDA_TYPE_P (type))
1416 write_closure_type_name (type);
1417 else
1418 write_source_name (DECL_NAME (decl));
1419 }
7dbb85a7 1420
7ab8c647 1421 /* We use the ABI tags from the primary class template, ignoring tags on any
2982147e 1422 specializations. This is necessary because C++ doesn't require a
7ab8c647
JM
1423 specialization to be declared before it is used unless the use requires a
1424 complete type, but we need to get the tags right on incomplete types as
1425 well. */
2982147e 1426 if (tree tmpl = most_general_template (decl))
7ab8c647
JM
1427 {
1428 tree res = DECL_TEMPLATE_RESULT (tmpl);
1429 if (res == NULL_TREE)
1430 /* UNBOUND_CLASS_TEMPLATE. */;
1431 else if (DECL_DECLARES_TYPE_P (decl))
1432 decl = res;
1433 else if (any_abi_below (11))
1434 {
1435 /* ABI v10 implicit tags on the template. */
1436 tree mtags = missing_abi_tags (res);
1437 /* Explicit tags on the template. */
1438 tree ttags = get_abi_tags (res);
1439 /* Tags on the instantiation. */
1440 tree dtags = get_abi_tags (decl);
1441
1442 if (mtags && abi_warn_or_compat_version_crosses (10))
1443 G.need_abi_warning = 1;
1444
1445 /* Add the v10 tags to the explicit tags now. */
1446 mtags = chainon (mtags, ttags);
1447
1448 if (!G.need_abi_warning
1449 && abi_warn_or_compat_version_crosses (11)
1450 && !equal_abi_tags (dtags, mtags))
1451 G.need_abi_warning = 1;
1452
1453 if (!abi_version_at_least (10))
1454 /* In abi <10, we only got the explicit tags. */
1455 decl = res;
1456 else if (flag_abi_version == 10)
1457 {
1458 /* In ABI 10, we want explict and implicit tags. */
1459 write_abi_tags (mtags);
1460 return;
1461 }
1462 }
1463 }
1464
1465 tree tags = get_abi_tags (decl);
d676d623
JM
1466 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CONV_FN_P (decl)
1467 && any_abi_below (11))
1468 if (tree mtags = missing_abi_tags (decl))
1469 {
1470 if (abi_warn_or_compat_version_crosses (11))
1471 G.need_abi_warning = true;
1472 if (!abi_version_at_least (11))
1473 tags = chainon (mtags, tags);
1474 }
7ab8c647 1475 write_abi_tags (tags);
1f6e1acc
AS
1476}
1477
3fa3c4bd
MM
1478/* Write the unqualified-name for a conversion operator to TYPE. */
1479
1480static void
89aec4b1 1481write_conversion_operator_name (const tree type)
3fa3c4bd
MM
1482{
1483 write_string ("cv");
1484 write_type (type);
1485}
1486
c8094d83 1487/* Non-terminal <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
1f6e1acc
AS
1488
1489 <source-name> ::= </length/ number> <identifier> */
1490
1491static void
89aec4b1 1492write_source_name (tree identifier)
1f6e1acc
AS
1493{
1494 MANGLE_TRACE_TREE ("source-name", identifier);
1495
82a362d0 1496 write_unsigned_number (IDENTIFIER_LENGTH (identifier));
1f6e1acc
AS
1497 write_identifier (IDENTIFIER_POINTER (identifier));
1498}
1499
7dbb85a7
JM
1500/* Compare two TREE_STRINGs like strcmp. */
1501
1502int
1503tree_string_cmp (const void *p1, const void *p2)
1504{
1505 if (p1 == p2)
1506 return 0;
1507 tree s1 = *(const tree*)p1;
1508 tree s2 = *(const tree*)p2;
1509 return strcmp (TREE_STRING_POINTER (s1),
1510 TREE_STRING_POINTER (s2));
1511}
1512
7ab8c647 1513/* Return the TREE_LIST of TAGS as a sorted VEC. */
7dbb85a7 1514
7ab8c647
JM
1515static vec<tree, va_gc> *
1516sorted_abi_tags (tree tags)
7dbb85a7 1517{
9771b263 1518 vec<tree, va_gc> * vec = make_tree_vector();
7dbb85a7
JM
1519
1520 for (tree t = tags; t; t = TREE_CHAIN (t))
1521 {
f585f02f
JM
1522 if (ABI_TAG_IMPLICIT (t))
1523 continue;
7dbb85a7 1524 tree str = TREE_VALUE (t);
9771b263 1525 vec_safe_push (vec, str);
7dbb85a7
JM
1526 }
1527
9771b263 1528 vec->qsort (tree_string_cmp);
7dbb85a7 1529
7ab8c647
JM
1530 return vec;
1531}
1532
1533/* ID is the name of a function or type with abi_tags attribute TAGS.
1534 Write out the name, suitably decorated. */
1535
1536static void
1537write_abi_tags (tree tags)
1538{
1539 if (tags == NULL_TREE)
1540 return;
1541
1542 vec<tree, va_gc> * vec = sorted_abi_tags (tags);
1543
7dbb85a7 1544 unsigned i; tree str;
9771b263 1545 FOR_EACH_VEC_ELT (*vec, i, str)
7dbb85a7
JM
1546 {
1547 write_string ("B");
1548 write_unsigned_number (TREE_STRING_LENGTH (str) - 1);
1549 write_identifier (TREE_STRING_POINTER (str));
1550 }
1551
1552 release_tree_vector (vec);
1553}
1554
7ab8c647
JM
1555/* True iff the TREE_LISTS T1 and T2 of ABI tags are equivalent. */
1556
1557static bool
1558equal_abi_tags (tree t1, tree t2)
1559{
1560 releasing_vec v1 = sorted_abi_tags (t1);
1561 releasing_vec v2 = sorted_abi_tags (t2);
1562
1563 unsigned len1 = v1->length();
1564 if (len1 != v2->length())
1565 return false;
1566 for (unsigned i = 0; i < len1; ++i)
1567 if (tree_string_cmp (v1[i], v2[i]) != 0)
1568 return false;
1569 return true;
1570}
1571
3ce4f9e4 1572/* Write a user-defined literal operator.
5ceb809d 1573 ::= li <source-name> # "" <source-name>
3ce4f9e4
ESR
1574 IDENTIFIER is an LITERAL_IDENTIFIER_NODE. */
1575
1576static void
1577write_literal_operator_name (tree identifier)
1578{
1579 const char* suffix = UDLIT_OP_SUFFIX (identifier);
5ceb809d
JM
1580 write_identifier (UDLIT_OP_MANGLED_PREFIX);
1581 write_unsigned_number (strlen (suffix));
1582 write_identifier (suffix);
3ce4f9e4
ESR
1583}
1584
d5f4eddd
JM
1585/* Encode 0 as _, and 1+ as n-1_. */
1586
1587static void
1588write_compact_number (int num)
1589{
1590 if (num > 0)
1591 write_unsigned_number (num - 1);
1592 write_char ('_');
1593}
1594
3930dbe9
JM
1595/* Return how many unnamed types precede TYPE in its enclosing class. */
1596
1597static int
1598nested_anon_class_index (tree type)
1599{
1600 int index = 0;
1601 tree member = TYPE_FIELDS (TYPE_CONTEXT (type));
910ad8de 1602 for (; member; member = DECL_CHAIN (member))
3930dbe9
JM
1603 if (DECL_IMPLICIT_TYPEDEF_P (member))
1604 {
1605 tree memtype = TREE_TYPE (member);
1606 if (memtype == type)
1607 return index;
6a7b9203 1608 else if (TYPE_UNNAMED_P (memtype))
3930dbe9
JM
1609 ++index;
1610 }
1611
7c5b407f
AO
1612 if (seen_error ())
1613 return -1;
1614
3930dbe9
JM
1615 gcc_unreachable ();
1616}
1617
1618/* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
1619
d5f4eddd 1620static void
12308bc6 1621write_unnamed_type_name (const tree type)
d5f4eddd 1622{
3930dbe9 1623 int discriminator;
d5f4eddd
JM
1624 MANGLE_TRACE_TREE ("unnamed-type-name", type);
1625
3930dbe9 1626 if (TYPE_FUNCTION_SCOPE_P (type))
41f927f4 1627 discriminator = discriminator_for_local_entity (TYPE_NAME (type));
3930dbe9
JM
1628 else if (TYPE_CLASS_SCOPE_P (type))
1629 discriminator = nested_anon_class_index (type);
1630 else
1631 {
1632 gcc_assert (no_linkage_check (type, /*relaxed_p=*/true));
1633 /* Just use the old mangling at namespace scope. */
1634 write_source_name (TYPE_IDENTIFIER (type));
1635 return;
1636 }
1637
d5f4eddd 1638 write_string ("Ut");
3930dbe9 1639 write_compact_number (discriminator);
d5f4eddd
JM
1640}
1641
1642/* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
1643 <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters */
1644
1645static void
1646write_closure_type_name (const tree type)
1647{
1648 tree fn = lambda_function (type);
1649 tree lambda = CLASSTYPE_LAMBDA_EXPR (type);
1650 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
1651
1652 MANGLE_TRACE_TREE ("closure-type-name", type);
1653
1654 write_string ("Ul");
c6be04ad 1655 write_method_parms (parms, /*method_p=*/1, fn);
d5f4eddd
JM
1656 write_char ('E');
1657 write_compact_number (LAMBDA_EXPR_DISCRIMINATOR (lambda));
1658}
1659
0576ec13
NS
1660/* Convert NUMBER to ascii using base BASE and generating at least
1661 MIN_DIGITS characters. BUFFER points to the _end_ of the buffer
1662 into which to store the characters. Returns the number of
c65cb8d1 1663 characters generated (these will be laid out in advance of where
0576ec13
NS
1664 BUFFER points). */
1665
1666static int
89aec4b1
NN
1667hwint_to_ascii (unsigned HOST_WIDE_INT number, const unsigned int base,
1668 char *buffer, const unsigned int min_digits)
0576ec13
NS
1669{
1670 static const char base_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
1671 unsigned digits = 0;
c8094d83 1672
0576ec13
NS
1673 while (number)
1674 {
1675 unsigned HOST_WIDE_INT d = number / base;
c8094d83 1676
0576ec13
NS
1677 *--buffer = base_digits[number - d * base];
1678 digits++;
1679 number = d;
1680 }
1681 while (digits < min_digits)
1682 {
1683 *--buffer = base_digits[0];
1684 digits++;
1685 }
1686 return digits;
1687}
1688
1f6e1acc
AS
1689/* Non-terminal <number>.
1690
1691 <number> ::= [n] </decimal integer/> */
1692
1693static void
89aec4b1
NN
1694write_number (unsigned HOST_WIDE_INT number, const int unsigned_p,
1695 const unsigned int base)
1f6e1acc 1696{
0576ec13
NS
1697 char buffer[sizeof (HOST_WIDE_INT) * 8];
1698 unsigned count = 0;
1f6e1acc 1699
82a362d0 1700 if (!unsigned_p && (HOST_WIDE_INT) number < 0)
1f6e1acc
AS
1701 {
1702 write_char ('n');
82a362d0 1703 number = -((HOST_WIDE_INT) number);
1f6e1acc 1704 }
0576ec13
NS
1705 count = hwint_to_ascii (number, base, buffer + sizeof (buffer), 1);
1706 write_chars (buffer + sizeof (buffer) - count, count);
1f6e1acc
AS
1707}
1708
0576ec13
NS
1709/* Write out an integral CST in decimal. Most numbers are small, and
1710 representable in a HOST_WIDE_INT. Occasionally we'll have numbers
c6002625 1711 bigger than that, which we must deal with. */
1f6e1acc
AS
1712
1713static inline void
89aec4b1 1714write_integer_cst (const tree cst)
1f6e1acc 1715{
0576ec13 1716 int sign = tree_int_cst_sgn (cst);
807e902e
KZ
1717 widest_int abs_value = wi::abs (wi::to_widest (cst));
1718 if (!wi::fits_uhwi_p (abs_value))
82a362d0 1719 {
0576ec13 1720 /* A bignum. We do this in chunks, each of which fits in a
c6002625 1721 HOST_WIDE_INT. */
0576ec13
NS
1722 char buffer[sizeof (HOST_WIDE_INT) * 8 * 2];
1723 unsigned HOST_WIDE_INT chunk;
1724 unsigned chunk_digits;
1725 char *ptr = buffer + sizeof (buffer);
1726 unsigned count = 0;
1727 tree n, base, type;
1728 int done;
1729
1730 /* HOST_WIDE_INT must be at least 32 bits, so 10^9 is
c6002625 1731 representable. */
0576ec13
NS
1732 chunk = 1000000000;
1733 chunk_digits = 9;
c8094d83 1734
0576ec13
NS
1735 if (sizeof (HOST_WIDE_INT) >= 8)
1736 {
c6002625 1737 /* It is at least 64 bits, so 10^18 is representable. */
0576ec13
NS
1738 chunk_digits = 18;
1739 chunk *= chunk;
1740 }
c8094d83 1741
ceef8ce4 1742 type = c_common_signed_or_unsigned_type (1, TREE_TYPE (cst));
7d60be94 1743 base = build_int_cstu (type, chunk);
8e6cdc90 1744 n = wide_int_to_tree (type, wi::to_wide (cst));
0576ec13
NS
1745
1746 if (sign < 0)
1747 {
1748 write_char ('n');
db3927fb 1749 n = fold_build1_loc (input_location, NEGATE_EXPR, type, n);
0576ec13
NS
1750 }
1751 do
1752 {
db3927fb
AH
1753 tree d = fold_build2_loc (input_location, FLOOR_DIV_EXPR, type, n, base);
1754 tree tmp = fold_build2_loc (input_location, MULT_EXPR, type, d, base);
0576ec13 1755 unsigned c;
89aec4b1 1756
0576ec13 1757 done = integer_zerop (d);
db3927fb 1758 tmp = fold_build2_loc (input_location, MINUS_EXPR, type, n, tmp);
0576ec13 1759 c = hwint_to_ascii (TREE_INT_CST_LOW (tmp), 10, ptr,
f293ce4b 1760 done ? 1 : chunk_digits);
0576ec13
NS
1761 ptr -= c;
1762 count += c;
1763 n = d;
1764 }
1765 while (!done);
1766 write_chars (ptr, count);
1767 }
c8094d83 1768 else
0576ec13
NS
1769 {
1770 /* A small num. */
0576ec13 1771 if (sign < 0)
807e902e
KZ
1772 write_char ('n');
1773 write_unsigned_number (abs_value.to_uhwi ());
82a362d0 1774 }
1f6e1acc
AS
1775}
1776
c8094d83
MS
1777/* Write out a floating-point literal.
1778
94d3ea58
ZW
1779 "Floating-point literals are encoded using the bit pattern of the
1780 target processor's internal representation of that number, as a
1781 fixed-length lowercase hexadecimal string, high-order bytes first
1782 (even if the target processor would store low-order bytes first).
1783 The "n" prefix is not used for floating-point literals; the sign
1784 bit is encoded with the rest of the number.
1785
1786 Here are some examples, assuming the IEEE standard representation
1787 for floating point numbers. (Spaces are for readability, not
1788 part of the encoding.)
1789
0cbd7506
MS
1790 1.0f Lf 3f80 0000 E
1791 -1.0f Lf bf80 0000 E
1792 1.17549435e-38f Lf 0080 0000 E
1793 1.40129846e-45f Lf 0000 0001 E
1794 0.0f Lf 0000 0000 E"
94d3ea58
ZW
1795
1796 Caller is responsible for the Lx and the E. */
1797static void
89aec4b1 1798write_real_cst (const tree value)
94d3ea58 1799{
90d84934 1800 long target_real[4]; /* largest supported float */
3d7b83b6
MS
1801 /* Buffer for eight hex digits in a 32-bit number but big enough
1802 even for 64-bit long to avoid warnings. */
1803 char buffer[17];
90d84934
JM
1804 int i, limit, dir;
1805
1806 tree type = TREE_TYPE (value);
b5f2d801 1807 int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)) / 32;
90d84934
JM
1808
1809 real_to_target (target_real, &TREE_REAL_CST (value),
1810 TYPE_MODE (type));
1811
1812 /* The value in target_real is in the target word order,
1813 so we must write it out backward if that happens to be
1814 little-endian. write_number cannot be used, it will
1815 produce uppercase. */
1816 if (FLOAT_WORDS_BIG_ENDIAN)
1817 i = 0, limit = words, dir = 1;
94d3ea58 1818 else
90d84934
JM
1819 i = words - 1, limit = -1, dir = -1;
1820
1821 for (; i != limit; i += dir)
94d3ea58 1822 {
90d84934
JM
1823 sprintf (buffer, "%08lx", (unsigned long) target_real[i]);
1824 write_chars (buffer, 8);
94d3ea58
ZW
1825 }
1826}
1827
1f6e1acc
AS
1828/* Non-terminal <identifier>.
1829
1830 <identifier> ::= </unqualified source code identifier> */
1831
1832static void
89aec4b1 1833write_identifier (const char *identifier)
1f6e1acc
AS
1834{
1835 MANGLE_TRACE ("identifier", identifier);
1836 write_string (identifier);
1837}
1838
1839/* Handle constructor productions of non-terminal <special-name>.
c8094d83 1840 CTOR is a constructor FUNCTION_DECL.
1f6e1acc
AS
1841
1842 <special-name> ::= C1 # complete object constructor
0cbd7506
MS
1843 ::= C2 # base object constructor
1844 ::= C3 # complete object allocating constructor
1f6e1acc 1845
1f26ac87 1846 Currently, allocating constructors are never used. */
1f6e1acc
AS
1847
1848static void
89aec4b1 1849write_special_name_constructor (const tree ctor)
1f6e1acc 1850{
31f7f784
JM
1851 write_char ('C');
1852 bool new_inh = (flag_new_inheriting_ctors
1853 && DECL_INHERITED_CTOR (ctor));
1854 if (new_inh)
1855 write_char ('I');
8dc2b103 1856 if (DECL_BASE_CONSTRUCTOR_P (ctor))
31f7f784 1857 write_char ('2');
1f26ac87
JM
1858 /* This is the old-style "[unified]" constructor.
1859 In some cases, we may emit this function and call
1860 it from the clones in order to share code and save space. */
1861 else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (ctor))
31f7f784 1862 write_char ('4');
657c130a 1863 else
8dc2b103 1864 {
1f26ac87 1865 gcc_assert (DECL_COMPLETE_CONSTRUCTOR_P (ctor));
31f7f784 1866 write_char ('1');
8dc2b103 1867 }
31f7f784
JM
1868 if (new_inh)
1869 write_type (DECL_INHERITED_CTOR_BASE (ctor));
1f6e1acc
AS
1870}
1871
1872/* Handle destructor productions of non-terminal <special-name>.
c8094d83 1873 DTOR is a destructor FUNCTION_DECL.
1f6e1acc
AS
1874
1875 <special-name> ::= D0 # deleting (in-charge) destructor
0cbd7506 1876 ::= D1 # complete object (in-charge) destructor
1f26ac87 1877 ::= D2 # base object (not-in-charge) destructor */
1f6e1acc
AS
1878
1879static void
89aec4b1 1880write_special_name_destructor (const tree dtor)
1f6e1acc
AS
1881{
1882 if (DECL_DELETING_DESTRUCTOR_P (dtor))
1883 write_string ("D0");
1f6e1acc
AS
1884 else if (DECL_BASE_DESTRUCTOR_P (dtor))
1885 write_string ("D2");
1f26ac87
JM
1886 else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor))
1887 /* This is the old-style "[unified]" destructor.
1888 In some cases, we may emit this function and call
1889 it from the clones in order to share code and save space. */
1890 write_string ("D4");
657c130a 1891 else
8dc2b103 1892 {
1f26ac87 1893 gcc_assert (DECL_COMPLETE_DESTRUCTOR_P (dtor));
8dc2b103
NS
1894 write_string ("D1");
1895 }
1f6e1acc
AS
1896}
1897
1898/* Return the discriminator for ENTITY appearing inside
41f927f4
NS
1899 FUNCTION. The discriminator is the lexical ordinal of VAR or TYPE among
1900 entities with the same name and kind in the same FUNCTION. */
1f6e1acc
AS
1901
1902static int
89aec4b1 1903discriminator_for_local_entity (tree entity)
1f6e1acc 1904{
41f927f4 1905 if (!DECL_LANG_SPECIFIC (entity))
3930dbe9 1906 {
41f927f4
NS
1907 /* Some decls, like __FUNCTION__, don't need a discriminator. */
1908 gcc_checking_assert (DECL_ARTIFICIAL (entity));
1909 return 0;
c8094d83 1910 }
41f927f4
NS
1911 else if (tree disc = DECL_DISCRIMINATOR (entity))
1912 return TREE_INT_CST_LOW (disc);
3930dbe9 1913 else
41f927f4
NS
1914 /* The first entity with a particular name doesn't get
1915 DECL_DISCRIMINATOR set up. */
1916 return 0;
1f6e1acc
AS
1917}
1918
1919/* Return the discriminator for STRING, a string literal used inside
cd0be382 1920 FUNCTION. The discriminator is the lexical ordinal of STRING among
1f6e1acc
AS
1921 string literals used in FUNCTION. */
1922
1923static int
12308bc6
PC
1924discriminator_for_string_literal (tree /*function*/,
1925 tree /*string*/)
1f6e1acc
AS
1926{
1927 /* For now, we don't discriminate amongst string literals. */
1928 return 0;
1929}
1930
f6efea51
MT
1931/* <discriminator> := _ <number> # when number < 10
1932 := __ <number> _ # when number >= 10
1f6e1acc
AS
1933
1934 The discriminator is used only for the second and later occurrences
1935 of the same name within a single function. In this case <number> is
1936 n - 2, if this is the nth occurrence, in lexical order. */
1937
1938static void
89aec4b1 1939write_discriminator (const int discriminator)
1f6e1acc 1940{
c6002625 1941 /* If discriminator is zero, don't write anything. Otherwise... */
1f6e1acc
AS
1942 if (discriminator > 0)
1943 {
1944 write_char ('_');
0c6299bb 1945 if (discriminator - 1 >= 10)
f6efea51 1946 {
f6efea51
MT
1947 if (abi_warn_or_compat_version_crosses (11))
1948 G.need_abi_warning = 1;
0c6299bb
MT
1949 if (abi_version_at_least (11))
1950 write_char ('_');
f6efea51 1951 }
f1a0345c 1952 write_unsigned_number (discriminator - 1);
f6efea51
MT
1953 if (abi_version_at_least (11) && discriminator - 1 >= 10)
1954 write_char ('_');
1f6e1acc
AS
1955 }
1956}
1957
1958/* Mangle the name of a function-scope entity. FUNCTION is the
d5f4eddd
JM
1959 FUNCTION_DECL for the enclosing function, or a PARM_DECL for lambdas in
1960 default argument scope. ENTITY is the decl for the entity itself.
1961 LOCAL_ENTITY is the entity that's directly scoped in FUNCTION_DECL,
1962 either ENTITY itself or an enclosing scope of ENTITY.
1f6e1acc
AS
1963
1964 <local-name> := Z <function encoding> E <entity name> [<discriminator>]
d5f4eddd
JM
1965 := Z <function encoding> E s [<discriminator>]
1966 := Z <function encoding> Ed [ <parameter number> ] _ <entity name> */
1f6e1acc
AS
1967
1968static void
d5f4eddd 1969write_local_name (tree function, const tree local_entity,
89aec4b1 1970 const tree entity)
1f6e1acc 1971{
d5f4eddd
JM
1972 tree parm = NULL_TREE;
1973
1f6e1acc
AS
1974 MANGLE_TRACE_TREE ("local-name", entity);
1975
d5f4eddd
JM
1976 if (TREE_CODE (function) == PARM_DECL)
1977 {
1978 parm = function;
1979 function = DECL_CONTEXT (parm);
1980 }
1981
1f6e1acc
AS
1982 write_char ('Z');
1983 write_encoding (function);
1984 write_char ('E');
d5f4eddd
JM
1985
1986 /* For this purpose, parameters are numbered from right-to-left. */
1987 if (parm)
1988 {
1989 tree t;
1990 int i = 0;
910ad8de 1991 for (t = DECL_ARGUMENTS (function); t; t = DECL_CHAIN (t))
d5f4eddd
JM
1992 {
1993 if (t == parm)
1994 i = 1;
1995 else if (i)
1996 ++i;
1997 }
1998 write_char ('d');
1999 write_compact_number (i - 1);
2000 }
2001
1f6e1acc
AS
2002 if (TREE_CODE (entity) == STRING_CST)
2003 {
2004 write_char ('s');
c8094d83 2005 write_discriminator (discriminator_for_string_literal (function,
1f6e1acc
AS
2006 entity));
2007 }
2008 else
2009 {
f0f33848
AS
2010 /* Now the <entity name>. Let write_name know its being called
2011 from <local-name>, so it doesn't try to process the enclosing
2012 function scope again. */
2013 write_name (entity, /*ignore_local_scope=*/1);
41f927f4
NS
2014 if (DECL_DISCRIMINATOR_P (local_entity)
2015 && !(TREE_CODE (local_entity) == TYPE_DECL
ca3edeae 2016 && TYPE_ANON_P (TREE_TYPE (local_entity))))
41f927f4 2017 write_discriminator (discriminator_for_local_entity (local_entity));
1f6e1acc
AS
2018 }
2019}
2020
c8094d83 2021/* Non-terminals <type> and <CV-qualifier>.
1f6e1acc
AS
2022
2023 <type> ::= <builtin-type>
0cbd7506
MS
2024 ::= <function-type>
2025 ::= <class-enum-type>
2026 ::= <array-type>
2027 ::= <pointer-to-member-type>
2028 ::= <template-param>
2029 ::= <substitution>
2030 ::= <CV-qualifier>
2031 ::= P <type> # pointer-to
2032 ::= R <type> # reference-to
2033 ::= C <type> # complex pair (C 2000)
2034 ::= G <type> # imaginary (C 2000) [not supported]
2035 ::= U <source-name> <type> # vendor extended type qualifier
1f6e1acc 2036
8af2fec4
RY
2037 C++0x extensions
2038
2039 <type> ::= RR <type> # rvalue reference-to
3ad6a8e1
DG
2040 <type> ::= Dt <expression> # decltype of an id-expression or
2041 # class member access
2042 <type> ::= DT <expression> # decltype of an expression
14c2101d 2043 <type> ::= Dn # decltype of nullptr
8af2fec4 2044
1f6e1acc
AS
2045 TYPE is a type node. */
2046
c8094d83 2047static void
89aec4b1 2048write_type (tree type)
1f6e1acc 2049{
838dfd8a 2050 /* This gets set to nonzero if TYPE turns out to be a (possibly
1f6e1acc
AS
2051 CV-qualified) builtin type. */
2052 int is_builtin_type = 0;
2053
2054 MANGLE_TRACE_TREE ("type", type);
2055
04f3dc2b
MM
2056 if (type == error_mark_node)
2057 return;
2058
8caa8b65 2059 type = canonicalize_for_substitution (type);
1f6e1acc
AS
2060 if (find_substitution (type))
2061 return;
c8094d83 2062
ebf0bf7f 2063
1f6e1acc
AS
2064 if (write_CV_qualifiers_for_type (type) > 0)
2065 /* If TYPE was CV-qualified, we just wrote the qualifiers; now
2066 mangle the unqualified type. The recursive call is needed here
34cd5ae7 2067 since both the qualified and unqualified types are substitution
1f6e1acc 2068 candidates. */
e0f0935b
JM
2069 {
2070 tree t = TYPE_MAIN_VARIANT (type);
603eaec4 2071 if (TYPE_ATTRIBUTES (t) && !OVERLOAD_TYPE_P (t))
b8fd7909
JM
2072 {
2073 tree attrs = NULL_TREE;
2074 if (tx_safe_fn_type_p (type))
2075 attrs = tree_cons (get_identifier ("transaction_safe"),
2076 NULL_TREE, attrs);
2077 t = cp_build_type_attribute_variant (t, attrs);
2078 }
603eaec4 2079 gcc_assert (t != type);
7bdc7e06 2080 if (FUNC_OR_METHOD_TYPE_P (t))
0861bec8
JM
2081 {
2082 t = build_ref_qualified_type (t, type_memfn_rqual (type));
cc14602e
JM
2083 if (flag_noexcept_type)
2084 {
2085 tree r = TYPE_RAISES_EXCEPTIONS (type);
2086 t = build_exception_variant (t, r);
2087 }
603eaec4
JM
2088 if (abi_version_at_least (8)
2089 || type == TYPE_MAIN_VARIANT (type))
0861bec8
JM
2090 /* Avoid adding the unqualified function type as a substitution. */
2091 write_function_type (t);
2092 else
2093 write_type (t);
a75f1574 2094 if (abi_warn_or_compat_version_crosses (8))
62984918 2095 G.need_abi_warning = 1;
0861bec8
JM
2096 }
2097 else
2098 write_type (t);
e0f0935b 2099 }
b970a21d
MM
2100 else if (TREE_CODE (type) == ARRAY_TYPE)
2101 /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here
2102 so that the cv-qualification of the element type is available
2103 in write_array_type. */
2104 write_array_type (type);
1f6e1acc 2105 else
82a362d0 2106 {
608063c3
JB
2107 tree type_orig = type;
2108
82a362d0
CS
2109 /* See through any typedefs. */
2110 type = TYPE_MAIN_VARIANT (type);
7bdc7e06 2111 if (FUNC_OR_METHOD_TYPE_P (type))
403f22aa 2112 type = cxx_copy_lang_qualifiers (type, type_orig);
82a362d0 2113
ac6fb7a4
JJ
2114 /* According to the C++ ABI, some library classes are passed the
2115 same as the scalar type of their single member and use the same
2116 mangling. */
2117 if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
2118 type = TREE_TYPE (first_field (type));
2119
66b1156a 2120 if (TYPE_PTRDATAMEM_P (type))
8d245821 2121 write_pointer_to_member_type (type);
608063c3
JB
2122 else
2123 {
f18eca82
ZL
2124 /* Handle any target-specific fundamental types. */
2125 const char *target_mangling
608063c3 2126 = targetm.mangle_type (type_orig);
f18eca82
ZL
2127
2128 if (target_mangling)
2129 {
2130 write_string (target_mangling);
3852d2be
MM
2131 /* Add substitutions for types other than fundamental
2132 types. */
50e10fa8 2133 if (!VOID_TYPE_P (type)
3852d2be
MM
2134 && TREE_CODE (type) != INTEGER_TYPE
2135 && TREE_CODE (type) != REAL_TYPE
2136 && TREE_CODE (type) != BOOLEAN_TYPE)
2137 add_substitution (type);
f18eca82
ZL
2138 return;
2139 }
2140
608063c3
JB
2141 switch (TREE_CODE (type))
2142 {
2143 case VOID_TYPE:
2144 case BOOLEAN_TYPE:
2145 case INTEGER_TYPE: /* Includes wchar_t. */
2146 case REAL_TYPE:
07523e7c 2147 case FIXED_POINT_TYPE:
608063c3
JB
2148 {
2149 /* If this is a typedef, TYPE may not be one of
2150 the standard builtin type nodes, but an alias of one. Use
2151 TYPE_MAIN_VARIANT to get to the underlying builtin type. */
2152 write_builtin_type (TYPE_MAIN_VARIANT (type));
2153 ++is_builtin_type;
2154 }
2155 break;
2156
2157 case COMPLEX_TYPE:
2158 write_char ('C');
2159 write_type (TREE_TYPE (type));
2160 break;
2161
2162 case FUNCTION_TYPE:
2163 case METHOD_TYPE:
2164 write_function_type (type);
2165 break;
2166
2167 case UNION_TYPE:
2168 case RECORD_TYPE:
2169 case ENUMERAL_TYPE:
2170 /* A pointer-to-member function is represented as a special
2171 RECORD_TYPE, so check for this first. */
2172 if (TYPE_PTRMEMFUNC_P (type))
2173 write_pointer_to_member_type (type);
2174 else
2175 write_class_enum_type (type);
2176 break;
2177
2178 case TYPENAME_TYPE:
2179 case UNBOUND_CLASS_TEMPLATE:
2180 /* We handle TYPENAME_TYPEs and UNBOUND_CLASS_TEMPLATEs like
2181 ordinary nested names. */
2182 write_nested_name (TYPE_STUB_DECL (type));
2183 break;
2184
2185 case POINTER_TYPE:
608063c3 2186 case REFERENCE_TYPE:
50e10fa8 2187 if (TYPE_PTR_P (type))
27062604
JM
2188 write_char ('P');
2189 else if (TYPE_REF_IS_RVALUE (type))
2190 write_char ('O');
1ab28be5
DG
2191 else
2192 write_char ('R');
27062604
JM
2193 {
2194 tree target = TREE_TYPE (type);
2195 /* Attribute const/noreturn are not reflected in mangling.
2196 We strip them here rather than at a lower level because
2197 a typedef or template argument can have function type
2198 with function-cv-quals (that use the same representation),
2199 but you can't have a pointer/reference to such a type. */
62984918
JM
2200 if (TREE_CODE (target) == FUNCTION_TYPE)
2201 {
a75f1574 2202 if (abi_warn_or_compat_version_crosses (5)
62984918
JM
2203 && TYPE_QUALS (target) != TYPE_UNQUALIFIED)
2204 G.need_abi_warning = 1;
2205 if (abi_version_at_least (5))
2206 target = build_qualified_type (target, TYPE_UNQUALIFIED);
2207 }
27062604
JM
2208 write_type (target);
2209 }
608063c3
JB
2210 break;
2211
2212 case TEMPLATE_TYPE_PARM:
c19267cb
JM
2213 if (is_auto (type))
2214 {
a7ddca92
JM
2215 if (AUTO_IS_DECLTYPE (type))
2216 write_identifier ("Dc");
2217 else
2218 write_identifier ("Da");
c19267cb
JM
2219 ++is_builtin_type;
2220 break;
2221 }
191816a3 2222 /* fall through. */
608063c3
JB
2223 case TEMPLATE_PARM_INDEX:
2224 write_template_param (type);
2225 break;
2226
2227 case TEMPLATE_TEMPLATE_PARM:
2228 write_template_template_param (type);
2229 break;
2230
2231 case BOUND_TEMPLATE_TEMPLATE_PARM:
2232 write_template_template_param (type);
2233 write_template_args
2234 (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type)));
2235 break;
2236
2237 case VECTOR_TYPE:
abfe01ce
JM
2238 if (abi_version_at_least (4))
2239 {
2240 write_string ("Dv");
2241 /* Non-constant vector size would be encoded with
2242 _ expression, but we don't support that yet. */
928686b1
RS
2243 write_unsigned_number (TYPE_VECTOR_SUBPARTS (type)
2244 .to_constant ());
abfe01ce
JM
2245 write_char ('_');
2246 }
2247 else
62984918 2248 write_string ("U8__vector");
a75f1574 2249 if (abi_warn_or_compat_version_crosses (4))
62984918 2250 G.need_abi_warning = 1;
608063c3
JB
2251 write_type (TREE_TYPE (type));
2252 break;
2253
2254 case TYPE_PACK_EXPANSION:
38179091 2255 write_string ("Dp");
608063c3
JB
2256 write_type (PACK_EXPANSION_PATTERN (type));
2257 break;
2258
3ad6a8e1 2259 case DECLTYPE_TYPE:
d5f4eddd
JM
2260 /* These shouldn't make it into mangling. */
2261 gcc_assert (!DECLTYPE_FOR_LAMBDA_CAPTURE (type)
9b8662c2 2262 && !DECLTYPE_FOR_LAMBDA_PROXY (type));
d5f4eddd 2263
55af847f 2264 /* In ABI <5, we stripped decltype of a plain decl. */
62984918 2265 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type))
67e18edb
JM
2266 {
2267 tree expr = DECLTYPE_TYPE_EXPR (type);
2268 tree etype = NULL_TREE;
2269 switch (TREE_CODE (expr))
2270 {
2271 case VAR_DECL:
2272 case PARM_DECL:
2273 case RESULT_DECL:
2274 case FUNCTION_DECL:
2275 case CONST_DECL:
2276 case TEMPLATE_PARM_INDEX:
2277 etype = TREE_TYPE (expr);
2278 break;
2279
2280 default:
2281 break;
2282 }
2283
2284 if (etype && !type_uses_auto (etype))
2285 {
a75f1574 2286 if (abi_warn_or_compat_version_crosses (5))
62984918
JM
2287 G.need_abi_warning = 1;
2288 if (!abi_version_at_least (5))
2289 {
2290 write_type (etype);
2291 return;
2292 }
67e18edb
JM
2293 }
2294 }
2295
3ad6a8e1
DG
2296 write_char ('D');
2297 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type))
2298 write_char ('t');
2299 else
2300 write_char ('T');
7d882b83 2301 ++cp_unevaluated_operand;
3ad6a8e1 2302 write_expression (DECLTYPE_TYPE_EXPR (type));
7d882b83 2303 --cp_unevaluated_operand;
3ad6a8e1
DG
2304 write_char ('E');
2305 break;
2306
1e85e720
RG
2307 case NULLPTR_TYPE:
2308 write_string ("Dn");
a3ddb738
JM
2309 if (abi_version_at_least (7))
2310 ++is_builtin_type;
a75f1574 2311 if (abi_warn_or_compat_version_crosses (7))
62984918 2312 G.need_abi_warning = 1;
1e85e720
RG
2313 break;
2314
231d0665 2315 case TYPEOF_TYPE:
a9c697b8 2316 sorry ("mangling %<typeof%>, use %<decltype%> instead");
231d0665
JM
2317 break;
2318
a0d260fc 2319 case UNDERLYING_TYPE:
a9c697b8 2320 sorry ("mangling %<__underlying_type%>");
a0d260fc
PC
2321 break;
2322
5116acc6 2323 case LANG_TYPE:
1e85e720 2324 /* fall through. */
5116acc6 2325
608063c3
JB
2326 default:
2327 gcc_unreachable ();
2328 }
82a362d0
CS
2329 }
2330 }
1f6e1acc
AS
2331
2332 /* Types other than builtin types are substitution candidates. */
2333 if (!is_builtin_type)
2334 add_substitution (type);
2335}
2336
603eaec4
JM
2337/* qsort callback for sorting a vector of attribute entries. */
2338
2339static int
2340attr_strcmp (const void *p1, const void *p2)
2341{
2342 tree a1 = *(const tree*)p1;
2343 tree a2 = *(const tree*)p2;
2344
2345 const attribute_spec *as1 = lookup_attribute_spec (get_attribute_name (a1));
2346 const attribute_spec *as2 = lookup_attribute_spec (get_attribute_name (a2));
2347
2348 return strcmp (as1->name, as2->name);
2349}
2350
c4b30920
RS
2351/* Return true if we should mangle a type attribute with name NAME. */
2352
2353static bool
2354mangle_type_attribute_p (tree name)
2355{
2356 const attribute_spec *as = lookup_attribute_spec (name);
2357 if (!as || !as->affects_type_identity)
2358 return false;
2359
2360 /* Skip internal-only attributes, which are distinguished from others
2361 by having a space. At present, all internal-only attributes that
2362 affect type identity are target-specific and are handled by
2363 targetm.mangle_type instead.
2364
2365 Another reason to do this is that a space isn't a valid identifier
2366 character for most file formats. */
2367 if (strchr (IDENTIFIER_POINTER (name), ' '))
2368 return false;
2369
2370 /* The following attributes are mangled specially. */
2371 if (is_attribute_p ("transaction_safe", name))
2372 return false;
2373 if (is_attribute_p ("abi_tag", name))
2374 return false;
2375
2376 return true;
2377}
2378
1f6e1acc
AS
2379/* Non-terminal <CV-qualifiers> for type nodes. Returns the number of
2380 CV-qualifiers written for TYPE.
2381
2382 <CV-qualifiers> ::= [r] [V] [K] */
2383
2384static int
89aec4b1 2385write_CV_qualifiers_for_type (const tree type)
1f6e1acc
AS
2386{
2387 int num_qualifiers = 0;
2388
2389 /* The order is specified by:
2390
2391 "In cases where multiple order-insensitive qualifiers are
2392 present, they should be ordered 'K' (closest to the base type),
603eaec4
JM
2393 'V', 'r', and 'U' (farthest from the base type) ..." */
2394
2395 /* Mangle attributes that affect type identity as extended qualifiers.
2396
603eaec4
JM
2397 We don't do this with classes and enums because their attributes
2398 are part of their definitions, not something added on. */
2399
65440c48 2400 if (!OVERLOAD_TYPE_P (type))
603eaec4
JM
2401 {
2402 auto_vec<tree> vec;
2403 for (tree a = TYPE_ATTRIBUTES (type); a; a = TREE_CHAIN (a))
c4b30920
RS
2404 if (mangle_type_attribute_p (get_attribute_name (a)))
2405 vec.safe_push (a);
a75f1574 2406 if (abi_warn_or_compat_version_crosses (10) && !vec.is_empty ())
65440c48
JM
2407 G.need_abi_warning = true;
2408 if (abi_version_at_least (10))
603eaec4 2409 {
65440c48
JM
2410 vec.qsort (attr_strcmp);
2411 while (!vec.is_empty())
603eaec4 2412 {
65440c48
JM
2413 tree a = vec.pop();
2414 const attribute_spec *as
2415 = lookup_attribute_spec (get_attribute_name (a));
2416
2417 write_char ('U');
2418 write_unsigned_number (strlen (as->name));
2419 write_string (as->name);
2420 if (TREE_VALUE (a))
603eaec4 2421 {
65440c48
JM
2422 write_char ('I');
2423 for (tree args = TREE_VALUE (a); args;
2424 args = TREE_CHAIN (args))
2425 {
2426 tree arg = TREE_VALUE (args);
2427 write_template_arg (arg);
2428 }
2429 write_char ('E');
603eaec4 2430 }
603eaec4 2431
65440c48
JM
2432 ++num_qualifiers;
2433 }
603eaec4
JM
2434 }
2435 }
b970a21d 2436
603eaec4 2437 /* Note that we do not use cp_type_quals below; given "const
b970a21d
MM
2438 int[3]", the "const" is emitted with the "int", not with the
2439 array. */
a3360e77 2440 cp_cv_quals quals = TYPE_QUALS (type);
1f6e1acc 2441
a3360e77 2442 if (quals & TYPE_QUAL_RESTRICT)
1f6e1acc
AS
2443 {
2444 write_char ('r');
2445 ++num_qualifiers;
2446 }
a3360e77 2447 if (quals & TYPE_QUAL_VOLATILE)
1f6e1acc
AS
2448 {
2449 write_char ('V');
2450 ++num_qualifiers;
2451 }
a3360e77 2452 if (quals & TYPE_QUAL_CONST)
1f6e1acc
AS
2453 {
2454 write_char ('K');
2455 ++num_qualifiers;
2456 }
2457
2458 return num_qualifiers;
2459}
2460
c8094d83 2461/* Non-terminal <builtin-type>.
1f6e1acc 2462
c8094d83 2463 <builtin-type> ::= v # void
0cbd7506
MS
2464 ::= b # bool
2465 ::= w # wchar_t
2466 ::= c # char
2467 ::= a # signed char
2468 ::= h # unsigned char
2469 ::= s # short
2470 ::= t # unsigned short
2471 ::= i # int
2472 ::= j # unsigned int
2473 ::= l # long
2474 ::= m # unsigned long
2475 ::= x # long long, __int64
2476 ::= y # unsigned long long, __int64
2477 ::= n # __int128
2478 ::= o # unsigned __int128
2479 ::= f # float
2480 ::= d # double
2481 ::= e # long double, __float80
2482 ::= g # __float128 [not supported]
2483 ::= u <source-name> # vendor extended type */
1f6e1acc 2484
c8094d83 2485static void
89aec4b1 2486write_builtin_type (tree type)
1f6e1acc 2487{
0451301c
DG
2488 if (TYPE_CANONICAL (type))
2489 type = TYPE_CANONICAL (type);
2490
1f6e1acc
AS
2491 switch (TREE_CODE (type))
2492 {
2493 case VOID_TYPE:
2494 write_char ('v');
2495 break;
2496
2497 case BOOLEAN_TYPE:
2498 write_char ('b');
2499 break;
2500
2501 case INTEGER_TYPE:
2d91f79d 2502 /* TYPE may still be wchar_t, char8_t, char16_t, or char32_t, since that
b6baa67d 2503 isn't in integer_type_nodes. */
4d8a1dd6 2504 if (type == wchar_type_node)
1f6e1acc 2505 write_char ('w');
2d91f79d
TH
2506 else if (type == char8_type_node)
2507 write_string ("Du");
b6baa67d 2508 else if (type == char16_type_node)
38179091 2509 write_string ("Ds");
b6baa67d 2510 else if (type == char32_type_node)
38179091 2511 write_string ("Di");
1f6e1acc
AS
2512 else
2513 {
2514 size_t itk;
2515 /* Assume TYPE is one of the shared integer type nodes. Find
2516 it in the array of these nodes. */
c00996a3 2517 iagain:
1f6e1acc 2518 for (itk = 0; itk < itk_none; ++itk)
64c31785 2519 if (integer_types[itk] != NULL_TREE
78a7c317 2520 && integer_type_codes[itk] != '\0'
64c31785 2521 && type == integer_types[itk])
1f6e1acc
AS
2522 {
2523 /* Print the corresponding single-letter code. */
2524 write_char (integer_type_codes[itk]);
2525 break;
2526 }
049e6879 2527
1f6e1acc 2528 if (itk == itk_none)
c00996a3 2529 {
b0c48229 2530 tree t = c_common_type_for_mode (TYPE_MODE (type),
8df83eae 2531 TYPE_UNSIGNED (type));
4484e9b6 2532 if (type != t)
049e6879 2533 {
4484e9b6
MO
2534 type = t;
2535 goto iagain;
049e6879 2536 }
4484e9b6
MO
2537
2538 if (TYPE_PRECISION (type) == 128)
2539 write_char (TYPE_UNSIGNED (type) ? 'o' : 'n');
56668fb0
RS
2540 else
2541 {
4484e9b6
MO
2542 /* Allow for cases where TYPE is not one of the shared
2543 integer type nodes and write a "vendor extended builtin
2544 type" with a name the form intN or uintN, respectively.
2545 Situations like this can happen if you have an
2546 __attribute__((__mode__(__SI__))) type and use exotic
62d9f2e9
RS
2547 switches like '-mint8' on AVR. Of course, this is
2548 undefined by the C++ ABI (and '-mint8' is not even
2549 Standard C conforming), but when using such special
2550 options you're pretty much in nowhere land anyway. */
4484e9b6
MO
2551 const char *prefix;
2552 char prec[11]; /* up to ten digits for an unsigned */
2553
2554 prefix = TYPE_UNSIGNED (type) ? "uint" : "int";
2555 sprintf (prec, "%u", (unsigned) TYPE_PRECISION (type));
2556 write_char ('u'); /* "vendor extended builtin type" */
2557 write_unsigned_number (strlen (prefix) + strlen (prec));
2558 write_string (prefix);
2559 write_string (prec);
56668fb0 2560 }
c00996a3 2561 }
1f6e1acc
AS
2562 }
2563 break;
2564
2565 case REAL_TYPE:
bfecd57c 2566 if (type == float_type_node)
1f6e1acc 2567 write_char ('f');
bfecd57c 2568 else if (type == double_type_node)
1f6e1acc 2569 write_char ('d');
4d8a1dd6 2570 else if (type == long_double_type_node)
1f6e1acc 2571 write_char ('e');
994e0ad4 2572 else if (type == dfloat32_type_node || type == fallback_dfloat32_type)
d366d023 2573 write_string ("Df");
994e0ad4 2574 else if (type == dfloat64_type_node || type == fallback_dfloat64_type)
d366d023 2575 write_string ("Dd");
994e0ad4 2576 else if (type == dfloat128_type_node || type == fallback_dfloat128_type)
d366d023 2577 write_string ("De");
1f6e1acc 2578 else
8dc2b103 2579 gcc_unreachable ();
1f6e1acc
AS
2580 break;
2581
07523e7c
JM
2582 case FIXED_POINT_TYPE:
2583 write_string ("DF");
2584 if (GET_MODE_IBIT (TYPE_MODE (type)) > 0)
2585 write_unsigned_number (GET_MODE_IBIT (TYPE_MODE (type)));
2586 if (type == fract_type_node
2587 || type == sat_fract_type_node
2588 || type == accum_type_node
2589 || type == sat_accum_type_node)
2590 write_char ('i');
2591 else if (type == unsigned_fract_type_node
2592 || type == sat_unsigned_fract_type_node
2593 || type == unsigned_accum_type_node
2594 || type == sat_unsigned_accum_type_node)
2595 write_char ('j');
2596 else if (type == short_fract_type_node
2597 || type == sat_short_fract_type_node
2598 || type == short_accum_type_node
2599 || type == sat_short_accum_type_node)
2600 write_char ('s');
2601 else if (type == unsigned_short_fract_type_node
2602 || type == sat_unsigned_short_fract_type_node
2603 || type == unsigned_short_accum_type_node
2604 || type == sat_unsigned_short_accum_type_node)
2605 write_char ('t');
2606 else if (type == long_fract_type_node
2607 || type == sat_long_fract_type_node
2608 || type == long_accum_type_node
2609 || type == sat_long_accum_type_node)
2610 write_char ('l');
2611 else if (type == unsigned_long_fract_type_node
2612 || type == sat_unsigned_long_fract_type_node
2613 || type == unsigned_long_accum_type_node
2614 || type == sat_unsigned_long_accum_type_node)
2615 write_char ('m');
2616 else if (type == long_long_fract_type_node
2617 || type == sat_long_long_fract_type_node
2618 || type == long_long_accum_type_node
2619 || type == sat_long_long_accum_type_node)
2620 write_char ('x');
2621 else if (type == unsigned_long_long_fract_type_node
2622 || type == sat_unsigned_long_long_fract_type_node
2623 || type == unsigned_long_long_accum_type_node
2624 || type == sat_unsigned_long_long_accum_type_node)
2625 write_char ('y');
2626 else
2627 sorry ("mangling unknown fixed point type");
2628 write_unsigned_number (GET_MODE_FBIT (TYPE_MODE (type)));
2629 if (TYPE_SATURATING (type))
2630 write_char ('s');
2631 else
2632 write_char ('n');
2633 break;
2634
1f6e1acc 2635 default:
8dc2b103 2636 gcc_unreachable ();
1f6e1acc
AS
2637 }
2638}
2639
2640/* Non-terminal <function-type>. NODE is a FUNCTION_TYPE or
94350948
MM
2641 METHOD_TYPE. The return type is mangled before the parameter
2642 types.
1f6e1acc 2643
e0f0935b 2644 <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
1f6e1acc
AS
2645
2646static void
89aec4b1 2647write_function_type (const tree type)
1f6e1acc
AS
2648{
2649 MANGLE_TRACE_TREE ("function-type", type);
2650
6ea868b7
JM
2651 /* For a pointer to member function, the function type may have
2652 cv-qualifiers, indicating the quals for the artificial 'this'
2653 parameter. */
2654 if (TREE_CODE (type) == METHOD_TYPE)
2655 {
2656 /* The first parameter must be a POINTER_TYPE pointing to the
2657 `this' parameter. */
7e1352fe 2658 tree this_type = class_of_this_parm (type);
6ea868b7
JM
2659 write_CV_qualifiers_for_type (this_type);
2660 }
2661
51dc6603
JM
2662 write_exception_spec (TYPE_RAISES_EXCEPTIONS (type));
2663
b8fd7909
JM
2664 if (tx_safe_fn_type_p (type))
2665 write_string ("Dx");
2666
1f6e1acc
AS
2667 write_char ('F');
2668 /* We don't track whether or not a type is `extern "C"'. Note that
2669 you can have an `extern "C"' function that does not have
2670 `extern "C"' type, and vice versa:
2671
2672 extern "C" typedef void function_t();
2673 function_t f; // f has C++ linkage, but its type is
0cbd7506 2674 // `extern "C"'
1f6e1acc
AS
2675
2676 typedef void function_t();
2677 extern "C" function_t f; // Vice versa.
2678
2679 See [dcl.link]. */
c8094d83 2680 write_bare_function_type (type, /*include_return_type_p=*/1,
f58c04ac 2681 /*decl=*/NULL);
e0f0935b
JM
2682 if (FUNCTION_REF_QUALIFIED (type))
2683 {
2684 if (FUNCTION_RVALUE_QUALIFIED (type))
2685 write_char ('O');
2686 else
2687 write_char ('R');
2688 }
1f6e1acc
AS
2689 write_char ('E');
2690}
2691
f58c04ac 2692/* Non-terminal <bare-function-type>. TYPE is a FUNCTION_TYPE or
838dfd8a 2693 METHOD_TYPE. If INCLUDE_RETURN_TYPE is nonzero, the return value
f58c04ac 2694 is mangled before the parameter types. If non-NULL, DECL is
bfecd57c 2695 FUNCTION_DECL for the function whose type is being emitted. */
1f6e1acc
AS
2696
2697static void
89aec4b1
NN
2698write_bare_function_type (const tree type, const int include_return_type_p,
2699 const tree decl)
1f6e1acc
AS
2700{
2701 MANGLE_TRACE_TREE ("bare-function-type", type);
2702
2703 /* Mangle the return type, if requested. */
bfecd57c 2704 if (include_return_type_p)
1f6e1acc
AS
2705 write_type (TREE_TYPE (type));
2706
2707 /* Now mangle the types of the arguments. */
67e18edb 2708 ++G.parm_depth;
c8094d83 2709 write_method_parms (TYPE_ARG_TYPES (type),
f58c04ac
MM
2710 TREE_CODE (type) == METHOD_TYPE,
2711 decl);
67e18edb 2712 --G.parm_depth;
1f6e1acc
AS
2713}
2714
2715/* Write the mangled representation of a method parameter list of
838dfd8a 2716 types given in PARM_TYPES. If METHOD_P is nonzero, the function is
f58c04ac
MM
2717 considered a non-static method, and the this parameter is omitted.
2718 If non-NULL, DECL is the FUNCTION_DECL for the function whose
2719 parameters are being emitted. */
1f6e1acc
AS
2720
2721static void
89aec4b1 2722write_method_parms (tree parm_types, const int method_p, const tree decl)
1f6e1acc 2723{
f58c04ac
MM
2724 tree first_parm_type;
2725 tree parm_decl = decl ? DECL_ARGUMENTS (decl) : NULL_TREE;
2726
1f6e1acc
AS
2727 /* Assume this parameter type list is variable-length. If it ends
2728 with a void type, then it's not. */
2729 int varargs_p = 1;
2730
2731 /* If this is a member function, skip the first arg, which is the
c8094d83 2732 this pointer.
1f6e1acc 2733 "Member functions do not encode the type of their implicit this
c8094d83
MS
2734 parameter."
2735
f58c04ac
MM
2736 Similarly, there's no need to mangle artificial parameters, like
2737 the VTT parameters for constructors and destructors. */
1f6e1acc 2738 if (method_p)
1f6e1acc 2739 {
f58c04ac 2740 parm_types = TREE_CHAIN (parm_types);
910ad8de 2741 parm_decl = parm_decl ? DECL_CHAIN (parm_decl) : NULL_TREE;
1f6e1acc 2742
f58c04ac
MM
2743 while (parm_decl && DECL_ARTIFICIAL (parm_decl))
2744 {
2745 parm_types = TREE_CHAIN (parm_types);
910ad8de 2746 parm_decl = DECL_CHAIN (parm_decl);
f58c04ac 2747 }
19e8a45f
JM
2748
2749 if (decl && ctor_omit_inherited_parms (decl))
2750 /* Bring back parameters omitted from an inherited ctor. */
2751 parm_types = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (decl));
f58c04ac
MM
2752 }
2753
c8094d83
MS
2754 for (first_parm_type = parm_types;
2755 parm_types;
f58c04ac
MM
2756 parm_types = TREE_CHAIN (parm_types))
2757 {
2758 tree parm = TREE_VALUE (parm_types);
b72801e2 2759 if (parm == void_type_node)
1f6e1acc
AS
2760 {
2761 /* "Empty parameter lists, whether declared as () or
2762 conventionally as (void), are encoded with a void parameter
2763 (v)." */
f58c04ac 2764 if (parm_types == first_parm_type)
1f6e1acc
AS
2765 write_type (parm);
2766 /* If the parm list is terminated with a void type, it's
2767 fixed-length. */
2768 varargs_p = 0;
2769 /* A void type better be the last one. */
50bc768d 2770 gcc_assert (TREE_CHAIN (parm_types) == NULL);
1f6e1acc
AS
2771 }
2772 else
2773 write_type (parm);
2774 }
2775
2776 if (varargs_p)
2777 /* <builtin-type> ::= z # ellipsis */
2778 write_char ('z');
2779}
2780
2781/* <class-enum-type> ::= <name> */
2782
c8094d83 2783static void
89aec4b1 2784write_class_enum_type (const tree type)
1f6e1acc 2785{
f0f33848 2786 write_name (TYPE_NAME (type), /*ignore_local_scope=*/0);
1f6e1acc
AS
2787}
2788
2789/* Non-terminal <template-args>. ARGS is a TREE_VEC of template
2790 arguments.
2791
8ab079f4 2792 <template-args> ::= I <template-arg>* E */
1f6e1acc
AS
2793
2794static void
89aec4b1 2795write_template_args (tree args)
1f6e1acc 2796{
0f30f285 2797 int i;
8ab079f4 2798 int length = 0;
c8094d83 2799
1f6e1acc
AS
2800 MANGLE_TRACE_TREE ("template-args", args);
2801
3fa3c4bd 2802 write_char ('I');
1f6e1acc 2803
8ab079f4
DS
2804 if (args)
2805 length = TREE_VEC_LENGTH (args);
3fa3c4bd 2806
d15364ce 2807 if (args && length && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
3fa3c4bd 2808 {
0f30f285
NS
2809 /* We have nested template args. We want the innermost template
2810 argument list. */
2811 args = TREE_VEC_ELT (args, length - 1);
2812 length = TREE_VEC_LENGTH (args);
1f6e1acc 2813 }
0f30f285
NS
2814 for (i = 0; i < length; ++i)
2815 write_template_arg (TREE_VEC_ELT (args, i));
c8094d83 2816
1f6e1acc
AS
2817 write_char ('E');
2818}
2819
38179091
JM
2820/* Write out the
2821 <unqualified-name>
2822 <unqualified-name> <template-args>
2823 part of SCOPE_REF or COMPONENT_REF mangling. */
2824
2825static void
2826write_member_name (tree member)
2827{
84c0088f 2828 if (identifier_p (member))
4bbc35f3 2829 {
84c0088f
NS
2830 if (abi_version_at_least (11) && IDENTIFIER_ANY_OP_P (member))
2831 {
2832 write_string ("on");
2833 if (abi_warn_or_compat_version_crosses (11))
2834 G.need_abi_warning = 1;
2835 }
2836 write_unqualified_id (member);
4bbc35f3 2837 }
38179091 2838 else if (DECL_P (member))
5dd65e22 2839 write_unqualified_name (member);
38179091
JM
2840 else if (TREE_CODE (member) == TEMPLATE_ID_EXPR)
2841 {
2842 tree name = TREE_OPERAND (member, 0);
848bf88d 2843 name = OVL_FIRST (name);
38179091
JM
2844 write_member_name (name);
2845 write_template_args (TREE_OPERAND (member, 1));
2846 }
2847 else
2848 write_expression (member);
2849}
2850
1f6e1acc
AS
2851/* <expression> ::= <unary operator-name> <expression>
2852 ::= <binary operator-name> <expression> <expression>
2853 ::= <expr-primary>
2854
2855 <expr-primary> ::= <template-param>
0cbd7506
MS
2856 ::= L <type> <value number> E # literal
2857 ::= L <mangled-name> E # external name
b344d949
JM
2858 ::= st <type> # sizeof
2859 ::= sr <type> <unqualified-name> # dependent name
0cbd7506 2860 ::= sr <type> <unqualified-name> <template-args> */
1f6e1acc
AS
2861
2862static void
89aec4b1 2863write_expression (tree expr)
1f6e1acc 2864{
a77f94e2 2865 enum tree_code code = TREE_CODE (expr);
1f6e1acc 2866
b46e1a69
MP
2867 if (TREE_CODE (expr) == TARGET_EXPR)
2868 {
2869 expr = TARGET_EXPR_INITIAL (expr);
2870 code = TREE_CODE (expr);
2871 }
2872
16b61424
JM
2873 /* Skip NOP_EXPR and CONVERT_EXPR. They can occur when (say) a pointer
2874 argument is converted (via qualification conversions) to another type. */
2875 while (CONVERT_EXPR_CODE_P (code)
9a004410 2876 || location_wrapper_p (expr)
10c6dc8e
JM
2877 /* Parentheses aren't mangled. */
2878 || code == PAREN_EXPR
b46e1a69
MP
2879 || code == NON_LVALUE_EXPR
2880 || (code == VIEW_CONVERT_EXPR
2881 && TREE_CODE (TREE_OPERAND (expr, 0)) == TEMPLATE_PARM_INDEX))
b6ab6892
GB
2882 {
2883 expr = TREE_OPERAND (expr, 0);
2884 code = TREE_CODE (expr);
2885 }
2886
4643a68e
JM
2887 if (code == BASELINK
2888 && (!type_unknown_p (expr)
2889 || !BASELINK_QUALIFIED_P (expr)))
eff3a276
MM
2890 {
2891 expr = BASELINK_FUNCTIONS (expr);
2892 code = TREE_CODE (expr);
2893 }
2894
1f6e1acc
AS
2895 /* Handle pointers-to-members by making them look like expression
2896 nodes. */
2897 if (code == PTRMEM_CST)
2898 {
2899 expr = build_nt (ADDR_EXPR,
02ed62dd
MM
2900 build_qualified_name (/*type=*/NULL_TREE,
2901 PTRMEM_CST_CLASS (expr),
2902 PTRMEM_CST_MEMBER (expr),
2903 /*template_p=*/false));
1f6e1acc
AS
2904 code = TREE_CODE (expr);
2905 }
2906
c6002625 2907 /* Handle template parameters. */
c8094d83 2908 if (code == TEMPLATE_TYPE_PARM
1f6e1acc 2909 || code == TEMPLATE_TEMPLATE_PARM
a1281f45
KL
2910 || code == BOUND_TEMPLATE_TEMPLATE_PARM
2911 || code == TEMPLATE_PARM_INDEX)
1f6e1acc
AS
2912 write_template_param (expr);
2913 /* Handle literals. */
6615c446 2914 else if (TREE_CODE_CLASS (code) == tcc_constant
90d84934 2915 || code == CONST_DECL)
1f6e1acc 2916 write_template_arg_literal (expr);
f2fe30af
JM
2917 else if (code == PARM_DECL && DECL_ARTIFICIAL (expr))
2918 {
a01f151f 2919 gcc_assert (id_equal (DECL_NAME (expr), "this"));
f2fe30af
JM
2920 write_string ("fpT");
2921 }
b344d949
JM
2922 else if (code == PARM_DECL)
2923 {
448545cb 2924 /* A function parameter used in a late-specified return type. */
ad909c97 2925 int index = DECL_PARM_INDEX (expr);
67e18edb
JM
2926 int level = DECL_PARM_LEVEL (expr);
2927 int delta = G.parm_depth - level + 1;
ad909c97 2928 gcc_assert (index >= 1);
67e18edb
JM
2929 write_char ('f');
2930 if (delta != 0)
2931 {
55af847f 2932 if (abi_version_at_least (5))
67e18edb
JM
2933 {
2934 /* Let L be the number of function prototype scopes from the
2935 innermost one (in which the parameter reference occurs) up
2936 to (and including) the one containing the declaration of
2937 the referenced parameter. If the parameter declaration
2938 clause of the innermost function prototype scope has been
2939 completely seen, it is not counted (in that case -- which
2940 is perhaps the most common -- L can be zero). */
2941 write_char ('L');
2942 write_unsigned_number (delta - 1);
2943 }
a75f1574 2944 if (abi_warn_or_compat_version_crosses (5))
67e18edb
JM
2945 G.need_abi_warning = true;
2946 }
2947 write_char ('p');
d5f4eddd 2948 write_compact_number (index - 1);
b344d949 2949 }
1f6e1acc
AS
2950 else if (DECL_P (expr))
2951 {
2952 write_char ('L');
5fd80fbc 2953 write_mangled_name (expr, false);
1f6e1acc
AS
2954 write_char ('E');
2955 }
34bbc4c5 2956 else if (TREE_CODE (expr) == SIZEOF_EXPR)
0d23cf7a 2957 {
34bbc4c5
JM
2958 tree op = TREE_OPERAND (expr, 0);
2959
2960 if (PACK_EXPANSION_P (op))
2961 {
2962 if (abi_warn_or_compat_version_crosses (11))
2963 G.need_abi_warning = true;
2964 if (abi_version_at_least (11))
2965 {
2966 /* sZ rather than szDp. */
2967 write_string ("sZ");
2968 write_expression (PACK_EXPANSION_PATTERN (op));
2969 return;
2970 }
2971 }
2972
2973 if (SIZEOF_EXPR_TYPE_P (expr))
2974 {
2975 write_string ("st");
2976 write_type (TREE_TYPE (op));
2977 }
2978 else if (ARGUMENT_PACK_P (op))
2979 {
2980 tree args = ARGUMENT_PACK_ARGS (op);
2981 int length = TREE_VEC_LENGTH (args);
2982 if (abi_warn_or_compat_version_crosses (10))
2983 G.need_abi_warning = true;
2984 if (abi_version_at_least (10))
2985 {
2986 /* sP <template-arg>* E # sizeof...(T), size of a captured
2987 template parameter pack from an alias template */
2988 write_string ("sP");
2989 for (int i = 0; i < length; ++i)
2990 write_template_arg (TREE_VEC_ELT (args, i));
2991 write_char ('E');
2992 }
2993 else
2994 {
2995 /* In GCC 5 we represented this sizeof wrong, with the effect
2996 that we mangled it as the last element of the pack. */
2997 tree arg = TREE_VEC_ELT (args, length-1);
2998 if (TYPE_P (op))
2999 {
3000 write_string ("st");
3001 write_type (arg);
3002 }
3003 else
3004 {
3005 write_string ("sz");
3006 write_expression (arg);
3007 }
3008 }
3009 }
3010 else if (TYPE_P (TREE_OPERAND (expr, 0)))
3011 {
3012 write_string ("st");
3013 write_type (TREE_OPERAND (expr, 0));
3014 }
3015 else
3016 goto normal_expr;
5d69ba1f 3017 }
448545cb
JM
3018 else if (TREE_CODE (expr) == ALIGNOF_EXPR
3019 && TYPE_P (TREE_OPERAND (expr, 0)))
3020 {
3021 write_string ("at");
3022 write_type (TREE_OPERAND (expr, 0));
3023 }
4643a68e
JM
3024 else if (code == SCOPE_REF
3025 || code == BASELINK)
3fa3c4bd 3026 {
4643a68e
JM
3027 tree scope, member;
3028 if (code == SCOPE_REF)
3029 {
3030 scope = TREE_OPERAND (expr, 0);
3031 member = TREE_OPERAND (expr, 1);
60067b87
JM
3032 if (BASELINK_P (member))
3033 member = BASELINK_FUNCTIONS (member);
4643a68e
JM
3034 }
3035 else
3036 {
3037 scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (expr));
3038 member = BASELINK_FUNCTIONS (expr);
3039 }
3fa3c4bd
MM
3040
3041 /* If the MEMBER is a real declaration, then the qualifying
3042 scope was not dependent. Ideally, we would not have a
3043 SCOPE_REF in those cases, but sometimes we do. If the second
3044 argument is a DECL, then the name must not have been
3045 dependent. */
90d84934 3046 if (DECL_P (member))
3fa3c4bd
MM
3047 write_expression (member);
3048 else
3049 {
3fa3c4bd
MM
3050 write_string ("sr");
3051 write_type (scope);
f000c6a7 3052 write_member_name (member);
3fa3c4bd
MM
3053 }
3054 }
591cb3cf 3055 else if (INDIRECT_REF_P (expr)
448545cb 3056 && TREE_TYPE (TREE_OPERAND (expr, 0))
9f613f06 3057 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr, 0))))
448545cb
JM
3058 {
3059 write_expression (TREE_OPERAND (expr, 0));
3060 }
9dc6f476 3061 else if (identifier_p (expr))
f000c6a7
JM
3062 {
3063 /* An operator name appearing as a dependent name needs to be
3064 specially marked to disambiguate between a use of the operator
3065 name and a use of the operator in an expression. */
84c0088f 3066 if (IDENTIFIER_ANY_OP_P (expr))
f000c6a7
JM
3067 write_string ("on");
3068 write_unqualified_id (expr);
3069 }
3070 else if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
3071 {
3072 tree fn = TREE_OPERAND (expr, 0);
848bf88d 3073 fn = OVL_NAME (fn);
84c0088f 3074 if (IDENTIFIER_ANY_OP_P (fn))
f000c6a7
JM
3075 write_string ("on");
3076 write_unqualified_id (fn);
3077 write_template_args (TREE_OPERAND (expr, 1));
3078 }
a47d328f
JM
3079 else if (TREE_CODE (expr) == MODOP_EXPR)
3080 {
3081 enum tree_code subop = TREE_CODE (TREE_OPERAND (expr, 1));
88a819be
NS
3082 const char *name = OVL_OP_INFO (true, subop)->mangled_name;
3083
a47d328f
JM
3084 write_string (name);
3085 write_expression (TREE_OPERAND (expr, 0));
3086 write_expression (TREE_OPERAND (expr, 2));
3087 }
4b6aaa99
JM
3088 else if (code == NEW_EXPR || code == VEC_NEW_EXPR)
3089 {
3090 /* ::= [gs] nw <expression>* _ <type> E
3091 ::= [gs] nw <expression>* _ <type> <initializer>
3092 ::= [gs] na <expression>* _ <type> E
3093 ::= [gs] na <expression>* _ <type> <initializer>
3094 <initializer> ::= pi <expression>* E */
3095 tree placement = TREE_OPERAND (expr, 0);
3096 tree type = TREE_OPERAND (expr, 1);
3097 tree nelts = TREE_OPERAND (expr, 2);
3098 tree init = TREE_OPERAND (expr, 3);
3099 tree t;
3100
3101 gcc_assert (code == NEW_EXPR);
3102 if (TREE_OPERAND (expr, 2))
3103 code = VEC_NEW_EXPR;
3104
3105 if (NEW_EXPR_USE_GLOBAL (expr))
3106 write_string ("gs");
3107
88a819be 3108 write_string (OVL_OP_INFO (false, code)->mangled_name);
4b6aaa99
JM
3109
3110 for (t = placement; t; t = TREE_CHAIN (t))
3111 write_expression (TREE_VALUE (t));
3112
3113 write_char ('_');
3114
3115 if (nelts)
3116 {
3117 tree domain;
3118 ++processing_template_decl;
3119 domain = compute_array_index_type (NULL_TREE, nelts,
3120 tf_warning_or_error);
3121 type = build_cplus_array_type (type, domain);
3122 --processing_template_decl;
3123 }
3124 write_type (type);
3125
3126 if (init && TREE_CODE (init) == TREE_LIST
014397c2 3127 && DIRECT_LIST_INIT_P (TREE_VALUE (init)))
4b6aaa99
JM
3128 write_expression (TREE_VALUE (init));
3129 else
3130 {
3131 if (init)
3132 write_string ("pi");
632f2871 3133 if (init && init != void_node)
4b6aaa99
JM
3134 for (t = init; t; t = TREE_CHAIN (t))
3135 write_expression (TREE_VALUE (t));
3136 write_char ('E');
3137 }
3138 }
3139 else if (code == DELETE_EXPR || code == VEC_DELETE_EXPR)
3140 {
3141 gcc_assert (code == DELETE_EXPR);
3142 if (DELETE_EXPR_USE_VEC (expr))
3143 code = VEC_DELETE_EXPR;
3144
3145 if (DELETE_EXPR_USE_GLOBAL (expr))
3146 write_string ("gs");
3147
88a819be 3148 write_string (OVL_OP_INFO (false, code)->mangled_name);
4b6aaa99
JM
3149
3150 write_expression (TREE_OPERAND (expr, 0));
3151 }
3152 else if (code == THROW_EXPR)
3153 {
3154 tree op = TREE_OPERAND (expr, 0);
3155 if (op)
3156 {
3157 write_string ("tw");
3158 write_expression (op);
3159 }
3160 else
3161 write_string ("tr");
3162 }
3163 else if (code == CONSTRUCTOR)
3164 {
187c6369
MS
3165 bool braced_init = BRACE_ENCLOSED_INITIALIZER_P (expr);
3166 tree etype = TREE_TYPE (expr);
4b6aaa99 3167
187c6369 3168 if (braced_init)
4b6aaa99
JM
3169 write_string ("il");
3170 else
3171 {
3172 write_string ("tl");
187c6369
MS
3173 write_type (etype);
3174 }
3175
3176 if (!initializer_zerop (expr) || !trivial_type_p (etype))
3177 {
3178 /* Convert braced initializer lists to STRING_CSTs so that
3179 A<"Foo"> mangles the same as A<{'F', 'o', 'o', 0}> while
3180 still using the latter mangling for strings that
3181 originated as braced initializer lists. */
3182 expr = braced_lists_to_strings (etype, expr);
3183
3184 if (TREE_CODE (expr) == CONSTRUCTOR)
3185 {
3186 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (expr);
3187 unsigned last_nonzero = -1, i;
3188 tree val;
3189
3190 FOR_EACH_CONSTRUCTOR_VALUE (elts, i, val)
3191 if (!initializer_zerop (val))
3192 last_nonzero = i;
3193
3194 FOR_EACH_CONSTRUCTOR_VALUE (elts, i, val)
3195 {
3196 if (i > last_nonzero)
3197 break;
3198 write_expression (val);
3199 }
3200 }
3201 else
3202 {
3203 gcc_assert (TREE_CODE (expr) == STRING_CST);
3204 write_expression (expr);
3205 }
4b6aaa99 3206 }
4b6aaa99
JM
3207 write_char ('E');
3208 }
0c1e0d63
JM
3209 else if (code == LAMBDA_EXPR)
3210 {
3211 /* [temp.over.link] Two lambda-expressions are never considered
3212 equivalent.
3213
3214 So just use the closure type mangling. */
3215 write_string ("tl");
3216 write_type (LAMBDA_EXPR_CLOSURE (expr));
3217 write_char ('E');
3218 }
4b6aaa99
JM
3219 else if (dependent_name (expr))
3220 {
3221 write_unqualified_id (dependent_name (expr));
3222 }
1f6e1acc
AS
3223 else
3224 {
34bbc4c5 3225 normal_expr:
4d43dcde 3226 int i, len;
448545cb 3227 const char *name;
1f6e1acc 3228
0dc09a61
MM
3229 /* When we bind a variable or function to a non-type template
3230 argument with reference type, we create an ADDR_EXPR to show
3231 the fact that the entity's address has been taken. But, we
3232 don't actually want to output a mangling code for the `&'. */
3233 if (TREE_CODE (expr) == ADDR_EXPR
3234 && TREE_TYPE (expr)
9f613f06 3235 && TYPE_REF_P (TREE_TYPE (expr)))
82a362d0
CS
3236 {
3237 expr = TREE_OPERAND (expr, 0);
3238 if (DECL_P (expr))
3239 {
3240 write_expression (expr);
3241 return;
3242 }
0dc09a61 3243
82a362d0
CS
3244 code = TREE_CODE (expr);
3245 }
3fa3c4bd 3246
ee429f84
JJ
3247 if (code == COMPONENT_REF)
3248 {
3249 tree ob = TREE_OPERAND (expr, 0);
3250
3251 if (TREE_CODE (ob) == ARROW_EXPR)
3252 {
88a819be 3253 write_string (OVL_OP_INFO (false, code)->mangled_name);
ee429f84 3254 ob = TREE_OPERAND (ob, 0);
e2254932 3255 write_expression (ob);
ee429f84 3256 }
e2254932
JM
3257 else if (!is_dummy_object (ob))
3258 {
3259 write_string ("dt");
3260 write_expression (ob);
3261 }
3262 /* else, for a non-static data member with no associated object (in
3263 unevaluated context), use the unresolved-name mangling. */
ee429f84 3264
ee429f84
JJ
3265 write_member_name (TREE_OPERAND (expr, 1));
3266 return;
3267 }
3268
1f6e1acc 3269 /* If it wasn't any of those, recursively expand the expression. */
88a819be 3270 name = OVL_OP_INFO (false, code)->mangled_name;
4b6aaa99
JM
3271
3272 /* We used to mangle const_cast and static_cast like a C cast. */
62984918
JM
3273 if (code == CONST_CAST_EXPR
3274 || code == STATIC_CAST_EXPR)
4b6aaa99 3275 {
a75f1574 3276 if (abi_warn_or_compat_version_crosses (6))
62984918
JM
3277 G.need_abi_warning = 1;
3278 if (!abi_version_at_least (6))
88a819be 3279 name = OVL_OP_INFO (false, CAST_EXPR)->mangled_name;
4b6aaa99
JM
3280 }
3281
448545cb
JM
3282 if (name == NULL)
3283 {
77d4d7c5
JM
3284 switch (code)
3285 {
3286 case TRAIT_EXPR:
3287 error ("use of built-in trait %qE in function signature; "
3288 "use library traits instead", expr);
3289 break;
3290
3291 default:
3292 sorry ("mangling %C", code);
3293 break;
3294 }
448545cb
JM
3295 return;
3296 }
3297 else
3298 write_string (name);
1f6e1acc 3299
873ff987 3300 switch (code)
1f6e1acc 3301 {
0cbd7506 3302 case CALL_EXPR:
a3c49752
JM
3303 {
3304 tree fn = CALL_EXPR_FN (expr);
3305
3306 if (TREE_CODE (fn) == ADDR_EXPR)
3307 fn = TREE_OPERAND (fn, 0);
3308
3309 /* Mangle a dependent name as the name, not whatever happens to
3310 be the first function in the overload set. */
d509bb8c 3311 if (OVL_P (fn)
a3c49752 3312 && type_dependent_expression_p_push (expr))
848bf88d 3313 fn = OVL_NAME (fn);
a3c49752 3314
f000c6a7 3315 write_expression (fn);
a3c49752
JM
3316 }
3317
b344d949
JM
3318 for (i = 0; i < call_expr_nargs (expr); ++i)
3319 write_expression (CALL_EXPR_ARG (expr, i));
3320 write_char ('E');
0cbd7506 3321 break;
f8bee204 3322
873ff987
KL
3323 case CAST_EXPR:
3324 write_type (TREE_TYPE (expr));
448545cb 3325 if (list_length (TREE_OPERAND (expr, 0)) == 1)
383c9d5d 3326 write_expression (TREE_VALUE (TREE_OPERAND (expr, 0)));
448545cb
JM
3327 else
3328 {
3329 tree args = TREE_OPERAND (expr, 0);
3330 write_char ('_');
3331 for (; args; args = TREE_CHAIN (args))
3332 write_expression (TREE_VALUE (args));
3333 write_char ('E');
3334 }
873ff987
KL
3335 break;
3336
4b6aaa99
JM
3337 case DYNAMIC_CAST_EXPR:
3338 case REINTERPRET_CAST_EXPR:
873ff987
KL
3339 case STATIC_CAST_EXPR:
3340 case CONST_CAST_EXPR:
3341 write_type (TREE_TYPE (expr));
3342 write_expression (TREE_OPERAND (expr, 0));
3343 break;
3344
4b6aaa99
JM
3345 case PREINCREMENT_EXPR:
3346 case PREDECREMENT_EXPR:
3347 if (abi_version_at_least (6))
3348 write_char ('_');
a75f1574 3349 if (abi_warn_or_compat_version_crosses (6))
4b6aaa99
JM
3350 G.need_abi_warning = 1;
3351 /* Fall through. */
448545cb 3352
873ff987 3353 default:
4d43dcde
JM
3354 /* In the middle-end, some expressions have more operands than
3355 they do in templates (and mangling). */
d26e5986 3356 len = cp_tree_operand_length (expr);
4d43dcde
JM
3357
3358 for (i = 0; i < len; ++i)
18fd68a8
MM
3359 {
3360 tree operand = TREE_OPERAND (expr, i);
02ed62dd 3361 /* As a GNU extension, the middle operand of a
18fd68a8
MM
3362 conditional may be omitted. Since expression
3363 manglings are supposed to represent the input token
3364 stream, there's no good way to mangle such an
3365 expression without extending the C++ ABI. */
3366 if (code == COND_EXPR && i == 1 && !operand)
3367 {
9e637a26 3368 error ("omitted middle operand to %<?:%> operand "
18fd68a8
MM
3369 "cannot be mangled");
3370 continue;
3371 }
aa30dfad
JM
3372 else if (FOLD_EXPR_P (expr))
3373 {
3374 /* The first 'operand' of a fold-expression is the operator
3375 that it folds over. */
3376 if (i == 0)
3377 {
3378 int fcode = TREE_INT_CST_LOW (operand);
88a819be 3379 write_string (OVL_OP_INFO (false, fcode)->mangled_name);
aa30dfad
JM
3380 continue;
3381 }
3382 else if (code == BINARY_LEFT_FOLD_EXPR)
3383 {
3384 /* The order of operands of the binary left and right
3385 folds is the same, but we want to mangle them in
3386 lexical order, i.e. non-pack first. */
3387 if (i == 1)
3388 operand = FOLD_EXPR_INIT (expr);
3389 else
3390 operand = FOLD_EXPR_PACK (expr);
3391 }
3392 if (PACK_EXPANSION_P (operand))
3393 operand = PACK_EXPANSION_PATTERN (operand);
3394 }
18fd68a8
MM
3395 write_expression (operand);
3396 }
1f6e1acc 3397 }
1f6e1acc
AS
3398 }
3399}
3400
c8094d83 3401/* Literal subcase of non-terminal <template-arg>.
1f6e1acc
AS
3402
3403 "Literal arguments, e.g. "A<42L>", are encoded with their type
3404 and value. Negative integer values are preceded with "n"; for
3405 example, "A<-42L>" becomes "1AILln42EE". The bool value false is
94d3ea58 3406 encoded as 0, true as 1." */
1f6e1acc
AS
3407
3408static void
89aec4b1 3409write_template_arg_literal (const tree value)
1f6e1acc 3410{
187c6369
MS
3411 if (TREE_CODE (value) == STRING_CST)
3412 /* Temporarily mangle strings as braced initializer lists. */
3413 write_string ("tl");
3414 else
3415 write_char ('L');
3416
3417 tree valtype = TREE_TYPE (value);
3418 write_type (valtype);
1f6e1acc 3419
e90abaa0
JM
3420 /* Write a null member pointer value as (type)0, regardless of its
3421 real representation. */
3422 if (null_member_pointer_value_p (value))
3423 write_integer_cst (integer_zero_node);
3424 else
3425 switch (TREE_CODE (value))
3426 {
3427 case CONST_DECL:
3428 write_integer_cst (DECL_INITIAL (value));
3429 break;
c8094d83 3430
e90abaa0
JM
3431 case INTEGER_CST:
3432 gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node)
3433 || integer_zerop (value) || integer_onep (value));
e0c866dd
KK
3434 if (!(abi_version_at_least (14)
3435 && NULLPTR_TYPE_P (TREE_TYPE (value))))
3436 write_integer_cst (value);
e90abaa0 3437 break;
8dc2b103 3438
e90abaa0
JM
3439 case REAL_CST:
3440 write_real_cst (value);
3441 break;
1f6e1acc 3442
95875a9b
JJ
3443 case COMPLEX_CST:
3444 if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST
3445 && TREE_CODE (TREE_IMAGPART (value)) == INTEGER_CST)
3446 {
3447 write_integer_cst (TREE_REALPART (value));
3448 write_char ('_');
3449 write_integer_cst (TREE_IMAGPART (value));
3450 }
3451 else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST
3452 && TREE_CODE (TREE_IMAGPART (value)) == REAL_CST)
3453 {
3454 write_real_cst (TREE_REALPART (value));
3455 write_char ('_');
3456 write_real_cst (TREE_IMAGPART (value));
3457 }
3458 else
3459 gcc_unreachable ();
3460 break;
3461
e90abaa0 3462 case STRING_CST:
187c6369
MS
3463 {
3464 /* Mangle strings the same as braced initializer lists. */
3465 unsigned n = TREE_STRING_LENGTH (value);
3466 const char *str = TREE_STRING_POINTER (value);
3467
3468 /* Count the number of trailing nuls and subtract them from
3469 STRSIZE because they don't need to be mangled. */
3470 for (const char *p = str + n - 1; ; --p)
3471 {
3472 if (*p || p == str)
3473 {
3474 n -= str + n - !!*p - p;
3475 break;
3476 }
3477 }
3478 tree eltype = TREE_TYPE (valtype);
3479 for (const char *p = str; n--; ++p)
3480 {
3481 write_char ('L');
3482 write_type (eltype);
3483 write_unsigned_number (*(const unsigned char*)p);
3484 write_string ("E");
3485 }
3486 break;
3487 }
db68a2cb 3488
e90abaa0
JM
3489 default:
3490 gcc_unreachable ();
3491 }
c8094d83 3492
1f6e1acc
AS
3493 write_char ('E');
3494}
3495
c8094d83 3496/* Non-terminal <template-arg>.
1f6e1acc 3497
0cbd7506
MS
3498 <template-arg> ::= <type> # type
3499 ::= L <type> </value/ number> E # literal
3500 ::= LZ <name> E # external name
3501 ::= X <expression> E # expression */
1f6e1acc
AS
3502
3503static void
89aec4b1 3504write_template_arg (tree node)
1f6e1acc
AS
3505{
3506 enum tree_code code = TREE_CODE (node);
3507
3508 MANGLE_TRACE_TREE ("template-arg", node);
3509
da1d7781 3510 /* A template template parameter's argument list contains TREE_LIST
78dcd41a 3511 nodes of which the value field is the actual argument. */
1f6e1acc
AS
3512 if (code == TREE_LIST)
3513 {
3514 node = TREE_VALUE (node);
3515 /* If it's a decl, deal with its type instead. */
3516 if (DECL_P (node))
3517 {
3518 node = TREE_TYPE (node);
3519 code = TREE_CODE (node);
3520 }
3521 }
c8094d83 3522
4be5c72c
JM
3523 if (template_parm_object_p (node))
3524 /* We want to mangle the argument, not the var we stored it in. */
3525 node = DECL_INITIAL (node);
3526
6296cf8e
JM
3527 /* Strip a conversion added by convert_nontype_argument. */
3528 if (TREE_CODE (node) == IMPLICIT_CONV_EXPR)
3529 node = TREE_OPERAND (node, 0);
a663ce5a
JM
3530 if (REFERENCE_REF_P (node))
3531 node = TREE_OPERAND (node, 0);
0f30f285 3532 if (TREE_CODE (node) == NOP_EXPR
9f613f06 3533 && TYPE_REF_P (TREE_TYPE (node)))
0f30f285
NS
3534 {
3535 /* Template parameters can be of reference type. To maintain
3536 internal consistency, such arguments use a conversion from
3537 address of object to reference type. */
50bc768d 3538 gcc_assert (TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR);
90d84934 3539 node = TREE_OPERAND (TREE_OPERAND (node, 0), 0);
0f30f285 3540 }
1f6e1acc 3541
4b6aaa99
JM
3542 if (TREE_CODE (node) == BASELINK
3543 && !type_unknown_p (node))
3544 {
3545 if (abi_version_at_least (6))
3546 node = BASELINK_FUNCTIONS (node);
a75f1574 3547 if (abi_warn_or_compat_version_crosses (6))
4b6aaa99
JM
3548 /* We wrongly wrapped a class-scope function in X/E. */
3549 G.need_abi_warning = 1;
3550 }
3551
5d80a306
DG
3552 if (ARGUMENT_PACK_P (node))
3553 {
3554 /* Expand the template argument pack. */
3555 tree args = ARGUMENT_PACK_ARGS (node);
3556 int i, length = TREE_VEC_LENGTH (args);
4b6aaa99
JM
3557 if (abi_version_at_least (6))
3558 write_char ('J');
3559 else
62984918 3560 write_char ('I');
a75f1574 3561 if (abi_warn_or_compat_version_crosses (6))
62984918 3562 G.need_abi_warning = 1;
5d80a306
DG
3563 for (i = 0; i < length; ++i)
3564 write_template_arg (TREE_VEC_ELT (args, i));
38179091 3565 write_char ('E');
5d80a306
DG
3566 }
3567 else if (TYPE_P (node))
1f6e1acc
AS
3568 write_type (node);
3569 else if (code == TEMPLATE_DECL)
3570 /* A template appearing as a template arg is a template template arg. */
3571 write_template_template_arg (node);
6615c446 3572 else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST)
90d84934 3573 || code == CONST_DECL
e90abaa0 3574 || null_member_pointer_value_p (node))
d3133e68 3575 write_template_arg_literal (node);
1f6e1acc
AS
3576 else if (DECL_P (node))
3577 {
3578 write_char ('L');
d9634d53
MM
3579 /* Until ABI version 3, the underscore before the mangled name
3580 was incorrectly omitted. */
3581 if (!abi_version_at_least (3))
62984918 3582 write_char ('Z');
d9634d53
MM
3583 else
3584 write_string ("_Z");
a75f1574 3585 if (abi_warn_or_compat_version_crosses (3))
62984918 3586 G.need_abi_warning = 1;
1f6e1acc
AS
3587 write_encoding (node);
3588 write_char ('E');
3589 }
1f6e1acc
AS
3590 else
3591 {
3592 /* Template arguments may be expressions. */
3593 write_char ('X');
3594 write_expression (node);
3595 write_char ('E');
3596 }
3597}
3598
3599/* <template-template-arg>
3600 ::= <name>
3601 ::= <substitution> */
3602
8ce33230 3603static void
89aec4b1 3604write_template_template_arg (const tree decl)
1f6e1acc
AS
3605{
3606 MANGLE_TRACE_TREE ("template-template-arg", decl);
3607
3608 if (find_substitution (decl))
3609 return;
f0f33848 3610 write_name (decl, /*ignore_local_scope=*/0);
1f6e1acc
AS
3611 add_substitution (decl);
3612}
3613
3614
c8094d83 3615/* Non-terminal <array-type>. TYPE is an ARRAY_TYPE.
1f6e1acc 3616
c8094d83 3617 <array-type> ::= A [</dimension/ number>] _ </element/ type>
0cbd7506 3618 ::= A <expression> _ </element/ type>
1f6e1acc
AS
3619
3620 "Array types encode the dimension (number of elements) and the
05dd97db
MS
3621 element type. For variable length arrays, the dimension (but not
3622 the '_' separator) is omitted."
3623 Note that for flexible array members, like for other arrays of
3624 unspecified size, the dimension is also omitted. */
1f6e1acc 3625
89aec4b1
NN
3626static void
3627write_array_type (const tree type)
1f6e1acc
AS
3628{
3629 write_char ('A');
3630 if (TYPE_DOMAIN (type))
3631 {
3632 tree index_type;
1f6e1acc
AS
3633
3634 index_type = TYPE_DOMAIN (type);
05dd97db
MS
3635 /* The INDEX_TYPE gives the upper and lower bounds of the array.
3636 It's null for flexible array members which have no upper bound
3637 (this is a change from GCC 5 and prior where such members were
3638 incorrectly mangled as zero-length arrays). */
3639 if (tree max = TYPE_MAX_VALUE (index_type))
459c43ad 3640 {
05dd97db
MS
3641 if (TREE_CODE (max) == INTEGER_CST)
3642 {
3643 /* The ABI specifies that we should mangle the number of
3644 elements in the array, not the largest allowed index. */
3645 offset_int wmax = wi::to_offset (max) + 1;
3646 /* Truncate the result - this will mangle [0, SIZE_INT_MAX]
3647 number of elements as zero. */
3648 wmax = wi::zext (wmax, TYPE_PRECISION (TREE_TYPE (max)));
3649 gcc_assert (wi::fits_uhwi_p (wmax));
3650 write_unsigned_number (wmax.to_uhwi ());
3651 }
3652 else
3653 {
3654 max = TREE_OPERAND (max, 0);
3655 write_expression (max);
3656 }
d63b5e9f 3657 }
1f6e1acc
AS
3658 }
3659 write_char ('_');
3660 write_type (TREE_TYPE (type));
3661}
3662
3663/* Non-terminal <pointer-to-member-type> for pointer-to-member
3664 variables. TYPE is a pointer-to-member POINTER_TYPE.
3665
3666 <pointer-to-member-type> ::= M </class/ type> </member/ type> */
3667
3668static void
89aec4b1 3669write_pointer_to_member_type (const tree type)
1f6e1acc
AS
3670{
3671 write_char ('M');
6ea868b7 3672 write_type (TYPE_PTRMEM_CLASS_TYPE (type));
1f6e1acc
AS
3673 write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
3674}
3675
3676/* Non-terminal <template-param>. PARM is a TEMPLATE_TYPE_PARM,
a1281f45
KL
3677 TEMPLATE_TEMPLATE_PARM, BOUND_TEMPLATE_TEMPLATE_PARM or a
3678 TEMPLATE_PARM_INDEX.
1f6e1acc 3679
ee76b931 3680 <template-param> ::= T </parameter/ number> _ */
1f6e1acc
AS
3681
3682static void
89aec4b1 3683write_template_param (const tree parm)
1f6e1acc
AS
3684{
3685 int parm_index;
3686
3687 MANGLE_TRACE_TREE ("template-parm", parm);
3688
3689 switch (TREE_CODE (parm))
3690 {
3691 case TEMPLATE_TYPE_PARM:
3692 case TEMPLATE_TEMPLATE_PARM:
a1281f45 3693 case BOUND_TEMPLATE_TEMPLATE_PARM:
1f6e1acc
AS
3694 parm_index = TEMPLATE_TYPE_IDX (parm);
3695 break;
3696
3697 case TEMPLATE_PARM_INDEX:
3698 parm_index = TEMPLATE_PARM_IDX (parm);
3699 break;
3700
3701 default:
8dc2b103 3702 gcc_unreachable ();
1f6e1acc
AS
3703 }
3704
3705 write_char ('T');
3706 /* NUMBER as it appears in the mangling is (-1)-indexed, with the
3707 earliest template param denoted by `_'. */
d5f4eddd 3708 write_compact_number (parm_index);
1f6e1acc
AS
3709}
3710
3711/* <template-template-param>
0cbd7506 3712 ::= <template-param>
1f6e1acc
AS
3713 ::= <substitution> */
3714
3715static void
89aec4b1 3716write_template_template_param (const tree parm)
1f6e1acc 3717{
be93747e 3718 tree templ = NULL_TREE;
1f6e1acc
AS
3719
3720 /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the
3721 template template parameter. The substitution candidate here is
3722 only the template. */
a1281f45 3723 if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
1f6e1acc 3724 {
be93747e 3725 templ
1f6e1acc 3726 = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
be93747e 3727 if (find_substitution (templ))
1f6e1acc
AS
3728 return;
3729 }
3730
3731 /* <template-param> encodes only the template parameter position,
3732 not its template arguments, which is fine here. */
3733 write_template_param (parm);
be93747e
KG
3734 if (templ)
3735 add_substitution (templ);
1f6e1acc
AS
3736}
3737
c8094d83 3738/* Non-terminal <substitution>.
1f6e1acc
AS
3739
3740 <substitution> ::= S <seq-id> _
0cbd7506 3741 ::= S_ */
1f6e1acc
AS
3742
3743static void
89aec4b1 3744write_substitution (const int seq_id)
1f6e1acc
AS
3745{
3746 MANGLE_TRACE ("substitution", "");
3747
3748 write_char ('S');
3749 if (seq_id > 0)
82a362d0 3750 write_number (seq_id - 1, /*unsigned=*/1, 36);
1f6e1acc
AS
3751 write_char ('_');
3752}
3753
6397d80b 3754/* Start mangling ENTITY. */
1f6e1acc
AS
3755
3756static inline void
dae4174e 3757start_mangling (const tree entity)
1f6e1acc 3758{
6397d80b
MM
3759 G.entity = entity;
3760 G.need_abi_warning = false;
7b936140 3761 G.need_cxx17_warning = false;
dae4174e
TT
3762 obstack_free (&name_obstack, name_base);
3763 mangle_obstack = &name_obstack;
3764 name_base = obstack_alloc (&name_obstack, 0);
1f6e1acc
AS
3765}
3766
dae4174e
TT
3767/* Done with mangling. If WARN is true, and the name of G.entity will
3768 be mangled differently in a future version of the ABI, issue a
3769 warning. */
1f6e1acc 3770
dae4174e 3771static void
62984918 3772finish_mangling_internal (void)
1f6e1acc
AS
3773{
3774 /* Clear all the substitutions. */
9771b263 3775 vec_safe_truncate (G.substitutions, 0);
1f6e1acc
AS
3776
3777 /* Null-terminate the string. */
3778 write_char ('\0');
dae4174e
TT
3779}
3780
1f6e1acc 3781
dae4174e
TT
3782/* Like finish_mangling_internal, but return the mangled string. */
3783
3784static inline const char *
62984918 3785finish_mangling (void)
dae4174e 3786{
62984918 3787 finish_mangling_internal ();
2b8fe4a0 3788 return (const char *) obstack_finish (mangle_obstack);
1f6e1acc
AS
3789}
3790
dae4174e
TT
3791/* Like finish_mangling_internal, but return an identifier. */
3792
3793static tree
62984918 3794finish_mangling_get_identifier (void)
dae4174e 3795{
62984918 3796 finish_mangling_internal ();
dae4174e
TT
3797 /* Don't obstack_finish here, and the next start_mangling will
3798 remove the identifier. */
742c8819 3799 return get_identifier ((const char *) obstack_base (mangle_obstack));
dae4174e
TT
3800}
3801
1f6e1acc
AS
3802/* Initialize data structures for mangling. */
3803
3804void
edaf3e03 3805init_mangle (void)
1f6e1acc 3806{
2b8fe4a0
MM
3807 gcc_obstack_init (&name_obstack);
3808 name_base = obstack_alloc (&name_obstack, 0);
9771b263 3809 vec_alloc (G.substitutions, 0);
1f6e1acc
AS
3810
3811 /* Cache these identifiers for quick comparison when checking for
3812 standard substitutions. */
3813 subst_identifiers[SUBID_ALLOCATOR] = get_identifier ("allocator");
3814 subst_identifiers[SUBID_BASIC_STRING] = get_identifier ("basic_string");
3815 subst_identifiers[SUBID_CHAR_TRAITS] = get_identifier ("char_traits");
3816 subst_identifiers[SUBID_BASIC_ISTREAM] = get_identifier ("basic_istream");
3817 subst_identifiers[SUBID_BASIC_OSTREAM] = get_identifier ("basic_ostream");
3818 subst_identifiers[SUBID_BASIC_IOSTREAM] = get_identifier ("basic_iostream");
3819}
3820
3821/* Generate the mangled name of DECL. */
3822
dae4174e 3823static tree
89aec4b1 3824mangle_decl_string (const tree decl)
1f6e1acc 3825{
dae4174e 3826 tree result;
2a3dbebf
MM
3827 tree saved_fn = NULL_TREE;
3828 bool template_p = false;
3829
a6d66599
JM
3830 /* We shouldn't be trying to mangle an uninstantiated template. */
3831 gcc_assert (!type_dependent_expression_p (decl));
3832
2a3dbebf
MM
3833 if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
3834 {
3835 struct tinst_level *tl = current_instantiation ();
a56e2f69 3836 if ((!tl || tl->maybe_get_node () != decl)
4904b64b 3837 && push_tinst_level (decl))
2a3dbebf
MM
3838 {
3839 template_p = true;
3840 saved_fn = current_function_decl;
2a3dbebf
MM
3841 current_function_decl = NULL_TREE;
3842 }
3843 }
c872f150 3844 iloc_sentinel ils (DECL_SOURCE_LOCATION (decl));
1f6e1acc 3845
dae4174e 3846 start_mangling (decl);
1f6e1acc
AS
3847
3848 if (TREE_CODE (decl) == TYPE_DECL)
3849 write_type (TREE_TYPE (decl));
3850 else
5fd80fbc 3851 write_mangled_name (decl, true);
c8094d83 3852
62984918 3853 result = finish_mangling_get_identifier ();
1f6e1acc 3854 if (DEBUG_MANGLE)
dae4174e
TT
3855 fprintf (stderr, "mangle_decl_string = '%s'\n\n",
3856 IDENTIFIER_POINTER (result));
2a3dbebf
MM
3857
3858 if (template_p)
3859 {
3860 pop_tinst_level ();
3861 current_function_decl = saved_fn;
3862 }
2a3dbebf 3863
1f6e1acc
AS
3864 return result;
3865}
3866
596c1381
DN
3867/* Return an identifier for the external mangled name of DECL. */
3868
3869static tree
3870get_mangled_id (tree decl)
3871{
3872 tree id = mangle_decl_string (decl);
3873 return targetm.mangle_decl_assembler_name (decl, id);
3874}
3875
1f6e1acc
AS
3876/* Create an identifier for the external mangled name of DECL. */
3877
92643fea 3878void
89aec4b1 3879mangle_decl (const tree decl)
1f6e1acc 3880{
a7cd72be
JM
3881 tree id;
3882 bool dep;
3883
3884 /* Don't bother mangling uninstantiated templates. */
3885 ++processing_template_decl;
3886 if (TREE_CODE (decl) == TYPE_DECL)
3887 dep = dependent_type_p (TREE_TYPE (decl));
3888 else
3889 dep = (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
3890 && any_dependent_template_arguments_p (DECL_TI_ARGS (decl)));
3891 --processing_template_decl;
3892 if (dep)
3893 return;
3894
233ce289
JH
3895 /* During LTO we keep mangled names of TYPE_DECLs for ODR type merging.
3896 It is not needed to assign names to anonymous namespace, but we use the
3897 "<anon>" marker to be able to tell if type is C++ ODR type or type
3898 produced by other language. */
3899 if (TREE_CODE (decl) == TYPE_DECL
3900 && TYPE_STUB_DECL (TREE_TYPE (decl))
3901 && !TREE_PUBLIC (TYPE_STUB_DECL (TREE_TYPE (decl))))
3902 id = get_identifier ("<anon>");
3903 else
3904 {
3905 gcc_assert (TREE_CODE (decl) != TYPE_DECL
3906 || !no_linkage_check (TREE_TYPE (decl), true));
747b61fc
JM
3907 if (abi_version_at_least (10))
3908 if (tree fn = decl_function_context (decl))
3909 maybe_check_abi_tags (fn, decl);
233ce289
JH
3910 id = get_mangled_id (decl);
3911 }
5234b8f5 3912 SET_DECL_ASSEMBLER_NAME (decl, id);
58a15cf8 3913
7b936140 3914 if (G.need_cxx17_warning
0569479e 3915 && (TREE_PUBLIC (decl) || DECL_REALLY_EXTERN (decl)))
108154ff 3916 warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wnoexcept_type,
51dc6603
JM
3917 "mangled name for %qD will change in C++17 because the "
3918 "exception specification is part of a function type",
3919 decl);
3920
1cc1ac7f 3921 if (id != DECL_NAME (decl)
1be3db36 3922 /* Don't do this for a fake symbol we aren't going to emit anyway. */
1ea32974 3923 && TREE_CODE (decl) != TYPE_DECL
5f150326 3924 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (decl))
58a15cf8 3925 {
72a30e45
JM
3926 int save_ver = flag_abi_version;
3927 tree id2 = NULL_TREE;
1cc1ac7f 3928
72a30e45 3929 if (!DECL_REALLY_EXTERN (decl))
1cc1ac7f 3930 {
b419102c 3931 record_mangling (decl, G.need_abi_warning);
1cc1ac7f 3932
72a30e45
JM
3933 if (!G.need_abi_warning)
3934 return;
58a15cf8 3935
72a30e45
JM
3936 flag_abi_version = flag_abi_compat_version;
3937 id2 = mangle_decl_string (decl);
3938 id2 = targetm.mangle_decl_assembler_name (decl, id2);
3939 flag_abi_version = save_ver;
58a15cf8 3940
72a30e45
JM
3941 if (id2 != id)
3942 note_mangling_alias (decl, id2);
3943 }
62984918
JM
3944
3945 if (warn_abi)
3946 {
0f2c4a8f
MS
3947 const char fabi_version[] = "-fabi-version";
3948
72a30e45
JM
3949 if (flag_abi_compat_version != warn_abi_version
3950 || id2 == NULL_TREE)
a75f1574
JM
3951 {
3952 flag_abi_version = warn_abi_version;
3953 id2 = mangle_decl_string (decl);
3954 id2 = targetm.mangle_decl_assembler_name (decl, id2);
3955 }
352b8bab 3956 flag_abi_version = save_ver;
a75f1574
JM
3957
3958 if (id2 == id)
3959 /* OK. */;
3960 else if (warn_abi_version != 0
3961 && abi_version_at_least (warn_abi_version))
4b1cbcee
PC
3962 warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi,
3963 "the mangled name of %qD changed between "
0f2c4a8f
MS
3964 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
3965 G.entity, fabi_version, warn_abi_version, id2,
3966 fabi_version, save_ver, id);
62984918 3967 else
4b1cbcee
PC
3968 warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi,
3969 "the mangled name of %qD changes between "
0f2c4a8f
MS
3970 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
3971 G.entity, fabi_version, save_ver, id,
3972 fabi_version, warn_abi_version, id2);
62984918
JM
3973 }
3974
a75f1574 3975 flag_abi_version = save_ver;
1b88f240 3976 }
1f6e1acc
AS
3977}
3978
52669d59 3979/* Generate the mangled representation of TYPE. */
1f6e1acc
AS
3980
3981const char *
52669d59 3982mangle_type_string (const tree type)
1f6e1acc
AS
3983{
3984 const char *result;
3985
dae4174e 3986 start_mangling (type);
1f6e1acc 3987 write_type (type);
62984918 3988 result = finish_mangling ();
1f6e1acc
AS
3989 if (DEBUG_MANGLE)
3990 fprintf (stderr, "mangle_type_string = '%s'\n\n", result);
3991 return result;
3992}
3993
1f6e1acc
AS
3994/* Create an identifier for the mangled name of a special component
3995 for belonging to TYPE. CODE is the ABI-specified code for this
3996 component. */
3997
3998static tree
89aec4b1 3999mangle_special_for_type (const tree type, const char *code)
1f6e1acc 4000{
dae4174e 4001 tree result;
1f6e1acc
AS
4002
4003 /* We don't have an actual decl here for the special component, so
4004 we can't just process the <encoded-name>. Instead, fake it. */
dae4174e 4005 start_mangling (type);
1f6e1acc
AS
4006
4007 /* Start the mangling. */
4008 write_string ("_Z");
4009 write_string (code);
4010
4011 /* Add the type. */
4012 write_type (type);
62984918 4013 result = finish_mangling_get_identifier ();
1f6e1acc
AS
4014
4015 if (DEBUG_MANGLE)
dae4174e
TT
4016 fprintf (stderr, "mangle_special_for_type = %s\n\n",
4017 IDENTIFIER_POINTER (result));
1f6e1acc 4018
dae4174e 4019 return result;
1f6e1acc
AS
4020}
4021
4022/* Create an identifier for the mangled representation of the typeinfo
4023 structure for TYPE. */
4024
4025tree
89aec4b1 4026mangle_typeinfo_for_type (const tree type)
1f6e1acc
AS
4027{
4028 return mangle_special_for_type (type, "TI");
4029}
4030
4031/* Create an identifier for the mangled name of the NTBS containing
4032 the mangled name of TYPE. */
4033
4034tree
89aec4b1 4035mangle_typeinfo_string_for_type (const tree type)
1f6e1acc
AS
4036{
4037 return mangle_special_for_type (type, "TS");
4038}
4039
4040/* Create an identifier for the mangled name of the vtable for TYPE. */
4041
4042tree
89aec4b1 4043mangle_vtbl_for_type (const tree type)
1f6e1acc
AS
4044{
4045 return mangle_special_for_type (type, "TV");
4046}
4047
4048/* Returns an identifier for the mangled name of the VTT for TYPE. */
4049
4050tree
89aec4b1 4051mangle_vtt_for_type (const tree type)
1f6e1acc
AS
4052{
4053 return mangle_special_for_type (type, "TT");
4054}
4055
a0f5b987
JJ
4056/* Returns an identifier for the mangled name of the decomposition
4057 artificial variable DECL. DECLS is the vector of the VAR_DECLs
4058 for the identifier-list. */
4059
4060tree
4061mangle_decomp (const tree decl, vec<tree> &decls)
4062{
4063 gcc_assert (!type_dependent_expression_p (decl));
4064
4065 location_t saved_loc = input_location;
4066 input_location = DECL_SOURCE_LOCATION (decl);
4067
4068 start_mangling (decl);
4069 write_string ("_Z");
4070
4071 tree context = decl_mangling_context (decl);
4072 gcc_assert (context != NULL_TREE);
4073
4074 bool nested = false;
4075 if (DECL_NAMESPACE_STD_P (context))
4076 write_string ("St");
4077 else if (context != global_namespace)
4078 {
4079 nested = true;
4080 write_char ('N');
4081 write_prefix (decl_mangling_context (decl));
4082 }
4083
4084 write_string ("DC");
4085 unsigned int i;
4086 tree d;
4087 FOR_EACH_VEC_ELT (decls, i, d)
4088 write_unqualified_name (d);
4089 write_char ('E');
4090
4091 if (nested)
4092 write_char ('E');
4093
4094 tree id = finish_mangling_get_identifier ();
4095 if (DEBUG_MANGLE)
4096 fprintf (stderr, "mangle_decomp = '%s'\n\n",
4097 IDENTIFIER_POINTER (id));
4098
4099 input_location = saved_loc;
4100 return id;
4101}
4102
1f6e1acc
AS
4103/* Return an identifier for a construction vtable group. TYPE is
4104 the most derived class in the hierarchy; BINFO is the base
c8094d83 4105 subobject for which this construction vtable group will be used.
1f6e1acc
AS
4106
4107 This mangling isn't part of the ABI specification; in the ABI
4108 specification, the vtable group is dumped in the same COMDAT as the
4109 main vtable, and is referenced only from that vtable, so it doesn't
4110 need an external name. For binary formats without COMDAT sections,
c8094d83 4111 though, we need external names for the vtable groups.
1f6e1acc
AS
4112
4113 We use the production
4114
4115 <special-name> ::= CT <type> <offset number> _ <base type> */
4116
4117tree
89aec4b1 4118mangle_ctor_vtbl_for_type (const tree type, const tree binfo)
1f6e1acc 4119{
dae4174e 4120 tree result;
1f6e1acc 4121
dae4174e 4122 start_mangling (type);
1f6e1acc
AS
4123
4124 write_string ("_Z");
4125 write_string ("TC");
4126 write_type (type);
4127 write_integer_cst (BINFO_OFFSET (binfo));
4128 write_char ('_');
4129 write_type (BINFO_TYPE (binfo));
4130
62984918 4131 result = finish_mangling_get_identifier ();
1f6e1acc 4132 if (DEBUG_MANGLE)
dae4174e
TT
4133 fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n",
4134 IDENTIFIER_POINTER (result));
4135 return result;
1f6e1acc
AS
4136}
4137
4977bab6 4138/* Mangle a this pointer or result pointer adjustment.
c8094d83 4139
4977bab6
ZW
4140 <call-offset> ::= h <fixed offset number> _
4141 ::= v <fixed offset number> _ <virtual offset number> _ */
c8094d83 4142
4977bab6 4143static void
89aec4b1 4144mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
4977bab6 4145{
07fa4878 4146 write_char (virtual_offset ? 'v' : 'h');
1f6e1acc 4147
4977bab6
ZW
4148 /* For either flavor, write the fixed offset. */
4149 write_integer_cst (fixed_offset);
4150 write_char ('_');
4151
4152 /* For a virtual thunk, add the virtual offset. */
4153 if (virtual_offset)
4154 {
4155 write_integer_cst (virtual_offset);
4156 write_char ('_');
4157 }
4158}
4159
4160/* Return an identifier for the mangled name of a this-adjusting or
4161 covariant thunk to FN_DECL. FIXED_OFFSET is the initial adjustment
4162 to this used to find the vptr. If VIRTUAL_OFFSET is non-NULL, this
4163 is a virtual thunk, and it is the vtbl offset in
4de8668e 4164 bytes. THIS_ADJUSTING is nonzero for a this adjusting thunk and
4977bab6
ZW
4165 zero for a covariant thunk. Note, that FN_DECL might be a covariant
4166 thunk itself. A covariant thunk name always includes the adjustment
4167 for the this pointer, even if there is none.
4168
4169 <special-name> ::= T <call-offset> <base encoding>
0cbd7506 4170 ::= Tc <this_adjust call-offset> <result_adjust call-offset>
3db45ab5 4171 <base encoding> */
1f6e1acc
AS
4172
4173tree
89aec4b1 4174mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
328eae1c 4175 tree virtual_offset, tree thunk)
1f6e1acc 4176{
dae4174e 4177 tree result;
c8094d83 4178
328eae1c
JM
4179 if (abi_version_at_least (11))
4180 maybe_check_abi_tags (fn_decl, thunk, 11);
4181
dae4174e 4182 start_mangling (fn_decl);
1f6e1acc
AS
4183
4184 write_string ("_Z");
1f6e1acc 4185 write_char ('T');
c8094d83 4186
07fa4878 4187 if (!this_adjusting)
4977bab6
ZW
4188 {
4189 /* Covariant thunk with no this adjustment */
4190 write_char ('c');
4191 mangle_call_offset (integer_zero_node, NULL_TREE);
4192 mangle_call_offset (fixed_offset, virtual_offset);
4193 }
07fa4878
NS
4194 else if (!DECL_THUNK_P (fn_decl))
4195 /* Plain this adjusting thunk. */
4196 mangle_call_offset (fixed_offset, virtual_offset);
1f6e1acc 4197 else
1f6e1acc 4198 {
4977bab6
ZW
4199 /* This adjusting thunk to covariant thunk. */
4200 write_char ('c');
4201 mangle_call_offset (fixed_offset, virtual_offset);
07fa4878
NS
4202 fixed_offset = ssize_int (THUNK_FIXED_OFFSET (fn_decl));
4203 virtual_offset = THUNK_VIRTUAL_OFFSET (fn_decl);
4204 if (virtual_offset)
4205 virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
4206 mangle_call_offset (fixed_offset, virtual_offset);
4207 fn_decl = THUNK_TARGET (fn_decl);
1f6e1acc
AS
4208 }
4209
4210 /* Scoped name. */
4211 write_encoding (fn_decl);
4212
62984918 4213 result = finish_mangling_get_identifier ();
1f6e1acc 4214 if (DEBUG_MANGLE)
dae4174e
TT
4215 fprintf (stderr, "mangle_thunk = %s\n\n", IDENTIFIER_POINTER (result));
4216 return result;
1f6e1acc
AS
4217}
4218
b1568582
JM
4219/* Handle ABI backwards compatibility for past bugs where we didn't call
4220 check_abi_tags in places where it's needed: call check_abi_tags and warn if
747b61fc
JM
4221 it makes a difference. If FOR_DECL is non-null, it's the declaration
4222 that we're actually trying to mangle; if it's null, we're mangling the
4223 guard variable for T. */
b1568582
JM
4224
4225static void
328eae1c 4226maybe_check_abi_tags (tree t, tree for_decl, int ver)
b1568582 4227{
747b61fc
JM
4228 if (DECL_ASSEMBLER_NAME_SET_P (t))
4229 return;
4230
884929e2 4231 tree oldtags = get_abi_tags (t);
b1568582 4232
747b61fc 4233 mangle_decl (t);
b1568582 4234
884929e2
JM
4235 tree newtags = get_abi_tags (t);
4236 if (newtags && newtags != oldtags
328eae1c 4237 && abi_version_crosses (ver))
747b61fc 4238 {
328eae1c
JM
4239 if (for_decl && DECL_THUNK_P (for_decl))
4240 warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
4241 "the mangled name of a thunk for %qD changes between "
a3f9f006 4242 "%<-fabi-version=%d%> and %<-fabi-version=%d%>",
328eae1c
JM
4243 t, flag_abi_version, warn_abi_version);
4244 else if (for_decl)
747b61fc
JM
4245 warning_at (DECL_SOURCE_LOCATION (for_decl), OPT_Wabi,
4246 "the mangled name of %qD changes between "
a3f9f006 4247 "%<-fabi-version=%d%> and %<-fabi-version=%d%>",
747b61fc
JM
4248 for_decl, flag_abi_version, warn_abi_version);
4249 else
4250 warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
5995f597 4251 "the mangled name of the initialization guard variable "
a3f9f006
ML
4252 "for %qD changes between %<-fabi-version=%d%> and "
4253 "%<-fabi-version=%d%>",
747b61fc
JM
4254 t, flag_abi_version, warn_abi_version);
4255 }
b1568582
JM
4256}
4257
7c424acd
JM
4258/* Write out the appropriate string for this variable when generating
4259 another mangled name based on this one. */
1f6e1acc 4260
7c424acd
JM
4261static void
4262write_guarded_var_name (const tree variable)
1f6e1acc 4263{
5a5e7deb
JM
4264 if (DECL_NAME (variable)
4265 && strncmp (IDENTIFIER_POINTER (DECL_NAME (variable)), "_ZGR", 4) == 0)
08ac397c
JM
4266 /* The name of a guard variable for a reference temporary should refer
4267 to the reference, not the temporary. */
4268 write_string (IDENTIFIER_POINTER (DECL_NAME (variable)) + 4);
4269 else
747b61fc 4270 write_name (variable, /*ignore_local_scope=*/0);
7c424acd
JM
4271}
4272
4273/* Return an identifier for the name of an initialization guard
4274 variable for indicated VARIABLE. */
4275
4276tree
4277mangle_guard_variable (const tree variable)
4278{
747b61fc
JM
4279 if (abi_version_at_least (10))
4280 maybe_check_abi_tags (variable);
7c424acd
JM
4281 start_mangling (variable);
4282 write_string ("_ZGV");
4283 write_guarded_var_name (variable);
62984918 4284 return finish_mangling_get_identifier ();
7c424acd
JM
4285}
4286
4287/* Return an identifier for the name of a thread_local initialization
4288 function for VARIABLE. */
4289
4290tree
4291mangle_tls_init_fn (const tree variable)
4292{
6c554a2a 4293 check_abi_tags (variable);
7c424acd
JM
4294 start_mangling (variable);
4295 write_string ("_ZTH");
4296 write_guarded_var_name (variable);
62984918 4297 return finish_mangling_get_identifier ();
7c424acd
JM
4298}
4299
4300/* Return an identifier for the name of a thread_local wrapper
4301 function for VARIABLE. */
4302
4303#define TLS_WRAPPER_PREFIX "_ZTW"
4304
4305tree
4306mangle_tls_wrapper_fn (const tree variable)
4307{
6c554a2a 4308 check_abi_tags (variable);
7c424acd
JM
4309 start_mangling (variable);
4310 write_string (TLS_WRAPPER_PREFIX);
4311 write_guarded_var_name (variable);
62984918 4312 return finish_mangling_get_identifier ();
1f6e1acc 4313}
23d4e4cc 4314
7c424acd
JM
4315/* Return true iff FN is a thread_local wrapper function. */
4316
4317bool
4318decl_tls_wrapper_p (const tree fn)
4319{
4320 if (TREE_CODE (fn) != FUNCTION_DECL)
4321 return false;
4322 tree name = DECL_NAME (fn);
4323 return strncmp (IDENTIFIER_POINTER (name), TLS_WRAPPER_PREFIX,
4324 strlen (TLS_WRAPPER_PREFIX)) == 0;
4325}
4326
08ac397c 4327/* Return an identifier for the name of a temporary variable used to
b5d0294e 4328 initialize a static reference. This is now part of the ABI. */
b25dd954 4329
08ac397c 4330tree
89aec4b1 4331mangle_ref_init_variable (const tree variable)
08ac397c 4332{
dae4174e 4333 start_mangling (variable);
08ac397c 4334 write_string ("_ZGR");
b1568582 4335 check_abi_tags (variable);
08ac397c 4336 write_name (variable, /*ignore_local_scope=*/0);
b25dd954
JM
4337 /* Avoid name clashes with aggregate initialization of multiple
4338 references at once. */
b5d0294e 4339 write_compact_number (current_ref_temp_count++);
62984918 4340 return finish_mangling_get_identifier ();
08ac397c 4341}
4be5c72c
JM
4342
4343/* Return an identifier for the mangled name of a C++20 template parameter
4344 object for template argument EXPR. */
4345
4346tree
4347mangle_template_parm_object (tree expr)
4348{
4349 start_mangling (expr);
4350 write_string ("_ZTAX");
4351 write_expression (expr);
4352 write_char ('E');
4353 return finish_mangling_get_identifier ();
4354}
23d4e4cc 4355\f
2077db1b
CT
4356/* Given a CLASS_TYPE, such as a record for std::bad_exception this
4357 function generates a mangled name for the vtable map variable of
4358 the class type. For example, if the class type is
4359 "std::bad_exception", the mangled name for the class is
4360 "St13bad_exception". This function would generate the name
4361 "_ZN4_VTVISt13bad_exceptionE12__vtable_mapE", which unmangles as:
4362 "_VTV<std::bad_exception>::__vtable_map". */
4363
4364
4365char *
4366get_mangled_vtable_map_var_name (tree class_type)
4367{
4368 char *var_name = NULL;
4369 const char *prefix = "_ZN4_VTVI";
4370 const char *postfix = "E12__vtable_mapE";
4371
4372 gcc_assert (TREE_CODE (class_type) == RECORD_TYPE);
4373
4374 tree class_id = DECL_ASSEMBLER_NAME (TYPE_NAME (class_type));
b0cca5ec
CT
4375
4376 if (strstr (IDENTIFIER_POINTER (class_id), "<anon>") != NULL)
4377 {
4378 class_id = get_mangled_id (TYPE_NAME (class_type));
4379 vtbl_register_mangled_name (TYPE_NAME (class_type), class_id);
4380 }
4381
2077db1b
CT
4382 unsigned int len = strlen (IDENTIFIER_POINTER (class_id)) +
4383 strlen (prefix) +
4384 strlen (postfix) + 1;
4385
4386 var_name = (char *) xmalloc (len);
4387
4388 sprintf (var_name, "%s%s%s", prefix, IDENTIFIER_POINTER (class_id), postfix);
4389
4390 return var_name;
4391}
4392
0de298af 4393#include "gt-cp-mangle.h"