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