OSDN Git Service

top level:
[pf3gnuchains/gcc-fork.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     write_string ("C1");
1082   else if (DECL_BASE_CONSTRUCTOR_P (ctor))
1083     write_string ("C2");
1084   else
1085     write_string ("C*INTERNAL*");
1086 }
1087
1088 /* Handle destructor productions of non-terminal <special-name>.
1089    DTOR is a denstructor FUNCTION_DECL. 
1090
1091      <special-name> ::= D0 # deleting (in-charge) destructor
1092                     ::= D1 # complete object (in-charge) destructor
1093                     ::= D2 # base object (not-in-charge) destructor 
1094
1095    We also need to provide unique mngled names for old-ABI
1096    destructors, sometimes.  These should only be used internally.  We
1097    use "D*INTERNAL*" for these.  */
1098
1099 static void
1100 write_special_name_destructor (dtor)
1101      tree dtor;
1102 {
1103   if (DECL_DELETING_DESTRUCTOR_P (dtor))
1104     write_string ("D0");
1105   else if (DECL_COMPLETE_DESTRUCTOR_P (dtor))
1106     write_string ("D1");
1107   else if (DECL_BASE_DESTRUCTOR_P (dtor))
1108     write_string ("D2");
1109   else
1110     /* Old-ABI destructor.   */
1111     write_string ("D*INTERNAL*");
1112 }
1113
1114 /* Return the discriminator for ENTITY appearing inside
1115    FUNCTION.  The discriminator is the lexical ordinal of VAR among
1116    entities with the same name in the same FUNCTION.  */
1117
1118 static int
1119 discriminator_for_local_entity (entity)
1120      tree entity;
1121 {
1122   tree *type;
1123   int discriminator;
1124
1125   /* Assume this is the only local entity with this name.  */
1126   discriminator = 0;
1127
1128   /* For now, we don't discriminate amongst local variables.  */
1129   if (TREE_CODE (entity) != TYPE_DECL)
1130     return 0;
1131
1132   /* Scan the list of local classes.  */
1133   entity = TREE_TYPE (entity);
1134   for (type = &VARRAY_TREE (local_classes, 0); *type != entity; ++type)
1135     if (TYPE_IDENTIFIER (*type) == TYPE_IDENTIFIER (entity)
1136         && TYPE_CONTEXT (*type) == TYPE_CONTEXT (entity))
1137       ++discriminator;
1138
1139   return discriminator;
1140 }
1141
1142 /* Return the discriminator for STRING, a string literal used inside
1143    FUNCTION.  The disciminator is the lexical ordinal of STRING among
1144    string literals used in FUNCTION.  */
1145
1146 static int
1147 discriminator_for_string_literal (function, string)
1148      tree function ATTRIBUTE_UNUSED;
1149      tree string ATTRIBUTE_UNUSED;
1150 {
1151   /* For now, we don't discriminate amongst string literals.  */
1152   return 0;
1153 }
1154
1155 /*   <discriminator> := _ <number>   
1156
1157    The discriminator is used only for the second and later occurrences
1158    of the same name within a single function. In this case <number> is
1159    n - 2, if this is the nth occurrence, in lexical order.  */
1160
1161 static void
1162 write_discriminator (discriminator)
1163      int discriminator;
1164 {
1165   /* If discriminator is zero, don't write anything.  Otherwise... */
1166   if (discriminator > 0)
1167     {
1168       write_char ('_');
1169       /* The number is omitted for discriminator == 1.  Beyond 1, the
1170          numbering starts at 0.  */
1171       if (discriminator > 1)
1172         write_unsigned_number (discriminator - 2);
1173     }
1174 }
1175
1176 /* Mangle the name of a function-scope entity.  FUNCTION is the
1177    FUNCTION_DECL for the enclosing function.  ENTITY is the decl for
1178    the entity itself.  LOCAL_ENTITY is the entity that's directly
1179    scoped in FUNCTION_DECL, either ENTITY itself or an enclosing scope
1180    of ENTITY.
1181
1182      <local-name> := Z <function encoding> E <entity name> [<discriminator>]
1183                   := Z <function encoding> E s [<discriminator>]  */
1184
1185 static void
1186 write_local_name (function, local_entity, entity)
1187      tree function;
1188      tree local_entity;
1189      tree entity;
1190 {
1191   MANGLE_TRACE_TREE ("local-name", entity);
1192
1193   write_char ('Z');
1194   write_encoding (function);
1195   write_char ('E');
1196   if (TREE_CODE (entity) == STRING_CST)
1197     {
1198       write_char ('s');
1199       write_discriminator (discriminator_for_string_literal (function, 
1200                                                              entity));
1201     }
1202   else
1203     {
1204       /* Now the <entity name>.  Let write_name know its being called
1205          from <local-name>, so it doesn't try to process the enclosing
1206          function scope again.  */
1207       write_name (entity, /*ignore_local_scope=*/1);
1208       write_discriminator (discriminator_for_local_entity (local_entity));
1209     }
1210 }
1211
1212 /* Non-terminals <type> and <CV-qualifier>.  
1213
1214      <type> ::= <builtin-type>
1215             ::= <function-type>
1216             ::= <class-enum-type>
1217             ::= <array-type>
1218             ::= <pointer-to-member-type>
1219             ::= <template-param>
1220             ::= <substitution>
1221             ::= <CV-qualifier>
1222             ::= P <type>    # pointer-to
1223             ::= R <type>    # reference-to
1224             ::= C <type>    # complex pair (C 2000)  [not supported]
1225             ::= G <type>    # imaginary (C 2000)     [not supported]
1226             ::= U <source-name> <type>   # vendor extended type qualifier 
1227                                                      [not supported]
1228
1229    TYPE is a type node.  */
1230
1231 static void 
1232 write_type (type)
1233      tree type;
1234 {
1235   /* This gets set to non-zero if TYPE turns out to be a (possibly
1236      CV-qualified) builtin type.  */
1237   int is_builtin_type = 0;
1238
1239   MANGLE_TRACE_TREE ("type", type);
1240
1241   if (find_substitution (type))
1242     return;
1243   
1244   if (write_CV_qualifiers_for_type (type) > 0)
1245     /* If TYPE was CV-qualified, we just wrote the qualifiers; now
1246        mangle the unqualified type.  The recursive call is needed here
1247        since both the qualified and uqualified types are substitution
1248        candidates.  */
1249     write_type (TYPE_MAIN_VARIANT (type));
1250   else
1251     {
1252       /* See through any typedefs.  */
1253       type = TYPE_MAIN_VARIANT (type);
1254
1255       switch (TREE_CODE (type))
1256         {
1257         case VOID_TYPE:
1258         case BOOLEAN_TYPE:
1259         case INTEGER_TYPE:  /* Includes wchar_t.  */
1260         case REAL_TYPE:
1261           /* If this is a typedef, TYPE may not be one of
1262              the standard builtin type nodes, but an alias of one.  Use
1263              TYPE_MAIN_VARIANT to get to the underlying builtin type.  */
1264           write_builtin_type (TYPE_MAIN_VARIANT (type));
1265           ++is_builtin_type;
1266           break;
1267
1268         case COMPLEX_TYPE:
1269           write_char ('C');
1270           write_type (TREE_TYPE (type));
1271           break;
1272
1273         case FUNCTION_TYPE:
1274         case METHOD_TYPE:
1275           write_function_type (type);
1276           break;
1277
1278         case UNION_TYPE:
1279         case RECORD_TYPE:
1280         case ENUMERAL_TYPE:
1281           /* A pointer-to-member function is represented as a special
1282              RECORD_TYPE, so check for this first.  */
1283           if (TYPE_PTRMEMFUNC_P (type))
1284             write_pointer_to_member_type (type);
1285           else
1286             write_class_enum_type (type);
1287           break;
1288
1289         case TYPENAME_TYPE:
1290           /* We handle TYPENAME_TYPEs like ordinary nested names.  */
1291           write_nested_name (TYPE_STUB_DECL (type));
1292           break;
1293
1294         case ARRAY_TYPE:
1295           write_array_type (type);
1296           break;
1297
1298         case POINTER_TYPE:
1299           /* A pointer-to-member variable is represented by a POINTER_TYPE
1300              to an OFFSET_TYPE, so check for this first.  */
1301           if (TYPE_PTRMEM_P (type))
1302             write_pointer_to_member_type (type);
1303           else
1304             {
1305               write_char ('P');
1306               write_type (TREE_TYPE (type));
1307             }
1308           break;
1309
1310         case REFERENCE_TYPE:
1311           write_char ('R');
1312           write_type (TREE_TYPE (type));
1313           break;
1314
1315         case TEMPLATE_TYPE_PARM:
1316         case TEMPLATE_PARM_INDEX:
1317           write_template_param (type);
1318           break;
1319
1320         case TEMPLATE_TEMPLATE_PARM:
1321           write_template_template_param (type);
1322           if (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type))
1323             write_template_args 
1324               (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type)));
1325           break;
1326
1327         case OFFSET_TYPE:
1328           write_pointer_to_member_type (build_pointer_type (type));
1329           break;
1330
1331         default:
1332           my_friendly_abort (20000409);
1333         }
1334     }
1335
1336   /* Types other than builtin types are substitution candidates.  */
1337   if (!is_builtin_type)
1338     add_substitution (type);
1339 }
1340
1341 /* Non-terminal <CV-qualifiers> for type nodes.  Returns the number of
1342    CV-qualifiers written for TYPE.
1343
1344      <CV-qualifiers> ::= [r] [V] [K]  */
1345
1346 static int
1347 write_CV_qualifiers_for_type (type)
1348      tree type;
1349 {
1350   int num_qualifiers = 0;
1351
1352   /* The order is specified by:
1353
1354        "In cases where multiple order-insensitive qualifiers are
1355        present, they should be ordered 'K' (closest to the base type),
1356        'V', 'r', and 'U' (farthest from the base type) ..."  */
1357
1358   if (CP_TYPE_RESTRICT_P (type))
1359     {
1360       write_char ('r');
1361       ++num_qualifiers;
1362     }
1363   if (CP_TYPE_VOLATILE_P (type))
1364     {
1365       write_char ('V');
1366       ++num_qualifiers;
1367     }
1368   if (CP_TYPE_CONST_P (type))
1369     {
1370       write_char ('K');
1371       ++num_qualifiers;
1372     }
1373
1374   return num_qualifiers;
1375 }
1376
1377 /* Non-terminal <builtin-type>. 
1378
1379      <builtin-type> ::= v   # void 
1380                     ::= b   # bool
1381                     ::= w   # wchar_t
1382                     ::= c   # char
1383                     ::= a   # signed char
1384                     ::= h   # unsigned char
1385                     ::= s   # short
1386                     ::= t   # unsigned short
1387                     ::= i   # int
1388                     ::= j   # unsigned int
1389                     ::= l   # long
1390                     ::= m   # unsigned long
1391                     ::= x   # long long, __int64
1392                     ::= y   # unsigned long long, __int64  
1393                     ::= n   # __int128            [not supported]
1394                     ::= o   # unsigned __int128   [not supported] 
1395                     ::= f   # float
1396                     ::= d   # double
1397                     ::= e   # long double, __float80 
1398                     ::= g   # __float128          [not supported]  */
1399
1400 static void 
1401 write_builtin_type (type)
1402      tree type;
1403 {
1404   switch (TREE_CODE (type))
1405     {
1406     case VOID_TYPE:
1407       write_char ('v');
1408       break;
1409
1410     case BOOLEAN_TYPE:
1411       write_char ('b');
1412       break;
1413
1414     case INTEGER_TYPE:
1415       /* If this is size_t, get the underlying int type.  */
1416       if (TYPE_IS_SIZETYPE (type))
1417         type = TYPE_DOMAIN (type);
1418
1419       /* TYPE may still be wchar_t, since that isn't in
1420          integer_type_nodes.  */
1421       if (type == wchar_type_node)
1422         write_char ('w');
1423       else
1424         {
1425           size_t itk;
1426           /* Assume TYPE is one of the shared integer type nodes.  Find
1427              it in the array of these nodes.  */
1428           for (itk = 0; itk < itk_none; ++itk)
1429             if (type == integer_types[itk])
1430               {
1431                 /* Print the corresponding single-letter code.  */
1432                 write_char (integer_type_codes[itk]);
1433                 break;
1434               }
1435           
1436           if (itk == itk_none)
1437             /* Couldn't find this type.  */
1438             my_friendly_abort (20000408);
1439         }
1440       break;
1441
1442     case REAL_TYPE:
1443       if (type == float_type_node)
1444         write_char ('f');
1445       else if (type == double_type_node)
1446         write_char ('d');
1447       else if (type == long_double_type_node)
1448         write_char ('e');
1449       else
1450         my_friendly_abort (20000409);
1451       break;
1452
1453     default:
1454       my_friendly_abort (20000509);
1455     }
1456 }
1457
1458 /* Non-terminal <function-type>.  NODE is a FUNCTION_TYPE or
1459    METHOD_TYPE.  The return type is mangled before the parameter
1460    types.
1461
1462      <function-type> ::= F [Y] <bare-function-type> E   */
1463
1464 static void
1465 write_function_type (type)
1466      tree type;
1467 {
1468   MANGLE_TRACE_TREE ("function-type", type);
1469
1470   write_char ('F');
1471   /* We don't track whether or not a type is `extern "C"'.  Note that
1472      you can have an `extern "C"' function that does not have
1473      `extern "C"' type, and vice versa:
1474
1475        extern "C" typedef void function_t();
1476        function_t f; // f has C++ linkage, but its type is
1477                      // `extern "C"'
1478
1479        typedef void function_t();
1480        extern "C" function_t f; // Vice versa.
1481
1482      See [dcl.link].  */
1483   write_bare_function_type (type, /*include_return_type_p=*/1);
1484   write_char ('E');
1485 }
1486
1487 /* Non-terminal <bare-function-type>.  NODE is a FUNCTION_DECL or a
1488    METHOD_TYPE.  If INCLUDE_RETURN_TYPE is non-zero, the return value
1489    is mangled before the parameter types.
1490
1491      <bare-function-type> ::= </signature/ type>+  */
1492
1493 static void
1494 write_bare_function_type (type, include_return_type_p)
1495      tree type;
1496      int include_return_type_p;
1497 {
1498   MANGLE_TRACE_TREE ("bare-function-type", type);
1499
1500   /* Mangle the return type, if requested.  */
1501   if (include_return_type_p)
1502     write_type (TREE_TYPE (type));
1503
1504   /* Now mangle the types of the arguments.  */
1505   write_method_parms (TYPE_ARG_TYPES (type), 
1506                       TREE_CODE (type) == METHOD_TYPE);
1507 }
1508
1509 /* Write the mangled representation of a method parameter list of
1510    types given in PARM_LIST.  If METHOD_P is non-zero, the function is 
1511    considered a non-static method, and the this parameter is omitted.  */
1512
1513 static void
1514 write_method_parms (parm_list, method_p)
1515      tree parm_list;
1516      int method_p;
1517 {
1518   tree first_parm;
1519   /* Assume this parameter type list is variable-length.  If it ends
1520      with a void type, then it's not.  */
1521   int varargs_p = 1;
1522
1523   /* If this is a member function, skip the first arg, which is the
1524      this pointer.  
1525        "Member functions do not encode the type of their implicit this
1526        parameter."  */
1527   if (method_p)
1528     parm_list = TREE_CHAIN (parm_list);
1529
1530   for (first_parm = parm_list; 
1531        parm_list; 
1532        parm_list = TREE_CHAIN (parm_list))
1533     {
1534       tree parm = TREE_VALUE (parm_list);
1535
1536       if (parm == void_type_node)
1537         {
1538           /* "Empty parameter lists, whether declared as () or
1539              conventionally as (void), are encoded with a void parameter
1540              (v)."  */
1541           if (parm_list == first_parm)
1542             write_type (parm);
1543           /* If the parm list is terminated with a void type, it's
1544              fixed-length.  */
1545           varargs_p = 0;
1546           /* A void type better be the last one.  */
1547           my_friendly_assert (TREE_CHAIN (parm_list) == NULL, 20000523);
1548         }
1549       else
1550         write_type (parm);
1551     }
1552
1553   if (varargs_p)
1554     /* <builtin-type> ::= z  # ellipsis  */
1555     write_char ('z');
1556 }
1557
1558 /* <class-enum-type> ::= <name>  */
1559
1560 static void 
1561 write_class_enum_type (type)
1562      tree type;
1563 {
1564   write_name (TYPE_NAME (type), /*ignore_local_scope=*/0);
1565 }
1566
1567 /* Non-terminal <template-args>.  ARGS is a TREE_VEC of template
1568    arguments.
1569
1570      <template-args> ::= I <template-arg>+ E  */
1571
1572 static void
1573 write_template_args (args)
1574      tree args;
1575 {
1576   int i;
1577   int length = TREE_VEC_LENGTH (args);
1578
1579   MANGLE_TRACE_TREE ("template-args", args);
1580
1581   my_friendly_assert (length > 0, 20000422);
1582
1583   if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1584     {
1585       /* We have nested template args.  We want the innermost template
1586          argument list.  */
1587       args = TREE_VEC_ELT (args, length - 1);
1588       length = TREE_VEC_LENGTH (args);
1589     }
1590
1591   write_char ('I');
1592   for (i = 0; i < length; ++i)
1593     write_template_arg (TREE_VEC_ELT (args, i));
1594   write_char ('E');
1595 }
1596
1597 /* <expression> ::= <unary operator-name> <expression>
1598                 ::= <binary operator-name> <expression> <expression>
1599                 ::= <expr-primary>
1600
1601    <expr-primary> ::= <template-param>
1602                   ::= L <type> <value number> E  # literal
1603                   ::= L <mangled-name> E         # external name  */
1604
1605 static void
1606 write_expression (expr)
1607      tree expr;
1608 {
1609   enum tree_code code;
1610
1611   code = TREE_CODE (expr);
1612
1613   /* Handle pointers-to-members by making them look like expression
1614      nodes.  */
1615   if (code == PTRMEM_CST)
1616     {
1617       expr = build_nt (ADDR_EXPR,
1618                        build_nt (SCOPE_REF,
1619                                  PTRMEM_CST_CLASS (expr),
1620                                  PTRMEM_CST_MEMBER (expr)));
1621       code = TREE_CODE (expr);
1622     }
1623
1624   /* Handle template parameters. */
1625   if (code == TEMPLATE_TYPE_PARM 
1626       || code == TEMPLATE_TEMPLATE_PARM
1627       ||  code == TEMPLATE_PARM_INDEX)
1628     write_template_param (expr);
1629   /* Handle literals.  */
1630   else if (TREE_CODE_CLASS (code) == 'c')
1631     write_template_arg_literal (expr);
1632   else if (DECL_P (expr))
1633     {
1634       write_char ('L');
1635       write_mangled_name (expr);
1636       write_char ('E');
1637     }
1638   else
1639     {
1640       int i;
1641
1642       /* Skip NOP_EXPRs.  They can occur when (say) a pointer argument
1643          is converted (via qualification conversions) to another
1644          type.  */
1645       while (TREE_CODE (expr) == NOP_EXPR)
1646         {
1647           expr = TREE_OPERAND (expr, 0);
1648           code = TREE_CODE (expr);
1649         }
1650
1651       /* When we bind a variable or function to a non-type template
1652          argument with reference type, we create an ADDR_EXPR to show
1653          the fact that the entity's address has been taken.  But, we
1654          don't actually want to output a mangling code for the `&'.  */
1655       if (TREE_CODE (expr) == ADDR_EXPR
1656           && TREE_TYPE (expr)
1657           && TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE)
1658         {
1659           expr = TREE_OPERAND (expr, 0);
1660           if (DECL_P (expr))
1661             {
1662               write_expression (expr);
1663               return;
1664             }
1665
1666           code = TREE_CODE (expr);
1667         }
1668       
1669       /* If it wasn't any of those, recursively expand the expression.  */
1670       write_string (operator_name_info[(int) code].mangled_name);
1671
1672       /* Handle pointers-to-members specially.  */
1673       if (code == SCOPE_REF)
1674         {
1675           write_type (TREE_OPERAND (expr, 0));
1676           if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
1677             write_source_name (TREE_OPERAND (expr, 1));
1678           else
1679             write_encoding (TREE_OPERAND (expr, 1));
1680         }
1681       else
1682         for (i = 0; i < TREE_CODE_LENGTH (code); ++i)
1683           write_expression (TREE_OPERAND (expr, i));
1684     }
1685 }
1686
1687 /* Literal subcase of non-terminal <template-arg>.  
1688
1689      "Literal arguments, e.g. "A<42L>", are encoded with their type
1690      and value. Negative integer values are preceded with "n"; for
1691      example, "A<-42L>" becomes "1AILln42EE". The bool value false is
1692      encoded as 0, true as 1. If floating-point arguments are accepted
1693      as an extension, their values should be encoded using a
1694      fixed-length lowercase hexadecimal string corresponding to the
1695      internal representation (IEEE on IA-64), high-order bytes first,
1696      without leading zeroes. For example: "Lfbff000000E" is -1.0f."  */
1697
1698 static void
1699 write_template_arg_literal (value)
1700      tree value;
1701 {
1702   tree type = TREE_TYPE (value);
1703   write_char ('L');
1704   write_type (type);
1705
1706   if (TREE_CODE (value) == CONST_DECL)
1707     write_integer_cst (DECL_INITIAL (value));
1708   else if (TREE_CODE (value) == INTEGER_CST)
1709     {
1710       if (same_type_p (type, boolean_type_node))
1711         {
1712           if (value == boolean_false_node || integer_zerop (value))
1713             write_unsigned_number (0);
1714           else if (value == boolean_true_node)
1715             write_unsigned_number (1);
1716           else 
1717             my_friendly_abort (20000412);
1718         }
1719       else
1720         write_integer_cst (value);
1721     }
1722   else if (TREE_CODE (value) == REAL_CST)
1723     {
1724 #ifdef CROSS_COMPILE
1725       static int explained;
1726
1727       if (!explained) 
1728         {
1729           sorry ("real-valued template parameters when cross-compiling");
1730           explained = 1;
1731         }
1732 #else
1733       size_t i;
1734       for (i = 0; i < sizeof (TREE_REAL_CST (value)); ++i)
1735         write_number (((unsigned char *) 
1736                        &TREE_REAL_CST (value))[i], 
1737                       /*unsigned_p=*/1,
1738                       16);
1739 #endif
1740     }
1741   else
1742     my_friendly_abort (20000412);
1743
1744   write_char ('E');
1745 }
1746
1747 /* Non-terminal <tempalate-arg>.  
1748
1749      <template-arg> ::= <type>                        # type
1750                     ::= L <type> </value/ number> E   # literal
1751                     ::= LZ <name> E                   # external name
1752                     ::= X <expression> E              # expression  */
1753
1754 static void
1755 write_template_arg (node)
1756      tree node;
1757 {
1758   enum tree_code code = TREE_CODE (node);
1759
1760   MANGLE_TRACE_TREE ("template-arg", node);
1761
1762   /* A template template paramter's argument list contains TREE_LIST
1763      nodes of which the value field is the the actual argument.  */
1764   if (code == TREE_LIST)
1765     {
1766       node = TREE_VALUE (node);
1767       /* If it's a decl, deal with its type instead.  */
1768       if (DECL_P (node))
1769         {
1770           node = TREE_TYPE (node);
1771           code = TREE_CODE (node);
1772         }
1773     }
1774
1775   if (TYPE_P (node))
1776     write_type (node);
1777   else if (code == TEMPLATE_DECL)
1778     /* A template appearing as a template arg is a template template arg.  */
1779     write_template_template_arg (node);
1780   else if (DECL_P (node))
1781     {
1782       write_char ('L');
1783       write_char ('Z');
1784       write_encoding (node);
1785       write_char ('E');
1786     }
1787   else if (TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
1788     write_template_arg_literal (node);
1789   else
1790     {
1791       /* Template arguments may be expressions.  */
1792       write_char ('X');
1793       write_expression (node);
1794       write_char ('E');
1795     }
1796 }
1797
1798 /*  <template-template-arg>
1799                         ::= <name>
1800                         ::= <substitution>  */
1801
1802 void
1803 write_template_template_arg (tree decl)
1804 {
1805   MANGLE_TRACE_TREE ("template-template-arg", decl);
1806
1807   if (find_substitution (decl))
1808     return;
1809   write_name (decl, /*ignore_local_scope=*/0);
1810   add_substitution (decl);
1811 }
1812
1813
1814 /* Non-terminal <array-type>.  TYPE is an ARRAY_TYPE.  
1815
1816      <array-type> ::= A [</dimension/ number>] _ </element/ type>  
1817                   ::= A <expression> _ </element/ type>
1818
1819      "Array types encode the dimension (number of elements) and the
1820      element type. For variable length arrays, the dimension (but not
1821      the '_' separator) is omitted."  */
1822
1823 static void 
1824 write_array_type (type)
1825   tree type;
1826 {
1827   write_char ('A');
1828   if (TYPE_DOMAIN (type))
1829     {
1830       tree index_type;
1831       tree max;
1832
1833       index_type = TYPE_DOMAIN (type);
1834       /* The INDEX_TYPE gives the upper and lower bounds of the
1835          array.  */
1836       max = TYPE_MAX_VALUE (index_type);
1837       if (TREE_CODE (max) == INTEGER_CST)
1838         {
1839           /* The ABI specifies that we should mangle the number of
1840              elements in the array, not the largest allowed index.  */
1841           max = size_binop (PLUS_EXPR, max, size_one_node);
1842           write_unsigned_number (tree_low_cst (max, 1));
1843         }
1844       else
1845         write_expression (TREE_OPERAND (max, 0));
1846     }
1847   write_char ('_');
1848   write_type (TREE_TYPE (type));
1849 }
1850
1851 /* Non-terminal <pointer-to-member-type> for pointer-to-member
1852    variables.  TYPE is a pointer-to-member POINTER_TYPE.
1853
1854      <pointer-to-member-type> ::= M </class/ type> </member/ type>  */
1855
1856 static void
1857 write_pointer_to_member_type (type)
1858      tree type;
1859 {
1860   write_char ('M');
1861   write_type (TYPE_PTRMEM_CLASS_TYPE (type));
1862   write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
1863 }
1864
1865 /* Non-terminal <template-param>.  PARM is a TEMPLATE_TYPE_PARM,
1866    TEMPLATE_TEMPLATE_PARM, or a TEMPLATE_PARM_INDEX.
1867
1868      <template-param> ::= T </parameter/ number> _  */
1869
1870 static void
1871 write_template_param (parm)
1872      tree parm;
1873 {
1874   int parm_index;
1875
1876   MANGLE_TRACE_TREE ("template-parm", parm);
1877
1878   switch (TREE_CODE (parm))
1879     {
1880     case TEMPLATE_TYPE_PARM:
1881     case TEMPLATE_TEMPLATE_PARM:
1882       parm_index = TEMPLATE_TYPE_IDX (parm);
1883       break;
1884
1885     case TEMPLATE_PARM_INDEX:
1886       parm_index = TEMPLATE_PARM_IDX (parm);
1887       break;
1888
1889     default:
1890       my_friendly_abort (20000523);
1891     }
1892
1893   write_char ('T');
1894   /* NUMBER as it appears in the mangling is (-1)-indexed, with the
1895      earliest template param denoted by `_'.  */
1896   if (parm_index > 0)
1897     write_unsigned_number (parm_index - 1);
1898   write_char ('_');
1899 }
1900
1901 /*  <template-template-param>
1902                         ::= <template-param> 
1903                         ::= <substitution>  */
1904
1905 static void
1906 write_template_template_param (parm)
1907      tree parm;
1908 {
1909   tree template = NULL_TREE;
1910
1911   /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the
1912      template template parameter.  The substitution candidate here is
1913      only the template.  */
1914   if (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm))
1915     {
1916       template 
1917         = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
1918       if (find_substitution (template))
1919         return;
1920     }
1921
1922   /* <template-param> encodes only the template parameter position,
1923      not its template arguments, which is fine here.  */
1924   write_template_param (parm);
1925   if (template)
1926     add_substitution (template);
1927 }
1928
1929 /* Non-terminal <substitution>.  
1930
1931       <substitution> ::= S <seq-id> _
1932                      ::= S_  */
1933
1934 static void
1935 write_substitution (seq_id)
1936      int seq_id;
1937 {
1938   MANGLE_TRACE ("substitution", "");
1939
1940   write_char ('S');
1941   if (seq_id > 0)
1942     write_number (seq_id - 1, /*unsigned=*/1, 36);
1943   write_char ('_');
1944 }
1945
1946 /* Start mangling a new name or type.  */
1947
1948 static inline void
1949 start_mangling ()
1950 {
1951   obstack_free (&G.name_obstack, obstack_base (&G.name_obstack));
1952 }
1953
1954 /* Done with mangling.  Return the generated mangled name.  */
1955
1956 static inline const char *
1957 finish_mangling ()
1958 {
1959   /* Clear all the substitutions.  */
1960   VARRAY_POP_ALL (G.substitutions);
1961
1962   /* Null-terminate the string.  */
1963   write_char ('\0');
1964
1965   return (const char *) obstack_base (&G.name_obstack);
1966 }
1967
1968 /* Initialize data structures for mangling.  */
1969
1970 void
1971 init_mangle ()
1972 {
1973   gcc_obstack_init (&G.name_obstack);
1974   VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
1975
1976   /* Cache these identifiers for quick comparison when checking for
1977      standard substitutions.  */
1978   subst_identifiers[SUBID_ALLOCATOR] = get_identifier ("allocator");
1979   subst_identifiers[SUBID_BASIC_STRING] = get_identifier ("basic_string");
1980   subst_identifiers[SUBID_CHAR_TRAITS] = get_identifier ("char_traits");
1981   subst_identifiers[SUBID_BASIC_ISTREAM] = get_identifier ("basic_istream");
1982   subst_identifiers[SUBID_BASIC_OSTREAM] = get_identifier ("basic_ostream");
1983   subst_identifiers[SUBID_BASIC_IOSTREAM] = get_identifier ("basic_iostream");
1984 }
1985
1986 /* Generate the mangled name of DECL.  */
1987
1988 static const char *
1989 mangle_decl_string (decl)
1990      tree decl;
1991 {
1992   const char *result;
1993
1994   start_mangling ();
1995
1996   if (TREE_CODE (decl) == TYPE_DECL)
1997     write_type (TREE_TYPE (decl));
1998   else
1999     write_mangled_name (decl);
2000
2001   result = finish_mangling ();
2002   if (DEBUG_MANGLE)
2003     fprintf (stderr, "mangle_decl_string = '%s'\n\n", result);
2004   return result;
2005 }
2006
2007 /* Create an identifier for the external mangled name of DECL.  */
2008
2009 tree
2010 mangle_decl (decl)
2011      tree decl;
2012 {
2013   return get_identifier (mangle_decl_string (decl));
2014 }
2015
2016 /* Generate the mangled representation of TYPE.  */
2017
2018 const char *
2019 mangle_type_string (type)
2020      tree type;
2021 {
2022   const char *result;
2023
2024   start_mangling ();
2025   write_type (type);
2026   result = finish_mangling ();
2027   if (DEBUG_MANGLE)
2028     fprintf (stderr, "mangle_type_string = '%s'\n\n", result);
2029   return result;
2030 }
2031
2032 /* Create an identifier for the mangled representation of TYPE.  */
2033
2034 tree
2035 mangle_type (type)
2036      tree type;
2037 {
2038   return get_identifier (mangle_type_string (type));
2039 }
2040
2041 /* Create an identifier for the mangled name of a special component
2042    for belonging to TYPE.  CODE is the ABI-specified code for this
2043    component.  */
2044
2045 static tree
2046 mangle_special_for_type (type, code)
2047      tree type;
2048      const char *code;
2049 {
2050   const char *result;
2051
2052   /* We don't have an actual decl here for the special component, so
2053      we can't just process the <encoded-name>.  Instead, fake it.  */
2054   start_mangling ();
2055
2056   /* Start the mangling.  */
2057   write_string ("_Z");
2058   write_string (code);
2059
2060   /* Add the type.  */
2061   write_type (type);
2062   result = finish_mangling ();
2063
2064   if (DEBUG_MANGLE)
2065     fprintf (stderr, "mangle_special_for_type = %s\n\n", result);
2066
2067   return get_identifier (result);
2068 }
2069
2070 /* Create an identifier for the mangled representation of the typeinfo
2071    structure for TYPE.  */
2072
2073 tree
2074 mangle_typeinfo_for_type (type)
2075      tree type;
2076 {
2077   return mangle_special_for_type (type, "TI");
2078 }
2079
2080 /* Create an identifier for the mangled name of the NTBS containing
2081    the mangled name of TYPE.  */
2082
2083 tree
2084 mangle_typeinfo_string_for_type (type)
2085      tree type;
2086 {
2087   return mangle_special_for_type (type, "TS");
2088 }
2089
2090 /* Create an identifier for the mangled name of the vtable for TYPE.  */
2091
2092 tree
2093 mangle_vtbl_for_type (type)
2094      tree type;
2095 {
2096   return mangle_special_for_type (type, "TV");
2097 }
2098
2099 /* Returns an identifier for the mangled name of the VTT for TYPE.  */
2100
2101 tree
2102 mangle_vtt_for_type (type)
2103      tree type;
2104 {
2105   return mangle_special_for_type (type, "TT");
2106 }
2107
2108 /* Return an identifier for a construction vtable group.  TYPE is
2109    the most derived class in the hierarchy; BINFO is the base
2110    subobject for which this construction vtable group will be used.  
2111
2112    This mangling isn't part of the ABI specification; in the ABI
2113    specification, the vtable group is dumped in the same COMDAT as the
2114    main vtable, and is referenced only from that vtable, so it doesn't
2115    need an external name.  For binary formats without COMDAT sections,
2116    though, we need external names for the vtable groups.  
2117
2118    We use the production
2119
2120     <special-name> ::= CT <type> <offset number> _ <base type>  */
2121
2122 tree
2123 mangle_ctor_vtbl_for_type (type, binfo)
2124      tree type;
2125      tree binfo;
2126 {
2127   const char *result;
2128
2129   start_mangling ();
2130
2131   write_string ("_Z");
2132   write_string ("TC");
2133   write_type (type);
2134   write_integer_cst (BINFO_OFFSET (binfo));
2135   write_char ('_');
2136   write_type (BINFO_TYPE (binfo));
2137
2138   result = finish_mangling ();
2139   if (DEBUG_MANGLE)
2140     fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n", result);
2141   return get_identifier (result);
2142 }
2143
2144 /* Return an identifier for the mangled name of a thunk to FN_DECL.
2145    OFFSET is the initial adjustment to this used to find the vptr.  If
2146    VCALL_OFFSET is non-NULL, this is a virtual thunk, and it is the
2147    vtbl offset in bytes.  
2148
2149     <special-name> ::= Th <offset number> _ <base encoding>
2150                    ::= Tv <offset number> _ <vcall offset number> _
2151                                                             <base encoding>
2152 */
2153
2154 tree
2155 mangle_thunk (fn_decl, offset, vcall_offset)
2156      tree fn_decl;
2157      tree offset;
2158      tree vcall_offset;
2159 {
2160   const char *result;
2161   
2162   start_mangling ();
2163
2164   write_string ("_Z");
2165   /* The <special-name> for virtual thunks is Tv, for non-virtual
2166      thunks Th.  */
2167   write_char ('T');
2168   if (vcall_offset != 0)
2169     write_char ('v');
2170   else
2171     write_char ('h');
2172
2173   /* For either flavor, write the offset to this.  */
2174   write_integer_cst (offset);
2175   write_char ('_');
2176
2177   /* For a virtual thunk, add the vcall offset.  */
2178   if (vcall_offset)
2179     {
2180       /* Virtual thunk.  Write the vcall offset and base type name.  */
2181       write_integer_cst (vcall_offset);
2182       write_char ('_');
2183     }
2184
2185   /* Scoped name.  */
2186   write_encoding (fn_decl);
2187
2188   result = finish_mangling ();
2189   if (DEBUG_MANGLE)
2190     fprintf (stderr, "mangle_thunk = %s\n\n", result);
2191   return get_identifier (result);
2192 }
2193
2194 /* Return an identifier for the mangled unqualified name for a
2195    conversion operator to TYPE.  This mangling is not specified by the
2196    ABI spec; it is only used internally.
2197
2198    For compatibility with existing conversion operator mechanisms,
2199    the mangled form is `__op<type>' where <type> is the mangled
2200    representation of TYPE.  
2201
2202    FIXME: Though identifiers with starting with __op are reserved for
2203    the implementation, it would eventually be nice to use inaccessible
2204    names for these operators.  */
2205
2206 tree
2207 mangle_conv_op_name_for_type (type)
2208      tree type;
2209 {
2210   tree identifier;
2211
2212   /* Build the mangling for TYPE.  */
2213   const char *mangled_type = mangle_type_string (type);
2214   /* Allocate a temporary buffer for the complete name.  */
2215   char *op_name = (char *) xmalloc (strlen (OPERATOR_TYPENAME_FORMAT) 
2216                                     + strlen (mangled_type) + 1);
2217   /* Assemble the mangling.  */
2218   strcpy (op_name, OPERATOR_TYPENAME_FORMAT);
2219   strcat (op_name, mangled_type);
2220   /* Find or create an identifier.  */
2221   identifier = get_identifier (op_name);
2222   /* Done with the temporary buffer.  */
2223   free (op_name);
2224   /* Set bits on the identifier so we know later it's a conversion.  */
2225   IDENTIFIER_OPNAME_P (identifier) = 1;
2226   IDENTIFIER_TYPENAME_P (identifier) = 1;
2227   /* Hang TYPE off the identifier so it can be found easily later when
2228      performing conversions.  */
2229   TREE_TYPE (identifier) = type;
2230
2231   return identifier;
2232 }
2233
2234 /* Return an identifier for the name of an initialization guard
2235    variable for indicated VARIABLE.  */
2236
2237 tree
2238 mangle_guard_variable (variable)
2239      tree variable;
2240 {
2241   start_mangling ();
2242   write_string ("_ZGV");
2243   write_name (variable, /*ignore_local_scope=*/0);
2244   return get_identifier (finish_mangling ());
2245 }