File: | build/gcc/cp/mangle.cc |
Warning: | line 1928, column 7 Value stored to 'chunk_digits' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* Name mangling for the 3.0 -*- C++ -*- ABI. |
2 | Copyright (C) 2000-2023 Free Software Foundation, Inc. |
3 | Written by Alex Samuel <samuel@codesourcery.com> |
4 | |
5 | This file is part of GCC. |
6 | |
7 | GCC is free software; you can redistribute it and/or modify it |
8 | under the terms of the GNU General Public License as published by |
9 | the Free Software Foundation; either version 3, or (at your option) |
10 | any later version. |
11 | |
12 | GCC is distributed in the hope that it will be useful, but |
13 | WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU General Public License |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ |
20 | |
21 | /* This file implements mangling of C++ names according to the IA64 |
22 | C++ ABI specification. A mangled name encodes a function or |
23 | variable's name, scope, type, and/or template arguments into a text |
24 | identifier. This identifier is used as the function's or |
25 | variable's linkage name, to preserve compatibility between C++'s |
26 | language features (templates, scoping, and overloading) and C |
27 | linkers. |
28 | |
29 | Additionally, g++ uses mangled names internally. To support this, |
30 | mangling of types is allowed, even though the mangled name of a |
31 | type should not appear by itself as an exported name. Ditto for |
32 | uninstantiated templates. |
33 | |
34 | The primary entry point for this module is mangle_decl, which |
35 | returns an identifier containing the mangled name for a decl. |
36 | Additional entry points are provided to build mangled names of |
37 | particular constructs when the appropriate decl for that construct |
38 | is not available. These are: |
39 | |
40 | mangle_typeinfo_for_type: typeinfo data |
41 | mangle_typeinfo_string_for_type: typeinfo type name |
42 | mangle_vtbl_for_type: virtual table data |
43 | mangle_vtt_for_type: VTT data |
44 | mangle_ctor_vtbl_for_type: `C-in-B' constructor virtual table data |
45 | mangle_thunk: thunk function or entry */ |
46 | |
47 | #include "config.h" |
48 | #include "system.h" |
49 | #include "coretypes.h" |
50 | #include "target.h" |
51 | #include "vtable-verify.h" |
52 | #include "cp-tree.h" |
53 | #include "stringpool.h" |
54 | #include "cgraph.h" |
55 | #include "stor-layout.h" |
56 | #include "flags.h" |
57 | #include "attribs.h" |
58 | |
59 | /* Debugging support. */ |
60 | |
61 | /* Define DEBUG_MANGLE to enable very verbose trace messages. */ |
62 | #ifndef DEBUG_MANGLE0 |
63 | #define DEBUG_MANGLE0 0 |
64 | #endif |
65 | |
66 | /* Macros for tracing the write_* functions. */ |
67 | #if DEBUG_MANGLE0 |
68 | # define MANGLE_TRACE(FN, INPUT) \ |
69 | fprintf (stderrstderr, " %-24s: %-24s\n", (FN), (INPUT)) |
70 | # define MANGLE_TRACE_TREE(FN, NODE) \ |
71 | fprintf (stderrstderr, " %-24s: %-24s (%p)\n", \ |
72 | (FN), get_tree_code_name (TREE_CODE (NODE)((enum tree_code) (NODE)->base.code)), (void *) (NODE)) |
73 | #else |
74 | # define MANGLE_TRACE(FN, INPUT) |
75 | # define MANGLE_TRACE_TREE(FN, NODE) |
76 | #endif |
77 | |
78 | /* Nonzero if NODE is a class template-id. We can't rely on |
79 | CLASSTYPE_USE_TEMPLATE here because of tricky bugs in the parser |
80 | that hard to distinguish A<T> from A, where A<T> is the type as |
81 | instantiated outside of the template, and A is the type used |
82 | without parameters inside the template. */ |
83 | #define CLASSTYPE_TEMPLATE_ID_P(NODE)(((enum tree_code) (NODE)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((((((enum tree_code) (NODE)->base.code)) == RECORD_TYPE || (((enum tree_code) (NODE)->base.code)) == UNION_TYPE) && ((tree_class_check ((NODE), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__))->type_non_common.lang_1)) != nullptr && (((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 83, __FUNCTION__, (TEMPLATE_INFO))))->tmpl)))) \ |
84 | (TREE_CODE (NODE)((enum tree_code) (NODE)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM \ |
85 | || (CLASS_TYPE_P (NODE)(((((enum tree_code) (NODE)->base.code)) == RECORD_TYPE || (((enum tree_code) (NODE)->base.code)) == UNION_TYPE) && ((tree_class_check ((NODE), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 85, __FUNCTION__))->type_common.lang_flag_5)) \ |
86 | && CLASSTYPE_TEMPLATE_INFO (NODE)(((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 86, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 86, __FUNCTION__))->type_non_common.lang_1)) != NULLnullptr \ |
87 | && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))(((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((tree_class_check (((tree_check3 ((NODE), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 87, __FUNCTION__, (TEMPLATE_INFO))))->tmpl)))) |
88 | |
89 | /* For deciding whether to set G.need_abi_warning, we need to consider both |
90 | warn_abi_version and flag_abi_compat_version. */ |
91 | #define abi_warn_or_compat_version_crosses(N)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (N)) != (warn_abi_version == 0 || warn_abi_version >= (N))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (N)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (N))) ) \ |
92 | (abi_version_crosses (N)((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (N)) != (warn_abi_version == 0 || warn_abi_version >= (N))) || abi_compat_version_crosses (N)((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (N)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (N)))) |
93 | |
94 | /* And sometimes we can simplify the code path if we don't need to worry about |
95 | previous ABIs. */ |
96 | #define abi_flag_at_least(flag,N)(flag == 0 || flag >= N) (flag == 0 || flag >= N) |
97 | #define any_abi_below(N)(!(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (N)) || !(warn_abi_version == 0 || warn_abi_version >= (N)) || !(global_options.x_flag_abi_compat_version == 0 || global_options .x_flag_abi_compat_version >= (N))) \ |
98 | (!abi_version_at_least (N)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (N)) \ |
99 | || !abi_flag_at_least (warn_abi_version, (N))(warn_abi_version == 0 || warn_abi_version >= (N)) \ |
100 | || !abi_flag_at_least (flag_abi_compat_version, (N))(global_options.x_flag_abi_compat_version == 0 || global_options .x_flag_abi_compat_version >= (N))) |
101 | |
102 | /* Things we only need one of. This module is not reentrant. */ |
103 | struct GTY(()) globals { |
104 | /* An array of the current substitution candidates, in the order |
105 | we've seen them. Contains NULLS, which correspond to module |
106 | substitutions. */ |
107 | vec<tree, va_gc> *substitutions; |
108 | |
109 | /* The entity that is being mangled. */ |
110 | tree GTY ((skip)) entity; |
111 | |
112 | /* How many parameter scopes we are inside. */ |
113 | int parm_depth; |
114 | |
115 | /* True if the mangling will be different in a future version of the |
116 | ABI. */ |
117 | bool need_abi_warning; |
118 | |
119 | /* True if the mangling will be different in C++17 mode. */ |
120 | bool need_cxx17_warning; |
121 | |
122 | /* True if we mangled a module name. */ |
123 | bool mod; |
124 | }; |
125 | |
126 | static GTY (()) globals G; |
127 | |
128 | /* The obstack on which we build mangled names. */ |
129 | static struct obstack *mangle_obstack; |
130 | |
131 | /* The obstack on which we build mangled names that are not going to |
132 | be IDENTIFIER_NODEs. */ |
133 | static struct obstack name_obstack; |
134 | |
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; |
138 | |
139 | /* Indices into subst_identifiers. These are identifiers used in |
140 | special substitution rules. */ |
141 | typedef enum |
142 | { |
143 | SUBID_ALLOCATOR, |
144 | SUBID_BASIC_STRING, |
145 | SUBID_CHAR_TRAITS, |
146 | SUBID_BASIC_ISTREAM, |
147 | SUBID_BASIC_OSTREAM, |
148 | SUBID_BASIC_IOSTREAM, |
149 | SUBID_MAX |
150 | } |
151 | substitution_identifier_index_t; |
152 | |
153 | /* For quick substitution checks, look up these common identifiers |
154 | once only. */ |
155 | static GTY(()) tree subst_identifiers[SUBID_MAX]; |
156 | |
157 | /* Single-letter codes for builtin integer types, defined in |
158 | <builtin-type>. These are indexed by integer_type_kind values. */ |
159 | static const char |
160 | integer_type_codes[itk_none] = |
161 | { |
162 | 'c', /* itk_char */ |
163 | 'a', /* itk_signed_char */ |
164 | 'h', /* itk_unsigned_char */ |
165 | 's', /* itk_short */ |
166 | 't', /* itk_unsigned_short */ |
167 | 'i', /* itk_int */ |
168 | 'j', /* itk_unsigned_int */ |
169 | 'l', /* itk_long */ |
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' |
175 | }; |
176 | |
177 | static tree maybe_template_info (const tree); |
178 | |
179 | /* Functions for handling substitutions. */ |
180 | |
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); |
189 | |
190 | /* Functions for emitting mangled representations of things. */ |
191 | |
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_INTlong, const unsigned int, char *, |
208 | const unsigned int); |
209 | static void write_number (unsigned HOST_WIDE_INTlong, const int, |
210 | const unsigned 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); |
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(tree) nullptr, int = 10); |
241 | static bool equal_abi_tags (tree, tree); |
242 | |
243 | /* Control functions. */ |
244 | |
245 | static inline void start_mangling (const tree); |
246 | static tree mangle_special_for_type (const tree, const char *); |
247 | |
248 | /* Append a single character to the end of the mangled |
249 | representation. */ |
250 | #define write_char(CHAR)__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = ((CHAR)))); }) \ |
251 | obstack_1grow (mangle_obstack, (CHAR))__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = ((CHAR)))); }) |
252 | |
253 | /* Append a sized buffer to the end of the mangled representation. */ |
254 | #define write_chars(CHAR, LEN)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((LEN)); if (__extension__ ({ struct obstack const * __o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (CHAR), __len); __o->next_free += __len; ( void) 0; }) \ |
255 | obstack_grow (mangle_obstack, (CHAR), (LEN))__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((LEN)); if (__extension__ ({ struct obstack const * __o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (CHAR), __len); __o->next_free += __len; ( void) 0; }) |
256 | |
257 | /* Append a NUL-terminated string to the end of the mangled |
258 | representation. */ |
259 | #define write_string(STRING)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (STRING)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (STRING), __len); __o->next_free += __len ; (void) 0; }) \ |
260 | obstack_grow (mangle_obstack, (STRING), strlen (STRING))__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (STRING)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (STRING), __len); __o->next_free += __len ; (void) 0; }) |
261 | |
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 |
265 | is used for. */ |
266 | #define NESTED_TEMPLATE_MATCH(NODE1, NODE2)(((enum tree_code) (NODE1)->base.code) == TREE_LIST && ((enum tree_code) (NODE2)->base.code) == TREE_LIST && (((tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.purpose))->base .code))] == tcc_type) && comptypes ((((tree_check ((NODE1 ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.purpose)), (((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.purpose)), 0)) || ((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.purpose) == ((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.purpose)) && ((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.value) == ((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 266, __FUNCTION__, (TREE_LIST)))->list.value)) \ |
267 | (TREE_CODE (NODE1)((enum tree_code) (NODE1)->base.code) == TREE_LIST \ |
268 | && TREE_CODE (NODE2)((enum tree_code) (NODE2)->base.code) == TREE_LIST \ |
269 | && ((TYPE_P (TREE_PURPOSE (NODE1))(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 269, __FUNCTION__, (TREE_LIST)))->list.purpose))->base .code))] == tcc_type) \ |
270 | && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2))comptypes ((((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 270, __FUNCTION__, (TREE_LIST)))->list.purpose)), (((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 270, __FUNCTION__, (TREE_LIST)))->list.purpose)), 0)) \ |
271 | || TREE_PURPOSE (NODE1)((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 271, __FUNCTION__, (TREE_LIST)))->list.purpose) == TREE_PURPOSE (NODE2)((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 271, __FUNCTION__, (TREE_LIST)))->list.purpose)) \ |
272 | && TREE_VALUE (NODE1)((tree_check ((NODE1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 272, __FUNCTION__, (TREE_LIST)))->list.value) == TREE_VALUE (NODE2)((tree_check ((NODE2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 272, __FUNCTION__, (TREE_LIST)))->list.value)) |
273 | |
274 | /* Write out an unsigned quantity in base 10. */ |
275 | #define write_unsigned_number(NUMBER)write_number ((NUMBER), 1, 10) \ |
276 | write_number ((NUMBER), /*unsigned_p=*/1, 10) |
277 | |
278 | /* If DECL is a template instance (including the uninstantiated template |
279 | itself), return its TEMPLATE_INFO. Otherwise return NULL. */ |
280 | |
281 | static tree |
282 | maybe_template_info (const tree decl) |
283 | { |
284 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL) |
285 | { |
286 | /* TYPE_DECLs are handled specially. Look at its type to decide |
287 | if this is a template instantiation. */ |
288 | const tree type = TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 288, __FUNCTION__))->typed.type); |
289 | |
290 | if (CLASS_TYPE_P (type)(((((enum tree_code) (type)->base.code)) == RECORD_TYPE || (((enum tree_code) (type)->base.code)) == UNION_TYPE) && ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->type_common.lang_flag_5)) && CLASSTYPE_TEMPLATE_ID_P (type)(((enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((((((enum tree_code) (type)->base.code)) == RECORD_TYPE || (((enum tree_code) (type)->base.code)) == UNION_TYPE) && ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->type_non_common.lang_1)) != nullptr && (((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((((struct tree_template_info*)(tree_check ((((( tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 290, __FUNCTION__, (TEMPLATE_INFO))))->tmpl))))) |
291 | return TYPE_TEMPLATE_INFO (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || (((enum tree_code) (type)->base.code) == RECORD_TYPE || ((enum tree_code) (type)->base.code) == UNION_TYPE || ((enum tree_code) (type)->base.code) == QUAL_UNION_TYPE) ? ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 291, __FUNCTION__))->type_non_common.lang_1) : (tree) nullptr ); |
292 | } |
293 | else |
294 | { |
295 | /* Check if the template is a primary template. */ |
296 | if (DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 296, __FUNCTION__))->decl_common.lang_specific) != NULLnullptr |
297 | && VAR_OR_FUNCTION_DECL_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL || ((enum tree_code) (decl)->base.code) == FUNCTION_DECL) |
298 | && DECL_TEMPLATE_INFO (decl)(((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 298, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 298, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info) |
299 | && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl))(((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((((struct tree_template_info*)(tree_check (((((contains_struct_check ( (template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 299, __FUNCTION__, (TEMPLATE_INFO))))->tmpl))) |
300 | return DECL_TEMPLATE_INFO (decl)(((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 300, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 300, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info); |
301 | } |
302 | |
303 | /* It's not a template id. */ |
304 | return NULL_TREE(tree) nullptr; |
305 | } |
306 | |
307 | /* Produce debugging output of current substitution candidates. */ |
308 | |
309 | static void |
310 | dump_substitution_candidates (void) |
311 | { |
312 | unsigned i; |
313 | tree el; |
314 | |
315 | fprintf (stderrstderr, " ++ substitutions "); |
316 | FOR_EACH_VEC_ELT (*G.substitutions, i, el)for (i = 0; (*G.substitutions).iterate ((i), &(el)); ++(i )) |
317 | { |
318 | const char *name = "???"; |
319 | |
320 | if (i > 0) |
321 | fprintf (stderrstderr, " "); |
322 | if (!el) |
323 | name = "module"; |
324 | else if (DECL_P (el)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (el)->base.code))] == tcc_declaration)) |
325 | name = IDENTIFIER_POINTER (DECL_NAME (el))((const char *) (tree_check ((((contains_struct_check ((el), ( TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 325, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 325, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ); |
326 | else if (TREE_CODE (el)((enum tree_code) (el)->base.code) == TREE_LIST) |
327 | name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el)))((const char *) (tree_check ((((contains_struct_check ((((tree_check ((el), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 327, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 327, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 327, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ); |
328 | else if (TYPE_NAME (el)((tree_class_check ((el), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 328, __FUNCTION__))->type_common.name)) |
329 | name = TYPE_NAME_STRING (el)(((const char *) (tree_check (((((tree_class_check ((el), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((el), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__))->type_common.name))->base.code))] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((el), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((el), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__))->type_common.name))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 329, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str )); |
330 | fprintf (stderrstderr, " S%d_ = ", i - 1); |
331 | if (el) |
332 | { |
333 | if (TYPE_P (el)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (el)->base.code))] == tcc_type) && |
334 | (CP_TYPE_RESTRICT_P (el)((cp_type_quals (el) & TYPE_QUAL_RESTRICT) != 0) |
335 | || CP_TYPE_VOLATILE_P (el)((cp_type_quals (el) & TYPE_QUAL_VOLATILE) != 0) |
336 | || CP_TYPE_CONST_P (el)((cp_type_quals (el) & TYPE_QUAL_CONST) != 0))) |
337 | fprintf (stderrstderr, "CV-"); |
338 | fprintf (stderrstderr, "%s (%s at %p)", |
339 | name, get_tree_code_name (TREE_CODE (el)((enum tree_code) (el)->base.code)), (void *) el); |
340 | } |
341 | fprintf (stderrstderr, "\n"); |
342 | } |
343 | } |
344 | |
345 | /* <exception-spec> ::= |
346 | Do -- non-throwing exception specification |
347 | DO <expression> E -- computed (instantiation-dependent) noexcept |
348 | Dw <type>* E -- throw (types) */ |
349 | |
350 | static void |
351 | write_exception_spec (tree spec) |
352 | { |
353 | |
354 | if (!spec || spec == noexcept_false_speccp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC]) |
355 | /* Nothing. */ |
356 | return; |
357 | |
358 | if (!flag_noexcept_type) |
359 | { |
360 | G.need_cxx17_warning = true; |
361 | return; |
362 | } |
363 | |
364 | if (spec == noexcept_true_speccp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC] || spec == empty_except_speccp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]) |
365 | write_string ("Do")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Do")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Do"), __len); __o->next_free += __len ; (void) 0; }); |
366 | else if (tree expr = TREE_PURPOSE (spec)((tree_check ((spec), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 366, __FUNCTION__, (TREE_LIST)))->list.purpose)) |
367 | { |
368 | /* noexcept (expr) */ |
369 | gcc_assert (uses_template_parms (expr))((void)(!(uses_template_parms (expr)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 369, __FUNCTION__), 0 : 0)); |
370 | write_string ("DO")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DO")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DO"), __len); __o->next_free += __len ; (void) 0; }); |
371 | write_expression (expr); |
372 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
373 | } |
374 | else |
375 | { |
376 | /* throw (type-list) */ |
377 | write_string ("Dw")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dw")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dw"), __len); __o->next_free += __len ; (void) 0; }); |
378 | for (tree t = spec; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 378, __FUNCTION__))->common.chain)) |
379 | write_type (TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 379, __FUNCTION__, (TREE_LIST)))->list.value)); |
380 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
381 | } |
382 | } |
383 | |
384 | /* Both decls and types can be substitution candidates, but sometimes |
385 | they refer to the same thing. For instance, a TYPE_DECL and |
386 | RECORD_TYPE for the same class refer to the same thing, and should |
387 | be treated accordingly in substitutions. This function returns a |
388 | canonicalized tree node representing NODE that is used when adding |
389 | and substitution candidates and finding matches. */ |
390 | |
391 | static inline tree |
392 | canonicalize_for_substitution (tree node) |
393 | { |
394 | /* For a TYPE_DECL, use the type instead. */ |
395 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == TYPE_DECL) |
396 | node = TREE_TYPE (node)((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 396, __FUNCTION__))->typed.type); |
397 | if (TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type) |
398 | && TYPE_CANONICAL (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 398, __FUNCTION__))->type_common.canonical) != node |
399 | && TYPE_MAIN_VARIANT (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 399, __FUNCTION__))->type_common.main_variant) != node) |
400 | { |
401 | tree orig = node; |
402 | /* Here we want to strip the topmost typedef only. |
403 | We need to do that so is_std_substitution can do proper |
404 | name matching. */ |
405 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == FUNCTION_TYPE) |
406 | /* Use build_qualified_type and TYPE_QUALS here to preserve |
407 | the old buggy mangling of attribute noreturn with abi<5. */ |
408 | node = build_qualified_type (TYPE_MAIN_VARIANT (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 408, __FUNCTION__))->type_common.main_variant), |
409 | TYPE_QUALS (node)((int) ((((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 409, __FUNCTION__))->base.readonly_flag) * TYPE_QUAL_CONST ) | (((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 409, __FUNCTION__))->base.volatile_flag) * TYPE_QUAL_VOLATILE ) | (((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 409, __FUNCTION__))->base.u.bits.atomic_flag) * TYPE_QUAL_ATOMIC ) | (((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 409, __FUNCTION__))->type_common.restrict_flag) * TYPE_QUAL_RESTRICT ) | (((((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 409, __FUNCTION__))->base.u.bits.address_space) & 0xFF ) << 8))))); |
410 | else |
411 | node = cp_build_qualified_type (TYPE_MAIN_VARIANT (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 411, __FUNCTION__))->type_common.main_variant), |
412 | cp_type_quals (node)); |
413 | if (FUNC_OR_METHOD_TYPE_P (node)(((enum tree_code) (node)->base.code) == FUNCTION_TYPE || ( (enum tree_code) (node)->base.code) == METHOD_TYPE)) |
414 | { |
415 | node = build_ref_qualified_type (node, type_memfn_rqual (orig)); |
416 | tree r = canonical_eh_spec (TYPE_RAISES_EXCEPTIONS (orig)((tree_class_check (((tree_check2 ((orig), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 416, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 416, __FUNCTION__))->type_non_common.lang_1)); |
417 | if (flag_noexcept_type) |
418 | node = build_exception_variant (node, r); |
419 | else |
420 | /* Set the warning flag if appropriate. */ |
421 | write_exception_spec (r); |
422 | } |
423 | } |
424 | return node; |
425 | } |
426 | |
427 | /* Add NODE as a substitution candidate. NODE must not already be on |
428 | the list of candidates. */ |
429 | |
430 | static void |
431 | add_substitution (tree node) |
432 | { |
433 | tree c; |
434 | |
435 | if (DEBUG_MANGLE0) |
436 | fprintf (stderrstderr, " ++ add_substitution (%s at %10p)\n", |
437 | get_tree_code_name (TREE_CODE (node)((enum tree_code) (node)->base.code)), (void *) node); |
438 | |
439 | /* Get the canonicalized substitution candidate for NODE. */ |
440 | c = canonicalize_for_substitution (node); |
441 | if (DEBUG_MANGLE0 && c != node) |
442 | fprintf (stderrstderr, " ++ using candidate (%s at %10p)\n", |
443 | get_tree_code_name (TREE_CODE (node)((enum tree_code) (node)->base.code)), (void *) node); |
444 | node = c; |
445 | |
446 | /* Make sure NODE isn't already a candidate. */ |
447 | if (flag_checkingglobal_options.x_flag_checking) |
448 | { |
449 | int i; |
450 | tree candidate; |
451 | |
452 | FOR_EACH_VEC_SAFE_ELT (G.substitutions, i, candidate)for (i = 0; vec_safe_iterate ((G.substitutions), (i), &(candidate )); ++(i)) |
453 | if (candidate) |
454 | { |
455 | gcc_assert (!(DECL_P (node) && node == candidate))((void)(!(!((tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) (node)->base.code))] == tcc_declaration ) && node == candidate)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 455, __FUNCTION__), 0 : 0)); |
456 | gcc_assert (!(TYPE_P (node) && TYPE_P (candidate)((void)(!(!((tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) (node)->base.code))] == tcc_type) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (candidate)->base.code))] == tcc_type) && comptypes ((node), (candidate), 0))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 457, __FUNCTION__), 0 : 0)) |
457 | && same_type_p (node, candidate)))((void)(!(!((tree_code_type_tmpl <0>::tree_code_type[(int ) (((enum tree_code) (node)->base.code))] == tcc_type) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (candidate)->base.code))] == tcc_type) && comptypes ((node), (candidate), 0))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 457, __FUNCTION__), 0 : 0)); |
458 | } |
459 | } |
460 | |
461 | /* Put the decl onto the varray of substitution candidates. */ |
462 | vec_safe_push (G.substitutions, node); |
463 | |
464 | if (DEBUG_MANGLE0) |
465 | dump_substitution_candidates (); |
466 | } |
467 | |
468 | /* Helper function for find_substitution. Returns nonzero if NODE, |
469 | which may be a decl or a CLASS_TYPE, is a template-id with template |
470 | name of substitution_index[INDEX] in the ::std namespace, with |
471 | global module attachment. */ |
472 | |
473 | static bool |
474 | is_std_substitution (const tree node, |
475 | const substitution_identifier_index_t index) |
476 | { |
477 | tree type = NULLnullptr; |
478 | tree decl = NULLnullptr; |
479 | |
480 | if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration)) |
481 | { |
482 | type = TREE_TYPE (node)((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 482, __FUNCTION__))->typed.type); |
483 | decl = node; |
484 | } |
485 | else if (CLASS_TYPE_P (node)(((((enum tree_code) (node)->base.code)) == RECORD_TYPE || (((enum tree_code) (node)->base.code)) == UNION_TYPE) && ((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 485, __FUNCTION__))->type_common.lang_flag_5))) |
486 | { |
487 | type = node; |
488 | decl = TYPE_NAME (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 488, __FUNCTION__))->type_common.name); |
489 | } |
490 | else |
491 | /* These are not the droids you're looking for. */ |
492 | return false; |
493 | |
494 | if (!DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))(((!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 494, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 494, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 494, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL])) == cp_global_trees[CPTI_STD])) |
495 | return false; |
496 | |
497 | if (!(TYPE_LANG_SPECIFIC (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 497, __FUNCTION__))->type_with_lang_specific.lang_specific ) && TYPE_TEMPLATE_INFO (type)(((enum tree_code) (type)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || (((enum tree_code) (type)->base.code) == RECORD_TYPE || ((enum tree_code) (type)->base.code) == UNION_TYPE || ((enum tree_code) (type)->base.code) == QUAL_UNION_TYPE) ? ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 497, __FUNCTION__))->type_non_common.lang_1) : (tree) nullptr ))) |
498 | return false; |
499 | |
500 | tree tmpl = TYPE_TI_TEMPLATE (type)(((struct tree_template_info*)(tree_check (((((enum tree_code ) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((( enum tree_code) (type)->base.code) == RECORD_TYPE || ((enum tree_code) (type)->base.code) == UNION_TYPE || ((enum tree_code ) (type)->base.code) == QUAL_UNION_TYPE) ? ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 500, __FUNCTION__))->type_non_common.lang_1) : (tree) nullptr )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 500, __FUNCTION__, (TEMPLATE_INFO))))->tmpl); |
501 | if (DECL_NAME (tmpl)((contains_struct_check ((tmpl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 501, __FUNCTION__))->decl_minimal.name) != subst_identifiers[index]) |
502 | return false; |
503 | |
504 | if (modules_p () && get_originating_module (tmpl, true) >= 0) |
505 | return false; |
506 | |
507 | return true; |
508 | } |
509 | |
510 | /* Return the ABI tags (the TREE_VALUE of the "abi_tag" attribute entry) for T, |
511 | which can be a decl or type. */ |
512 | |
513 | static tree |
514 | get_abi_tags (tree t) |
515 | { |
516 | if (!t || TREE_CODE (t)((enum tree_code) (t)->base.code) == NAMESPACE_DECL) |
517 | return NULL_TREE(tree) nullptr; |
518 | |
519 | if (DECL_P (t)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (t)->base.code))] == tcc_declaration) && DECL_DECLARES_TYPE_P (t)(((enum tree_code) (t)->base.code) == TYPE_DECL || (((enum tree_code) (t)->base.code) == TEMPLATE_DECL && (( struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 519, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 519, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == TYPE_DECL))) |
520 | t = TREE_TYPE (t)((contains_struct_check ((t), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 520, __FUNCTION__))->typed.type); |
521 | |
522 | tree attrs; |
523 | if (TYPE_P (t)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (t)->base.code))] == tcc_type)) |
524 | attrs = TYPE_ATTRIBUTES (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 524, __FUNCTION__))->type_common.attributes); |
525 | else |
526 | attrs = DECL_ATTRIBUTES (t)((contains_struct_check ((t), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 526, __FUNCTION__))->decl_common.attributes); |
527 | |
528 | tree tags = lookup_attribute ("abi_tag", attrs); |
529 | if (tags) |
530 | tags = TREE_VALUE (tags)((tree_check ((tags), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 530, __FUNCTION__, (TREE_LIST)))->list.value); |
531 | return tags; |
532 | } |
533 | |
534 | /* Helper function for find_substitution. Returns nonzero if NODE, |
535 | which may be a decl or a CLASS_TYPE, is the template-id |
536 | ::std::identifier<char>, where identifier is |
537 | substitution_index[INDEX]. */ |
538 | |
539 | static bool |
540 | is_std_substitution_char (const tree node, |
541 | const substitution_identifier_index_t index) |
542 | { |
543 | tree args; |
544 | /* Check NODE's name is ::std::identifier. */ |
545 | if (!is_std_substitution (node, index)) |
546 | return 0; |
547 | /* Figure out its template args. */ |
548 | if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration)) |
549 | args = DECL_TI_ARGS (node)((struct tree_template_info*)(tree_check (((((contains_struct_check ((template_info_decl_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 549, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 549, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 549, __FUNCTION__, (TEMPLATE_INFO))))->args; |
550 | else if (CLASS_TYPE_P (node)(((((enum tree_code) (node)->base.code)) == RECORD_TYPE || (((enum tree_code) (node)->base.code)) == UNION_TYPE) && ((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 550, __FUNCTION__))->type_common.lang_flag_5))) |
551 | args = CLASSTYPE_TI_ARGS (node)((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check3 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 551, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 551, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 551, __FUNCTION__, (TEMPLATE_INFO))))->args; |
552 | else |
553 | /* Oops, not a template. */ |
554 | return 0; |
555 | /* NODE's template arg list should be <char>. */ |
556 | return |
557 | TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 557, __FUNCTION__, (TREE_VEC)))->base.u.length) == 1 |
558 | && TREE_VEC_ELT (args, 0)(*((const_cast<tree *> (tree_vec_elt_check ((args), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 558, __FUNCTION__))))) == char_type_nodeinteger_types[itk_char]; |
559 | } |
560 | |
561 | /* Check whether a substitution should be used to represent NODE in |
562 | the mangling. |
563 | |
564 | First, check standard special-case substitutions. |
565 | |
566 | <substitution> ::= St |
567 | # ::std |
568 | |
569 | ::= Sa |
570 | # ::std::allocator |
571 | |
572 | ::= Sb |
573 | # ::std::basic_string |
574 | |
575 | ::= Ss |
576 | # ::std::basic_string<char, |
577 | ::std::char_traits<char>, |
578 | ::std::allocator<char> > |
579 | |
580 | ::= Si |
581 | # ::std::basic_istream<char, ::std::char_traits<char> > |
582 | |
583 | ::= So |
584 | # ::std::basic_ostream<char, ::std::char_traits<char> > |
585 | |
586 | ::= Sd |
587 | # ::std::basic_iostream<char, ::std::char_traits<char> > |
588 | |
589 | Then examine the stack of currently available substitution |
590 | candidates for entities appearing earlier in the same mangling |
591 | |
592 | If a substitution is found, write its mangled representation and |
593 | return nonzero. If none is found, just return zero. */ |
594 | |
595 | static int |
596 | find_substitution (tree node) |
597 | { |
598 | int i; |
599 | const int size = vec_safe_length (G.substitutions); |
600 | tree decl; |
601 | tree type; |
602 | const char *abbr = NULLnullptr; |
603 | |
604 | if (DEBUG_MANGLE0) |
605 | fprintf (stderrstderr, " ++ find_substitution (%s at %p)\n", |
606 | get_tree_code_name (TREE_CODE (node)((enum tree_code) (node)->base.code)), (void *) node); |
607 | |
608 | /* Obtain the canonicalized substitution representation for NODE. |
609 | This is what we'll compare against. */ |
610 | node = canonicalize_for_substitution (node); |
611 | |
612 | /* Check for builtin substitutions. */ |
613 | |
614 | decl = TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type) ? TYPE_NAME (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 614, __FUNCTION__))->type_common.name) : node; |
615 | type = TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type) ? node : TREE_TYPE (node)((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 615, __FUNCTION__))->typed.type); |
616 | |
617 | /* Check for std::allocator. */ |
618 | if (decl |
619 | && is_std_substitution (decl, SUBID_ALLOCATOR) |
620 | && !CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl))((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 620, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 620, __FUNCTION__))->type_with_lang_specific.lang_specific ))->use_template)) |
621 | abbr = "Sa"; |
622 | |
623 | /* Check for std::basic_string. */ |
624 | else if (decl && is_std_substitution (decl, SUBID_BASIC_STRING)) |
625 | { |
626 | if (TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type)) |
627 | { |
628 | /* If this is a type (i.e. a fully-qualified template-id), |
629 | check for |
630 | std::basic_string <char, |
631 | std::char_traits<char>, |
632 | std::allocator<char> > . */ |
633 | if (cp_type_quals (type) == TYPE_UNQUALIFIED |
634 | && CLASSTYPE_USE_TEMPLATE (type)((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 634, __FUNCTION__))->type_with_lang_specific.lang_specific ))->use_template)) |
635 | { |
636 | tree args = CLASSTYPE_TI_ARGS (type)((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 636, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 636, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 636, __FUNCTION__, (TEMPLATE_INFO))))->args; |
637 | if (TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 637, __FUNCTION__, (TREE_VEC)))->base.u.length) == 3 |
638 | && template_args_equal (TREE_VEC_ELT (args, 0)(*((const_cast<tree *> (tree_vec_elt_check ((args), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 638, __FUNCTION__))))), char_type_nodeinteger_types[itk_char]) |
639 | && is_std_substitution_char (TREE_VEC_ELT (args, 1)(*((const_cast<tree *> (tree_vec_elt_check ((args), (1) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 639, __FUNCTION__))))), |
640 | SUBID_CHAR_TRAITS) |
641 | && is_std_substitution_char (TREE_VEC_ELT (args, 2)(*((const_cast<tree *> (tree_vec_elt_check ((args), (2) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 641, __FUNCTION__))))), |
642 | SUBID_ALLOCATOR)) |
643 | abbr = "Ss"; |
644 | } |
645 | } |
646 | else |
647 | /* Substitute for the template name only if this isn't a type. */ |
648 | abbr = "Sb"; |
649 | } |
650 | |
651 | /* Check for basic_{i,o,io}stream. */ |
652 | else if (TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type) |
653 | && cp_type_quals (type) == TYPE_UNQUALIFIED |
654 | && CLASS_TYPE_P (type)(((((enum tree_code) (type)->base.code)) == RECORD_TYPE || (((enum tree_code) (type)->base.code)) == UNION_TYPE) && ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 654, __FUNCTION__))->type_common.lang_flag_5)) |
655 | && CLASSTYPE_USE_TEMPLATE (type)((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 655, __FUNCTION__))->type_with_lang_specific.lang_specific ))->use_template) |
656 | && CLASSTYPE_TEMPLATE_INFO (type)(((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 656, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 656, __FUNCTION__))->type_non_common.lang_1)) != NULLnullptr) |
657 | { |
658 | /* First, check for the template |
659 | args <char, std::char_traits<char> > . */ |
660 | tree args = CLASSTYPE_TI_ARGS (type)((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 660, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 660, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 660, __FUNCTION__, (TEMPLATE_INFO))))->args; |
661 | if (TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 661, __FUNCTION__, (TREE_VEC)))->base.u.length) == 2 |
662 | && template_args_equal (TREE_VEC_ELT (args, 0)(*((const_cast<tree *> (tree_vec_elt_check ((args), (0) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 662, __FUNCTION__))))), char_type_nodeinteger_types[itk_char]) |
663 | && is_std_substitution_char (TREE_VEC_ELT (args, 1)(*((const_cast<tree *> (tree_vec_elt_check ((args), (1) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 663, __FUNCTION__))))), |
664 | SUBID_CHAR_TRAITS)) |
665 | { |
666 | /* Got them. Is this basic_istream? */ |
667 | if (is_std_substitution (decl, SUBID_BASIC_ISTREAM)) |
668 | abbr = "Si"; |
669 | /* Or basic_ostream? */ |
670 | else if (is_std_substitution (decl, SUBID_BASIC_OSTREAM)) |
671 | abbr = "So"; |
672 | /* Or basic_iostream? */ |
673 | else if (is_std_substitution (decl, SUBID_BASIC_IOSTREAM)) |
674 | abbr = "Sd"; |
675 | } |
676 | } |
677 | |
678 | /* Check for namespace std. */ |
679 | else if (decl && DECL_NAMESPACE_STD_P (decl)((decl) == cp_global_trees[CPTI_STD])) |
680 | { |
681 | write_string ("St")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("St")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("St"), __len); __o->next_free += __len ; (void) 0; }); |
682 | return 1; |
683 | } |
684 | |
685 | tree tags = NULL_TREE(tree) nullptr; |
686 | if (OVERLOAD_TYPE_P (node)((((((enum tree_code) (node)->base.code)) == RECORD_TYPE || (((enum tree_code) (node)->base.code)) == UNION_TYPE) && ((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__))->type_common.lang_flag_5)) || ((enum tree_code) (node)->base.code) == ENUMERAL_TYPE) || DECL_CLASS_TEMPLATE_P (node)((((enum tree_code) (node)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((node ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == TYPE_DECL) && (((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((node ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == TYPE_DECL && ((contains_struct_check ((((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__, (TEMPLATE_DECL))))))))->result), (TS_DECL_COMMON ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 686, __FUNCTION__))->decl_common.lang_flag_2)))) |
687 | tags = get_abi_tags (type); |
688 | /* Now check the list of available substitutions for this mangling |
689 | operation. */ |
690 | if (!abbr || tags) |
691 | for (i = 0; i < size; ++i) |
692 | if (tree candidate = (*G.substitutions)[i]) |
693 | { |
694 | /* NODE is a matched to a candidate if it's the same decl node or |
695 | if it's the same type. */ |
696 | if (decl == candidate |
697 | || (TYPE_P (candidate)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (candidate)->base.code))] == tcc_type) && type && TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type) |
698 | && same_type_p (type, candidate)comptypes ((type), (candidate), 0)) |
699 | || NESTED_TEMPLATE_MATCH (node, candidate)(((enum tree_code) (node)->base.code) == TREE_LIST && ((enum tree_code) (candidate)->base.code) == TREE_LIST && (((tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.purpose))->base .code))] == tcc_type) && comptypes ((((tree_check ((node ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.purpose)), (((tree_check ((candidate), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.purpose)), 0)) || ((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.purpose) == ((tree_check ((candidate), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.purpose)) && ((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.value) == ((tree_check ((candidate), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 699, __FUNCTION__, (TREE_LIST)))->list.value))) |
700 | { |
701 | write_substitution (i); |
702 | return 1; |
703 | } |
704 | } |
705 | |
706 | if (!abbr) |
707 | /* No substitution found. */ |
708 | return 0; |
709 | |
710 | write_string (abbr)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (abbr)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (abbr), __len); __o->next_free += __len ; (void) 0; }); |
711 | if (tags) |
712 | { |
713 | /* If there are ABI tags on the abbreviation, it becomes |
714 | a substitution candidate. */ |
715 | write_abi_tags (tags); |
716 | add_substitution (node); |
717 | } |
718 | return 1; |
719 | } |
720 | |
721 | /* Returns whether DECL's symbol name should be the plain unqualified-id |
722 | rather than a more complicated mangled name. */ |
723 | |
724 | static bool |
725 | unmangled_name_p (const tree decl) |
726 | { |
727 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FUNCTION_DECL) |
728 | { |
729 | /* The names of `extern "C"' functions are not mangled. */ |
730 | return (DECL_EXTERN_C_FUNCTION_P (decl)((((enum tree_code) (decl)->base.code) == FUNCTION_DECL && !(((enum tree_code) (decl)->base.code) == FUNCTION_DECL && ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__))->decl_common.lang_specific) && __extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__))->decl_common.lang_specific); if (!(( (enum tree_code) (decl)->base.code) == FUNCTION_DECL || (( (enum tree_code) (decl)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__); <->u.fn; })->thunk_p)) && ((((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__))->decl_common.lang_specific) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 730, __FUNCTION__))->decl_common.lang_specific)->u.base .language : (((enum tree_code) (decl)->base.code) == FUNCTION_DECL ? lang_c : lang_cplusplus)) == lang_c)) |
731 | /* But overloaded operator names *are* mangled. */ |
732 | && !DECL_OVERLOADED_OPERATOR_P (decl)(((tree_not_check2 (((tree_check ((((contains_struct_check (( decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 732, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 732, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 732, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))); |
733 | } |
734 | else if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL)) |
735 | { |
736 | /* static variables are mangled. */ |
737 | if (!DECL_EXTERNAL_LINKAGE_P (decl)(decl_linkage (decl) == lk_external)) |
738 | return false; |
739 | |
740 | /* extern "C" declarations aren't mangled. */ |
741 | if (DECL_EXTERN_C_P (decl)((((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 741, __FUNCTION__))->decl_common.lang_specific) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 741, __FUNCTION__))->decl_common.lang_specific)->u.base .language : (((enum tree_code) (decl)->base.code) == FUNCTION_DECL ? lang_c : lang_cplusplus)) == lang_c)) |
742 | return true; |
743 | |
744 | /* Other variables at non-global scope are mangled. */ |
745 | if (CP_DECL_CONTEXT (decl)(!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 745, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 745, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 745, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL]) != global_namespacecp_global_trees[CPTI_GLOBAL]) |
746 | return false; |
747 | |
748 | /* Variable template instantiations are mangled. */ |
749 | if (DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 749, __FUNCTION__))->decl_common.lang_specific) && DECL_TEMPLATE_INFO (decl)(((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 749, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 749, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info) |
750 | && variable_template_p (DECL_TI_TEMPLATE (decl)((struct tree_template_info*)(tree_check (((((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 750, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 750, __FUNCTION__))->decl_common.lang_specific) ->u.min .template_info)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 750, __FUNCTION__, (TEMPLATE_INFO))))->tmpl)) |
751 | return false; |
752 | |
753 | /* Declarations with ABI tags are mangled. */ |
754 | if (get_abi_tags (decl)) |
755 | return false; |
756 | |
757 | // Declarations attached to a named module are mangled |
758 | if (modules_p () && get_originating_module (decl, true) >= 0) |
759 | return false; |
760 | |
761 | /* The names of non-static global variables aren't mangled. */ |
762 | return true; |
763 | } |
764 | |
765 | return false; |
766 | } |
767 | |
768 | /* TOP_LEVEL is true, if this is being called at outermost level of |
769 | mangling. It should be false when mangling a decl appearing in an |
770 | expression within some other mangling. |
771 | |
772 | <mangled-name> ::= _Z <encoding> */ |
773 | |
774 | static void |
775 | write_mangled_name (const tree decl, bool top_level) |
776 | { |
777 | MANGLE_TRACE_TREE ("mangled-name", decl); |
778 | |
779 | check_abi_tags (decl); |
780 | |
781 | if (unmangled_name_p (decl)) |
782 | { |
783 | if (top_level) |
784 | write_string (IDENTIFIER_POINTER (DECL_NAME (decl)))__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (((const char *) (tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 784, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 784, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ))); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free , (((const char *) (tree_check ((((contains_struct_check ((decl ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 784, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 784, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str )), __len); __o->next_free += __len; (void) 0; }); |
785 | else |
786 | { |
787 | /* The standard notes: "The <encoding> of an extern "C" |
788 | function is treated like global-scope data, i.e. as its |
789 | <source-name> without a type." We cannot write |
790 | overloaded operators that way though, because it contains |
791 | characters invalid in assembler. */ |
792 | write_string ("_Z")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("_Z")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("_Z"), __len); __o->next_free += __len ; (void) 0; }); |
793 | write_source_name (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 793, __FUNCTION__))->decl_minimal.name)); |
794 | } |
795 | } |
796 | else |
797 | { |
798 | write_string ("_Z")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("_Z")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("_Z"), __len); __o->next_free += __len ; (void) 0; }); |
799 | write_encoding (decl); |
800 | } |
801 | |
802 | /* If this is the pre/post function for a guarded function, append |
803 | .pre/post, like something from create_virtual_clone. */ |
804 | if (DECL_IS_PRE_FN_P (decl)(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 804, __FUNCTION__))->decl_common.abstract_origin) && (get_precondition_function ((((contains_struct_check ((decl) , (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 804, __FUNCTION__))->decl_common.abstract_origin)))) == decl )) |
805 | write_string (".pre")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (".pre")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (".pre"), __len); __o->next_free += __len ; (void) 0; }); |
806 | else if (DECL_IS_POST_FN_P (decl)(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 806, __FUNCTION__))->decl_common.abstract_origin) && (get_postcondition_function ((((contains_struct_check ((decl ), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 806, __FUNCTION__))->decl_common.abstract_origin)))) == decl )) |
807 | write_string (".post")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (".post")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (".post"), __len); __o->next_free += __len ; (void) 0; }); |
808 | |
809 | /* If this is a coroutine helper, then append an appropriate string to |
810 | identify which. */ |
811 | if (tree ramp = DECL_RAMP_FN (decl)(coro_get_ramp_function (decl))) |
812 | { |
813 | if (DECL_ACTOR_FN (ramp)(coro_get_actor_function ((ramp))) == decl) |
814 | write_string (JOIN_STR "actor")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("." "actor")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("." "actor"), __len); __o->next_free += __len; (void) 0; }); |
815 | else if (DECL_DESTROY_FN (ramp)(coro_get_destroy_function ((ramp))) == decl) |
816 | write_string (JOIN_STR "destroy")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("." "destroy")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, ("." "destroy"), __len); __o-> next_free += __len; (void) 0; }); |
817 | else |
818 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 818, __FUNCTION__)); |
819 | } |
820 | } |
821 | |
822 | /* Returns true if the return type of DECL is part of its signature, and |
823 | therefore its mangling. */ |
824 | |
825 | bool |
826 | mangle_return_type_p (tree decl) |
827 | { |
828 | return (!DECL_CONSTRUCTOR_P (decl)((tree_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 828, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 828, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_constructor ) |
829 | && !DECL_DESTRUCTOR_P (decl)((tree_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 829, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 829, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_destructor ) |
830 | && !DECL_CONV_FN_P (decl)((((tree_not_check2 (((tree_check ((((contains_struct_check ( (decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1) & (!((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 830, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0))) |
831 | && maybe_template_info (decl)); |
832 | } |
833 | |
834 | /* <encoding> ::= <function name> <bare-function-type> |
835 | ::= <data name> */ |
836 | |
837 | static void |
838 | write_encoding (const tree decl) |
839 | { |
840 | MANGLE_TRACE_TREE ("encoding", decl); |
841 | |
842 | if (DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__))->decl_common.lang_specific) && DECL_EXTERN_C_FUNCTION_P (decl)((((enum tree_code) (decl)->base.code) == FUNCTION_DECL && !(((enum tree_code) (decl)->base.code) == FUNCTION_DECL && ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__))->decl_common.lang_specific) && __extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__))->decl_common.lang_specific); if (!(( (enum tree_code) (decl)->base.code) == FUNCTION_DECL || (( (enum tree_code) (decl)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__); <->u.fn; })->thunk_p)) && ((((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__))->decl_common.lang_specific) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 842, __FUNCTION__))->decl_common.lang_specific)->u.base .language : (((enum tree_code) (decl)->base.code) == FUNCTION_DECL ? lang_c : lang_cplusplus)) == lang_c))) |
843 | { |
844 | /* For overloaded operators write just the mangled name |
845 | without arguments. */ |
846 | if (DECL_OVERLOADED_OPERATOR_P (decl)(((tree_not_check2 (((tree_check ((((contains_struct_check (( decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 846, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 846, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 846, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
847 | write_name (decl, /*ignore_local_scope=*/0); |
848 | else |
849 | write_source_name (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 849, __FUNCTION__))->decl_minimal.name)); |
850 | return; |
851 | } |
852 | |
853 | write_name (decl, /*ignore_local_scope=*/0); |
854 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FUNCTION_DECL) |
855 | { |
856 | tree fn_type; |
857 | tree d; |
858 | |
859 | if (maybe_template_info (decl)) |
860 | { |
861 | fn_type = get_mostly_instantiated_function_type (decl); |
862 | /* FN_TYPE will not have parameter types for in-charge or |
863 | VTT parameters. Therefore, we pass NULL_TREE to |
864 | write_bare_function_type -- otherwise, it will get |
865 | confused about which artificial parameters to skip. */ |
866 | d = NULL_TREE(tree) nullptr; |
867 | } |
868 | else |
869 | { |
870 | fn_type = TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 870, __FUNCTION__))->typed.type); |
871 | d = decl; |
872 | } |
873 | |
874 | write_bare_function_type (fn_type, |
875 | mangle_return_type_p (decl), |
876 | d); |
877 | |
878 | } |
879 | } |
880 | |
881 | /* Interface to substitution and identifier mangling, used by the |
882 | module name mangler. */ |
883 | |
884 | void |
885 | mangle_module_substitution (int v) |
886 | { |
887 | write_substitution (v - 1); |
888 | } |
889 | |
890 | int |
891 | mangle_module_component (tree comp, bool partition_p) |
892 | { |
893 | write_char ('W')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('W')))); }); |
894 | if (partition_p) |
895 | write_char ('P')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('P')))); }); |
896 | write_source_name (comp); |
897 | |
898 | // Module substitutions use the same number-space as entity |
899 | // substitutions, but are orthogonal. |
900 | vec_safe_push (G.substitutions, NULL_TREE(tree) nullptr); |
901 | return G.substitutions->length (); |
902 | } |
903 | |
904 | /* If the outermost non-namespace context (including DECL itself) is |
905 | a module-linkage decl, mangle the module information. For module |
906 | global initializers we need to include the partition part. |
907 | |
908 | <module-name> ::= <module-sub> |
909 | || <subst> |
910 | || <module-name> <module-sub> |
911 | <module-sub> :: W [P] <unqualified-name> |
912 | */ |
913 | |
914 | static void |
915 | write_module (int m, bool include_partition) |
916 | { |
917 | G.mod = true; |
918 | mangle_module (m, include_partition); |
919 | } |
920 | |
921 | static void |
922 | maybe_write_module (tree decl) |
923 | { |
924 | if (!DECL_NAMESPACE_SCOPE_P (decl)(!(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 924, __FUNCTION__))->decl_common.lang_flag_0) && (((enum tree_code) (decl)->base.code) == CONST_DECL || (( enum tree_code) (decl)->base.code) == PARM_DECL || ((enum tree_code ) (decl)->base.code) == TYPE_DECL || ((enum tree_code) (decl )->base.code) == TEMPLATE_DECL)) && ((enum tree_code ) ((!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 924, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 924, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 924, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL]))->base.code) == NAMESPACE_DECL)) |
925 | return; |
926 | |
927 | if (!TREE_PUBLIC (STRIP_TEMPLATE (decl))(((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 927, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl ))->base.public_flag)) |
928 | return; |
929 | |
930 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == NAMESPACE_DECL) |
931 | return; |
932 | |
933 | int m = get_originating_module (decl, true); |
934 | if (m >= 0) |
935 | write_module (m, false); |
936 | } |
937 | |
938 | /* Lambdas can have a bit more context for mangling, specifically VAR_DECL |
939 | or PARM_DECL context, which doesn't belong in DECL_CONTEXT. */ |
940 | |
941 | static tree |
942 | decl_mangling_context (tree decl) |
943 | { |
944 | tree tcontext = targetm.cxx.decl_mangling_context (decl); |
945 | |
946 | if (tcontext != NULL_TREE(tree) nullptr) |
947 | return tcontext; |
948 | |
949 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TEMPLATE_DECL |
950 | && DECL_TEMPLATE_RESULT (decl)((struct tree_template_decl *)(const_cast<union tree_node * > ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 950, __FUNCTION__, (TEMPLATE_DECL))))))))->result) |
951 | decl = DECL_TEMPLATE_RESULT (decl)((struct tree_template_decl *)(const_cast<union tree_node * > ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 951, __FUNCTION__, (TEMPLATE_DECL))))))))->result; |
952 | |
953 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL |
954 | && LAMBDA_TYPE_P (TREE_TYPE (decl))(((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type))->base.code) == RECORD_TYPE && ((((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name))->base.code))] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name))) && ((tree_check ((((((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name))->base.code))] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 954, __FUNCTION__, (IDENTIFIER_NODE)))->base.protected_flag ))) |
955 | { |
956 | tree extra = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl))((((struct tree_lambda_expr *)(tree_check ((((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 956, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 956, __FUNCTION__))->type_with_lang_specific.lang_specific ))->lambda_expr)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 956, __FUNCTION__, (LAMBDA_EXPR))))->extra_scope)); |
957 | if (extra) |
958 | return extra; |
959 | } |
960 | else if (template_type_parameter_p (decl)) |
961 | /* template type parms have no mangling context. */ |
962 | return NULL_TREE(tree) nullptr; |
963 | |
964 | tcontext = CP_DECL_CONTEXT (decl)(!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 964, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 964, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 964, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL]); |
965 | |
966 | /* Ignore the artificial declare reduction functions. */ |
967 | if (tcontext |
968 | && TREE_CODE (tcontext)((enum tree_code) (tcontext)->base.code) == FUNCTION_DECL |
969 | && DECL_OMP_DECLARE_REDUCTION_P (tcontext)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) ((contains_struct_check ((tcontext), (TS_DECL_COMMON ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__)))->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check (((contains_struct_check ((tcontext), (TS_DECL_COMMON ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__, (TEMPLATE_DECL))))))))->result : (contains_struct_check ((tcontext), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__)))), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__))->decl_common.lang_specific); if (!(( (enum tree_code) ((contains_struct_check ((tcontext), (TS_DECL_COMMON ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__)))->base.code) == FUNCTION_DECL || ((( enum tree_code) ((contains_struct_check ((tcontext), (TS_DECL_COMMON ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__)))->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check (((contains_struct_check ((tcontext), ( TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check (((contains_struct_check ((tcontext), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base .code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 969, __FUNCTION__); <->u.fn; })->omp_declare_reduction_p )) |
970 | return decl_mangling_context (tcontext); |
971 | |
972 | return tcontext; |
973 | } |
974 | |
975 | /* <name> ::= <unscoped-name> |
976 | ::= <unscoped-template-name> <template-args> |
977 | ::= <nested-name> |
978 | ::= <local-name> |
979 | |
980 | If IGNORE_LOCAL_SCOPE is nonzero, this production of <name> is |
981 | called from <local-name>, which mangles the enclosing scope |
982 | elsewhere and then uses this function to mangle just the part |
983 | underneath the function scope. So don't use the <local-name> |
984 | production, to avoid an infinite recursion. */ |
985 | |
986 | static void |
987 | write_name (tree decl, const int ignore_local_scope) |
988 | { |
989 | tree context; |
990 | |
991 | MANGLE_TRACE_TREE ("name", decl); |
992 | |
993 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL) |
994 | { |
995 | /* In case this is a typedef, fish out the corresponding |
996 | TYPE_DECL for the main variant. */ |
997 | decl = TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl)))((tree_class_check ((((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 997, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 997, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 997, __FUNCTION__))->type_common.name); |
998 | } |
999 | |
1000 | context = decl_mangling_context (decl); |
1001 | |
1002 | gcc_assert (context != NULL_TREE)((void)(!(context != (tree) nullptr) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1002, __FUNCTION__), 0 : 0)); |
1003 | |
1004 | if (abi_warn_or_compat_version_crosses (7)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (7)) != (warn_abi_version == 0 || warn_abi_version >= (7))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (7)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (7))) ) |
1005 | && ignore_local_scope |
1006 | && TREE_CODE (context)((enum tree_code) (context)->base.code) == PARM_DECL) |
1007 | G.need_abi_warning = 1; |
1008 | |
1009 | /* A decl in :: or ::std scope is treated specially. The former is |
1010 | mangled using <unscoped-name> or <unscoped-template-name>, the |
1011 | latter with a special substitution. Also, a name that is |
1012 | directly in a local function scope is also mangled with |
1013 | <unscoped-name> rather than a full <nested-name>. */ |
1014 | if (context == global_namespacecp_global_trees[CPTI_GLOBAL] |
1015 | || DECL_NAMESPACE_STD_P (context)((context) == cp_global_trees[CPTI_STD]) |
1016 | || (ignore_local_scope |
1017 | && (TREE_CODE (context)((enum tree_code) (context)->base.code) == FUNCTION_DECL |
1018 | || (abi_version_at_least (7)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (7)) |
1019 | && TREE_CODE (context)((enum tree_code) (context)->base.code) == PARM_DECL)))) |
1020 | { |
1021 | /* Is this a template instance? */ |
1022 | if (tree info = maybe_template_info (decl)) |
1023 | { |
1024 | /* Yes: use <unscoped-template-name>. */ |
1025 | write_unscoped_template_name (TI_TEMPLATE (info)((struct tree_template_info*)(tree_check ((info), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1025, __FUNCTION__, (TEMPLATE_INFO))))->tmpl); |
1026 | write_template_args (TI_ARGS (info)((struct tree_template_info*)(tree_check ((info), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1026, __FUNCTION__, (TEMPLATE_INFO))))->args); |
1027 | } |
1028 | else |
1029 | /* Everything else gets an <unqualified-name>. */ |
1030 | write_unscoped_name (decl); |
1031 | } |
1032 | else |
1033 | { |
1034 | /* Handle local names, unless we asked not to (that is, invoked |
1035 | under <local-name>, to handle only the part of the name under |
1036 | the local scope). */ |
1037 | if (!ignore_local_scope) |
1038 | { |
1039 | /* Scan up the list of scope context, looking for a |
1040 | function. If we find one, this entity is in local |
1041 | function scope. local_entity tracks context one scope |
1042 | level down, so it will contain the element that's |
1043 | directly in that function's scope, either decl or one of |
1044 | its enclosing scopes. */ |
1045 | tree local_entity = decl; |
1046 | while (context != global_namespacecp_global_trees[CPTI_GLOBAL]) |
1047 | { |
1048 | /* Make sure we're always dealing with decls. */ |
1049 | if (TYPE_P (context)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (context)->base.code))] == tcc_type)) |
1050 | context = TYPE_NAME (context)((tree_class_check ((context), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1050, __FUNCTION__))->type_common.name); |
1051 | /* Is this a function? */ |
1052 | if (TREE_CODE (context)((enum tree_code) (context)->base.code) == FUNCTION_DECL |
1053 | || TREE_CODE (context)((enum tree_code) (context)->base.code) == PARM_DECL) |
1054 | { |
1055 | /* Yes, we have local scope. Use the <local-name> |
1056 | production for the innermost function scope. */ |
1057 | write_local_name (context, local_entity, decl); |
1058 | return; |
1059 | } |
1060 | /* Up one scope level. */ |
1061 | local_entity = context; |
1062 | context = decl_mangling_context (context); |
1063 | } |
1064 | |
1065 | /* No local scope found? Fall through to <nested-name>. */ |
1066 | } |
1067 | |
1068 | /* Other decls get a <nested-name> to encode their scope. */ |
1069 | write_nested_name (decl); |
1070 | } |
1071 | } |
1072 | |
1073 | /* <unscoped-name> ::= <unqualified-name> |
1074 | ::= St <unqualified-name> # ::std:: */ |
1075 | |
1076 | static void |
1077 | write_unscoped_name (const tree decl) |
1078 | { |
1079 | tree context = decl_mangling_context (decl); |
1080 | |
1081 | MANGLE_TRACE_TREE ("unscoped-name", decl); |
1082 | |
1083 | /* Is DECL in ::std? */ |
1084 | if (DECL_NAMESPACE_STD_P (context)((context) == cp_global_trees[CPTI_STD])) |
1085 | { |
1086 | write_string ("St")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("St")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("St"), __len); __o->next_free += __len ; (void) 0; }); |
1087 | write_unqualified_name (decl); |
1088 | } |
1089 | else |
1090 | { |
1091 | /* If not, it should be either in the global namespace, or directly |
1092 | in a local function scope. A lambda can also be mangled in the |
1093 | scope of a default argument. */ |
1094 | gcc_assert (context == global_namespace((void)(!(context == cp_global_trees[CPTI_GLOBAL] || ((enum tree_code ) (context)->base.code) == PARM_DECL || ((enum tree_code) ( context)->base.code) == FUNCTION_DECL) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1096, __FUNCTION__), 0 : 0)) |
1095 | || TREE_CODE (context) == PARM_DECL((void)(!(context == cp_global_trees[CPTI_GLOBAL] || ((enum tree_code ) (context)->base.code) == PARM_DECL || ((enum tree_code) ( context)->base.code) == FUNCTION_DECL) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1096, __FUNCTION__), 0 : 0)) |
1096 | || TREE_CODE (context) == FUNCTION_DECL)((void)(!(context == cp_global_trees[CPTI_GLOBAL] || ((enum tree_code ) (context)->base.code) == PARM_DECL || ((enum tree_code) ( context)->base.code) == FUNCTION_DECL) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1096, __FUNCTION__), 0 : 0)); |
1097 | |
1098 | write_unqualified_name (decl); |
1099 | } |
1100 | } |
1101 | |
1102 | /* <unscoped-template-name> ::= <unscoped-name> |
1103 | ::= <substitution> */ |
1104 | |
1105 | static void |
1106 | write_unscoped_template_name (const tree decl) |
1107 | { |
1108 | MANGLE_TRACE_TREE ("unscoped-template-name", decl); |
1109 | |
1110 | if (find_substitution (decl)) |
1111 | return; |
1112 | write_unscoped_name (decl); |
1113 | add_substitution (decl); |
1114 | } |
1115 | |
1116 | /* Write the nested name, including CV-qualifiers, of DECL. |
1117 | |
1118 | <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E |
1119 | ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E |
1120 | |
1121 | <ref-qualifier> ::= R # & ref-qualifier |
1122 | ::= O # && ref-qualifier |
1123 | <CV-qualifiers> ::= [r] [V] [K] */ |
1124 | |
1125 | static void |
1126 | write_nested_name (const tree decl) |
1127 | { |
1128 | MANGLE_TRACE_TREE ("nested-name", decl); |
1129 | |
1130 | write_char ('N')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('N')))); }); |
1131 | |
1132 | /* Write CV-qualifiers, if this is a member function. */ |
1133 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FUNCTION_DECL |
1134 | && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)(((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1134, __FUNCTION__))->typed.type))->base.code) == METHOD_TYPE )) |
1135 | { |
1136 | if (DECL_VOLATILE_MEMFUNC_P (decl)((((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1136, __FUNCTION__))->typed.type))->base.code) == METHOD_TYPE ) && ((cp_type_quals (((contains_struct_check ((((tree_check ((((tree_check2 ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1136, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1136, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .values)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1136, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1136, __FUNCTION__))->typed.type)) & TYPE_QUAL_VOLATILE ) != 0))) |
1137 | write_char ('V')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('V')))); }); |
1138 | if (DECL_CONST_MEMFUNC_P (decl)((((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1138, __FUNCTION__))->typed.type))->base.code) == METHOD_TYPE ) && ((cp_type_quals (((contains_struct_check ((((tree_check ((((tree_check2 ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1138, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1138, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .values)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1138, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1138, __FUNCTION__))->typed.type)) & TYPE_QUAL_CONST ) != 0))) |
1139 | write_char ('K')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('K')))); }); |
1140 | if (FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))((tree_not_check2 (((tree_check2 ((((contains_struct_check (( decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1140, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1140, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1140, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_4)) |
1141 | { |
1142 | if (FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl))((tree_not_check2 (((tree_check2 ((((contains_struct_check (( decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1142, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1142, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1142, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_5)) |
1143 | write_char ('O')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('O')))); }); |
1144 | else |
1145 | write_char ('R')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('R')))); }); |
1146 | } |
1147 | } |
1148 | |
1149 | /* Is this a template instance? */ |
1150 | if (tree info = maybe_template_info (decl)) |
1151 | { |
1152 | /* Yes, use <template-prefix>. */ |
1153 | write_template_prefix (decl); |
1154 | write_template_args (TI_ARGS (info)((struct tree_template_info*)(tree_check ((info), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1154, __FUNCTION__, (TEMPLATE_INFO))))->args); |
1155 | } |
1156 | else if ((!abi_version_at_least (10)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10)) || TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL) |
1157 | && TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1157, __FUNCTION__))->typed.type))->base.code) == TYPENAME_TYPE) |
1158 | { |
1159 | tree name = TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl))(((tree_class_check (((tree_check ((((contains_struct_check ( (decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1159, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1159, __FUNCTION__, (TYPENAME_TYPE)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1159, __FUNCTION__))->type_non_common.values)); |
1160 | if (TREE_CODE (name)((enum tree_code) (name)->base.code) == TEMPLATE_ID_EXPR) |
1161 | { |
1162 | write_template_prefix (decl); |
1163 | write_template_args (TREE_OPERAND (name, 1)(*((const_cast<tree*> (tree_operand_check ((name), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1163, __FUNCTION__)))))); |
1164 | } |
1165 | else |
1166 | { |
1167 | write_prefix (decl_mangling_context (decl)); |
1168 | write_unqualified_name (decl); |
1169 | } |
1170 | } |
1171 | else |
1172 | { |
1173 | /* No, just use <prefix> */ |
1174 | write_prefix (decl_mangling_context (decl)); |
1175 | write_unqualified_name (decl); |
1176 | } |
1177 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
1178 | } |
1179 | |
1180 | /* <prefix> ::= <prefix> <unqualified-name> |
1181 | ::= <template-param> |
1182 | ::= <template-prefix> <template-args> |
1183 | ::= <decltype> |
1184 | ::= # empty |
1185 | ::= <substitution> */ |
1186 | |
1187 | static void |
1188 | write_prefix (const tree node) |
1189 | { |
1190 | tree decl; |
1191 | |
1192 | if (node == NULLnullptr |
1193 | || node == global_namespacecp_global_trees[CPTI_GLOBAL]) |
1194 | return; |
1195 | |
1196 | MANGLE_TRACE_TREE ("prefix", node); |
1197 | |
1198 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == DECLTYPE_TYPE) |
1199 | { |
1200 | write_type (node); |
1201 | return; |
1202 | } |
1203 | |
1204 | if (find_substitution (node)) |
1205 | return; |
1206 | |
1207 | tree template_info = NULL_TREE(tree) nullptr; |
1208 | if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration)) |
1209 | { |
1210 | /* If this is a function or parm decl, that means we've hit function |
1211 | scope, so this prefix must be for a local name. In this |
1212 | case, we're under the <local-name> production, which encodes |
1213 | the enclosing function scope elsewhere. So don't continue |
1214 | here. */ |
1215 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == FUNCTION_DECL |
1216 | || TREE_CODE (node)((enum tree_code) (node)->base.code) == PARM_DECL) |
1217 | return; |
1218 | |
1219 | decl = node; |
1220 | template_info = maybe_template_info (decl); |
1221 | } |
1222 | else |
1223 | { |
1224 | /* Node is a type. */ |
1225 | decl = TYPE_NAME (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1225, __FUNCTION__))->type_common.name); |
1226 | /* The DECL might not point at the node. */ |
1227 | if (CLASSTYPE_TEMPLATE_ID_P (node)(((enum tree_code) (node)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((((((enum tree_code) (node)->base.code)) == RECORD_TYPE || (((enum tree_code) (node)->base.code)) == UNION_TYPE) && ((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check (((tree_check3 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__))->type_non_common.lang_1)) != nullptr && (((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((((struct tree_template_info*)(tree_check ((((( tree_class_check (((tree_check3 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((tree_class_check (((tree_check3 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1227, __FUNCTION__, (TEMPLATE_INFO))))->tmpl))))) |
1228 | template_info = TYPE_TEMPLATE_INFO (node)(((enum tree_code) (node)->base.code) == ENUMERAL_TYPE || ( (enum tree_code) (node)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || (((enum tree_code) (node)->base.code) == RECORD_TYPE || ((enum tree_code) (node)->base.code) == UNION_TYPE || ((enum tree_code) (node)->base.code) == QUAL_UNION_TYPE) ? ((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1228, __FUNCTION__))->type_non_common.lang_1) : (tree) nullptr ); |
1229 | } |
1230 | |
1231 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == TEMPLATE_TYPE_PARM) |
1232 | write_template_param (node); |
1233 | else if (template_info) |
1234 | /* Templated. */ |
1235 | { |
1236 | write_template_prefix (decl); |
1237 | write_template_args (TI_ARGS (template_info)((struct tree_template_info*)(tree_check ((template_info), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1237, __FUNCTION__, (TEMPLATE_INFO))))->args); |
1238 | } |
1239 | else if (TREE_CODE (TREE_TYPE (decl))((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1239, __FUNCTION__))->typed.type))->base.code) == TYPENAME_TYPE) |
1240 | { |
1241 | tree name = TYPENAME_TYPE_FULLNAME (TREE_TYPE (decl))(((tree_class_check (((tree_check ((((contains_struct_check ( (decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1241, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1241, __FUNCTION__, (TYPENAME_TYPE)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1241, __FUNCTION__))->type_non_common.values)); |
1242 | if (TREE_CODE (name)((enum tree_code) (name)->base.code) == TEMPLATE_ID_EXPR) |
1243 | { |
1244 | write_template_prefix (decl); |
1245 | write_template_args (TREE_OPERAND (name, 1)(*((const_cast<tree*> (tree_operand_check ((name), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1245, __FUNCTION__)))))); |
1246 | } |
1247 | else |
1248 | { |
1249 | write_prefix (decl_mangling_context (decl)); |
1250 | write_unqualified_name (decl); |
1251 | } |
1252 | } |
1253 | else |
1254 | /* Not templated. */ |
1255 | { |
1256 | write_prefix (decl_mangling_context (decl)); |
1257 | write_unqualified_name (decl); |
1258 | if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL) |
1259 | || TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FIELD_DECL) |
1260 | { |
1261 | /* <data-member-prefix> := <member source-name> M */ |
1262 | write_char ('M')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('M')))); }); |
1263 | |
1264 | /* Before ABI 18, we did not count these as substitution |
1265 | candidates. This leads to incorrect demanglings (and |
1266 | ABI divergence to other compilers). */ |
1267 | if (abi_warn_or_compat_version_crosses (18)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18)) != (warn_abi_version == 0 || warn_abi_version >= (18))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (18)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (18)) ))) |
1268 | G.need_abi_warning = true; |
1269 | if (!abi_version_at_least (18)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18))) |
1270 | return; |
1271 | } |
1272 | } |
1273 | |
1274 | add_substitution (node); |
1275 | } |
1276 | |
1277 | /* <template-prefix> ::= <prefix> <template component> |
1278 | ::= <template-param> |
1279 | ::= <substitution> */ |
1280 | |
1281 | static void |
1282 | write_template_prefix (const tree node) |
1283 | { |
1284 | tree decl = DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration) ? node : TYPE_NAME (node)((tree_class_check ((node), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1284, __FUNCTION__))->type_common.name); |
1285 | tree type = DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration) ? TREE_TYPE (node)((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1285, __FUNCTION__))->typed.type) : node; |
1286 | tree context = decl_mangling_context (decl); |
1287 | tree templ; |
1288 | tree substitution; |
1289 | |
1290 | MANGLE_TRACE_TREE ("template-prefix", node); |
1291 | |
1292 | /* Find the template decl. */ |
1293 | if (tree info = maybe_template_info (decl)) |
1294 | templ = TI_TEMPLATE (info)((struct tree_template_info*)(tree_check ((info), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1294, __FUNCTION__, (TEMPLATE_INFO))))->tmpl; |
1295 | else if (TREE_CODE (type)((enum tree_code) (type)->base.code) == TYPENAME_TYPE) |
1296 | /* For a typename type, all we have is the name. */ |
1297 | templ = DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1297, __FUNCTION__))->decl_minimal.name); |
1298 | else |
1299 | { |
1300 | gcc_assert (CLASSTYPE_TEMPLATE_ID_P (type))((void)(!((((enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((((((enum tree_code) (type)->base.code)) == RECORD_TYPE || (((enum tree_code) (type)->base.code)) == UNION_TYPE) && ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__))->type_non_common.lang_1)) != nullptr && (((((contains_struct_check ((((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((((struct tree_template_info*)(tree_check ((((( tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (TEMPLATE_INFO))))->tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__))->typed.type))) == (((struct tree_template_info *)(tree_check (((((tree_class_check (((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__, (TEMPLATE_INFO))))->tmpl))))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1300, __FUNCTION__), 0 : 0)); |
1301 | |
1302 | templ = TYPE_TI_TEMPLATE (type)(((struct tree_template_info*)(tree_check (((((enum tree_code ) (type)->base.code) == ENUMERAL_TYPE || ((enum tree_code) (type)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM || ((( enum tree_code) (type)->base.code) == RECORD_TYPE || ((enum tree_code) (type)->base.code) == UNION_TYPE || ((enum tree_code ) (type)->base.code) == QUAL_UNION_TYPE) ? ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1302, __FUNCTION__))->type_non_common.lang_1) : (tree) nullptr )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1302, __FUNCTION__, (TEMPLATE_INFO))))->tmpl); |
1303 | } |
1304 | |
1305 | /* For a member template, though, the template name for the |
1306 | innermost name must have all the outer template levels |
1307 | instantiated. For instance, consider |
1308 | |
1309 | template<typename T> struct Outer { |
1310 | template<typename U> struct Inner {}; |
1311 | }; |
1312 | |
1313 | The template name for `Inner' in `Outer<int>::Inner<float>' is |
1314 | `Outer<int>::Inner<U>'. In g++, we don't instantiate the template |
1315 | levels separately, so there's no TEMPLATE_DECL available for this |
1316 | (there's only `Outer<T>::Inner<U>'). |
1317 | |
1318 | In order to get the substitutions right, we create a special |
1319 | TREE_LIST to represent the substitution candidate for a nested |
1320 | template. The TREE_PURPOSE is the template's context, fully |
1321 | instantiated, and the TREE_VALUE is the TEMPLATE_DECL for the inner |
1322 | template. |
1323 | |
1324 | So, for the example above, `Outer<int>::Inner' is represented as a |
1325 | substitution candidate by a TREE_LIST whose purpose is `Outer<int>' |
1326 | and whose value is `Outer<T>::Inner<U>'. */ |
1327 | if (context && TYPE_P (context)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (context)->base.code))] == tcc_type)) |
1328 | substitution = build_tree_list (context, templ); |
1329 | else |
1330 | substitution = templ; |
1331 | |
1332 | if (find_substitution (substitution)) |
1333 | return; |
1334 | |
1335 | if (TREE_TYPE (templ)((contains_struct_check ((templ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1335, __FUNCTION__))->typed.type) |
1336 | && TREE_CODE (TREE_TYPE (templ))((enum tree_code) (((contains_struct_check ((templ), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1336, __FUNCTION__))->typed.type))->base.code) == TEMPLATE_TEMPLATE_PARM) |
1337 | write_template_param (TREE_TYPE (templ)((contains_struct_check ((templ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1337, __FUNCTION__))->typed.type)); |
1338 | else |
1339 | { |
1340 | write_prefix (context); |
1341 | write_unqualified_name (decl); |
1342 | } |
1343 | |
1344 | add_substitution (substitution); |
1345 | } |
1346 | |
1347 | /* As the list of identifiers for the structured binding declaration |
1348 | DECL is likely gone, try to recover the DC <source-name>+ E portion |
1349 | from its mangled name. Return pointer to the DC and set len to |
1350 | the length up to and including the terminating E. On failure |
1351 | return NULL. */ |
1352 | |
1353 | static const char * |
1354 | find_decomp_unqualified_name (tree decl, size_t *len) |
1355 | { |
1356 | const char *p = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))((const char *) (tree_check ((decl_assembler_name (decl)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1356, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ); |
1357 | const char *end = p + IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl))((tree_check ((decl_assembler_name (decl)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1357, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len ); |
1358 | bool nested = false; |
1359 | if (!startswith (p, "_Z")) |
1360 | return NULLnullptr; |
1361 | p += 2; |
1362 | if (startswith (p, "St")) |
1363 | p += 2; |
1364 | else if (*p == 'N') |
1365 | { |
1366 | nested = true; |
1367 | ++p; |
1368 | while (ISDIGIT (p[0])(_sch_istable[(p[0]) & 0xff] & (unsigned short)(_sch_isdigit ))) |
1369 | { |
1370 | char *e; |
1371 | long num = strtol (p, &e, 10); |
1372 | if (num >= 1 && num < end - e) |
1373 | p = e + num; |
1374 | else |
1375 | break; |
1376 | } |
1377 | } |
1378 | if (!startswith (p, "DC")) |
1379 | return NULLnullptr; |
1380 | if (nested) |
1381 | { |
1382 | if (end[-1] != 'E') |
1383 | return NULLnullptr; |
1384 | --end; |
1385 | } |
1386 | if (end[-1] != 'E') |
1387 | return NULLnullptr; |
1388 | *len = end - p; |
1389 | return p; |
1390 | } |
1391 | |
1392 | /* "For the purposes of mangling, the name of an anonymous union is considered |
1393 | to be the name of the first named data member found by a pre-order, |
1394 | depth-first, declaration-order walk of the data members of the anonymous |
1395 | union. If there is no such data member (i.e., if all of the data members in |
1396 | the union are unnamed), then there is no way for a program to refer to the |
1397 | anonymous union, and there is therefore no need to mangle its name." */ |
1398 | |
1399 | static tree |
1400 | anon_aggr_naming_decl (tree type) |
1401 | { |
1402 | tree field = next_aggregate_field (TYPE_FIELDS (type)((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1402, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_non_common.values)); |
1403 | for (; field; field = next_aggregate_field (DECL_CHAIN (field)(((contains_struct_check (((contains_struct_check ((field), ( TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1403, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1403, __FUNCTION__))->common.chain)))) |
1404 | { |
1405 | if (DECL_NAME (field)((contains_struct_check ((field), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1405, __FUNCTION__))->decl_minimal.name)) |
1406 | return field; |
1407 | if (ANON_AGGR_TYPE_P (TREE_TYPE (field))((((((enum tree_code) (((contains_struct_check ((field), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->typed.type))->base.code)) == RECORD_TYPE || (((enum tree_code) (((contains_struct_check ((field), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->typed.type))->base.code)) == UNION_TYPE ) && ((tree_class_check ((((contains_struct_check ((field ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check ((((contains_struct_check ((field), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1407, __FUNCTION__))->type_with_lang_specific.lang_specific ))->anon_aggr)) |
1408 | if (tree sub = anon_aggr_naming_decl (TREE_TYPE (field)((contains_struct_check ((field), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1408, __FUNCTION__))->typed.type))) |
1409 | return sub; |
1410 | } |
1411 | return NULL_TREE(tree) nullptr; |
1412 | } |
1413 | |
1414 | /* We don't need to handle thunks, vtables, or VTTs here. Those are |
1415 | mangled through special entry points. |
1416 | |
1417 | <unqualified-name> ::= [<module-name>] <operator-name> |
1418 | ::= <special-name> |
1419 | ::= [<module-name>] <source-name> |
1420 | ::= [<module-name>] <unnamed-type-name> |
1421 | ::= <local-source-name> |
1422 | |
1423 | <local-source-name> ::= L <source-name> <discriminator> */ |
1424 | |
1425 | static void |
1426 | write_unqualified_id (tree identifier) |
1427 | { |
1428 | if (IDENTIFIER_CONV_OP_P (identifier)((((tree_not_check2 (((tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & ((tree_not_check2 (((tree_check ((identifier ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1) & (!((tree_not_check2 (((tree_check ((identifier ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1428, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)))) |
1429 | write_conversion_operator_name (TREE_TYPE (identifier)((contains_struct_check ((identifier), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1429, __FUNCTION__))->typed.type)); |
1430 | else if (IDENTIFIER_OVL_OP_P (identifier)((((tree_not_check2 (((tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1430, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1430, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & (!((tree_not_check2 (((tree_check ((identifier ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1430, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1430, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1)))) |
1431 | { |
1432 | const ovl_op_info_t *ovl_op = IDENTIFIER_OVL_OP_INFO (identifier)(&ovl_op_info[((tree_not_check2 (((tree_check ((identifier ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1432, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1432, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)][((tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1432, __FUNCTION__, (IDENTIFIER_NODE)))->base.u.bits.address_space )]); |
1433 | write_string (ovl_op->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (ovl_op->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o , __len); memcpy (__o->next_free, (ovl_op->mangled_name ), __len); __o->next_free += __len; (void) 0; }); |
1434 | } |
1435 | else if (UDLIT_OPER_P (identifier)(!strncmp (((const char *) (tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1435, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ), "operator\"\"", sizeof ("operator\"\"") - 1))) |
1436 | write_literal_operator_name (identifier); |
1437 | else |
1438 | write_source_name (identifier); |
1439 | } |
1440 | |
1441 | static void |
1442 | write_unqualified_name (tree decl) |
1443 | { |
1444 | MANGLE_TRACE_TREE ("unqualified-name", decl); |
1445 | |
1446 | if (modules_p ()) |
1447 | maybe_write_module (decl); |
1448 | |
1449 | if (identifier_p (decl)) |
1450 | { |
1451 | write_unqualified_id (decl); |
1452 | return; |
1453 | } |
1454 | |
1455 | bool found = false; |
1456 | |
1457 | if (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1457, __FUNCTION__))->decl_minimal.name) == NULL_TREE(tree) nullptr |
1458 | && ANON_AGGR_TYPE_P (TREE_TYPE (decl))((((((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->typed.type))->base.code)) == RECORD_TYPE || (((enum tree_code) (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->typed.type))->base.code)) == UNION_TYPE ) && ((tree_class_check ((((contains_struct_check ((decl ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->type_common.lang_flag_5)) && (((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1458, __FUNCTION__))->type_with_lang_specific.lang_specific ))->anon_aggr)) |
1459 | decl = anon_aggr_naming_decl (TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1459, __FUNCTION__))->typed.type)); |
1460 | else if (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1460, __FUNCTION__))->decl_minimal.name) == NULL_TREE(tree) nullptr) |
1461 | { |
1462 | found = true; |
1463 | gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl))((void)(!((((contains_struct_check ((decl), (TS_DECL_WITH_VIS ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1463, __FUNCTION__))->decl_with_vis.assembler_name) != ( tree) nullptr)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1463, __FUNCTION__), 0 : 0)); |
1464 | const char *decomp_str = NULLnullptr; |
1465 | size_t decomp_len = 0; |
1466 | if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL) |
1467 | && DECL_DECOMPOSITION_P (decl)((((enum tree_code) (decl)->base.code) == VAR_DECL) && ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1467, __FUNCTION__))->decl_common.lang_specific) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1467, __FUNCTION__))->decl_common.lang_specific)->u.base .selector == lds_decomp : false) |
1468 | && DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1468, __FUNCTION__))->decl_minimal.name) == NULL_TREE(tree) nullptr |
1469 | && DECL_NAMESPACE_SCOPE_P (decl)(!(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1469, __FUNCTION__))->decl_common.lang_flag_0) && (((enum tree_code) (decl)->base.code) == CONST_DECL || (( enum tree_code) (decl)->base.code) == PARM_DECL || ((enum tree_code ) (decl)->base.code) == TYPE_DECL || ((enum tree_code) (decl )->base.code) == TEMPLATE_DECL)) && ((enum tree_code ) ((!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1469, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1469, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1469, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL]))->base.code) == NAMESPACE_DECL)) |
1470 | decomp_str = find_decomp_unqualified_name (decl, &decomp_len); |
1471 | if (decomp_str) |
1472 | write_chars (decomp_str, decomp_len)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((decomp_len)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (decomp_str), __len); __o->next_free += __len ; (void) 0; }); |
1473 | else |
1474 | write_source_name (DECL_ASSEMBLER_NAME (decl)decl_assembler_name (decl)); |
1475 | } |
1476 | else if (DECL_DECLARES_FUNCTION_P (decl)(((enum tree_code) (decl)->base.code) == FUNCTION_DECL || ( ((enum tree_code) (decl)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1476, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1476, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL))) |
1477 | { |
1478 | found = true; |
1479 | if (DECL_CONSTRUCTOR_P (decl)((tree_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1479, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1479, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_constructor )) |
1480 | write_special_name_constructor (decl); |
1481 | else if (DECL_DESTRUCTOR_P (decl)((tree_check (((((enum tree_code) (decl)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1481, __FUNCTION__, (TEMPLATE_DECL))))))))->result : decl )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1481, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_destructor )) |
1482 | write_special_name_destructor (decl); |
1483 | else if (DECL_CONV_FN_P (decl)((((tree_not_check2 (((tree_check ((((contains_struct_check ( (decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1) & (!((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1483, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)))) |
1484 | { |
1485 | /* Conversion operator. Handle it right here. |
1486 | <operator> ::= cv <type> */ |
1487 | tree type; |
1488 | if (maybe_template_info (decl)) |
1489 | { |
1490 | tree fn_type; |
1491 | fn_type = get_mostly_instantiated_function_type (decl); |
1492 | type = TREE_TYPE (fn_type)((contains_struct_check ((fn_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1492, __FUNCTION__))->typed.type); |
1493 | } |
1494 | else if (FNDECL_USED_AUTO (decl)((tree_not_check2 (((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1494, __FUNCTION__, (FUNCTION_DECL)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1494, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) |
1495 | type = DECL_SAVED_AUTO_RETURN_TYPE (decl)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) ((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL))))->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check (((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (TEMPLATE_DECL))))))))->result : (tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL))))), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__))->decl_common.lang_specific); if (!( ((enum tree_code) ((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL))))->base.code) == FUNCTION_DECL || (((enum tree_code) ((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL))))->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check (((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check (((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (FUNCTION_DECL)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1495, __FUNCTION__); <->u.fn; }) ->u.saved_auto_return_type ); |
1496 | else |
1497 | type = DECL_CONV_FN_TYPE (decl)((contains_struct_check (((((void)(!(((((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1) & (!((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__), 0 : 0)), ((contains_struct_check ((decl ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__))->decl_minimal.name))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1497, __FUNCTION__))->typed.type); |
1498 | write_conversion_operator_name (type); |
1499 | } |
1500 | else if (DECL_OVERLOADED_OPERATOR_P (decl)(((tree_not_check2 (((tree_check ((((contains_struct_check (( decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1500, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1500, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1500, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
1501 | { |
1502 | tree t; |
1503 | if (!(t = DECL_RAMP_FN (decl)(coro_get_ramp_function (decl)))) |
1504 | t = decl; |
1505 | const char *mangled_name |
1506 | = (ovl_op_info[DECL_ASSIGNMENT_OPERATOR_P (t)(((((tree_not_check2 (((tree_check ((((contains_struct_check ( (t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & (!((tree_not_check2 (((tree_check ((((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1))) & ((tree_not_check2 (((tree_check ((((contains_struct_check ((t), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1506, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0))] |
1507 | [DECL_OVERLOADED_OPERATOR_CODE_RAW (t)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (t)->base.code) == TEMPLATE_DECL ? ( (struct tree_template_decl *)(const_cast<union tree_node * > ((((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1507, __FUNCTION__, (TEMPLATE_DECL))))))))->result : t)) , (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1507, __FUNCTION__))->decl_common.lang_specific); if (!( ((enum tree_code) (t)->base.code) == FUNCTION_DECL || (((enum tree_code) (t)->base.code) == TEMPLATE_DECL && (( struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1507, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1507, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1507, __FUNCTION__); <->u.fn; })->ovl_op_code)].mangled_name); |
1508 | write_string (mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, (mangled_name), __len); __o-> next_free += __len; (void) 0; }); |
1509 | } |
1510 | else if (UDLIT_OPER_P (DECL_NAME (decl))(!strncmp (((const char *) (tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1510, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1510, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ), "operator\"\"", sizeof ("operator\"\"") - 1))) |
1511 | write_literal_operator_name (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1511, __FUNCTION__))->decl_minimal.name)); |
1512 | else |
1513 | found = false; |
1514 | } |
1515 | |
1516 | if (found) |
1517 | /* OK */; |
1518 | else if (VAR_OR_FUNCTION_DECL_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL || ((enum tree_code) (decl)->base.code) == FUNCTION_DECL) && ! TREE_PUBLIC (decl)((decl)->base.public_flag) |
1519 | && DECL_NAMESPACE_SCOPE_P (decl)(!(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1519, __FUNCTION__))->decl_common.lang_flag_0) && (((enum tree_code) (decl)->base.code) == CONST_DECL || (( enum tree_code) (decl)->base.code) == PARM_DECL || ((enum tree_code ) (decl)->base.code) == TYPE_DECL || ((enum tree_code) (decl )->base.code) == TEMPLATE_DECL)) && ((enum tree_code ) ((!(! (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1519, __FUNCTION__))->decl_minimal.context)) || ((enum tree_code ) (((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1519, __FUNCTION__))->decl_minimal.context))->base.code ) == TRANSLATION_UNIT_DECL) ? ((contains_struct_check ((decl) , (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1519, __FUNCTION__))->decl_minimal.context) : cp_global_trees [CPTI_GLOBAL]))->base.code) == NAMESPACE_DECL) |
1520 | && decl_linkage (decl) == lk_internal) |
1521 | { |
1522 | MANGLE_TRACE_TREE ("local-source-name", decl); |
1523 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
1524 | write_source_name (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1524, __FUNCTION__))->decl_minimal.name)); |
1525 | /* The default discriminator is 1, and that's all we ever use, |
1526 | so there's no code to output one here. */ |
1527 | } |
1528 | else |
1529 | { |
1530 | tree type = TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1530, __FUNCTION__))->typed.type); |
1531 | |
1532 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL |
1533 | && TYPE_UNNAMED_P (type)((((((tree_class_check ((((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name))) && ((tree_check ((((((tree_class_check ((((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__, (IDENTIFIER_NODE)))->base.private_flag )) && !((tree_check ((((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1533, __FUNCTION__, (IDENTIFIER_NODE)))->base.protected_flag ))) |
1534 | write_unnamed_type_name (type); |
1535 | else if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL && LAMBDA_TYPE_P (type)(((enum tree_code) (type)->base.code) == RECORD_TYPE && ((((tree_class_check ((((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name))) && ((tree_check ((((((tree_class_check ((((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1535, __FUNCTION__, (IDENTIFIER_NODE)))->base.protected_flag ))) |
1536 | write_closure_type_name (type); |
1537 | else |
1538 | write_source_name (DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1538, __FUNCTION__))->decl_minimal.name)); |
1539 | } |
1540 | |
1541 | /* We use the ABI tags from the primary class template, ignoring tags on any |
1542 | specializations. This is necessary because C++ doesn't require a |
1543 | specialization to be declared before it is used unless the use requires a |
1544 | complete type, but we need to get the tags right on incomplete types as |
1545 | well. */ |
1546 | if (tree tmpl = most_general_template (decl)) |
1547 | { |
1548 | tree res = DECL_TEMPLATE_RESULT (tmpl)((struct tree_template_decl *)(const_cast<union tree_node * > ((((tree_check ((tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1548, __FUNCTION__, (TEMPLATE_DECL))))))))->result; |
1549 | if (res == NULL_TREE(tree) nullptr) |
1550 | /* UNBOUND_CLASS_TEMPLATE. */; |
1551 | else if (DECL_DECLARES_TYPE_P (decl)(((enum tree_code) (decl)->base.code) == TYPE_DECL || (((enum tree_code) (decl)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1551, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((decl ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1551, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == TYPE_DECL))) |
1552 | decl = res; |
1553 | else if (any_abi_below (11)(!(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) || !(warn_abi_version == 0 || warn_abi_version >= (11)) || !(global_options.x_flag_abi_compat_version == 0 || global_options .x_flag_abi_compat_version >= (11)))) |
1554 | { |
1555 | /* ABI v10 implicit tags on the template. */ |
1556 | tree mtags = missing_abi_tags (res); |
1557 | /* Explicit tags on the template. */ |
1558 | tree ttags = get_abi_tags (res); |
1559 | /* Tags on the instantiation. */ |
1560 | tree dtags = get_abi_tags (decl); |
1561 | |
1562 | if (mtags && abi_warn_or_compat_version_crosses (10)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10)) != (warn_abi_version == 0 || warn_abi_version >= (10))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (10)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (10)) ))) |
1563 | G.need_abi_warning = 1; |
1564 | |
1565 | /* Add the v10 tags to the explicit tags now. */ |
1566 | mtags = chainon (mtags, ttags); |
1567 | |
1568 | if (!G.need_abi_warning |
1569 | && abi_warn_or_compat_version_crosses (11)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) != (warn_abi_version == 0 || warn_abi_version >= (11))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (11)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (11)) )) |
1570 | && !equal_abi_tags (dtags, mtags)) |
1571 | G.need_abi_warning = 1; |
1572 | |
1573 | if (!abi_version_at_least (10)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10))) |
1574 | /* In abi <10, we only got the explicit tags. */ |
1575 | decl = res; |
1576 | else if (flag_abi_versionglobal_options.x_flag_abi_version == 10) |
1577 | { |
1578 | /* In ABI 10, we want explict and implicit tags. */ |
1579 | write_abi_tags (mtags); |
1580 | return; |
1581 | } |
1582 | } |
1583 | } |
1584 | |
1585 | tree tags = get_abi_tags (decl); |
1586 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == FUNCTION_DECL && DECL_CONV_FN_P (decl)((((tree_not_check2 (((tree_check ((((contains_struct_check ( (decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1) & (!((tree_not_check2 (((tree_check ((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1586, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0))) |
1587 | && any_abi_below (11)(!(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) || !(warn_abi_version == 0 || warn_abi_version >= (11)) || !(global_options.x_flag_abi_compat_version == 0 || global_options .x_flag_abi_compat_version >= (11)))) |
1588 | if (tree mtags = missing_abi_tags (decl)) |
1589 | { |
1590 | if (abi_warn_or_compat_version_crosses (11)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) != (warn_abi_version == 0 || warn_abi_version >= (11))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (11)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (11)) ))) |
1591 | G.need_abi_warning = true; |
1592 | if (!abi_version_at_least (11)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11))) |
1593 | tags = chainon (mtags, tags); |
1594 | } |
1595 | write_abi_tags (tags); |
1596 | } |
1597 | |
1598 | /* Write the unqualified-name for a conversion operator to TYPE. */ |
1599 | |
1600 | static void |
1601 | write_conversion_operator_name (const tree type) |
1602 | { |
1603 | write_string ("cv")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("cv")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("cv"), __len); __o->next_free += __len ; (void) 0; }); |
1604 | write_type (type); |
1605 | } |
1606 | |
1607 | /* Non-terminal <source-name>. IDENTIFIER is an IDENTIFIER_NODE. |
1608 | |
1609 | <source-name> ::= </length/ number> <identifier> */ |
1610 | |
1611 | static void |
1612 | write_source_name (tree identifier) |
1613 | { |
1614 | MANGLE_TRACE_TREE ("source-name", identifier); |
1615 | |
1616 | write_unsigned_number (IDENTIFIER_LENGTH (identifier))write_number ((((tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1616, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len )), 1, 10); |
1617 | write_identifier (IDENTIFIER_POINTER (identifier)((const char *) (tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1617, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str )); |
1618 | } |
1619 | |
1620 | /* Compare two TREE_STRINGs like strcmp. */ |
1621 | |
1622 | int |
1623 | tree_string_cmp (const void *p1, const void *p2) |
1624 | { |
1625 | if (p1 == p2) |
1626 | return 0; |
1627 | tree s1 = *(const tree*)p1; |
1628 | tree s2 = *(const tree*)p2; |
1629 | return strcmp (TREE_STRING_POINTER (s1)((const char *)((tree_check ((s1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1629, __FUNCTION__, (STRING_CST)))->string.str)), |
1630 | TREE_STRING_POINTER (s2)((const char *)((tree_check ((s2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1630, __FUNCTION__, (STRING_CST)))->string.str))); |
1631 | } |
1632 | |
1633 | /* Return the TREE_LIST of TAGS as a sorted VEC. */ |
1634 | |
1635 | static vec<tree, va_gc> * |
1636 | sorted_abi_tags (tree tags) |
1637 | { |
1638 | vec<tree, va_gc> * vec = make_tree_vector(); |
1639 | |
1640 | for (tree t = tags; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1640, __FUNCTION__))->common.chain)) |
1641 | { |
1642 | if (ABI_TAG_IMPLICIT (t)((tree_not_check2 (((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1642, __FUNCTION__, (TREE_LIST)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1642, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
1643 | continue; |
1644 | tree str = TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1644, __FUNCTION__, (TREE_LIST)))->list.value); |
1645 | vec_safe_push (vec, str); |
1646 | } |
1647 | |
1648 | vec->qsort (tree_string_cmp)qsort (tree_string_cmp); |
1649 | |
1650 | return vec; |
1651 | } |
1652 | |
1653 | /* ID is the name of a function or type with abi_tags attribute TAGS. |
1654 | Write out the name, suitably decorated. */ |
1655 | |
1656 | static void |
1657 | write_abi_tags (tree tags) |
1658 | { |
1659 | if (tags == NULL_TREE(tree) nullptr) |
1660 | return; |
1661 | |
1662 | vec<tree, va_gc> * vec = sorted_abi_tags (tags); |
1663 | |
1664 | unsigned i; tree str; |
1665 | FOR_EACH_VEC_ELT (*vec, i, str)for (i = 0; (*vec).iterate ((i), &(str)); ++(i)) |
1666 | { |
1667 | write_string ("B")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("B")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, ("B"), __len); __o->next_free += __len; (void ) 0; }); |
1668 | write_unsigned_number (TREE_STRING_LENGTH (str) - 1)write_number ((((tree_check ((str), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1668, __FUNCTION__, (STRING_CST)))->string.length) - 1), 1, 10); |
1669 | write_identifier (TREE_STRING_POINTER (str)((const char *)((tree_check ((str), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1669, __FUNCTION__, (STRING_CST)))->string.str))); |
1670 | } |
1671 | |
1672 | release_tree_vector (vec); |
1673 | } |
1674 | |
1675 | /* True iff the TREE_LISTS T1 and T2 of ABI tags are equivalent. */ |
1676 | |
1677 | static bool |
1678 | equal_abi_tags (tree t1, tree t2) |
1679 | { |
1680 | releasing_vec v1 = sorted_abi_tags (t1); |
1681 | releasing_vec v2 = sorted_abi_tags (t2); |
1682 | |
1683 | unsigned len1 = v1->length(); |
1684 | if (len1 != v2->length()) |
1685 | return false; |
1686 | for (unsigned i = 0; i < len1; ++i) |
1687 | if (tree_string_cmp (v1[i], v2[i]) != 0) |
1688 | return false; |
1689 | return true; |
1690 | } |
1691 | |
1692 | /* Write a user-defined literal operator. |
1693 | ::= li <source-name> # "" <source-name> |
1694 | IDENTIFIER is an LITERAL_IDENTIFIER_NODE. */ |
1695 | |
1696 | static void |
1697 | write_literal_operator_name (tree identifier) |
1698 | { |
1699 | const char* suffix = UDLIT_OP_SUFFIX (identifier)(((const char *) (tree_check ((identifier), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1699, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ) + sizeof ("operator\"\"") - 1); |
1700 | write_identifier (UDLIT_OP_MANGLED_PREFIX"li"); |
1701 | write_unsigned_number (strlen (suffix))write_number ((strlen (suffix)), 1, 10); |
1702 | write_identifier (suffix); |
1703 | } |
1704 | |
1705 | /* Encode 0 as _, and 1+ as n-1_. */ |
1706 | |
1707 | static void |
1708 | write_compact_number (int num) |
1709 | { |
1710 | gcc_checking_assert (num >= 0)((void)(!(num >= 0) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1710, __FUNCTION__), 0 : 0)); |
1711 | if (num > 0) |
1712 | write_unsigned_number (num - 1)write_number ((num - 1), 1, 10); |
1713 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
1714 | } |
1715 | |
1716 | /* Return how many unnamed types precede TYPE in its enclosing class. */ |
1717 | |
1718 | static int |
1719 | nested_anon_class_index (tree type) |
1720 | { |
1721 | int index = 0; |
1722 | tree member = TYPE_FIELDS (TYPE_CONTEXT (type))((tree_check3 ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1722, __FUNCTION__))->type_common.context)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1722, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_non_common.values); |
1723 | for (; member; member = DECL_CHAIN (member)(((contains_struct_check (((contains_struct_check ((member), ( TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1723, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1723, __FUNCTION__))->common.chain))) |
1724 | if (DECL_IMPLICIT_TYPEDEF_P (member)(((enum tree_code) (member)->base.code) == TYPE_DECL && ((contains_struct_check ((member), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1724, __FUNCTION__))->decl_common.lang_flag_2))) |
1725 | { |
1726 | tree memtype = TREE_TYPE (member)((contains_struct_check ((member), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1726, __FUNCTION__))->typed.type); |
1727 | if (memtype == type) |
1728 | return index; |
1729 | else if (TYPE_UNNAMED_P (memtype)((((((tree_class_check ((((tree_class_check ((memtype), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name))) && ((tree_check ((((((tree_class_check ((((tree_class_check ((memtype), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__, (IDENTIFIER_NODE)))->base.private_flag )) && !((tree_check ((((((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((memtype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1729, __FUNCTION__, (IDENTIFIER_NODE)))->base.protected_flag ))) |
1730 | ++index; |
1731 | } |
1732 | |
1733 | if (seen_error ()) |
1734 | return -1; |
1735 | |
1736 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1736, __FUNCTION__)); |
1737 | } |
1738 | |
1739 | /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */ |
1740 | |
1741 | static void |
1742 | write_unnamed_type_name (const tree type) |
1743 | { |
1744 | int discriminator; |
1745 | MANGLE_TRACE_TREE ("unnamed-type-name", type); |
1746 | |
1747 | if (TYPE_FUNCTION_SCOPE_P (type)(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1747, __FUNCTION__))->type_common.context) && (( enum tree_code) (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1747, __FUNCTION__))->type_common.context))->base.code ) == FUNCTION_DECL)) |
1748 | discriminator = discriminator_for_local_entity (TYPE_NAME (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1748, __FUNCTION__))->type_common.name)); |
1749 | else if (TYPE_CLASS_SCOPE_P (type)(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1749, __FUNCTION__))->type_common.context) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1749, __FUNCTION__))->type_common.context))->base.code ))] == tcc_type))) |
1750 | discriminator = nested_anon_class_index (type); |
1751 | else |
1752 | { |
1753 | gcc_assert (no_linkage_check (type, /*relaxed_p=*/true))((void)(!(no_linkage_check (type, true)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1753, __FUNCTION__), 0 : 0)); |
1754 | /* Just use the old mangling at namespace scope. */ |
1755 | write_source_name (TYPE_IDENTIFIER (type)(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1755, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1755, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1755, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1755, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1755, __FUNCTION__))->type_common.name))); |
1756 | return; |
1757 | } |
1758 | |
1759 | write_string ("Ut")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Ut")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Ut"), __len); __o->next_free += __len ; (void) 0; }); |
1760 | write_compact_number (discriminator); |
1761 | } |
1762 | |
1763 | // A template head, for templated lambdas. |
1764 | // <template-head> ::= Tp* Ty |
1765 | // Tp* Tn <type> |
1766 | // Tp* Tt <template-head> E |
1767 | // New in ABI=18. Returns true iff we emitted anything -- used for ABI |
1768 | // version warning. |
1769 | |
1770 | static bool |
1771 | write_closure_template_head (tree tmpl) |
1772 | { |
1773 | bool any = false; |
1774 | |
1775 | // We only need one level of template parms |
1776 | tree inner = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl))((tree_check ((((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((tmpl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1776, __FUNCTION__, (TEMPLATE_DECL))))))))->arguments), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1776, __FUNCTION__, (TREE_LIST)))->list.value); |
1777 | |
1778 | for (int ix = 0, len = TREE_VEC_LENGTH (inner)((tree_check ((inner), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1778, __FUNCTION__, (TREE_VEC)))->base.u.length); ix != len; ix++) |
1779 | { |
1780 | tree parm = TREE_VEC_ELT (inner, ix)(*((const_cast<tree *> (tree_vec_elt_check ((inner), (ix ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1780, __FUNCTION__))))); |
1781 | if (parm == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
1782 | continue; |
1783 | parm = TREE_VALUE (parm)((tree_check ((parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1783, __FUNCTION__, (TREE_LIST)))->list.value); |
1784 | |
1785 | if (DECL_VIRTUAL_P (parm)((contains_struct_check ((parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1785, __FUNCTION__))->decl_common.virtual_flag)) |
1786 | // A synthetic parm, we're done. |
1787 | break; |
1788 | |
1789 | any = true; |
1790 | if (abi_version_at_least (18)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18))) |
1791 | { |
1792 | if (TREE_CODE (parm)((enum tree_code) (parm)->base.code) == PARM_DECL |
1793 | ? TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm))(((tree_not_check2 (((tree_check ((((contains_struct_check (( parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1793, __FUNCTION__))->decl_common.initial)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1793, __FUNCTION__, (TEMPLATE_PARM_INDEX)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1793, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
1794 | : TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (parm))((((tree_not_check2 (((tree_check (((((tree_class_check (((tree_check3 (((((contains_struct_check ((parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1794, __FUNCTION__))->typed.type))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1794, __FUNCTION__, (TEMPLATE_TYPE_PARM), (TEMPLATE_TEMPLATE_PARM ), (BOUND_TEMPLATE_TEMPLATE_PARM)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1794, __FUNCTION__))->type_non_common.values))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1794, __FUNCTION__, (TEMPLATE_PARM_INDEX)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1794, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)))) |
1795 | write_string ("Tp")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Tp")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Tp"), __len); __o->next_free += __len ; (void) 0; }); |
1796 | |
1797 | switch (TREE_CODE (parm)((enum tree_code) (parm)->base.code)) |
1798 | { |
1799 | default: |
1800 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1800, __FUNCTION__)); |
1801 | |
1802 | case TYPE_DECL: |
1803 | write_string ("Ty")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Ty")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Ty"), __len); __o->next_free += __len ; (void) 0; }); |
1804 | break; |
1805 | |
1806 | case PARM_DECL: |
1807 | write_string ("Tn")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Tn")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Tn"), __len); __o->next_free += __len ; (void) 0; }); |
1808 | write_type (TREE_TYPE (parm)((contains_struct_check ((parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1808, __FUNCTION__))->typed.type)); |
1809 | break; |
1810 | |
1811 | case TEMPLATE_DECL: |
1812 | write_string ("Tt")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Tt")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Tt"), __len); __o->next_free += __len ; (void) 0; }); |
1813 | write_closure_template_head (parm); |
1814 | write_string ("E")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("E")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, ("E"), __len); __o->next_free += __len; (void ) 0; }); |
1815 | break; |
1816 | } |
1817 | } |
1818 | } |
1819 | |
1820 | return any; |
1821 | } |
1822 | |
1823 | /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ |
1824 | <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters */ |
1825 | |
1826 | static void |
1827 | write_closure_type_name (const tree type) |
1828 | { |
1829 | tree fn = lambda_function (type); |
1830 | tree lambda = CLASSTYPE_LAMBDA_EXPR (type)((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1830, __FUNCTION__))->type_with_lang_specific.lang_specific ))->lambda_expr); |
1831 | tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn))((tree_check2 ((((contains_struct_check ((fn), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1831, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1831, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .values); |
1832 | |
1833 | MANGLE_TRACE_TREE ("closure-type-name", type); |
1834 | |
1835 | write_string ("Ul")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Ul")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Ul"), __len); __o->next_free += __len ; (void) 0; }); |
1836 | |
1837 | if (auto ti = maybe_template_info (fn)) |
1838 | if (write_closure_template_head (TI_TEMPLATE (ti)((struct tree_template_info*)(tree_check ((ti), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1838, __FUNCTION__, (TEMPLATE_INFO))))->tmpl)) |
1839 | // If there were any explicit template parms, we may need to |
1840 | // issue a mangling diagnostic. |
1841 | if (abi_warn_or_compat_version_crosses (18)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18)) != (warn_abi_version == 0 || warn_abi_version >= (18))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (18)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (18)) ))) |
1842 | G.need_abi_warning = true; |
1843 | |
1844 | write_method_parms (parms, TREE_CODE (TREE_TYPE (fn))((enum tree_code) (((contains_struct_check ((fn), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1844, __FUNCTION__))->typed.type))->base.code) == METHOD_TYPE, fn); |
1845 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
1846 | if ((LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR (lambda)(((struct tree_lambda_expr *)(tree_check ((lambda), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1846, __FUNCTION__, (LAMBDA_EXPR))))->discriminator_sig) |
1847 | != LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR (lambda)(((struct tree_lambda_expr *)(tree_check ((lambda), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1847, __FUNCTION__, (LAMBDA_EXPR))))->discriminator_scope )) |
1848 | && abi_warn_or_compat_version_crosses (18)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18)) != (warn_abi_version == 0 || warn_abi_version >= (18))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (18)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (18)) ))) |
1849 | G.need_abi_warning = true; |
1850 | write_compact_number (abi_version_at_least (18)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (18)) |
1851 | ? LAMBDA_EXPR_SCOPE_SIG_DISCRIMINATOR (lambda)(((struct tree_lambda_expr *)(tree_check ((lambda), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1851, __FUNCTION__, (LAMBDA_EXPR))))->discriminator_sig) |
1852 | : LAMBDA_EXPR_SCOPE_ONLY_DISCRIMINATOR (lambda)(((struct tree_lambda_expr *)(tree_check ((lambda), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1852, __FUNCTION__, (LAMBDA_EXPR))))->discriminator_scope )); |
1853 | } |
1854 | |
1855 | /* Convert NUMBER to ascii using base BASE and generating at least |
1856 | MIN_DIGITS characters. BUFFER points to the _end_ of the buffer |
1857 | into which to store the characters. Returns the number of |
1858 | characters generated (these will be laid out in advance of where |
1859 | BUFFER points). */ |
1860 | |
1861 | static int |
1862 | hwint_to_ascii (unsigned HOST_WIDE_INTlong number, const unsigned int base, |
1863 | char *buffer, const unsigned int min_digits) |
1864 | { |
1865 | static const char base_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
1866 | unsigned digits = 0; |
1867 | |
1868 | while (number) |
1869 | { |
1870 | unsigned HOST_WIDE_INTlong d = number / base; |
1871 | |
1872 | *--buffer = base_digits[number - d * base]; |
1873 | digits++; |
1874 | number = d; |
1875 | } |
1876 | while (digits < min_digits) |
1877 | { |
1878 | *--buffer = base_digits[0]; |
1879 | digits++; |
1880 | } |
1881 | return digits; |
1882 | } |
1883 | |
1884 | /* Non-terminal <number>. |
1885 | |
1886 | <number> ::= [n] </decimal integer/> */ |
1887 | |
1888 | static void |
1889 | write_number (unsigned HOST_WIDE_INTlong number, const int unsigned_p, |
1890 | const unsigned int base) |
1891 | { |
1892 | char buffer[sizeof (HOST_WIDE_INTlong) * 8]; |
1893 | unsigned count = 0; |
1894 | |
1895 | if (!unsigned_p && (HOST_WIDE_INTlong) number < 0) |
1896 | { |
1897 | write_char ('n')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('n')))); }); |
1898 | number = -((HOST_WIDE_INTlong) number); |
1899 | } |
1900 | count = hwint_to_ascii (number, base, buffer + sizeof (buffer), 1); |
1901 | write_chars (buffer + sizeof (buffer) - count, count)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((count)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (buffer + sizeof (buffer) - count), __len); __o ->next_free += __len; (void) 0; }); |
1902 | } |
1903 | |
1904 | /* Write out an integral CST in decimal. Most numbers are small, and |
1905 | representable in a HOST_WIDE_INT. Occasionally we'll have numbers |
1906 | bigger than that, which we must deal with. */ |
1907 | |
1908 | static inline void |
1909 | write_integer_cst (const tree cst) |
1910 | { |
1911 | int sign = tree_int_cst_sgn (cst); |
1912 | widest_int abs_value = wi::abs (wi::to_widest (cst)); |
1913 | if (!wi::fits_uhwi_p (abs_value)) |
1914 | { |
1915 | /* A bignum. We do this in chunks, each of which fits in a |
1916 | HOST_WIDE_INT. */ |
1917 | char buffer[sizeof (HOST_WIDE_INTlong) * 8 * 2]; |
1918 | unsigned HOST_WIDE_INTlong chunk; |
1919 | unsigned chunk_digits; |
1920 | char *ptr = buffer + sizeof (buffer); |
1921 | unsigned count = 0; |
1922 | tree n, base, type; |
1923 | int done; |
1924 | |
1925 | /* HOST_WIDE_INT must be at least 32 bits, so 10^9 is |
1926 | representable. */ |
1927 | chunk = 1000000000; |
1928 | chunk_digits = 9; |
Value stored to 'chunk_digits' is never read | |
1929 | |
1930 | if (sizeof (HOST_WIDE_INTlong) >= 8) |
1931 | { |
1932 | /* It is at least 64 bits, so 10^18 is representable. */ |
1933 | chunk_digits = 18; |
1934 | chunk *= chunk; |
1935 | } |
1936 | |
1937 | type = c_common_signed_or_unsigned_type (1, TREE_TYPE (cst)((contains_struct_check ((cst), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1937, __FUNCTION__))->typed.type)); |
1938 | base = build_int_cstu (type, chunk); |
1939 | n = wide_int_to_tree (type, wi::to_wide (cst)); |
1940 | |
1941 | if (sign < 0) |
1942 | { |
1943 | write_char ('n')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('n')))); }); |
1944 | n = fold_build1_loc (input_location, NEGATE_EXPR, type, n); |
1945 | } |
1946 | do |
1947 | { |
1948 | tree d = fold_build2_loc (input_location, FLOOR_DIV_EXPR, type, n, base); |
1949 | tree tmp = fold_build2_loc (input_location, MULT_EXPR, type, d, base); |
1950 | unsigned c; |
1951 | |
1952 | done = integer_zerop (d); |
1953 | tmp = fold_build2_loc (input_location, MINUS_EXPR, type, n, tmp); |
1954 | c = hwint_to_ascii (TREE_INT_CST_LOW (tmp)((unsigned long) (*tree_int_cst_elt_check ((tmp), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 1954, __FUNCTION__))), 10, ptr, |
1955 | done ? 1 : chunk_digits); |
1956 | ptr -= c; |
1957 | count += c; |
1958 | n = d; |
1959 | } |
1960 | while (!done); |
1961 | write_chars (ptr, count)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((count)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (ptr), __len); __o->next_free += __len; (void ) 0; }); |
1962 | } |
1963 | else |
1964 | { |
1965 | /* A small num. */ |
1966 | if (sign < 0) |
1967 | write_char ('n')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('n')))); }); |
1968 | write_unsigned_number (abs_value.to_uhwi ())write_number ((abs_value.to_uhwi ()), 1, 10); |
1969 | } |
1970 | } |
1971 | |
1972 | /* Write out a floating-point literal. |
1973 | |
1974 | "Floating-point literals are encoded using the bit pattern of the |
1975 | target processor's internal representation of that number, as a |
1976 | fixed-length lowercase hexadecimal string, high-order bytes first |
1977 | (even if the target processor would store low-order bytes first). |
1978 | The "n" prefix is not used for floating-point literals; the sign |
1979 | bit is encoded with the rest of the number. |
1980 | |
1981 | Here are some examples, assuming the IEEE standard representation |
1982 | for floating point numbers. (Spaces are for readability, not |
1983 | part of the encoding.) |
1984 | |
1985 | 1.0f Lf 3f80 0000 E |
1986 | -1.0f Lf bf80 0000 E |
1987 | 1.17549435e-38f Lf 0080 0000 E |
1988 | 1.40129846e-45f Lf 0000 0001 E |
1989 | 0.0f Lf 0000 0000 E" |
1990 | |
1991 | Caller is responsible for the Lx and the E. */ |
1992 | static void |
1993 | write_real_cst (const tree value) |
1994 | { |
1995 | long target_real[4]; /* largest supported float */ |
1996 | /* Buffer for eight hex digits in a 32-bit number but big enough |
1997 | even for 64-bit long to avoid warnings. */ |
1998 | char buffer[17]; |
1999 | int i, limit, dir; |
2000 | |
2001 | tree type = TREE_TYPE (value)((contains_struct_check ((value), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2001, __FUNCTION__))->typed.type); |
2002 | int words = GET_MODE_BITSIZE (SCALAR_FLOAT_TYPE_MODE (type)(as_a <scalar_float_mode> ((tree_class_check ((type), ( tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2002, __FUNCTION__))->type_common.mode))) / 32; |
2003 | |
2004 | real_to_target (target_real, &TREE_REAL_CST (value)(*(&(tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2004, __FUNCTION__, (REAL_CST)))->real_cst.value)), |
2005 | TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2005, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode)); |
2006 | |
2007 | /* The value in target_real is in the target word order, |
2008 | so we must write it out backward if that happens to be |
2009 | little-endian. write_number cannot be used, it will |
2010 | produce uppercase. */ |
2011 | if (FLOAT_WORDS_BIG_ENDIAN0) |
2012 | i = 0, limit = words, dir = 1; |
2013 | else |
2014 | i = words - 1, limit = -1, dir = -1; |
2015 | |
2016 | for (; i != limit; i += dir) |
2017 | { |
2018 | sprintf (buffer, "%08lx", (unsigned long) target_real[i]); |
2019 | write_chars (buffer, 8)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = ((8)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, (buffer), __len); __o->next_free += __len; (void) 0; }); |
2020 | } |
2021 | } |
2022 | |
2023 | /* Non-terminal <identifier>. |
2024 | |
2025 | <identifier> ::= </unqualified source code identifier> */ |
2026 | |
2027 | static void |
2028 | write_identifier (const char *identifier) |
2029 | { |
2030 | MANGLE_TRACE ("identifier", identifier); |
2031 | write_string (identifier)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (identifier)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (identifier), __len); __o->next_free += __len; (void) 0; }); |
2032 | } |
2033 | |
2034 | /* Handle constructor productions of non-terminal <special-name>. |
2035 | CTOR is a constructor FUNCTION_DECL. |
2036 | |
2037 | <special-name> ::= C1 # complete object constructor |
2038 | ::= C2 # base object constructor |
2039 | ::= C3 # complete object allocating constructor |
2040 | |
2041 | Currently, allocating constructors are never used. */ |
2042 | |
2043 | static void |
2044 | write_special_name_constructor (const tree ctor) |
2045 | { |
2046 | write_char ('C')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('C')))); }); |
2047 | bool new_inh = (flag_new_inheriting_ctorsglobal_options.x_flag_new_inheriting_ctors |
2048 | && DECL_INHERITED_CTOR (ctor)((((enum tree_code) (ctor)->base.code) == FUNCTION_DECL || (((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) && ((tree_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_constructor ) ? __extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__))->decl_common.lang_specific); if (!( ((enum tree_code) (ctor)->base.code) == FUNCTION_DECL || ( ((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2048, __FUNCTION__); <->u.fn; })->context : (tree ) nullptr)); |
2049 | if (new_inh) |
2050 | write_char ('I')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('I')))); }); |
2051 | if (DECL_BASE_CONSTRUCTOR_P (ctor)(((contains_struct_check ((ctor), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2051, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_BASE_CTOR_IDENTIFIER])) |
2052 | write_char ('2')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('2')))); }); |
2053 | /* This is the old-style "[unified]" constructor. |
2054 | In some cases, we may emit this function and call |
2055 | it from the clones in order to share code and save space. */ |
2056 | else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (ctor)(((contains_struct_check ((ctor), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2056, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_CTOR_IDENTIFIER])) |
2057 | write_char ('4')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('4')))); }); |
2058 | else |
2059 | { |
2060 | gcc_assert (DECL_COMPLETE_CONSTRUCTOR_P (ctor))((void)(!((((contains_struct_check ((ctor), (TS_DECL_MINIMAL) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2060, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_COMPLETE_CTOR_IDENTIFIER])) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2060, __FUNCTION__), 0 : 0)); |
2061 | write_char ('1')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('1')))); }); |
2062 | } |
2063 | if (new_inh) |
2064 | write_type (DECL_INHERITED_CTOR_BASE (ctor)(((((enum tree_code) (ctor)->base.code) == FUNCTION_DECL || (((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) && ((tree_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_constructor ) ? __extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__))->decl_common.lang_specific); if (!( ((enum tree_code) (ctor)->base.code) == FUNCTION_DECL || ( ((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__); <->u.fn; })->context : (tree ) nullptr) ? ((contains_struct_check ((global_options.x_flag_new_inheriting_ctors ? strip_inheriting_ctors (ctor) : ((((enum tree_code) (ctor) ->base.code) == FUNCTION_DECL || (((enum tree_code) (ctor) ->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) && ((tree_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> (( ((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (FUNCTION_DECL)))->decl_with_vis.cxx_constructor ) ? __extension__ ({ struct lang_decl *lt = ((contains_struct_check (((((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result : ctor )), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__))->decl_common.lang_specific); if (!( ((enum tree_code) (ctor)->base.code) == FUNCTION_DECL || ( ((enum tree_code) (ctor)->base.code) == TEMPLATE_DECL && ((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree ) nullptr && ((enum tree_code) (((struct tree_template_decl *)(const_cast<union tree_node *> ((((tree_check ((ctor ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__, (TEMPLATE_DECL))))))))->result)-> base.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn ) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__); <->u.fn; })->context : (tree ) nullptr)), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2064, __FUNCTION__))->decl_minimal.context) : (tree) nullptr )); |
2065 | } |
2066 | |
2067 | /* Handle destructor productions of non-terminal <special-name>. |
2068 | DTOR is a destructor FUNCTION_DECL. |
2069 | |
2070 | <special-name> ::= D0 # deleting (in-charge) destructor |
2071 | ::= D1 # complete object (in-charge) destructor |
2072 | ::= D2 # base object (not-in-charge) destructor */ |
2073 | |
2074 | static void |
2075 | write_special_name_destructor (const tree dtor) |
2076 | { |
2077 | if (DECL_DELETING_DESTRUCTOR_P (dtor)(((contains_struct_check ((dtor), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2077, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_DELETING_DTOR_IDENTIFIER])) |
2078 | write_string ("D0")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("D0")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("D0"), __len); __o->next_free += __len ; (void) 0; }); |
2079 | else if (DECL_BASE_DESTRUCTOR_P (dtor)(((contains_struct_check ((dtor), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2079, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_BASE_DTOR_IDENTIFIER])) |
2080 | write_string ("D2")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("D2")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("D2"), __len); __o->next_free += __len ; (void) 0; }); |
2081 | else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor)(((contains_struct_check ((dtor), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2081, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_DTOR_IDENTIFIER])) |
2082 | /* This is the old-style "[unified]" destructor. |
2083 | In some cases, we may emit this function and call |
2084 | it from the clones in order to share code and save space. */ |
2085 | write_string ("D4")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("D4")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("D4"), __len); __o->next_free += __len ; (void) 0; }); |
2086 | else |
2087 | { |
2088 | gcc_assert (DECL_COMPLETE_DESTRUCTOR_P (dtor))((void)(!((((contains_struct_check ((dtor), (TS_DECL_MINIMAL) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2088, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_COMPLETE_DTOR_IDENTIFIER])) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2088, __FUNCTION__), 0 : 0)); |
2089 | write_string ("D1")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("D1")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("D1"), __len); __o->next_free += __len ; (void) 0; }); |
2090 | } |
2091 | } |
2092 | |
2093 | /* Return the discriminator for ENTITY appearing inside |
2094 | FUNCTION. The discriminator is the lexical ordinal of VAR or TYPE among |
2095 | entities with the same name and kind in the same FUNCTION. */ |
2096 | |
2097 | static int |
2098 | discriminator_for_local_entity (tree entity) |
2099 | { |
2100 | if (!DECL_LANG_SPECIFIC (entity)((contains_struct_check ((entity), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2100, __FUNCTION__))->decl_common.lang_specific)) |
2101 | { |
2102 | /* Some decls, like __FUNCTION__, don't need a discriminator. */ |
2103 | gcc_checking_assert (DECL_ARTIFICIAL (entity))((void)(!(((contains_struct_check ((entity), (TS_DECL_COMMON) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2103, __FUNCTION__))->decl_common.artificial_flag)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2103, __FUNCTION__), 0 : 0)); |
2104 | return 0; |
2105 | } |
2106 | else if (tree disc = DECL_DISCRIMINATOR (entity)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check ((entity), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2106, __FUNCTION__))->decl_common.lang_specific); if (!( (((enum tree_code) (entity)->base.code) == VAR_DECL || ((enum tree_code) (entity)->base.code) == FUNCTION_DECL) || ((enum tree_code) (entity)->base.code) == FIELD_DECL || ((enum tree_code ) (entity)->base.code) == CONST_DECL || ((enum tree_code) ( entity)->base.code) == TYPE_DECL || ((enum tree_code) (entity )->base.code) == TEMPLATE_DECL || ((enum tree_code) (entity )->base.code) == USING_DECL || ((enum tree_code) (entity)-> base.code) == CONCEPT_DECL)) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2106, __FUNCTION__); <->u.min; })->access)) |
2107 | return TREE_INT_CST_LOW (disc)((unsigned long) (*tree_int_cst_elt_check ((disc), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2107, __FUNCTION__))); |
2108 | else |
2109 | /* The first entity with a particular name doesn't get |
2110 | DECL_DISCRIMINATOR set up. */ |
2111 | return 0; |
2112 | } |
2113 | |
2114 | /* Return the discriminator for STRING, a string literal used inside |
2115 | FUNCTION. The discriminator is the lexical ordinal of STRING among |
2116 | string literals used in FUNCTION. */ |
2117 | |
2118 | static int |
2119 | discriminator_for_string_literal (tree /*function*/, |
2120 | tree /*string*/) |
2121 | { |
2122 | /* For now, we don't discriminate amongst string literals. */ |
2123 | return 0; |
2124 | } |
2125 | |
2126 | /* <discriminator> := _ <number> # when number < 10 |
2127 | := __ <number> _ # when number >= 10 |
2128 | |
2129 | The discriminator is used only for the second and later occurrences |
2130 | of the same name within a single function. In this case <number> is |
2131 | n - 2, if this is the nth occurrence, in lexical order. */ |
2132 | |
2133 | static void |
2134 | write_discriminator (const int discriminator) |
2135 | { |
2136 | /* If discriminator is zero, don't write anything. Otherwise... */ |
2137 | if (discriminator > 0) |
2138 | { |
2139 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
2140 | if (discriminator - 1 >= 10) |
2141 | { |
2142 | if (abi_warn_or_compat_version_crosses (11)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) != (warn_abi_version == 0 || warn_abi_version >= (11))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (11)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (11)) ))) |
2143 | G.need_abi_warning = 1; |
2144 | if (abi_version_at_least (11)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11))) |
2145 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
2146 | } |
2147 | write_unsigned_number (discriminator - 1)write_number ((discriminator - 1), 1, 10); |
2148 | if (abi_version_at_least (11)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) && discriminator - 1 >= 10) |
2149 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
2150 | } |
2151 | } |
2152 | |
2153 | /* Mangle the name of a function-scope entity. FUNCTION is the |
2154 | FUNCTION_DECL for the enclosing function, or a PARM_DECL for lambdas in |
2155 | default argument scope. ENTITY is the decl for the entity itself. |
2156 | LOCAL_ENTITY is the entity that's directly scoped in FUNCTION_DECL, |
2157 | either ENTITY itself or an enclosing scope of ENTITY. |
2158 | |
2159 | <local-name> := Z <function encoding> E <entity name> [<discriminator>] |
2160 | := Z <function encoding> E s [<discriminator>] |
2161 | := Z <function encoding> Ed [ <parameter number> ] _ <entity name> */ |
2162 | |
2163 | static void |
2164 | write_local_name (tree function, const tree local_entity, |
2165 | const tree entity) |
2166 | { |
2167 | tree parm = NULL_TREE(tree) nullptr; |
2168 | |
2169 | MANGLE_TRACE_TREE ("local-name", entity); |
2170 | |
2171 | if (TREE_CODE (function)((enum tree_code) (function)->base.code) == PARM_DECL) |
2172 | { |
2173 | parm = function; |
2174 | function = DECL_CONTEXT (parm)((contains_struct_check ((parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2174, __FUNCTION__))->decl_minimal.context); |
2175 | } |
2176 | |
2177 | write_char ('Z')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('Z')))); }); |
2178 | write_encoding (function); |
2179 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
2180 | |
2181 | /* For this purpose, parameters are numbered from right-to-left. */ |
2182 | if (parm) |
2183 | { |
2184 | int i = list_length (parm); |
2185 | write_char ('d')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('d')))); }); |
2186 | write_compact_number (i - 1); |
2187 | } |
2188 | |
2189 | if (TREE_CODE (entity)((enum tree_code) (entity)->base.code) == STRING_CST) |
2190 | { |
2191 | write_char ('s')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('s')))); }); |
2192 | write_discriminator (discriminator_for_string_literal (function, |
2193 | entity)); |
2194 | } |
2195 | else |
2196 | { |
2197 | /* Now the <entity name>. Let write_name know its being called |
2198 | from <local-name>, so it doesn't try to process the enclosing |
2199 | function scope again. */ |
2200 | write_name (entity, /*ignore_local_scope=*/1); |
2201 | if (DECL_DISCRIMINATOR_P (local_entity)(((((enum tree_code) (local_entity)->base.code) == VAR_DECL && ((local_entity)->base.static_flag)) || (((enum tree_code) (local_entity)->base.code) == TYPE_DECL && ((contains_struct_check ((local_entity), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2201, __FUNCTION__))->decl_common.lang_flag_2))) && (((contains_struct_check ((local_entity), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2201, __FUNCTION__))->decl_minimal.context) && ( (enum tree_code) (((contains_struct_check ((local_entity), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2201, __FUNCTION__))->decl_minimal.context))->base.code ) == FUNCTION_DECL)) |
2202 | && !(TREE_CODE (local_entity)((enum tree_code) (local_entity)->base.code) == TYPE_DECL |
2203 | && TYPE_ANON_P (TREE_TYPE (local_entity))(((((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name))) && ((tree_check ((((((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name) && (tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code) (((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name))->base.code)) ] == tcc_declaration) ? ((contains_struct_check ((((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name)), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->decl_minimal.name) : ((tree_class_check ((((tree_class_check ((((contains_struct_check ((local_entity ), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.main_variant)), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__))->type_common.name)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2203, __FUNCTION__, (IDENTIFIER_NODE)))->base.private_flag )))) |
2204 | write_discriminator (discriminator_for_local_entity (local_entity)); |
2205 | } |
2206 | } |
2207 | |
2208 | /* Non-terminals <type> and <CV-qualifier>. |
2209 | |
2210 | <type> ::= <builtin-type> |
2211 | ::= <function-type> |
2212 | ::= <class-enum-type> |
2213 | ::= <array-type> |
2214 | ::= <pointer-to-member-type> |
2215 | ::= <template-param> |
2216 | ::= <substitution> |
2217 | ::= <CV-qualifier> |
2218 | ::= P <type> # pointer-to |
2219 | ::= R <type> # reference-to |
2220 | ::= C <type> # complex pair (C 2000) |
2221 | ::= G <type> # imaginary (C 2000) [not supported] |
2222 | ::= U <source-name> <type> # vendor extended type qualifier |
2223 | |
2224 | C++0x extensions |
2225 | |
2226 | <type> ::= RR <type> # rvalue reference-to |
2227 | <type> ::= Dt <expression> # decltype of an id-expression or |
2228 | # class member access |
2229 | <type> ::= DT <expression> # decltype of an expression |
2230 | <type> ::= Dn # decltype of nullptr |
2231 | |
2232 | TYPE is a type node. */ |
2233 | |
2234 | static void |
2235 | write_type (tree type) |
2236 | { |
2237 | /* This gets set to nonzero if TYPE turns out to be a (possibly |
2238 | CV-qualified) builtin type. */ |
2239 | int is_builtin_type = 0; |
2240 | |
2241 | MANGLE_TRACE_TREE ("type", type); |
2242 | |
2243 | if (type == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
2244 | return; |
2245 | |
2246 | type = canonicalize_for_substitution (type); |
2247 | if (find_substitution (type)) |
2248 | return; |
2249 | |
2250 | |
2251 | if (write_CV_qualifiers_for_type (type) > 0) |
2252 | /* If TYPE was CV-qualified, we just wrote the qualifiers; now |
2253 | mangle the unqualified type. The recursive call is needed here |
2254 | since both the qualified and unqualified types are substitution |
2255 | candidates. */ |
2256 | { |
2257 | tree t = TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2257, __FUNCTION__))->type_common.main_variant); |
2258 | if (TYPE_ATTRIBUTES (t)((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2258, __FUNCTION__))->type_common.attributes) && !OVERLOAD_TYPE_P (t)((((((enum tree_code) (t)->base.code)) == RECORD_TYPE || ( ((enum tree_code) (t)->base.code)) == UNION_TYPE) && ((tree_class_check ((t), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2258, __FUNCTION__))->type_common.lang_flag_5)) || ((enum tree_code) (t)->base.code) == ENUMERAL_TYPE)) |
2259 | { |
2260 | tree attrs = NULL_TREE(tree) nullptr; |
2261 | if (tx_safe_fn_type_p (type)) |
2262 | attrs = tree_cons (get_identifier ("transaction_safe")(__builtin_constant_p ("transaction_safe") ? get_identifier_with_length (("transaction_safe"), strlen ("transaction_safe")) : get_identifier ("transaction_safe")), |
2263 | NULL_TREE(tree) nullptr, attrs); |
2264 | t = cp_build_type_attribute_variant (t, attrs); |
2265 | } |
2266 | gcc_assert (t != type)((void)(!(t != type) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2266, __FUNCTION__), 0 : 0)); |
2267 | if (FUNC_OR_METHOD_TYPE_P (t)(((enum tree_code) (t)->base.code) == FUNCTION_TYPE || ((enum tree_code) (t)->base.code) == METHOD_TYPE)) |
2268 | { |
2269 | t = build_ref_qualified_type (t, type_memfn_rqual (type)); |
2270 | if (flag_noexcept_type) |
2271 | { |
2272 | tree r = TYPE_RAISES_EXCEPTIONS (type)((tree_class_check (((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2272, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2272, __FUNCTION__))->type_non_common.lang_1); |
2273 | t = build_exception_variant (t, r); |
2274 | } |
2275 | if (abi_version_at_least (8)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (8)) |
2276 | || type == TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2276, __FUNCTION__))->type_common.main_variant)) |
2277 | /* Avoid adding the unqualified function type as a substitution. */ |
2278 | write_function_type (t); |
2279 | else |
2280 | write_type (t); |
2281 | if (abi_warn_or_compat_version_crosses (8)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (8)) != (warn_abi_version == 0 || warn_abi_version >= (8))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (8)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (8))) )) |
2282 | G.need_abi_warning = 1; |
2283 | } |
2284 | else |
2285 | write_type (t); |
2286 | } |
2287 | else if (TREE_CODE (type)((enum tree_code) (type)->base.code) == ARRAY_TYPE) |
2288 | /* It is important not to use the TYPE_MAIN_VARIANT of TYPE here |
2289 | so that the cv-qualification of the element type is available |
2290 | in write_array_type. */ |
2291 | write_array_type (type); |
2292 | else |
2293 | { |
2294 | tree type_orig = type; |
2295 | |
2296 | /* See through any typedefs. */ |
2297 | type = TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2297, __FUNCTION__))->type_common.main_variant); |
2298 | if (FUNC_OR_METHOD_TYPE_P (type)(((enum tree_code) (type)->base.code) == FUNCTION_TYPE || ( (enum tree_code) (type)->base.code) == METHOD_TYPE)) |
2299 | type = cxx_copy_lang_qualifiers (type, type_orig); |
2300 | |
2301 | /* According to the C++ ABI, some library classes are passed the |
2302 | same as the scalar type of their single member and use the same |
2303 | mangling. */ |
2304 | if (TREE_CODE (type)((enum tree_code) (type)->base.code) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type)((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2304, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_common.transparent_aggr_flag)) |
2305 | type = TREE_TYPE (first_field (type))((contains_struct_check ((first_field (type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2305, __FUNCTION__))->typed.type); |
2306 | |
2307 | if (TYPE_PTRDATAMEM_P (type)(((enum tree_code) (type)->base.code) == OFFSET_TYPE)) |
2308 | write_pointer_to_member_type (type); |
2309 | else |
2310 | { |
2311 | /* Handle any target-specific fundamental types. */ |
2312 | const char *target_mangling |
2313 | = targetm.mangle_type (type_orig); |
2314 | |
2315 | if (target_mangling) |
2316 | { |
2317 | write_string (target_mangling)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (target_mangling)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, (target_mangling), __len); __o-> next_free += __len; (void) 0; }); |
2318 | /* Add substitutions for types other than fundamental |
2319 | types. */ |
2320 | if (!VOID_TYPE_P (type)(((enum tree_code) (type)->base.code) == VOID_TYPE) |
2321 | && TREE_CODE (type)((enum tree_code) (type)->base.code) != INTEGER_TYPE |
2322 | && TREE_CODE (type)((enum tree_code) (type)->base.code) != REAL_TYPE |
2323 | && TREE_CODE (type)((enum tree_code) (type)->base.code) != BOOLEAN_TYPE) |
2324 | add_substitution (type); |
2325 | return; |
2326 | } |
2327 | |
2328 | switch (TREE_CODE (type)((enum tree_code) (type)->base.code)) |
2329 | { |
2330 | case VOID_TYPE: |
2331 | case BOOLEAN_TYPE: |
2332 | case INTEGER_TYPE: /* Includes wchar_t. */ |
2333 | case REAL_TYPE: |
2334 | case FIXED_POINT_TYPE: |
2335 | { |
2336 | /* If this is a typedef, TYPE may not be one of |
2337 | the standard builtin type nodes, but an alias of one. Use |
2338 | TYPE_MAIN_VARIANT to get to the underlying builtin type. */ |
2339 | write_builtin_type (TYPE_MAIN_VARIANT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2339, __FUNCTION__))->type_common.main_variant)); |
2340 | ++is_builtin_type; |
2341 | } |
2342 | break; |
2343 | |
2344 | case COMPLEX_TYPE: |
2345 | write_char ('C')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('C')))); }); |
2346 | write_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2346, __FUNCTION__))->typed.type)); |
2347 | break; |
2348 | |
2349 | case FUNCTION_TYPE: |
2350 | case METHOD_TYPE: |
2351 | write_function_type (type); |
2352 | break; |
2353 | |
2354 | case UNION_TYPE: |
2355 | case RECORD_TYPE: |
2356 | case ENUMERAL_TYPE: |
2357 | /* A pointer-to-member function is represented as a special |
2358 | RECORD_TYPE, so check for this first. */ |
2359 | if (TYPE_PTRMEMFUNC_P (type)(((enum tree_code) (type)->base.code) == RECORD_TYPE && (((tree_class_check (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2359, __FUNCTION__, (RECORD_TYPE)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2359, __FUNCTION__))->type_common.lang_flag_2)))) |
2360 | write_pointer_to_member_type (type); |
2361 | else |
2362 | write_class_enum_type (type); |
2363 | break; |
2364 | |
2365 | case TYPENAME_TYPE: |
2366 | case UNBOUND_CLASS_TEMPLATE: |
2367 | /* We handle TYPENAME_TYPEs and UNBOUND_CLASS_TEMPLATEs like |
2368 | ordinary nested names. */ |
2369 | write_nested_name (TYPE_STUB_DECL (type)(((contains_struct_check (((tree_class_check ((type), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2369, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2369, __FUNCTION__))->common.chain))); |
2370 | break; |
2371 | |
2372 | case POINTER_TYPE: |
2373 | case REFERENCE_TYPE: |
2374 | if (TYPE_PTR_P (type)(((enum tree_code) (type)->base.code) == POINTER_TYPE)) |
2375 | write_char ('P')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('P')))); }); |
2376 | else if (TYPE_REF_IS_RVALUE (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2376, __FUNCTION__, (REFERENCE_TYPE)))->base.private_flag )) |
2377 | write_char ('O')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('O')))); }); |
2378 | else |
2379 | write_char ('R')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('R')))); }); |
2380 | { |
2381 | tree target = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2381, __FUNCTION__))->typed.type); |
2382 | /* Attribute const/noreturn are not reflected in mangling. |
2383 | We strip them here rather than at a lower level because |
2384 | a typedef or template argument can have function type |
2385 | with function-cv-quals (that use the same representation), |
2386 | but you can't have a pointer/reference to such a type. */ |
2387 | if (TREE_CODE (target)((enum tree_code) (target)->base.code) == FUNCTION_TYPE) |
2388 | { |
2389 | if (abi_warn_or_compat_version_crosses (5)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5)) != (warn_abi_version == 0 || warn_abi_version >= (5))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (5)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (5))) ) |
2390 | && TYPE_QUALS (target)((int) ((((tree_class_check ((target), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2390, __FUNCTION__))->base.readonly_flag) * TYPE_QUAL_CONST ) | (((tree_class_check ((target), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2390, __FUNCTION__))->base.volatile_flag) * TYPE_QUAL_VOLATILE ) | (((tree_class_check ((target), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2390, __FUNCTION__))->base.u.bits.atomic_flag) * TYPE_QUAL_ATOMIC ) | (((tree_class_check ((target), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2390, __FUNCTION__))->type_common.restrict_flag) * TYPE_QUAL_RESTRICT ) | (((((tree_class_check ((target), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2390, __FUNCTION__))->base.u.bits.address_space) & 0xFF ) << 8)))) != TYPE_UNQUALIFIED) |
2391 | G.need_abi_warning = 1; |
2392 | if (abi_version_at_least (5)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5))) |
2393 | target = build_qualified_type (target, TYPE_UNQUALIFIED); |
2394 | } |
2395 | write_type (target); |
2396 | } |
2397 | break; |
2398 | |
2399 | case TEMPLATE_TYPE_PARM: |
2400 | if (is_auto (type)) |
2401 | { |
2402 | if (AUTO_IS_DECLTYPE (type)(((tree_class_check (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2402, __FUNCTION__, (TEMPLATE_TYPE_PARM)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2402, __FUNCTION__))->type_common.lang_flag_5))) |
2403 | write_identifier ("Dc"); |
2404 | else |
2405 | write_identifier ("Da"); |
2406 | ++is_builtin_type; |
2407 | break; |
2408 | } |
2409 | /* fall through. */ |
2410 | case TEMPLATE_PARM_INDEX: |
2411 | write_template_param (type); |
2412 | break; |
2413 | |
2414 | case TEMPLATE_TEMPLATE_PARM: |
2415 | write_template_template_param (type); |
2416 | break; |
2417 | |
2418 | case BOUND_TEMPLATE_TEMPLATE_PARM: |
2419 | write_template_template_param (type); |
2420 | write_template_args |
2421 | (TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type))((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2421, __FUNCTION__, (BOUND_TEMPLATE_TEMPLATE_PARM)))), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2421, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2421, __FUNCTION__, (TEMPLATE_INFO))))->args); |
2422 | break; |
2423 | |
2424 | case VECTOR_TYPE: |
2425 | if (abi_version_at_least (4)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (4))) |
2426 | { |
2427 | write_string ("Dv")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dv")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dv"), __len); __o->next_free += __len ; (void) 0; }); |
2428 | /* Non-constant vector size would be encoded with |
2429 | _ expression, but we don't support that yet. */ |
2430 | write_unsigned_number (TYPE_VECTOR_SUBPARTS (type)write_number ((TYPE_VECTOR_SUBPARTS (type) .to_constant ()), 1 , 10) |
2431 | .to_constant ())write_number ((TYPE_VECTOR_SUBPARTS (type) .to_constant ()), 1 , 10); |
2432 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
2433 | } |
2434 | else |
2435 | write_string ("U8__vector")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("U8__vector")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, ("U8__vector"), __len); __o-> next_free += __len; (void) 0; }); |
2436 | if (abi_warn_or_compat_version_crosses (4)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (4)) != (warn_abi_version == 0 || warn_abi_version >= (4))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (4)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (4))) )) |
2437 | G.need_abi_warning = 1; |
2438 | write_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2438, __FUNCTION__))->typed.type)); |
2439 | break; |
2440 | |
2441 | case TYPE_PACK_EXPANSION: |
2442 | write_string ("Dp")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dp")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dp"), __len); __o->next_free += __len ; (void) 0; }); |
2443 | write_type (PACK_EXPANSION_PATTERN (type)(((enum tree_code) ((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2443, __FUNCTION__, (TYPE_PACK_EXPANSION), (EXPR_PACK_EXPANSION ))))->base.code) == TYPE_PACK_EXPANSION ? ((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2443, __FUNCTION__))->typed.type) : (*((const_cast<tree *> (tree_operand_check ((type), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2443, __FUNCTION__))))))); |
2444 | break; |
2445 | |
2446 | case DECLTYPE_TYPE: |
2447 | /* These shouldn't make it into mangling. */ |
2448 | gcc_assert (!DECLTYPE_FOR_LAMBDA_CAPTURE (type)((void)(!(!((tree_not_check2 (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2448, __FUNCTION__, (DECLTYPE_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2448, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0) && !((tree_not_check2 (((tree_check ((type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__, (DECLTYPE_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__), 0 : 0)) |
2449 | && !DECLTYPE_FOR_LAMBDA_PROXY (type))((void)(!(!((tree_not_check2 (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2448, __FUNCTION__, (DECLTYPE_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2448, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0) && !((tree_not_check2 (((tree_check ((type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__, (DECLTYPE_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2449, __FUNCTION__), 0 : 0)); |
2450 | |
2451 | /* In ABI <5, we stripped decltype of a plain decl. */ |
2452 | if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2452, __FUNCTION__, (DECLTYPE_TYPE))))->type_common.string_flag) |
2453 | { |
2454 | tree expr = DECLTYPE_TYPE_EXPR (type)(((tree_class_check (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2454, __FUNCTION__, (DECLTYPE_TYPE)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2454, __FUNCTION__))->type_non_common.values)); |
2455 | tree etype = NULL_TREE(tree) nullptr; |
2456 | switch (TREE_CODE (expr)((enum tree_code) (expr)->base.code)) |
2457 | { |
2458 | case VAR_DECL: |
2459 | case PARM_DECL: |
2460 | case RESULT_DECL: |
2461 | case FUNCTION_DECL: |
2462 | case CONST_DECL: |
2463 | case TEMPLATE_PARM_INDEX: |
2464 | etype = TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2464, __FUNCTION__))->typed.type); |
2465 | break; |
2466 | |
2467 | default: |
2468 | break; |
2469 | } |
2470 | |
2471 | if (etype && !type_uses_auto (etype)) |
2472 | { |
2473 | if (abi_warn_or_compat_version_crosses (5)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5)) != (warn_abi_version == 0 || warn_abi_version >= (5))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (5)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (5))) )) |
2474 | G.need_abi_warning = 1; |
2475 | if (!abi_version_at_least (5)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5))) |
2476 | { |
2477 | write_type (etype); |
2478 | return; |
2479 | } |
2480 | } |
2481 | } |
2482 | |
2483 | write_char ('D')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('D')))); }); |
2484 | if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2484, __FUNCTION__, (DECLTYPE_TYPE))))->type_common.string_flag) |
2485 | write_char ('t')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('t')))); }); |
2486 | else |
2487 | write_char ('T')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('T')))); }); |
2488 | ++cp_unevaluated_operand; |
2489 | write_expression (DECLTYPE_TYPE_EXPR (type)(((tree_class_check (((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2489, __FUNCTION__, (DECLTYPE_TYPE)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2489, __FUNCTION__))->type_non_common.values))); |
2490 | --cp_unevaluated_operand; |
2491 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
2492 | break; |
2493 | |
2494 | case NULLPTR_TYPE: |
2495 | write_string ("Dn")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dn")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dn"), __len); __o->next_free += __len ; (void) 0; }); |
2496 | if (abi_version_at_least (7)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (7))) |
2497 | ++is_builtin_type; |
2498 | if (abi_warn_or_compat_version_crosses (7)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (7)) != (warn_abi_version == 0 || warn_abi_version >= (7))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (7)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (7))) )) |
2499 | G.need_abi_warning = 1; |
2500 | break; |
2501 | |
2502 | case TYPEOF_TYPE: |
2503 | sorry ("mangling %<typeof%>, use %<decltype%> instead"); |
2504 | break; |
2505 | |
2506 | case TRAIT_TYPE: |
2507 | error ("use of built-in trait %qT in function signature; " |
2508 | "use library traits instead", type); |
2509 | break; |
2510 | |
2511 | case LANG_TYPE: |
2512 | /* fall through. */ |
2513 | |
2514 | default: |
2515 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2515, __FUNCTION__)); |
2516 | } |
2517 | } |
2518 | } |
2519 | |
2520 | /* Types other than builtin types are substitution candidates. */ |
2521 | if (!is_builtin_type) |
2522 | add_substitution (type); |
2523 | } |
2524 | |
2525 | /* qsort callback for sorting a vector of attribute entries. */ |
2526 | |
2527 | static int |
2528 | attr_strcmp (const void *p1, const void *p2) |
2529 | { |
2530 | tree a1 = *(const tree*)p1; |
2531 | tree a2 = *(const tree*)p2; |
2532 | |
2533 | const attribute_spec *as1 = lookup_attribute_spec (get_attribute_name (a1)); |
2534 | const attribute_spec *as2 = lookup_attribute_spec (get_attribute_name (a2)); |
2535 | |
2536 | return strcmp (as1->name, as2->name); |
2537 | } |
2538 | |
2539 | /* Return true if we should mangle a type attribute with name NAME. */ |
2540 | |
2541 | static bool |
2542 | mangle_type_attribute_p (tree name) |
2543 | { |
2544 | const attribute_spec *as = lookup_attribute_spec (name); |
2545 | if (!as || !as->affects_type_identity) |
2546 | return false; |
2547 | |
2548 | /* Skip internal-only attributes, which are distinguished from others |
2549 | by having a space. At present, all internal-only attributes that |
2550 | affect type identity are target-specific and are handled by |
2551 | targetm.mangle_type instead. |
2552 | |
2553 | Another reason to do this is that a space isn't a valid identifier |
2554 | character for most file formats. */ |
2555 | if (strchr (IDENTIFIER_POINTER (name)((const char *) (tree_check ((name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2555, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str ), ' ')) |
2556 | return false; |
2557 | |
2558 | /* The following attributes are mangled specially. */ |
2559 | if (is_attribute_p ("transaction_safe", name)) |
2560 | return false; |
2561 | if (is_attribute_p ("abi_tag", name)) |
2562 | return false; |
2563 | |
2564 | return true; |
2565 | } |
2566 | |
2567 | /* Non-terminal <CV-qualifiers> for type nodes. Returns the number of |
2568 | CV-qualifiers written for TYPE. |
2569 | |
2570 | <CV-qualifiers> ::= [r] [V] [K] */ |
2571 | |
2572 | static int |
2573 | write_CV_qualifiers_for_type (const tree type) |
2574 | { |
2575 | int num_qualifiers = 0; |
2576 | |
2577 | /* The order is specified by: |
2578 | |
2579 | "In cases where multiple order-insensitive qualifiers are |
2580 | present, they should be ordered 'K' (closest to the base type), |
2581 | 'V', 'r', and 'U' (farthest from the base type) ..." */ |
2582 | |
2583 | /* Mangle attributes that affect type identity as extended qualifiers. |
2584 | |
2585 | We don't do this with classes and enums because their attributes |
2586 | are part of their definitions, not something added on. */ |
2587 | |
2588 | if (!OVERLOAD_TYPE_P (type)((((((enum tree_code) (type)->base.code)) == RECORD_TYPE || (((enum tree_code) (type)->base.code)) == UNION_TYPE) && ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2588, __FUNCTION__))->type_common.lang_flag_5)) || ((enum tree_code) (type)->base.code) == ENUMERAL_TYPE)) |
2589 | { |
2590 | auto_vec<tree> vec; |
2591 | for (tree a = TYPE_ATTRIBUTES (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2591, __FUNCTION__))->type_common.attributes); a; a = TREE_CHAIN (a)((contains_struct_check ((a), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2591, __FUNCTION__))->common.chain)) |
2592 | if (mangle_type_attribute_p (get_attribute_name (a))) |
2593 | vec.safe_push (a); |
2594 | if (abi_warn_or_compat_version_crosses (10)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10)) != (warn_abi_version == 0 || warn_abi_version >= (10))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (10)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (10)) )) && !vec.is_empty ()) |
2595 | G.need_abi_warning = true; |
2596 | if (abi_version_at_least (10)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10))) |
2597 | { |
2598 | vec.qsort (attr_strcmp)qsort (attr_strcmp); |
2599 | while (!vec.is_empty()) |
2600 | { |
2601 | tree a = vec.pop(); |
2602 | const attribute_spec *as |
2603 | = lookup_attribute_spec (get_attribute_name (a)); |
2604 | |
2605 | write_char ('U')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('U')))); }); |
2606 | write_unsigned_number (strlen (as->name))write_number ((strlen (as->name)), 1, 10); |
2607 | write_string (as->name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (as->name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (as->name), __len); __o->next_free += __len; (void) 0; }); |
2608 | if (TREE_VALUE (a)((tree_check ((a), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2608, __FUNCTION__, (TREE_LIST)))->list.value)) |
2609 | { |
2610 | write_char ('I')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('I')))); }); |
2611 | for (tree args = TREE_VALUE (a)((tree_check ((a), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2611, __FUNCTION__, (TREE_LIST)))->list.value); args; |
2612 | args = TREE_CHAIN (args)((contains_struct_check ((args), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2612, __FUNCTION__))->common.chain)) |
2613 | { |
2614 | tree arg = TREE_VALUE (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2614, __FUNCTION__, (TREE_LIST)))->list.value); |
2615 | write_template_arg (arg); |
2616 | } |
2617 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
2618 | } |
2619 | |
2620 | ++num_qualifiers; |
2621 | } |
2622 | } |
2623 | } |
2624 | |
2625 | /* Note that we do not use cp_type_quals below; given "const |
2626 | int[3]", the "const" is emitted with the "int", not with the |
2627 | array. */ |
2628 | cp_cv_quals quals = TYPE_QUALS (type)((int) ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2628, __FUNCTION__))->base.readonly_flag) * TYPE_QUAL_CONST ) | (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2628, __FUNCTION__))->base.volatile_flag) * TYPE_QUAL_VOLATILE ) | (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2628, __FUNCTION__))->base.u.bits.atomic_flag) * TYPE_QUAL_ATOMIC ) | (((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2628, __FUNCTION__))->type_common.restrict_flag) * TYPE_QUAL_RESTRICT ) | (((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2628, __FUNCTION__))->base.u.bits.address_space) & 0xFF ) << 8)))); |
2629 | |
2630 | if (quals & TYPE_QUAL_RESTRICT) |
2631 | { |
2632 | write_char ('r')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('r')))); }); |
2633 | ++num_qualifiers; |
2634 | } |
2635 | if (quals & TYPE_QUAL_VOLATILE) |
2636 | { |
2637 | write_char ('V')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('V')))); }); |
2638 | ++num_qualifiers; |
2639 | } |
2640 | if (quals & TYPE_QUAL_CONST) |
2641 | { |
2642 | write_char ('K')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('K')))); }); |
2643 | ++num_qualifiers; |
2644 | } |
2645 | |
2646 | return num_qualifiers; |
2647 | } |
2648 | |
2649 | /* Non-terminal <builtin-type>. |
2650 | |
2651 | <builtin-type> ::= v # void |
2652 | ::= b # bool |
2653 | ::= w # wchar_t |
2654 | ::= c # char |
2655 | ::= a # signed char |
2656 | ::= h # unsigned char |
2657 | ::= s # short |
2658 | ::= t # unsigned short |
2659 | ::= i # int |
2660 | ::= j # unsigned int |
2661 | ::= l # long |
2662 | ::= m # unsigned long |
2663 | ::= x # long long, __int64 |
2664 | ::= y # unsigned long long, __int64 |
2665 | ::= n # __int128 |
2666 | ::= o # unsigned __int128 |
2667 | ::= f # float |
2668 | ::= d # double |
2669 | ::= e # long double, __float80 |
2670 | ::= g # __float128 [not supported] |
2671 | ::= u <source-name> # vendor extended type */ |
2672 | |
2673 | static void |
2674 | write_builtin_type (tree type) |
2675 | { |
2676 | if (TYPE_CANONICAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2676, __FUNCTION__))->type_common.canonical)) |
2677 | type = TYPE_CANONICAL (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2677, __FUNCTION__))->type_common.canonical); |
2678 | |
2679 | switch (TREE_CODE (type)((enum tree_code) (type)->base.code)) |
2680 | { |
2681 | case VOID_TYPE: |
2682 | write_char ('v')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('v')))); }); |
2683 | break; |
2684 | |
2685 | case BOOLEAN_TYPE: |
2686 | write_char ('b')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('b')))); }); |
2687 | break; |
2688 | |
2689 | case INTEGER_TYPE: |
2690 | /* TYPE may still be wchar_t, char8_t, char16_t, or char32_t, since that |
2691 | isn't in integer_type_nodes. */ |
2692 | if (type == wchar_type_nodec_global_trees[CTI_WCHAR_TYPE]) |
2693 | write_char ('w')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('w')))); }); |
2694 | else if (type == char8_type_nodec_global_trees[CTI_CHAR8_TYPE]) |
2695 | write_string ("Du")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Du")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Du"), __len); __o->next_free += __len ; (void) 0; }); |
2696 | else if (type == char16_type_nodec_global_trees[CTI_CHAR16_TYPE]) |
2697 | write_string ("Ds")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Ds")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Ds"), __len); __o->next_free += __len ; (void) 0; }); |
2698 | else if (type == char32_type_nodec_global_trees[CTI_CHAR32_TYPE]) |
2699 | write_string ("Di")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Di")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Di"), __len); __o->next_free += __len ; (void) 0; }); |
2700 | else |
2701 | { |
2702 | size_t itk; |
2703 | /* Assume TYPE is one of the shared integer type nodes. Find |
2704 | it in the array of these nodes. */ |
2705 | iagain: |
2706 | for (itk = 0; itk < itk_none; ++itk) |
2707 | if (integer_types[itk] != NULL_TREE(tree) nullptr |
2708 | && integer_type_codes[itk] != '\0' |
2709 | && type == integer_types[itk]) |
2710 | { |
2711 | /* Print the corresponding single-letter code. */ |
2712 | write_char (integer_type_codes[itk])__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = ((integer_type_codes [itk])))); }); |
2713 | break; |
2714 | } |
2715 | |
2716 | if (itk == itk_none) |
2717 | { |
2718 | tree t = c_common_type_for_mode (TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2718, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode (type) : (type)->type_common.mode), |
2719 | TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2719, __FUNCTION__))->base.u.bits.unsigned_flag)); |
2720 | if (type != t) |
2721 | { |
2722 | type = t; |
2723 | goto iagain; |
2724 | } |
2725 | |
2726 | if (TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2726, __FUNCTION__))->type_common.precision) == 128) |
2727 | write_char (TYPE_UNSIGNED (type) ? 'o' : 'n')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = ((((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2727, __FUNCTION__))->base.u.bits.unsigned_flag) ? 'o' : 'n')))); }); |
2728 | else |
2729 | { |
2730 | /* Allow for cases where TYPE is not one of the shared |
2731 | integer type nodes and write a "vendor extended builtin |
2732 | type" with a name the form intN or uintN, respectively. |
2733 | Situations like this can happen if you have an |
2734 | __attribute__((__mode__(__SI__))) type and use exotic |
2735 | switches like '-mint8' on AVR. Of course, this is |
2736 | undefined by the C++ ABI (and '-mint8' is not even |
2737 | Standard C conforming), but when using such special |
2738 | options you're pretty much in nowhere land anyway. */ |
2739 | const char *prefix; |
2740 | char prec[11]; /* up to ten digits for an unsigned */ |
2741 | |
2742 | prefix = TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2742, __FUNCTION__))->base.u.bits.unsigned_flag) ? "uint" : "int"; |
2743 | sprintf (prec, "%u", (unsigned) TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2743, __FUNCTION__))->type_common.precision)); |
2744 | write_char ('u')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('u')))); }); /* "vendor extended builtin type" */ |
2745 | write_unsigned_number (strlen (prefix) + strlen (prec))write_number ((strlen (prefix) + strlen (prec)), 1, 10); |
2746 | write_string (prefix)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (prefix)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (prefix), __len); __o->next_free += __len ; (void) 0; }); |
2747 | write_string (prec)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (prec)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (prec), __len); __o->next_free += __len ; (void) 0; }); |
2748 | } |
2749 | } |
2750 | } |
2751 | break; |
2752 | |
2753 | case REAL_TYPE: |
2754 | if (type == float_type_nodeglobal_trees[TI_FLOAT_TYPE]) |
2755 | write_char ('f')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('f')))); }); |
2756 | else if (type == double_type_nodeglobal_trees[TI_DOUBLE_TYPE]) |
2757 | write_char ('d')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('d')))); }); |
2758 | else if (type == long_double_type_nodeglobal_trees[TI_LONG_DOUBLE_TYPE]) |
2759 | write_char ('e')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('e')))); }); |
2760 | else if (type == dfloat32_type_nodeglobal_trees[TI_DFLOAT32_TYPE]) |
2761 | write_string ("Df")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Df")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Df"), __len); __o->next_free += __len ; (void) 0; }); |
2762 | else if (type == dfloat64_type_nodeglobal_trees[TI_DFLOAT64_TYPE]) |
2763 | write_string ("Dd")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dd")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dd"), __len); __o->next_free += __len ; (void) 0; }); |
2764 | else if (type == dfloat128_type_nodeglobal_trees[TI_DFLOAT128_TYPE]) |
2765 | write_string ("De")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("De")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("De"), __len); __o->next_free += __len ; (void) 0; }); |
2766 | else if (type == float16_type_nodeglobal_trees[TI_FLOAT16_TYPE]) |
2767 | write_string ("DF16_")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF16_")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF16_"), __len); __o->next_free += __len ; (void) 0; }); |
2768 | else if (type == float32_type_nodeglobal_trees[TI_FLOAT32_TYPE]) |
2769 | write_string ("DF32_")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF32_")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF32_"), __len); __o->next_free += __len ; (void) 0; }); |
2770 | else if (type == float64_type_nodeglobal_trees[TI_FLOAT64_TYPE]) |
2771 | write_string ("DF64_")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF64_")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF64_"), __len); __o->next_free += __len ; (void) 0; }); |
2772 | else if (type == float128_type_nodeglobal_trees[TI_FLOAT128_TYPE]) |
2773 | write_string ("DF128_")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF128_")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF128_"), __len); __o->next_free += __len; (void) 0; }); |
2774 | else if (type == float32x_type_nodeglobal_trees[TI_FLOAT32X_TYPE]) |
2775 | write_string ("DF32x")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF32x")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF32x"), __len); __o->next_free += __len ; (void) 0; }); |
2776 | else if (type == float64x_type_nodeglobal_trees[TI_FLOAT64X_TYPE]) |
2777 | write_string ("DF64x")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF64x")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF64x"), __len); __o->next_free += __len ; (void) 0; }); |
2778 | else if (type == float128x_type_nodeglobal_trees[TI_FLOAT128X_TYPE]) |
2779 | write_string ("DF128x")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF128x")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF128x"), __len); __o->next_free += __len; (void) 0; }); |
2780 | else if (type == bfloat16_type_nodeglobal_trees[TI_BFLOAT16_TYPE]) |
2781 | write_string ("DF16b")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("DF16b")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("DF16b"), __len); __o->next_free += __len ; (void) 0; }); |
2782 | else |
2783 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2783, __FUNCTION__)); |
2784 | break; |
2785 | |
2786 | default: |
2787 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2787, __FUNCTION__)); |
2788 | } |
2789 | } |
2790 | |
2791 | /* Non-terminal <function-type>. NODE is a FUNCTION_TYPE or |
2792 | METHOD_TYPE. The return type is mangled before the parameter |
2793 | types. |
2794 | |
2795 | <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */ |
2796 | |
2797 | static void |
2798 | write_function_type (const tree type) |
2799 | { |
2800 | MANGLE_TRACE_TREE ("function-type", type); |
2801 | |
2802 | /* For a pointer to member function, the function type may have |
2803 | cv-qualifiers, indicating the quals for the artificial 'this' |
2804 | parameter. */ |
2805 | if (TREE_CODE (type)((enum tree_code) (type)->base.code) == METHOD_TYPE) |
2806 | { |
2807 | /* The first parameter must be a POINTER_TYPE pointing to the |
2808 | `this' parameter. */ |
2809 | tree this_type = class_of_this_parm (type); |
2810 | write_CV_qualifiers_for_type (this_type); |
2811 | } |
2812 | |
2813 | write_exception_spec (TYPE_RAISES_EXCEPTIONS (type)((tree_class_check (((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2813, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2813, __FUNCTION__))->type_non_common.lang_1)); |
2814 | |
2815 | if (tx_safe_fn_type_p (type)) |
2816 | write_string ("Dx")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("Dx")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("Dx"), __len); __o->next_free += __len ; (void) 0; }); |
2817 | |
2818 | write_char ('F')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('F')))); }); |
2819 | /* We don't track whether or not a type is `extern "C"'. Note that |
2820 | you can have an `extern "C"' function that does not have |
2821 | `extern "C"' type, and vice versa: |
2822 | |
2823 | extern "C" typedef void function_t(); |
2824 | function_t f; // f has C++ linkage, but its type is |
2825 | // `extern "C"' |
2826 | |
2827 | typedef void function_t(); |
2828 | extern "C" function_t f; // Vice versa. |
2829 | |
2830 | See [dcl.link]. */ |
2831 | write_bare_function_type (type, /*include_return_type_p=*/1, |
2832 | /*decl=*/NULLnullptr); |
2833 | if (FUNCTION_REF_QUALIFIED (type)((tree_not_check2 (((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2833, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2833, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_4)) |
2834 | { |
2835 | if (FUNCTION_RVALUE_QUALIFIED (type)((tree_not_check2 (((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2835, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2835, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_5)) |
2836 | write_char ('O')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('O')))); }); |
2837 | else |
2838 | write_char ('R')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('R')))); }); |
2839 | } |
2840 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
2841 | } |
2842 | |
2843 | /* Non-terminal <bare-function-type>. TYPE is a FUNCTION_TYPE or |
2844 | METHOD_TYPE. If INCLUDE_RETURN_TYPE is nonzero, the return value |
2845 | is mangled before the parameter types. If non-NULL, DECL is |
2846 | FUNCTION_DECL for the function whose type is being emitted. */ |
2847 | |
2848 | static void |
2849 | write_bare_function_type (const tree type, const int include_return_type_p, |
2850 | const tree decl) |
2851 | { |
2852 | MANGLE_TRACE_TREE ("bare-function-type", type); |
2853 | |
2854 | /* Mangle the return type, if requested. */ |
2855 | if (include_return_type_p) |
2856 | write_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2856, __FUNCTION__))->typed.type)); |
2857 | |
2858 | /* Now mangle the types of the arguments. */ |
2859 | ++G.parm_depth; |
2860 | write_method_parms (TYPE_ARG_TYPES (type)((tree_check2 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2860, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .values), |
2861 | TREE_CODE (type)((enum tree_code) (type)->base.code) == METHOD_TYPE, |
2862 | decl); |
2863 | --G.parm_depth; |
2864 | } |
2865 | |
2866 | /* Write the mangled representation of a method parameter list of |
2867 | types given in PARM_TYPES. If METHOD_P is nonzero, the function is |
2868 | considered a non-static method, and the this parameter is omitted. |
2869 | If non-NULL, DECL is the FUNCTION_DECL for the function whose |
2870 | parameters are being emitted. */ |
2871 | |
2872 | static void |
2873 | write_method_parms (tree parm_types, const int method_p, const tree decl) |
2874 | { |
2875 | tree first_parm_type; |
2876 | tree parm_decl = decl ? DECL_ARGUMENTS (decl)((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2876, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments ) : NULL_TREE(tree) nullptr; |
2877 | |
2878 | /* Assume this parameter type list is variable-length. If it ends |
2879 | with a void type, then it's not. */ |
2880 | int varargs_p = 1; |
2881 | |
2882 | /* If this is a member function, skip the first arg, which is the |
2883 | this pointer. |
2884 | "Member functions do not encode the type of their implicit this |
2885 | parameter." |
2886 | |
2887 | Similarly, there's no need to mangle artificial parameters, like |
2888 | the VTT parameters for constructors and destructors. */ |
2889 | if (method_p) |
2890 | { |
2891 | parm_types = TREE_CHAIN (parm_types)((contains_struct_check ((parm_types), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2891, __FUNCTION__))->common.chain); |
2892 | parm_decl = parm_decl ? DECL_CHAIN (parm_decl)(((contains_struct_check (((contains_struct_check ((parm_decl ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2892, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2892, __FUNCTION__))->common.chain)) : NULL_TREE(tree) nullptr; |
2893 | |
2894 | while (parm_decl && DECL_ARTIFICIAL (parm_decl)((contains_struct_check ((parm_decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2894, __FUNCTION__))->decl_common.artificial_flag)) |
2895 | { |
2896 | parm_types = TREE_CHAIN (parm_types)((contains_struct_check ((parm_types), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2896, __FUNCTION__))->common.chain); |
2897 | parm_decl = DECL_CHAIN (parm_decl)(((contains_struct_check (((contains_struct_check ((parm_decl ), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2897, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2897, __FUNCTION__))->common.chain)); |
2898 | } |
2899 | |
2900 | if (decl && ctor_omit_inherited_parms (decl)) |
2901 | /* Bring back parameters omitted from an inherited ctor. */ |
2902 | parm_types = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (decl))skip_artificial_parms_for (((((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__))->decl_common.abstract_origin) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__))->decl_common.abstract_origin) : (decl ))), ((tree_check2 ((((contains_struct_check (((((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__))->decl_common.abstract_origin) ? ((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__))->decl_common.abstract_origin) : (decl ))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2902, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .values)); |
2903 | } |
2904 | |
2905 | for (first_parm_type = parm_types; |
2906 | parm_types; |
2907 | parm_types = TREE_CHAIN (parm_types)((contains_struct_check ((parm_types), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2907, __FUNCTION__))->common.chain)) |
2908 | { |
2909 | tree parm = TREE_VALUE (parm_types)((tree_check ((parm_types), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2909, __FUNCTION__, (TREE_LIST)))->list.value); |
2910 | if (parm == void_type_nodeglobal_trees[TI_VOID_TYPE]) |
2911 | { |
2912 | /* "Empty parameter lists, whether declared as () or |
2913 | conventionally as (void), are encoded with a void parameter |
2914 | (v)." */ |
2915 | if (parm_types == first_parm_type) |
2916 | write_type (parm); |
2917 | /* If the parm list is terminated with a void type, it's |
2918 | fixed-length. */ |
2919 | varargs_p = 0; |
2920 | /* A void type better be the last one. */ |
2921 | gcc_assert (TREE_CHAIN (parm_types) == NULL)((void)(!(((contains_struct_check ((parm_types), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2921, __FUNCTION__))->common.chain) == nullptr) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2921, __FUNCTION__), 0 : 0)); |
2922 | } |
2923 | else |
2924 | write_type (parm); |
2925 | } |
2926 | |
2927 | if (varargs_p) |
2928 | /* <builtin-type> ::= z # ellipsis */ |
2929 | write_char ('z')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('z')))); }); |
2930 | } |
2931 | |
2932 | /* <class-enum-type> ::= <name> */ |
2933 | |
2934 | static void |
2935 | write_class_enum_type (const tree type) |
2936 | { |
2937 | write_name (TYPE_NAME (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2937, __FUNCTION__))->type_common.name), /*ignore_local_scope=*/0); |
2938 | } |
2939 | |
2940 | /* Non-terminal <template-args>. ARGS is a TREE_VEC of template |
2941 | arguments. |
2942 | |
2943 | <template-args> ::= I <template-arg>* E */ |
2944 | |
2945 | static void |
2946 | write_template_args (tree args) |
2947 | { |
2948 | int i; |
2949 | int length = 0; |
2950 | |
2951 | MANGLE_TRACE_TREE ("template-args", args); |
2952 | |
2953 | write_char ('I')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('I')))); }); |
2954 | |
2955 | if (args) |
2956 | length = TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2956, __FUNCTION__, (TREE_VEC)))->base.u.length); |
2957 | |
2958 | if (args && length && TREE_CODE (TREE_VEC_ELT (args, 0))((enum tree_code) ((*((const_cast<tree *> (tree_vec_elt_check ((args), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2958, __FUNCTION__))))))->base.code) == TREE_VEC) |
2959 | { |
2960 | /* We have nested template args. We want the innermost template |
2961 | argument list. */ |
2962 | args = TREE_VEC_ELT (args, length - 1)(*((const_cast<tree *> (tree_vec_elt_check ((args), (length - 1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2962, __FUNCTION__))))); |
2963 | length = TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2963, __FUNCTION__, (TREE_VEC)))->base.u.length); |
2964 | } |
2965 | for (i = 0; i < length; ++i) |
2966 | write_template_arg (TREE_VEC_ELT (args, i)(*((const_cast<tree *> (tree_vec_elt_check ((args), (i) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2966, __FUNCTION__)))))); |
2967 | |
2968 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
2969 | } |
2970 | |
2971 | /* Write out the |
2972 | <unqualified-name> |
2973 | <unqualified-name> <template-args> |
2974 | part of SCOPE_REF or COMPONENT_REF mangling. */ |
2975 | |
2976 | static void |
2977 | write_member_name (tree member) |
2978 | { |
2979 | if (identifier_p (member)) |
2980 | { |
2981 | if (IDENTIFIER_ANY_OP_P (member)(((tree_not_check2 (((tree_check ((member), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2981, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2981, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
2982 | { |
2983 | if (abi_version_at_least (11)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11))) |
2984 | write_string ("on")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("on")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("on"), __len); __o->next_free += __len ; (void) 0; }); |
2985 | if (abi_warn_or_compat_version_crosses (11)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) != (warn_abi_version == 0 || warn_abi_version >= (11))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (11)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (11)) ))) |
2986 | G.need_abi_warning = 1; |
2987 | } |
2988 | write_unqualified_id (member); |
2989 | } |
2990 | else if (DECL_P (member)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (member)->base.code))] == tcc_declaration)) |
2991 | { |
2992 | gcc_assert (!DECL_OVERLOADED_OPERATOR_P (member))((void)(!(!(((tree_not_check2 (((tree_check ((((contains_struct_check ((member), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2992, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2992, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2992, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2992, __FUNCTION__), 0 : 0)); |
2993 | write_unqualified_name (member); |
2994 | } |
2995 | else if (TREE_CODE (member)((enum tree_code) (member)->base.code) == TEMPLATE_ID_EXPR) |
2996 | { |
2997 | tree name = TREE_OPERAND (member, 0)(*((const_cast<tree*> (tree_operand_check ((member), (0 ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 2997, __FUNCTION__))))); |
2998 | name = OVL_FIRST (name)ovl_first (name); |
2999 | write_member_name (name); |
3000 | write_template_args (TREE_OPERAND (member, 1)(*((const_cast<tree*> (tree_operand_check ((member), (1 ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3000, __FUNCTION__)))))); |
3001 | } |
3002 | else |
3003 | write_expression (member); |
3004 | } |
3005 | |
3006 | /* EXPR is a base COMPONENT_REF; write the minimized base conversion path for |
3007 | converting to BASE, or just the conversion of EXPR if BASE is null. |
3008 | |
3009 | "Given a fully explicit base path P := C_n -> ... -> C_0, the minimized base |
3010 | path Min(P) is defined as follows: let C_i be the last element for which the |
3011 | conversion to C_0 is unambiguous; if that element is C_n, the minimized path |
3012 | is C_n -> C_0; otherwise, the minimized path is Min(C_n -> ... -> C_i) -> |
3013 | C_0." |
3014 | |
3015 | We mangle the conversion to C_i if it's different from C_n. */ |
3016 | |
3017 | static bool |
3018 | write_base_ref (tree expr, tree base = NULL_TREE(tree) nullptr) |
3019 | { |
3020 | if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) != COMPONENT_REF) |
3021 | return false; |
3022 | |
3023 | tree field = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3023, __FUNCTION__))))); |
3024 | |
3025 | if (TREE_CODE (field)((enum tree_code) (field)->base.code) != FIELD_DECL || !DECL_FIELD_IS_BASE (field)((contains_struct_check (((tree_check ((field), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3025, __FUNCTION__, (FIELD_DECL)))), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3025, __FUNCTION__))->decl_common.lang_flag_6)) |
3026 | return false; |
3027 | |
3028 | tree object = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3028, __FUNCTION__))))); |
3029 | |
3030 | tree binfo = NULL_TREE(tree) nullptr; |
3031 | if (base) |
3032 | { |
3033 | tree cur = TREE_TYPE (object)((contains_struct_check ((object), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3033, __FUNCTION__))->typed.type); |
3034 | binfo = lookup_base (cur, base, ba_unique, NULLnullptr, tf_none); |
3035 | } |
3036 | else |
3037 | /* We're at the end of the base conversion chain, so it can't be |
3038 | ambiguous. */ |
3039 | base = TREE_TYPE (field)((contains_struct_check ((field), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3039, __FUNCTION__))->typed.type); |
3040 | |
3041 | if (binfo == error_mark_nodeglobal_trees[TI_ERROR_MARK]) |
3042 | { |
3043 | /* cur->base is ambiguous, so make the conversion to |
3044 | last explicit, expressed as a cast (last&)object. */ |
3045 | tree last = TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3045, __FUNCTION__))->typed.type); |
3046 | write_string (OVL_OP_INFO (false, CAST_EXPR)->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ((&ovl_op_info[(false) != 0][ovl_op_mapping [(CAST_EXPR)]])->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, ((&ovl_op_info[(false) != 0 ][ovl_op_mapping[(CAST_EXPR)]])->mangled_name), __len); __o ->next_free += __len; (void) 0; }); |
3047 | write_type (build_reference_type (last)); |
3048 | write_expression (object); |
3049 | } |
3050 | else if (write_base_ref (object, base)) |
3051 | /* cur->base is unambiguous, but we had another base conversion |
3052 | underneath and wrote it out. */; |
3053 | else |
3054 | /* No more base conversions, just write out the object. */ |
3055 | write_expression (object); |
3056 | |
3057 | return true; |
3058 | } |
3059 | |
3060 | /* The number of elements spanned by a RANGE_EXPR. */ |
3061 | |
3062 | unsigned HOST_WIDE_INTlong |
3063 | range_expr_nelts (tree expr) |
3064 | { |
3065 | tree lo = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3065, __FUNCTION__))))); |
3066 | tree hi = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3066, __FUNCTION__))))); |
3067 | return tree_to_uhwi (hi) - tree_to_uhwi (lo) + 1; |
3068 | } |
3069 | |
3070 | /* <expression> ::= <unary operator-name> <expression> |
3071 | ::= <binary operator-name> <expression> <expression> |
3072 | ::= <expr-primary> |
3073 | |
3074 | <expr-primary> ::= <template-param> |
3075 | ::= L <type> <value number> E # literal |
3076 | ::= L <mangled-name> E # external name |
3077 | ::= st <type> # sizeof |
3078 | ::= sr <type> <unqualified-name> # dependent name |
3079 | ::= sr <type> <unqualified-name> <template-args> */ |
3080 | |
3081 | static void |
3082 | write_expression (tree expr) |
3083 | { |
3084 | enum tree_code code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3085 | |
3086 | if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == TARGET_EXPR) |
3087 | { |
3088 | expr = TARGET_EXPR_INITIAL (expr)(*(tree_operand_check_code ((expr), (TARGET_EXPR), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3088, __FUNCTION__))); |
3089 | code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3090 | } |
3091 | |
3092 | /* Skip NOP_EXPR and CONVERT_EXPR. They can occur when (say) a pointer |
3093 | argument is converted (via qualification conversions) to another type. */ |
3094 | while (CONVERT_EXPR_CODE_P (code)((code) == NOP_EXPR || (code) == CONVERT_EXPR) |
3095 | || code == IMPLICIT_CONV_EXPR |
3096 | || location_wrapper_p (expr) |
3097 | /* Parentheses aren't mangled. */ |
3098 | || code == PAREN_EXPR |
3099 | || code == NON_LVALUE_EXPR |
3100 | || (code == VIEW_CONVERT_EXPR |
3101 | && TREE_CODE (TREE_OPERAND (expr, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3101, __FUNCTION__))))))->base.code) == TEMPLATE_PARM_INDEX)) |
3102 | { |
3103 | expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3103, __FUNCTION__))))); |
3104 | code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3105 | } |
3106 | |
3107 | if (code == BASELINK |
3108 | && (!type_unknown_p (expr) |
3109 | || !BASELINK_QUALIFIED_P (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3109, __FUNCTION__, (BASELINK)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3109, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0))) |
3110 | { |
3111 | expr = BASELINK_FUNCTIONS (expr)(((struct tree_baselink*) (tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3111, __FUNCTION__, (BASELINK))))->functions); |
3112 | code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3113 | } |
3114 | |
3115 | /* Handle pointers-to-members by making them look like expression |
3116 | nodes. */ |
3117 | if (code == PTRMEM_CST) |
3118 | { |
3119 | expr = build_nt (ADDR_EXPR, |
3120 | build_qualified_name (/*type=*/NULL_TREE(tree) nullptr, |
3121 | PTRMEM_CST_CLASS (expr)((((enum tree_code) (((contains_struct_check (((tree_check (( expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (PTRMEM_CST)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type))->base.code) == OFFSET_TYPE ) ? ((tree_check ((((contains_struct_check (((tree_check ((expr ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (PTRMEM_CST)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (OFFSET_TYPE)))->type_non_common.maxval ) : ((tree_check2 ((((contains_struct_check (((cp_build_qualified_type (((contains_struct_check ((((tree_check3 ((((contains_struct_check (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (PTRMEM_CST)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_non_common.values)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type), cp_type_quals (((contains_struct_check (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (PTRMEM_CST)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3121, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .maxval)), |
3122 | PTRMEM_CST_MEMBER (expr)(((ptrmem_cst_t)(tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3122, __FUNCTION__, (PTRMEM_CST))))->member), |
3123 | /*template_p=*/false)); |
3124 | code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3125 | } |
3126 | |
3127 | /* Handle template parameters. */ |
3128 | if (code == TEMPLATE_TYPE_PARM |
3129 | || code == TEMPLATE_TEMPLATE_PARM |
3130 | || code == BOUND_TEMPLATE_TEMPLATE_PARM |
3131 | || code == TEMPLATE_PARM_INDEX) |
3132 | write_template_param (expr); |
3133 | /* Handle literals. */ |
3134 | else if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_constant |
3135 | || code == CONST_DECL) |
3136 | write_template_arg_literal (expr); |
3137 | else if (code == EXCESS_PRECISION_EXPR |
3138 | && TREE_CODE (TREE_OPERAND (expr, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3138, __FUNCTION__))))))->base.code) == REAL_CST) |
3139 | write_template_arg_literal (fold_convert (TREE_TYPE (expr),fold_convert_loc (((location_t) 0), ((contains_struct_check ( (expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3139, __FUNCTION__))->typed.type), (*((const_cast<tree *> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3140, __FUNCTION__)))))) |
3140 | TREE_OPERAND (expr, 0))fold_convert_loc (((location_t) 0), ((contains_struct_check ( (expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3139, __FUNCTION__))->typed.type), (*((const_cast<tree *> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3140, __FUNCTION__))))))); |
3141 | else if (code == PARM_DECL && DECL_ARTIFICIAL (expr)((contains_struct_check ((expr), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3141, __FUNCTION__))->decl_common.artificial_flag)) |
3142 | { |
3143 | gcc_assert (id_equal (DECL_NAME (expr), "this"))((void)(!(id_equal (((contains_struct_check ((expr), (TS_DECL_MINIMAL ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3143, __FUNCTION__))->decl_minimal.name), "this")) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3143, __FUNCTION__), 0 : 0)); |
3144 | write_string ("fpT")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("fpT")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("fpT"), __len); __o->next_free += __len ; (void) 0; }); |
3145 | } |
3146 | else if (code == PARM_DECL) |
3147 | { |
3148 | /* A function parameter used in a late-specified return type. */ |
3149 | int index = DECL_PARM_INDEX (expr)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check ((expr), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3149, __FUNCTION__))->decl_common.lang_specific); if ((( enum tree_code) (expr)->base.code) != PARM_DECL || lt-> u.base.selector != lds_parm) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3149, __FUNCTION__); <->u.parm; })->index); |
3150 | int level = DECL_PARM_LEVEL (expr)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check ((expr), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3150, __FUNCTION__))->decl_common.lang_specific); if ((( enum tree_code) (expr)->base.code) != PARM_DECL || lt-> u.base.selector != lds_parm) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3150, __FUNCTION__); <->u.parm; })->level); |
3151 | int delta = G.parm_depth - level + 1; |
3152 | gcc_assert (index >= 1)((void)(!(index >= 1) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3152, __FUNCTION__), 0 : 0)); |
3153 | write_char ('f')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('f')))); }); |
3154 | if (delta != 0) |
3155 | { |
3156 | if (abi_version_at_least (5)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5))) |
3157 | { |
3158 | /* Let L be the number of function prototype scopes from the |
3159 | innermost one (in which the parameter reference occurs) up |
3160 | to (and including) the one containing the declaration of |
3161 | the referenced parameter. If the parameter declaration |
3162 | clause of the innermost function prototype scope has been |
3163 | completely seen, it is not counted (in that case -- which |
3164 | is perhaps the most common -- L can be zero). */ |
3165 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
3166 | write_unsigned_number (delta - 1)write_number ((delta - 1), 1, 10); |
3167 | } |
3168 | if (abi_warn_or_compat_version_crosses (5)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (5)) != (warn_abi_version == 0 || warn_abi_version >= (5))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (5)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (5))) )) |
3169 | G.need_abi_warning = true; |
3170 | } |
3171 | write_char ('p')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('p')))); }); |
3172 | write_compact_number (index - 1); |
3173 | } |
3174 | else if (DECL_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (expr)->base.code))] == tcc_declaration)) |
3175 | { |
3176 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
3177 | write_mangled_name (expr, false); |
3178 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3179 | } |
3180 | else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == SIZEOF_EXPR) |
3181 | { |
3182 | tree op = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3182, __FUNCTION__))))); |
3183 | |
3184 | if (PACK_EXPANSION_P (op)(((enum tree_code) (op)->base.code) == TYPE_PACK_EXPANSION || ((enum tree_code) (op)->base.code) == EXPR_PACK_EXPANSION )) |
3185 | { |
3186 | if (abi_warn_or_compat_version_crosses (11)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11)) != (warn_abi_version == 0 || warn_abi_version >= (11))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (11)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (11)) ))) |
3187 | G.need_abi_warning = true; |
3188 | if (abi_version_at_least (11)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (11))) |
3189 | { |
3190 | /* sZ rather than szDp. */ |
3191 | write_string ("sZ")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("sZ")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("sZ"), __len); __o->next_free += __len ; (void) 0; }); |
3192 | write_expression (PACK_EXPANSION_PATTERN (op)(((enum tree_code) ((tree_check2 ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3192, __FUNCTION__, (TYPE_PACK_EXPANSION), (EXPR_PACK_EXPANSION ))))->base.code) == TYPE_PACK_EXPANSION ? ((contains_struct_check ((op), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3192, __FUNCTION__))->typed.type) : (*((const_cast<tree *> (tree_operand_check ((op), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3192, __FUNCTION__))))))); |
3193 | return; |
3194 | } |
3195 | } |
3196 | |
3197 | if (SIZEOF_EXPR_TYPE_P (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3197, __FUNCTION__, (SIZEOF_EXPR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3197, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
3198 | { |
3199 | write_string ("st")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("st")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("st"), __len); __o->next_free += __len ; (void) 0; }); |
3200 | write_type (TREE_TYPE (op)((contains_struct_check ((op), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3200, __FUNCTION__))->typed.type)); |
3201 | } |
3202 | else if (ARGUMENT_PACK_P (op)(((enum tree_code) (op)->base.code) == TYPE_ARGUMENT_PACK || ((enum tree_code) (op)->base.code) == NONTYPE_ARGUMENT_PACK )) |
3203 | { |
3204 | tree args = ARGUMENT_PACK_ARGS (op)(((enum tree_code) ((tree_check2 ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3204, __FUNCTION__, (TYPE_ARGUMENT_PACK), (NONTYPE_ARGUMENT_PACK ))))->base.code) == TYPE_ARGUMENT_PACK ? ((contains_struct_check ((op), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3204, __FUNCTION__))->typed.type) : (*((const_cast<tree *> (tree_operand_check ((op), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3204, __FUNCTION__)))))); |
3205 | int length = TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3205, __FUNCTION__, (TREE_VEC)))->base.u.length); |
3206 | if (abi_warn_or_compat_version_crosses (10)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10)) != (warn_abi_version == 0 || warn_abi_version >= (10))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (10)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (10)) ))) |
3207 | G.need_abi_warning = true; |
3208 | if (abi_version_at_least (10)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10))) |
3209 | { |
3210 | /* sP <template-arg>* E # sizeof...(T), size of a captured |
3211 | template parameter pack from an alias template */ |
3212 | write_string ("sP")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("sP")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("sP"), __len); __o->next_free += __len ; (void) 0; }); |
3213 | for (int i = 0; i < length; ++i) |
3214 | write_template_arg (TREE_VEC_ELT (args, i)(*((const_cast<tree *> (tree_vec_elt_check ((args), (i) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3214, __FUNCTION__)))))); |
3215 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3216 | } |
3217 | else |
3218 | { |
3219 | /* In GCC 5 we represented this sizeof wrong, with the effect |
3220 | that we mangled it as the last element of the pack. */ |
3221 | tree arg = TREE_VEC_ELT (args, length-1)(*((const_cast<tree *> (tree_vec_elt_check ((args), (length -1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3221, __FUNCTION__))))); |
3222 | if (TYPE_P (op)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (op)->base.code))] == tcc_type)) |
3223 | { |
3224 | write_string ("st")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("st")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("st"), __len); __o->next_free += __len ; (void) 0; }); |
3225 | write_type (arg); |
3226 | } |
3227 | else |
3228 | { |
3229 | write_string ("sz")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("sz")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("sz"), __len); __o->next_free += __len ; (void) 0; }); |
3230 | write_expression (arg); |
3231 | } |
3232 | } |
3233 | } |
3234 | else if (TYPE_P (TREE_OPERAND (expr, 0))(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) ((*((const_cast<tree*> (tree_operand_check ((expr), ( 0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3234, __FUNCTION__))))))->base.code))] == tcc_type)) |
3235 | { |
3236 | write_string ("st")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("st")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("st"), __len); __o->next_free += __len ; (void) 0; }); |
3237 | write_type (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3237, __FUNCTION__)))))); |
3238 | } |
3239 | else |
3240 | goto normal_expr; |
3241 | } |
3242 | else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == ALIGNOF_EXPR) |
3243 | { |
3244 | if (!ALIGNOF_EXPR_STD_P (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3244, __FUNCTION__, (ALIGNOF_EXPR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3244, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
3245 | { |
3246 | if (abi_warn_or_compat_version_crosses (16)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (16)) != (warn_abi_version == 0 || warn_abi_version >= (16))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (16)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (16)) ))) |
3247 | G.need_abi_warning = true; |
3248 | if (abi_version_at_least (16)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (16))) |
3249 | { |
3250 | /* We used to mangle __alignof__ like alignof. */ |
3251 | write_string ("u11__alignof__")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("u11__alignof__")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o, __len ); memcpy (__o->next_free, ("u11__alignof__"), __len); __o ->next_free += __len; (void) 0; }); |
3252 | write_template_arg (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3252, __FUNCTION__)))))); |
3253 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3254 | return; |
3255 | } |
3256 | } |
3257 | if (TYPE_P (TREE_OPERAND (expr, 0))(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) ((*((const_cast<tree*> (tree_operand_check ((expr), ( 0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3257, __FUNCTION__))))))->base.code))] == tcc_type)) |
3258 | { |
3259 | write_string ("at")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("at")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("at"), __len); __o->next_free += __len ; (void) 0; }); |
3260 | write_type (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3260, __FUNCTION__)))))); |
3261 | } |
3262 | else |
3263 | goto normal_expr; |
3264 | } |
3265 | else if (code == SCOPE_REF |
3266 | || code == BASELINK) |
3267 | { |
3268 | tree scope, member; |
3269 | if (code == SCOPE_REF) |
3270 | { |
3271 | scope = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3271, __FUNCTION__))))); |
3272 | member = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3272, __FUNCTION__))))); |
3273 | if (BASELINK_P (member)(((enum tree_code) (member)->base.code) == BASELINK)) |
3274 | member = BASELINK_FUNCTIONS (member)(((struct tree_baselink*) (tree_check ((member), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3274, __FUNCTION__, (BASELINK))))->functions); |
3275 | } |
3276 | else |
3277 | { |
3278 | scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (expr))((contains_struct_check (((tree_check (((((struct tree_baselink *) (tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3278, __FUNCTION__, (BASELINK))))->access_binfo)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3278, __FUNCTION__, (TREE_BINFO)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3278, __FUNCTION__))->typed.type); |
3279 | member = BASELINK_FUNCTIONS (expr)(((struct tree_baselink*) (tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3279, __FUNCTION__, (BASELINK))))->functions); |
3280 | } |
3281 | |
3282 | /* If the MEMBER is a real declaration, then the qualifying |
3283 | scope was not dependent. Ideally, we would not have a |
3284 | SCOPE_REF in those cases, but sometimes we do. If the second |
3285 | argument is a DECL, then the name must not have been |
3286 | dependent. */ |
3287 | if (DECL_P (member)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (member)->base.code))] == tcc_declaration)) |
3288 | write_expression (member); |
3289 | else |
3290 | { |
3291 | gcc_assert (code != BASELINK || BASELINK_QUALIFIED_P (expr))((void)(!(code != BASELINK || ((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3291, __FUNCTION__, (BASELINK)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3291, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3291, __FUNCTION__), 0 : 0)); |
3292 | write_string ("sr")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("sr")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("sr"), __len); __o->next_free += __len ; (void) 0; }); |
3293 | write_type (scope); |
3294 | write_member_name (member); |
3295 | } |
3296 | } |
3297 | else if (INDIRECT_REF_P (expr)(((enum tree_code) (expr)->base.code) == INDIRECT_REF) |
3298 | && TREE_TYPE (TREE_OPERAND (expr, 0))((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3298, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3298, __FUNCTION__))->typed.type) |
3299 | && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr, 0)))(((enum tree_code) (((contains_struct_check (((*((const_cast< tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3299, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3299, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3300 | { |
3301 | write_expression (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3301, __FUNCTION__)))))); |
3302 | } |
3303 | else if (identifier_p (expr)) |
3304 | { |
3305 | /* An operator name appearing as a dependent name needs to be |
3306 | specially marked to disambiguate between a use of the operator |
3307 | name and a use of the operator in an expression. */ |
3308 | if (IDENTIFIER_ANY_OP_P (expr)(((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3308, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3308, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
3309 | write_string ("on")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("on")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("on"), __len); __o->next_free += __len ; (void) 0; }); |
3310 | write_unqualified_id (expr); |
3311 | } |
3312 | else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == TEMPLATE_ID_EXPR) |
3313 | { |
3314 | tree fn = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3314, __FUNCTION__))))); |
3315 | fn = OVL_NAME (fn)((contains_struct_check ((ovl_first (fn)), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3315, __FUNCTION__))->decl_minimal.name); |
3316 | if (IDENTIFIER_ANY_OP_P (fn)(((tree_not_check2 (((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3316, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3316, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
3317 | write_string ("on")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("on")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("on"), __len); __o->next_free += __len ; (void) 0; }); |
3318 | write_unqualified_id (fn); |
3319 | write_template_args (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3319, __FUNCTION__)))))); |
3320 | } |
3321 | else if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == MODOP_EXPR) |
3322 | { |
3323 | enum tree_code subop = TREE_CODE (TREE_OPERAND (expr, 1))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3323, __FUNCTION__))))))->base.code); |
3324 | const char *name = OVL_OP_INFO (true, subop)(&ovl_op_info[(true) != 0][ovl_op_mapping[(subop)]])->mangled_name; |
3325 | |
3326 | write_string (name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (name), __len); __o->next_free += __len ; (void) 0; }); |
3327 | write_expression (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3327, __FUNCTION__)))))); |
3328 | write_expression (TREE_OPERAND (expr, 2)(*((const_cast<tree*> (tree_operand_check ((expr), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3328, __FUNCTION__)))))); |
3329 | } |
3330 | else if (code == NEW_EXPR || code == VEC_NEW_EXPR) |
3331 | { |
3332 | /* ::= [gs] nw <expression>* _ <type> E |
3333 | ::= [gs] nw <expression>* _ <type> <initializer> |
3334 | ::= [gs] na <expression>* _ <type> E |
3335 | ::= [gs] na <expression>* _ <type> <initializer> |
3336 | <initializer> ::= pi <expression>* E */ |
3337 | tree placement = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3337, __FUNCTION__))))); |
3338 | tree type = TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3338, __FUNCTION__))))); |
3339 | tree nelts = TREE_OPERAND (expr, 2)(*((const_cast<tree*> (tree_operand_check ((expr), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3339, __FUNCTION__))))); |
3340 | tree init = TREE_OPERAND (expr, 3)(*((const_cast<tree*> (tree_operand_check ((expr), (3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3340, __FUNCTION__))))); |
3341 | tree t; |
3342 | |
3343 | gcc_assert (code == NEW_EXPR)((void)(!(code == NEW_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3343, __FUNCTION__), 0 : 0)); |
3344 | if (TREE_OPERAND (expr, 2)(*((const_cast<tree*> (tree_operand_check ((expr), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3344, __FUNCTION__)))))) |
3345 | code = VEC_NEW_EXPR; |
3346 | |
3347 | if (NEW_EXPR_USE_GLOBAL (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3347, __FUNCTION__, (NEW_EXPR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3347, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
3348 | write_string ("gs")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("gs")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("gs"), __len); __o->next_free += __len ; (void) 0; }); |
3349 | |
3350 | write_string (OVL_OP_INFO (false, code)->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name), __len); __o->next_free += __len ; (void) 0; }); |
3351 | |
3352 | for (t = placement; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3352, __FUNCTION__))->common.chain)) |
3353 | write_expression (TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3353, __FUNCTION__, (TREE_LIST)))->list.value)); |
3354 | |
3355 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3356 | |
3357 | if (nelts) |
3358 | { |
3359 | tree domain; |
3360 | ++processing_template_declscope_chain->x_processing_template_decl; |
3361 | domain = compute_array_index_type (NULL_TREE(tree) nullptr, nelts, |
3362 | tf_warning_or_error); |
3363 | type = build_cplus_array_type (type, domain); |
3364 | --processing_template_declscope_chain->x_processing_template_decl; |
3365 | } |
3366 | write_type (type); |
3367 | |
3368 | if (init && TREE_CODE (init)((enum tree_code) (init)->base.code) == TREE_LIST |
3369 | && DIRECT_LIST_INIT_P (TREE_VALUE (init))((((enum tree_code) (((tree_check ((init), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__, (TREE_LIST)))->list.value))->base .code) == CONSTRUCTOR && ((contains_struct_check (((( tree_check ((init), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__, (TREE_LIST)))->list.value)), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__))->typed.type) == cp_global_trees[CPTI_INIT_LIST_TYPE ]) && (((tree_not_check2 (((tree_check ((((tree_check ((init), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__, (TREE_LIST)))->list.value)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__, (CONSTRUCTOR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3369, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)))) |
3370 | write_expression (TREE_VALUE (init)((tree_check ((init), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3370, __FUNCTION__, (TREE_LIST)))->list.value)); |
3371 | else |
3372 | { |
3373 | if (init) |
3374 | write_string ("pi")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("pi")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("pi"), __len); __o->next_free += __len ; (void) 0; }); |
3375 | if (init && init != void_nodeglobal_trees[TI_VOID]) |
3376 | for (t = init; t; t = TREE_CHAIN (t)((contains_struct_check ((t), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3376, __FUNCTION__))->common.chain)) |
3377 | write_expression (TREE_VALUE (t)((tree_check ((t), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3377, __FUNCTION__, (TREE_LIST)))->list.value)); |
3378 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3379 | } |
3380 | } |
3381 | else if (code == DELETE_EXPR || code == VEC_DELETE_EXPR) |
3382 | { |
3383 | gcc_assert (code == DELETE_EXPR)((void)(!(code == DELETE_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3383, __FUNCTION__), 0 : 0)); |
3384 | if (DELETE_EXPR_USE_VEC (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3384, __FUNCTION__, (DELETE_EXPR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3384, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_1)) |
3385 | code = VEC_DELETE_EXPR; |
3386 | |
3387 | if (DELETE_EXPR_USE_GLOBAL (expr)((tree_not_check2 (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3387, __FUNCTION__, (DELETE_EXPR)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3387, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_0)) |
3388 | write_string ("gs")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("gs")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("gs"), __len); __o->next_free += __len ; (void) 0; }); |
3389 | |
3390 | write_string (OVL_OP_INFO (false, code)->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name), __len); __o->next_free += __len ; (void) 0; }); |
3391 | |
3392 | write_expression (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3392, __FUNCTION__)))))); |
3393 | } |
3394 | else if (code == THROW_EXPR) |
3395 | { |
3396 | tree op = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3396, __FUNCTION__))))); |
3397 | if (op) |
3398 | { |
3399 | write_string ("tw")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("tw")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("tw"), __len); __o->next_free += __len ; (void) 0; }); |
3400 | write_expression (op); |
3401 | } |
3402 | else |
3403 | write_string ("tr")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("tr")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("tr"), __len); __o->next_free += __len ; (void) 0; }); |
3404 | } |
3405 | else if (code == CONSTRUCTOR) |
3406 | { |
3407 | bool braced_init = BRACE_ENCLOSED_INITIALIZER_P (expr)(((enum tree_code) (expr)->base.code) == CONSTRUCTOR && ((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3407, __FUNCTION__))->typed.type) == cp_global_trees[CPTI_INIT_LIST_TYPE ]); |
3408 | tree etype = TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3408, __FUNCTION__))->typed.type); |
3409 | |
3410 | if (braced_init) |
3411 | write_string ("il")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("il")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("il"), __len); __o->next_free += __len ; (void) 0; }); |
3412 | else |
3413 | { |
3414 | write_string ("tl")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("tl")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("tl"), __len); __o->next_free += __len ; (void) 0; }); |
3415 | write_type (etype); |
3416 | } |
3417 | |
3418 | /* If this is an undigested initializer, mangle it as written. |
3419 | COMPOUND_LITERAL_P doesn't actually distinguish between digested and |
3420 | undigested braced casts, but it should work to use it to distinguish |
3421 | between braced casts in a template signature (undigested) and template |
3422 | parm object values (digested), and all CONSTRUCTORS that get here |
3423 | should be one of those two cases. */ |
3424 | bool undigested = braced_init || COMPOUND_LITERAL_P (expr)(((enum tree_code) (expr)->base.code) == CONSTRUCTOR && (((tree_not_check2 ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3424, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_4))); |
3425 | if (undigested || !zero_init_expr_p (expr)) |
3426 | { |
3427 | /* Convert braced initializer lists to STRING_CSTs so that |
3428 | A<"Foo"> mangles the same as A<{'F', 'o', 'o', 0}> while |
3429 | still using the latter mangling for strings that |
3430 | originated as braced initializer lists. */ |
3431 | expr = braced_lists_to_strings (etype, expr); |
3432 | |
3433 | if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == CONSTRUCTOR) |
3434 | { |
3435 | vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (expr)((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3435, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts); |
3436 | unsigned last_nonzero = UINT_MAX(2147483647 *2U +1U); |
3437 | constructor_elt *ce; |
3438 | |
3439 | if (!undigested) |
3440 | for (HOST_WIDE_INTlong i = 0; vec_safe_iterate (elts, i, &ce); ++i) |
3441 | if ((TREE_CODE (etype)((enum tree_code) (etype)->base.code) == UNION_TYPE |
3442 | && ce->index != first_field (etype)) |
3443 | || !zero_init_expr_p (ce->value)) |
3444 | last_nonzero = i; |
3445 | |
3446 | if (undigested || last_nonzero != UINT_MAX(2147483647 *2U +1U)) |
3447 | for (HOST_WIDE_INTlong i = 0; vec_safe_iterate (elts, i, &ce); ++i) |
3448 | { |
3449 | if (i > last_nonzero) |
3450 | break; |
3451 | if (!undigested && TREE_CODE (etype)((enum tree_code) (etype)->base.code) == UNION_TYPE) |
3452 | { |
3453 | /* Express the active member as a designator. */ |
3454 | write_string ("di")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("di")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("di"), __len); __o->next_free += __len ; (void) 0; }); |
3455 | write_unqualified_name (ce->index); |
3456 | } |
3457 | unsigned reps = 1; |
3458 | if (ce->index && TREE_CODE (ce->index)((enum tree_code) (ce->index)->base.code) == RANGE_EXPR) |
3459 | reps = range_expr_nelts (ce->index); |
3460 | for (unsigned j = 0; j < reps; ++j) |
3461 | write_expression (ce->value); |
3462 | } |
3463 | } |
3464 | else |
3465 | { |
3466 | gcc_assert (TREE_CODE (expr) == STRING_CST)((void)(!(((enum tree_code) (expr)->base.code) == STRING_CST ) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3466, __FUNCTION__), 0 : 0)); |
3467 | write_expression (expr); |
3468 | } |
3469 | } |
3470 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3471 | } |
3472 | else if (code == LAMBDA_EXPR) |
3473 | { |
3474 | /* [temp.over.link] Two lambda-expressions are never considered |
3475 | equivalent. |
3476 | |
3477 | So just use the closure type mangling. */ |
3478 | write_string ("tl")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("tl")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("tl"), __len); __o->next_free += __len ; (void) 0; }); |
3479 | write_type (LAMBDA_EXPR_CLOSURE (expr)(((contains_struct_check (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3479, __FUNCTION__, (LAMBDA_EXPR)))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3479, __FUNCTION__))->typed.type))); |
3480 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3481 | } |
3482 | else if (dependent_name (expr)) |
3483 | { |
3484 | tree name = dependent_name (expr); |
3485 | if (IDENTIFIER_ANY_OP_P (name)(((tree_not_check2 (((tree_check ((name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3485, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3485, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_2))) |
3486 | { |
3487 | if (abi_version_at_least (16)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (16))) |
3488 | write_string ("on")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("on")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("on"), __len); __o->next_free += __len ; (void) 0; }); |
3489 | if (abi_warn_or_compat_version_crosses (16)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (16)) != (warn_abi_version == 0 || warn_abi_version >= (16))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (16)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (16)) ))) |
3490 | G.need_abi_warning = 1; |
3491 | } |
3492 | write_unqualified_id (name); |
3493 | } |
3494 | else |
3495 | { |
3496 | normal_expr: |
3497 | int i, len; |
3498 | const char *name; |
3499 | |
3500 | /* When we bind a variable or function to a non-type template |
3501 | argument with reference type, we create an ADDR_EXPR to show |
3502 | the fact that the entity's address has been taken. But, we |
3503 | don't actually want to output a mangling code for the `&'. */ |
3504 | if (TREE_CODE (expr)((enum tree_code) (expr)->base.code) == ADDR_EXPR |
3505 | && TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3505, __FUNCTION__))->typed.type) |
3506 | && TYPE_REF_P (TREE_TYPE (expr))(((enum tree_code) (((contains_struct_check ((expr), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3506, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3507 | { |
3508 | expr = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3508, __FUNCTION__))))); |
3509 | if (DECL_P (expr)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (expr)->base.code))] == tcc_declaration)) |
3510 | { |
3511 | write_expression (expr); |
3512 | return; |
3513 | } |
3514 | |
3515 | code = TREE_CODE (expr)((enum tree_code) (expr)->base.code); |
3516 | } |
3517 | |
3518 | if (code == COMPONENT_REF) |
3519 | { |
3520 | tree ob = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3520, __FUNCTION__))))); |
3521 | |
3522 | if (TREE_CODE (ob)((enum tree_code) (ob)->base.code) == ARROW_EXPR) |
3523 | { |
3524 | write_string (OVL_OP_INFO (false, code)->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ((&ovl_op_info[(false) != 0][ovl_op_mapping [(code)]])->mangled_name), __len); __o->next_free += __len ; (void) 0; }); |
3525 | ob = TREE_OPERAND (ob, 0)(*((const_cast<tree*> (tree_operand_check ((ob), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3525, __FUNCTION__))))); |
3526 | write_expression (ob); |
3527 | } |
3528 | else if (write_base_ref (expr)) |
3529 | return; |
3530 | else if (!is_dummy_object (ob)) |
3531 | { |
3532 | write_string ("dt")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("dt")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("dt"), __len); __o->next_free += __len ; (void) 0; }); |
3533 | write_expression (ob); |
3534 | } |
3535 | /* else, for a non-static data member with no associated object (in |
3536 | unevaluated context), use the unresolved-name mangling. */ |
3537 | |
3538 | write_member_name (TREE_OPERAND (expr, 1)(*((const_cast<tree*> (tree_operand_check ((expr), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3538, __FUNCTION__)))))); |
3539 | return; |
3540 | } |
3541 | |
3542 | /* If it wasn't any of those, recursively expand the expression. */ |
3543 | name = OVL_OP_INFO (false, code)(&ovl_op_info[(false) != 0][ovl_op_mapping[(code)]])->mangled_name; |
3544 | |
3545 | /* We used to mangle const_cast and static_cast like a C cast. */ |
3546 | if (code == CONST_CAST_EXPR |
3547 | || code == STATIC_CAST_EXPR) |
3548 | { |
3549 | if (abi_warn_or_compat_version_crosses (6)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6)) != (warn_abi_version == 0 || warn_abi_version >= (6))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (6)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (6))) )) |
3550 | G.need_abi_warning = 1; |
3551 | if (!abi_version_at_least (6)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6))) |
3552 | name = OVL_OP_INFO (false, CAST_EXPR)(&ovl_op_info[(false) != 0][ovl_op_mapping[(CAST_EXPR)]])->mangled_name; |
3553 | } |
3554 | |
3555 | if (name == NULLnullptr) |
3556 | { |
3557 | switch (code) |
3558 | { |
3559 | case TRAIT_EXPR: |
3560 | error ("use of built-in trait %qE in function signature; " |
3561 | "use library traits instead", expr); |
3562 | break; |
3563 | |
3564 | default: |
3565 | sorry ("mangling %C", code); |
3566 | break; |
3567 | } |
3568 | return; |
3569 | } |
3570 | else |
3571 | write_string (name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (name), __len); __o->next_free += __len ; (void) 0; }); |
3572 | |
3573 | switch (code) |
3574 | { |
3575 | case CALL_EXPR: |
3576 | { |
3577 | tree fn = CALL_EXPR_FN (expr)(*((const_cast<tree*> (tree_operand_check (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3577, __FUNCTION__, (CALL_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3577, __FUNCTION__))))); |
3578 | |
3579 | if (TREE_CODE (fn)((enum tree_code) (fn)->base.code) == ADDR_EXPR) |
3580 | fn = TREE_OPERAND (fn, 0)(*((const_cast<tree*> (tree_operand_check ((fn), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3580, __FUNCTION__))))); |
3581 | |
3582 | /* Mangle a dependent name as the name, not whatever happens to |
3583 | be the first function in the overload set. */ |
3584 | if (OVL_P (fn)(((enum tree_code) (fn)->base.code) == FUNCTION_DECL || (( enum tree_code) (fn)->base.code) == OVERLOAD) |
3585 | && type_dependent_expression_p_push (expr)) |
3586 | fn = OVL_NAME (fn)((contains_struct_check ((ovl_first (fn)), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3586, __FUNCTION__))->decl_minimal.name); |
3587 | |
3588 | write_expression (fn); |
3589 | } |
3590 | |
3591 | for (i = 0; i < call_expr_nargs (expr)(((int)((unsigned long) (*tree_int_cst_elt_check (((tree_class_check ((expr), (tcc_vl_exp), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3591, __FUNCTION__))->exp.operands[0]), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3591, __FUNCTION__)))) - 3); ++i) |
3592 | write_expression (CALL_EXPR_ARG (expr, i)(*((const_cast<tree*> (tree_operand_check (((tree_check ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3592, __FUNCTION__, (CALL_EXPR)))), ((i) + 3), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3592, __FUNCTION__)))))); |
3593 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3594 | break; |
3595 | |
3596 | case CAST_EXPR: |
3597 | write_type (TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3597, __FUNCTION__))->typed.type)); |
3598 | if (list_length (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3598, __FUNCTION__)))))) == 1) |
3599 | write_expression (TREE_VALUE (TREE_OPERAND (expr, 0))((tree_check (((*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3599, __FUNCTION__)))))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3599, __FUNCTION__, (TREE_LIST)))->list.value)); |
3600 | else |
3601 | { |
3602 | tree args = TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3602, __FUNCTION__))))); |
3603 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3604 | for (; args; args = TREE_CHAIN (args)((contains_struct_check ((args), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3604, __FUNCTION__))->common.chain)) |
3605 | write_expression (TREE_VALUE (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3605, __FUNCTION__, (TREE_LIST)))->list.value)); |
3606 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3607 | } |
3608 | break; |
3609 | |
3610 | case DYNAMIC_CAST_EXPR: |
3611 | case REINTERPRET_CAST_EXPR: |
3612 | case STATIC_CAST_EXPR: |
3613 | case CONST_CAST_EXPR: |
3614 | write_type (TREE_TYPE (expr)((contains_struct_check ((expr), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3614, __FUNCTION__))->typed.type)); |
3615 | write_expression (TREE_OPERAND (expr, 0)(*((const_cast<tree*> (tree_operand_check ((expr), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3615, __FUNCTION__)))))); |
3616 | break; |
3617 | |
3618 | case PREINCREMENT_EXPR: |
3619 | case PREDECREMENT_EXPR: |
3620 | if (abi_version_at_least (6)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6))) |
3621 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3622 | if (abi_warn_or_compat_version_crosses (6)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6)) != (warn_abi_version == 0 || warn_abi_version >= (6))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (6)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (6))) )) |
3623 | G.need_abi_warning = 1; |
3624 | /* Fall through. */ |
3625 | |
3626 | default: |
3627 | /* In the middle-end, some expressions have more operands than |
3628 | they do in templates (and mangling). */ |
3629 | len = cp_tree_operand_length (expr); |
3630 | |
3631 | for (i = 0; i < len; ++i) |
3632 | { |
3633 | tree operand = TREE_OPERAND (expr, i)(*((const_cast<tree*> (tree_operand_check ((expr), (i), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3633, __FUNCTION__))))); |
3634 | /* As a GNU extension, the middle operand of a |
3635 | conditional may be omitted. Since expression |
3636 | manglings are supposed to represent the input token |
3637 | stream, there's no good way to mangle such an |
3638 | expression without extending the C++ ABI. */ |
3639 | if (code == COND_EXPR && i == 1 && !operand) |
3640 | { |
3641 | error ("omitted middle operand to %<?:%> operand " |
3642 | "cannot be mangled"); |
3643 | continue; |
3644 | } |
3645 | else if (FOLD_EXPR_P (expr)(((enum tree_code) (expr)->base.code) == UNARY_LEFT_FOLD_EXPR || ((enum tree_code) (expr)->base.code) == UNARY_RIGHT_FOLD_EXPR || ((enum tree_code) (expr)->base.code) == BINARY_LEFT_FOLD_EXPR || ((enum tree_code) (expr)->base.code) == BINARY_RIGHT_FOLD_EXPR )) |
3646 | { |
3647 | /* The first 'operand' of a fold-expression is the operator |
3648 | that it folds over. */ |
3649 | if (i == 0) |
3650 | { |
3651 | int fcode = TREE_INT_CST_LOW (operand)((unsigned long) (*tree_int_cst_elt_check ((operand), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3651, __FUNCTION__))); |
3652 | write_string (OVL_OP_INFO (false, fcode)->mangled_name)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ((&ovl_op_info[(false) != 0][ovl_op_mapping [(fcode)]])->mangled_name)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ((&ovl_op_info[(false) != 0][ovl_op_mapping [(fcode)]])->mangled_name), __len); __o->next_free += __len ; (void) 0; }); |
3653 | continue; |
3654 | } |
3655 | else if (code == BINARY_LEFT_FOLD_EXPR) |
3656 | { |
3657 | /* The order of operands of the binary left and right |
3658 | folds is the same, but we want to mangle them in |
3659 | lexical order, i.e. non-pack first. */ |
3660 | if (i == 1) |
3661 | operand = FOLD_EXPR_INIT (expr)(*((const_cast<tree*> (tree_operand_check (((tree_check2 ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3661, __FUNCTION__, (BINARY_LEFT_FOLD_EXPR), (BINARY_RIGHT_FOLD_EXPR )))), (2), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3661, __FUNCTION__))))); |
3662 | else |
3663 | operand = FOLD_EXPR_PACK (expr)(*((const_cast<tree*> (tree_operand_check (((tree_check4 ((expr), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3663, __FUNCTION__, (UNARY_LEFT_FOLD_EXPR), (UNARY_RIGHT_FOLD_EXPR ), (BINARY_LEFT_FOLD_EXPR), (BINARY_RIGHT_FOLD_EXPR)))), (1), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3663, __FUNCTION__))))); |
3664 | } |
3665 | if (PACK_EXPANSION_P (operand)(((enum tree_code) (operand)->base.code) == TYPE_PACK_EXPANSION || ((enum tree_code) (operand)->base.code) == EXPR_PACK_EXPANSION )) |
3666 | operand = PACK_EXPANSION_PATTERN (operand)(((enum tree_code) ((tree_check2 ((operand), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3666, __FUNCTION__, (TYPE_PACK_EXPANSION), (EXPR_PACK_EXPANSION ))))->base.code) == TYPE_PACK_EXPANSION ? ((contains_struct_check ((operand), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3666, __FUNCTION__))->typed.type) : (*((const_cast<tree *> (tree_operand_check ((operand), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3666, __FUNCTION__)))))); |
3667 | } |
3668 | write_expression (operand); |
3669 | } |
3670 | } |
3671 | } |
3672 | } |
3673 | |
3674 | /* Literal subcase of non-terminal <template-arg>. |
3675 | |
3676 | "Literal arguments, e.g. "A<42L>", are encoded with their type |
3677 | and value. Negative integer values are preceded with "n"; for |
3678 | example, "A<-42L>" becomes "1AILln42EE". The bool value false is |
3679 | encoded as 0, true as 1." */ |
3680 | |
3681 | static void |
3682 | write_template_arg_literal (const tree value) |
3683 | { |
3684 | if (TREE_CODE (value)((enum tree_code) (value)->base.code) == STRING_CST) |
3685 | /* Temporarily mangle strings as braced initializer lists. */ |
3686 | write_string ("tl")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("tl")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("tl"), __len); __o->next_free += __len ; (void) 0; }); |
3687 | else |
3688 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
3689 | |
3690 | tree valtype = TREE_TYPE (value)((contains_struct_check ((value), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3690, __FUNCTION__))->typed.type); |
3691 | write_type (valtype); |
3692 | |
3693 | /* Write a null member pointer value as (type)0, regardless of its |
3694 | real representation. */ |
3695 | if (null_member_pointer_value_p (value)) |
3696 | write_integer_cst (integer_zero_nodeglobal_trees[TI_INTEGER_ZERO]); |
3697 | else |
3698 | switch (TREE_CODE (value)((enum tree_code) (value)->base.code)) |
3699 | { |
3700 | case CONST_DECL: |
3701 | write_integer_cst (DECL_INITIAL (value)((contains_struct_check ((value), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3701, __FUNCTION__))->decl_common.initial)); |
3702 | break; |
3703 | |
3704 | case INTEGER_CST: |
3705 | gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node)((void)(!(!comptypes ((((contains_struct_check ((value), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3705, __FUNCTION__))->typed.type)), (global_trees[TI_BOOLEAN_TYPE ]), 0) || integer_zerop (value) || integer_onep (value)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3706, __FUNCTION__), 0 : 0)) |
3706 | || integer_zerop (value) || integer_onep (value))((void)(!(!comptypes ((((contains_struct_check ((value), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3705, __FUNCTION__))->typed.type)), (global_trees[TI_BOOLEAN_TYPE ]), 0) || integer_zerop (value) || integer_onep (value)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3706, __FUNCTION__), 0 : 0)); |
3707 | if (!(abi_version_at_least (14)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (14)) |
3708 | && NULLPTR_TYPE_P (TREE_TYPE (value))(((enum tree_code) (((contains_struct_check ((value), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3708, __FUNCTION__))->typed.type))->base.code) == NULLPTR_TYPE ))) |
3709 | write_integer_cst (value); |
3710 | break; |
3711 | |
3712 | case REAL_CST: |
3713 | write_real_cst (value); |
3714 | break; |
3715 | |
3716 | case COMPLEX_CST: |
3717 | if (TREE_CODE (TREE_REALPART (value))((enum tree_code) (((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3717, __FUNCTION__, (COMPLEX_CST)))->complex.real))-> base.code) == INTEGER_CST |
3718 | && TREE_CODE (TREE_IMAGPART (value))((enum tree_code) (((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3718, __FUNCTION__, (COMPLEX_CST)))->complex.imag))-> base.code) == INTEGER_CST) |
3719 | { |
3720 | write_integer_cst (TREE_REALPART (value)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3720, __FUNCTION__, (COMPLEX_CST)))->complex.real)); |
3721 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3722 | write_integer_cst (TREE_IMAGPART (value)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3722, __FUNCTION__, (COMPLEX_CST)))->complex.imag)); |
3723 | } |
3724 | else if (TREE_CODE (TREE_REALPART (value))((enum tree_code) (((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3724, __FUNCTION__, (COMPLEX_CST)))->complex.real))-> base.code) == REAL_CST |
3725 | && TREE_CODE (TREE_IMAGPART (value))((enum tree_code) (((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3725, __FUNCTION__, (COMPLEX_CST)))->complex.imag))-> base.code) == REAL_CST) |
3726 | { |
3727 | write_real_cst (TREE_REALPART (value)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3727, __FUNCTION__, (COMPLEX_CST)))->complex.real)); |
3728 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3729 | write_real_cst (TREE_IMAGPART (value)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3729, __FUNCTION__, (COMPLEX_CST)))->complex.imag)); |
3730 | } |
3731 | else |
3732 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3732, __FUNCTION__)); |
3733 | break; |
3734 | |
3735 | case STRING_CST: |
3736 | { |
3737 | /* Mangle strings the same as braced initializer lists. */ |
3738 | unsigned n = TREE_STRING_LENGTH (value)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3738, __FUNCTION__, (STRING_CST)))->string.length); |
3739 | const char *str = TREE_STRING_POINTER (value)((const char *)((tree_check ((value), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3739, __FUNCTION__, (STRING_CST)))->string.str)); |
3740 | |
3741 | /* Count the number of trailing nuls and subtract them from |
3742 | STRSIZE because they don't need to be mangled. */ |
3743 | for (const char *p = str + n - 1; ; --p) |
3744 | { |
3745 | if (*p || p == str) |
3746 | { |
3747 | n -= str + n - !!*p - p; |
3748 | break; |
3749 | } |
3750 | } |
3751 | tree eltype = TREE_TYPE (valtype)((contains_struct_check ((valtype), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3751, __FUNCTION__))->typed.type); |
3752 | for (const char *p = str; n--; ++p) |
3753 | { |
3754 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
3755 | write_type (eltype); |
3756 | write_unsigned_number (*(const unsigned char*)p)write_number ((*(const unsigned char*)p), 1, 10); |
3757 | write_string ("E")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("E")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free ); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o ->next_free, ("E"), __len); __o->next_free += __len; (void ) 0; }); |
3758 | } |
3759 | break; |
3760 | } |
3761 | |
3762 | default: |
3763 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3763, __FUNCTION__)); |
3764 | } |
3765 | |
3766 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3767 | } |
3768 | |
3769 | /* Non-terminal <template-arg>. |
3770 | |
3771 | <template-arg> ::= <type> # type |
3772 | ::= L <type> </value/ number> E # literal |
3773 | ::= LZ <name> E # external name |
3774 | ::= X <expression> E # expression */ |
3775 | |
3776 | static void |
3777 | write_template_arg (tree node) |
3778 | { |
3779 | enum tree_code code = TREE_CODE (node)((enum tree_code) (node)->base.code); |
3780 | |
3781 | MANGLE_TRACE_TREE ("template-arg", node); |
3782 | |
3783 | /* A template template parameter's argument list contains TREE_LIST |
3784 | nodes of which the value field is the actual argument. */ |
3785 | if (code == TREE_LIST) |
3786 | { |
3787 | node = TREE_VALUE (node)((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3787, __FUNCTION__, (TREE_LIST)))->list.value); |
3788 | /* If it's a decl, deal with its type instead. */ |
3789 | if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration)) |
3790 | { |
3791 | node = TREE_TYPE (node)((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3791, __FUNCTION__))->typed.type); |
3792 | code = TREE_CODE (node)((enum tree_code) (node)->base.code); |
3793 | } |
3794 | } |
3795 | |
3796 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == VAR_DECL && DECL_NTTP_OBJECT_P (node)((tree_not_check2 (((tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3796, __FUNCTION__, (VAR_DECL)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3796, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits .lang_flag_5)) |
3797 | /* We want to mangle the argument, not the var we stored it in. */ |
3798 | node = tparm_object_argument (node); |
3799 | |
3800 | /* Strip a conversion added by convert_nontype_argument. */ |
3801 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == IMPLICIT_CONV_EXPR) |
3802 | node = TREE_OPERAND (node, 0)(*((const_cast<tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3802, __FUNCTION__))))); |
3803 | if (REFERENCE_REF_P (node)((((enum tree_code) (node)->base.code) == INDIRECT_REF) && ((contains_struct_check (((*((const_cast<tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3803, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3803, __FUNCTION__))->typed.type) && (((enum tree_code ) (((contains_struct_check (((*((const_cast<tree*> (tree_operand_check (((node)), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3803, __FUNCTION__)))))), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3803, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE ))) |
3804 | node = TREE_OPERAND (node, 0)(*((const_cast<tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3804, __FUNCTION__))))); |
3805 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == NOP_EXPR |
3806 | && TYPE_REF_P (TREE_TYPE (node))(((enum tree_code) (((contains_struct_check ((node), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3806, __FUNCTION__))->typed.type))->base.code) == REFERENCE_TYPE )) |
3807 | { |
3808 | /* Template parameters can be of reference type. To maintain |
3809 | internal consistency, such arguments use a conversion from |
3810 | address of object to reference type. */ |
3811 | gcc_assert (TREE_CODE (TREE_OPERAND (node, 0)) == ADDR_EXPR)((void)(!(((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3811, __FUNCTION__))))))->base.code) == ADDR_EXPR) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3811, __FUNCTION__), 0 : 0)); |
3812 | node = TREE_OPERAND (TREE_OPERAND (node, 0), 0)(*((const_cast<tree*> (tree_operand_check (((*((const_cast <tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3812, __FUNCTION__)))))), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3812, __FUNCTION__))))); |
3813 | } |
3814 | |
3815 | if (TREE_CODE (node)((enum tree_code) (node)->base.code) == BASELINK |
3816 | && !type_unknown_p (node)) |
3817 | { |
3818 | if (abi_version_at_least (6)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6))) |
3819 | node = BASELINK_FUNCTIONS (node)(((struct tree_baselink*) (tree_check ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3819, __FUNCTION__, (BASELINK))))->functions); |
3820 | if (abi_warn_or_compat_version_crosses (6)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6)) != (warn_abi_version == 0 || warn_abi_version >= (6))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (6)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (6))) )) |
3821 | /* We wrongly wrapped a class-scope function in X/E. */ |
3822 | G.need_abi_warning = 1; |
3823 | } |
3824 | |
3825 | if (ARGUMENT_PACK_P (node)(((enum tree_code) (node)->base.code) == TYPE_ARGUMENT_PACK || ((enum tree_code) (node)->base.code) == NONTYPE_ARGUMENT_PACK )) |
3826 | { |
3827 | /* Expand the template argument pack. */ |
3828 | tree args = ARGUMENT_PACK_ARGS (node)(((enum tree_code) ((tree_check2 ((node), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3828, __FUNCTION__, (TYPE_ARGUMENT_PACK), (NONTYPE_ARGUMENT_PACK ))))->base.code) == TYPE_ARGUMENT_PACK ? ((contains_struct_check ((node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3828, __FUNCTION__))->typed.type) : (*((const_cast<tree *> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3828, __FUNCTION__)))))); |
3829 | int i, length = TREE_VEC_LENGTH (args)((tree_check ((args), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3829, __FUNCTION__, (TREE_VEC)))->base.u.length); |
3830 | if (abi_version_at_least (6)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6))) |
3831 | write_char ('J')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('J')))); }); |
3832 | else |
3833 | write_char ('I')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('I')))); }); |
3834 | if (abi_warn_or_compat_version_crosses (6)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (6)) != (warn_abi_version == 0 || warn_abi_version >= (6))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (6)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (6))) )) |
3835 | G.need_abi_warning = 1; |
3836 | for (i = 0; i < length; ++i) |
3837 | write_template_arg (TREE_VEC_ELT (args, i)(*((const_cast<tree *> (tree_vec_elt_check ((args), (i) , "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3837, __FUNCTION__)))))); |
3838 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3839 | } |
3840 | else if (TYPE_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_type)) |
3841 | write_type (node); |
3842 | else if (code == TEMPLATE_DECL) |
3843 | /* A template appearing as a template arg is a template template arg. */ |
3844 | write_template_template_arg (node); |
3845 | else if ((TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_constant && code != PTRMEM_CST) |
3846 | || code == CONST_DECL |
3847 | || null_member_pointer_value_p (node)) |
3848 | write_template_arg_literal (node); |
3849 | else if (code == EXCESS_PRECISION_EXPR |
3850 | && TREE_CODE (TREE_OPERAND (node, 0))((enum tree_code) ((*((const_cast<tree*> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3850, __FUNCTION__))))))->base.code) == REAL_CST) |
3851 | write_template_arg_literal (fold_convert (TREE_TYPE (node),fold_convert_loc (((location_t) 0), ((contains_struct_check ( (node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3851, __FUNCTION__))->typed.type), (*((const_cast<tree *> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3852, __FUNCTION__)))))) |
3852 | TREE_OPERAND (node, 0))fold_convert_loc (((location_t) 0), ((contains_struct_check ( (node), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3851, __FUNCTION__))->typed.type), (*((const_cast<tree *> (tree_operand_check ((node), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3852, __FUNCTION__))))))); |
3853 | else if (DECL_P (node)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code ) (node)->base.code))] == tcc_declaration)) |
3854 | { |
3855 | write_char ('L')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('L')))); }); |
3856 | /* Until ABI version 3, the underscore before the mangled name |
3857 | was incorrectly omitted. */ |
3858 | if (!abi_version_at_least (3)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (3))) |
3859 | write_char ('Z')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('Z')))); }); |
3860 | else |
3861 | write_string ("_Z")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("_Z")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("_Z"), __len); __o->next_free += __len ; (void) 0; }); |
3862 | if (abi_warn_or_compat_version_crosses (3)(((global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (3)) != (warn_abi_version == 0 || warn_abi_version >= (3))) || ((global_options.x_flag_abi_version == 0 || global_options .x_flag_abi_version >= (3)) != (global_options.x_flag_abi_compat_version == 0 || global_options.x_flag_abi_compat_version >= (3))) )) |
3863 | G.need_abi_warning = 1; |
3864 | write_encoding (node); |
3865 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3866 | } |
3867 | else |
3868 | { |
3869 | /* Template arguments may be expressions. */ |
3870 | write_char ('X')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('X')))); }); |
3871 | write_expression (node); |
3872 | write_char ('E')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('E')))); }); |
3873 | } |
3874 | } |
3875 | |
3876 | /* <template-template-arg> |
3877 | ::= <name> |
3878 | ::= <substitution> */ |
3879 | |
3880 | static void |
3881 | write_template_template_arg (const tree decl) |
3882 | { |
3883 | MANGLE_TRACE_TREE ("template-template-arg", decl); |
3884 | |
3885 | if (find_substitution (decl)) |
3886 | return; |
3887 | write_name (decl, /*ignore_local_scope=*/0); |
3888 | add_substitution (decl); |
3889 | } |
3890 | |
3891 | |
3892 | /* Non-terminal <array-type>. TYPE is an ARRAY_TYPE. |
3893 | |
3894 | <array-type> ::= A [</dimension/ number>] _ </element/ type> |
3895 | ::= A <expression> _ </element/ type> |
3896 | |
3897 | "Array types encode the dimension (number of elements) and the |
3898 | element type. For variable length arrays, the dimension (but not |
3899 | the '_' separator) is omitted." |
3900 | Note that for flexible array members, like for other arrays of |
3901 | unspecified size, the dimension is also omitted. */ |
3902 | |
3903 | static void |
3904 | write_array_type (const tree type) |
3905 | { |
3906 | write_char ('A')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('A')))); }); |
3907 | if (TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3907, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values )) |
3908 | { |
3909 | tree index_type; |
3910 | |
3911 | index_type = TYPE_DOMAIN (type)((tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3911, __FUNCTION__, (ARRAY_TYPE)))->type_non_common.values ); |
3912 | /* The INDEX_TYPE gives the upper and lower bounds of the array. |
3913 | It's null for flexible array members which have no upper bound |
3914 | (this is a change from GCC 5 and prior where such members were |
3915 | incorrectly mangled as zero-length arrays). */ |
3916 | if (tree max = TYPE_MAX_VALUE (index_type)((tree_check5 ((index_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3916, __FUNCTION__, (INTEGER_TYPE), (ENUMERAL_TYPE), (BOOLEAN_TYPE ), (REAL_TYPE), (FIXED_POINT_TYPE)))->type_non_common.maxval )) |
3917 | { |
3918 | if (TREE_CODE (max)((enum tree_code) (max)->base.code) == INTEGER_CST) |
3919 | { |
3920 | /* The ABI specifies that we should mangle the number of |
3921 | elements in the array, not the largest allowed index. */ |
3922 | offset_int wmax = wi::to_offset (max) + 1; |
3923 | /* Truncate the result - this will mangle [0, SIZE_INT_MAX] |
3924 | number of elements as zero. */ |
3925 | wmax = wi::zext (wmax, TYPE_PRECISION (TREE_TYPE (max))((tree_class_check ((((contains_struct_check ((max), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3925, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3925, __FUNCTION__))->type_common.precision)); |
3926 | gcc_assert (wi::fits_uhwi_p (wmax))((void)(!(wi::fits_uhwi_p (wmax)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3926, __FUNCTION__), 0 : 0)); |
3927 | write_unsigned_number (wmax.to_uhwi ())write_number ((wmax.to_uhwi ()), 1, 10); |
3928 | } |
3929 | else |
3930 | { |
3931 | max = TREE_OPERAND (max, 0)(*((const_cast<tree*> (tree_operand_check ((max), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3931, __FUNCTION__))))); |
3932 | write_expression (max); |
3933 | } |
3934 | } |
3935 | } |
3936 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
3937 | write_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3937, __FUNCTION__))->typed.type)); |
3938 | } |
3939 | |
3940 | /* Non-terminal <pointer-to-member-type> for pointer-to-member |
3941 | variables. TYPE is a pointer-to-member POINTER_TYPE. |
3942 | |
3943 | <pointer-to-member-type> ::= M </class/ type> </member/ type> */ |
3944 | |
3945 | static void |
3946 | write_pointer_to_member_type (const tree type) |
3947 | { |
3948 | write_char ('M')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('M')))); }); |
3949 | write_type (TYPE_PTRMEM_CLASS_TYPE (type)((((enum tree_code) (type)->base.code) == OFFSET_TYPE) ? ( (tree_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3949, __FUNCTION__, (OFFSET_TYPE)))->type_non_common.maxval ) : ((tree_check2 ((((contains_struct_check (((cp_build_qualified_type (((contains_struct_check ((((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3949, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_non_common.values)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3949, __FUNCTION__))->typed.type), cp_type_quals (type)) )), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3949, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3949, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common .maxval))); |
3950 | write_type (TYPE_PTRMEM_POINTED_TO_TYPE (type)((((enum tree_code) (type)->base.code) == OFFSET_TYPE) ? ( (contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3950, __FUNCTION__))->typed.type) : ((contains_struct_check (((cp_build_qualified_type (((contains_struct_check ((((tree_check3 ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3950, __FUNCTION__, (RECORD_TYPE), (UNION_TYPE), (QUAL_UNION_TYPE )))->type_non_common.values)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3950, __FUNCTION__))->typed.type), cp_type_quals (type)) )), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3950, __FUNCTION__))->typed.type))); |
3951 | } |
3952 | |
3953 | /* Non-terminal <template-param>. PARM is a TEMPLATE_TYPE_PARM, |
3954 | TEMPLATE_TEMPLATE_PARM, BOUND_TEMPLATE_TEMPLATE_PARM or a |
3955 | TEMPLATE_PARM_INDEX. |
3956 | |
3957 | <template-param> ::= T </parameter/ number> _ */ |
3958 | |
3959 | static void |
3960 | write_template_param (const tree parm) |
3961 | { |
3962 | int parm_index; |
3963 | |
3964 | MANGLE_TRACE_TREE ("template-parm", parm); |
3965 | |
3966 | switch (TREE_CODE (parm)((enum tree_code) (parm)->base.code)) |
3967 | { |
3968 | case TEMPLATE_TYPE_PARM: |
3969 | case TEMPLATE_TEMPLATE_PARM: |
3970 | case BOUND_TEMPLATE_TEMPLATE_PARM: |
3971 | parm_index = TEMPLATE_TYPE_IDX (parm)((((template_parm_index*)(tree_check (((((tree_class_check (( (tree_check3 (((parm)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3971, __FUNCTION__, (TEMPLATE_TYPE_PARM), (TEMPLATE_TEMPLATE_PARM ), (BOUND_TEMPLATE_TEMPLATE_PARM)))), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3971, __FUNCTION__))->type_non_common.values))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3971, __FUNCTION__, (TEMPLATE_PARM_INDEX))))->index)); |
3972 | break; |
3973 | |
3974 | case TEMPLATE_PARM_INDEX: |
3975 | parm_index = TEMPLATE_PARM_IDX (parm)(((template_parm_index*)(tree_check ((parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3975, __FUNCTION__, (TEMPLATE_PARM_INDEX))))->index); |
3976 | break; |
3977 | |
3978 | default: |
3979 | gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 3979, __FUNCTION__)); |
3980 | } |
3981 | |
3982 | write_char ('T')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('T')))); }); |
3983 | /* NUMBER as it appears in the mangling is (-1)-indexed, with the |
3984 | earliest template param denoted by `_'. */ |
3985 | write_compact_number (parm_index); |
3986 | } |
3987 | |
3988 | /* <template-template-param> |
3989 | ::= <template-param> |
3990 | ::= <substitution> */ |
3991 | |
3992 | static void |
3993 | write_template_template_param (const tree parm) |
3994 | { |
3995 | tree templ = NULL_TREE(tree) nullptr; |
3996 | |
3997 | /* PARM, a TEMPLATE_TEMPLATE_PARM, is an instantiation of the |
3998 | template template parameter. The substitution candidate here is |
3999 | only the template. */ |
4000 | if (TREE_CODE (parm)((enum tree_code) (parm)->base.code) == BOUND_TEMPLATE_TEMPLATE_PARM) |
4001 | { |
4002 | templ |
4003 | = TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm))((struct tree_template_info*)(tree_check (((((tree_class_check (((tree_check ((parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4003, __FUNCTION__, (BOUND_TEMPLATE_TEMPLATE_PARM)))), (tcc_type ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4003, __FUNCTION__))->type_non_common.lang_1))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4003, __FUNCTION__, (TEMPLATE_INFO))))->tmpl; |
4004 | if (find_substitution (templ)) |
4005 | return; |
4006 | } |
4007 | |
4008 | /* <template-param> encodes only the template parameter position, |
4009 | not its template arguments, which is fine here. */ |
4010 | write_template_param (parm); |
4011 | if (templ) |
4012 | add_substitution (templ); |
4013 | } |
4014 | |
4015 | /* Non-terminal <substitution>. |
4016 | |
4017 | <substitution> ::= S <seq-id> _ |
4018 | ::= S_ */ |
4019 | |
4020 | static void |
4021 | write_substitution (const int seq_id) |
4022 | { |
4023 | MANGLE_TRACE ("substitution", ""); |
4024 | |
4025 | write_char ('S')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('S')))); }); |
4026 | if (seq_id > 0) |
4027 | write_number (seq_id - 1, /*unsigned=*/1, 36); |
4028 | write_char ('_')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('_')))); }); |
4029 | } |
4030 | |
4031 | /* Start mangling ENTITY. */ |
4032 | |
4033 | static inline void |
4034 | start_mangling (const tree entity) |
4035 | { |
4036 | G.entity = entity; |
4037 | G.need_abi_warning = false; |
4038 | G.need_cxx17_warning = false; |
4039 | G.mod = false; |
4040 | obstack_free (&name_obstack, name_base)__extension__ ({ struct obstack *__o = (&name_obstack); void *__obj = (void *) (name_base); if (__obj > (void *) __o-> chunk && __obj < (void *) __o->chunk_limit) __o ->next_free = __o->object_base = (char *) __obj; else _obstack_free (__o, __obj); }); |
4041 | mangle_obstack = &name_obstack; |
4042 | name_base = obstack_alloc (&name_obstack, 0)__extension__ ({ struct obstack *__h = (&name_obstack); __extension__ ({ struct obstack *__o = (__h); size_t __len = ((0)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o , __len); ((void) ((__o)->next_free += (__len))); }); __extension__ ({ struct obstack *__o1 = (__h); void *__value = (void *) __o1 ->object_base; if (__o1->next_free == __value) __o1-> maybe_empty_object = 1; __o1->next_free = (sizeof (ptrdiff_t ) < sizeof (void *) ? ((__o1->object_base) + (((__o1-> next_free) - (__o1->object_base) + (__o1->alignment_mask )) & ~(__o1->alignment_mask))) : (char *) (((ptrdiff_t ) (__o1->next_free) + (__o1->alignment_mask)) & ~(__o1 ->alignment_mask))); if ((size_t) (__o1->next_free - (char *) __o1->chunk) > (size_t) (__o1->chunk_limit - (char *) __o1->chunk)) __o1->next_free = __o1->chunk_limit ; __o1->object_base = __o1->next_free; __value; }); }); |
4043 | } |
4044 | |
4045 | /* Done with mangling. Release the data. */ |
4046 | |
4047 | static void |
4048 | finish_mangling_internal (void) |
4049 | { |
4050 | /* Clear all the substitutions. */ |
4051 | vec_safe_truncate (G.substitutions, 0); |
4052 | |
4053 | if (G.mod) |
4054 | mangle_module_fini (); |
4055 | |
4056 | /* Null-terminate the string. */ |
4057 | write_char ('\0')__extension__ ({ struct obstack *__o = (mangle_obstack); if ( __extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < 1) _obstack_newchunk (__o, 1); ((void) (*((__o)->next_free)++ = (('\0')))); }); |
4058 | } |
4059 | |
4060 | |
4061 | /* Like finish_mangling_internal, but return the mangled string. */ |
4062 | |
4063 | static inline const char * |
4064 | finish_mangling (void) |
4065 | { |
4066 | finish_mangling_internal (); |
4067 | return (const char *) obstack_finish (mangle_obstack)__extension__ ({ struct obstack *__o1 = (mangle_obstack); void *__value = (void *) __o1->object_base; if (__o1->next_free == __value) __o1->maybe_empty_object = 1; __o1->next_free = (sizeof (ptrdiff_t) < sizeof (void *) ? ((__o1->object_base ) + (((__o1->next_free) - (__o1->object_base) + (__o1-> alignment_mask)) & ~(__o1->alignment_mask))) : (char * ) (((ptrdiff_t) (__o1->next_free) + (__o1->alignment_mask )) & ~(__o1->alignment_mask))); if ((size_t) (__o1-> next_free - (char *) __o1->chunk) > (size_t) (__o1-> chunk_limit - (char *) __o1->chunk)) __o1->next_free = __o1 ->chunk_limit; __o1->object_base = __o1->next_free; __value ; }); |
4068 | } |
4069 | |
4070 | /* Like finish_mangling_internal, but return an identifier. */ |
4071 | |
4072 | static tree |
4073 | finish_mangling_get_identifier (void) |
4074 | { |
4075 | finish_mangling_internal (); |
4076 | /* Don't obstack_finish here, and the next start_mangling will |
4077 | remove the identifier. */ |
4078 | return get_identifier ((const char *) obstack_base (mangle_obstack))(__builtin_constant_p ((const char *) ((void *) (mangle_obstack )->object_base)) ? get_identifier_with_length (((const char *) ((void *) (mangle_obstack)->object_base)), strlen ((const char *) ((void *) (mangle_obstack)->object_base))) : get_identifier ((const char *) ((void *) (mangle_obstack)->object_base)) ); |
4079 | } |
4080 | |
4081 | /* Initialize data structures for mangling. */ |
4082 | |
4083 | void |
4084 | init_mangle (void) |
4085 | { |
4086 | gcc_obstack_init (&name_obstack)_obstack_begin (((&name_obstack)), (memory_block_pool::block_size ), (0), (mempool_obstack_chunk_alloc), (mempool_obstack_chunk_free )); |
4087 | name_base = obstack_alloc (&name_obstack, 0)__extension__ ({ struct obstack *__h = (&name_obstack); __extension__ ({ struct obstack *__o = (__h); size_t __len = ((0)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1->next_free); }) < __len) _obstack_newchunk (__o , __len); ((void) ((__o)->next_free += (__len))); }); __extension__ ({ struct obstack *__o1 = (__h); void *__value = (void *) __o1 ->object_base; if (__o1->next_free == __value) __o1-> maybe_empty_object = 1; __o1->next_free = (sizeof (ptrdiff_t ) < sizeof (void *) ? ((__o1->object_base) + (((__o1-> next_free) - (__o1->object_base) + (__o1->alignment_mask )) & ~(__o1->alignment_mask))) : (char *) (((ptrdiff_t ) (__o1->next_free) + (__o1->alignment_mask)) & ~(__o1 ->alignment_mask))); if ((size_t) (__o1->next_free - (char *) __o1->chunk) > (size_t) (__o1->chunk_limit - (char *) __o1->chunk)) __o1->next_free = __o1->chunk_limit ; __o1->object_base = __o1->next_free; __value; }); }); |
4088 | vec_alloc (G.substitutions, 0); |
4089 | |
4090 | /* Cache these identifiers for quick comparison when checking for |
4091 | standard substitutions. */ |
4092 | subst_identifiers[SUBID_ALLOCATOR] = get_identifier ("allocator")(__builtin_constant_p ("allocator") ? get_identifier_with_length (("allocator"), strlen ("allocator")) : get_identifier ("allocator" )); |
4093 | subst_identifiers[SUBID_BASIC_STRING] = get_identifier ("basic_string")(__builtin_constant_p ("basic_string") ? get_identifier_with_length (("basic_string"), strlen ("basic_string")) : get_identifier ("basic_string")); |
4094 | subst_identifiers[SUBID_CHAR_TRAITS] = get_identifier ("char_traits")(__builtin_constant_p ("char_traits") ? get_identifier_with_length (("char_traits"), strlen ("char_traits")) : get_identifier ( "char_traits")); |
4095 | subst_identifiers[SUBID_BASIC_ISTREAM] = get_identifier ("basic_istream")(__builtin_constant_p ("basic_istream") ? get_identifier_with_length (("basic_istream"), strlen ("basic_istream")) : get_identifier ("basic_istream")); |
4096 | subst_identifiers[SUBID_BASIC_OSTREAM] = get_identifier ("basic_ostream")(__builtin_constant_p ("basic_ostream") ? get_identifier_with_length (("basic_ostream"), strlen ("basic_ostream")) : get_identifier ("basic_ostream")); |
4097 | subst_identifiers[SUBID_BASIC_IOSTREAM] = get_identifier ("basic_iostream")(__builtin_constant_p ("basic_iostream") ? get_identifier_with_length (("basic_iostream"), strlen ("basic_iostream")) : get_identifier ("basic_iostream")); |
4098 | } |
4099 | |
4100 | /* Generate a mangling for MODULE's global initializer fn. */ |
4101 | |
4102 | tree |
4103 | mangle_module_global_init (int module) |
4104 | { |
4105 | start_mangling (NULL_TREE(tree) nullptr); |
4106 | |
4107 | write_string ("_ZGI")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("_ZGI")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("_ZGI"), __len); __o->next_free += __len ; (void) 0; }); |
4108 | write_module (module, true); |
4109 | |
4110 | return finish_mangling_get_identifier (); |
4111 | } |
4112 | |
4113 | /* Generate the mangled name of DECL. */ |
4114 | |
4115 | static tree |
4116 | mangle_decl_string (const tree decl) |
4117 | { |
4118 | tree result; |
4119 | tree saved_fn = NULL_TREE(tree) nullptr; |
4120 | bool template_p = false; |
4121 | |
4122 | /* We shouldn't be trying to mangle an uninstantiated template. */ |
4123 | gcc_assert (!type_dependent_expression_p (decl))((void)(!(!type_dependent_expression_p (decl)) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4123, __FUNCTION__), 0 : 0)); |
4124 | |
4125 | if (DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4125, __FUNCTION__))->decl_common.lang_specific) && DECL_USE_TEMPLATE (decl)(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4125, __FUNCTION__))->decl_common.lang_specific)->u.base .use_template)) |
4126 | { |
4127 | struct tinst_level *tl = current_instantiation (); |
4128 | if ((!tl || tl->maybe_get_node () != decl) |
4129 | && push_tinst_level (decl)) |
4130 | { |
4131 | template_p = true; |
4132 | saved_fn = current_function_decl; |
4133 | current_function_decl = NULL_TREE(tree) nullptr; |
4134 | } |
4135 | } |
4136 | iloc_sentinel ils (DECL_SOURCE_LOCATION (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4136, __FUNCTION__))->decl_minimal.locus)); |
4137 | |
4138 | start_mangling (decl); |
4139 | |
4140 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL) |
4141 | write_type (TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4141, __FUNCTION__))->typed.type)); |
4142 | else |
4143 | write_mangled_name (decl, true); |
4144 | |
4145 | result = finish_mangling_get_identifier (); |
4146 | if (DEBUG_MANGLE0) |
4147 | fprintf (stderrstderr, "mangle_decl_string = '%s'\n\n", |
4148 | IDENTIFIER_POINTER (result)((const char *) (tree_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4148, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str )); |
4149 | |
4150 | if (template_p) |
4151 | { |
4152 | pop_tinst_level (); |
4153 | current_function_decl = saved_fn; |
4154 | } |
4155 | |
4156 | return result; |
4157 | } |
4158 | |
4159 | /* Return an identifier for the external mangled name of DECL. */ |
4160 | |
4161 | static tree |
4162 | get_mangled_id (tree decl) |
4163 | { |
4164 | tree id = mangle_decl_string (decl); |
4165 | return targetm.mangle_decl_assembler_name (decl, id); |
4166 | } |
4167 | |
4168 | /* Create an identifier for the external mangled name of DECL. */ |
4169 | |
4170 | void |
4171 | mangle_decl (const tree decl) |
4172 | { |
4173 | tree id; |
4174 | bool dep; |
4175 | |
4176 | /* Don't bother mangling uninstantiated templates. */ |
4177 | ++processing_template_declscope_chain->x_processing_template_decl; |
4178 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL) |
4179 | dep = dependent_type_p (TREE_TYPE (decl)((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4179, __FUNCTION__))->typed.type)); |
4180 | else |
4181 | dep = (DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4181, __FUNCTION__))->decl_common.lang_specific) && DECL_TEMPLATE_INFO (decl)(((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4181, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4181, __FUNCTION__))->decl_common.lang_specific) ->u. min.template_info) |
4182 | && any_dependent_template_arguments_p (DECL_TI_ARGS (decl)((struct tree_template_info*)(tree_check (((((contains_struct_check ((template_info_decl_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4182, __FUNCTION__)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4182, __FUNCTION__))->decl_common.lang_specific) ->u. min.template_info)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4182, __FUNCTION__, (TEMPLATE_INFO))))->args)); |
4183 | --processing_template_declscope_chain->x_processing_template_decl; |
4184 | if (dep) |
4185 | return; |
4186 | |
4187 | /* During LTO we keep mangled names of TYPE_DECLs for ODR type merging. |
4188 | It is not needed to assign names to anonymous namespace, but we use the |
4189 | "<anon>" marker to be able to tell if type is C++ ODR type or type |
4190 | produced by other language. */ |
4191 | if (TREE_CODE (decl)((enum tree_code) (decl)->base.code) == TYPE_DECL |
4192 | && TYPE_STUB_DECL (TREE_TYPE (decl))(((contains_struct_check (((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4192, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4192, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4192, __FUNCTION__))->common.chain)) |
4193 | && !TREE_PUBLIC (TYPE_STUB_DECL (TREE_TYPE (decl)))(((((contains_struct_check (((tree_class_check ((((contains_struct_check ((decl), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4193, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4193, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4193, __FUNCTION__))->common.chain)))->base.public_flag )) |
4194 | id = get_identifier ("<anon>")(__builtin_constant_p ("<anon>") ? get_identifier_with_length (("<anon>"), strlen ("<anon>")) : get_identifier ("<anon>")); |
4195 | else |
4196 | { |
4197 | gcc_assert (TREE_CODE (decl) != TYPE_DECL((void)(!(((enum tree_code) (decl)->base.code) != TYPE_DECL || !no_linkage_check (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4198, __FUNCTION__))->typed.type), true)) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4198, __FUNCTION__), 0 : 0)) |
4198 | || !no_linkage_check (TREE_TYPE (decl), true))((void)(!(((enum tree_code) (decl)->base.code) != TYPE_DECL || !no_linkage_check (((contains_struct_check ((decl), (TS_TYPED ), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4198, __FUNCTION__))->typed.type), true)) ? fancy_abort ( "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4198, __FUNCTION__), 0 : 0)); |
4199 | if (abi_version_at_least (10)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (10))) |
4200 | if (tree fn = decl_function_context (decl)) |
4201 | maybe_check_abi_tags (fn, decl); |
4202 | id = get_mangled_id (decl); |
4203 | } |
4204 | SET_DECL_ASSEMBLER_NAME (decl, id)overwrite_decl_assembler_name (decl, id); |
4205 | |
4206 | if (G.need_cxx17_warning |
4207 | && (TREE_PUBLIC (decl)((decl)->base.public_flag) || DECL_REALLY_EXTERN (decl)(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4207, __FUNCTION__))->decl_common.decl_flag_1) && (!((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4207, __FUNCTION__))->decl_common.lang_specific) || !((( contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4207, __FUNCTION__))->decl_common.lang_specific)->u.base .not_really_extern))))) |
4208 | warning_at (DECL_SOURCE_LOCATION (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4208, __FUNCTION__))->decl_minimal.locus), OPT_Wnoexcept_type, |
4209 | "mangled name for %qD will change in C++17 because the " |
4210 | "exception specification is part of a function type", |
4211 | decl); |
4212 | |
4213 | if (id != DECL_NAME (decl)((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4213, __FUNCTION__))->decl_minimal.name) |
4214 | /* Don't do this for a fake symbol we aren't going to emit anyway. */ |
4215 | && TREE_CODE (decl)((enum tree_code) (decl)->base.code) != TYPE_DECL |
4216 | && !DECL_MAYBE_IN_CHARGE_CDTOR_P (decl)((((contains_struct_check ((decl), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4216, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((decl), ( TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4216, __FUNCTION__))->decl_minimal.name) == cp_global_trees [CPTI_DTOR_IDENTIFIER]))) |
4217 | { |
4218 | int save_ver = flag_abi_versionglobal_options.x_flag_abi_version; |
4219 | tree id2 = NULL_TREE(tree) nullptr; |
4220 | |
4221 | if (!DECL_REALLY_EXTERN (decl)(((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4221, __FUNCTION__))->decl_common.decl_flag_1) && (!((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4221, __FUNCTION__))->decl_common.lang_specific) || !((( contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4221, __FUNCTION__))->decl_common.lang_specific)->u.base .not_really_extern)))) |
4222 | { |
4223 | record_mangling (decl, G.need_abi_warning); |
4224 | |
4225 | if (!G.need_abi_warning) |
4226 | return; |
4227 | |
4228 | flag_abi_versionglobal_options.x_flag_abi_version = flag_abi_compat_versionglobal_options.x_flag_abi_compat_version; |
4229 | id2 = mangle_decl_string (decl); |
4230 | id2 = targetm.mangle_decl_assembler_name (decl, id2); |
4231 | flag_abi_versionglobal_options.x_flag_abi_version = save_ver; |
4232 | |
4233 | if (id2 != id) |
4234 | note_mangling_alias (decl, id2); |
4235 | } |
4236 | |
4237 | if (warn_abiglobal_options.x_warn_abi) |
4238 | { |
4239 | const char fabi_version[] = "-fabi-version"; |
4240 | |
4241 | if (flag_abi_compat_versionglobal_options.x_flag_abi_compat_version != warn_abi_version |
4242 | || id2 == NULL_TREE(tree) nullptr) |
4243 | { |
4244 | flag_abi_versionglobal_options.x_flag_abi_version = warn_abi_version; |
4245 | id2 = mangle_decl_string (decl); |
4246 | id2 = targetm.mangle_decl_assembler_name (decl, id2); |
4247 | } |
4248 | flag_abi_versionglobal_options.x_flag_abi_version = save_ver; |
4249 | |
4250 | if (id2 == id) |
4251 | /* OK. */; |
4252 | else if (warn_abi_version != 0 |
4253 | && abi_version_at_least (warn_abi_version)(global_options.x_flag_abi_version == 0 || global_options.x_flag_abi_version >= (warn_abi_version))) |
4254 | warning_at (DECL_SOURCE_LOCATION (G.entity)((contains_struct_check ((G.entity), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4254, __FUNCTION__))->decl_minimal.locus), OPT_Wabi, |
4255 | "the mangled name of %qD changed between " |
4256 | "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)", |
4257 | G.entity, fabi_version, warn_abi_version, id2, |
4258 | fabi_version, save_ver, id); |
4259 | else |
4260 | warning_at (DECL_SOURCE_LOCATION (G.entity)((contains_struct_check ((G.entity), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4260, __FUNCTION__))->decl_minimal.locus), OPT_Wabi, |
4261 | "the mangled name of %qD changes between " |
4262 | "%<%s=%d%> (%qD) and %<%s=%d%> (%qD)", |
4263 | G.entity, fabi_version, save_ver, id, |
4264 | fabi_version, warn_abi_version, id2); |
4265 | } |
4266 | |
4267 | flag_abi_versionglobal_options.x_flag_abi_version = save_ver; |
4268 | } |
4269 | } |
4270 | |
4271 | /* Generate the mangled representation of TYPE. */ |
4272 | |
4273 | const char * |
4274 | mangle_type_string (const tree type) |
4275 | { |
4276 | const char *result; |
4277 | |
4278 | start_mangling (type); |
4279 | write_type (type); |
4280 | result = finish_mangling (); |
4281 | if (DEBUG_MANGLE0) |
4282 | fprintf (stderrstderr, "mangle_type_string = '%s'\n\n", result); |
4283 | return result; |
4284 | } |
4285 | |
4286 | /* Create an identifier for the mangled name of a special component |
4287 | for belonging to TYPE. CODE is the ABI-specified code for this |
4288 | component. */ |
4289 | |
4290 | static tree |
4291 | mangle_special_for_type (const tree type, const char *code) |
4292 | { |
4293 | tree result; |
4294 | |
4295 | /* We don't have an actual decl here for the special component, so |
4296 | we can't just process the <encoded-name>. Instead, fake it. */ |
4297 | start_mangling (type); |
4298 | |
4299 | /* Start the mangling. */ |
4300 | write_string ("_Z")__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen ("_Z")); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, ("_Z"), __len); __o->next_free += __len ; (void) 0; }); |
4301 | write_string (code)__extension__ ({ struct obstack *__o = (mangle_obstack); size_t __len = (strlen (code)); if (__extension__ ({ struct obstack const *__o1 = (__o); (size_t) (__o1->chunk_limit - __o1-> next_free); }) < __len) _obstack_newchunk (__o, __len); memcpy (__o->next_free, (code), __len); __o->next_free += __len ; (void) 0; }); |
4302 | |
4303 | /* Add the type. */ |
4304 | write_type (type); |
4305 | result = finish_mangling_get_identifier (); |
4306 | |
4307 | if (DEBUG_MANGLE0) |
4308 | fprintf (stderrstderr, "mangle_special_for_type = %s\n\n", |
4309 | IDENTIFIER_POINTER (result)((const char *) (tree_check ((result), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/mangle.cc" , 4309, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str )); |
4310 | |
4311 | return result; |
4312 | } |
4313 | |
4314 | /* Create an identifier for the mangled representation of the typeinfo |
4315 | structure for TYPE. */ |
4316 | |
4317 | tree |
4318 | mangle_typeinfo_for_type (const tree type) |
4319 | { |
4320 | return mangle_special_for_type (type, "TI"); |
4321 | } |
4322 | |
4323 | /* Create an identifier for the mangled name of the NTBS containing |
4324 | the mangled name of TYPE. */ |
4325 | |
4326 | tree |
4327 | mangle_typeinfo_string_for_type (const tree type) |
4328 | { |
4329 | return mangle_special_for_type (type, "TS"); |
4330 | } |
4331 | |
4332 | /* Create an identifier for the mangled name of the vtable for TYPE. */ |