1 /* Name mangling for the 3.0 -*- C++ -*- ABI.
2 Copyright (C) 2000-2024 Free Software Foundation, Inc.
3 Written by Alex Samuel <samuel@codesourcery.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This file implements mangling of C++ names according to the IA64
22 C++ ABI specification. A mangled name encodes a function or
23 variable's name, scope, type, and/or template arguments into a text
24 identifier. This identifier is used as the function's or
25 variable's linkage name, to preserve compatibility between C++'s
26 language features (templates, scoping, and overloading) and C
29 Additionally, g++ uses mangled names internally. To support this,
30 mangling of types is allowed, even though the mangled name of a
31 type should not appear by itself as an exported name. Ditto for
32 uninstantiated templates.
34 The primary entry point for this module is mangle_decl, which
35 returns an identifier containing the mangled name for a decl.
36 Additional entry points are provided to build mangled names of
37 particular constructs when the appropriate decl for that construct
38 is not available. These are:
40 mangle_typeinfo_for_type: typeinfo data
41 mangle_typeinfo_string_for_type: typeinfo type name
42 mangle_vtbl_for_type: virtual table data
43 mangle_vtt_for_type: VTT data
44 mangle_ctor_vtbl_for_type: `C-in-B' constructor virtual table data
45 mangle_thunk: thunk function or entry */
49 #include "coretypes.h"
51 #include "vtable-verify.h"
53 #include "stringpool.h"
55 #include "stor-layout.h"
59 /* Debugging support. */
61 /* Define DEBUG_MANGLE to enable very verbose trace messages. */
63 #define DEBUG_MANGLE 0
66 /* Macros for tracing the write_* functions. */
68 # define MANGLE_TRACE(FN, INPUT) \
69 fprintf (stderr, " %-24s: %-24s\n", (FN), (INPUT))
70 # define MANGLE_TRACE_TREE(FN, NODE) \
71 fprintf (stderr, " %-24s: %-24s (%p)\n", \
72 (FN), get_tree_code_name (TREE_CODE (NODE)), (void *) (NODE))
74 # define MANGLE_TRACE(FN, INPUT)
75 # define MANGLE_TRACE_TREE(FN, NODE)
78 /* Nonzero if NODE is a class template-id. We can't rely on
79 CLASSTYPE_USE_TEMPLATE here because of tricky bugs in the parser
80 that hard to distinguish A<T> from A, where A<T> is the type as
81 instantiated outside of the template, and A is the type used
82 without parameters inside the template. */
83 #define CLASSTYPE_TEMPLATE_ID_P(NODE) \
84 (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \
85 || (CLASS_TYPE_P (NODE) \
86 && CLASSTYPE_TEMPLATE_INFO (NODE) != NULL \
87 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))
89 /* For deciding whether to set G.need_abi_warning, we need to consider both
90 warn_abi_version and flag_abi_compat_version. */
91 #define abi_warn_or_compat_version_crosses(N) \
92 (abi_version_crosses (N) || abi_compat_version_crosses (N))
94 /* And sometimes we can simplify the code path if we don't need to worry about
96 #define abi_flag_at_least(flag,N) (flag == 0 || flag >= N)
97 #define any_abi_below(N) \
98 (!abi_version_at_least (N) \
99 || !abi_flag_at_least (warn_abi_version, (N)) \
100 || !abi_flag_at_least (flag_abi_compat_version, (N)))
102 /* Things we only need one of. This module is not reentrant. */
103 struct GTY(()) globals
{
104 /* An array of the current substitution candidates, in the order
105 we've seen them. Contains NULLS, which correspond to module
107 vec
<tree
, va_gc
> *substitutions
;
109 /* The entity that is being mangled. */
110 tree
GTY ((skip
)) entity
;
112 /* How many parameter scopes we are inside. */
115 /* True if the mangling will be different in a future version of the
117 bool need_abi_warning
;
119 /* True if the mangling will be different in C++17 mode. */
120 bool need_cxx17_warning
;
122 /* True if we mangled a module name. */
126 static GTY (()) globals G
;
128 /* The obstack on which we build mangled names. */
129 static struct obstack
*mangle_obstack
;
131 /* The obstack on which we build mangled names that are not going to
132 be IDENTIFIER_NODEs. */
133 static struct obstack name_obstack
;
135 /* The first object on the name_obstack; we use this to free memory
136 allocated on the name_obstack. */
137 static void *name_base
;
139 /* Indices into subst_identifiers. These are identifiers used in
140 special substitution rules. */
148 SUBID_BASIC_IOSTREAM
,
151 substitution_identifier_index_t
;
153 /* For quick substitution checks, look up these common identifiers
155 static GTY(()) tree subst_identifiers
[SUBID_MAX
];
157 /* Single-letter codes for builtin integer types, defined in
158 <builtin-type>. These are indexed by integer_type_kind values. */
160 integer_type_codes
[itk_none
] =
163 'a', /* itk_signed_char */
164 'h', /* itk_unsigned_char */
166 't', /* itk_unsigned_short */
168 'j', /* itk_unsigned_int */
170 'm', /* itk_unsigned_long */
171 'x', /* itk_long_long */
172 'y', /* itk_unsigned_long_long */
173 /* __intN types are handled separately */
174 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
177 static tree
maybe_template_info (const tree
);
179 /* Functions for handling substitutions. */
181 static inline tree
canonicalize_for_substitution (tree
);
182 static void add_substitution (tree
);
183 static inline bool is_std_substitution (const tree
,
184 const substitution_identifier_index_t
);
185 static inline bool is_std_substitution_char (const tree
,
186 const substitution_identifier_index_t
);
187 static int find_substitution (tree
);
188 static void mangle_call_offset (const tree
, const tree
);
190 /* Functions for emitting mangled representations of things. */
192 static void write_mangled_name (const tree
, bool);
193 static void write_encoding (const tree
);
194 static void write_name (tree
, const int);
195 static void write_abi_tags (tree
);
196 static void write_unscoped_name (const tree
);
197 static void write_unscoped_template_name (const tree
);
198 static void write_nested_name (const tree
);
199 static void write_prefix (const tree
);
200 static void write_template_prefix (const tree
);
201 static void write_unqualified_name (tree
);
202 static void write_conversion_operator_name (const tree
);
203 static void write_source_name (tree
);
204 static void write_literal_operator_name (tree
);
205 static void write_unnamed_type_name (const tree
);
206 static void write_closure_type_name (const tree
);
207 static int hwint_to_ascii (unsigned HOST_WIDE_INT
, const unsigned int, char *,
209 static void write_number (unsigned HOST_WIDE_INT
, const int,
211 static void write_compact_number (int num
);
212 static void write_integer_cst (const tree
);
213 static void write_real_cst (const tree
);
214 static void write_identifier (const char *);
215 static void write_special_name_constructor (const tree
);
216 static void write_special_name_destructor (const tree
);
217 static void write_type (tree
);
218 static int write_CV_qualifiers_for_type (const tree
);
219 static void write_builtin_type (tree
);
220 static void write_function_type (const tree
);
221 static void write_bare_function_type (const tree
, const int, const tree
);
222 static void write_method_parms (tree
, const int, const tree
);
223 static void write_class_enum_type (const tree
);
224 static void write_template_args (tree
, tree
= NULL_TREE
);
225 static void write_expression (tree
);
226 static void write_template_arg_literal (const tree
);
227 static void write_template_arg (tree
);
228 static void write_template_template_arg (const tree
);
229 static void write_array_type (const tree
);
230 static void write_pointer_to_member_type (const tree
);
231 static void write_template_param (const tree
);
232 static void write_template_template_param (const tree
);
233 static void write_substitution (const int);
234 static int discriminator_for_local_entity (tree
);
235 static int discriminator_for_string_literal (tree
, tree
);
236 static void write_discriminator (const int);
237 static void write_local_name (tree
, const tree
, const tree
);
238 static void dump_substitution_candidates (void);
239 static tree
mangle_decl_string (const tree
);
240 static void maybe_check_abi_tags (tree
, tree
= NULL_TREE
, int = 10);
241 static bool equal_abi_tags (tree
, tree
);
243 /* Control functions. */
245 static inline void start_mangling (const tree
);
246 static tree
mangle_special_for_type (const tree
, const char *);
248 /* Append a single character to the end of the mangled
250 #define write_char(CHAR) \
251 obstack_1grow (mangle_obstack, (CHAR))
253 /* Append a sized buffer to the end of the mangled representation. */
254 #define write_chars(CHAR, LEN) \
255 obstack_grow (mangle_obstack, (CHAR), (LEN))
257 /* Append a NUL-terminated string to the end of the mangled
259 #define write_string(STRING) \
260 obstack_grow (mangle_obstack, (STRING), strlen (STRING))
262 /* Nonzero if NODE1 and NODE2 are both TREE_LIST nodes and have the
263 same purpose (context, which may be a type) and value (template
264 decl). See write_template_prefix for more information on what this
266 #define NESTED_TEMPLATE_MATCH(NODE1, NODE2) \
267 (TREE_CODE (NODE1) == TREE_LIST \
268 && TREE_CODE (NODE2) == TREE_LIST \
269 && ((TYPE_P (TREE_PURPOSE (NODE1)) \
270 && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2))) \
271 || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2)) \
272 && TREE_VALUE (NODE1) == TREE_VALUE (NODE2))
274 /* Write out an unsigned quantity in base 10. */
275 #define write_unsigned_number(NUMBER) \
276 write_number ((NUMBER), /*unsigned_p=*/1, 10)
278 /* Check for -fabi-version dependent mangling and also set the need_abi_warning
279 flag as appropriate. */
284 if (abi_warn_or_compat_version_crosses (ver
))
285 G
.need_abi_warning
= true;
286 return abi_version_at_least (ver
);
289 /* If DECL is a template instance (including the uninstantiated template
290 itself), return its TEMPLATE_INFO. Otherwise return NULL. */
293 maybe_template_info (const tree decl
)
295 if (TREE_CODE (decl
) == TYPE_DECL
)
297 /* TYPE_DECLs are handled specially. Look at its type to decide
298 if this is a template instantiation. */
299 const tree type
= TREE_TYPE (decl
);
301 if (CLASS_TYPE_P (type
) && CLASSTYPE_TEMPLATE_ID_P (type
))
302 return TYPE_TEMPLATE_INFO (type
);
306 /* Check if the template is a primary template. */
307 if (DECL_LANG_SPECIFIC (decl
) != NULL
308 && VAR_OR_FUNCTION_DECL_P (decl
)
309 && DECL_TEMPLATE_INFO (decl
)
310 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl
)))
311 return DECL_TEMPLATE_INFO (decl
);
314 /* It's not a template id. */
318 /* Produce debugging output of current substitution candidates. */
321 dump_substitution_candidates (void)
326 fprintf (stderr
, " ++ substitutions ");
327 FOR_EACH_VEC_ELT (*G
.substitutions
, i
, el
)
329 const char *name
= "???";
332 fprintf (stderr
, " ");
335 else if (DECL_P (el
))
336 name
= IDENTIFIER_POINTER (DECL_NAME (el
));
337 else if (TREE_CODE (el
) == TREE_LIST
)
338 name
= IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el
)));
339 else if (TYPE_NAME (el
))
340 name
= TYPE_NAME_STRING (el
);
341 fprintf (stderr
, " S%d_ = ", i
- 1);
345 (CP_TYPE_RESTRICT_P (el
)
346 || CP_TYPE_VOLATILE_P (el
)
347 || CP_TYPE_CONST_P (el
)))
348 fprintf (stderr
, "CV-");
349 fprintf (stderr
, "%s (%s at %p)",
350 name
, get_tree_code_name (TREE_CODE (el
)), (void *) el
);
352 fprintf (stderr
, "\n");
356 /* <exception-spec> ::=
357 Do -- non-throwing exception specification
358 DO <expression> E -- computed (instantiation-dependent) noexcept
359 Dw <type>* E -- throw (types) */
362 write_exception_spec (tree spec
)
365 if (!spec
|| spec
== noexcept_false_spec
)
369 if (!flag_noexcept_type
)
371 G
.need_cxx17_warning
= true;
375 if (spec
== noexcept_true_spec
|| spec
== empty_except_spec
)
377 else if (tree expr
= TREE_PURPOSE (spec
))
379 /* noexcept (expr) */
380 gcc_assert (uses_template_parms (expr
));
382 write_expression (expr
);
387 /* throw (type-list) */
389 for (tree t
= spec
; t
; t
= TREE_CHAIN (t
))
390 write_type (TREE_VALUE (t
));
395 /* Both decls and types can be substitution candidates, but sometimes
396 they refer to the same thing. For instance, a TYPE_DECL and
397 RECORD_TYPE for the same class refer to the same thing, and should
398 be treated accordingly in substitutions. This function returns a
399 canonicalized tree node representing NODE that is used when adding
400 and substitution candidates and finding matches. */
403 canonicalize_for_substitution (tree node
)
405 /* For a TYPE_DECL, use the type instead. */
406 if (TREE_CODE (node
) == TYPE_DECL
)
407 node
= TREE_TYPE (node
);
409 && TYPE_CANONICAL (node
) != node
410 && TYPE_MAIN_VARIANT (node
) != node
)
413 /* Here we want to strip the topmost typedef only.
414 We need to do that so is_std_substitution can do proper
416 if (TREE_CODE (node
) == FUNCTION_TYPE
)
417 /* Use build_qualified_type and TYPE_QUALS here to preserve
418 the old buggy mangling of attribute noreturn with abi<5. */
419 node
= build_qualified_type (TYPE_MAIN_VARIANT (node
),
422 node
= cp_build_qualified_type (TYPE_MAIN_VARIANT (node
),
423 cp_type_quals (node
));
424 if (FUNC_OR_METHOD_TYPE_P (node
))
426 node
= build_ref_qualified_type (node
, type_memfn_rqual (orig
));
427 tree r
= canonical_eh_spec (TYPE_RAISES_EXCEPTIONS (orig
));
428 if (flag_noexcept_type
)
429 node
= build_exception_variant (node
, r
);
431 /* Set the warning flag if appropriate. */
432 write_exception_spec (r
);
438 /* Add NODE as a substitution candidate. NODE must not already be on
439 the list of candidates. */
442 add_substitution (tree node
)
447 fprintf (stderr
, " ++ add_substitution (%s at %10p)\n",
448 get_tree_code_name (TREE_CODE (node
)), (void *) node
);
450 /* Get the canonicalized substitution candidate for NODE. */
451 c
= canonicalize_for_substitution (node
);
452 if (DEBUG_MANGLE
&& c
!= node
)
453 fprintf (stderr
, " ++ using candidate (%s at %10p)\n",
454 get_tree_code_name (TREE_CODE (node
)), (void *) node
);
457 /* Make sure NODE isn't already a candidate. */
463 FOR_EACH_VEC_SAFE_ELT (G
.substitutions
, i
, candidate
)
466 gcc_assert (!(DECL_P (node
) && node
== candidate
));
467 gcc_assert (!(TYPE_P (node
) && TYPE_P (candidate
)
468 && same_type_p (node
, candidate
)));
472 /* Put the decl onto the varray of substitution candidates. */
473 vec_safe_push (G
.substitutions
, node
);
476 dump_substitution_candidates ();
479 /* Helper function for find_substitution. Returns nonzero if NODE,
480 which may be a decl or a CLASS_TYPE, is a template-id with template
481 name of substitution_index[INDEX] in the ::std namespace, with
482 global module attachment. */
485 is_std_substitution (const tree node
,
486 const substitution_identifier_index_t index
)
493 type
= TREE_TYPE (node
);
496 else if (CLASS_TYPE_P (node
))
499 decl
= TYPE_NAME (node
);
502 /* These are not the droids you're looking for. */
505 if (!DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl
)))
508 if (!(TYPE_LANG_SPECIFIC (type
) && TYPE_TEMPLATE_INFO (type
)))
511 tree tmpl
= TYPE_TI_TEMPLATE (type
);
512 if (DECL_NAME (tmpl
) != subst_identifiers
[index
])
515 if (modules_p () && get_originating_module (tmpl
, true) >= 0)
521 /* Return the ABI tags (the TREE_VALUE of the "abi_tag" attribute entry) for T,
522 which can be a decl or type. */
525 get_abi_tags (tree t
)
527 if (!t
|| TREE_CODE (t
) == NAMESPACE_DECL
)
530 if (DECL_P (t
) && DECL_DECLARES_TYPE_P (t
))
533 if (TREE_CODE (t
) == TEMPLATE_DECL
&& DECL_TEMPLATE_RESULT (t
))
535 tree tags
= get_abi_tags (DECL_TEMPLATE_RESULT (t
));
536 /* We used to overlook abi_tag on function and variable templates. */
537 if (tags
&& abi_check (19))
545 attrs
= TYPE_ATTRIBUTES (t
);
547 attrs
= DECL_ATTRIBUTES (t
);
549 tree tags
= lookup_attribute ("abi_tag", attrs
);
551 tags
= TREE_VALUE (tags
);
555 /* Helper function for find_substitution. Returns nonzero if NODE,
556 which may be a decl or a CLASS_TYPE, is the template-id
557 ::std::identifier<char>, where identifier is
558 substitution_index[INDEX]. */
561 is_std_substitution_char (const tree node
,
562 const substitution_identifier_index_t index
)
565 /* Check NODE's name is ::std::identifier. */
566 if (!is_std_substitution (node
, index
))
568 /* Figure out its template args. */
570 args
= DECL_TI_ARGS (node
);
571 else if (CLASS_TYPE_P (node
))
572 args
= CLASSTYPE_TI_ARGS (node
);
574 /* Oops, not a template. */
576 /* NODE's template arg list should be <char>. */
578 TREE_VEC_LENGTH (args
) == 1
579 && TREE_VEC_ELT (args
, 0) == char_type_node
;
582 /* Check whether a substitution should be used to represent NODE in
585 First, check standard special-case substitutions.
587 <substitution> ::= St
594 # ::std::basic_string
597 # ::std::basic_string<char,
598 ::std::char_traits<char>,
599 ::std::allocator<char> >
602 # ::std::basic_istream<char, ::std::char_traits<char> >
605 # ::std::basic_ostream<char, ::std::char_traits<char> >
608 # ::std::basic_iostream<char, ::std::char_traits<char> >
610 Then examine the stack of currently available substitution
611 candidates for entities appearing earlier in the same mangling
613 If a substitution is found, write its mangled representation and
614 return nonzero. If none is found, just return zero. */
617 find_substitution (tree node
)
620 const int size
= vec_safe_length (G
.substitutions
);
623 const char *abbr
= NULL
;
626 fprintf (stderr
, " ++ find_substitution (%s at %p)\n",
627 get_tree_code_name (TREE_CODE (node
)), (void *) node
);
629 /* Obtain the canonicalized substitution representation for NODE.
630 This is what we'll compare against. */
631 node
= canonicalize_for_substitution (node
);
633 /* Check for builtin substitutions. */
635 decl
= TYPE_P (node
) ? TYPE_NAME (node
) : node
;
636 type
= TYPE_P (node
) ? node
: TREE_TYPE (node
);
638 /* Check for std::allocator. */
640 && is_std_substitution (decl
, SUBID_ALLOCATOR
)
641 && !CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl
)))
644 /* Check for std::basic_string. */
645 else if (decl
&& is_std_substitution (decl
, SUBID_BASIC_STRING
))
649 /* If this is a type (i.e. a fully-qualified template-id),
651 std::basic_string <char,
652 std::char_traits<char>,
653 std::allocator<char> > . */
654 if (cp_type_quals (type
) == TYPE_UNQUALIFIED
655 && CLASSTYPE_USE_TEMPLATE (type
))
657 tree args
= CLASSTYPE_TI_ARGS (type
);
658 if (TREE_VEC_LENGTH (args
) == 3
659 && template_args_equal (TREE_VEC_ELT (args
, 0), char_type_node
)
660 && is_std_substitution_char (TREE_VEC_ELT (args
, 1),
662 && is_std_substitution_char (TREE_VEC_ELT (args
, 2),
668 /* Substitute for the template name only if this isn't a type. */
672 /* Check for basic_{i,o,io}stream. */
673 else if (TYPE_P (node
)
674 && cp_type_quals (type
) == TYPE_UNQUALIFIED
675 && CLASS_TYPE_P (type
)
676 && CLASSTYPE_USE_TEMPLATE (type
)
677 && CLASSTYPE_TEMPLATE_INFO (type
) != NULL
)
679 /* First, check for the template
680 args <char, std::char_traits<char> > . */
681 tree args
= CLASSTYPE_TI_ARGS (type
);
682 if (TREE_VEC_LENGTH (args
) == 2
683 && template_args_equal (TREE_VEC_ELT (args
, 0), char_type_node
)
684 && is_std_substitution_char (TREE_VEC_ELT (args
, 1),
687 /* Got them. Is this basic_istream? */
688 if (is_std_substitution (decl
, SUBID_BASIC_ISTREAM
))
690 /* Or basic_ostream? */
691 else if (is_std_substitution (decl
, SUBID_BASIC_OSTREAM
))
693 /* Or basic_iostream? */
694 else if (is_std_substitution (decl
, SUBID_BASIC_IOSTREAM
))
699 /* Check for namespace std. */
700 else if (decl
&& DECL_NAMESPACE_STD_P (decl
))
706 tree tags
= NULL_TREE
;
707 if (OVERLOAD_TYPE_P (node
) || DECL_CLASS_TEMPLATE_P (node
))
708 tags
= get_abi_tags (type
);
709 /* Now check the list of available substitutions for this mangling
712 for (i
= 0; i
< size
; ++i
)
713 if (tree candidate
= (*G
.substitutions
)[i
])
715 /* NODE is a matched to a candidate if it's the same decl node or
716 if it's the same type. */
717 if (decl
== candidate
718 || (TYPE_P (candidate
) && type
&& TYPE_P (node
)
719 && same_type_p (type
, candidate
))
720 || NESTED_TEMPLATE_MATCH (node
, candidate
))
722 write_substitution (i
);
728 /* No substitution found. */
734 /* If there are ABI tags on the abbreviation, it becomes
735 a substitution candidate. */
736 write_abi_tags (tags
);
737 add_substitution (node
);
742 /* Returns whether DECL's symbol name should be the plain unqualified-id
743 rather than a more complicated mangled name. */
746 unmangled_name_p (const tree decl
)
748 if (TREE_CODE (decl
) == FUNCTION_DECL
)
750 /* The names of `extern "C"' functions are not mangled. */
751 return (DECL_EXTERN_C_FUNCTION_P (decl
)
752 /* But overloaded operator names *are* mangled. */
753 && !DECL_OVERLOADED_OPERATOR_P (decl
));
755 else if (VAR_P (decl
))
757 /* static variables are mangled. */
758 if (!DECL_EXTERNAL_LINKAGE_P (decl
))
761 /* extern "C" declarations aren't mangled. */
762 if (DECL_EXTERN_C_P (decl
))
765 /* Other variables at non-global scope are mangled. */
766 if (CP_DECL_CONTEXT (decl
) != global_namespace
)
769 /* Variable template instantiations are mangled. */
770 if (DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)
771 && variable_template_p (DECL_TI_TEMPLATE (decl
)))
774 /* Declarations with ABI tags are mangled. */
775 if (get_abi_tags (decl
))
778 // Declarations attached to a named module are mangled
779 if (modules_p () && get_originating_module (decl
, true) >= 0)
782 /* The names of non-static global variables aren't mangled. */
789 /* TOP_LEVEL is true, if this is being called at outermost level of
790 mangling. It should be false when mangling a decl appearing in an
791 expression within some other mangling.
793 <mangled-name> ::= _Z <encoding> */
796 write_mangled_name (const tree decl
, bool top_level
)
798 MANGLE_TRACE_TREE ("mangled-name", decl
);
800 check_abi_tags (decl
);
802 if (unmangled_name_p (decl
))
805 write_string (IDENTIFIER_POINTER (DECL_NAME (decl
)));
808 /* The standard notes: "The <encoding> of an extern "C"
809 function is treated like global-scope data, i.e. as its
810 <source-name> without a type." We cannot write
811 overloaded operators that way though, because it contains
812 characters invalid in assembler. */
814 write_source_name (DECL_NAME (decl
));
820 write_encoding (decl
);
823 /* If this is the pre/post function for a guarded function, append
824 .pre/post, like something from create_virtual_clone. */
825 if (DECL_IS_PRE_FN_P (decl
))
826 write_string (".pre");
827 else if (DECL_IS_POST_FN_P (decl
))
828 write_string (".post");
830 /* If this is a coroutine helper, then append an appropriate string to
832 if (tree ramp
= DECL_RAMP_FN (decl
))
834 if (DECL_ACTOR_FN (ramp
) == decl
)
835 write_string (JOIN_STR
"actor");
836 else if (DECL_DESTROY_FN (ramp
) == decl
)
837 write_string (JOIN_STR
"destroy");
843 /* Returns true if the return type of DECL is part of its signature, and
844 therefore its mangling. */
847 mangle_return_type_p (tree decl
)
849 return (!DECL_CONSTRUCTOR_P (decl
)
850 && !DECL_DESTRUCTOR_P (decl
)
851 && !DECL_CONV_FN_P (decl
)
852 && maybe_template_info (decl
));
855 /* <constraint-expression> ::= <expression> */
858 write_constraint_expression (tree expr
)
860 write_expression (expr
);
863 /* Mangle a requires-clause following a template-head, if any.
865 Q <constraint_expression> E */
868 write_tparms_constraints (tree constraints
)
870 /* In a declaration with shorthand constraints in the template-head, followed
871 by a requires-clause, followed by shorthand constraints in the
872 function-parameter-list, the full constraints will be some && with the
873 parameter constraints on the RHS, around an && with the requires-clause on
874 the RHS. Find the requires-clause, if any.
876 This logic relies on the && and ... from combine_constraint_expressions,
877 finish_shorthand_constraint, and convert_generic_types_to_packs having
878 UNKNOWN_LOCATION. If they need to have an actual location, we could move
879 to using a TREE_LANG_FLAG. */
880 if (constraints
&& abi_check (19))
882 tree probe
= constraints
;
884 && !EXPR_LOCATION (probe
)
885 && TREE_CODE (probe
) == TRUTH_ANDIF_EXPR
)
887 tree op1
= TREE_OPERAND (probe
, 1);
888 probe
= (EXPR_LOCATION (op1
) ? op1
889 : TREE_OPERAND (probe
, 0));
891 if (probe
&& EXPR_LOCATION (probe
))
894 write_constraint_expression (probe
);
899 /* <type-constraint> ::= <name> */
902 write_type_constraint (tree cnst
)
906 cnst
= unpack_concept_check (cnst
);
907 gcc_checking_assert (TREE_CODE (cnst
) == TEMPLATE_ID_EXPR
);
909 tree concept_decl
= get_concept_check_template (cnst
);
910 write_name (concept_decl
, 0);
911 tree args
= TREE_OPERAND (cnst
, 1);
912 if (TREE_VEC_LENGTH (args
) > 1)
914 TEMPLATE_ARGS_TYPE_CONSTRAINT_P (args
) = true;
915 write_template_args (args
);
919 /* <encoding> ::= <function name> <bare-function-type>
923 write_encoding (const tree decl
)
925 MANGLE_TRACE_TREE ("encoding", decl
);
927 if (DECL_LANG_SPECIFIC (decl
) && DECL_EXTERN_C_FUNCTION_P (decl
))
929 /* For overloaded operators write just the mangled name
930 without arguments. */
931 if (DECL_OVERLOADED_OPERATOR_P (decl
))
932 write_name (decl
, /*ignore_local_scope=*/0);
934 write_source_name (DECL_NAME (decl
));
938 write_name (decl
, /*ignore_local_scope=*/0);
939 if (TREE_CODE (decl
) == FUNCTION_DECL
)
944 if (maybe_template_info (decl
))
946 fn_type
= get_mostly_instantiated_function_type (decl
);
947 /* FN_TYPE will not have parameter types for in-charge or
948 VTT parameters. Therefore, we pass NULL_TREE to
949 write_bare_function_type -- otherwise, it will get
950 confused about which artificial parameters to skip. */
955 fn_type
= TREE_TYPE (decl
);
959 write_bare_function_type (fn_type
,
960 mangle_return_type_p (decl
),
963 if (tree c
= get_trailing_function_requirements (decl
))
968 write_constraint_expression (c
);
974 /* Interface to substitution and identifier mangling, used by the
975 module name mangler. */
978 mangle_module_substitution (int v
)
980 write_substitution (v
- 1);
984 mangle_module_component (tree comp
, bool partition_p
)
989 write_source_name (comp
);
991 // Module substitutions use the same number-space as entity
992 // substitutions, but are orthogonal.
993 vec_safe_push (G
.substitutions
, NULL_TREE
);
994 return G
.substitutions
->length ();
997 /* If the outermost non-namespace context (including DECL itself) is
998 a module-linkage decl, mangle the module information. For module
999 global initializers we need to include the partition part.
1001 <module-name> ::= <module-sub>
1003 || <module-name> <module-sub>
1004 <module-sub> :: W [P] <unqualified-name>
1008 write_module (int m
, bool include_partition
)
1011 mangle_module (m
, include_partition
);
1015 maybe_write_module (tree decl
)
1017 if (!DECL_NAMESPACE_SCOPE_P (decl
))
1020 if (!TREE_PUBLIC (STRIP_TEMPLATE (decl
)))
1023 if (TREE_CODE (decl
) == NAMESPACE_DECL
)
1026 int m
= get_originating_module (decl
, true);
1028 write_module (m
, false);
1031 /* Lambdas can have a bit more context for mangling, specifically VAR_DECL
1032 or PARM_DECL context, which doesn't belong in DECL_CONTEXT. */
1035 decl_mangling_context (tree decl
)
1037 tree tcontext
= targetm
.cxx
.decl_mangling_context (decl
);
1039 if (tcontext
!= NULL_TREE
)
1042 if (TREE_CODE (decl
) == TEMPLATE_DECL
1043 && DECL_TEMPLATE_RESULT (decl
))
1044 decl
= DECL_TEMPLATE_RESULT (decl
);
1046 if (TREE_CODE (decl
) == TYPE_DECL
1047 && LAMBDA_TYPE_P (TREE_TYPE (decl
)))
1049 tree extra
= LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl
));
1053 else if (template_type_parameter_p (decl
))
1054 /* template type parms have no mangling context. */
1057 tcontext
= CP_DECL_CONTEXT (decl
);
1059 if (member_like_constrained_friend_p (decl
))
1060 tcontext
= DECL_FRIEND_CONTEXT (decl
);
1062 /* Ignore the artificial declare reduction functions. */
1064 && TREE_CODE (tcontext
) == FUNCTION_DECL
1065 && DECL_OMP_DECLARE_REDUCTION_P (tcontext
))
1066 return decl_mangling_context (tcontext
);
1071 /* <name> ::= <unscoped-name>
1072 ::= <unscoped-template-name> <template-args>
1076 If IGNORE_LOCAL_SCOPE is nonzero, this production of <name> is
1077 called from <local-name>, which mangles the enclosing scope
1078 elsewhere and then uses this function to mangle just the part
1079 underneath the function scope. So don't use the <local-name>
1080 production, to avoid an infinite recursion. */
1083 write_name (tree decl
, const int ignore_local_scope
)
1087 MANGLE_TRACE_TREE ("name", decl
);
1089 if (TREE_CODE (decl
) == TYPE_DECL
)
1091 /* In case this is a typedef, fish out the corresponding
1092 TYPE_DECL for the main variant. */
1093 decl
= TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl
)));
1096 context
= decl_mangling_context (decl
);
1098 gcc_assert (context
!= NULL_TREE
);
1100 if (abi_warn_or_compat_version_crosses (7)
1101 && ignore_local_scope
1102 && TREE_CODE (context
) == PARM_DECL
)
1103 G
.need_abi_warning
= 1;
1105 /* A decl in :: or ::std scope is treated specially. The former is
1106 mangled using <unscoped-name> or <unscoped-template-name>, the
1107 latter with a special substitution. Also, a name that is
1108 directly in a local function scope is also mangled with
1109 <unscoped-name> rather than a full <nested-name>. */
1110 if (context
== global_namespace
1111 || DECL_NAMESPACE_STD_P (context
)
1112 || (ignore_local_scope
1113 && (TREE_CODE (context
) == FUNCTION_DECL
1114 || (abi_version_at_least (7)
1115 && TREE_CODE (context
) == PARM_DECL
))))
1117 /* Is this a template instance? */
1118 if (tree info
= maybe_template_info (decl
))
1120 /* Yes: use <unscoped-template-name>. */
1121 write_unscoped_template_name (TI_TEMPLATE (info
));
1122 /* Pass down the parms of a function template in case we need to
1123 mangle them; we don't mangle the parms of a non-overloadable
1125 tree parms
= (TREE_CODE (decl
) == FUNCTION_DECL
1126 ? DECL_TEMPLATE_PARMS (TI_TEMPLATE (info
))
1128 write_template_args (TI_ARGS (info
), parms
);
1131 /* Everything else gets an <unqualified-name>. */
1132 write_unscoped_name (decl
);
1136 /* Handle local names, unless we asked not to (that is, invoked
1137 under <local-name>, to handle only the part of the name under
1138 the local scope). */
1139 if (!ignore_local_scope
)
1141 /* Scan up the list of scope context, looking for a
1142 function. If we find one, this entity is in local
1143 function scope. local_entity tracks context one scope
1144 level down, so it will contain the element that's
1145 directly in that function's scope, either decl or one of
1146 its enclosing scopes. */
1147 tree local_entity
= decl
;
1148 while (context
!= global_namespace
)
1150 /* Make sure we're always dealing with decls. */
1151 if (TYPE_P (context
))
1152 context
= TYPE_NAME (context
);
1153 /* Is this a function? */
1154 if (TREE_CODE (context
) == FUNCTION_DECL
1155 || TREE_CODE (context
) == PARM_DECL
)
1157 /* Yes, we have local scope. Use the <local-name>
1158 production for the innermost function scope. */
1159 write_local_name (context
, local_entity
, decl
);
1162 /* Up one scope level. */
1163 local_entity
= context
;
1164 context
= decl_mangling_context (context
);
1167 /* No local scope found? Fall through to <nested-name>. */
1170 /* Other decls get a <nested-name> to encode their scope. */
1171 write_nested_name (decl
);
1175 /* <unscoped-name> ::= <unqualified-name>
1176 ::= St <unqualified-name> # ::std:: */
1179 write_unscoped_name (const tree decl
)
1181 tree context
= decl_mangling_context (decl
);
1183 MANGLE_TRACE_TREE ("unscoped-name", decl
);
1185 /* Is DECL in ::std? */
1186 if (DECL_NAMESPACE_STD_P (context
))
1188 write_string ("St");
1189 write_unqualified_name (decl
);
1193 /* If not, it should be either in the global namespace, or directly
1194 in a local function scope. A lambda can also be mangled in the
1195 scope of a default argument. */
1196 gcc_assert (context
== global_namespace
1197 || TREE_CODE (context
) == PARM_DECL
1198 || TREE_CODE (context
) == FUNCTION_DECL
);
1200 write_unqualified_name (decl
);
1204 /* <unscoped-template-name> ::= <unscoped-name>
1205 ::= <substitution> */
1208 write_unscoped_template_name (const tree decl
)
1210 MANGLE_TRACE_TREE ("unscoped-template-name", decl
);
1212 if (find_substitution (decl
))
1214 write_unscoped_name (decl
);
1215 add_substitution (decl
);
1218 /* Write the nested name, including CV-qualifiers, of DECL.
1220 <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
1221 ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
1223 <ref-qualifier> ::= R # & ref-qualifier
1224 ::= O # && ref-qualifier
1225 <CV-qualifiers> ::= [r] [V] [K] */
1228 write_nested_name (const tree decl
)
1230 MANGLE_TRACE_TREE ("nested-name", decl
);
1234 /* Write CV-qualifiers, if this is an iobj member function. */
1235 if (TREE_CODE (decl
) == FUNCTION_DECL
1236 && DECL_IOBJ_MEMBER_FUNCTION_P (decl
))
1238 if (DECL_VOLATILE_MEMFUNC_P (decl
))
1240 if (DECL_CONST_MEMFUNC_P (decl
))
1242 if (FUNCTION_REF_QUALIFIED (TREE_TYPE (decl
)))
1244 if (FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl
)))
1250 else if (DECL_DECLARES_FUNCTION_P (decl
)
1251 && DECL_XOBJ_MEMBER_FUNCTION_P (decl
))
1254 /* Is this a template instance? */
1255 if (tree info
= maybe_template_info (decl
))
1257 /* Yes, use <template-prefix>. */
1258 write_template_prefix (decl
);
1259 write_template_args (TI_ARGS (info
));
1261 else if ((!abi_version_at_least (10) || TREE_CODE (decl
) == TYPE_DECL
)
1262 && TREE_CODE (TREE_TYPE (decl
)) == TYPENAME_TYPE
)
1264 tree name
= TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl
));
1265 if (TREE_CODE (name
) == TEMPLATE_ID_EXPR
)
1267 write_template_prefix (decl
);
1268 write_template_args (TREE_OPERAND (name
, 1));
1272 write_prefix (decl_mangling_context (decl
));
1273 write_unqualified_name (decl
);
1278 /* No, just use <prefix> */
1279 write_prefix (decl_mangling_context (decl
));
1280 write_unqualified_name (decl
);
1285 /* <prefix> ::= <prefix> <unqualified-name>
1286 ::= <template-param>
1287 ::= <template-prefix> <template-args>
1290 ::= <substitution> */
1293 write_prefix (const tree node
)
1298 || node
== global_namespace
)
1301 MANGLE_TRACE_TREE ("prefix", node
);
1303 if (TREE_CODE (node
) == DECLTYPE_TYPE
)
1309 if (find_substitution (node
))
1312 tree template_info
= NULL_TREE
;
1315 /* If this is a function or parm decl, that means we've hit function
1316 scope, so this prefix must be for a local name. In this
1317 case, we're under the <local-name> production, which encodes
1318 the enclosing function scope elsewhere. So don't continue
1320 if (TREE_CODE (node
) == FUNCTION_DECL
1321 || TREE_CODE (node
) == PARM_DECL
)
1325 template_info
= maybe_template_info (decl
);
1329 /* Node is a type. */
1330 decl
= TYPE_NAME (node
);
1331 /* The DECL might not point at the node. */
1332 if (CLASSTYPE_TEMPLATE_ID_P (node
))
1333 template_info
= TYPE_TEMPLATE_INFO (node
);
1336 if (TREE_CODE (node
) == TEMPLATE_TYPE_PARM
)
1337 write_template_param (node
);
1338 else if (template_info
)
1341 write_template_prefix (decl
);
1342 write_template_args (TI_ARGS (template_info
));
1344 else if (TREE_CODE (TREE_TYPE (decl
)) == TYPENAME_TYPE
)
1346 tree name
= TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl
));
1347 if (TREE_CODE (name
) == TEMPLATE_ID_EXPR
)
1349 write_template_prefix (decl
);
1350 write_template_args (TREE_OPERAND (name
, 1));
1354 write_prefix (decl_mangling_context (decl
));
1355 write_unqualified_name (decl
);
1359 /* Not templated. */
1361 write_prefix (decl_mangling_context (decl
));
1362 write_unqualified_name (decl
);
1364 || TREE_CODE (decl
) == FIELD_DECL
)
1366 /* <data-member-prefix> := <member source-name> M */
1369 /* Before ABI 18, we did not count these as substitution
1370 candidates. This leads to incorrect demanglings (and
1371 ABI divergence to other compilers). */
1372 if (!abi_check (18))
1377 add_substitution (node
);
1380 /* <template-prefix> ::= <prefix> <template component>
1381 ::= <template-param>
1382 ::= <substitution> */
1385 write_template_prefix (const tree node
)
1387 tree decl
= DECL_P (node
) ? node
: TYPE_NAME (node
);
1388 tree type
= DECL_P (node
) ? TREE_TYPE (node
) : node
;
1389 tree context
= decl_mangling_context (decl
);
1393 MANGLE_TRACE_TREE ("template-prefix", node
);
1395 /* Find the template decl. */
1396 if (tree info
= maybe_template_info (decl
))
1397 templ
= TI_TEMPLATE (info
);
1398 else if (TREE_CODE (type
) == TYPENAME_TYPE
)
1399 /* For a typename type, all we have is the name. */
1400 templ
= DECL_NAME (decl
);
1403 gcc_assert (CLASSTYPE_TEMPLATE_ID_P (type
));
1405 templ
= TYPE_TI_TEMPLATE (type
);
1408 /* For a member template, though, the template name for the
1409 innermost name must have all the outer template levels
1410 instantiated. For instance, consider
1412 template<typename T> struct Outer {
1413 template<typename U> struct Inner {};
1416 The template name for `Inner' in `Outer<int>::Inner<float>' is
1417 `Outer<int>::Inner<U>'. In g++, we don't instantiate the template
1418 levels separately, so there's no TEMPLATE_DECL available for this
1419 (there's only `Outer<T>::Inner<U>').
1421 In order to get the substitutions right, we create a special
1422 TREE_LIST to represent the substitution candidate for a nested
1423 template. The TREE_PURPOSE is the template's context, fully
1424 instantiated, and the TREE_VALUE is the TEMPLATE_DECL for the inner
1427 So, for the example above, `Outer<int>::Inner' is represented as a
1428 substitution candidate by a TREE_LIST whose purpose is `Outer<int>'
1429 and whose value is `Outer<T>::Inner<U>'. */
1430 if (context
&& TYPE_P (context
))
1431 substitution
= build_tree_list (context
, templ
);
1433 substitution
= templ
;
1435 if (find_substitution (substitution
))
1438 if (TREE_TYPE (templ
)
1439 && TREE_CODE (TREE_TYPE (templ
)) == TEMPLATE_TEMPLATE_PARM
)
1440 write_template_param (TREE_TYPE (templ
));
1443 write_prefix (context
);
1444 write_unqualified_name (decl
);
1447 add_substitution (substitution
);
1450 /* "For the purposes of mangling, the name of an anonymous union is considered
1451 to be the name of the first named data member found by a pre-order,
1452 depth-first, declaration-order walk of the data members of the anonymous
1453 union. If there is no such data member (i.e., if all of the data members in
1454 the union are unnamed), then there is no way for a program to refer to the
1455 anonymous union, and there is therefore no need to mangle its name." */
1458 anon_aggr_naming_decl (tree type
)
1460 tree field
= next_aggregate_field (TYPE_FIELDS (type
));
1461 for (; field
; field
= next_aggregate_field (DECL_CHAIN (field
)))
1463 if (DECL_NAME (field
))
1465 if (ANON_AGGR_TYPE_P (TREE_TYPE (field
)))
1466 if (tree sub
= anon_aggr_naming_decl (TREE_TYPE (field
)))
1472 /* We don't need to handle thunks, vtables, or VTTs here. Those are
1473 mangled through special entry points.
1475 <unqualified-name> ::= [<module-name>] <operator-name>
1477 ::= [<module-name>] <source-name>
1478 ::= [<module-name>] <unnamed-type-name>
1479 ::= <local-source-name>
1480 ::= F <source-name> # member-like constrained friend
1482 <local-source-name> ::= L <source-name> <discriminator> */
1485 write_unqualified_id (tree identifier
)
1487 if (IDENTIFIER_CONV_OP_P (identifier
))
1488 write_conversion_operator_name (TREE_TYPE (identifier
));
1489 else if (IDENTIFIER_OVL_OP_P (identifier
))
1491 const ovl_op_info_t
*ovl_op
= IDENTIFIER_OVL_OP_INFO (identifier
);
1492 write_string (ovl_op
->mangled_name
);
1494 else if (UDLIT_OPER_P (identifier
))
1495 write_literal_operator_name (identifier
);
1497 write_source_name (identifier
);
1501 write_unqualified_name (tree decl
)
1503 MANGLE_TRACE_TREE ("unqualified-name", decl
);
1506 maybe_write_module (decl
);
1508 if (identifier_p (decl
))
1510 write_unqualified_id (decl
);
1516 if (DECL_NAME (decl
) == NULL_TREE
1517 && ANON_AGGR_TYPE_P (TREE_TYPE (decl
)))
1518 decl
= anon_aggr_naming_decl (TREE_TYPE (decl
));
1519 else if (DECL_NAME (decl
) == NULL_TREE
)
1522 gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl
));
1523 write_source_name (DECL_ASSEMBLER_NAME (decl
));
1525 else if (DECL_DECLARES_FUNCTION_P (decl
))
1529 /* A constrained hidden friend is mangled like a member function, with
1530 the name prefixed by 'F'. */
1531 if (member_like_constrained_friend_p (decl
))
1534 if (DECL_CONSTRUCTOR_P (decl
))
1535 write_special_name_constructor (decl
);
1536 else if (DECL_DESTRUCTOR_P (decl
))
1537 write_special_name_destructor (decl
);
1538 else if (DECL_CONV_FN_P (decl
))
1540 /* Conversion operator. Handle it right here.
1541 <operator> ::= cv <type> */
1543 if (maybe_template_info (decl
))
1546 fn_type
= get_mostly_instantiated_function_type (decl
);
1547 type
= TREE_TYPE (fn_type
);
1549 else if (FNDECL_USED_AUTO (decl
))
1550 type
= DECL_SAVED_AUTO_RETURN_TYPE (decl
);
1552 type
= DECL_CONV_FN_TYPE (decl
);
1553 write_conversion_operator_name (type
);
1555 else if (DECL_OVERLOADED_OPERATOR_P (decl
))
1558 if (!(t
= DECL_RAMP_FN (decl
)))
1560 const char *mangled_name
1561 = (ovl_op_info
[DECL_ASSIGNMENT_OPERATOR_P (t
)]
1562 [DECL_OVERLOADED_OPERATOR_CODE_RAW (t
)].mangled_name
);
1563 write_string (mangled_name
);
1565 else if (UDLIT_OPER_P (DECL_NAME (decl
)))
1566 write_literal_operator_name (DECL_NAME (decl
));
1573 else if (VAR_OR_FUNCTION_DECL_P (decl
) && ! TREE_PUBLIC (decl
)
1574 && DECL_NAMESPACE_SCOPE_P (decl
)
1575 && decl_linkage (decl
) == lk_internal
)
1577 MANGLE_TRACE_TREE ("local-source-name", decl
);
1579 write_source_name (DECL_NAME (decl
));
1580 /* The default discriminator is 1, and that's all we ever use,
1581 so there's no code to output one here. */
1585 tree type
= TREE_TYPE (decl
);
1587 if (TREE_CODE (decl
) == TYPE_DECL
1588 && TYPE_UNNAMED_P (type
))
1589 write_unnamed_type_name (type
);
1590 else if (TREE_CODE (decl
) == TYPE_DECL
&& LAMBDA_TYPE_P (type
))
1591 write_closure_type_name (type
);
1593 write_source_name (DECL_NAME (decl
));
1596 /* We use the ABI tags from the primary class template, ignoring tags on any
1597 specializations. This is necessary because C++ doesn't require a
1598 specialization to be declared before it is used unless the use requires a
1599 complete type, but we need to get the tags right on incomplete types as
1601 if (tree tmpl
= most_general_template (decl
))
1603 tree res
= DECL_TEMPLATE_RESULT (tmpl
);
1604 if (res
== NULL_TREE
)
1605 /* UNBOUND_CLASS_TEMPLATE. */;
1606 else if (DECL_DECLARES_TYPE_P (decl
))
1608 else if (any_abi_below (11))
1610 /* ABI v10 implicit tags on the template. */
1611 tree mtags
= missing_abi_tags (res
);
1612 /* Explicit tags on the template. */
1613 tree ttags
= get_abi_tags (res
);
1614 /* Tags on the instantiation. */
1615 tree dtags
= get_abi_tags (decl
);
1617 if (mtags
&& abi_warn_or_compat_version_crosses (10))
1618 G
.need_abi_warning
= 1;
1620 /* Add the v10 tags to the explicit tags now. */
1621 mtags
= chainon (mtags
, ttags
);
1623 if (!G
.need_abi_warning
1624 && abi_warn_or_compat_version_crosses (11)
1625 && !equal_abi_tags (dtags
, mtags
))
1626 G
.need_abi_warning
= 1;
1628 if (!abi_version_at_least (10))
1629 /* In abi <10, we only got the explicit tags. */
1631 else if (flag_abi_version
== 10)
1633 /* In ABI 10, we want explict and implicit tags. */
1634 write_abi_tags (mtags
);
1640 tree tags
= get_abi_tags (decl
);
1641 if (TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_CONV_FN_P (decl
)
1642 && any_abi_below (11))
1643 if (tree mtags
= missing_abi_tags (decl
))
1645 if (!abi_check (11))
1646 tags
= chainon (mtags
, tags
);
1648 write_abi_tags (tags
);
1651 /* Write the unqualified-name for a conversion operator to TYPE. */
1654 write_conversion_operator_name (const tree type
)
1656 write_string ("cv");
1660 /* Non-terminal <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
1662 <source-name> ::= </length/ number> <identifier> */
1665 write_source_name (tree identifier
)
1667 MANGLE_TRACE_TREE ("source-name", identifier
);
1669 write_unsigned_number (IDENTIFIER_LENGTH (identifier
));
1670 write_identifier (IDENTIFIER_POINTER (identifier
));
1673 /* Compare two TREE_STRINGs like strcmp. */
1676 tree_string_cmp (const void *p1
, const void *p2
)
1680 tree s1
= *(const tree
*)p1
;
1681 tree s2
= *(const tree
*)p2
;
1682 return strcmp (TREE_STRING_POINTER (s1
),
1683 TREE_STRING_POINTER (s2
));
1686 /* Return the TREE_LIST of TAGS as a sorted VEC. */
1688 static vec
<tree
, va_gc
> *
1689 sorted_abi_tags (tree tags
)
1691 vec
<tree
, va_gc
> * vec
= make_tree_vector();
1693 for (tree t
= tags
; t
; t
= TREE_CHAIN (t
))
1695 if (ABI_TAG_IMPLICIT (t
))
1697 tree str
= TREE_VALUE (t
);
1698 vec_safe_push (vec
, str
);
1701 vec
->qsort (tree_string_cmp
);
1706 /* ID is the name of a function or type with abi_tags attribute TAGS.
1707 Write out the name, suitably decorated. */
1710 write_abi_tags (tree tags
)
1712 if (tags
== NULL_TREE
)
1715 vec
<tree
, va_gc
> * vec
= sorted_abi_tags (tags
);
1717 unsigned i
; tree str
;
1718 FOR_EACH_VEC_ELT (*vec
, i
, str
)
1721 write_unsigned_number (TREE_STRING_LENGTH (str
) - 1);
1722 write_identifier (TREE_STRING_POINTER (str
));
1725 release_tree_vector (vec
);
1728 /* True iff the TREE_LISTS T1 and T2 of ABI tags are equivalent. */
1731 equal_abi_tags (tree t1
, tree t2
)
1733 releasing_vec v1
= sorted_abi_tags (t1
);
1734 releasing_vec v2
= sorted_abi_tags (t2
);
1736 unsigned len1
= v1
->length();
1737 if (len1
!= v2
->length())
1739 for (unsigned i
= 0; i
< len1
; ++i
)
1740 if (tree_string_cmp (v1
[i
], v2
[i
]) != 0)
1745 /* Write a user-defined literal operator.
1746 ::= li <source-name> # "" <source-name>
1747 IDENTIFIER is an LITERAL_IDENTIFIER_NODE. */
1750 write_literal_operator_name (tree identifier
)
1752 const char* suffix
= UDLIT_OP_SUFFIX (identifier
);
1753 write_identifier (UDLIT_OP_MANGLED_PREFIX
);
1754 write_unsigned_number (strlen (suffix
));
1755 write_identifier (suffix
);
1758 /* Encode 0 as _, and 1+ as n-1_. */
1761 write_compact_number (int num
)
1763 gcc_checking_assert (num
>= 0);
1765 write_unsigned_number (num
- 1);
1769 /* Return how many unnamed types precede TYPE in its enclosing class. */
1772 nested_anon_class_index (tree type
)
1775 tree member
= TYPE_FIELDS (TYPE_CONTEXT (type
));
1776 for (; member
; member
= DECL_CHAIN (member
))
1777 if (DECL_IMPLICIT_TYPEDEF_P (member
))
1779 tree memtype
= TREE_TYPE (member
);
1780 if (memtype
== type
)
1782 else if (TYPE_UNNAMED_P (memtype
))
1792 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
1795 write_unnamed_type_name (const tree type
)
1798 MANGLE_TRACE_TREE ("unnamed-type-name", type
);
1800 if (TYPE_FUNCTION_SCOPE_P (type
))
1801 discriminator
= discriminator_for_local_entity (TYPE_NAME (type
));
1802 else if (TYPE_CLASS_SCOPE_P (type
))
1803 discriminator
= nested_anon_class_index (type
);
1806 gcc_assert (no_linkage_check (type
, /*relaxed_p=*/true));
1807 /* Just use the old mangling at namespace scope. */
1808 write_source_name (TYPE_IDENTIFIER (type
));
1812 write_string ("Ut");
1813 write_compact_number (discriminator
);
1816 /* ABI issue #47: if a function template parameter is not "natural" for its
1817 argument we must mangle the parameter. */
1820 template_parm_natural_p (tree arg
, tree parm
)
1822 tree decl
= TREE_VALUE (parm
);
1824 /* A template parameter is "natural" if: */
1826 if (template_parameter_pack_p (decl
))
1828 tree args
= ARGUMENT_PACK_ARGS (arg
);
1829 if (TREE_VEC_LENGTH (args
) == 0)
1832 /* the argument is an empty pack and the parameter is an
1833 unconstrained template type parameter pack; */
1834 if (TREE_CODE (decl
) != TYPE_DECL
)
1837 /* Defer changing the mangling of C++11 code like
1838 template <int i> int max();
1839 template <int i, int j, int... rest> int max(); */
1844 /* the argument is a non-empty pack and a non-pack variant of the
1845 parameter would be natural for the first element of the pack; */
1846 arg
= TREE_VEC_ELT (args
, 0);
1849 /* the argument is a template and the parameter has the exact
1850 same template head; */
1851 if (TREE_CODE (decl
) == TEMPLATE_DECL
)
1852 return template_heads_equivalent_p (arg
, decl
);
1854 /* the argument is a type and the parameter is unconstrained; or */
1855 else if (TREE_CODE (decl
) == TYPE_DECL
)
1856 return !TEMPLATE_PARM_CONSTRAINTS (parm
);
1858 /* the argument is a non-type template argument and the declared parameter
1859 type neither is instantiation dependent nor contains deduced types. */
1860 else if (TREE_CODE (decl
) == PARM_DECL
)
1863 return !uses_template_parms (TREE_TYPE (decl
));
1865 /* Defer changing the mangling of C++98 code like
1866 template <class T, T V> .... */
1867 return !type_uses_auto (TREE_TYPE (decl
));
1874 /* Used for lambda template head and non-natural function template parameters.
1876 <template-param-decl> ::= Ty # template type parameter
1877 ::= Tk <type-constraint> # constrained type parameter
1878 ::= Tn <type> # template non-type parameter
1879 ::= Tt <template-param-decl>* [Q <constraint-expression] E # ttp
1880 ::= Tp <non-pack template-param-decl> # template parameter pack */
1883 write_template_param_decl (tree parm
)
1885 tree decl
= TREE_VALUE (parm
);
1887 if (template_parameter_pack_p (decl
))
1888 write_string ("Tp");
1890 switch (TREE_CODE (decl
))
1894 write_string ("Tn");
1896 tree type
= TREE_TYPE (decl
);
1897 if (tree c
= (is_auto (type
)
1898 ? PLACEHOLDER_TYPE_CONSTRAINTS (type
)
1901 if (AUTO_IS_DECLTYPE (type
))
1902 write_string ("DK");
1904 write_string ("Dk");
1905 write_type_constraint (c
);
1914 write_string ("Tt");
1915 tree parms
= DECL_INNERMOST_TEMPLATE_PARMS (decl
);
1916 for (tree node
: tree_vec_range (parms
))
1917 write_template_param_decl (node
);
1923 if (tree c
= TEMPLATE_PARM_CONSTRAINTS (parm
))
1925 if (TREE_CODE (c
) == UNARY_LEFT_FOLD_EXPR
)
1927 c
= FOLD_EXPR_PACK (c
);
1928 c
= PACK_EXPANSION_PATTERN (c
);
1930 if (TREE_CODE (decl
) == TYPE_DECL
)
1932 write_string ("Tk");
1933 write_type_constraint (c
);
1937 write_string ("Ty");
1945 // A template head, for templated lambdas.
1946 // New in ABI=18. Returns true iff we emitted anything -- used for ABI
1950 write_closure_template_head (tree tmpl
)
1954 // We only need one level of template parms
1955 tree parms
= DECL_TEMPLATE_PARMS (tmpl
);
1956 tree inner
= INNERMOST_TEMPLATE_PARMS (parms
);
1958 for (int ix
= 0, len
= TREE_VEC_LENGTH (inner
); ix
!= len
; ix
++)
1960 tree parm
= TREE_VEC_ELT (inner
, ix
);
1961 if (parm
== error_mark_node
)
1964 if (DECL_IMPLICIT_TEMPLATE_PARM_P (TREE_VALUE (parm
)))
1965 // A synthetic parm, we're done.
1969 if (abi_version_at_least (18))
1970 write_template_param_decl (parm
);
1973 write_tparms_constraints (TEMPLATE_PARMS_CONSTRAINTS (parms
));
1978 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
1979 <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters */
1982 write_closure_type_name (const tree type
)
1984 tree fn
= lambda_function (type
);
1985 tree lambda
= CLASSTYPE_LAMBDA_EXPR (type
);
1986 tree parms
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
1988 MANGLE_TRACE_TREE ("closure-type-name", type
);
1990 write_string ("Ul");
1992 if (auto ti
= maybe_template_info (fn
))
1993 if (write_closure_template_head (TI_TEMPLATE (ti
)))
1994 // If there were any explicit template parms, we may need to
1995 // issue a mangling diagnostic.
1996 if (abi_warn_or_compat_version_crosses (18))
1997 G
.need_abi_warning
= true;
1999 write_method_parms (parms
, TREE_CODE (TREE_TYPE (fn
)) == METHOD_TYPE
, fn
);
2001 if ((LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR (lambda
)
2002 != LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR (lambda
))
2003 && abi_warn_or_compat_version_crosses (18))
2004 G
.need_abi_warning
= true;
2005 write_compact_number (abi_version_at_least (18)
2006 ? LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR (lambda
)
2007 : LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR (lambda
));
2010 /* Convert NUMBER to ascii using base BASE and generating at least
2011 MIN_DIGITS characters. BUFFER points to the _end_ of the buffer
2012 into which to store the characters. Returns the number of
2013 characters generated (these will be laid out in advance of where
2017 hwint_to_ascii (unsigned HOST_WIDE_INT number
, const unsigned int base
,
2018 char *buffer
, const unsigned int min_digits
)
2020 static const char base_digits
[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
2021 unsigned digits
= 0;
2025 unsigned HOST_WIDE_INT d
= number
/ base
;
2027 *--buffer
= base_digits
[number
- d
* base
];
2031 while (digits
< min_digits
)
2033 *--buffer
= base_digits
[0];
2039 /* Non-terminal <number>.
2041 <number> ::= [n] </decimal integer/> */
2044 write_number (unsigned HOST_WIDE_INT number
, const int unsigned_p
,
2045 const unsigned int base
)
2047 char buffer
[sizeof (HOST_WIDE_INT
) * 8];
2050 if (!unsigned_p
&& (HOST_WIDE_INT
) number
< 0)
2053 number
= -((HOST_WIDE_INT
) number
);
2055 count
= hwint_to_ascii (number
, base
, buffer
+ sizeof (buffer
), 1);
2056 write_chars (buffer
+ sizeof (buffer
) - count
, count
);
2059 /* Write out an integral CST in decimal. Most numbers are small, and
2060 representable in a HOST_WIDE_INT. Occasionally we'll have numbers
2061 bigger than that, which we must deal with. */
2064 write_integer_cst (const tree cst
)
2066 int sign
= tree_int_cst_sgn (cst
);
2067 widest_int abs_value
= wi::abs (wi::to_widest (cst
));
2068 if (!wi::fits_uhwi_p (abs_value
))
2070 /* A bignum. We do this in chunks, each of which fits in a
2072 char buffer
[sizeof (HOST_WIDE_INT
) * 8 * 2];
2073 unsigned HOST_WIDE_INT chunk
;
2074 unsigned chunk_digits
;
2075 char *ptr
= buffer
+ sizeof (buffer
);
2080 /* HOST_WIDE_INT must be at least 32 bits, so 10^9 is
2085 if (sizeof (HOST_WIDE_INT
) >= 8)
2087 /* It is at least 64 bits, so 10^18 is representable. */
2092 type
= c_common_signed_or_unsigned_type (1, TREE_TYPE (cst
));
2093 base
= build_int_cstu (type
, chunk
);
2094 n
= wide_int_to_tree (type
, wi::to_wide (cst
));
2099 n
= fold_build1_loc (input_location
, NEGATE_EXPR
, type
, n
);
2103 tree d
= fold_build2_loc (input_location
, FLOOR_DIV_EXPR
, type
, n
, base
);
2104 tree tmp
= fold_build2_loc (input_location
, MULT_EXPR
, type
, d
, base
);
2107 done
= integer_zerop (d
);
2108 tmp
= fold_build2_loc (input_location
, MINUS_EXPR
, type
, n
, tmp
);
2109 c
= hwint_to_ascii (TREE_INT_CST_LOW (tmp
), 10, ptr
,
2110 done
? 1 : chunk_digits
);
2116 write_chars (ptr
, count
);
2123 write_unsigned_number (abs_value
.to_uhwi ());
2127 /* Write out a floating-point literal.
2129 "Floating-point literals are encoded using the bit pattern of the
2130 target processor's internal representation of that number, as a
2131 fixed-length lowercase hexadecimal string, high-order bytes first
2132 (even if the target processor would store low-order bytes first).
2133 The "n" prefix is not used for floating-point literals; the sign
2134 bit is encoded with the rest of the number.
2136 Here are some examples, assuming the IEEE standard representation
2137 for floating point numbers. (Spaces are for readability, not
2138 part of the encoding.)
2141 -1.0f Lf bf80 0000 E
2142 1.17549435e-38f Lf 0080 0000 E
2143 1.40129846e-45f Lf 0000 0001 E
2144 0.0f Lf 0000 0000 E"
2146 Caller is responsible for the Lx and the E. */
2148 write_real_cst (const tree value
)
2150 long target_real
[4]; /* largest supported float */
2151 /* Buffer for eight hex digits in a 32-bit number but big enough
2152 even for 64-bit long to avoid warnings. */
2156 tree type
= TREE_TYPE (value
);
2157 int words
= GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type
)) / 32;
2159 real_to_target (target_real
, &TREE_REAL_CST (value
),
2162 /* The value in target_real is in the target word order,
2163 so we must write it out backward if that happens to be
2164 little-endian. write_number cannot be used, it will
2165 produce uppercase. */
2166 if (FLOAT_WORDS_BIG_ENDIAN
)
2167 i
= 0, limit
= words
, dir
= 1;
2169 i
= words
- 1, limit
= -1, dir
= -1;
2171 for (; i
!= limit
; i
+= dir
)
2173 sprintf (buffer
, "%08lx", (unsigned long) target_real
[i
]);
2174 write_chars (buffer
, 8);
2178 /* Non-terminal <identifier>.
2180 <identifier> ::= </unqualified source code identifier> */
2183 write_identifier (const char *identifier
)
2185 MANGLE_TRACE ("identifier", identifier
);
2186 write_string (identifier
);
2189 /* Handle constructor productions of non-terminal <special-name>.
2190 CTOR is a constructor FUNCTION_DECL.
2192 <special-name> ::= C1 # complete object constructor
2193 ::= C2 # base object constructor
2194 ::= C3 # complete object allocating constructor
2196 Currently, allocating constructors are never used. */
2199 write_special_name_constructor (const tree ctor
)
2202 bool new_inh
= (flag_new_inheriting_ctors
2203 && DECL_INHERITED_CTOR (ctor
));
2206 if (DECL_BASE_CONSTRUCTOR_P (ctor
))
2208 /* This is the old-style "[unified]" constructor.
2209 In some cases, we may emit this function and call
2210 it from the clones in order to share code and save space. */
2211 else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (ctor
))
2215 gcc_assert (DECL_COMPLETE_CONSTRUCTOR_P (ctor
));
2219 write_type (DECL_INHERITED_CTOR_BASE (ctor
));
2222 /* Handle destructor productions of non-terminal <special-name>.
2223 DTOR is a destructor FUNCTION_DECL.
2225 <special-name> ::= D0 # deleting (in-charge) destructor
2226 ::= D1 # complete object (in-charge) destructor
2227 ::= D2 # base object (not-in-charge) destructor */
2230 write_special_name_destructor (const tree dtor
)
2232 if (DECL_DELETING_DESTRUCTOR_P (dtor
))
2233 write_string ("D0");
2234 else if (DECL_BASE_DESTRUCTOR_P (dtor
))
2235 write_string ("D2");
2236 else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor
))
2237 /* This is the old-style "[unified]" destructor.
2238 In some cases, we may emit this function and call
2239 it from the clones in order to share code and save space. */
2240 write_string ("D4");
2243 gcc_assert (DECL_COMPLETE_DESTRUCTOR_P (dtor
));
2244 write_string ("D1");
2248 /* Return the discriminator for ENTITY appearing inside
2249 FUNCTION. The discriminator is the lexical ordinal of VAR or TYPE among
2250 entities with the same name and kind in the same FUNCTION. */
2253 discriminator_for_local_entity (tree entity
)
2255 if (!DECL_LANG_SPECIFIC (entity
))
2257 /* Some decls, like __FUNCTION__, don't need a discriminator. */
2258 gcc_checking_assert (DECL_ARTIFICIAL (entity
));
2261 else if (tree disc
= DECL_DISCRIMINATOR (entity
))
2262 return TREE_INT_CST_LOW (disc
);
2264 /* The first entity with a particular name doesn't get
2265 DECL_DISCRIMINATOR set up. */
2269 /* Return the discriminator for STRING, a string literal used inside
2270 FUNCTION. The discriminator is the lexical ordinal of STRING among
2271 string literals used in FUNCTION. */
2274 discriminator_for_string_literal (tree
/*function*/,
2277 /* For now, we don't discriminate amongst string literals. */
2281 /* <discriminator> := _ <number> # when number < 10
2282 := __ <number> _ # when number >= 10
2284 The discriminator is used only for the second and later occurrences
2285 of the same name within a single function. In this case <number> is
2286 n - 2, if this is the nth occurrence, in lexical order. */
2289 write_discriminator (const int discriminator
)
2291 /* If discriminator is zero, don't write anything. Otherwise... */
2292 if (discriminator
> 0)
2295 if (discriminator
- 1 >= 10)
2300 write_unsigned_number (discriminator
- 1);
2301 if (abi_version_at_least (11) && discriminator
- 1 >= 10)
2306 /* Mangle the name of a function-scope entity. FUNCTION is the
2307 FUNCTION_DECL for the enclosing function, or a PARM_DECL for lambdas in
2308 default argument scope. ENTITY is the decl for the entity itself.
2309 LOCAL_ENTITY is the entity that's directly scoped in FUNCTION_DECL,
2310 either ENTITY itself or an enclosing scope of ENTITY.
2312 <local-name> := Z <function encoding> E <entity name> [<discriminator>]
2313 := Z <function encoding> E s [<discriminator>]
2314 := Z <function encoding> Ed [ <parameter number> ] _ <entity name> */
2317 write_local_name (tree function
, const tree local_entity
,
2320 tree parm
= NULL_TREE
;
2322 MANGLE_TRACE_TREE ("local-name", entity
);
2324 if (TREE_CODE (function
) == PARM_DECL
)
2327 function
= DECL_CONTEXT (parm
);
2331 write_encoding (function
);
2334 /* For this purpose, parameters are numbered from right-to-left. */
2337 int i
= list_length (parm
);
2339 write_compact_number (i
- 1);
2342 if (TREE_CODE (entity
) == STRING_CST
)
2345 write_discriminator (discriminator_for_string_literal (function
,
2350 /* Now the <entity name>. Let write_name know its being called
2351 from <local-name>, so it doesn't try to process the enclosing
2352 function scope again. */
2353 write_name (entity
, /*ignore_local_scope=*/1);
2354 if (DECL_DISCRIMINATOR_P (local_entity
)
2355 && !(TREE_CODE (local_entity
) == TYPE_DECL
2356 && TYPE_ANON_P (TREE_TYPE (local_entity
))))
2357 write_discriminator (discriminator_for_local_entity (local_entity
));
2361 /* Non-terminals <type> and <CV-qualifier>.
2363 <type> ::= <builtin-type>
2365 ::= <class-enum-type>
2367 ::= <pointer-to-member-type>
2368 ::= <template-param>
2371 ::= P <type> # pointer-to
2372 ::= R <type> # reference-to
2373 ::= C <type> # complex pair (C 2000)
2374 ::= G <type> # imaginary (C 2000) [not supported]
2375 ::= U <source-name> <type> # vendor extended type qualifier
2379 <type> ::= RR <type> # rvalue reference-to
2380 <type> ::= Dt <expression> # decltype of an id-expression or
2381 # class member access
2382 <type> ::= DT <expression> # decltype of an expression
2383 <type> ::= Dn # decltype of nullptr
2385 TYPE is a type node. */
2388 write_type (tree type
)
2390 /* This gets set to nonzero if TYPE turns out to be a (possibly
2391 CV-qualified) builtin type. */
2392 int is_builtin_type
= 0;
2394 MANGLE_TRACE_TREE ("type", type
);
2396 if (type
== error_mark_node
)
2399 type
= canonicalize_for_substitution (type
);
2400 if (find_substitution (type
))
2404 if (write_CV_qualifiers_for_type (type
) > 0)
2405 /* If TYPE was CV-qualified, we just wrote the qualifiers; now
2406 mangle the unqualified type. The recursive call is needed here
2407 since both the qualified and unqualified types are substitution
2410 tree t
= TYPE_MAIN_VARIANT (type
);
2411 if (TYPE_ATTRIBUTES (t
) && !OVERLOAD_TYPE_P (t
))
2413 tree attrs
= NULL_TREE
;
2414 if (tx_safe_fn_type_p (type
))
2415 attrs
= tree_cons (get_identifier ("transaction_safe"),
2417 t
= cp_build_type_attribute_variant (t
, attrs
);
2419 gcc_assert (t
!= type
);
2420 if (FUNC_OR_METHOD_TYPE_P (t
))
2422 t
= build_ref_qualified_type (t
, type_memfn_rqual (type
));
2423 if (flag_noexcept_type
)
2425 tree r
= TYPE_RAISES_EXCEPTIONS (type
);
2426 t
= build_exception_variant (t
, r
);
2428 if (abi_version_at_least (8)
2429 || type
== TYPE_MAIN_VARIANT (type
))
2430 /* Avoid adding the unqualified function type as a substitution. */
2431 write_function_type (t
);
2434 if (abi_warn_or_compat_version_crosses (8))
2435 G
.need_abi_warning
= 1;
2440 else if (TREE_CODE (type
) == ARRAY_TYPE
)
2441 /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here
2442 so that the cv-qualification of the element type is available
2443 in write_array_type. */
2444 write_array_type (type
);
2447 tree type_orig
= type
;
2449 /* See through any typedefs. */
2450 type
= TYPE_MAIN_VARIANT (type
);
2451 if (FUNC_OR_METHOD_TYPE_P (type
))
2452 type
= cxx_copy_lang_qualifiers (type
, type_orig
);
2454 /* According to the C++ ABI, some library classes are passed the
2455 same as the scalar type of their single member and use the same
2457 if (TREE_CODE (type
) == RECORD_TYPE
&& TYPE_TRANSPARENT_AGGR (type
))
2458 type
= TREE_TYPE (first_field (type
));
2460 if (TYPE_PTRDATAMEM_P (type
))
2461 write_pointer_to_member_type (type
);
2464 /* Handle any target-specific fundamental types. */
2465 const char *target_mangling
2466 = targetm
.mangle_type (type_orig
);
2468 if (target_mangling
)
2470 write_string (target_mangling
);
2471 /* Add substitutions for types other than fundamental
2473 if (!VOID_TYPE_P (type
)
2474 && TREE_CODE (type
) != INTEGER_TYPE
2475 && TREE_CODE (type
) != REAL_TYPE
2476 && TREE_CODE (type
) != BOOLEAN_TYPE
)
2477 add_substitution (type
);
2481 switch (TREE_CODE (type
))
2485 case INTEGER_TYPE
: /* Includes wchar_t. */
2487 case FIXED_POINT_TYPE
:
2489 /* If this is a typedef, TYPE may not be one of
2490 the standard builtin type nodes, but an alias of one. Use
2491 TYPE_MAIN_VARIANT to get to the underlying builtin type. */
2492 write_builtin_type (TYPE_MAIN_VARIANT (type
));
2499 write_type (TREE_TYPE (type
));
2504 write_function_type (type
);
2510 /* A pointer-to-member function is represented as a special
2511 RECORD_TYPE, so check for this first. */
2512 if (TYPE_PTRMEMFUNC_P (type
))
2513 write_pointer_to_member_type (type
);
2515 write_class_enum_type (type
);
2519 case UNBOUND_CLASS_TEMPLATE
:
2520 /* We handle TYPENAME_TYPEs and UNBOUND_CLASS_TEMPLATEs like
2521 ordinary nested names. */
2522 write_nested_name (TYPE_STUB_DECL (type
));
2526 case REFERENCE_TYPE
:
2527 if (TYPE_PTR_P (type
))
2529 else if (TYPE_REF_IS_RVALUE (type
))
2534 tree target
= TREE_TYPE (type
);
2535 /* Attribute const/noreturn are not reflected in mangling.
2536 We strip them here rather than at a lower level because
2537 a typedef or template argument can have function type
2538 with function-cv-quals (that use the same representation),
2539 but you can't have a pointer/reference to such a type. */
2540 if (TREE_CODE (target
) == FUNCTION_TYPE
)
2542 if (abi_warn_or_compat_version_crosses (5)
2543 && TYPE_QUALS (target
) != TYPE_UNQUALIFIED
)
2544 G
.need_abi_warning
= 1;
2545 if (abi_version_at_least (5))
2546 target
= build_qualified_type (target
, TYPE_UNQUALIFIED
);
2548 write_type (target
);
2552 case TEMPLATE_TYPE_PARM
:
2555 if (template_placeholder_p (type
)
2558 /* ABI #109: placeholder is mangled as its template. */
2559 type
= CLASS_PLACEHOLDER_TEMPLATE (type
);
2560 if (find_substitution (type
))
2562 write_name (type
, 0);
2565 if (AUTO_IS_DECLTYPE (type
))
2566 write_identifier ("Dc");
2568 write_identifier ("Da");
2573 case TEMPLATE_PARM_INDEX
:
2574 write_template_param (type
);
2577 case TEMPLATE_TEMPLATE_PARM
:
2578 write_template_template_param (type
);
2581 case BOUND_TEMPLATE_TEMPLATE_PARM
:
2582 write_template_template_param (type
);
2584 (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type
)));
2588 if (abi_version_at_least (4))
2590 write_string ("Dv");
2591 /* Non-constant vector size would be encoded with
2592 _ expression, but we don't support that yet. */
2593 write_unsigned_number (TYPE_VECTOR_SUBPARTS (type
)
2598 write_string ("U8__vector");
2599 if (abi_warn_or_compat_version_crosses (4))
2600 G
.need_abi_warning
= 1;
2601 write_type (TREE_TYPE (type
));
2604 case TYPE_PACK_EXPANSION
:
2605 write_string ("Dp");
2606 write_type (PACK_EXPANSION_PATTERN (type
));
2610 /* These shouldn't make it into mangling. */
2611 gcc_assert (!DECLTYPE_FOR_LAMBDA_CAPTURE (type
)
2612 && !DECLTYPE_FOR_LAMBDA_PROXY (type
));
2614 /* In ABI <5, we stripped decltype of a plain decl. */
2615 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type
))
2617 tree expr
= DECLTYPE_TYPE_EXPR (type
);
2618 tree etype
= NULL_TREE
;
2619 switch (TREE_CODE (expr
))
2626 case TEMPLATE_PARM_INDEX
:
2627 etype
= TREE_TYPE (expr
);
2634 if (etype
&& !type_uses_auto (etype
))
2645 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type
))
2649 ++cp_unevaluated_operand
;
2650 write_expression (DECLTYPE_TYPE_EXPR (type
));
2651 --cp_unevaluated_operand
;
2656 write_string ("Dn");
2662 sorry ("mangling %<typeof%>, use %<decltype%> instead");
2666 error ("use of built-in trait %qT in function signature; "
2667 "use library traits instead", type
);
2679 /* Types other than builtin types are substitution candidates. */
2680 if (!is_builtin_type
)
2681 add_substitution (type
);
2684 /* qsort callback for sorting a vector of attribute entries. */
2687 attr_strcmp (const void *p1
, const void *p2
)
2689 tree a1
= *(const tree
*)p1
;
2690 tree a2
= *(const tree
*)p2
;
2692 const attribute_spec
*as1
= lookup_attribute_spec (get_attribute_name (a1
));
2693 const attribute_spec
*as2
= lookup_attribute_spec (get_attribute_name (a2
));
2695 return strcmp (as1
->name
, as2
->name
);
2698 /* Return true if we should mangle a type attribute with name NAME. */
2701 mangle_type_attribute_p (tree name
)
2703 const attribute_spec
*as
= lookup_attribute_spec (name
);
2704 if (!as
|| !as
->affects_type_identity
)
2707 /* Skip internal-only attributes, which are distinguished from others
2708 by having a space. At present, all internal-only attributes that
2709 affect type identity are target-specific and are handled by
2710 targetm.mangle_type instead.
2712 Another reason to do this is that a space isn't a valid identifier
2713 character for most file formats. */
2714 if (strchr (IDENTIFIER_POINTER (name
), ' '))
2717 /* The following attributes are mangled specially. */
2718 if (is_attribute_p ("transaction_safe", name
))
2720 if (is_attribute_p ("abi_tag", name
))
2726 /* Non-terminal <CV-qualifiers> for type nodes. Returns the number of
2727 CV-qualifiers written for TYPE.
2729 <CV-qualifiers> ::= [r] [V] [K] */
2732 write_CV_qualifiers_for_type (const tree type
)
2734 int num_qualifiers
= 0;
2736 /* The order is specified by:
2738 "In cases where multiple order-insensitive qualifiers are
2739 present, they should be ordered 'K' (closest to the base type),
2740 'V', 'r', and 'U' (farthest from the base type) ..." */
2742 /* Mangle attributes that affect type identity as extended qualifiers.
2744 We don't do this with classes and enums because their attributes
2745 are part of their definitions, not something added on. */
2747 if (!OVERLOAD_TYPE_P (type
))
2750 for (tree a
= TYPE_ATTRIBUTES (type
); a
; a
= TREE_CHAIN (a
))
2751 if (mangle_type_attribute_p (get_attribute_name (a
)))
2753 if (abi_warn_or_compat_version_crosses (10) && !vec
.is_empty ())
2754 G
.need_abi_warning
= true;
2755 if (abi_version_at_least (10))
2757 vec
.qsort (attr_strcmp
);
2758 while (!vec
.is_empty())
2761 const attribute_spec
*as
2762 = lookup_attribute_spec (get_attribute_name (a
));
2765 write_unsigned_number (strlen (as
->name
));
2766 write_string (as
->name
);
2770 for (tree args
= TREE_VALUE (a
); args
;
2771 args
= TREE_CHAIN (args
))
2773 tree arg
= TREE_VALUE (args
);
2774 write_template_arg (arg
);
2784 /* Note that we do not use cp_type_quals below; given "const
2785 int[3]", the "const" is emitted with the "int", not with the
2787 cp_cv_quals quals
= TYPE_QUALS (type
);
2789 if (quals
& TYPE_QUAL_RESTRICT
)
2794 if (quals
& TYPE_QUAL_VOLATILE
)
2799 if (quals
& TYPE_QUAL_CONST
)
2805 return num_qualifiers
;
2808 /* Non-terminal <builtin-type>.
2810 <builtin-type> ::= v # void
2815 ::= h # unsigned char
2817 ::= t # unsigned short
2819 ::= j # unsigned int
2821 ::= m # unsigned long
2822 ::= x # long long, __int64
2823 ::= y # unsigned long long, __int64
2825 ::= o # unsigned __int128
2828 ::= e # long double, __float80
2829 ::= g # __float128 [not supported]
2830 ::= u <source-name> # vendor extended type */
2833 write_builtin_type (tree type
)
2835 if (TYPE_CANONICAL (type
))
2836 type
= TYPE_CANONICAL (type
);
2838 switch (TREE_CODE (type
))
2849 /* TYPE may still be wchar_t, char8_t, char16_t, or char32_t, since that
2850 isn't in integer_type_nodes. */
2851 if (type
== wchar_type_node
)
2853 else if (type
== char8_type_node
)
2854 write_string ("Du");
2855 else if (type
== char16_type_node
)
2856 write_string ("Ds");
2857 else if (type
== char32_type_node
)
2858 write_string ("Di");
2862 /* Assume TYPE is one of the shared integer type nodes. Find
2863 it in the array of these nodes. */
2865 for (itk
= 0; itk
< itk_none
; ++itk
)
2866 if (integer_types
[itk
] != NULL_TREE
2867 && integer_type_codes
[itk
] != '\0'
2868 && type
== integer_types
[itk
])
2870 /* Print the corresponding single-letter code. */
2871 write_char (integer_type_codes
[itk
]);
2875 if (itk
== itk_none
)
2877 tree t
= c_common_type_for_mode (TYPE_MODE (type
),
2878 TYPE_UNSIGNED (type
));
2885 if (TYPE_PRECISION (type
) == 128)
2886 write_char (TYPE_UNSIGNED (type
) ? 'o' : 'n');
2889 /* Allow for cases where TYPE is not one of the shared
2890 integer type nodes and write a "vendor extended builtin
2891 type" with a name the form intN or uintN, respectively.
2892 Situations like this can happen if you have an
2893 __attribute__((__mode__(__SI__))) type and use exotic
2894 switches like '-mint8' on AVR. Of course, this is
2895 undefined by the C++ ABI (and '-mint8' is not even
2896 Standard C conforming), but when using such special
2897 options you're pretty much in nowhere land anyway. */
2899 char prec
[11]; /* up to ten digits for an unsigned */
2901 prefix
= TYPE_UNSIGNED (type
) ? "uint" : "int";
2902 sprintf (prec
, "%u", (unsigned) TYPE_PRECISION (type
));
2903 write_char ('u'); /* "vendor extended builtin type" */
2904 write_unsigned_number (strlen (prefix
) + strlen (prec
));
2905 write_string (prefix
);
2906 write_string (prec
);
2913 if (type
== float_type_node
)
2915 else if (type
== double_type_node
)
2917 else if (type
== long_double_type_node
)
2919 else if (type
== dfloat32_type_node
)
2920 write_string ("Df");
2921 else if (type
== dfloat64_type_node
)
2922 write_string ("Dd");
2923 else if (type
== dfloat128_type_node
)
2924 write_string ("De");
2925 else if (type
== float16_type_node
)
2926 write_string ("DF16_");
2927 else if (type
== float32_type_node
)
2928 write_string ("DF32_");
2929 else if (type
== float64_type_node
)
2930 write_string ("DF64_");
2931 else if (type
== float128_type_node
)
2932 write_string ("DF128_");
2933 else if (type
== float32x_type_node
)
2934 write_string ("DF32x");
2935 else if (type
== float64x_type_node
)
2936 write_string ("DF64x");
2937 else if (type
== float128x_type_node
)
2938 write_string ("DF128x");
2939 else if (type
== bfloat16_type_node
)
2940 write_string ("DF16b");
2950 /* Non-terminal <function-type>. NODE is a FUNCTION_TYPE or
2951 METHOD_TYPE. The return type is mangled before the parameter
2954 <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */
2957 write_function_type (const tree type
)
2959 MANGLE_TRACE_TREE ("function-type", type
);
2961 /* For a pointer to member function, the function type may have
2962 cv-qualifiers, indicating the quals for the artificial 'this'
2964 if (TREE_CODE (type
) == METHOD_TYPE
)
2966 /* The first parameter must be a POINTER_TYPE pointing to the
2967 `this' parameter. */
2968 tree this_type
= class_of_this_parm (type
);
2969 write_CV_qualifiers_for_type (this_type
);
2972 write_exception_spec (TYPE_RAISES_EXCEPTIONS (type
));
2974 if (tx_safe_fn_type_p (type
))
2975 write_string ("Dx");
2978 /* We don't track whether or not a type is `extern "C"'. Note that
2979 you can have an `extern "C"' function that does not have
2980 `extern "C"' type, and vice versa:
2982 extern "C" typedef void function_t();
2983 function_t f; // f has C++ linkage, but its type is
2986 typedef void function_t();
2987 extern "C" function_t f; // Vice versa.
2990 write_bare_function_type (type
, /*include_return_type_p=*/1,
2992 if (FUNCTION_REF_QUALIFIED (type
))
2994 if (FUNCTION_RVALUE_QUALIFIED (type
))
3002 /* Non-terminal <bare-function-type>. TYPE is a FUNCTION_TYPE or
3003 METHOD_TYPE. If INCLUDE_RETURN_TYPE is nonzero, the return value
3004 is mangled before the parameter types. If non-NULL, DECL is
3005 FUNCTION_DECL for the function whose type is being emitted. */
3008 write_bare_function_type (const tree type
, const int include_return_type_p
,
3011 MANGLE_TRACE_TREE ("bare-function-type", type
);
3013 /* Mangle the return type, if requested. */
3014 if (include_return_type_p
)
3015 write_type (TREE_TYPE (type
));
3017 /* Now mangle the types of the arguments. */
3019 write_method_parms (TYPE_ARG_TYPES (type
),
3020 TREE_CODE (type
) == METHOD_TYPE
,
3025 /* Write the mangled representation of a method parameter list of
3026 types given in PARM_TYPES. If METHOD_P is nonzero, the function is
3027 considered a non-static method, and the this parameter is omitted.
3028 If non-NULL, DECL is the FUNCTION_DECL for the function whose
3029 parameters are being emitted. */
3032 write_method_parms (tree parm_types
, const int method_p
, const tree decl
)
3034 tree first_parm_type
;
3035 tree parm_decl
= decl
? DECL_ARGUMENTS (decl
) : NULL_TREE
;
3037 /* Assume this parameter type list is variable-length. If it ends
3038 with a void type, then it's not. */
3041 /* If this is a member function, skip the first arg, which is the
3043 "Member functions do not encode the type of their implicit this
3046 Similarly, there's no need to mangle artificial parameters, like
3047 the VTT parameters for constructors and destructors. */
3050 parm_types
= TREE_CHAIN (parm_types
);
3051 parm_decl
= parm_decl
? DECL_CHAIN (parm_decl
) : NULL_TREE
;
3053 while (parm_decl
&& DECL_ARTIFICIAL (parm_decl
))
3055 parm_types
= TREE_CHAIN (parm_types
);
3056 parm_decl
= DECL_CHAIN (parm_decl
);
3059 if (decl
&& ctor_omit_inherited_parms (decl
))
3060 /* Bring back parameters omitted from an inherited ctor. */
3061 parm_types
= FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (decl
));
3064 for (first_parm_type
= parm_types
;
3066 parm_types
= TREE_CHAIN (parm_types
))
3068 tree parm
= TREE_VALUE (parm_types
);
3069 if (parm
== void_type_node
)
3071 /* "Empty parameter lists, whether declared as () or
3072 conventionally as (void), are encoded with a void parameter
3074 if (parm_types
== first_parm_type
)
3076 /* If the parm list is terminated with a void type, it's
3079 /* A void type better be the last one. */
3080 gcc_assert (TREE_CHAIN (parm_types
) == NULL
);
3087 /* <builtin-type> ::= z # ellipsis */
3091 /* <class-enum-type> ::= <name> */
3094 write_class_enum_type (const tree type
)
3096 write_name (TYPE_NAME (type
), /*ignore_local_scope=*/0);
3099 /* Mangle a requirement REQ in a requires-expression. */
3102 write_requirement (tree req
)
3104 tree op
= TREE_OPERAND (req
, 0);
3106 switch (tree_code code
= TREE_CODE (req
))
3108 /* # simple-requirement or compound-requirement
3109 <requirement> ::= X <expression> [ N ] [ R <type-constraint> ] */
3113 write_expression (op
);
3114 if (code
== SIMPLE_REQ
)
3116 if (COMPOUND_REQ_NOEXCEPT_P (req
))
3118 if (tree constr
= TREE_OPERAND (req
, 1))
3121 write_type_constraint (PLACEHOLDER_TYPE_CONSTRAINTS (constr
));
3125 /* <requirement> ::= T <type> # type-requirement */
3131 /* <requirement> ::= Q <constraint-expression> # nested-requirement */
3134 write_constraint_expression (op
);
3142 /* # requires { ... }
3143 <expression> ::= rq <requirement>+ E
3144 # requires (...) { ... }
3145 <expression> ::= rQ <bare-function-type> _ <requirement>+ E */
3148 write_requires_expr (tree expr
)
3150 tree parms
= REQUIRES_EXPR_PARMS (expr
);
3153 write_string ("rQ");
3155 for (; parms
; parms
= DECL_CHAIN (parms
))
3156 write_type (cv_unqualified (TREE_TYPE (parms
)));
3161 write_string ("rq");
3163 for (tree reqs
= REQUIRES_EXPR_REQS (expr
); reqs
;
3164 reqs
= TREE_CHAIN (reqs
))
3165 write_requirement (TREE_VALUE (reqs
));
3170 /* Non-terminal <template-args>. ARGS is a TREE_VEC of template
3173 <template-args> ::= I <template-arg>* [Q <constraint-expr>] E */
3176 write_template_args (tree args
, tree parms
/*= NULL_TREE*/)
3181 MANGLE_TRACE_TREE ("template-args", args
);
3186 length
= TREE_VEC_LENGTH (args
);
3188 tree constraints
= NULL_TREE
;
3191 constraints
= TEMPLATE_PARMS_CONSTRAINTS (parms
);
3192 parms
= INNERMOST_TEMPLATE_PARMS (parms
);
3195 if (args
&& length
&& TREE_CODE (TREE_VEC_ELT (args
, 0)) == TREE_VEC
)
3197 /* We have nested template args. We want the innermost template
3199 args
= TREE_VEC_ELT (args
, length
- 1);
3200 length
= TREE_VEC_LENGTH (args
);
3202 if (TEMPLATE_ARGS_TYPE_CONSTRAINT_P (args
))
3203 /* Skip the constrained type. */
3207 bool implicit_parm_scope
= false;
3208 for (; i
< length
; ++i
)
3210 tree arg
= TREE_VEC_ELT (args
, i
);
3213 tree parm
= TREE_VEC_ELT (parms
, i
);
3214 tree decl
= TREE_VALUE (parm
);
3215 if (DECL_IMPLICIT_TEMPLATE_PARM_P (decl
)
3216 && !implicit_parm_scope
)
3218 /* The rest of the template parameters are based on generic
3219 function parameters, so any expressions in their
3220 type-constraints are in parameter scope. */
3221 implicit_parm_scope
= true;
3224 if (!template_parm_natural_p (arg
, parm
)
3226 write_template_param_decl (parm
);
3228 write_template_arg (arg
);
3230 if (implicit_parm_scope
)
3233 write_tparms_constraints (constraints
);
3240 <unqualified-name> <template-args>
3241 part of SCOPE_REF or COMPONENT_REF mangling. */
3244 write_member_name (tree member
)
3246 if (identifier_p (member
))
3248 if (IDENTIFIER_ANY_OP_P (member
))
3251 write_string ("on");
3253 write_unqualified_id (member
);
3255 else if (DECL_P (member
))
3257 gcc_assert (!DECL_OVERLOADED_OPERATOR_P (member
));
3258 write_unqualified_name (member
);
3260 else if (TREE_CODE (member
) == TEMPLATE_ID_EXPR
)
3262 tree name
= TREE_OPERAND (member
, 0);
3263 name
= OVL_FIRST (name
);
3264 write_member_name (name
);
3265 write_template_args (TREE_OPERAND (member
, 1));
3268 write_expression (member
);
3271 /* EXPR is a base COMPONENT_REF; write the minimized base conversion path for
3272 converting to BASE, or just the conversion of EXPR if BASE is null.
3274 "Given a fully explicit base path P := C_n -> ... -> C_0, the minimized base
3275 path Min(P) is defined as follows: let C_i be the last element for which the
3276 conversion to C_0 is unambiguous; if that element is C_n, the minimized path
3277 is C_n -> C_0; otherwise, the minimized path is Min(C_n -> ... -> C_i) ->
3280 We mangle the conversion to C_i if it's different from C_n. */
3283 write_base_ref (tree expr
, tree base
= NULL_TREE
)
3285 if (TREE_CODE (expr
) != COMPONENT_REF
)
3288 tree field
= TREE_OPERAND (expr
, 1);
3290 if (TREE_CODE (field
) != FIELD_DECL
|| !DECL_FIELD_IS_BASE (field
))
3293 tree object
= TREE_OPERAND (expr
, 0);
3295 tree binfo
= NULL_TREE
;
3298 tree cur
= TREE_TYPE (object
);
3299 binfo
= lookup_base (cur
, base
, ba_unique
, NULL
, tf_none
);
3302 /* We're at the end of the base conversion chain, so it can't be
3304 base
= TREE_TYPE (field
);
3306 if (binfo
== error_mark_node
)
3308 /* cur->base is ambiguous, so make the conversion to
3309 last explicit, expressed as a cast (last&)object. */
3310 tree last
= TREE_TYPE (expr
);
3311 write_string (OVL_OP_INFO (false, CAST_EXPR
)->mangled_name
);
3312 write_type (build_reference_type (last
));
3313 write_expression (object
);
3315 else if (write_base_ref (object
, base
))
3316 /* cur->base is unambiguous, but we had another base conversion
3317 underneath and wrote it out. */;
3319 /* No more base conversions, just write out the object. */
3320 write_expression (object
);
3325 /* The number of elements spanned by a RANGE_EXPR. */
3327 unsigned HOST_WIDE_INT
3328 range_expr_nelts (tree expr
)
3330 tree lo
= TREE_OPERAND (expr
, 0);
3331 tree hi
= TREE_OPERAND (expr
, 1);
3332 return tree_to_uhwi (hi
) - tree_to_uhwi (lo
) + 1;
3335 /* <expression> ::= <unary operator-name> <expression>
3336 ::= <binary operator-name> <expression> <expression>
3339 <expr-primary> ::= <template-param>
3340 ::= L <type> <value number> E # literal
3341 ::= L <mangled-name> E # external name
3342 ::= st <type> # sizeof
3343 ::= sr <type> <unqualified-name> # dependent name
3344 ::= sr <type> <unqualified-name> <template-args> */
3347 write_expression (tree expr
)
3349 enum tree_code code
= TREE_CODE (expr
);
3351 if (TREE_CODE (expr
) == TARGET_EXPR
)
3353 expr
= TARGET_EXPR_INITIAL (expr
);
3354 code
= TREE_CODE (expr
);
3357 /* Skip NOP_EXPR and CONVERT_EXPR. They can occur when (say) a pointer
3358 argument is converted (via qualification conversions) to another type. */
3359 while (CONVERT_EXPR_CODE_P (code
)
3360 || code
== IMPLICIT_CONV_EXPR
3361 || location_wrapper_p (expr
)
3362 /* Parentheses aren't mangled. */
3363 || code
== PAREN_EXPR
3364 || code
== NON_LVALUE_EXPR
3365 || (code
== VIEW_CONVERT_EXPR
3366 && TREE_CODE (TREE_OPERAND (expr
, 0)) == TEMPLATE_PARM_INDEX
))
3368 expr
= TREE_OPERAND (expr
, 0);
3369 code
= TREE_CODE (expr
);
3372 if (code
== BASELINK
3373 && (!type_unknown_p (expr
)
3374 || !BASELINK_QUALIFIED_P (expr
)))
3376 expr
= BASELINK_FUNCTIONS (expr
);
3377 code
= TREE_CODE (expr
);
3380 /* Handle pointers-to-members by making them look like expression
3382 if (code
== PTRMEM_CST
)
3384 expr
= build_nt (ADDR_EXPR
,
3385 build_qualified_name (/*type=*/NULL_TREE
,
3386 PTRMEM_CST_CLASS (expr
),
3387 PTRMEM_CST_MEMBER (expr
),
3388 /*template_p=*/false));
3389 code
= TREE_CODE (expr
);
3392 /* Handle template parameters. */
3393 if (code
== TEMPLATE_TYPE_PARM
3394 || code
== TEMPLATE_TEMPLATE_PARM
3395 || code
== BOUND_TEMPLATE_TEMPLATE_PARM
3396 || code
== TEMPLATE_PARM_INDEX
)
3397 write_template_param (expr
);
3398 /* Handle literals. */
3399 else if (TREE_CODE_CLASS (code
) == tcc_constant
3400 || code
== CONST_DECL
)
3401 write_template_arg_literal (expr
);
3402 else if (code
== EXCESS_PRECISION_EXPR
3403 && TREE_CODE (TREE_OPERAND (expr
, 0)) == REAL_CST
)
3404 write_template_arg_literal (fold_convert (TREE_TYPE (expr
),
3405 TREE_OPERAND (expr
, 0)));
3406 else if (code
== PARM_DECL
&& DECL_ARTIFICIAL (expr
))
3408 gcc_assert (id_equal (DECL_NAME (expr
), "this"));
3409 write_string ("fpT");
3411 else if (code
== PARM_DECL
)
3413 /* A function parameter used in a late-specified return type. */
3414 int index
= DECL_PARM_INDEX (expr
);
3415 int level
= DECL_PARM_LEVEL (expr
);
3416 int delta
= G
.parm_depth
- level
+ 1;
3417 gcc_assert (index
>= 1);
3421 gcc_checking_assert (delta
> 0);
3424 /* Let L be the number of function prototype scopes from the
3425 innermost one (in which the parameter reference occurs) up
3426 to (and including) the one containing the declaration of
3427 the referenced parameter. If the parameter declaration
3428 clause of the innermost function prototype scope has been
3429 completely seen, it is not counted (in that case -- which
3430 is perhaps the most common -- L can be zero). */
3432 write_unsigned_number (delta
- 1);
3436 write_compact_number (index
- 1);
3438 else if (DECL_P (expr
))
3441 write_mangled_name (expr
, false);
3444 else if (TREE_CODE (expr
) == SIZEOF_EXPR
)
3446 tree op
= TREE_OPERAND (expr
, 0);
3448 if (PACK_EXPANSION_P (op
))
3453 /* sZ rather than szDp. */
3454 write_string ("sZ");
3455 write_expression (PACK_EXPANSION_PATTERN (op
));
3460 if (SIZEOF_EXPR_TYPE_P (expr
))
3462 write_string ("st");
3463 write_type (TREE_TYPE (op
));
3465 else if (ARGUMENT_PACK_P (op
))
3467 tree args
= ARGUMENT_PACK_ARGS (op
);
3468 int length
= TREE_VEC_LENGTH (args
);
3471 /* Before v19 we wrongly mangled all single pack expansions with
3472 sZ, but now only for expressions, as types ICEd (95298). */
3475 tree arg
= TREE_VEC_ELT (args
, 0);
3476 if (TREE_CODE (arg
) == EXPR_PACK_EXPANSION
3484 /* sP <template-arg>* E # sizeof...(T), size of a captured
3485 template parameter pack from an alias template */
3486 write_string ("sP");
3487 for (int i
= 0; i
< length
; ++i
)
3488 write_template_arg (TREE_VEC_ELT (args
, i
));
3493 /* In GCC 5 we represented this sizeof wrong, with the effect
3494 that we mangled it as the last element of the pack. */
3495 tree arg
= TREE_VEC_ELT (args
, length
-1);
3498 write_string ("st");
3503 write_string ("sz");
3504 write_expression (arg
);
3508 else if (TYPE_P (TREE_OPERAND (expr
, 0)))
3510 write_string ("st");
3511 write_type (TREE_OPERAND (expr
, 0));
3516 else if (TREE_CODE (expr
) == ALIGNOF_EXPR
)
3518 if (!ALIGNOF_EXPR_STD_P (expr
))
3522 /* We used to mangle __alignof__ like alignof. */
3523 write_string ("u11__alignof__");
3524 write_template_arg (TREE_OPERAND (expr
, 0));
3529 if (TYPE_P (TREE_OPERAND (expr
, 0)))
3531 write_string ("at");
3532 write_type (TREE_OPERAND (expr
, 0));
3537 else if (code
== SCOPE_REF
3538 || code
== BASELINK
)
3541 if (code
== SCOPE_REF
)
3543 scope
= TREE_OPERAND (expr
, 0);
3544 member
= TREE_OPERAND (expr
, 1);
3545 if (BASELINK_P (member
))
3546 member
= BASELINK_FUNCTIONS (member
);
3550 scope
= BINFO_TYPE (BASELINK_ACCESS_BINFO (expr
));
3551 member
= BASELINK_FUNCTIONS (expr
);
3554 /* If the MEMBER is a real declaration, then the qualifying
3555 scope was not dependent. Ideally, we would not have a
3556 SCOPE_REF in those cases, but sometimes we do. If the second
3557 argument is a DECL, then the name must not have been
3559 if (DECL_P (member
))
3560 write_expression (member
);
3563 gcc_assert (code
!= BASELINK
|| BASELINK_QUALIFIED_P (expr
));
3564 write_string ("sr");
3566 write_member_name (member
);
3569 else if (INDIRECT_REF_P (expr
)
3570 && TREE_TYPE (TREE_OPERAND (expr
, 0))
3571 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr
, 0))))
3573 write_expression (TREE_OPERAND (expr
, 0));
3575 else if (identifier_p (expr
))
3577 /* An operator name appearing as a dependent name needs to be
3578 specially marked to disambiguate between a use of the operator
3579 name and a use of the operator in an expression. */
3580 if (IDENTIFIER_ANY_OP_P (expr
))
3581 write_string ("on");
3582 write_unqualified_id (expr
);
3584 else if (TREE_CODE (expr
) == TEMPLATE_ID_EXPR
)
3586 tree fn
= TREE_OPERAND (expr
, 0);
3587 if (!identifier_p (fn
))
3589 if (IDENTIFIER_ANY_OP_P (fn
))
3590 write_string ("on");
3591 write_unqualified_id (fn
);
3592 write_template_args (TREE_OPERAND (expr
, 1));
3594 else if (TREE_CODE (expr
) == MODOP_EXPR
)
3596 enum tree_code subop
= TREE_CODE (TREE_OPERAND (expr
, 1));
3597 const char *name
= OVL_OP_INFO (true, subop
)->mangled_name
;
3599 write_string (name
);
3600 write_expression (TREE_OPERAND (expr
, 0));
3601 write_expression (TREE_OPERAND (expr
, 2));
3603 else if (code
== NEW_EXPR
|| code
== VEC_NEW_EXPR
)
3605 /* ::= [gs] nw <expression>* _ <type> E
3606 ::= [gs] nw <expression>* _ <type> <initializer>
3607 ::= [gs] na <expression>* _ <type> E
3608 ::= [gs] na <expression>* _ <type> <initializer>
3609 <initializer> ::= pi <expression>* E */
3610 tree placement
= TREE_OPERAND (expr
, 0);
3611 tree type
= TREE_OPERAND (expr
, 1);
3612 tree nelts
= TREE_OPERAND (expr
, 2);
3613 tree init
= TREE_OPERAND (expr
, 3);
3616 gcc_assert (code
== NEW_EXPR
);
3617 if (TREE_OPERAND (expr
, 2))
3618 code
= VEC_NEW_EXPR
;
3620 if (NEW_EXPR_USE_GLOBAL (expr
))
3621 write_string ("gs");
3623 write_string (OVL_OP_INFO (false, code
)->mangled_name
);
3625 for (t
= placement
; t
; t
= TREE_CHAIN (t
))
3626 write_expression (TREE_VALUE (t
));
3633 ++processing_template_decl
;
3634 domain
= compute_array_index_type (NULL_TREE
, nelts
,
3635 tf_warning_or_error
);
3636 type
= build_cplus_array_type (type
, domain
);
3637 --processing_template_decl
;
3641 if (init
&& TREE_CODE (init
) == TREE_LIST
3642 && DIRECT_LIST_INIT_P (TREE_VALUE (init
)))
3643 write_expression (TREE_VALUE (init
));
3647 write_string ("pi");
3648 if (init
&& init
!= void_node
)
3649 for (t
= init
; t
; t
= TREE_CHAIN (t
))
3650 write_expression (TREE_VALUE (t
));
3654 else if (code
== DELETE_EXPR
|| code
== VEC_DELETE_EXPR
)
3656 gcc_assert (code
== DELETE_EXPR
);
3657 if (DELETE_EXPR_USE_VEC (expr
))
3658 code
= VEC_DELETE_EXPR
;
3660 if (DELETE_EXPR_USE_GLOBAL (expr
))
3661 write_string ("gs");
3663 write_string (OVL_OP_INFO (false, code
)->mangled_name
);
3665 write_expression (TREE_OPERAND (expr
, 0));
3667 else if (code
== THROW_EXPR
)
3669 tree op
= TREE_OPERAND (expr
, 0);
3672 write_string ("tw");
3673 write_expression (op
);
3676 write_string ("tr");
3678 else if (code
== NOEXCEPT_EXPR
)
3680 write_string ("nx");
3681 write_expression (TREE_OPERAND (expr
, 0));
3683 else if (code
== CONSTRUCTOR
)
3685 bool braced_init
= BRACE_ENCLOSED_INITIALIZER_P (expr
);
3686 tree etype
= TREE_TYPE (expr
);
3689 write_string ("il");
3692 write_string ("tl");
3696 /* If this is an undigested initializer, mangle it as written.
3697 COMPOUND_LITERAL_P doesn't actually distinguish between digested and
3698 undigested braced casts, but it should work to use it to distinguish
3699 between braced casts in a template signature (undigested) and template
3700 parm object values (digested), and all CONSTRUCTORS that get here
3701 should be one of those two cases. */
3702 bool undigested
= braced_init
|| COMPOUND_LITERAL_P (expr
);
3703 if (undigested
|| !zero_init_expr_p (expr
))
3705 /* Convert braced initializer lists to STRING_CSTs so that
3706 A<"Foo"> mangles the same as A<{'F', 'o', 'o', 0}> while
3707 still using the latter mangling for strings that
3708 originated as braced initializer lists. */
3709 expr
= braced_lists_to_strings (etype
, expr
);
3711 if (TREE_CODE (expr
) == CONSTRUCTOR
)
3713 vec
<constructor_elt
, va_gc
> *elts
= CONSTRUCTOR_ELTS (expr
);
3714 unsigned last_nonzero
= UINT_MAX
;
3715 constructor_elt
*ce
;
3718 for (HOST_WIDE_INT i
= 0; vec_safe_iterate (elts
, i
, &ce
); ++i
)
3719 if ((TREE_CODE (etype
) == UNION_TYPE
3720 && ce
->index
!= first_field (etype
))
3721 || !zero_init_expr_p (ce
->value
))
3724 if (undigested
|| last_nonzero
!= UINT_MAX
)
3725 for (HOST_WIDE_INT i
= 0; vec_safe_iterate (elts
, i
, &ce
); ++i
)
3727 if (i
> last_nonzero
)
3729 if (!undigested
&& TREE_CODE (etype
) == UNION_TYPE
)
3731 /* Express the active member as a designator. */
3732 write_string ("di");
3733 write_unqualified_name (ce
->index
);
3736 if (ce
->index
&& TREE_CODE (ce
->index
) == RANGE_EXPR
)
3737 reps
= range_expr_nelts (ce
->index
);
3738 for (unsigned j
= 0; j
< reps
; ++j
)
3739 write_expression (ce
->value
);
3744 gcc_assert (TREE_CODE (expr
) == STRING_CST
);
3745 write_expression (expr
);
3750 else if (code
== LAMBDA_EXPR
)
3752 /* [temp.over.link] Two lambda-expressions are never considered
3755 So just use the closure type mangling. */
3756 write_string ("tl");
3757 write_type (LAMBDA_EXPR_CLOSURE (expr
));
3760 else if (code
== REQUIRES_EXPR
)
3761 write_requires_expr (expr
);
3762 else if (dependent_name (expr
))
3764 tree name
= dependent_name (expr
);
3765 if (IDENTIFIER_ANY_OP_P (name
))
3768 write_string ("on");
3770 write_unqualified_id (name
);
3778 /* When we bind a variable or function to a non-type template
3779 argument with reference type, we create an ADDR_EXPR to show
3780 the fact that the entity's address has been taken. But, we
3781 don't actually want to output a mangling code for the `&'. */
3782 if (TREE_CODE (expr
) == ADDR_EXPR
3784 && TYPE_REF_P (TREE_TYPE (expr
)))
3786 expr
= TREE_OPERAND (expr
, 0);
3789 write_expression (expr
);
3793 code
= TREE_CODE (expr
);
3796 if (code
== COMPONENT_REF
)
3798 tree ob
= TREE_OPERAND (expr
, 0);
3800 if (TREE_CODE (ob
) == ARROW_EXPR
)
3802 write_string (OVL_OP_INFO (false, code
)->mangled_name
);
3803 ob
= TREE_OPERAND (ob
, 0);
3804 write_expression (ob
);
3806 else if (write_base_ref (expr
))
3808 else if (!is_dummy_object (ob
))
3810 write_string ("dt");
3811 write_expression (ob
);
3813 /* else, for a non-static data member with no associated object (in
3814 unevaluated context), use the unresolved-name mangling. */
3816 write_member_name (TREE_OPERAND (expr
, 1));
3820 /* If it wasn't any of those, recursively expand the expression. */
3821 name
= OVL_OP_INFO (false, code
)->mangled_name
;
3823 /* We used to mangle const_cast and static_cast like a C cast. */
3824 if (code
== CONST_CAST_EXPR
3825 || code
== STATIC_CAST_EXPR
)
3828 name
= OVL_OP_INFO (false, CAST_EXPR
)->mangled_name
;
3836 error ("use of built-in trait %qE in function signature; "
3837 "use library traits instead", expr
);
3841 sorry ("mangling %C", code
);
3847 write_string (name
);
3853 tree fn
= CALL_EXPR_FN (expr
);
3855 if (TREE_CODE (fn
) == ADDR_EXPR
)
3856 fn
= TREE_OPERAND (fn
, 0);
3858 /* Mangle a dependent name as the name, not whatever happens to
3859 be the first function in the overload set. */
3861 && type_dependent_expression_p_push (expr
))
3864 write_expression (fn
);
3867 for (i
= 0; i
< call_expr_nargs (expr
); ++i
)
3868 write_expression (CALL_EXPR_ARG (expr
, i
));
3873 write_type (TREE_TYPE (expr
));
3874 if (list_length (TREE_OPERAND (expr
, 0)) == 1)
3875 write_expression (TREE_VALUE (TREE_OPERAND (expr
, 0)));
3878 tree args
= TREE_OPERAND (expr
, 0);
3880 for (; args
; args
= TREE_CHAIN (args
))
3881 write_expression (TREE_VALUE (args
));
3886 case DYNAMIC_CAST_EXPR
:
3887 case REINTERPRET_CAST_EXPR
:
3888 case STATIC_CAST_EXPR
:
3889 case CONST_CAST_EXPR
:
3890 write_type (TREE_TYPE (expr
));
3891 write_expression (TREE_OPERAND (expr
, 0));
3894 case PREINCREMENT_EXPR
:
3895 case PREDECREMENT_EXPR
:
3901 /* In the middle-end, some expressions have more operands than
3902 they do in templates (and mangling). */
3903 len
= cp_tree_operand_length (expr
);
3905 for (i
= 0; i
< len
; ++i
)
3907 tree operand
= TREE_OPERAND (expr
, i
);
3908 /* As a GNU extension, the middle operand of a
3909 conditional may be omitted. Since expression
3910 manglings are supposed to represent the input token
3911 stream, there's no good way to mangle such an
3912 expression without extending the C++ ABI. */
3913 if (code
== COND_EXPR
&& i
== 1 && !operand
)
3915 error ("omitted middle operand to %<?:%> operand "
3916 "cannot be mangled");
3919 else if (FOLD_EXPR_P (expr
))
3921 /* The first 'operand' of a fold-expression is the operator
3922 that it folds over. */
3925 int fcode
= TREE_INT_CST_LOW (operand
);
3926 write_string (OVL_OP_INFO (false, fcode
)->mangled_name
);
3929 else if (code
== BINARY_LEFT_FOLD_EXPR
)
3931 /* The order of operands of the binary left and right
3932 folds is the same, but we want to mangle them in
3933 lexical order, i.e. non-pack first. */
3935 operand
= FOLD_EXPR_INIT (expr
);
3937 operand
= FOLD_EXPR_PACK (expr
);
3939 if (PACK_EXPANSION_P (operand
))
3940 operand
= PACK_EXPANSION_PATTERN (operand
);
3942 write_expression (operand
);
3948 /* Literal subcase of non-terminal <template-arg>.
3950 "Literal arguments, e.g. "A<42L>", are encoded with their type
3951 and value. Negative integer values are preceded with "n"; for
3952 example, "A<-42L>" becomes "1AILln42EE". The bool value false is
3953 encoded as 0, true as 1." */
3956 write_template_arg_literal (const tree value
)
3958 if (TREE_CODE (value
) == STRING_CST
)
3959 /* Temporarily mangle strings as braced initializer lists. */
3960 write_string ("tl");
3964 tree valtype
= TREE_TYPE (value
);
3965 write_type (valtype
);
3967 /* Write a null member pointer value as (type)0, regardless of its
3968 real representation. */
3969 if (null_member_pointer_value_p (value
))
3970 write_integer_cst (integer_zero_node
);
3972 switch (TREE_CODE (value
))
3975 write_integer_cst (DECL_INITIAL (value
));
3979 gcc_assert (!same_type_p (TREE_TYPE (value
), boolean_type_node
)
3980 || integer_zerop (value
) || integer_onep (value
));
3981 if (!(abi_version_at_least (14)
3982 && NULLPTR_TYPE_P (TREE_TYPE (value
))))
3983 write_integer_cst (value
);
3987 write_real_cst (value
);
3991 if (TREE_CODE (TREE_REALPART (value
)) == INTEGER_CST
3992 && TREE_CODE (TREE_IMAGPART (value
)) == INTEGER_CST
)
3994 write_integer_cst (TREE_REALPART (value
));
3996 write_integer_cst (TREE_IMAGPART (value
));
3998 else if (TREE_CODE (TREE_REALPART (value
)) == REAL_CST
3999 && TREE_CODE (TREE_IMAGPART (value
)) == REAL_CST
)
4001 write_real_cst (TREE_REALPART (value
));
4003 write_real_cst (TREE_IMAGPART (value
));
4011 /* Mangle strings the same as braced initializer lists. */
4012 unsigned n
= TREE_STRING_LENGTH (value
);
4013 const char *str
= TREE_STRING_POINTER (value
);
4015 /* Count the number of trailing nuls and subtract them from
4016 STRSIZE because they don't need to be mangled. */
4017 for (const char *p
= str
+ n
- 1; ; --p
)
4021 n
-= str
+ n
- !!*p
- p
;
4025 tree eltype
= TREE_TYPE (valtype
);
4026 for (const char *p
= str
; n
--; ++p
)
4029 write_type (eltype
);
4030 write_unsigned_number (*(const unsigned char*)p
);
4043 /* Non-terminal <template-arg>.
4045 <template-arg> ::= <type> # type
4046 ::= L <type> </value/ number> E # literal
4047 ::= LZ <name> E # external name
4048 ::= X <expression> E # expression */
4051 write_template_arg (tree node
)
4053 enum tree_code code
= TREE_CODE (node
);
4055 MANGLE_TRACE_TREE ("template-arg", node
);
4057 /* A template template parameter's argument list contains TREE_LIST
4058 nodes of which the value field is the actual argument. */
4059 if (code
== TREE_LIST
)
4061 node
= TREE_VALUE (node
);
4062 /* If it's a decl, deal with its type instead. */
4065 node
= TREE_TYPE (node
);
4066 code
= TREE_CODE (node
);
4070 if (VAR_P (node
) && DECL_NTTP_OBJECT_P (node
))
4071 /* We want to mangle the argument, not the var we stored it in. */
4072 node
= tparm_object_argument (node
);
4074 /* Strip a conversion added by convert_nontype_argument. */
4075 if (TREE_CODE (node
) == IMPLICIT_CONV_EXPR
)
4076 node
= TREE_OPERAND (node
, 0);
4077 if (REFERENCE_REF_P (node
))
4078 node
= TREE_OPERAND (node
, 0);
4079 if (TREE_CODE (node
) == NOP_EXPR
4080 && TYPE_REF_P (TREE_TYPE (node
)))
4082 /* Template parameters can be of reference type. To maintain
4083 internal consistency, such arguments use a conversion from
4084 address of object to reference type. */
4085 gcc_assert (TREE_CODE (TREE_OPERAND (node
, 0)) == ADDR_EXPR
);
4086 node
= TREE_OPERAND (TREE_OPERAND (node
, 0), 0);
4089 if (TREE_CODE (node
) == BASELINK
4090 && !type_unknown_p (node
))
4092 /* Before v6 we wrongly wrapped a class-scope function in X/E. */
4094 node
= BASELINK_FUNCTIONS (node
);
4097 if (ARGUMENT_PACK_P (node
))
4099 /* Expand the template argument pack. */
4100 tree args
= ARGUMENT_PACK_ARGS (node
);
4101 int i
, length
= TREE_VEC_LENGTH (args
);
4106 for (i
= 0; i
< length
; ++i
)
4107 write_template_arg (TREE_VEC_ELT (args
, i
));
4110 else if (TYPE_P (node
))
4112 else if (code
== TEMPLATE_DECL
)
4113 /* A template appearing as a template arg is a template template arg. */
4114 write_template_template_arg (node
);
4115 else if ((TREE_CODE_CLASS (code
) == tcc_constant
&& code
!= PTRMEM_CST
)
4116 || code
== CONST_DECL
4117 || null_member_pointer_value_p (node
))
4118 write_template_arg_literal (node
);
4119 else if (code
== EXCESS_PRECISION_EXPR
4120 && TREE_CODE (TREE_OPERAND (node
, 0)) == REAL_CST
)
4121 write_template_arg_literal (fold_convert (TREE_TYPE (node
),
4122 TREE_OPERAND (node
, 0)));
4123 else if (DECL_P (node
))
4126 /* Until ABI version 3, the underscore before the mangled name
4127 was incorrectly omitted. */
4131 write_string ("_Z");
4132 write_encoding (node
);
4137 /* Template arguments may be expressions. */
4139 write_expression (node
);
4144 /* <template-template-arg>
4146 ::= <substitution> */
4149 write_template_template_arg (const tree decl
)
4151 MANGLE_TRACE_TREE ("template-template-arg", decl
);
4153 if (find_substitution (decl
))
4155 write_name (decl
, /*ignore_local_scope=*/0);
4156 add_substitution (decl
);
4160 /* Non-terminal <array-type>. TYPE is an ARRAY_TYPE.
4162 <array-type> ::= A [</dimension/ number>] _ </element/ type>
4163 ::= A <expression> _ </element/ type>
4165 "Array types encode the dimension (number of elements) and the
4166 element type. For variable length arrays, the dimension (but not
4167 the '_' separator) is omitted."
4168 Note that for flexible array members, like for other arrays of
4169 unspecified size, the dimension is also omitted. */
4172 write_array_type (const tree type
)
4175 if (TYPE_DOMAIN (type
))
4179 index_type
= TYPE_DOMAIN (type
);
4180 /* The INDEX_TYPE gives the upper and lower bounds of the array.
4181 It's null for flexible array members which have no upper bound
4182 (this is a change from GCC 5 and prior where such members were
4183 incorrectly mangled as zero-length arrays). */
4184 if (tree max
= TYPE_MAX_VALUE (index_type
))
4186 if (TREE_CODE (max
) == INTEGER_CST
)
4188 /* The ABI specifies that we should mangle the number of
4189 elements in the array, not the largest allowed index. */
4190 offset_int wmax
= wi::to_offset (max
) + 1;
4191 /* Truncate the result - this will mangle [0, SIZE_INT_MAX]
4192 number of elements as zero. */
4193 wmax
= wi::zext (wmax
, TYPE_PRECISION (TREE_TYPE (max
)));
4194 gcc_assert (wi::fits_uhwi_p (wmax
));
4195 write_unsigned_number (wmax
.to_uhwi ());
4199 max
= TREE_OPERAND (max
, 0);
4200 write_expression (max
);
4205 write_type (TREE_TYPE (type
));
4208 /* Non-terminal <pointer-to-member-type> for pointer-to-member
4209 variables. TYPE is a pointer-to-member POINTER_TYPE.
4211 <pointer-to-member-type> ::= M </class/ type> </member/ type> */
4214 write_pointer_to_member_type (const tree type
)
4217 write_type (TYPE_PTRMEM_CLASS_TYPE (type
));
4218 write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type
));
4221 /* Non-terminal <template-param>. PARM is a TEMPLATE_TYPE_PARM,
4222 TEMPLATE_TEMPLATE_PARM, BOUND_TEMPLATE_TEMPLATE_PARM or a
4223 TEMPLATE_PARM_INDEX.
4225 <template-param> ::= T </parameter/ number> _ */
4228 write_template_param (const tree parm
)
4233 MANGLE_TRACE_TREE ("template-parm", parm
);
4235 switch (TREE_CODE (parm
))
4237 case TEMPLATE_TYPE_PARM
:
4238 case TEMPLATE_TEMPLATE_PARM
:
4239 case BOUND_TEMPLATE_TEMPLATE_PARM
:
4240 parm_index
= TEMPLATE_TYPE_IDX (parm
);
4241 level
= TEMPLATE_TYPE_LEVEL (parm
);
4244 case TEMPLATE_PARM_INDEX
:
4245 parm_index
= TEMPLATE_PARM_IDX (parm
);
4246 level
= TEMPLATE_PARM_LEVEL (parm
);
4259 write_compact_number (level
- 1);
4262 /* NUMBER as it appears in the mangling is (-1)-indexed, with the
4263 earliest template param denoted by `_'. */
4264 write_compact_number (parm_index
);
4267 /* <template-template-param>
4268 ::= <template-param>
4269 ::= <substitution> */
4272 write_template_template_param (const tree parm
)
4274 tree templ
= NULL_TREE
;
4276 /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the
4277 template template parameter. The substitution candidate here is
4278 only the template. */
4279 if (TREE_CODE (parm
) == BOUND_TEMPLATE_TEMPLATE_PARM
)
4282 = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm
));
4283 if (find_substitution (templ
))
4287 /* <template-param> encodes only the template parameter position,
4288 not its template arguments, which is fine here. */
4289 write_template_param (parm
);
4291 add_substitution (templ
);
4294 /* Non-terminal <substitution>.
4296 <substitution> ::= S <seq-id> _
4300 write_substitution (const int seq_id
)
4302 MANGLE_TRACE ("substitution", "");
4306 write_number (seq_id
- 1, /*unsigned=*/1, 36);
4310 /* Start mangling ENTITY. */
4313 start_mangling (const tree entity
)
4317 obstack_free (&name_obstack
, name_base
);
4318 mangle_obstack
= &name_obstack
;
4319 name_base
= obstack_alloc (&name_obstack
, 0);
4322 /* Done with mangling. Release the data. */
4325 finish_mangling_internal (void)
4327 /* Clear all the substitutions. */
4328 vec_safe_truncate (G
.substitutions
, 0);
4331 mangle_module_fini ();
4333 /* Null-terminate the string. */
4338 /* Like finish_mangling_internal, but return the mangled string. */
4340 static inline const char *
4341 finish_mangling (void)
4343 finish_mangling_internal ();
4344 return (const char *) obstack_finish (mangle_obstack
);
4347 /* Like finish_mangling_internal, but return an identifier. */
4350 finish_mangling_get_identifier (void)
4352 finish_mangling_internal ();
4353 /* Don't obstack_finish here, and the next start_mangling will
4354 remove the identifier. */
4355 return get_identifier ((const char *) obstack_base (mangle_obstack
));
4358 /* Initialize data structures for mangling. */
4363 gcc_obstack_init (&name_obstack
);
4364 name_base
= obstack_alloc (&name_obstack
, 0);
4365 vec_alloc (G
.substitutions
, 0);
4367 /* Cache these identifiers for quick comparison when checking for
4368 standard substitutions. */
4369 subst_identifiers
[SUBID_ALLOCATOR
] = get_identifier ("allocator");
4370 subst_identifiers
[SUBID_BASIC_STRING
] = get_identifier ("basic_string");
4371 subst_identifiers
[SUBID_CHAR_TRAITS
] = get_identifier ("char_traits");
4372 subst_identifiers
[SUBID_BASIC_ISTREAM
] = get_identifier ("basic_istream");
4373 subst_identifiers
[SUBID_BASIC_OSTREAM
] = get_identifier ("basic_ostream");
4374 subst_identifiers
[SUBID_BASIC_IOSTREAM
] = get_identifier ("basic_iostream");
4377 /* Generate a mangling for MODULE's global initializer fn. */
4380 mangle_module_global_init (int module
)
4382 start_mangling (NULL_TREE
);
4384 write_string ("_ZGI");
4385 write_module (module
, true);
4387 return finish_mangling_get_identifier ();
4390 /* Generate the mangled name of DECL. */
4393 mangle_decl_string (const tree decl
)
4396 tree saved_fn
= NULL_TREE
;
4397 bool template_p
= false;
4399 /* We shouldn't be trying to mangle an uninstantiated template. */
4400 gcc_assert (!type_dependent_expression_p (decl
));
4402 if (DECL_LANG_SPECIFIC (decl
) && DECL_USE_TEMPLATE (decl
))
4404 struct tinst_level
*tl
= current_instantiation ();
4405 if ((!tl
|| tl
->maybe_get_node () != decl
)
4406 && push_tinst_level (decl
))
4409 saved_fn
= current_function_decl
;
4410 current_function_decl
= NULL_TREE
;
4413 iloc_sentinel
ils (DECL_SOURCE_LOCATION (decl
));
4415 start_mangling (decl
);
4417 if (TREE_CODE (decl
) == TYPE_DECL
)
4418 write_type (TREE_TYPE (decl
));
4420 write_mangled_name (decl
, true);
4422 result
= finish_mangling_get_identifier ();
4424 fprintf (stderr
, "mangle_decl_string = '%s'\n\n",
4425 IDENTIFIER_POINTER (result
));
4430 current_function_decl
= saved_fn
;
4436 /* Return an identifier for the external mangled name of DECL. */
4439 get_mangled_id (tree decl
)
4441 tree id
= mangle_decl_string (decl
);
4442 return targetm
.mangle_decl_assembler_name (decl
, id
);
4445 /* Create an identifier for the external mangled name of DECL. */
4448 mangle_decl (const tree decl
)
4453 /* Don't bother mangling uninstantiated templates. */
4454 ++processing_template_decl
;
4455 if (TREE_CODE (decl
) == TYPE_DECL
)
4456 dep
= dependent_type_p (TREE_TYPE (decl
));
4458 dep
= (DECL_LANG_SPECIFIC (decl
) && DECL_TEMPLATE_INFO (decl
)
4459 && any_dependent_template_arguments_p (DECL_TI_ARGS (decl
)));
4460 --processing_template_decl
;
4464 /* During LTO we keep mangled names of TYPE_DECLs for ODR type merging.
4465 It is not needed to assign names to anonymous namespace, but we use the
4466 "<anon>" marker to be able to tell if type is C++ ODR type or type
4467 produced by other language. */
4468 if (TREE_CODE (decl
) == TYPE_DECL
4469 && TYPE_STUB_DECL (TREE_TYPE (decl
))
4470 && !TREE_PUBLIC (TYPE_STUB_DECL (TREE_TYPE (decl
))))
4471 id
= get_identifier ("<anon>");
4474 gcc_assert (TREE_CODE (decl
) != TYPE_DECL
4475 || !no_linkage_check (TREE_TYPE (decl
), true));
4476 if (abi_version_at_least (10))
4477 if (tree fn
= decl_function_context (decl
))
4478 maybe_check_abi_tags (fn
, decl
);
4479 id
= get_mangled_id (decl
);
4481 SET_DECL_ASSEMBLER_NAME (decl
, id
);
4483 if (G
.need_cxx17_warning
4484 && (TREE_PUBLIC (decl
) || DECL_REALLY_EXTERN (decl
)))
4485 warning_at (DECL_SOURCE_LOCATION (decl
), OPT_Wnoexcept_type
,
4486 "mangled name for %qD will change in C++17 because the "
4487 "exception specification is part of a function type",
4490 if (id
!= DECL_NAME (decl
)
4491 /* Don't do this for a fake symbol we aren't going to emit anyway. */
4492 && TREE_CODE (decl
) != TYPE_DECL
4493 && !DECL_MAYBE_IN_CHARGE_CDTOR_P (decl
))
4495 int save_ver
= flag_abi_version
;
4496 tree id2
= NULL_TREE
;
4498 if (!DECL_REALLY_EXTERN (decl
))
4500 record_mangling (decl
, G
.need_abi_warning
);
4502 if (!G
.need_abi_warning
)
4505 flag_abi_version
= flag_abi_compat_version
;
4506 id2
= mangle_decl_string (decl
);
4507 id2
= targetm
.mangle_decl_assembler_name (decl
, id2
);
4508 flag_abi_version
= save_ver
;
4511 note_mangling_alias (decl
, id2
);
4516 const char fabi_version
[] = "-fabi-version";
4518 if (flag_abi_compat_version
!= warn_abi_version
4519 || id2
== NULL_TREE
)
4521 flag_abi_version
= warn_abi_version
;
4522 id2
= mangle_decl_string (decl
);
4523 id2
= targetm
.mangle_decl_assembler_name (decl
, id2
);
4525 flag_abi_version
= save_ver
;
4529 else if (warn_abi_version
!= 0
4530 && abi_version_at_least (warn_abi_version
))
4531 warning_at (DECL_SOURCE_LOCATION (G
.entity
), OPT_Wabi
,
4532 "the mangled name of %qD changed between "
4533 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
4534 G
.entity
, fabi_version
, warn_abi_version
, id2
,
4535 fabi_version
, save_ver
, id
);
4537 warning_at (DECL_SOURCE_LOCATION (G
.entity
), OPT_Wabi
,
4538 "the mangled name of %qD changes between "
4539 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
4540 G
.entity
, fabi_version
, save_ver
, id
,
4541 fabi_version
, warn_abi_version
, id2
);
4544 flag_abi_version
= save_ver
;
4548 /* Generate the mangled representation of TYPE. */
4551 mangle_type_string (const tree type
)
4555 start_mangling (type
);
4557 result
= finish_mangling ();
4559 fprintf (stderr
, "mangle_type_string = '%s'\n\n", result
);
4563 /* Create an identifier for the mangled name of a special component
4564 for belonging to TYPE. CODE is the ABI-specified code for this
4568 mangle_special_for_type (const tree type
, const char *code
)
4572 /* We don't have an actual decl here for the special component, so
4573 we can't just process the <encoded-name>. Instead, fake it. */
4574 start_mangling (type
);
4576 /* Start the mangling. */
4577 write_string ("_Z");
4578 write_string (code
);
4582 result
= finish_mangling_get_identifier ();
4585 fprintf (stderr
, "mangle_special_for_type = %s\n\n",
4586 IDENTIFIER_POINTER (result
));
4591 /* Create an identifier for the mangled representation of the typeinfo
4592 structure for TYPE. */
4595 mangle_typeinfo_for_type (const tree type
)
4597 return mangle_special_for_type (type
, "TI");
4600 /* Create an identifier for the mangled name of the NTBS containing
4601 the mangled name of TYPE. */
4604 mangle_typeinfo_string_for_type (const tree type
)
4606 return mangle_special_for_type (type
, "TS");
4609 /* Create an identifier for the mangled name of the vtable for TYPE. */
4612 mangle_vtbl_for_type (const tree type
)
4614 return mangle_special_for_type (type
, "TV");
4617 /* Returns an identifier for the mangled name of the VTT for TYPE. */
4620 mangle_vtt_for_type (const tree type
)
4622 return mangle_special_for_type (type
, "TT");
4625 /* Returns an identifier for the mangled name of the decomposition
4626 artificial variable DECL. DECLS is the vector of the VAR_DECLs
4627 for the identifier-list. */
4630 mangle_decomp (const tree decl
, vec
<tree
> &decls
)
4632 gcc_assert (!type_dependent_expression_p (decl
));
4634 location_t saved_loc
= input_location
;
4635 input_location
= DECL_SOURCE_LOCATION (decl
);
4637 check_abi_tags (decl
);
4638 start_mangling (decl
);
4639 write_string ("_Z");
4641 tree context
= decl_mangling_context (decl
);
4642 gcc_assert (context
!= NULL_TREE
);
4644 bool nested
= false;
4646 if (DECL_NAMESPACE_STD_P (context
))
4647 write_string ("St");
4648 else if (TREE_CODE (context
) == FUNCTION_DECL
)
4652 write_encoding (context
);
4655 else if (context
!= global_namespace
)
4659 write_prefix (context
);
4662 write_string ("DC");
4665 FOR_EACH_VEC_ELT (decls
, i
, d
)
4666 write_unqualified_name (d
);
4669 if (tree tags
= get_abi_tags (decl
))
4671 /* We didn't emit ABI tags for structured bindings before ABI 19. */
4672 if (!G
.need_abi_warning
4673 && TREE_PUBLIC (decl
)
4674 && abi_warn_or_compat_version_crosses (19))
4675 G
.need_abi_warning
= 1;
4677 if (abi_version_at_least (19))
4678 write_abi_tags (tags
);
4683 else if (local
&& DECL_DISCRIMINATOR_P (decl
))
4684 write_discriminator (discriminator_for_local_entity (decl
));
4686 tree id
= finish_mangling_get_identifier ();
4688 fprintf (stderr
, "mangle_decomp = '%s'\n\n",
4689 IDENTIFIER_POINTER (id
));
4691 input_location
= saved_loc
;
4693 if (warn_abi
&& G
.need_abi_warning
)
4695 const char fabi_version
[] = "-fabi-version";
4697 int save_ver
= flag_abi_version
;
4699 if (flag_abi_version
!= warn_abi_version
)
4701 flag_abi_version
= warn_abi_version
;
4702 id2
= mangle_decomp (decl
, decls
);
4703 flag_abi_version
= save_ver
;
4708 else if (warn_abi_version
!= 0
4709 && abi_version_at_least (warn_abi_version
))
4710 warning_at (DECL_SOURCE_LOCATION (G
.entity
), OPT_Wabi
,
4711 "the mangled name of %qD changed between "
4712 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
4713 G
.entity
, fabi_version
, warn_abi_version
, id2
,
4714 fabi_version
, save_ver
, id
);
4716 warning_at (DECL_SOURCE_LOCATION (G
.entity
), OPT_Wabi
,
4717 "the mangled name of %qD changes between "
4718 "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)",
4719 G
.entity
, fabi_version
, save_ver
, id
,
4720 fabi_version
, warn_abi_version
, id2
);
4726 /* Return an identifier for a construction vtable group. TYPE is
4727 the most derived class in the hierarchy; BINFO is the base
4728 subobject for which this construction vtable group will be used.
4730 This mangling isn't part of the ABI specification; in the ABI
4731 specification, the vtable group is dumped in the same COMDAT as the
4732 main vtable, and is referenced only from that vtable, so it doesn't
4733 need an external name. For binary formats without COMDAT sections,
4734 though, we need external names for the vtable groups.
4736 We use the production
4738 <special-name> ::= CT <type> <offset number> _ <base type> */
4741 mangle_ctor_vtbl_for_type (const tree type
, const tree binfo
)
4745 start_mangling (type
);
4747 write_string ("_Z");
4748 write_string ("TC");
4750 write_integer_cst (BINFO_OFFSET (binfo
));
4752 write_type (BINFO_TYPE (binfo
));
4754 result
= finish_mangling_get_identifier ();
4756 fprintf (stderr
, "mangle_ctor_vtbl_for_type = %s\n\n",
4757 IDENTIFIER_POINTER (result
));
4761 /* Mangle a this pointer or result pointer adjustment.
4763 <call-offset> ::= h <fixed offset number> _
4764 ::= v <fixed offset number> _ <virtual offset number> _ */
4767 mangle_call_offset (const tree fixed_offset
, const tree virtual_offset
)
4769 write_char (virtual_offset
? 'v' : 'h');
4771 /* For either flavor, write the fixed offset. */
4772 write_integer_cst (fixed_offset
);
4775 /* For a virtual thunk, add the virtual offset. */
4778 write_integer_cst (virtual_offset
);
4783 /* Return an identifier for the mangled name of a this-adjusting or
4784 covariant thunk to FN_DECL. FIXED_OFFSET is the initial adjustment
4785 to this used to find the vptr. If VIRTUAL_OFFSET is non-NULL, this
4786 is a virtual thunk, and it is the vtbl offset in
4787 bytes. THIS_ADJUSTING is nonzero for a this adjusting thunk and
4788 zero for a covariant thunk. Note, that FN_DECL might be a covariant
4789 thunk itself. A covariant thunk name always includes the adjustment
4790 for the this pointer, even if there is none.
4792 <special-name> ::= T <call-offset> <base encoding>
4793 ::= Tc <this_adjust call-offset> <result_adjust call-offset>
4797 mangle_thunk (tree fn_decl
, const int this_adjusting
, tree fixed_offset
,
4798 tree virtual_offset
, tree thunk
)
4802 if (abi_version_at_least (11))
4803 maybe_check_abi_tags (fn_decl
, thunk
, 11);
4805 start_mangling (fn_decl
);
4807 write_string ("_Z");
4810 if (!this_adjusting
)
4812 /* Covariant thunk with no this adjustment */
4814 mangle_call_offset (integer_zero_node
, NULL_TREE
);
4815 mangle_call_offset (fixed_offset
, virtual_offset
);
4817 else if (!DECL_THUNK_P (fn_decl
))
4818 /* Plain this adjusting thunk. */
4819 mangle_call_offset (fixed_offset
, virtual_offset
);
4822 /* This adjusting thunk to covariant thunk. */
4824 mangle_call_offset (fixed_offset
, virtual_offset
);
4825 fixed_offset
= ssize_int (THUNK_FIXED_OFFSET (fn_decl
));
4826 virtual_offset
= THUNK_VIRTUAL_OFFSET (fn_decl
);
4828 virtual_offset
= BINFO_VPTR_FIELD (virtual_offset
);
4829 mangle_call_offset (fixed_offset
, virtual_offset
);
4830 fn_decl
= THUNK_TARGET (fn_decl
);
4834 write_encoding (fn_decl
);
4836 result
= finish_mangling_get_identifier ();
4838 fprintf (stderr
, "mangle_thunk = %s\n\n", IDENTIFIER_POINTER (result
));
4842 /* Handle ABI backwards compatibility for past bugs where we didn't call
4843 check_abi_tags in places where it's needed: call check_abi_tags and warn if
4844 it makes a difference. If FOR_DECL is non-null, it's the declaration
4845 that we're actually trying to mangle; if it's null, we're mangling the
4846 guard variable for T. */
4849 maybe_check_abi_tags (tree t
, tree for_decl
, int ver
)
4851 if (DECL_ASSEMBLER_NAME_SET_P (t
))
4854 tree oldtags
= get_abi_tags (t
);
4858 tree newtags
= get_abi_tags (t
);
4859 if (newtags
&& newtags
!= oldtags
4860 && abi_version_crosses (ver
))
4862 if (for_decl
&& DECL_THUNK_P (for_decl
))
4863 warning_at (DECL_SOURCE_LOCATION (t
), OPT_Wabi
,
4864 "the mangled name of a thunk for %qD changes between "
4865 "%<-fabi-version=%d%> and %<-fabi-version=%d%>",
4866 t
, flag_abi_version
, warn_abi_version
);
4868 warning_at (DECL_SOURCE_LOCATION (for_decl
), OPT_Wabi
,
4869 "the mangled name of %qD changes between "
4870 "%<-fabi-version=%d%> and %<-fabi-version=%d%>",
4871 for_decl
, flag_abi_version
, warn_abi_version
);
4873 warning_at (DECL_SOURCE_LOCATION (t
), OPT_Wabi
,
4874 "the mangled name of the initialization guard variable "
4875 "for %qD changes between %<-fabi-version=%d%> and "
4876 "%<-fabi-version=%d%>",
4877 t
, flag_abi_version
, warn_abi_version
);
4881 /* Write out the appropriate string for this variable when generating
4882 another mangled name based on this one. */
4885 write_guarded_var_name (const tree variable
)
4887 if (DECL_NAME (variable
)
4888 && startswith (IDENTIFIER_POINTER (DECL_NAME (variable
)), "_ZGR"))
4889 /* The name of a guard variable for a reference temporary should refer
4890 to the reference, not the temporary. */
4891 write_string (IDENTIFIER_POINTER (DECL_NAME (variable
)) + 4);
4892 else if (DECL_DECOMPOSITION_P (variable
)
4893 && DECL_NAME (variable
) == NULL_TREE
4894 && startswith (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (variable
)),
4896 /* The name of a guard variable for a structured binding needs special
4898 write_string (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (variable
)) + 2);
4900 write_name (variable
, /*ignore_local_scope=*/0);
4903 /* Return an identifier for the name of an initialization guard
4904 variable for indicated VARIABLE. */
4907 mangle_guard_variable (const tree variable
)
4909 if (abi_version_at_least (10))
4910 maybe_check_abi_tags (variable
);
4911 start_mangling (variable
);
4912 write_string ("_ZGV");
4913 write_guarded_var_name (variable
);
4914 return finish_mangling_get_identifier ();
4917 /* Return an identifier for the name of a thread_local initialization
4918 function for VARIABLE. */
4921 mangle_tls_init_fn (const tree variable
)
4923 check_abi_tags (variable
);
4924 start_mangling (variable
);
4925 write_string ("_ZTH");
4926 write_guarded_var_name (variable
);
4927 return finish_mangling_get_identifier ();
4930 /* Return an identifier for the name of a thread_local wrapper
4931 function for VARIABLE. */
4933 #define TLS_WRAPPER_PREFIX "_ZTW"
4936 mangle_tls_wrapper_fn (const tree variable
)
4938 check_abi_tags (variable
);
4939 start_mangling (variable
);
4940 write_string (TLS_WRAPPER_PREFIX
);
4941 write_guarded_var_name (variable
);
4942 return finish_mangling_get_identifier ();
4945 /* Return true iff FN is a thread_local wrapper function. */
4948 decl_tls_wrapper_p (const tree fn
)
4950 if (TREE_CODE (fn
) != FUNCTION_DECL
)
4952 tree name
= DECL_NAME (fn
);
4953 return startswith (IDENTIFIER_POINTER (name
), TLS_WRAPPER_PREFIX
);
4956 /* Return an identifier for the name of a temporary variable used to
4957 initialize a static reference. This is now part of the ABI. */
4960 mangle_ref_init_variable (const tree variable
)
4962 start_mangling (variable
);
4963 write_string ("_ZGR");
4964 check_abi_tags (variable
);
4965 write_guarded_var_name (variable
);
4966 /* Avoid name clashes with aggregate initialization of multiple
4967 references at once. */
4968 write_compact_number (current_ref_temp_count
++);
4969 return finish_mangling_get_identifier ();
4972 /* Return an identifier for the mangled name of a C++20 template parameter
4973 object for template argument EXPR. */
4976 mangle_template_parm_object (tree expr
)
4978 start_mangling (expr
);
4979 write_string ("_ZTAX");
4980 write_expression (expr
);
4982 return finish_mangling_get_identifier ();
4985 /* Given a CLASS_TYPE, such as a record for std::bad_exception this
4986 function generates a mangled name for the vtable map variable of
4987 the class type. For example, if the class type is
4988 "std::bad_exception", the mangled name for the class is
4989 "St13bad_exception". This function would generate the name
4990 "_ZN4_VTVISt13bad_exceptionE12__vtable_mapE", which unmangles as:
4991 "_VTV<std::bad_exception>::__vtable_map". */
4995 get_mangled_vtable_map_var_name (tree class_type
)
4997 char *var_name
= NULL
;
4998 const char *prefix
= "_ZN4_VTVI";
4999 const char *postfix
= "E12__vtable_mapE";
5001 gcc_assert (TREE_CODE (class_type
) == RECORD_TYPE
);
5003 tree class_id
= DECL_ASSEMBLER_NAME (TYPE_NAME (class_type
));
5005 if (strstr (IDENTIFIER_POINTER (class_id
), "<anon>") != NULL
)
5007 class_id
= get_mangled_id (TYPE_NAME (class_type
));
5008 vtbl_register_mangled_name (TYPE_NAME (class_type
), class_id
);
5011 unsigned int len
= strlen (IDENTIFIER_POINTER (class_id
)) +
5013 strlen (postfix
) + 1;
5015 var_name
= (char *) xmalloc (len
);
5017 sprintf (var_name
, "%s%s%s", prefix
, IDENTIFIER_POINTER (class_id
), postfix
);
5022 #include "gt-cp-mangle.h"