mangle.c (write_special_name_constructor): Don't generate assembler junk when confron...
[platform/upstream/gcc.git] / gcc / cp / mangle.c
1 /* Name mangling for the new standard C++ ABI.
2    Copyright (C) 2000 Free Software Foundation, Inc.
3    Written by Alex Samuel <sameul@codesourcery.com>
4
5    This file is part of GNU CC.
6
7    GNU CC 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 2, or (at your option)
10    any later version.
11
12    GNU CC 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 GNU CC; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 /* This file implements mangling of C++ names according to the IA64
23    C++ ABI specification.  A mangled name encodes a function or
24    variable's name, scope, type, and/or template arguments into a text
25    identifier.  This identifier is used as the function's or
26    variable's linkage name, to preserve compatibility between C++'s
27    language features (templates, scoping, and overloading) and C
28    linkers.
29
30    Additionally, g++ uses mangled names internally.  To support this,
31    mangling of types is allowed, even though the mangled name of a
32    type should not appear by itself as an exported name.  Ditto for
33    uninstantiated templates.
34
35    The primary entry point for this module is mangle_decl, which
36    returns an identifier containing the mangled name for a decl.
37    Additional entry points are provided to build mangled names of
38    particular constructs when the appropriate decl for that construct
39    is not available.  These are:
40
41      mangle_typeinfo_for_type:        typeinfo data
42      mangle_typeinfo_string_for_type: typeinfo type name
43      mangle_vtbl_for_type:            virtual table data
44      mangle_vtt_for_type:             VTT data
45      mangle_ctor_vtbl_for_type:       `C-in-B' constructor virtual table data
46      mangle_thunk:                    thunk function or entry
47
48 */
49
50 #include "config.h"
51 #include "system.h"
52 #include "tree.h"
53 #include "cp-tree.h"
54 #include "obstack.h"
55 #include "toplev.h"
56 #include "varray.h"
57
58 /* Debugging support.  */
59
60 /* Define DEBUG_MANGLE to enable very verbose trace messages.  */
61 #ifndef DEBUG_MANGLE
62 #define DEBUG_MANGLE 0
63 #endif
64
65 /* Macros for tracing the write_* functions.  */
66 #if DEBUG_MANGLE
67 # define MANGLE_TRACE(FN, INPUT) \
68   fprintf (stderr, "  %-24s: %-24s\n", FN, INPUT)
69 # define MANGLE_TRACE_TREE(FN, NODE) \
70   fprintf (stderr, "  %-24s: %-24s (%p)\n", \
71            FN, tree_code_name[TREE_CODE (NODE)], (void *) NODE)
72 #else
73 # define MANGLE_TRACE(FN, INPUT)
74 # define MANGLE_TRACE_TREE(FN, NODE)
75 #endif
76
77 /* Non-zero if NODE is a class template-id.  We can't rely on
78    CLASSTYPE_USE_TEMPLATE here because of tricky bugs in the parser
79    that hard to distinguish A<T> from A, where A<T> is the type as
80    instantiated outside of the template, and A is the type used
81    without parameters inside the template.  */
82 #define CLASSTYPE_TEMPLATE_ID_P(NODE)                                 \
83   (TYPE_LANG_SPECIFIC (NODE) != NULL                                  \
84    && CLASSTYPE_TEMPLATE_INFO (NODE) != NULL                          \
85    && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))
86
87 /* Things we only need one of.  This module is not reentrant.  */
88 static struct globals
89 {
90   /* The name in which we're building the mangled name.  */
91   struct obstack name_obstack;
92
93   /* An array of the current substitution candidates, in the order
94      we've seen them.  */
95   varray_type substitutions;
96 } G;
97
98 /* Indices into subst_identifiers.  These are identifiers used in
99    special substitution rules.  */
100 typedef enum
101 {
102   SUBID_ALLOCATOR,
103   SUBID_BASIC_STRING,
104   SUBID_CHAR_TRAITS,
105   SUBID_BASIC_ISTREAM,
106   SUBID_BASIC_OSTREAM,
107   SUBID_BASIC_IOSTREAM,
108   SUBID_MAX
109 }
110 substitution_identifier_index_t;
111
112 /* For quick substitution checks, look up these common identifiers
113    once only.  */
114 static tree subst_identifiers[SUBID_MAX];
115
116 /* Single-letter codes for builtin integer types, defined in
117    <builtin-type>.  These are indexed by integer_type_kind values.  */
118 static char
119 integer_type_codes[itk_none] =
120 {
121   'c',  /* itk_char */
122   'a',  /* itk_signed_char */
123   'h',  /* itk_unsigned_char */
124   's',  /* itk_short */
125   't',  /* itk_unsigned_short */
126   'i',  /* itk_int */
127   'j',  /* itk_unsigned_int */
128   'l',  /* itk_long */
129   'm',  /* itk_unsigned_long */
130   'x',  /* itk_long_long */
131   'y'   /* itk_unsigned_long_long */
132 };
133
134 static int decl_is_template_id PARAMS ((tree, tree*));
135
136 /* Functions for handling substitutions.  */
137
138 static inline tree canonicalize_for_substitution PARAMS ((tree));
139 static void add_substitution PARAMS ((tree));
140 static inline int is_std_substitution PARAMS ((tree, substitution_identifier_index_t));
141 static inline int is_std_substitution_char PARAMS ((tree, substitution_identifier_index_t));
142 static int find_substitution PARAMS ((tree));
143
144 /* Functions for emitting mangled representations of things.  */
145
146 static void write_mangled_name PARAMS ((tree));
147 static void write_encoding PARAMS ((tree));
148 static void write_name PARAMS ((tree, int));
149 static void write_unscoped_name PARAMS ((tree));
150 static void write_unscoped_template_name PARAMS ((tree));
151 static void write_nested_name PARAMS ((tree));
152 static void write_prefix PARAMS ((tree));
153 static void write_template_prefix PARAMS ((tree));
154 static void write_unqualified_name PARAMS ((tree));
155 static void write_source_name PARAMS ((tree));
156 static void write_number PARAMS ((unsigned HOST_WIDE_INT, int,
157                                   unsigned int));
158 static void write_integer_cst PARAMS ((tree));
159 static void write_identifier PARAMS ((const char *));
160 static void write_special_name_constructor PARAMS ((tree));
161 static void write_special_name_destructor PARAMS ((tree));
162 static void write_type PARAMS ((tree));
163 static int write_CV_qualifiers_for_type PARAMS ((tree));
164 static void write_builtin_type PARAMS ((tree));
165 static void write_function_type PARAMS ((tree));
166 static void write_bare_function_type PARAMS ((tree, int));
167 static void write_method_parms PARAMS ((tree, int));
168 static void write_class_enum_type PARAMS ((tree));
169 static void write_template_args PARAMS ((tree));
170 static void write_expression PARAMS ((tree));
171 static void write_template_arg_literal PARAMS ((tree));
172 static void write_template_arg PARAMS ((tree));
173 static void write_template_template_arg PARAMS ((tree));
174 static void write_array_type PARAMS ((tree));
175 static void write_pointer_to_member_type PARAMS ((tree));
176 static void write_template_param PARAMS ((tree));
177 static void write_template_template_param PARAMS ((tree));
178 static void write_substitution PARAMS ((int));
179 static int discriminator_for_local_entity PARAMS ((tree));
180 static int discriminator_for_string_literal PARAMS ((tree, tree));
181 static void write_discriminator PARAMS ((int));
182 static void write_local_name PARAMS ((tree, tree, tree));
183 static void dump_substitution_candidates PARAMS ((void));
184 static const char *mangle_decl_string PARAMS ((tree));
185
186 /* Control functions.  */
187
188 static inline void start_mangling PARAMS ((void));
189 static inline const char *finish_mangling PARAMS ((void));
190 static tree mangle_special_for_type PARAMS ((tree, const char *));
191
192 /* Append a single character to the end of the mangled
193    representation.  */
194 #define write_char(CHAR)                                              \
195   obstack_1grow (&G.name_obstack, (CHAR))
196
197 /* Append a NUL-terminated string to the end of the mangled
198    representation.  */
199 #define write_string(STRING)                                          \
200   obstack_grow (&G.name_obstack, (STRING), strlen (STRING))
201
202 /* Return the position at which the next character will be appended to
203    the mangled representation.  */
204 #define mangled_position()                                              \
205   obstack_object_size (&G.name_obstack)
206
207 /* Non-zero if NODE1 and NODE2 are both TREE_LIST nodes and have the
208    same purpose (context, which may be a type) and value (template
209    decl).  See write_template_prefix for more information on what this
210    is used for.  */
211 #define NESTED_TEMPLATE_MATCH(NODE1, NODE2)                         \
212   (TREE_CODE (NODE1) == TREE_LIST                                     \
213    && TREE_CODE (NODE2) == TREE_LIST                                  \
214    && ((TYPE_P (TREE_PURPOSE (NODE1))                                 \
215         && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2)))\
216        || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2))             \
217    && TREE_VALUE (NODE1) == TREE_VALUE (NODE2))
218
219 /* Write out a signed quantity in base 10.  */
220 #define write_signed_number(NUMBER) \
221   write_number (NUMBER, /*unsigned_p=*/0, 10)
222
223 /* Write out an unsigned quantity in base 10.  */
224 #define write_unsigned_number(NUMBER) \
225   write_number (NUMBER, /*unsigned_p=*/1, 10)
226
227 /* If DECL is a template instance, return non-zero and, if
228    TEMPLATE_INFO is non-NULL, set *TEMPLATE_INFO to its template info.
229    Otherwise return zero.  */
230
231 static int
232 decl_is_template_id (decl, template_info)
233      tree decl;
234      tree* template_info;
235 {
236   if (TREE_CODE (decl) == TYPE_DECL)
237     {
238       /* TYPE_DECLs are handled specially.  Look at its type to decide
239          if this is a template instantiation.  */
240       tree type = TREE_TYPE (decl);
241
242       if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_ID_P (type))
243         {
244           if (template_info != NULL)
245             /* For a templated TYPE_DECL, the template info is hanging
246                off the type.  */
247             *template_info = CLASSTYPE_TEMPLATE_INFO (type);
248           return 1;
249         }
250     } 
251   else
252     {
253       /* Check if this is a primary template.  */
254       if (DECL_LANG_SPECIFIC (decl) != NULL
255           && DECL_USE_TEMPLATE (decl)
256           && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl))
257           && TREE_CODE (decl) != TEMPLATE_DECL)
258         {
259           if (template_info != NULL)
260             /* For most templated decls, the template info is hanging
261                off the decl.  */
262             *template_info = DECL_TEMPLATE_INFO (decl);
263           return 1;
264         }
265     }
266
267   /* It's not a template id.  */
268   return 0;
269 }
270
271 /* Produce debugging output of current substitution candidates.  */
272
273 static void
274 dump_substitution_candidates ()
275 {
276   unsigned i;
277
278   fprintf (stderr, "  ++ substitutions  ");
279   for (i = 0; i < VARRAY_ACTIVE_SIZE (G.substitutions); ++i)
280     {
281       tree el = VARRAY_TREE (G.substitutions, i);
282       const char *name = "???";
283
284       if (i > 0)
285         fprintf (stderr, "                    ");
286       if (DECL_P (el))
287         name = IDENTIFIER_POINTER (DECL_NAME (el));
288       else if (TREE_CODE (el) == TREE_LIST)
289         name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el)));
290       else if (TYPE_NAME (el))
291         name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (el)));
292       fprintf (stderr, " S%d_ = ", i - 1);
293       if (TYPE_P (el) && 
294           (CP_TYPE_RESTRICT_P (el) 
295            || CP_TYPE_VOLATILE_P (el) 
296            || CP_TYPE_CONST_P (el)))
297         fprintf (stderr, "CV-");
298       fprintf (stderr, "%s (%s at %p)\n", 
299                name, tree_code_name[TREE_CODE (el)], (void *) el);
300     }
301 }
302
303 /* Both decls and types can be substitution candidates, but sometimes
304    they refer to the same thing.  For instance, a TYPE_DECL and
305    RECORD_TYPE for the same class refer to the same thing, and should
306    be treated accordinginly in substitutions.  This function returns a
307    canonicalized tree node representing NODE that is used when adding
308    and substitution candidates and finding matches.  */
309
310 static inline tree
311 canonicalize_for_substitution (node)
312      tree node;
313 {
314   /* For a TYPE_DECL, use the type instead.  */
315   if (TREE_CODE (node) == TYPE_DECL)
316     node = TREE_TYPE (node);
317   if (TYPE_P (node))
318     node = canonical_type_variant (node);
319
320   return node;
321 }
322
323 /* Add NODE as a substitution candidate.  NODE must not already be on
324    the list of candidates.  */
325
326 static void
327 add_substitution (node)
328      tree node;
329 {
330   tree c;
331
332   if (DEBUG_MANGLE)
333     fprintf (stderr, "  ++ add_substitution (%s at %10p)\n", 
334              tree_code_name[TREE_CODE (node)], (void *) node);
335
336   /* Get the canonicalized substitution candidate for NODE.  */
337   c = canonicalize_for_substitution (node);
338   if (DEBUG_MANGLE && c != node)
339     fprintf (stderr, "  ++ using candidate (%s at %10p)\n",
340              tree_code_name[TREE_CODE (node)], (void *) node);
341   node = c;
342
343 #if ENABLE_CHECKING
344   /* Make sure NODE isn't already a candidate.  */
345   {
346     int i;
347     for (i = VARRAY_ACTIVE_SIZE (G.substitutions); --i >= 0; )
348       {
349         tree candidate = VARRAY_TREE (G.substitutions, i);
350         if ((DECL_P (node) 
351              && node == candidate)
352             || (TYPE_P (node) 
353                 && TYPE_P (candidate) 
354                 && same_type_p (node, candidate)))
355           my_friendly_abort (20000524);
356       }
357   }
358 #endif /* ENABLE_CHECKING */
359
360   /* Put the decl onto the varray of substitution candidates.  */
361   VARRAY_PUSH_TREE (G.substitutions, node);
362
363   if (DEBUG_MANGLE)
364     dump_substitution_candidates ();
365 }
366
367 /* Helper function for find_substitution.  Returns non-zero if NODE,
368    which may be a decl or a CLASS_TYPE, is a template-id with template
369    name of substitution_index[INDEX] in the ::std namespace.  */
370
371 static inline int 
372 is_std_substitution (node, index)
373      tree node;
374      substitution_identifier_index_t index;
375 {
376   tree type = NULL;
377   tree decl = NULL;
378
379   if (DECL_P (node))
380     {
381       type = TREE_TYPE (node);
382       decl = node;
383     }
384   else if (CLASS_TYPE_P (node))
385     {
386       type = node;
387       decl = TYPE_NAME (node);
388     }
389   else 
390     /* These are not the droids you're looking for.  */
391     return 0;
392
393   return (DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))
394           && TYPE_LANG_SPECIFIC (type) 
395           && CLASSTYPE_TEMPLATE_INFO (type)
396           && (DECL_NAME (CLASSTYPE_TI_TEMPLATE (type)) 
397               == subst_identifiers[index]));
398 }
399
400 /* Helper function for find_substitution.  Returns non-zero if NODE,
401    which may be a decl or a CLASS_TYPE, is the template-id
402    ::std::identifier<char>, where identifier is
403    substitution_index[INDEX].  */
404
405 static inline int
406 is_std_substitution_char (node, index)
407      tree node;
408      substitution_identifier_index_t index;
409 {
410   tree args;
411   /* Check NODE's name is ::std::identifier.  */
412   if (!is_std_substitution (node, index))
413     return 0;
414   /* Figure out its template args.  */
415   if (DECL_P (node))
416     args = DECL_TI_ARGS (node);  
417   else if (CLASS_TYPE_P (node))
418     args = CLASSTYPE_TI_ARGS (node);
419   else
420     /* Oops, not a template.  */
421     return 0;
422   /* NODE's template arg list should be <char>.  */
423   return 
424     TREE_VEC_LENGTH (args) == 1
425     && TREE_VEC_ELT (args, 0) == char_type_node;
426 }
427
428 /* Check whether a substitution should be used to represent NODE in
429    the mangling.
430
431    First, check standard special-case substitutions.
432
433      <substitution> ::= St     
434          # ::std
435
436                     ::= Sa     
437          # ::std::allocator
438
439                     ::= Sb     
440          # ::std::basic_string
441
442                     ::= Ss 
443          # ::std::basic_string<char,
444                                ::std::char_traits<char>,
445                                ::std::allocator<char> >
446
447                     ::= Si 
448          # ::std::basic_istream<char, ::std::char_traits<char> >
449
450                     ::= So 
451          # ::std::basic_ostream<char, ::std::char_traits<char> >
452
453                     ::= Sd 
454          # ::std::basic_iostream<char, ::std::char_traits<char> >   
455
456    Then examine the stack of currently available substitution
457    candidates for entities appearing earlier in the same mangling
458
459    If a substitution is found, write its mangled representation and
460    return non-zero.  If none is found, just return zero.  */
461
462 static int
463 find_substitution (node)
464      tree node;
465 {
466   int i;
467   int size = VARRAY_ACTIVE_SIZE (G.substitutions);
468   tree decl;
469   tree type;
470
471   if (DEBUG_MANGLE)
472     fprintf (stderr, "  ++ find_substitution (%s at %p)\n",
473              tree_code_name[TREE_CODE (node)], (void *) node);
474
475   /* Obtain the canonicalized substitution representation for NODE.
476      This is what we'll compare against.  */
477   node = canonicalize_for_substitution (node);
478
479   /* Check for builtin substitutions.  */
480
481   decl = TYPE_P (node) ? TYPE_NAME (node) : node;
482   type = TYPE_P (node) ? node : TREE_TYPE (node);
483
484   /* Check for std::allocator.  */
485   if (decl 
486       && is_std_substitution (decl, SUBID_ALLOCATOR)
487       && !CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl)))
488     {
489       write_string ("Sa");
490       return 1;
491     }
492
493   /* Check for std::basic_string.  */
494   if (decl && is_std_substitution (decl, SUBID_BASIC_STRING))
495     {
496       if (TYPE_P (node))
497         {
498           /* If this is a type (i.e. a fully-qualified template-id), 
499              check for 
500                  std::basic_string <char,
501                                     std::char_traits<char>,
502                                     std::allocator<char> > .  */
503           if (CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED
504               && CLASSTYPE_USE_TEMPLATE (type))
505             {
506               tree args = CLASSTYPE_TI_ARGS (type);
507               if (TREE_VEC_LENGTH (args) == 3
508                   && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
509                   && is_std_substitution_char (TREE_VEC_ELT (args, 1),
510                                                SUBID_CHAR_TRAITS)
511                   && is_std_substitution_char (TREE_VEC_ELT (args, 2),
512                                                SUBID_ALLOCATOR))
513                 {
514                   write_string ("Ss");
515                   return 1;
516                 }
517             }
518         }
519       else
520         /* Substitute for the template name only if this isn't a type.  */
521         {
522           write_string ("Sb");
523           return 1;
524         }
525     }
526
527   /* Check for basic_{i,o,io}stream.  */
528   if (TYPE_P (node)
529       && CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED
530       && CLASS_TYPE_P (type)
531       && CLASSTYPE_USE_TEMPLATE (type)
532       && CLASSTYPE_TEMPLATE_INFO (type) != NULL)
533     {
534       /* First, check for the template 
535          args <char, std::char_traits<char> > .  */
536       tree args = CLASSTYPE_TI_ARGS (type);
537       if (TREE_VEC_LENGTH (args) == 2
538           && same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
539           && is_std_substitution_char (TREE_VEC_ELT (args, 1),
540                                        SUBID_CHAR_TRAITS))
541         {
542           /* Got them.  Is this basic_istream?  */
543           tree name = DECL_NAME (CLASSTYPE_TI_TEMPLATE (type));
544           if (name == subst_identifiers[SUBID_BASIC_ISTREAM])
545             {
546               write_string ("Si");
547               return 1;
548             }
549           /* Or basic_ostream?  */
550           else if (name == subst_identifiers[SUBID_BASIC_OSTREAM])
551             {
552               write_string ("So");
553               return 1;
554             }
555           /* Or basic_iostream?  */
556           else if (name == subst_identifiers[SUBID_BASIC_IOSTREAM])
557             {
558               write_string ("Sd");
559               return 1;
560             }
561         }
562     }
563
564   /* Check for namespace std.  */
565   if (decl && DECL_NAMESPACE_STD_P (decl))
566     {
567       write_string ("St");
568       return 1;
569     }
570
571   /* Now check the list of available substitutions for this mangling
572      operation.    */
573   for (i = 0; i < size; ++i)
574     {
575       tree candidate = VARRAY_TREE (G.substitutions, i);
576       /* NODE is a matched to a candidate if it's the same decl node or
577          if it's the same type.  */
578       if (decl == candidate
579           || (TYPE_P (candidate) && type && TYPE_P (type)
580               && same_type_p (type, candidate))
581           || NESTED_TEMPLATE_MATCH (node, candidate))
582         {
583           write_substitution (i);
584           return 1;
585         }
586     }
587
588   /* No substitution found.  */
589   return 0;
590 }
591
592
593 /*  <mangled-name>      ::= _Z <encoding>  */
594
595 static inline void
596 write_mangled_name (decl)
597      tree decl;
598 {
599   MANGLE_TRACE_TREE ("mangled-name", decl);
600
601   if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
602     /* The standard notes:
603          "The <encoding> of an extern "C" function is treated like
604          global-scope data, i.e. as its <source-name> without a type."  */
605     write_source_name (DECL_NAME (decl));
606   else
607     /* C++ name; needs to be mangled.  */
608     {
609       write_string ("_Z");
610       write_encoding (decl);
611     }
612 }
613
614 /*   <encoding>         ::= <function name> <bare-function-type>
615                         ::= <data name>  */
616
617 static void
618 write_encoding (decl)
619      tree decl;
620 {
621   MANGLE_TRACE_TREE ("encoding", decl);
622
623   if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
624     {
625       write_source_name (DECL_NAME (decl));
626       return;
627     }
628
629   write_name (decl, /*ignore_local_scope=*/0);
630   if (TREE_CODE (decl) == FUNCTION_DECL)
631     {
632       tree fn_type;
633
634       if (decl_is_template_id (decl, NULL))
635         fn_type = get_mostly_instantiated_function_type (decl, NULL, NULL);
636       else
637         fn_type = TREE_TYPE (decl);
638
639       write_bare_function_type (fn_type, 
640                                 (!DECL_CONSTRUCTOR_P (decl)
641                                  && !DECL_DESTRUCTOR_P (decl)
642                                  && !DECL_CONV_FN_P (decl)
643                                  && decl_is_template_id (decl, NULL)));
644     }
645 }
646
647 /* <name> ::= <unscoped-name>
648           ::= <unscoped-template-name> <template-args>
649           ::= <nested-name>
650           ::= <local-name>  
651
652    If IGNORE_LOCAL_SCOPE is non-zero, this production of <name> is
653    called from <local-name>, which mangles the enclosing scope
654    elsewhere and then uses this function to mangle just the part
655    underneath the function scope.  So don't use the <local-name>
656    production, to avoid an infinite recursion.  */
657
658 static void
659 write_name (decl, ignore_local_scope)
660      tree decl;
661      int ignore_local_scope;
662 {
663   tree context;
664
665   MANGLE_TRACE_TREE ("name", decl);
666
667   if (TREE_CODE (decl) == TYPE_DECL)
668     {
669       /* In case this is a typedef, fish out the corresponding
670          TYPE_DECL for the main variant.  */
671       decl = TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl)));
672       context = TYPE_CONTEXT (TYPE_MAIN_VARIANT (TREE_TYPE (decl)));
673     }
674   else
675     context = (DECL_CONTEXT (decl) == NULL) ? NULL : CP_DECL_CONTEXT (decl);
676
677   /* Decls in :: or ::std scope are treated specially.  */
678   if (context == NULL 
679       || context == global_namespace 
680       || DECL_NAMESPACE_STD_P (context))
681     {
682       tree template_info;
683       /* Is this a template instance?  */
684       if (decl_is_template_id (decl, &template_info))
685         {
686           /* Yes: use <unscoped-template-name>.  */
687           write_unscoped_template_name (TI_TEMPLATE (template_info));
688           write_template_args (TI_ARGS (template_info));
689         }
690       else
691         /* Everything else gets an <unqualified-name>.  */
692         write_unscoped_name (decl);
693     }
694   else
695     {
696       /* Handle local names, unless we asked not to (that is, invoked
697          under <local-name>, to handle only the part of the name under
698          the local scope).  */
699       if (!ignore_local_scope)
700         {
701           /* Scan up the list of scope context, looking for a
702              function.  If we find one, this entity is in local
703              function scope.  local_entity tracks context one scope
704              level down, so it will contain the element that's
705              directly in that function's scope, either decl or one of
706              its enclosing scopes.  */
707           tree local_entity = decl;
708           while (context != NULL && context != global_namespace)
709             {
710               /* Make sure we're always dealing with decls.  */
711               if (context != NULL && TYPE_P (context))
712                 context = TYPE_NAME (context);
713               /* Is this a function?  */
714               if (TREE_CODE (context) == FUNCTION_DECL)
715                 {
716                   /* Yes, we have local scope.  Use the <local-name>
717                      production for the innermost function scope.  */
718                   write_local_name (context, local_entity, decl);
719                   return;
720                 }
721               /* Up one scope level.  */
722               local_entity = context;
723               context = CP_DECL_CONTEXT (context);
724             }
725
726           /* No local scope found?  Fall through to <nested-name>.  */
727         }
728
729       /* Other decls get a <nested-name> to encode their scope.  */
730       write_nested_name (decl);
731     }
732 }
733
734 /* <unscoped-name> ::= <unqualified-name>
735                    ::= St <unqualified-name>   # ::std::  */
736
737 static void
738 write_unscoped_name (decl)
739      tree decl;
740 {
741   tree context = CP_DECL_CONTEXT (decl);
742
743   MANGLE_TRACE_TREE ("unscoped-name", decl);
744
745   /* Is DECL in ::std?  */
746   if (DECL_NAMESPACE_STD_P (context))
747     {
748       write_string ("St");
749       write_unqualified_name (decl);
750     }
751   /* If not, it should be in the global namespace.  */
752   else if (context == global_namespace || context == NULL)
753     write_unqualified_name (decl);
754   else 
755     my_friendly_abort (20000521);
756 }
757
758 /* <unscoped-template-name> ::= <unscoped-name>
759                             ::= <substitution>  */
760
761 static void
762 write_unscoped_template_name (decl)
763      tree decl;
764 {
765   MANGLE_TRACE_TREE ("unscoped-template-name", decl);
766
767   if (find_substitution (decl))
768     return;
769   write_unscoped_name (decl);
770   add_substitution (decl);
771 }
772
773 /* Write the nested name, including CV-qualifiers, of DECL.
774
775    <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E  
776                  ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
777
778    <CV-qualifiers> ::= [r] [V] [K]  */
779
780 static void
781 write_nested_name (decl)
782      tree decl;
783 {
784   tree template_info;
785
786   MANGLE_TRACE_TREE ("nested-name", decl);
787
788   write_char ('N');
789   
790   /* Write CV-qualifiers, if this is a member function.  */
791   if (TREE_CODE (decl) == FUNCTION_DECL 
792       && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
793     {
794       if (DECL_VOLATILE_MEMFUNC_P (decl))
795         write_char ('V');
796       if (DECL_CONST_MEMFUNC_P (decl))
797         write_char ('K');
798     }
799
800   /* Is this a template instance?  */
801   if (decl_is_template_id (decl, &template_info))
802     {
803       /* Yes, use <template-prefix>.  */
804       write_template_prefix (decl);
805       write_template_args (TI_ARGS (template_info));
806     }
807   else
808     {
809       /* No, just use <prefix>  */
810       write_prefix (DECL_CONTEXT (decl));
811       write_unqualified_name (decl);
812     }
813   write_char ('E');
814 }
815
816 /* <prefix> ::= <prefix> <unqualified-name>>
817             ::= <template-prefix> <template-args>
818             ::= # empty
819             ::= <substitution>  */
820
821 static void
822 write_prefix (node)
823      tree node;
824 {
825   tree decl;
826   /* Non-NULL if NODE represents a template-id.  */
827   tree template_info = NULL;
828
829   MANGLE_TRACE_TREE ("prefix", node);
830
831   if (node == NULL
832       || node == global_namespace)
833     return;
834
835   if (find_substitution (node))
836     return;
837
838   if (DECL_P (node))
839     /* Node is a decl.  */
840     {
841       /* If this is a function decl, that means we've hit function
842          scope, so this prefix must be for a local name.  In this
843          case, we're under the <local-name> production, which encodes
844          the enclosing function scope elsewhere.  So don't continue
845          here.  */
846       if (TREE_CODE (node) == FUNCTION_DECL)
847         return;
848
849       decl = node;
850       decl_is_template_id (decl, &template_info);
851     }
852   else
853     /* Node is a type.  */
854     {
855       decl = TYPE_NAME (node);
856       if (CLASSTYPE_TEMPLATE_ID_P (node))
857         template_info = CLASSTYPE_TEMPLATE_INFO (node);
858     }
859
860   if (template_info != NULL)
861     /* Templated.  */
862     {
863       write_template_prefix (decl);
864       write_template_args (TI_ARGS (template_info));
865     }
866   else
867     /* Not templated.  */
868     {
869       write_prefix (CP_DECL_CONTEXT (decl));
870       write_unqualified_name (decl);
871     }
872
873   add_substitution (node);
874 }
875
876 /* <template-prefix> ::= <prefix> <template component>
877                      ::= <substitution>  */
878
879 static void
880 write_template_prefix (node)
881      tree node;
882 {
883   tree decl = DECL_P (node) ? node : TYPE_NAME (node);
884   tree type = DECL_P (node) ? TREE_TYPE (node) : node;
885   tree context = CP_DECL_CONTEXT (decl);
886   tree template_info;
887   tree template;
888   tree substitution;
889
890   MANGLE_TRACE_TREE ("template-prefix", node);
891
892   /* Find the template decl.  */
893   if (decl_is_template_id (decl, &template_info))
894     template = TI_TEMPLATE (template_info);
895   else if (CLASSTYPE_TEMPLATE_ID_P (type))
896     template = CLASSTYPE_TI_TEMPLATE (type);
897   else
898     /* Oops, not a template.  */
899     my_friendly_abort (20000524);
900
901   /* For a member template, though, the template name for the
902      innermost name must have all the outer template levels
903      instantiated.  For instance, consider
904
905        template<typename T> struct Outer {
906          template<typename U> struct Inner {};
907        };
908
909      The template name for `Inner' in `Outer<int>::Inner<float>' is
910      `Outer<int>::Inner<U>'.  In g++, we don't instantiate the template
911      levels separately, so there's no TEMPLATE_DECL available for this
912      (there's only `Outer<T>::Inner<U>').
913
914      In order to get the substitutions right, we create a special
915      TREE_LIST to represent the substitution candidate for a nested
916      template.  The TREE_PURPOSE is the template's context, fully
917      instantiated, and the TREE_VALUE is the TEMPLATE_DECL for the inner
918      template.
919
920      So, for the example above, `Outer<int>::Inner' is represented as a
921      substitution candidate by a TREE_LIST whose purpose is `Outer<int>'
922      and whose value is `Outer<T>::Inner<U>'.  */
923   if (TYPE_P (context))
924     substitution = build_tree_list (context, template);
925   else
926     substitution = template;
927
928   if (find_substitution (substitution))
929     return;
930
931   write_prefix (context);
932   write_unqualified_name (decl);
933
934   add_substitution (substitution);
935 }
936
937 /* We don't need to handle thunks, vtables, or VTTs here.  Those are
938    mangled through special entry points.  
939
940     <unqualified-name>  ::= <operator-name>
941                         ::= <special-name>  
942                         ::= <source-name>  */
943
944 static void
945 write_unqualified_name (decl)
946      tree decl;
947 {
948   MANGLE_TRACE_TREE ("unqualified-name", decl);
949
950   if (DECL_LANG_SPECIFIC (decl) != NULL && DECL_CONSTRUCTOR_P (decl))
951     write_special_name_constructor (decl);
952   else if (DECL_LANG_SPECIFIC (decl) != NULL && DECL_DESTRUCTOR_P (decl))
953     write_special_name_destructor (decl);
954   else if (DECL_CONV_FN_P (decl)) 
955     {
956       /* Conversion operator. Handle it right here.  
957            <operator> ::= cv <type>  */
958       write_string ("cv");
959       write_type (TREE_TYPE (DECL_NAME (decl)));
960     }
961   else if (DECL_OVERLOADED_OPERATOR_P (decl))
962     {
963       operator_name_info_t *oni;
964       if (DECL_ASSIGNMENT_OPERATOR_P (decl))
965         oni = assignment_operator_name_info;
966       else
967         oni = operator_name_info;
968       
969       write_string (oni[DECL_OVERLOADED_OPERATOR_P (decl)].mangled_name);
970     }
971   else
972     write_source_name (DECL_NAME (decl));
973 }
974
975 /* Non-termial <source-name>.  IDENTIFIER is an IDENTIFIER_NODE.  
976
977      <source-name> ::= </length/ number> <identifier>  */
978
979 static void
980 write_source_name (identifier)
981      tree identifier;
982 {
983   MANGLE_TRACE_TREE ("source-name", identifier);
984
985   /* Never write the whole template-id name including the template
986      arguments; we only want the template name.  */
987   if (IDENTIFIER_TEMPLATE (identifier))
988     identifier = IDENTIFIER_TEMPLATE (identifier);
989
990   write_unsigned_number (IDENTIFIER_LENGTH (identifier));
991   write_identifier (IDENTIFIER_POINTER (identifier));
992 }
993
994 /* Non-terminal <number>.
995
996      <number> ::= [n] </decimal integer/>  */
997
998 static void
999 write_number (number, unsigned_p, base)
1000      unsigned HOST_WIDE_INT number;
1001      int unsigned_p;
1002      unsigned int base;
1003 {
1004   static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
1005   unsigned HOST_WIDE_INT n;
1006   unsigned HOST_WIDE_INT m = 1;
1007
1008   if (!unsigned_p && (HOST_WIDE_INT) number < 0)
1009     {
1010       write_char ('n');
1011       number = -((HOST_WIDE_INT) number);
1012     }
1013   
1014   /* Figure out how many digits there are.  */
1015   n = number;
1016   while (n >= base)
1017     {
1018       n /= base;
1019       m *= base;
1020     }
1021
1022   /* Write them out.  */
1023   while (m > 0)
1024     {
1025       int digit = number / m;
1026       write_char (digits[digit]);
1027       number -= digit * m;
1028       m /= base;
1029     }
1030
1031   my_friendly_assert (number == 0, 20000407);
1032 }
1033
1034 /* Write out an integeral CST in decimal.  */
1035
1036 static inline void
1037 write_integer_cst (cst)
1038      tree cst;
1039 {
1040   if (tree_int_cst_sgn (cst) >= 0) 
1041     {
1042       if (TREE_INT_CST_HIGH (cst) != 0)
1043         sorry ("mangling very large integers");
1044       write_unsigned_number (TREE_INT_CST_LOW (cst));
1045     }
1046   else
1047     write_signed_number (tree_low_cst (cst, 0));
1048 }
1049
1050 /* Non-terminal <identifier>.
1051
1052      <identifier> ::= </unqualified source code identifier>  */
1053
1054 static void
1055 write_identifier (identifier)
1056      const char *identifier;
1057 {
1058   MANGLE_TRACE ("identifier", identifier);
1059   write_string (identifier);
1060 }
1061
1062 /* Handle constructor productions of non-terminal <special-name>.
1063    CTOR is a constructor FUNCTION_DECL. 
1064
1065      <special-name> ::= C1   # complete object constructor
1066                     ::= C2   # base object constructor
1067                     ::= C3   # complete object allocating constructor
1068
1069    Currently, allocating constructors are never used. 
1070
1071    We also need to provide unique mangled names (which should never be
1072    exported) for the constructor that takes an in-charge parameter,
1073    and for a constructor whose name is the same as its class's name.
1074    We use "C*INTERNAL*" for these.  */
1075
1076 static void
1077 write_special_name_constructor (ctor)
1078      tree ctor;
1079 {
1080   if (DECL_COMPLETE_CONSTRUCTOR_P (ctor)
1081       /* Even though we don't ever emit a definition of the
1082          old-style destructor, we still have to consider entities
1083          (like static variables) nested inside it.  */
1084       || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (ctor))
1085     write_string ("C1");
1086   else if (DECL_BASE_CONSTRUCTOR_P (ctor))
1087     write_string ("C2");
1088   else
1089     my_friendly_abort (20001115);
1090 }
1091
1092 /* Handle destructor productions of non-terminal <special-name>.
1093    DTOR is a denstructor FUNCTION_DECL. 
1094
1095      <special-name> ::= D0 # deleting (in-charge) destructor
1096                     ::= D1 # complete object (in-charge) destructor
1097                     ::= D2 # base object (not-in-charge) destructor 
1098
1099    We also need to provide unique mngled names for old-ABI
1100    destructors, sometimes.  These should only be used internally.  We
1101    use "D*INTERNAL*" for these.  */
1102
1103 static void
1104 write_special_name_destructor (dtor)
1105      tree dtor;
1106 {
1107   if (DECL_DELETING_DESTRUCTOR_P (dtor))
1108     write_string ("D0");
1109   else if (DECL_COMPLETE_DESTRUCTOR_P (dtor)
1110            /* Even though we don't ever emit a definition of the
1111               old-style destructor, we still have to consider entities
1112               (like static variables) nested inside it.  */
1113            || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor))
1114     write_string ("D1");
1115   else if (DECL_BASE_DESTRUCTOR_P (dtor))
1116     write_string ("D2");
1117   else
1118     my_friendly_abort (20001115);
1119 }
1120
1121 /* Return the discriminator for ENTITY appearing inside
1122    FUNCTION.  The discriminator is the lexical ordinal of VAR among
1123    entities with the same name in the same FUNCTION.  */
1124
1125 static int
1126 discriminator_for_local_entity (entity)
1127      tree entity;
1128 {
1129   tree *type;
1130   int discriminator;
1131
1132   /* Assume this is the only local entity with this name.  */
1133   discriminator = 0;
1134
1135   /* For now, we don't discriminate amongst local variables.  */
1136   if (TREE_CODE (entity) != TYPE_DECL)
1137     return 0;
1138
1139   /* Scan the list of local classes.  */
1140   entity = TREE_TYPE (entity);
1141   for (type = &VARRAY_TREE (local_classes, 0); *type != entity; ++type)
1142     if (TYPE_IDENTIFIER (*type) == TYPE_IDENTIFIER (entity)
1143         && TYPE_CONTEXT (*type) == TYPE_CONTEXT (entity))
1144       ++discriminator;
1145
1146   return discriminator;
1147 }
1148
1149 /* Return the discriminator for STRING, a string literal used inside
1150    FUNCTION.  The disciminator is the lexical ordinal of STRING among
1151    string literals used in FUNCTION.  */
1152
1153 static int
1154 discriminator_for_string_literal (function, string)
1155      tree function ATTRIBUTE_UNUSED;
1156      tree string ATTRIBUTE_UNUSED;
1157 {
1158   /* For now, we don't discriminate amongst string literals.  */
1159   return 0;
1160 }
1161
1162 /*   <discriminator> := _ <number>   
1163
1164    The discriminator is used only for the second and later occurrences
1165    of the same name within a single function. In this case <number> is
1166    n - 2, if this is the nth occurrence, in lexical order.  */
1167
1168 static void
1169 write_discriminator (discriminator)
1170      int discriminator;
1171 {
1172   /* If discriminator is zero, don't write anything.  Otherwise... */
1173   if (discriminator > 0)
1174     {
1175       write_char ('_');
1176       /* The number is omitted for discriminator == 1.  Beyond 1, the
1177          numbering starts at 0.  */
1178       if (discriminator > 1)
1179         write_unsigned_number (discriminator - 2);
1180     }
1181 }
1182
1183 /* Mangle the name of a function-scope entity.  FUNCTION is the
1184    FUNCTION_DECL for the enclosing function.  ENTITY is the decl for
1185    the entity itself.  LOCAL_ENTITY is the entity that's directly
1186    scoped in FUNCTION_DECL, either ENTITY itself or an enclosing scope
1187    of ENTITY.
1188
1189      <local-name> := Z <function encoding> E <entity name> [<discriminator>]
1190                   := Z <function encoding> E s [<discriminator>]  */
1191
1192 static void
1193 write_local_name (function, local_entity, entity)
1194      tree function;
1195      tree local_entity;
1196      tree entity;
1197 {
1198   MANGLE_TRACE_TREE ("local-name", entity);
1199
1200   write_char ('Z');
1201   write_encoding (function);
1202   write_char ('E');
1203   if (TREE_CODE (entity) == STRING_CST)
1204     {
1205       write_char ('s');
1206       write_discriminator (discriminator_for_string_literal (function, 
1207                                                              entity));
1208     }
1209   else
1210     {
1211       /* Now the <entity name>.  Let write_name know its being called
1212          from <local-name>, so it doesn't try to process the enclosing
1213          function scope again.  */
1214       write_name (entity, /*ignore_local_scope=*/1);
1215       write_discriminator (discriminator_for_local_entity (local_entity));
1216     }
1217 }
1218
1219 /* Non-terminals <type> and <CV-qualifier>.  
1220
1221      <type> ::= <builtin-type>
1222             ::= <function-type>
1223             ::= <class-enum-type>
1224             ::= <array-type>
1225             ::= <pointer-to-member-type>
1226             ::= <template-param>
1227             ::= <substitution>
1228             ::= <CV-qualifier>
1229             ::= P <type>    # pointer-to
1230             ::= R <type>    # reference-to
1231             ::= C <type>    # complex pair (C 2000)  [not supported]
1232             ::= G <type>    # imaginary (C 2000)     [not supported]
1233             ::= U <source-name> <type>   # vendor extended type qualifier 
1234                                                      [not supported]
1235
1236    TYPE is a type node.  */
1237
1238 static void 
1239 write_type (type)
1240      tree type;
1241 {
1242   /* This gets set to non-zero if TYPE turns out to be a (possibly
1243      CV-qualified) builtin type.  */
1244   int is_builtin_type = 0;
1245
1246   MANGLE_TRACE_TREE ("type", type);
1247
1248   if (find_substitution (type))
1249     return;
1250   
1251   if (write_CV_qualifiers_for_type (type) > 0)
1252     /* If TYPE was CV-qualified, we just wrote the qualifiers; now
1253        mangle the unqualified type.  The recursive call is needed here
1254        since both the qualified and uqualified types are substitution
1255        candidates.  */
1256     write_type (TYPE_MAIN_VARIANT (type));
1257   else
1258     {
1259       /* See through any typedefs.  */
1260       type = TYPE_MAIN_VARIANT (type);
1261
1262       switch (TREE_CODE (type))
1263         {
1264         case VOID_TYPE:
1265         case BOOLEAN_TYPE:
1266         case INTEGER_TYPE:  /* Includes wchar_t.  */
1267         case REAL_TYPE:
1268           /* If this is a typedef, TYPE may not be one of
1269              the standard builtin type nodes, but an alias of one.  Use
1270              TYPE_MAIN_VARIANT to get to the underlying builtin type.  */
1271           write_builtin_type (TYPE_MAIN_VARIANT (type));
1272           ++is_builtin_type;
1273           break;
1274
1275         case COMPLEX_TYPE:
1276           write_char ('C');
1277           write_type (TREE_TYPE (type));
1278           break;
1279
1280         case FUNCTION_TYPE:
1281         case METHOD_TYPE:
1282           write_function_type (type);
1283           break;
1284
1285         case UNION_TYPE:
1286         case RECORD_TYPE:
1287         case ENUMERAL_TYPE:
1288           /* A pointer-to-member function is represented as a special
1289              RECORD_TYPE, so check for this first.  */
1290           if (TYPE_PTRMEMFUNC_P (type))
1291             write_pointer_to_member_type (type);
1292           else
1293             write_class_enum_type (type);
1294           break;
1295
1296         case TYPENAME_TYPE:
1297           /* We handle TYPENAME_TYPEs like ordinary nested names.  */
1298           write_nested_name (TYPE_STUB_DECL (type));
1299           break;
1300
1301         case ARRAY_TYPE:
1302           write_array_type (type);
1303           break;
1304
1305         case POINTER_TYPE:
1306           /* A pointer-to-member variable is represented by a POINTER_TYPE
1307              to an OFFSET_TYPE, so check for this first.  */
1308           if (TYPE_PTRMEM_P (type))
1309             write_pointer_to_member_type (type);
1310           else
1311             {
1312               write_char ('P');
1313               write_type (TREE_TYPE (type));
1314             }
1315           break;
1316
1317         case REFERENCE_TYPE:
1318           write_char ('R');
1319           write_type (TREE_TYPE (type));
1320           break;
1321
1322         case TEMPLATE_TYPE_PARM:
1323         case TEMPLATE_PARM_INDEX:
1324           write_template_param (type);
1325           break;
1326
1327         case TEMPLATE_TEMPLATE_PARM:
1328           write_template_template_param (type);
1329           break;
1330
1331         case BOUND_TEMPLATE_TEMPLATE_PARM:
1332           write_template_template_param (type);
1333           write_template_args 
1334             (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type)));
1335           break;
1336
1337         case OFFSET_TYPE:
1338           write_pointer_to_member_type (build_pointer_type (type));
1339           break;
1340
1341         default:
1342           my_friendly_abort (20000409);
1343         }
1344     }
1345
1346   /* Types other than builtin types are substitution candidates.  */
1347   if (!is_builtin_type)
1348     add_substitution (type);
1349 }
1350
1351 /* Non-terminal <CV-qualifiers> for type nodes.  Returns the number of
1352    CV-qualifiers written for TYPE.
1353
1354      <CV-qualifiers> ::= [r] [V] [K]  */
1355
1356 static int
1357 write_CV_qualifiers_for_type (type)
1358      tree type;
1359 {
1360   int num_qualifiers = 0;
1361
1362   /* The order is specified by:
1363
1364        "In cases where multiple order-insensitive qualifiers are
1365        present, they should be ordered 'K' (closest to the base type),
1366        'V', 'r', and 'U' (farthest from the base type) ..."  */
1367
1368   if (CP_TYPE_RESTRICT_P (type))
1369     {
1370       write_char ('r');
1371       ++num_qualifiers;
1372     }
1373   if (CP_TYPE_VOLATILE_P (type))
1374     {
1375       write_char ('V');
1376       ++num_qualifiers;
1377     }
1378   if (CP_TYPE_CONST_P (type))
1379     {
1380       write_char ('K');
1381       ++num_qualifiers;
1382     }
1383
1384   return num_qualifiers;
1385 }
1386
1387 /* Non-terminal <builtin-type>. 
1388
1389      <builtin-type> ::= v   # void 
1390                     ::= b   # bool
1391                     ::= w   # wchar_t
1392                     ::= c   # char
1393                     ::= a   # signed char
1394                     ::= h   # unsigned char
1395                     ::= s   # short
1396                     ::= t   # unsigned short
1397                     ::= i   # int
1398                     ::= j   # unsigned int
1399                     ::= l   # long
1400                     ::= m   # unsigned long
1401                     ::= x   # long long, __int64
1402                     ::= y   # unsigned long long, __int64  
1403                     ::= n   # __int128            [not supported]
1404                     ::= o   # unsigned __int128   [not supported] 
1405                     ::= f   # float
1406                     ::= d   # double
1407                     ::= e   # long double, __float80 
1408                     ::= g   # __float128          [not supported]  */
1409
1410 static void 
1411 write_builtin_type (type)
1412      tree type;
1413 {
1414   switch (TREE_CODE (type))
1415     {
1416     case VOID_TYPE:
1417       write_char ('v');
1418       break;
1419
1420     case BOOLEAN_TYPE:
1421       write_char ('b');
1422       break;
1423
1424     case INTEGER_TYPE:
1425       /* If this is size_t, get the underlying int type.  */
1426       if (TYPE_IS_SIZETYPE (type))
1427         type = TYPE_DOMAIN (type);
1428
1429       /* TYPE may still be wchar_t, since that isn't in
1430          integer_type_nodes.  */
1431       if (type == wchar_type_node)
1432         write_char ('w');
1433       else
1434         {
1435           size_t itk;
1436           /* Assume TYPE is one of the shared integer type nodes.  Find
1437              it in the array of these nodes.  */
1438           for (itk = 0; itk < itk_none; ++itk)
1439             if (type == integer_types[itk])
1440               {
1441                 /* Print the corresponding single-letter code.  */
1442                 write_char (integer_type_codes[itk]);
1443                 break;
1444               }
1445           
1446           if (itk == itk_none)
1447             /* Couldn't find this type.  */
1448             my_friendly_abort (20000408);
1449         }
1450       break;
1451
1452     case REAL_TYPE:
1453       if (type == float_type_node)
1454         write_char ('f');
1455       else if (type == double_type_node)
1456         write_char ('d');
1457       else if (type == long_double_type_node)
1458         write_char ('e');
1459       else
1460         my_friendly_abort (20000409);
1461       break;
1462
1463     default:
1464       my_friendly_abort (20000509);
1465     }
1466 }
1467
1468 /* Non-terminal <function-type>.  NODE is a FUNCTION_TYPE or
1469    METHOD_TYPE.  The return type is mangled before the parameter
1470    types.
1471
1472      <function-type> ::= F [Y] <bare-function-type> E   */
1473
1474 static void
1475 write_function_type (type)
1476      tree type;
1477 {
1478   MANGLE_TRACE_TREE ("function-type", type);
1479
1480   write_char ('F');
1481   /* We don't track whether or not a type is `extern "C"'.  Note that
1482      you can have an `extern "C"' function that does not have
1483      `extern "C"' type, and vice versa:
1484
1485        extern "C" typedef void function_t();
1486        function_t f; // f has C++ linkage, but its type is
1487                      // `extern "C"'
1488
1489        typedef void function_t();
1490        extern "C" function_t f; // Vice versa.
1491
1492      See [dcl.link].  */
1493   write_bare_function_type (type, /*include_return_type_p=*/1);
1494   write_char ('E');
1495 }
1496
1497 /* Non-terminal <bare-function-type>.  NODE is a FUNCTION_DECL or a
1498    METHOD_TYPE.  If INCLUDE_RETURN_TYPE is non-zero, the return value
1499    is mangled before the parameter types.
1500
1501      <bare-function-type> ::= </signature/ type>+  */
1502
1503 static void
1504 write_bare_function_type (type, include_return_type_p)
1505      tree type;
1506      int include_return_type_p;
1507 {
1508   MANGLE_TRACE_TREE ("bare-function-type", type);
1509
1510   /* Mangle the return type, if requested.  */
1511   if (include_return_type_p)
1512     write_type (TREE_TYPE (type));
1513
1514   /* Now mangle the types of the arguments.  */
1515   write_method_parms (TYPE_ARG_TYPES (type), 
1516                       TREE_CODE (type) == METHOD_TYPE);
1517 }
1518
1519 /* Write the mangled representation of a method parameter list of
1520    types given in PARM_LIST.  If METHOD_P is non-zero, the function is 
1521    considered a non-static method, and the this parameter is omitted.  */
1522
1523 static void
1524 write_method_parms (parm_list, method_p)
1525      tree parm_list;
1526      int method_p;
1527 {
1528   tree first_parm;
1529   /* Assume this parameter type list is variable-length.  If it ends
1530      with a void type, then it's not.  */
1531   int varargs_p = 1;
1532
1533   /* If this is a member function, skip the first arg, which is the
1534      this pointer.  
1535        "Member functions do not encode the type of their implicit this
1536        parameter."  */
1537   if (method_p)
1538     parm_list = TREE_CHAIN (parm_list);
1539
1540   for (first_parm = parm_list; 
1541        parm_list; 
1542        parm_list = TREE_CHAIN (parm_list))
1543     {
1544       tree parm = TREE_VALUE (parm_list);
1545
1546       if (parm == void_type_node)
1547         {
1548           /* "Empty parameter lists, whether declared as () or
1549              conventionally as (void), are encoded with a void parameter
1550              (v)."  */
1551           if (parm_list == first_parm)
1552             write_type (parm);
1553           /* If the parm list is terminated with a void type, it's
1554              fixed-length.  */
1555           varargs_p = 0;
1556           /* A void type better be the last one.  */
1557           my_friendly_assert (TREE_CHAIN (parm_list) == NULL, 20000523);
1558         }
1559       else
1560         write_type (parm);
1561     }
1562
1563   if (varargs_p)
1564     /* <builtin-type> ::= z  # ellipsis  */
1565     write_char ('z');
1566 }
1567
1568 /* <class-enum-type> ::= <name>  */
1569
1570 static void 
1571 write_class_enum_type (type)
1572      tree type;
1573 {
1574   write_name (TYPE_NAME (type), /*ignore_local_scope=*/0);
1575 }
1576
1577 /* Non-terminal <template-args>.  ARGS is a TREE_VEC of template
1578    arguments.
1579
1580      <template-args> ::= I <template-arg>+ E  */
1581
1582 static void
1583 write_template_args (args)
1584      tree args;
1585 {
1586   int i;
1587   int length = TREE_VEC_LENGTH (args);
1588
1589   MANGLE_TRACE_TREE ("template-args", args);
1590
1591   my_friendly_assert (length > 0, 20000422);
1592
1593   if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1594     {
1595       /* We have nested template args.  We want the innermost template
1596          argument list.  */
1597       args = TREE_VEC_ELT (args, length - 1);
1598       length = TREE_VEC_LENGTH (args);
1599     }
1600
1601   write_char ('I');
1602   for (i = 0; i < length; ++i)
1603     write_template_arg (TREE_VEC_ELT (args, i));
1604   write_char ('E');
1605 }
1606
1607 /* <expression> ::= <unary operator-name> <expression>
1608                 ::= <binary operator-name> <expression> <expression>
1609                 ::= <expr-primary>
1610
1611    <expr-primary> ::= <template-param>
1612                   ::= L <type> <value number> E  # literal
1613                   ::= L <mangled-name> E         # external name  */
1614
1615 static void
1616 write_expression (expr)
1617      tree expr;
1618 {
1619   enum tree_code code;
1620
1621   code = TREE_CODE (expr);
1622
1623   /* Handle pointers-to-members by making them look like expression
1624      nodes.  */
1625   if (code == PTRMEM_CST)
1626     {
1627       expr = build_nt (ADDR_EXPR,
1628                        build_nt (SCOPE_REF,
1629                                  PTRMEM_CST_CLASS (expr),
1630                                  PTRMEM_CST_MEMBER (expr)));
1631       code = TREE_CODE (expr);
1632     }
1633
1634   /* Handle template parameters. */
1635   if (code == TEMPLATE_TYPE_PARM 
1636       || code == TEMPLATE_TEMPLATE_PARM
1637       || code == BOUND_TEMPLATE_TEMPLATE_PARM
1638       || code == TEMPLATE_PARM_INDEX)
1639     write_template_param (expr);
1640   /* Handle literals.  */
1641   else if (TREE_CODE_CLASS (code) == 'c')
1642     write_template_arg_literal (expr);
1643   else if (DECL_P (expr))
1644     {
1645       write_char ('L');
1646       write_mangled_name (expr);
1647       write_char ('E');
1648     }
1649   else
1650     {
1651       int i;
1652
1653       /* Skip NOP_EXPRs.  They can occur when (say) a pointer argument
1654          is converted (via qualification conversions) to another
1655          type.  */
1656       while (TREE_CODE (expr) == NOP_EXPR)
1657         {
1658           expr = TREE_OPERAND (expr, 0);
1659           code = TREE_CODE (expr);
1660         }
1661
1662       /* When we bind a variable or function to a non-type template
1663          argument with reference type, we create an ADDR_EXPR to show
1664          the fact that the entity's address has been taken.  But, we
1665          don't actually want to output a mangling code for the `&'.  */
1666       if (TREE_CODE (expr) == ADDR_EXPR
1667           && TREE_TYPE (expr)
1668           && TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE)
1669         {
1670           expr = TREE_OPERAND (expr, 0);
1671           if (DECL_P (expr))
1672             {
1673               write_expression (expr);
1674               return;
1675             }
1676
1677           code = TREE_CODE (expr);
1678         }
1679       
1680       /* If it wasn't any of those, recursively expand the expression.  */
1681       write_string (operator_name_info[(int) code].mangled_name);
1682
1683       /* Handle pointers-to-members specially.  */
1684       if (code == SCOPE_REF)
1685         {
1686           write_type (TREE_OPERAND (expr, 0));
1687           if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
1688             write_source_name (TREE_OPERAND (expr, 1));
1689           else
1690             write_encoding (TREE_OPERAND (expr, 1));
1691         }
1692       else
1693         for (i = 0; i < TREE_CODE_LENGTH (code); ++i)
1694           write_expression (TREE_OPERAND (expr, i));
1695     }
1696 }
1697
1698 /* Literal subcase of non-terminal <template-arg>.  
1699
1700      "Literal arguments, e.g. "A<42L>", are encoded with their type
1701      and value. Negative integer values are preceded with "n"; for
1702      example, "A<-42L>" becomes "1AILln42EE". The bool value false is
1703      encoded as 0, true as 1. If floating-point arguments are accepted
1704      as an extension, their values should be encoded using a
1705      fixed-length lowercase hexadecimal string corresponding to the
1706      internal representation (IEEE on IA-64), high-order bytes first,
1707      without leading zeroes. For example: "Lfbff000000E" is -1.0f."  */
1708
1709 static void
1710 write_template_arg_literal (value)
1711      tree value;
1712 {
1713   tree type = TREE_TYPE (value);
1714   write_char ('L');
1715   write_type (type);
1716
1717   if (TREE_CODE (value) == CONST_DECL)
1718     write_integer_cst (DECL_INITIAL (value));
1719   else if (TREE_CODE (value) == INTEGER_CST)
1720     {
1721       if (same_type_p (type, boolean_type_node))
1722         {
1723           if (value == boolean_false_node || integer_zerop (value))
1724             write_unsigned_number (0);
1725           else if (value == boolean_true_node)
1726             write_unsigned_number (1);
1727           else 
1728             my_friendly_abort (20000412);
1729         }
1730       else
1731         write_integer_cst (value);
1732     }
1733   else if (TREE_CODE (value) == REAL_CST)
1734     {
1735 #ifdef CROSS_COMPILE
1736       static int explained;
1737
1738       if (!explained) 
1739         {
1740           sorry ("real-valued template parameters when cross-compiling");
1741           explained = 1;
1742         }
1743 #else
1744       size_t i;
1745       for (i = 0; i < sizeof (TREE_REAL_CST (value)); ++i)
1746         write_number (((unsigned char *) 
1747                        &TREE_REAL_CST (value))[i], 
1748                       /*unsigned_p=*/1,
1749                       16);
1750 #endif
1751     }
1752   else
1753     my_friendly_abort (20000412);
1754
1755   write_char ('E');
1756 }
1757
1758 /* Non-terminal <tempalate-arg>.  
1759
1760      <template-arg> ::= <type>                        # type
1761                     ::= L <type> </value/ number> E   # literal
1762                     ::= LZ <name> E                   # external name
1763                     ::= X <expression> E              # expression  */
1764
1765 static void
1766 write_template_arg (node)
1767      tree node;
1768 {
1769   enum tree_code code = TREE_CODE (node);
1770
1771   MANGLE_TRACE_TREE ("template-arg", node);
1772
1773   /* A template template paramter's argument list contains TREE_LIST
1774      nodes of which the value field is the the actual argument.  */
1775   if (code == TREE_LIST)
1776     {
1777       node = TREE_VALUE (node);
1778       /* If it's a decl, deal with its type instead.  */
1779       if (DECL_P (node))
1780         {
1781           node = TREE_TYPE (node);
1782           code = TREE_CODE (node);
1783         }
1784     }
1785
1786   if (TYPE_P (node))
1787     write_type (node);
1788   else if (code == TEMPLATE_DECL)
1789     /* A template appearing as a template arg is a template template arg.  */
1790     write_template_template_arg (node);
1791   else if (DECL_P (node))
1792     {
1793       write_char ('L');
1794       write_char ('Z');
1795       write_encoding (node);
1796       write_char ('E');
1797     }
1798   else if (TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
1799     write_template_arg_literal (node);
1800   else
1801     {
1802       /* Template arguments may be expressions.  */
1803       write_char ('X');
1804       write_expression (node);
1805       write_char ('E');
1806     }
1807 }
1808
1809 /*  <template-template-arg>
1810                         ::= <name>
1811                         ::= <substitution>  */
1812
1813 void
1814 write_template_template_arg (tree decl)
1815 {
1816   MANGLE_TRACE_TREE ("template-template-arg", decl);
1817
1818   if (find_substitution (decl))
1819     return;
1820   write_name (decl, /*ignore_local_scope=*/0);
1821   add_substitution (decl);
1822 }
1823
1824
1825 /* Non-terminal <array-type>.  TYPE is an ARRAY_TYPE.  
1826
1827      <array-type> ::= A [</dimension/ number>] _ </element/ type>  
1828                   ::= A <expression> _ </element/ type>
1829
1830      "Array types encode the dimension (number of elements) and the
1831      element type. For variable length arrays, the dimension (but not
1832      the '_' separator) is omitted."  */
1833
1834 static void 
1835 write_array_type (type)
1836   tree type;
1837 {
1838   write_char ('A');
1839   if (TYPE_DOMAIN (type))
1840     {
1841       tree index_type;
1842       tree max;
1843
1844       index_type = TYPE_DOMAIN (type);
1845       /* The INDEX_TYPE gives the upper and lower bounds of the
1846          array.  */
1847       max = TYPE_MAX_VALUE (index_type);
1848       if (TREE_CODE (max) == INTEGER_CST)
1849         {
1850           /* The ABI specifies that we should mangle the number of
1851              elements in the array, not the largest allowed index.  */
1852           max = size_binop (PLUS_EXPR, max, size_one_node);
1853           write_unsigned_number (tree_low_cst (max, 1));
1854         }
1855       else
1856         write_expression (TREE_OPERAND (max, 0));
1857     }
1858   write_char ('_');
1859   write_type (TREE_TYPE (type));
1860 }
1861
1862 /* Non-terminal <pointer-to-member-type> for pointer-to-member
1863    variables.  TYPE is a pointer-to-member POINTER_TYPE.
1864
1865      <pointer-to-member-type> ::= M </class/ type> </member/ type>  */
1866
1867 static void
1868 write_pointer_to_member_type (type)
1869      tree type;
1870 {
1871   write_char ('M');
1872   write_type (TYPE_PTRMEM_CLASS_TYPE (type));
1873   write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
1874 }
1875
1876 /* Non-terminal <template-param>.  PARM is a TEMPLATE_TYPE_PARM,
1877    TEMPLATE_TEMPLATE_PARM, BOUND_TEMPLATE_TEMPLATE_PARM or a
1878    TEMPLATE_PARM_INDEX.
1879
1880      <template-param> ::= T </parameter/ number> _  */
1881
1882 static void
1883 write_template_param (parm)
1884      tree parm;
1885 {
1886   int parm_index;
1887
1888   MANGLE_TRACE_TREE ("template-parm", parm);
1889
1890   switch (TREE_CODE (parm))
1891     {
1892     case TEMPLATE_TYPE_PARM:
1893     case TEMPLATE_TEMPLATE_PARM:
1894     case BOUND_TEMPLATE_TEMPLATE_PARM:
1895       parm_index = TEMPLATE_TYPE_IDX (parm);
1896       break;
1897
1898     case TEMPLATE_PARM_INDEX:
1899       parm_index = TEMPLATE_PARM_IDX (parm);
1900       break;
1901
1902     default:
1903       my_friendly_abort (20000523);
1904     }
1905
1906   write_char ('T');
1907   /* NUMBER as it appears in the mangling is (-1)-indexed, with the
1908      earliest template param denoted by `_'.  */
1909   if (parm_index > 0)
1910     write_unsigned_number (parm_index - 1);
1911   write_char ('_');
1912 }
1913
1914 /*  <template-template-param>
1915                         ::= <template-param> 
1916                         ::= <substitution>  */
1917
1918 static void
1919 write_template_template_param (parm)
1920      tree parm;
1921 {
1922   tree template = NULL_TREE;
1923
1924   /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the
1925      template template parameter.  The substitution candidate here is
1926      only the template.  */
1927   if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
1928     {
1929       template 
1930         = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
1931       if (find_substitution (template))
1932         return;
1933     }
1934
1935   /* <template-param> encodes only the template parameter position,
1936      not its template arguments, which is fine here.  */
1937   write_template_param (parm);
1938   if (template)
1939     add_substitution (template);
1940 }
1941
1942 /* Non-terminal <substitution>.  
1943
1944       <substitution> ::= S <seq-id> _
1945                      ::= S_  */
1946
1947 static void
1948 write_substitution (seq_id)
1949      int seq_id;
1950 {
1951   MANGLE_TRACE ("substitution", "");
1952
1953   write_char ('S');
1954   if (seq_id > 0)
1955     write_number (seq_id - 1, /*unsigned=*/1, 36);
1956   write_char ('_');
1957 }
1958
1959 /* Start mangling a new name or type.  */
1960
1961 static inline void
1962 start_mangling ()
1963 {
1964   obstack_free (&G.name_obstack, obstack_base (&G.name_obstack));
1965 }
1966
1967 /* Done with mangling.  Return the generated mangled name.  */
1968
1969 static inline const char *
1970 finish_mangling ()
1971 {
1972   /* Clear all the substitutions.  */
1973   VARRAY_POP_ALL (G.substitutions);
1974
1975   /* Null-terminate the string.  */
1976   write_char ('\0');
1977
1978   return (const char *) obstack_base (&G.name_obstack);
1979 }
1980
1981 /* Initialize data structures for mangling.  */
1982
1983 void
1984 init_mangle ()
1985 {
1986   gcc_obstack_init (&G.name_obstack);
1987   VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
1988
1989   /* Cache these identifiers for quick comparison when checking for
1990      standard substitutions.  */
1991   subst_identifiers[SUBID_ALLOCATOR] = get_identifier ("allocator");
1992   subst_identifiers[SUBID_BASIC_STRING] = get_identifier ("basic_string");
1993   subst_identifiers[SUBID_CHAR_TRAITS] = get_identifier ("char_traits");
1994   subst_identifiers[SUBID_BASIC_ISTREAM] = get_identifier ("basic_istream");
1995   subst_identifiers[SUBID_BASIC_OSTREAM] = get_identifier ("basic_ostream");
1996   subst_identifiers[SUBID_BASIC_IOSTREAM] = get_identifier ("basic_iostream");
1997 }
1998
1999 /* Generate the mangled name of DECL.  */
2000
2001 static const char *
2002 mangle_decl_string (decl)
2003      tree decl;
2004 {
2005   const char *result;
2006
2007   start_mangling ();
2008
2009   if (TREE_CODE (decl) == TYPE_DECL)
2010     write_type (TREE_TYPE (decl));
2011   else
2012     {
2013       write_mangled_name (decl);
2014       if (DECL_LANG_SPECIFIC (decl)
2015           && (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl)
2016               || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl)))
2017         /* We need a distinct mangled name for these entities, but
2018            we should never actually output it.  So, we append some
2019            characters the assembler won't like.  */
2020         write_string (" *INTERNAL* ");
2021     }
2022
2023   result = finish_mangling ();
2024   if (DEBUG_MANGLE)
2025     fprintf (stderr, "mangle_decl_string = '%s'\n\n", result);
2026   return result;
2027 }
2028
2029 /* Create an identifier for the external mangled name of DECL.  */
2030
2031 tree
2032 mangle_decl (decl)
2033      tree decl;
2034 {
2035   return get_identifier (mangle_decl_string (decl));
2036 }
2037
2038 /* Generate the mangled representation of TYPE.  */
2039
2040 const char *
2041 mangle_type_string (type)
2042      tree type;
2043 {
2044   const char *result;
2045
2046   start_mangling ();
2047   write_type (type);
2048   result = finish_mangling ();
2049   if (DEBUG_MANGLE)
2050     fprintf (stderr, "mangle_type_string = '%s'\n\n", result);
2051   return result;
2052 }
2053
2054 /* Create an identifier for the mangled representation of TYPE.  */
2055
2056 tree
2057 mangle_type (type)
2058      tree type;
2059 {
2060   return get_identifier (mangle_type_string (type));
2061 }
2062
2063 /* Create an identifier for the mangled name of a special component
2064    for belonging to TYPE.  CODE is the ABI-specified code for this
2065    component.  */
2066
2067 static tree
2068 mangle_special_for_type (type, code)
2069      tree type;
2070      const char *code;
2071 {
2072   const char *result;
2073
2074   /* We don't have an actual decl here for the special component, so
2075      we can't just process the <encoded-name>.  Instead, fake it.  */
2076   start_mangling ();
2077
2078   /* Start the mangling.  */
2079   write_string ("_Z");
2080   write_string (code);
2081
2082   /* Add the type.  */
2083   write_type (type);
2084   result = finish_mangling ();
2085
2086   if (DEBUG_MANGLE)
2087     fprintf (stderr, "mangle_special_for_type = %s\n\n", result);
2088
2089   return get_identifier (result);
2090 }
2091
2092 /* Create an identifier for the mangled representation of the typeinfo
2093    structure for TYPE.  */
2094
2095 tree
2096 mangle_typeinfo_for_type (type)
2097      tree type;
2098 {
2099   return mangle_special_for_type (type, "TI");
2100 }
2101
2102 /* Create an identifier for the mangled name of the NTBS containing
2103    the mangled name of TYPE.  */
2104
2105 tree
2106 mangle_typeinfo_string_for_type (type)
2107      tree type;
2108 {
2109   return mangle_special_for_type (type, "TS");
2110 }
2111
2112 /* Create an identifier for the mangled name of the vtable for TYPE.  */
2113
2114 tree
2115 mangle_vtbl_for_type (type)
2116      tree type;
2117 {
2118   return mangle_special_for_type (type, "TV");
2119 }
2120
2121 /* Returns an identifier for the mangled name of the VTT for TYPE.  */
2122
2123 tree
2124 mangle_vtt_for_type (type)
2125      tree type;
2126 {
2127   return mangle_special_for_type (type, "TT");
2128 }
2129
2130 /* Return an identifier for a construction vtable group.  TYPE is
2131    the most derived class in the hierarchy; BINFO is the base
2132    subobject for which this construction vtable group will be used.  
2133
2134    This mangling isn't part of the ABI specification; in the ABI
2135    specification, the vtable group is dumped in the same COMDAT as the
2136    main vtable, and is referenced only from that vtable, so it doesn't
2137    need an external name.  For binary formats without COMDAT sections,
2138    though, we need external names for the vtable groups.  
2139
2140    We use the production
2141
2142     <special-name> ::= CT <type> <offset number> _ <base type>  */
2143
2144 tree
2145 mangle_ctor_vtbl_for_type (type, binfo)
2146      tree type;
2147      tree binfo;
2148 {
2149   const char *result;
2150
2151   start_mangling ();
2152
2153   write_string ("_Z");
2154   write_string ("TC");
2155   write_type (type);
2156   write_integer_cst (BINFO_OFFSET (binfo));
2157   write_char ('_');
2158   write_type (BINFO_TYPE (binfo));
2159
2160   result = finish_mangling ();
2161   if (DEBUG_MANGLE)
2162     fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n", result);
2163   return get_identifier (result);
2164 }
2165
2166 /* Return an identifier for the mangled name of a thunk to FN_DECL.
2167    OFFSET is the initial adjustment to this used to find the vptr.  If
2168    VCALL_OFFSET is non-NULL, this is a virtual thunk, and it is the
2169    vtbl offset in bytes.  
2170
2171     <special-name> ::= Th <offset number> _ <base encoding>
2172                    ::= Tv <offset number> _ <vcall offset number> _
2173                                                             <base encoding>
2174 */
2175
2176 tree
2177 mangle_thunk (fn_decl, offset, vcall_offset)
2178      tree fn_decl;
2179      tree offset;
2180      tree vcall_offset;
2181 {
2182   const char *result;
2183   
2184   start_mangling ();
2185
2186   write_string ("_Z");
2187   /* The <special-name> for virtual thunks is Tv, for non-virtual
2188      thunks Th.  */
2189   write_char ('T');
2190   if (vcall_offset != 0)
2191     write_char ('v');
2192   else
2193     write_char ('h');
2194
2195   /* For either flavor, write the offset to this.  */
2196   write_integer_cst (offset);
2197   write_char ('_');
2198
2199   /* For a virtual thunk, add the vcall offset.  */
2200   if (vcall_offset)
2201     {
2202       /* Virtual thunk.  Write the vcall offset and base type name.  */
2203       write_integer_cst (vcall_offset);
2204       write_char ('_');
2205     }
2206
2207   /* Scoped name.  */
2208   write_encoding (fn_decl);
2209
2210   result = finish_mangling ();
2211   if (DEBUG_MANGLE)
2212     fprintf (stderr, "mangle_thunk = %s\n\n", result);
2213   return get_identifier (result);
2214 }
2215
2216 /* Return an identifier for the mangled unqualified name for a
2217    conversion operator to TYPE.  This mangling is not specified by the
2218    ABI spec; it is only used internally.
2219
2220    For compatibility with existing conversion operator mechanisms,
2221    the mangled form is `__op<type>' where <type> is the mangled
2222    representation of TYPE.  
2223
2224    FIXME: Though identifiers with starting with __op are reserved for
2225    the implementation, it would eventually be nice to use inaccessible
2226    names for these operators.  */
2227
2228 tree
2229 mangle_conv_op_name_for_type (type)
2230      tree type;
2231 {
2232   tree identifier;
2233
2234   /* Build the mangling for TYPE.  */
2235   const char *mangled_type = mangle_type_string (type);
2236   /* Allocate a temporary buffer for the complete name.  */
2237   char *op_name = (char *) xmalloc (strlen (OPERATOR_TYPENAME_FORMAT) 
2238                                     + strlen (mangled_type) + 1);
2239   /* Assemble the mangling.  */
2240   strcpy (op_name, OPERATOR_TYPENAME_FORMAT);
2241   strcat (op_name, mangled_type);
2242   /* Find or create an identifier.  */
2243   identifier = get_identifier (op_name);
2244   /* Done with the temporary buffer.  */
2245   free (op_name);
2246   /* Set bits on the identifier so we know later it's a conversion.  */
2247   IDENTIFIER_OPNAME_P (identifier) = 1;
2248   IDENTIFIER_TYPENAME_P (identifier) = 1;
2249   /* Hang TYPE off the identifier so it can be found easily later when
2250      performing conversions.  */
2251   TREE_TYPE (identifier) = type;
2252
2253   return identifier;
2254 }
2255
2256 /* Return an identifier for the name of an initialization guard
2257    variable for indicated VARIABLE.  */
2258
2259 tree
2260 mangle_guard_variable (variable)
2261      tree variable;
2262 {
2263   start_mangling ();
2264   write_string ("_ZGV");
2265   write_name (variable, /*ignore_local_scope=*/0);
2266   return get_identifier (finish_mangling ());
2267 }