Branch data Line data Source code
1 : : /* Some code common to C and ObjC front ends.
2 : : Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it under
7 : : the terms of the GNU General Public License as published by the Free
8 : : Software Foundation; either version 3, or (at your option) any later
9 : : version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #include "config.h"
21 : : #include "system.h"
22 : : #include "coretypes.h"
23 : : #include "c-tree.h"
24 : : #include "intl.h"
25 : : #include "c-family/c-pretty-print.h"
26 : : #include "tree-pretty-print.h"
27 : : #include "tree-pretty-print-markup.h"
28 : : #include "gimple-pretty-print.h"
29 : : #include "langhooks.h"
30 : : #include "c-objc-common.h"
31 : : #include "c-family/c-type-mismatch.h"
32 : : #include "stringpool.h"
33 : : #include "attribs.h"
34 : : #include "dwarf2.h"
35 : : #include "make-unique.h"
36 : :
37 : : static bool c_tree_printer (pretty_printer *, text_info *, const char *,
38 : : int, bool, bool, bool, bool *, pp_token_list &);
39 : :
40 : : /* Info for C language features which can be queried through
41 : : __has_{feature,extension}. */
42 : :
43 : : struct c_feature_info
44 : : {
45 : : const char *ident;
46 : : const int *enable_flag;
47 : : };
48 : :
49 : : static const c_feature_info c_feature_table[] =
50 : : {
51 : : { "c_alignas", &flag_isoc11 },
52 : : { "c_alignof", &flag_isoc11 },
53 : : { "c_atomic", &flag_isoc11 },
54 : : { "c_generic_selections", &flag_isoc11 },
55 : : { "c_static_assert", &flag_isoc11 },
56 : : { "c_thread_local", &flag_isoc11 },
57 : : { "cxx_binary_literals", &flag_isoc23 }
58 : : };
59 : :
60 : : /* Register features specific to the C language. */
61 : :
62 : : void
63 : 24184 : c_register_features ()
64 : : {
65 : 193472 : for (unsigned i = 0; i < ARRAY_SIZE (c_feature_table); i++)
66 : : {
67 : 169288 : const c_feature_info *info = c_feature_table + i;
68 : 169288 : const bool feat_p = !info->enable_flag || *info->enable_flag;
69 : 169288 : c_common_register_feature (info->ident, feat_p);
70 : : }
71 : 24184 : }
72 : :
73 : : bool
74 : 12318 : c_missing_noreturn_ok_p (tree decl)
75 : : {
76 : : /* A missing noreturn is ok for the `main' function. */
77 : 12318 : if (!MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)))
78 : : return false;
79 : :
80 : 6763 : return flag_hosted
81 : 6763 : || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl))) == integer_type_node;
82 : : }
83 : :
84 : : /* Called from check_global_declaration. */
85 : :
86 : : bool
87 : 14406 : c_warn_unused_global_decl (const_tree decl)
88 : : {
89 : 14406 : if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
90 : : return false;
91 : 519 : if (DECL_IN_SYSTEM_HEADER (decl))
92 : : return false;
93 : :
94 : : return true;
95 : : }
96 : :
97 : : /* Initialization common to C and Objective-C front ends. */
98 : : bool
99 : 109294 : c_objc_common_init (void)
100 : : {
101 : 109294 : c_init_decl_processing ();
102 : :
103 : 109294 : return c_common_init ();
104 : : }
105 : :
106 : : /* Decide whether it's worth saying that TYPE is also known as some other
107 : : type. Return the other type if so, otherwise return TYPE. */
108 : :
109 : : static tree
110 : 84187 : get_aka_type (tree type)
111 : : {
112 : 84187 : if (type == error_mark_node)
113 : : return type;
114 : :
115 : 84172 : tree result;
116 : 84172 : if (typedef_variant_p (type))
117 : : {
118 : : /* Saying that "foo" is also known as "struct foo" or
119 : : "struct <anonymous>" is unlikely to be useful, since users of
120 : : structure-like types would already know that they're structures.
121 : : The same applies to unions and enums; in general, printing the
122 : : tag is only useful if it has a different name. */
123 : 7239 : tree orig_type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
124 : 7239 : tree_code code = TREE_CODE (orig_type);
125 : 7239 : tree orig_id = TYPE_IDENTIFIER (orig_type);
126 : 7239 : if ((code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
127 : 7239 : && (!orig_id || TYPE_IDENTIFIER (type) == orig_id))
128 : : return type;
129 : :
130 : 6824 : if (!user_facing_original_type_p (type))
131 : : return type;
132 : :
133 : 6711 : result = get_aka_type (orig_type);
134 : : }
135 : 76933 : else if (TREE_CODE (type) == ENUMERAL_TYPE)
136 : : return type;
137 : : else
138 : : {
139 : 76632 : tree canonical = TYPE_CANONICAL (type);
140 : 76632 : if (canonical && TREE_CODE (type) != TREE_CODE (canonical))
141 : : return canonical;
142 : :
143 : : /* Recursive calls might choose a middle ground between TYPE
144 : : (which has no typedefs stripped) and CANONICAL (which has
145 : : all typedefs stripped). So try to reuse TYPE or CANONICAL if
146 : : convenient, but be prepared to create a new type if necessary. */
147 : 76632 : switch (TREE_CODE (type))
148 : : {
149 : 6157 : case POINTER_TYPE:
150 : 6157 : case REFERENCE_TYPE:
151 : 6157 : {
152 : 6157 : tree target_type = get_aka_type (TREE_TYPE (type));
153 : :
154 : 6157 : if (target_type == TREE_TYPE (type))
155 : : return type;
156 : :
157 : 656 : if (canonical && target_type == TREE_TYPE (canonical))
158 : : return canonical;
159 : :
160 : 200 : result = (TREE_CODE (type) == POINTER_TYPE
161 : 200 : ? build_pointer_type (target_type)
162 : 0 : : build_reference_type (target_type));
163 : : break;
164 : : }
165 : :
166 : 22653 : case ARRAY_TYPE:
167 : 22653 : {
168 : 22653 : tree element_type = get_aka_type (TREE_TYPE (type));
169 : 22653 : tree index_type = (TYPE_DOMAIN (type)
170 : 22653 : ? get_aka_type (TYPE_DOMAIN (type))
171 : 22653 : : NULL_TREE);
172 : :
173 : 22653 : if (element_type == TREE_TYPE (type)
174 : 38655 : && index_type == TYPE_DOMAIN (type))
175 : : return type;
176 : :
177 : 6651 : if (canonical
178 : 6524 : && element_type == TREE_TYPE (canonical)
179 : 13164 : && index_type == TYPE_DOMAIN (canonical))
180 : : return canonical;
181 : :
182 : 276 : result = build_array_type (element_type, index_type,
183 : 138 : TYPE_TYPELESS_STORAGE (type));
184 : 138 : break;
185 : : }
186 : :
187 : 1937 : case FUNCTION_TYPE:
188 : 1937 : {
189 : 1937 : tree return_type = get_aka_type (TREE_TYPE (type));
190 : :
191 : 1937 : tree args = TYPE_ARG_TYPES (type);
192 : 1937 : if (args == error_mark_node)
193 : 1702 : return type;
194 : :
195 : 1937 : auto_vec<tree, 32> arg_types;
196 : 1937 : bool type_ok_p = true;
197 : 3677 : while (args && args != void_list_node)
198 : : {
199 : 1740 : tree arg_type = get_aka_type (TREE_VALUE (args));
200 : 1740 : arg_types.safe_push (arg_type);
201 : 1740 : type_ok_p &= (arg_type == TREE_VALUE (args));
202 : 1740 : args = TREE_CHAIN (args);
203 : : }
204 : :
205 : 1937 : if (type_ok_p && return_type == TREE_TYPE (type))
206 : 1702 : return type;
207 : :
208 : 235 : unsigned int i;
209 : 235 : tree arg_type;
210 : 880 : FOR_EACH_VEC_ELT_REVERSE (arg_types, i, arg_type)
211 : 410 : args = tree_cons (NULL_TREE, arg_type, args);
212 : 235 : result = build_function_type (return_type, args);
213 : 235 : break;
214 : 1937 : }
215 : :
216 : 45885 : default:
217 : 55362 : return canonical ? canonical : type;
218 : : }
219 : : }
220 : 7284 : return build_type_attribute_qual_variant (result, TYPE_ATTRIBUTES (type),
221 : 14568 : TYPE_QUALS (type));
222 : : }
223 : :
224 : : /* Print T to CPP. */
225 : :
226 : : static void
227 : 23310 : print_type (c_pretty_printer *cpp, tree t, bool *quoted,
228 : : const char *highlight_color = nullptr)
229 : : {
230 : 23310 : if (t == error_mark_node)
231 : : {
232 : 0 : pp_string (cpp, _("{erroneous}"));
233 : 0 : return;
234 : : }
235 : :
236 : 23310 : if (!pp_show_highlight_colors (cpp))
237 : 335 : highlight_color = nullptr;
238 : :
239 : 23310 : gcc_assert (TYPE_P (t));
240 : 23310 : struct obstack *ob = pp_buffer (cpp)->m_obstack;
241 : 23310 : char *p = (char *) obstack_base (ob);
242 : : /* Remember the end of the initial dump. */
243 : 23310 : int len = obstack_object_size (ob);
244 : :
245 : 23310 : tree name = TYPE_NAME (t);
246 : 23310 : if (name && TREE_CODE (name) == TYPE_DECL && DECL_NAME (name))
247 : 6998 : pp_identifier (cpp, lang_hooks.decl_printable_name (name, 2));
248 : : else
249 : 16312 : cpp->type_id (t);
250 : :
251 : : /* If we're printing a type that involves typedefs, also print the
252 : : stripped version. But sometimes the stripped version looks
253 : : exactly the same, so we don't want it after all. To avoid
254 : : printing it in that case, we play ugly obstack games. */
255 : 23310 : tree aka_type = get_aka_type (t);
256 : 23310 : if (aka_type != t)
257 : : {
258 : 6097 : const bool show_color = pp_show_color (cpp);
259 : 6097 : c_pretty_printer cpp2;
260 : : /* Print the stripped version into a temporary printer. */
261 : 6097 : cpp2.type_id (aka_type);
262 : 6097 : struct obstack *ob2 = pp_buffer (&cpp2)->m_obstack;
263 : : /* Get the stripped version from the temporary printer. */
264 : 6097 : const char *aka = (char *) obstack_base (ob2);
265 : 6097 : int aka_len = obstack_object_size (ob2);
266 : 6097 : int type1_len = obstack_object_size (ob) - len;
267 : :
268 : : /* If they are identical, bail out. */
269 : 6097 : if (aka_len == type1_len && memcmp (p + len, aka, aka_len) == 0)
270 : 181 : return;
271 : :
272 : : /* They're not, print the stripped version now. */
273 : 5916 : if (*quoted)
274 : 5716 : pp_end_quote (cpp, show_color);
275 : 5916 : pp_c_whitespace (cpp);
276 : 5916 : pp_left_brace (cpp);
277 : 5916 : pp_c_ws_string (cpp, _("aka"));
278 : 5916 : pp_c_whitespace (cpp);
279 : 5916 : pp_string (cpp, colorize_stop (show_color));
280 : 5916 : if (*quoted)
281 : 5716 : pp_begin_quote (cpp, show_color);
282 : 5916 : if (highlight_color)
283 : 220 : pp_string (cpp, colorize_start (show_color, highlight_color));
284 : 5916 : cpp->type_id (aka_type);
285 : 5916 : if (*quoted)
286 : 5716 : pp_end_quote (cpp, show_color);
287 : 5916 : pp_right_brace (cpp);
288 : : /* No further closing quotes are needed. */
289 : 5916 : *quoted = false;
290 : 6097 : }
291 : : }
292 : :
293 : : /* Implementation of pp_markup::element_quoted_type::print_type
294 : : for C/ObjC. */
295 : :
296 : : void
297 : 4481 : pp_markup::element_quoted_type::print_type (pp_markup::context &ctxt)
298 : : {
299 : 4481 : auto pp = ctxt.m_pp.clone ();
300 : 4481 : c_pretty_printer *cpp = (c_pretty_printer *)pp.get ();
301 : 4481 : cpp->set_padding (pp_none);
302 : 4481 : ::print_type (cpp, m_type, &ctxt.m_quoted, m_highlight_color);
303 : 4481 : pp_string (&ctxt.m_pp, pp_formatted_text (cpp));
304 : 4481 : }
305 : :
306 : : /* Called during diagnostic message formatting process to print a
307 : : source-level entity onto BUFFER. The meaning of the format specifiers
308 : : is as follows:
309 : : %D: a general decl,
310 : : %E: an identifier or expression,
311 : : %F: a function declaration,
312 : : %T: a type.
313 : : %V: a list of type qualifiers from a tree.
314 : : %v: an explicit list of type qualifiers
315 : : %#v: an explicit list of type qualifiers of a function type.
316 : :
317 : : Please notice when called, the `%' part was already skipped by the
318 : : diagnostic machinery. */
319 : : static bool
320 : 65215 : c_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
321 : : int precision, bool wide, bool set_locus, bool hash,
322 : : bool *quoted, pp_token_list &)
323 : : {
324 : 65215 : tree t = NULL_TREE;
325 : : // FIXME: the next cast should be a dynamic_cast, when it is permitted.
326 : 65215 : c_pretty_printer *cpp = (c_pretty_printer *) pp;
327 : 65215 : pp->set_padding (pp_none);
328 : :
329 : 65215 : if (precision != 0 || wide)
330 : : return false;
331 : :
332 : 65215 : if (*spec != 'v')
333 : : {
334 : 65010 : t = va_arg (*text->m_args_ptr, tree);
335 : 65010 : if (set_locus)
336 : 1516 : text->set_location (0, DECL_SOURCE_LOCATION (t),
337 : : SHOW_RANGE_WITH_CARET);
338 : : }
339 : :
340 : 65215 : switch (*spec)
341 : : {
342 : 14709 : case 'D':
343 : 14709 : if (VAR_P (t) && DECL_HAS_DEBUG_EXPR_P (t))
344 : : {
345 : 40 : t = DECL_DEBUG_EXPR (t);
346 : 40 : if (!DECL_P (t))
347 : : {
348 : 40 : cpp->expression (t);
349 : 40 : return true;
350 : : }
351 : : }
352 : : /* FALLTHRU */
353 : :
354 : 14731 : case 'F':
355 : 14731 : if (DECL_NAME (t))
356 : : {
357 : 14216 : pp_identifier (cpp, lang_hooks.decl_printable_name (t, 2));
358 : 14216 : return true;
359 : : }
360 : 515 : break;
361 : :
362 : 18496 : case 'T':
363 : 18496 : print_type (cpp, t, quoted);
364 : 18496 : return true;
365 : :
366 : 31743 : case 'E':
367 : 31743 : if (TREE_CODE (t) == IDENTIFIER_NODE)
368 : 5356 : pp_identifier (cpp, IDENTIFIER_POINTER (t));
369 : : else
370 : 26387 : cpp->expression (t);
371 : : return true;
372 : :
373 : 0 : case 'V':
374 : 0 : pp_c_type_qualifier_list (cpp, t);
375 : 0 : return true;
376 : :
377 : 205 : case 'v':
378 : 205 : pp_c_cv_qualifiers (cpp, va_arg (*text->m_args_ptr, int), hash);
379 : 205 : return true;
380 : :
381 : : default:
382 : : return false;
383 : : }
384 : :
385 : 515 : pp_string (cpp, _("({anonymous})"));
386 : 515 : return true;
387 : : }
388 : :
389 : : /* C-specific implementation of range_label::get_text () vfunc for
390 : : range_label_for_type_mismatch. */
391 : :
392 : : label_text
393 : 333 : range_label_for_type_mismatch::get_text (unsigned /*range_idx*/) const
394 : : {
395 : 333 : if (m_labelled_type == NULL_TREE)
396 : 0 : return label_text::borrow (NULL);
397 : :
398 : 333 : c_pretty_printer cpp;
399 : 333 : bool quoted = false;
400 : 333 : print_type (&cpp, m_labelled_type, "ed);
401 : 333 : return label_text::take (xstrdup (pp_formatted_text (&cpp)));
402 : 333 : }
403 : :
404 : :
405 : : /* In C and ObjC, all decls have "C" linkage. */
406 : : bool
407 : 14809542 : has_c_linkage (const_tree decl ATTRIBUTE_UNUSED)
408 : : {
409 : 14809542 : return true;
410 : : }
411 : :
412 : : void
413 : 109495 : c_initialize_diagnostics (diagnostic_context *context)
414 : : {
415 : 109495 : context->set_pretty_printer (::make_unique<c_pretty_printer> ());
416 : 109495 : c_common_diagnostics_set_defaults (context);
417 : 109495 : context->set_format_decoder (&c_tree_printer);
418 : 109495 : }
419 : :
420 : : int
421 : 15299444 : c_types_compatible_p (tree x, tree y)
422 : : {
423 : 15299444 : return comptypes (TYPE_MAIN_VARIANT (x), TYPE_MAIN_VARIANT (y));
424 : : }
425 : :
426 : : /* Determine if the type is a variably modified type for the backend. */
427 : :
428 : : bool
429 : 10812952 : c_var_mod_p (tree x, tree fn ATTRIBUTE_UNUSED)
430 : : {
431 : 10812952 : return C_TYPE_VARIABLY_MODIFIED (x);
432 : : }
433 : :
434 : : /* Special routine to get the alias set of T for C. */
435 : :
436 : : alias_set_type
437 : 209657669 : c_get_alias_set (tree t)
438 : : {
439 : 209657669 : return c_common_get_alias_set (t);
440 : : }
441 : :
442 : : /* In C there are no invisible parameters like in C++ (this, in-charge, VTT,
443 : : etc.). */
444 : :
445 : : int
446 : 22575010 : maybe_adjust_arg_pos_for_attribute (const_tree)
447 : : {
448 : 22575010 : return 0;
449 : : }
450 : :
451 : : /* In C, no expression is dependent. */
452 : :
453 : : bool
454 : 35 : instantiation_dependent_expression_p (tree)
455 : : {
456 : 35 : return false;
457 : : }
458 : :
459 : : /* Return -1 if dwarf ATTR shouldn't be added for TYPE, or the attribute
460 : : value otherwise. */
461 : : int
462 : 116353 : c_type_dwarf_attribute (const_tree type, int attr)
463 : : {
464 : 116353 : if (type == NULL_TREE)
465 : : return -1;
466 : :
467 : 116353 : switch (attr)
468 : : {
469 : 5993 : case DW_AT_export_symbols:
470 : 5993 : if (RECORD_OR_UNION_TYPE_P (type) && TYPE_NAME (type) == NULL_TREE)
471 : 5993 : return 1;
472 : : break;
473 : :
474 : : default:
475 : : break;
476 : : }
477 : :
478 : : return -1;
479 : : }
|