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