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>
5 This file is part of GNU CC.
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)
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.
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
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
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.
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:
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
58 /* Debugging support. */
60 /* Define DEBUG_MANGLE to enable very verbose trace messages. */
62 #define DEBUG_MANGLE 0
65 /* Macros for tracing the write_* functions. */
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)
73 # define MANGLE_TRACE(FN, INPUT)
74 # define MANGLE_TRACE_TREE(FN, NODE)
77 /* Non-zero if NODE is a template-id. */
78 #define DECL_TEMPLATE_ID_P(NODE) \
79 (DECL_LANG_SPECIFIC (NODE) != NULL \
80 && DECL_USE_TEMPLATE (NODE) \
81 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (NODE)))
83 /* Non-zero if NODE is a class template-id. */
84 #define CLASSTYPE_TEMPLATE_ID_P(NODE) \
85 (TYPE_LANG_SPECIFIC (NODE) != NULL \
86 && CLASSTYPE_USE_TEMPLATE (NODE) \
87 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
89 /* Things we only need one of. This module is not reentrant. */
92 /* The name in which we're building the mangled name. */
93 struct obstack name_obstack;
95 /* The current innermost template args. */
98 /* An array of the current substitution candidates, in the order
100 varray_type substitutions;
103 /* Indices into subst_identifiers. These are identifiers used in
104 special substitution rules. */
112 SUBID_BASIC_IOSTREAM,
115 substitution_identifier_index_t;
117 /* For quick substitution checks, look up these common identifiers
119 static tree subst_identifiers[SUBID_MAX];
121 /* Single-letter codes for builtin integer types, defined in
122 <builtin-type>. These are indexed by integer_type_kind values. */
124 integer_type_codes[itk_none] =
127 'a', /* itk_signed_char */
128 'h', /* itk_unsigned_char */
130 't', /* itk_unsigned_short */
132 'j', /* itk_unsigned_int */
134 'm', /* itk_unsigned_long */
135 'x', /* itk_long_long */
136 'y' /* itk_unsigned_long_long */
139 /* Functions for handling substitutions. */
141 static inline tree canonicalize_for_substitution PARAMS ((tree));
142 static void add_substitution PARAMS ((tree));
143 static inline int is_std_substitution PARAMS ((tree, substitution_identifier_index_t));
144 static inline int is_std_substitution_char PARAMS ((tree, substitution_identifier_index_t));
145 static int find_substitution PARAMS ((tree));
147 /* Functions for emitting mangled representations of things. */
149 static void write_mangled_name PARAMS ((tree));
150 static void write_encoding PARAMS ((tree));
151 static void write_name PARAMS ((tree));
152 static void write_unscoped_name PARAMS ((tree));
153 static void write_unscoped_template_name PARAMS ((tree));
154 static void write_nested_name PARAMS ((tree));
155 static void write_prefix PARAMS ((tree));
156 static void write_template_prefix PARAMS ((tree));
157 static void write_component PARAMS ((tree));
158 static void write_unqualified_name PARAMS ((tree));
159 static void write_source_name PARAMS ((tree));
160 static void write_number PARAMS ((int, int));
161 static void write_integer_cst PARAMS ((tree));
162 static void write_identifier PARAMS ((char *));
163 static void write_special_name_constructor PARAMS ((tree));
164 static void write_special_name_destructor PARAMS ((tree));
165 static void write_type PARAMS ((tree));
166 static int write_CV_qualifiers_for_type PARAMS ((tree));
167 static void write_builtin_type PARAMS ((tree));
168 static void write_function_type PARAMS ((tree, int));
169 static void write_bare_function_type PARAMS ((tree, int));
170 static void write_method_parms PARAMS ((tree, int));
171 static void write_class_enum_type PARAMS ((tree));
172 static void write_template_args PARAMS ((tree));
173 static void write_expression PARAMS ((tree));
174 static void write_template_arg_literal PARAMS ((tree));
175 static void write_template_arg PARAMS ((tree));
176 static void write_template_template_arg PARAMS ((tree));
177 static void write_array_type PARAMS ((tree));
178 static void write_pointer_to_member_type PARAMS ((tree));
179 static void write_template_param PARAMS ((tree));
180 static void write_template_template_param PARAMS ((tree));
181 static void write_substitution PARAMS ((int));
182 static int discriminator_for_local_entity PARAMS ((tree));
183 static int discriminator_for_string_literal PARAMS ((tree, tree));
184 static void write_discriminator PARAMS ((int));
185 static void write_local_name PARAMS ((tree, tree));
186 static void dump_substitution_candidates PARAMS ((void));
187 static const char *mangle_decl_string PARAMS ((tree));
189 /* Control functions. */
191 static inline void start_mangling PARAMS ((void));
192 static inline const char *finish_mangling PARAMS ((void));
193 static tree mangle_special_for_type PARAMS ((tree, const char *));
195 /* Append a single character to the end of the mangled
197 #define write_char(CHAR) \
198 obstack_1grow (&G.name_obstack, (CHAR))
200 /* Append a NUL-terminated string to the end of the mangled
202 #define write_string(STRING) \
203 obstack_grow (&G.name_obstack, (STRING), strlen (STRING))
205 /* Return the position at which the next character will be appended to
206 the mangled representation. */
207 #define mangled_position() \
208 obstack_object_size (&G.name_obstack)
210 /* Non-zero if NODE1__ and NODE2__ are both TREE_LIST nodes and have
211 the same purpose (context, which may be a type) and value (template
212 decl). See write_template_prefix for more information on what this
214 #define NESTED_TEMPLATE_MATCH(NODE1, NODE2) \
215 (TREE_CODE (NODE1) == TREE_LIST \
216 && TREE_CODE (NODE2) == TREE_LIST \
217 && ((TYPE_P (TREE_PURPOSE (NODE1)) \
218 && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2)))\
219 || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2)) \
220 && TREE_VALUE (NODE1) == TREE_VALUE (NODE2))
222 /* Produce debugging output of current substitution candidates. */
225 dump_substitution_candidates ()
229 fprintf (stderr, " ++ substitutions ");
230 for (i = 0; i < VARRAY_ACTIVE_SIZE (G.substitutions); ++i)
232 tree el = VARRAY_TREE (G.substitutions, i);
233 const char *name = "???";
236 fprintf (stderr, " ");
238 name = IDENTIFIER_POINTER (DECL_NAME (el));
239 else if (TREE_CODE (el) == TREE_LIST)
240 name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el)));
241 else if (TYPE_NAME (el))
242 name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (el)));
243 fprintf (stderr, " S%d_ = ", i - 1);
245 (CP_TYPE_RESTRICT_P (el)
246 || CP_TYPE_VOLATILE_P (el)
247 || CP_TYPE_CONST_P (el)))
248 fprintf (stderr, "CV-");
249 fprintf (stderr, "%s (%s at %p)\n",
250 name, tree_code_name[TREE_CODE (el)], (void *) el);
254 /* Both decls and types can be substitution candidates, but sometimes
255 they refer to the same thing. For instance, a TYPE_DECL and
256 RECORD_TYPE for the same class refer to the same thing, and should
257 be treated accordinginly in substitutions. This function returns a
258 canonicalized tree node representing NODE that is used when adding
259 and substitution candidates and finding matches. */
262 canonicalize_for_substitution (node)
265 /* For a TYPE_DECL, use the type instead. */
266 if (TREE_CODE (node) == TYPE_DECL)
267 node = TREE_TYPE (node);
272 /* Add NODE as a substitution candidate. NODE must not already be on
273 the list of candidates. */
276 add_substitution (node)
282 fprintf (stderr, " ++ add_substitution (%s at %10p)\n",
283 tree_code_name[TREE_CODE (node)], (void *) node);
285 /* Get the canonicalized substitution candidate for NODE. */
286 c = canonicalize_for_substitution (node);
287 if (DEBUG_MANGLE && c != node)
288 fprintf (stderr, " ++ using candidate (%s at %10p)\n",
289 tree_code_name[TREE_CODE (node)], (void *) node);
293 /* Make sure NODE isn't already a candidate. */
296 for (i = VARRAY_ACTIVE_SIZE (G.substitutions); --i >= 0; )
298 tree candidate = VARRAY_TREE (G.substitutions, i);
300 && node == candidate)
302 && TYPE_P (candidate)
303 && same_type_p (node, candidate)))
304 my_friendly_abort (20000524);
307 #endif /* ENABLE_CHECKING */
309 /* Put the decl onto the varray of substitution candidates. */
310 VARRAY_PUSH_TREE (G.substitutions, node);
313 dump_substitution_candidates ();
316 /* Helper function for find_substitution. Returns non-zero if NODE,
317 which may be a decl or a CLASS_TYPE, is a template-id with template
318 name of substitution_index[INDEX] in the ::std namespace. */
321 is_std_substitution (node, index)
323 substitution_identifier_index_t index;
330 type = TREE_TYPE (node);
333 else if (CLASS_TYPE_P (node))
336 decl = TYPE_NAME (node);
339 /* These are not the droids you're looking for. */
343 DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))
344 && TYPE_LANG_SPECIFIC (type)
345 && CLASSTYPE_USE_TEMPLATE (type)
346 && (DECL_NAME (CLASSTYPE_TI_TEMPLATE (type))
347 == subst_identifiers[index]);
350 /* Helper function for find_substitution. Returns non-zero if NODE,
351 which may be a decl or a CLASS_TYPE, is the template-id
352 ::std::identifier<char>, where identifier is
353 substitution_index[INDEX]. */
356 is_std_substitution_char (node, index)
358 substitution_identifier_index_t index;
361 /* Check NODE's name is ::std::identifier. */
362 if (!is_std_substitution (node, index))
364 /* Figure out its template args. */
366 args = DECL_TI_ARGS (node);
367 else if (CLASS_TYPE_P (node))
368 args = CLASSTYPE_TI_ARGS (node);
370 /* Oops, not a template. */
372 /* NODE's template arg list should be <char>. */
374 TREE_VEC_LENGTH (args) == 1
375 && TREE_VEC_ELT (args, 0) == char_type_node;
378 /* Check whether a substitution should be used to represent NODE in
381 First, check standard special-case substitutions.
383 <substitution> ::= St
390 # ::std::basic_string
393 # ::std::basic_string<char,
394 ::std::char_traits<char>,
395 ::std::allocator<char> >
398 # ::std::basic_istream<char, ::std::char_traits<char> >
401 # ::std::basic_ostream<char, ::std::char_traits<char> >
404 # ::std::basic_iostream<char, ::std::char_traits<char> >
406 Then examine the stack of currently available substitution
407 candidates for entities appearing earlier in the same mangling
409 If a substitution is found, write its mangled representation and
410 return non-zero. If none is found, just return zero. */
413 find_substitution (node)
417 int size = VARRAY_ACTIVE_SIZE (G.substitutions);
422 fprintf (stderr, " ++ find_substitution (%s at %p)\n",
423 tree_code_name[TREE_CODE (node)], (void *) node);
425 /* Obtain the canonicalized substitution representation for NODE.
426 This is what we'll compare against. */
427 node = canonicalize_for_substitution (node);
429 /* Check for builtin substitutions. */
431 decl = TYPE_P (node) ? TYPE_NAME (node) : node;
432 type = TYPE_P (node) ? node : TREE_TYPE (node);
434 /* Check for std::allocator. */
435 if (decl && is_std_substitution (decl, SUBID_ALLOCATOR))
441 /* Check for std::basic_string. */
442 if (decl && is_std_substitution (decl, SUBID_BASIC_STRING))
446 /* If this is a type (i.e. a fully-qualified template-id),
448 std::basic_string <char,
449 std::char_traits<char>,
450 std::allocator<char> > . */
451 if (CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED
452 && CLASSTYPE_USE_TEMPLATE (type))
454 tree args = CLASSTYPE_TI_ARGS (type);
455 if (TREE_VEC_LENGTH (args) == 3
456 && TREE_VEC_ELT (args, 0) == char_type_node
457 && is_std_substitution_char (TREE_VEC_ELT (args, 1),
459 && is_std_substitution_char (TREE_VEC_ELT (args, 2),
468 /* Substitute for the template name only if this isn't a type. */
475 /* Check for basic_{i,o,io}stream. */
477 && CP_TYPE_QUALS (type) == TYPE_UNQUALIFIED
478 && CLASS_TYPE_P (type)
479 && CLASSTYPE_USE_TEMPLATE (type)
480 && CLASSTYPE_TEMPLATE_INFO (type) != NULL)
482 /* First, check for the template
483 args <char, std::char_traits<char> > . */
484 tree args = CLASSTYPE_TI_ARGS (type);
485 if (TREE_VEC_LENGTH (args) == 2
486 && TREE_VEC_ELT (args, 0) == char_type_node
487 && is_std_substitution_char (TREE_VEC_ELT (args, 1),
490 /* Got them. Is this basic_istream? */
491 tree name = DECL_NAME (CLASSTYPE_TI_TEMPLATE (type));
492 if (name == subst_identifiers[SUBID_BASIC_ISTREAM])
497 /* Or basic_ostream? */
498 else if (name == subst_identifiers[SUBID_BASIC_OSTREAM])
503 /* Or basic_iostream? */
504 else if (name == subst_identifiers[SUBID_BASIC_IOSTREAM])
512 /* Check for namespace std. */
513 if (decl&& DECL_NAMESPACE_STD_P (decl))
519 /* Now check the list of available substitutions for this mangling
522 for (i = 0; i < size; ++i)
524 tree candidate = VARRAY_TREE (G.substitutions, i);
525 /* NODE is a matched to a candidate if it's the same decl node or
526 if it's the same type. */
527 if (decl == candidate
528 || (TYPE_P (candidate) && type && TYPE_P (type)
529 && same_type_p (type, candidate))
530 || NESTED_TEMPLATE_MATCH (node, candidate))
532 write_substitution (i);
537 /* No substitution found. */
542 /* <mangled-name> ::= _Z <encoding> */
545 write_mangled_name (decl)
548 MANGLE_TRACE_TREE ("mangled-name", decl);
550 if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
551 /* The standard notes:
552 "The <encoding> of an extern "C" function is treated like
553 global-scope data, i.e. as its <source-name> without a type." */
554 write_source_name (DECL_NAME (decl));
556 /* C++ name; needs to be mangled. */
559 write_encoding (decl);
563 /* <encoding> ::= <function name> <bare-function-type>
565 ::= <substitution> */
568 write_encoding (decl)
571 MANGLE_TRACE_TREE ("encoding", decl);
573 if (find_substitution (decl))
576 if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
578 write_source_name (DECL_NAME (decl));
583 if (TREE_CODE (decl) == FUNCTION_DECL)
587 if (DECL_TEMPLATE_ID_P (decl))
588 fn_type = get_mostly_instantiated_function_type (decl, NULL, NULL);
590 fn_type = TREE_TYPE (decl);
592 write_bare_function_type (fn_type, DECL_TEMPLATE_ID_P (decl));
595 add_substitution (decl);
598 /* <name> ::= <unscoped-name>
599 ::= <unscoped-template-name> <template-args>
607 tree context = CP_DECL_CONTEXT (decl);
609 MANGLE_TRACE_TREE ("name", decl);
611 /* Decls in :: or ::std scope are treated specially. */
612 if (context == global_namespace || DECL_NAMESPACE_STD_P (context))
614 if (decl && DECL_TEMPLATE_ID_P (decl))
616 /* Templated decls get an <unqualified-template-name>. */
617 write_unscoped_template_name (DECL_TI_TEMPLATE (decl));
618 write_template_args (DECL_TI_ARGS (decl));
620 else if (TREE_CODE (decl) == TYPE_DECL
621 && CLASSTYPE_TEMPLATE_ID_P (TREE_TYPE (decl)))
625 /* Templated decls get an <unqualified-template-name>. */
626 type = TREE_TYPE (decl);
627 write_unscoped_template_name (TYPE_TI_TEMPLATE (type));
628 write_template_args (TYPE_TI_ARGS (type));
631 /* Everything else gets an <unqualified-name>. */
632 write_unscoped_name (decl);
634 /* Handle local names. */
635 else if (TREE_CODE (context) == FUNCTION_DECL)
636 write_local_name (context, decl);
637 /* Other decls get a <nested-name> to encode their scope. */
639 write_nested_name (decl);
642 /* <unscoped-name> ::= <unqualified-name>
643 ::= St <unqualified-name> # ::std:: */
646 write_unscoped_name (decl)
649 tree context = CP_DECL_CONTEXT (decl);
651 MANGLE_TRACE_TREE ("unscoped-name", decl);
653 /* Is DECL in ::std? */
654 if (DECL_NAMESPACE_STD_P (context))
657 write_unqualified_name (decl);
659 /* If not, it should be in the global namespace. */
660 else if (context == global_namespace || context == NULL)
661 write_unqualified_name (decl);
663 my_friendly_abort (20000521);
666 /* <unscoped-template-name> ::= <unscoped-name>
667 ::= <substitution> */
670 write_unscoped_template_name (decl)
673 MANGLE_TRACE_TREE ("unscoped-template-name", decl);
675 if (find_substitution (decl))
677 write_unscoped_name (decl);
678 add_substitution (decl);
681 /* Write the nested name, including CV-qualifiers, of DECL.
683 <nested-name> ::= N [<CV-qualifiers>] <prefix> <component> E
684 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
686 <CV-qualifiers> ::= [r] [V] [K] */
689 write_nested_name (decl)
692 MANGLE_TRACE_TREE ("nested-name", decl);
696 /* Write CV-qualifiers, if this is a member function. */
697 if (TREE_CODE (decl) == FUNCTION_DECL
698 && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
700 if (DECL_VOLATILE_MEMFUNC_P (decl))
702 if (DECL_CONST_MEMFUNC_P (decl))
706 if (DECL_TEMPLATE_ID_P (decl))
708 write_template_prefix (decl);
709 write_template_args (DECL_TI_ARGS (decl));
711 else if (CLASSTYPE_TEMPLATE_ID_P (TREE_TYPE (decl)))
713 write_template_prefix (decl);
714 write_template_args (CLASSTYPE_TI_ARGS (TREE_TYPE (decl)));
718 write_prefix (DECL_CONTEXT (decl));
719 write_component (decl);
724 /* <prefix> ::= <prefix> <component>
725 ::= <template-prefix> <template-args>
727 ::= <substitution> */
738 || node == global_namespace)
741 MANGLE_TRACE_TREE ("prefix", node);
743 decl = DECL_P (node) ? node : TYPE_NAME (node);
744 type = DECL_P (node) ? TREE_TYPE (node) : node;
745 context = CP_DECL_CONTEXT (decl);
747 if (find_substitution (node))
750 /* Check if this is a template-id. For a template member, the
751 template info will be hanging off the decl. */
752 if (DECL_TEMPLATE_ID_P (decl))
754 write_template_prefix (decl);
755 write_template_args (DECL_TI_ARGS (decl));
757 /* For a template class, the template info will be hanging off the
759 else if (type && CLASSTYPE_TEMPLATE_ID_P (type))
761 write_template_prefix (type);
762 write_template_args (CLASSTYPE_TI_ARGS (type));
767 write_prefix (context);
768 write_component (decl);
771 add_substitution (node);
774 /* <template-prefix> ::= <prefix> <template component>
777 Names of templates are substitution candidates. For a nested
778 template, though, the template name for the innermost name must
779 have all the outer template levels instantiated. For instance,
782 template<typename T> struct Outer
784 template<typename U> struct Inner {};
787 The template name for `Inner' in `Outer<int>::Inner<float>' is
788 `Outer<int>::Inner<U>'. In g++, we don't instantiate the template
789 levels separately, so there's no TEMPLATE_DECL available for this
790 (there's only `Outer<T>::Inner<U>').
792 In order to get the substitutions right, we create a special
793 TREE_LIST to represent the substitution candidate for a nested
794 template. The TREE_PURPOSE is the tempate's context, fully
795 instantiated, and the TREE_VALUE is the TEMPLATE_DECL for the inner
798 So, for the example above, `Inner' is represented as a substitution
799 candidate by a TREE_LIST whose purpose is `Outer<int>' and whose
800 value is `Outer<T>::Inner<U>'. */
803 write_template_prefix (node)
806 tree decl = DECL_P (node) ? node : TYPE_NAME (node);
807 tree type = DECL_P (node) ? TREE_TYPE (node) : node;
808 tree context = CP_DECL_CONTEXT (decl);
812 MANGLE_TRACE_TREE ("template-prefix", node);
814 /* Find the template decl. */
815 if (DECL_TEMPLATE_ID_P (decl))
816 template = DECL_TI_TEMPLATE (decl);
817 else if (CLASSTYPE_TEMPLATE_ID_P (type))
818 template = CLASSTYPE_TI_TEMPLATE (type);
820 /* Oops, not a template. */
821 my_friendly_abort (20000524);
823 /* Build the substitution candidate TREE_LIST. */
824 substitution = build_tree_list (context, template);
826 if (find_substitution (substitution))
829 write_prefix (context);
830 write_component (decl);
832 add_substitution (substitution);
835 /* <component> ::= <unqualified-name>
839 write_component (decl)
842 MANGLE_TRACE_TREE ("component", decl);
844 switch (TREE_CODE (decl))
852 if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL)
853 write_local_name (CP_DECL_CONTEXT (decl), decl);
855 write_unqualified_name (decl);
859 my_friendly_abort (2000509);
863 /* We don't need to handle thunks, vtables, or VTTs here. Those are
864 mangled through special entry points.
866 <unqualified-name> ::= <operator-name>
871 write_unqualified_name (decl)
874 MANGLE_TRACE_TREE ("unqualified-name", decl);
876 if (DECL_LANG_SPECIFIC (decl) != NULL && DECL_CONSTRUCTOR_P (decl))
877 write_special_name_constructor (decl);
878 else if (DECL_LANG_SPECIFIC (decl) != NULL && DECL_DESTRUCTOR_P (decl))
879 write_special_name_destructor (decl);
880 else if (DECL_CONV_FN_P (decl))
882 /* Conversion operator. Handle it right here.
883 <operator> ::= cv <type> */
885 write_type (TREE_TYPE (DECL_NAME (decl)));
887 else if (DECL_OVERLOADED_OPERATOR_P (decl))
889 operator_name_info_t *oni;
890 if (DECL_ASSIGNMENT_OPERATOR_P (decl))
891 oni = assignment_operator_name_info;
893 oni = operator_name_info;
895 write_string (oni[DECL_OVERLOADED_OPERATOR_P (decl)].mangled_name);
898 write_source_name (DECL_NAME (decl));
901 /* Non-termial <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
903 <source-name> ::= </length/ number> <identifier> */
906 write_source_name (identifier)
909 MANGLE_TRACE_TREE ("source-name", identifier);
911 /* Never write the whole template-id name including the template
912 arguments; we only want the template name. */
913 if (IDENTIFIER_TEMPLATE (identifier))
914 identifier = IDENTIFIER_TEMPLATE (identifier);
916 write_number (IDENTIFIER_LENGTH (identifier), 10);
917 write_identifier (IDENTIFIER_POINTER (identifier));
920 /* Non-terminal <number>.
922 <number> ::= [n] </decimal integer/> */
925 write_number (number, base)
929 static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
948 int digit = number / m;
949 write_char (digits[digit]);
954 my_friendly_assert (number == 0, 20000407);
957 /* Write out an integeral CST in decimal. */
960 write_integer_cst (cst)
963 write_number (tree_low_cst (cst, TREE_UNSIGNED (TREE_TYPE (cst))), 10);
966 /* Non-terminal <identifier>.
968 <identifier> ::= </unqualified source code identifier> */
971 write_identifier (identifier)
974 MANGLE_TRACE ("identifier", identifier);
975 write_string (identifier);
978 /* Handle constructor productions of non-terminal <special-name>.
979 CTOR is a constructor FUNCTION_DECL.
981 <special-name> ::= C1 # complete object constructor
982 ::= C2 # base object constructor
983 ::= C3 # complete object allocating constructor
984 ::= C4 # base object allocating constructor
986 Currently, allocating constructors are never used.
988 We also need to provide unique mangled names (which should never be
989 exported) for the constructor that takes an in-charge parameter,
990 and for a constructor whose name is the same as its class's name.
991 We use "C*INTERNAL*" for these. */
994 write_special_name_constructor (ctor)
997 if (DECL_COMPLETE_CONSTRUCTOR_P (ctor))
999 else if (DECL_BASE_CONSTRUCTOR_P (ctor))
1000 write_string ("C2");
1002 write_string ("C*INTERNAL*");
1005 /* Handle destructor productions of non-terminal <special-name>.
1006 DTOR is a denstructor FUNCTION_DECL.
1008 <special-name> ::= D0 # deleting (in-charge) destructor
1009 ::= D1 # complete object (in-charge) destructor
1010 ::= D2 # base object (not-in-charge) destructor
1012 We also need to provide unique mngled names for old-ABI
1013 destructors, sometimes. These should only be used internally. We
1014 use "D*INTERNAL*" for these. */
1017 write_special_name_destructor (dtor)
1020 if (DECL_DELETING_DESTRUCTOR_P (dtor))
1021 write_string ("D0");
1022 else if (DECL_COMPLETE_DESTRUCTOR_P (dtor))
1023 write_string ("D1");
1024 else if (DECL_BASE_DESTRUCTOR_P (dtor))
1025 write_string ("D2");
1027 /* Old-ABI destructor. */
1028 write_string ("D*INTERNAL*");
1031 /* Return the discriminator for ENTITY appearing inside
1032 FUNCTION. The discriminator is the lexical ordinal of VAR among
1033 entities with the same name in the same FUNCTION. */
1036 discriminator_for_local_entity (entity)
1042 /* Assume this is the only local entity with this name. */
1045 /* For now, we don't discriminate amongst local variables. */
1046 if (TREE_CODE (entity) != TYPE_DECL)
1049 /* Scan the list of local classes. */
1050 entity = TREE_TYPE (entity);
1051 for (type = &VARRAY_TREE (local_classes, 0); *type != entity; ++type)
1052 if (TYPE_IDENTIFIER (*type) == TYPE_IDENTIFIER (entity)
1053 && TYPE_CONTEXT (*type) == TYPE_CONTEXT (entity))
1056 return discriminator;
1059 /* Return the discriminator for STRING, a string literal used inside
1060 FUNCTION. The disciminator is the lexical ordinal of STRING among
1061 string literals used in FUNCTION. */
1064 discriminator_for_string_literal (function, string)
1065 tree function ATTRIBUTE_UNUSED;
1066 tree string ATTRIBUTE_UNUSED;
1068 /* For now, we don't discriminate amongst string literals. */
1072 /* <discriminator> := _ <number>
1074 The discriminator is used only for the second and later occurrences
1075 of the same name within a single function. In this case <number> is
1076 n - 2, if this is the nth occurrence, in lexical order. */
1079 write_discriminator (discriminator)
1082 /* If discriminator is zero, don't write anything. Otherwise... */
1083 if (discriminator > 0)
1086 /* The number is omitted for discriminator == 1. Beyond 1, the
1087 numbering starts at 0. */
1088 if (discriminator > 1)
1089 write_number (discriminator - 2, 10);
1093 /* Mangle the name of a function-scope entity. FUNCTION is the
1094 FUNCTION_DECL for the enclosing function. ENTITY is the decl for
1097 <local-name> := Z <function encoding> E <entity name> [<discriminator>]
1098 := Z <function encoding> E s [<discriminator>] */
1101 write_local_name (function, entity)
1105 MANGLE_TRACE_TREE ("local-name", entity);
1108 write_encoding (function);
1110 if (TREE_CODE (entity) == STRING_CST)
1113 write_discriminator (discriminator_for_string_literal (function,
1118 write_unqualified_name (entity);
1119 write_discriminator (discriminator_for_local_entity (entity));
1123 /* Non-terminals <type> and <CV-qualifier>.
1125 <type> ::= <builtin-type>
1127 ::= <class-enum-type>
1129 ::= <pointer-to-member-type>
1130 ::= <template-param>
1133 ::= P <type> # pointer-to
1134 ::= R <type> # reference-to
1135 ::= C <type> # complex pair (C 2000) [not supported]
1136 ::= G <type> # imaginary (C 2000) [not supported]
1137 ::= U <source-name> <type> # vendor extended type qualifier
1140 TYPE is a type node. */
1146 /* This gets set to non-zero if TYPE turns out to be a (possibly
1147 CV-qualified) builtin type. */
1148 int is_builtin_type = 0;
1150 MANGLE_TRACE_TREE ("type", type);
1152 if (find_substitution (type))
1155 if (write_CV_qualifiers_for_type (type) > 0)
1156 /* If TYPE was CV-qualified, we just wrote the qualifiers; now
1157 mangle the unqualified type. The recursive call is needed here
1158 since both the qualified and uqualified types are substitution
1160 write_type (TYPE_MAIN_VARIANT (type));
1162 switch (TREE_CODE (type))
1166 case INTEGER_TYPE: /* Includes wchar_t. */
1168 /* If this is a typedef, TYPE may not be one of
1169 the standard builtin type nodes, but an alias of one. Use
1170 TYPE_MAIN_VARIANT to get to the underlying builtin type. */
1171 write_builtin_type (TYPE_MAIN_VARIANT (type));
1177 write_type (TREE_TYPE (type));
1182 write_function_type (type, 1);
1188 /* A pointer-to-member function is represented as a special
1189 RECORD_TYPE, so check for this first. */
1190 if (TYPE_PTRMEMFUNC_P (type))
1191 write_pointer_to_member_type (type);
1193 write_class_enum_type (type);
1197 /* We handle TYPENAME_TYPEs like ordinary nested names. */
1198 write_nested_name (TYPE_STUB_DECL (type));
1202 write_array_type (type);
1206 /* A pointer-to-member variable is represented by a POINTER_TYPE
1207 to an OFFSET_TYPE, so check for this first. */
1208 if (TYPE_PTRMEM_P (type))
1209 write_pointer_to_member_type (type);
1213 write_type (TREE_TYPE (type));
1217 case REFERENCE_TYPE:
1219 write_type (TREE_TYPE (type));
1222 case TEMPLATE_TYPE_PARM:
1223 case TEMPLATE_PARM_INDEX:
1224 write_template_param (type);
1227 case TEMPLATE_TEMPLATE_PARM:
1228 write_template_template_param (type);
1229 if (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type))
1231 (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type)));
1235 write_pointer_to_member_type (build_pointer_type (type));
1239 my_friendly_abort (20000409);
1242 /* Types other than builtin types are substitution candidates. */
1243 if (!is_builtin_type)
1244 add_substitution (type);
1247 /* Non-terminal <CV-qualifiers> for type nodes. Returns the number of
1248 CV-qualifiers written for TYPE.
1250 <CV-qualifiers> ::= [r] [V] [K] */
1253 write_CV_qualifiers_for_type (type)
1256 int num_qualifiers = 0;
1258 /* The order is specified by:
1260 "In cases where multiple order-insensitive qualifiers are
1261 present, they should be ordered 'K' (closest to the base type),
1262 'V', 'r', and 'U' (farthest from the base type) ..." */
1264 if (CP_TYPE_RESTRICT_P (type))
1269 if (CP_TYPE_VOLATILE_P (type))
1274 if (CP_TYPE_CONST_P (type))
1280 return num_qualifiers;
1283 /* Non-terminal <builtin-type>.
1285 <builtin-type> ::= v # void
1290 ::= h # unsigned char
1292 ::= t # unsigned short
1294 ::= j # unsigned int
1296 ::= m # unsigned long
1297 ::= x # long long, __int64
1298 ::= y # unsigned long long, __int64
1299 ::= n # __int128 [not supported]
1300 ::= o # unsigned __int128 [not supported]
1303 ::= e # long double, __float80
1304 ::= g # __float128 [not supported] */
1307 write_builtin_type (type)
1310 switch (TREE_CODE (type))
1321 /* If this is size_t, get the underlying int type. */
1322 if (TYPE_IS_SIZETYPE (type))
1323 type = TYPE_DOMAIN (type);
1325 /* TYPE may still be wchar_t, since that isn't in
1326 integer_type_nodes. */
1327 if (type == wchar_type_node)
1332 /* Assume TYPE is one of the shared integer type nodes. Find
1333 it in the array of these nodes. */
1334 for (itk = 0; itk < itk_none; ++itk)
1335 if (type == integer_types[itk])
1337 /* Print the corresponding single-letter code. */
1338 write_char (integer_type_codes[itk]);
1342 if (itk == itk_none)
1343 /* Couldn't find this type. */
1344 my_friendly_abort (20000408);
1349 if (type == float_type_node)
1351 else if (type == double_type_node)
1353 else if (type == long_double_type_node)
1356 my_friendly_abort (20000409);
1360 my_friendly_abort (20000509);
1364 /* Non-terminal <function-type>. NODE is a FUNCTION_TYPE or
1365 METHOD_TYPE. If INCLUDE_RETURN_TYPE is non-zero, the return type
1366 is mangled before the parameter types.
1368 <function-type> ::= F [Y] <bare-function-type> E */
1371 write_function_type (type, include_return_type)
1373 int include_return_type;
1375 MANGLE_TRACE_TREE ("function-type", type);
1378 /* We don't track whether or not a type is `extern "C"'. Note that
1379 you can have an `extern "C"' function that does not have
1380 `extern "C"' type, and vice versa:
1382 extern "C" typedef void function_t();
1383 function_t f; // f has C++ linkage, but its type is
1386 typedef void function_t();
1387 extern "C" function_t f; // Vice versa.
1390 write_bare_function_type (type, include_return_type);
1394 /* Non-terminal <bare-function-type>. NODE is a FUNCTION_DECL or a
1395 METHOD_TYPE. If INCLUDE_RETURN_TYPE is non-zero, the return value
1396 is mangled before the parameter types.
1398 <bare-function-type> ::= </signature/ type>+ */
1401 write_bare_function_type (type, include_return_type_p)
1403 int include_return_type_p;
1405 MANGLE_TRACE_TREE ("bare-function-type", type);
1407 /* Mangle the return type, if requested. */
1408 if (include_return_type_p)
1409 write_type (TREE_TYPE (type));
1411 /* Now mangle the types of the arguments. */
1412 write_method_parms (TYPE_ARG_TYPES (type),
1413 TREE_CODE (type) == METHOD_TYPE);
1416 /* Write the mangled representation of a method parameter list of
1417 types given in PARM_LIST. If METHOD_P is non-zero, the function is
1418 considered a non-static method, and the this parameter is omitted.
1419 If VARARGS_P is non-zero, an additional token designating varargs
1423 write_method_parms (parm_list, method_p)
1428 /* Assume this parameter type list is variable-length. If it ends
1429 with a void type, then it's not. */
1432 /* If this is a member function, skip the first arg, which is the
1434 "Member functions do not encode the type of their implicit this
1437 parm_list = TREE_CHAIN (parm_list);
1439 for (first_parm = parm_list;
1441 parm_list = TREE_CHAIN (parm_list))
1443 tree parm = TREE_VALUE (parm_list);
1445 if (same_type_p (parm, void_type_node))
1447 /* "Empty parameter lists, whether declared as () or
1448 conventionally as (void), are encoded with a void parameter
1450 if (parm_list == first_parm)
1452 /* If the parm list is terminated with a void type, it's
1455 /* A void type better be the last one. */
1456 my_friendly_assert (TREE_CHAIN (parm_list) == NULL, 20000523);
1463 /* <builtin-type> ::= z # ellipsis */
1467 /* <class-enum-type> ::= <name> */
1470 write_class_enum_type (type)
1473 write_name (TYPE_NAME (type));
1476 /* Non-terminal <template-args>. ARGS is a TREE_VEC of template
1479 <template-args> ::= I <template-arg>+ E */
1482 write_template_args (args)
1486 int length = TREE_VEC_LENGTH (args);
1488 MANGLE_TRACE_TREE ("template-args", args);
1490 my_friendly_assert (length > 0, 20000422);
1492 if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
1494 /* We have nested template args. We want the innermost template
1496 args = TREE_VEC_ELT (args, length - 1);
1497 length = TREE_VEC_LENGTH (args);
1501 for (i = 0; i < length; ++i)
1502 write_template_arg (TREE_VEC_ELT (args, i));
1506 /* <expression> ::= <unary operator-name> <expression>
1507 ::= <binary operator-name> <expression> <expression>
1510 <expr-primary> ::= <template-param>
1511 ::= L <type> <value number> E # literal
1512 ::= L <mangled-name> E # external name */
1515 write_expression (expr)
1518 enum tree_code code;
1520 code = TREE_CODE (expr);
1522 /* Handle pointers-to-members by making them look like expression
1524 if (code == PTRMEM_CST)
1526 expr = build_nt (ADDR_EXPR,
1527 build_nt (SCOPE_REF,
1528 PTRMEM_CST_CLASS (expr),
1529 PTRMEM_CST_MEMBER (expr)));
1530 code = TREE_CODE (expr);
1533 /* Handle template parameters. */
1534 if (code == TEMPLATE_TYPE_PARM
1535 || code == TEMPLATE_TEMPLATE_PARM
1536 || code == TEMPLATE_PARM_INDEX)
1537 write_template_param (expr);
1538 /* Handle literals. */
1539 else if (TREE_CODE_CLASS (code) == 'c')
1540 write_template_arg_literal (expr);
1541 else if (DECL_P (expr))
1544 write_mangled_name (expr);
1551 /* Skip NOP_EXPRs. They can occur when (say) a pointer argument
1552 is converted (via qualification conversions) to another
1554 while (TREE_CODE (expr) == NOP_EXPR)
1556 expr = TREE_OPERAND (expr, 0);
1557 code = TREE_CODE (expr);
1560 /* When we bind a variable or function to a non-type template
1561 argument with reference type, we create an ADDR_EXPR to show
1562 the fact that the entity's address has been taken. But, we
1563 don't actually want to output a mangling code for the `&'. */
1564 if (TREE_CODE (expr) == ADDR_EXPR
1566 && TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE)
1567 expr = TREE_OPERAND (expr, 0);
1569 /* If it wasn't any of those, recursively expand the expression. */
1570 write_string (operator_name_info[(int) code].mangled_name);
1572 /* Handle pointers-to-members specially. */
1573 if (code == SCOPE_REF)
1575 write_type (TREE_OPERAND (expr, 0));
1576 if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE)
1577 write_source_name (TREE_OPERAND (expr, 1));
1579 write_encoding (TREE_OPERAND (expr, 1));
1582 for (i = 0; i < TREE_CODE_LENGTH (code); ++i)
1583 write_expression (TREE_OPERAND (expr, i));
1587 /* Literal subcase of non-terminal <template-arg>.
1589 "Literal arguments, e.g. "A<42L>", are encoded with their type
1590 and value. Negative integer values are preceded with "n"; for
1591 example, "A<-42L>" becomes "1AILln42EE". The bool value false is
1592 encoded as 0, true as 1. If floating-point arguments are accepted
1593 as an extension, their values should be encoded using a
1594 fixed-length lowercase hexadecimal string corresponding to the
1595 internal representation (IEEE on IA-64), high-order bytes first,
1596 without leading zeroes. For example: "Lfbff000000E" is -1.0f." */
1599 write_template_arg_literal (value)
1602 tree type = TREE_TYPE (value);
1606 if (TREE_CODE (value) == CONST_DECL)
1607 write_integer_cst (DECL_INITIAL (value));
1608 else if (TREE_CODE (value) == INTEGER_CST)
1610 if (same_type_p (type, boolean_type_node))
1612 if (value == boolean_false_node || integer_zerop (value))
1613 write_number (0, 10);
1614 else if (value == boolean_true_node)
1615 write_number (1, 10);
1617 my_friendly_abort (20000412);
1620 write_integer_cst (value);
1622 else if (TREE_CODE (value) == REAL_CST)
1624 #ifdef CROSS_COMPILE
1625 static int explained;
1629 sorry ("real-valued template parameters when cross-compiling");
1634 for (i = 0; i < sizeof (TREE_REAL_CST (value)); ++i)
1635 write_number (((unsigned char *)
1636 &TREE_REAL_CST (value))[i], 16);
1640 my_friendly_abort (20000412);
1645 /* Non-terminal <tempalate-arg>.
1647 <template-arg> ::= <type> # type
1648 ::= L <type> </value/ number> E # literal
1649 ::= LZ <name> E # external name
1650 ::= X <expression> E # expression */
1653 write_template_arg (node)
1656 enum tree_code code = TREE_CODE (node);
1658 MANGLE_TRACE_TREE ("template-arg", node);
1660 /* A template template paramter's argument list contains TREE_LIST
1661 nodes of which the value field is the the actual argument. */
1662 if (code == TREE_LIST)
1664 node = TREE_VALUE (node);
1665 /* If it's a decl, deal with its type instead. */
1668 node = TREE_TYPE (node);
1669 code = TREE_CODE (node);
1675 else if (code == TEMPLATE_DECL)
1676 /* A template appearing as a template arg is a template template arg. */
1677 write_template_template_arg (node);
1678 else if (DECL_P (node))
1682 write_encoding (node);
1685 else if (TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
1686 write_template_arg_literal (node);
1689 /* Template arguments may be expressions. */
1691 write_expression (node);
1696 /* <template-template-arg>
1698 ::= <substitution> */
1701 write_template_template_arg (tree decl)
1703 MANGLE_TRACE_TREE ("template-template-arg", decl);
1705 if (find_substitution (decl))
1708 add_substitution (decl);
1712 /* Non-terminal <array-type>. TYPE is an ARRAY_TYPE.
1714 <array-type> ::= A [</dimension/ number>] _ </element/ type>
1716 "Array types encode the dimension (number of elements) and the
1717 element type. For variable length arrays, the dimension (but not
1718 the '_' separator) is omitted." */
1721 write_array_type (type)
1725 if (TYPE_DOMAIN (type))
1730 index_type = TYPE_DOMAIN (type);
1731 /* The INDEX_TYPE gives the upper and lower bounds of the
1733 max = TYPE_MAX_VALUE (index_type);
1734 if (TREE_CODE (max) == INTEGER_CST)
1735 write_number (TREE_INT_CST_LOW (max) + 1, 10);
1737 write_expression (TREE_OPERAND (max, 0));
1740 write_type (TREE_TYPE (type));
1743 /* Non-terminal <pointer-to-member-type> for pointer-to-member
1744 variables. TYPE is a pointer-to-member POINTER_TYPE.
1746 <pointer-to-member-type> ::= M </class/ type> </member/ type> */
1749 write_pointer_to_member_type (type)
1753 write_type (TYPE_PTRMEM_CLASS_TYPE (type));
1754 write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
1757 /* Non-terminal <template-param>. PARM is a TEMPLATE_TYPE_PARM,
1758 TEMPLATE_TEMPLATE_PARM, or a TEMPLATE_PARM_INDEX.
1760 <template-param> ::= T </parameter/ number> _ */
1763 write_template_param (parm)
1768 MANGLE_TRACE_TREE ("template-parm", parm);
1770 switch (TREE_CODE (parm))
1772 case TEMPLATE_TYPE_PARM:
1773 case TEMPLATE_TEMPLATE_PARM:
1774 parm_index = TEMPLATE_TYPE_IDX (parm);
1777 case TEMPLATE_PARM_INDEX:
1778 parm_index = TEMPLATE_PARM_IDX (parm);
1782 my_friendly_abort (20000523);
1786 /* NUMBER as it appears in the mangling is (-1)-indexed, with the
1787 earliest template param denoted by `_'. */
1789 write_number (parm_index - 1, 10);
1793 /* <template-template-param>
1794 ::= <template-param>
1795 ::= <substitution> */
1798 write_template_template_param (parm)
1801 tree template = NULL_TREE;
1803 /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the
1804 template template parameter. The substitution candidate here is
1805 only the template. */
1806 if (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm))
1809 = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
1810 if (find_substitution (template))
1814 /* <template-param> encodes only the template parameter position,
1815 not its template arguments, which is fine here. */
1816 write_template_param (parm);
1818 add_substitution (template);
1821 /* Non-terminal <substitution>.
1823 <substitution> ::= S <seq-id> _
1827 write_substitution (seq_id)
1830 MANGLE_TRACE ("substitution", "");
1834 write_number (seq_id - 1, 36);
1838 /* Start mangling a new name or type. */
1843 obstack_free (&G.name_obstack, obstack_base (&G.name_obstack));
1846 /* Done with mangling. Return the generated mangled name. */
1848 static inline const char *
1851 /* Clear all the substitutions. */
1852 VARRAY_POP_ALL (G.substitutions);
1854 /* Null-terminate the string. */
1857 return (const char *) obstack_base (&G.name_obstack);
1860 /* Initialize data structures for mangling. */
1865 gcc_obstack_init (&G.name_obstack);
1866 VARRAY_TREE_INIT (G.substitutions, 1, "mangling substitutions");
1868 /* Cache these identifiers for quick comparison when checking for
1869 standard substitutions. */
1870 subst_identifiers[SUBID_ALLOCATOR] = get_identifier ("allocator");
1871 subst_identifiers[SUBID_BASIC_STRING] = get_identifier ("basic_string");
1872 subst_identifiers[SUBID_CHAR_TRAITS] = get_identifier ("char_traits");
1873 subst_identifiers[SUBID_BASIC_ISTREAM] = get_identifier ("basic_istream");
1874 subst_identifiers[SUBID_BASIC_OSTREAM] = get_identifier ("basic_ostream");
1875 subst_identifiers[SUBID_BASIC_IOSTREAM] = get_identifier ("basic_iostream");
1878 /* Generate the mangled name of DECL. */
1881 mangle_decl_string (decl)
1888 if (TREE_CODE (decl) == TYPE_DECL)
1889 write_type (TREE_TYPE (decl));
1891 write_mangled_name (decl);
1893 result = finish_mangling ();
1895 fprintf (stderr, "mangle_decl_string = '%s'\n\n", result);
1899 /* Create an identifier for the external mangled name of DECL. */
1905 return get_identifier (mangle_decl_string (decl));
1908 /* Generate the mangled representation of TYPE. */
1911 mangle_type_string (type)
1918 result = finish_mangling ();
1920 fprintf (stderr, "mangle_type_string = '%s'\n\n", result);
1924 /* Create an identifier for the mangled representation of TYPE. */
1930 return get_identifier (mangle_type_string (type));
1933 /* Create an identifier for the mangled name of a special component
1934 for belonging to TYPE. CODE is the ABI-specified code for this
1938 mangle_special_for_type (type, code)
1944 /* We don't have an actual decl here for the special component, so
1945 we can't just process the <encoded-name>. Instead, fake it. */
1948 /* Start the mangling. */
1949 write_string ("_Z");
1950 write_string (code);
1954 result = finish_mangling ();
1957 fprintf (stderr, "mangle_special_for_type = %s\n\n", result);
1959 return get_identifier (result);
1962 /* Create an identifier for the mangled representation of the typeinfo
1963 structure for TYPE. */
1966 mangle_typeinfo_for_type (type)
1969 return mangle_special_for_type (type, "TI");
1972 /* Create an identifier for the mangled name of the NTBS containing
1973 the mangled name of TYPE. */
1976 mangle_typeinfo_string_for_type (type)
1979 return mangle_special_for_type (type, "TS");
1982 /* Create an identifier for the mangled name of the vtable for TYPE. */
1985 mangle_vtbl_for_type (type)
1988 return mangle_special_for_type (type, "TV");
1991 /* Returns an identifier for the mangled name of the VTT for TYPE. */
1994 mangle_vtt_for_type (type)
1997 return mangle_special_for_type (type, "TT");
2000 /* Return an identifier for a construction vtable group. TYPE is
2001 the most derived class in the hierarchy; BINFO is the base
2002 subobject for which this construction vtable group will be used.
2004 This mangling isn't part of the ABI specification; in the ABI
2005 specification, the vtable group is dumped in the same COMDAT as the
2006 main vtable, and is referenced only from that vtable, so it doesn't
2007 need an external name. For binary formats without COMDAT sections,
2008 though, we need external names for the vtable groups.
2010 We use the production
2012 <special-name> ::= CT <type> <offset number> _ <base type> */
2015 mangle_ctor_vtbl_for_type (type, binfo)
2023 write_string ("_Z");
2024 write_string ("TC");
2026 write_integer_cst (BINFO_OFFSET (binfo));
2028 write_type (BINFO_TYPE (binfo));
2030 result = finish_mangling ();
2032 fprintf (stderr, "mangle_ctor_vtbl_for_type = %s\n\n", result);
2033 return get_identifier (result);
2036 /* Return an identifier for the mangled name of a thunk to FN_DECL.
2037 OFFSET is the initial adjustment to this used to find the vptr. If
2038 VCALL_OFFSET is non-zero, this is a virtual thunk, and it is the
2039 vtbl offset in bytes.
2041 <special-name> ::= Th <offset number> _ <base encoding>
2042 ::= Tv <offset number> _ <vcall offset number> _
2047 mangle_thunk (fn_decl, offset, vcall_offset)
2056 write_string ("_Z");
2057 /* The <special-name> for virtual thunks is Tv, for non-virtual
2060 if (vcall_offset != 0)
2065 /* For either flavor, write the offset to this. */
2066 write_number (offset, 10);
2069 /* For a virtual thunk, add the vcall offset. */
2070 if (vcall_offset != 0)
2072 /* Virtual thunk. Write the vcall offset and base type name. */
2073 write_number (vcall_offset, 10);
2078 write_encoding (fn_decl);
2080 result = finish_mangling ();
2082 fprintf (stderr, "mangle_thunk = %s\n\n", result);
2083 return get_identifier (result);
2086 /* Return an identifier for the mangled unqualified name for a
2087 conversion operator to TYPE. This mangling is not specified by the
2088 ABI spec; it is only used internally.
2090 For compatibility with existing conversion operator mechanisms,
2091 the mangled form is `__op<type>' where <type> is the mangled
2092 representation of TYPE.
2094 FIXME: Though identifiers with starting with __op are reserved for
2095 the implementation, it would eventually be nice to use inaccessible
2096 names for these operators. */
2099 mangle_conv_op_name_for_type (type)
2104 /* Build the mangling for TYPE. */
2105 const char *mangled_type = mangle_type_string (type);
2106 /* Allocate a temporary buffer for the complete name. */
2107 char *op_name = (char *) xmalloc (strlen (OPERATOR_TYPENAME_FORMAT)
2108 + strlen (mangled_type) + 1);
2109 /* Assemble the mangling. */
2110 strcpy (op_name, OPERATOR_TYPENAME_FORMAT);
2111 strcat (op_name, mangled_type);
2112 /* Find or create an identifier. */
2113 identifier = get_identifier (op_name);
2114 /* Done with the temporary buffer. */
2116 /* Set bits on the identifier so we know later it's a conversion. */
2117 IDENTIFIER_OPNAME_P (identifier) = 1;
2118 IDENTIFIER_TYPENAME_P (identifier) = 1;
2119 /* Hang TYPE off the identifier so it can be found easily later when
2120 performing conversions. */
2121 TREE_TYPE (identifier) = type;
2126 /* Return an identifier for the name of an initialization guard
2127 variable for indicated VARIABLE. */
2130 mangle_guard_variable (variable)
2134 write_string ("_ZGV");
2135 write_name (variable);
2136 return get_identifier (finish_mangling ());