00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef GCC_C_TREE_H
00027 #define GCC_C_TREE_H
00028
00029 #include "c-common.h"
00030 #include "toplev.h"
00031 #include "diagnostic.h"
00032
00033
00034
00035
00036
00037 #ifdef ARCH_MIPS
00038 #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
00039 (sizeof (struct c_common_identifier) + 3 * sizeof (void *) + 4)
00040 #else
00041 #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
00042 (sizeof (struct c_common_identifier) + 3 * sizeof (void *))
00043 #endif
00044
00045
00046
00047 struct lang_decl GTY(())
00048 {
00049 char dummy;
00050 };
00051
00052
00053 #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE)
00054
00055
00056 #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE)
00057
00058
00059
00060 #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE)
00061
00062
00063
00064 #define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE)
00065
00066
00067
00068
00069 #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID)
00070
00071 struct lang_type GTY(())
00072 {
00073
00074 struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields"))) s;
00075
00076 tree enum_min;
00077 tree enum_max;
00078
00079
00080
00081 tree objc_info;
00082 };
00083
00084
00085
00086 #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE)
00087 #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE)
00088
00089
00090 #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
00091
00092
00093
00094 #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP)
00095
00096
00097 #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
00098
00099
00100
00101 #define C_DECL_DECLARED_BUILTIN(EXP) \
00102 DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP))
00103
00104
00105
00106 #define C_DECL_BUILTIN_PROTOTYPE(EXP) \
00107 DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP))
00108
00109
00110
00111
00112 #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP)
00113
00114
00115
00116
00117
00118 #define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP))
00119
00120
00121
00122 #define C_DECL_UNJUMPABLE_STMT_EXPR(EXP) \
00123 DECL_LANG_FLAG_6 (LABEL_DECL_CHECK (EXP))
00124
00125
00126
00127
00128 #define C_DECL_UNDEFINABLE_STMT_EXPR(EXP) \
00129 DECL_LANG_FLAG_7 (LABEL_DECL_CHECK (EXP))
00130
00131
00132
00133
00134 #define C_DECL_UNJUMPABLE_VM(EXP) \
00135 DECL_LANG_FLAG_3 (LABEL_DECL_CHECK (EXP))
00136
00137
00138
00139
00140 #define C_DECL_UNDEFINABLE_VM(EXP) \
00141 DECL_LANG_FLAG_5 (LABEL_DECL_CHECK (EXP))
00142
00143
00144
00145 #define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL))
00146
00147
00148
00149
00150 #define C_DECL_ISNT_PROTOTYPE(EXP) \
00151 (EXP == 0 \
00152 || (TYPE_ARG_TYPES (TREE_TYPE (EXP)) == 0 \
00153 && !DECL_BUILT_IN (EXP)))
00154
00155
00156
00157
00158 #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE)
00159
00160
00161
00162 struct c_expr
00163 {
00164
00165 tree value;
00166
00167
00168
00169
00170 enum tree_code original_code;
00171 };
00172
00173
00174
00175
00176 enum c_typespec_kind {
00177
00178 ctsk_resword,
00179
00180
00181
00182
00183 ctsk_tagref,
00184
00185
00186 ctsk_tagfirstref,
00187
00188 ctsk_tagdef,
00189
00190 ctsk_typedef,
00191
00192 ctsk_objc,
00193
00194 ctsk_typeof
00195 };
00196
00197
00198
00199 struct c_typespec {
00200
00201 enum c_typespec_kind kind;
00202
00203 tree spec;
00204 };
00205
00206
00207 enum c_storage_class {
00208 csc_none,
00209 csc_auto,
00210 csc_extern,
00211 csc_register,
00212 csc_static,
00213 csc_typedef
00214 };
00215
00216
00217
00218 enum c_typespec_keyword {
00219 cts_none,
00220 cts_void,
00221 cts_bool,
00222 cts_char,
00223 cts_int,
00224 cts_float,
00225 cts_double,
00226 cts_dfloat32,
00227 cts_dfloat64,
00228 cts_dfloat128
00229 };
00230
00231
00232 struct c_declspecs {
00233
00234
00235
00236
00237 tree type;
00238
00239 tree decl_attr;
00240
00241
00242
00243 tree attrs;
00244
00245
00246 enum c_typespec_keyword typespec_word;
00247
00248 enum c_storage_class storage_class;
00249
00250 BOOL_BITFIELD declspecs_seen_p : 1;
00251
00252 BOOL_BITFIELD type_seen_p : 1;
00253
00254
00255
00256
00257
00258
00259 BOOL_BITFIELD non_sc_seen_p : 1;
00260
00261 BOOL_BITFIELD typedef_p : 1;
00262
00263
00264
00265 BOOL_BITFIELD tag_defined_p : 1;
00266
00267
00268 BOOL_BITFIELD explicit_signed_p : 1;
00269
00270 BOOL_BITFIELD deprecated_p : 1;
00271
00272
00273 BOOL_BITFIELD default_int_p;
00274
00275 BOOL_BITFIELD long_p : 1;
00276
00277 BOOL_BITFIELD long_long_p : 1;
00278
00279 BOOL_BITFIELD short_p : 1;
00280
00281 BOOL_BITFIELD signed_p : 1;
00282
00283 BOOL_BITFIELD unsigned_p : 1;
00284
00285 BOOL_BITFIELD complex_p : 1;
00286
00287 BOOL_BITFIELD inline_p : 1;
00288
00289 BOOL_BITFIELD thread_p : 1;
00290
00291 BOOL_BITFIELD const_p : 1;
00292
00293 BOOL_BITFIELD volatile_p : 1;
00294
00295 BOOL_BITFIELD restrict_p : 1;
00296 };
00297
00298
00299 enum c_declarator_kind {
00300
00301 cdk_id,
00302
00303 cdk_function,
00304
00305 cdk_array,
00306
00307 cdk_pointer,
00308
00309 cdk_attrs
00310 };
00311
00312
00313 struct c_arg_info {
00314
00315 tree parms;
00316
00317 tree tags;
00318
00319 tree types;
00320
00321
00322 tree others;
00323
00324
00325
00326
00327 tree pending_sizes;
00328
00329 BOOL_BITFIELD had_vla_unspec : 1;
00330 };
00331
00332
00333 struct c_declarator {
00334
00335 enum c_declarator_kind kind;
00336
00337 struct c_declarator *declarator;
00338 location_t id_loc;
00339 union {
00340
00341
00342 tree id;
00343
00344 struct c_arg_info *arg_info;
00345
00346 struct {
00347
00348 tree dimen;
00349
00350 int quals;
00351
00352 tree attrs;
00353
00354 BOOL_BITFIELD static_p : 1;
00355
00356 BOOL_BITFIELD vla_unspec_p : 1;
00357 } array;
00358
00359 int pointer_quals;
00360
00361 tree attrs;
00362 } u;
00363 };
00364
00365
00366 struct c_type_name {
00367
00368 struct c_declspecs *specs;
00369
00370 struct c_declarator *declarator;
00371 };
00372
00373
00374 struct c_parm {
00375
00376 struct c_declspecs *specs;
00377
00378 tree attrs;
00379
00380 struct c_declarator *declarator;
00381 };
00382
00383
00384
00385
00386
00387 struct language_function GTY(())
00388 {
00389 struct c_language_function base;
00390 tree x_break_label;
00391 tree x_cont_label;
00392 struct c_switch * GTY((skip)) x_switch_stack;
00393 struct c_arg_info * GTY((skip)) arg_info;
00394 int returns_value;
00395 int returns_null;
00396 int returns_abnormally;
00397 int warn_about_return_type;
00398 int extern_inline;
00399 };
00400
00401
00402
00403
00404 struct c_label_list
00405 {
00406
00407 tree label;
00408
00409 struct c_label_list *next;
00410 };
00411
00412
00413
00414 struct c_label_context_se
00415 {
00416
00417 struct c_label_list *labels_def;
00418
00419 struct c_label_list *labels_used;
00420
00421 struct c_label_context_se *next;
00422 };
00423
00424
00425
00426 struct c_label_context_vm
00427 {
00428
00429 struct c_label_list *labels_def;
00430
00431 struct c_label_list *labels_used;
00432
00433
00434
00435 unsigned scope;
00436
00437 struct c_label_context_vm *next;
00438 };
00439
00440
00441
00442 extern void c_parse_init (void);
00443
00444
00445 extern void gen_aux_info_record (tree, int, int, int);
00446
00447
00448 extern struct obstack parser_obstack;
00449 extern tree c_break_label;
00450 extern tree c_cont_label;
00451
00452 extern int global_bindings_p (void);
00453 extern void push_scope (void);
00454 extern tree pop_scope (void);
00455 extern void insert_block (tree);
00456 extern void c_expand_body (tree);
00457
00458 extern void c_init_decl_processing (void);
00459 extern void c_dup_lang_specific_decl (tree);
00460 extern void c_print_identifier (FILE *, tree, int);
00461 extern int quals_from_declspecs (const struct c_declspecs *);
00462 extern struct c_declarator *build_array_declarator (tree, struct c_declspecs *,
00463 bool, bool);
00464 extern tree build_enumerator (tree, tree);
00465 extern tree check_for_loop_decls (void);
00466 extern void mark_forward_parm_decls (void);
00467 extern void declare_parm_level (void);
00468 extern void undeclared_variable (tree, location_t);
00469 extern tree declare_label (tree);
00470 extern tree define_label (location_t, tree);
00471 extern void c_maybe_initialize_eh (void);
00472 extern void finish_decl (tree, tree, tree);
00473 extern tree finish_enum (tree, tree, tree);
00474 extern void finish_function (void);
00475 extern tree finish_struct (tree, tree, tree);
00476 extern struct c_arg_info *get_parm_info (bool);
00477 extern tree grokfield (struct c_declarator *, struct c_declspecs *, tree);
00478 extern tree groktypename (struct c_type_name *);
00479 extern tree grokparm (const struct c_parm *);
00480 extern tree implicitly_declare (tree);
00481 extern void keep_next_level (void);
00482 extern void pending_xref_error (void);
00483 extern void c_push_function_context (struct function *);
00484 extern void c_pop_function_context (struct function *);
00485 extern void push_parm_decl (const struct c_parm *);
00486 extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
00487 struct c_declarator *,
00488 bool);
00489 extern tree builtin_function (const char *, tree, int, enum built_in_class,
00490 const char *, tree);
00491 extern void shadow_tag (const struct c_declspecs *);
00492 extern void shadow_tag_warned (const struct c_declspecs *, int);
00493 extern tree start_enum (tree);
00494 extern int start_function (struct c_declspecs *, struct c_declarator *, tree);
00495 extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
00496 tree);
00497 extern tree start_struct (enum tree_code, tree);
00498 extern void store_parm_decls (void);
00499 extern void store_parm_decls_from (struct c_arg_info *);
00500 extern tree xref_tag (enum tree_code, tree);
00501 extern struct c_typespec parser_xref_tag (enum tree_code, tree);
00502 extern int c_expand_decl (tree);
00503 extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
00504 struct c_declarator *);
00505 extern struct c_declarator *build_attrs_declarator (tree,
00506 struct c_declarator *);
00507 extern struct c_declarator *build_function_declarator (struct c_arg_info *,
00508 struct c_declarator *);
00509 extern struct c_declarator *build_id_declarator (tree);
00510 extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
00511 struct c_declarator *);
00512 extern struct c_declspecs *build_null_declspecs (void);
00513 extern struct c_declspecs *declspecs_add_qual (struct c_declspecs *, tree);
00514 extern struct c_declspecs *declspecs_add_type (struct c_declspecs *,
00515 struct c_typespec);
00516 extern struct c_declspecs *declspecs_add_scspec (struct c_declspecs *, tree);
00517 extern struct c_declspecs *declspecs_add_attrs (struct c_declspecs *, tree);
00518 extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
00519
00520
00521 extern int c_disregard_inline_limits (tree);
00522 extern int c_cannot_inline_tree_fn (tree *);
00523 extern bool c_objc_common_init (void);
00524 extern bool c_missing_noreturn_ok_p (tree);
00525 extern tree c_objc_common_truthvalue_conversion (tree expr);
00526 extern bool c_warn_unused_global_decl (tree);
00527 extern void c_initialize_diagnostics (diagnostic_context *);
00528 extern bool c_vla_unspec_p (tree x, tree fn);
00529
00530 #define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \
00531 c_build_qualified_type ((TYPE), \
00532 ((CONST_P) ? TYPE_QUAL_CONST : 0) | \
00533 ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
00534
00535
00536 extern int in_alignof;
00537 extern int in_sizeof;
00538 extern int in_typeof;
00539
00540 extern struct c_switch *c_switch_stack;
00541 extern struct c_label_context_se *label_context_stack_se;
00542 extern struct c_label_context_vm *label_context_stack_vm;
00543
00544 extern tree require_complete_type (tree);
00545 extern int same_translation_unit_p (tree, tree);
00546 extern int comptypes (tree, tree);
00547 extern bool c_vla_type_p (tree);
00548 extern bool c_mark_addressable (tree);
00549 extern void c_incomplete_type_error (tree, tree);
00550 extern tree c_type_promotes_to (tree);
00551 extern struct c_expr default_function_array_conversion (struct c_expr);
00552 extern tree composite_type (tree, tree);
00553 extern tree build_component_ref (tree, tree);
00554 extern tree build_array_ref (tree, tree);
00555 extern tree build_external_ref (tree, int, location_t);
00556 extern void pop_maybe_used (bool);
00557 extern struct c_expr c_expr_sizeof_expr (struct c_expr);
00558 extern struct c_expr c_expr_sizeof_type (struct c_type_name *);
00559 extern struct c_expr parser_build_unary_op (enum tree_code, struct c_expr);
00560 extern struct c_expr parser_build_binary_op (enum tree_code, struct c_expr,
00561 struct c_expr);
00562 extern tree build_conditional_expr (tree, tree, tree);
00563 extern tree build_compound_expr (tree, tree);
00564 extern tree c_cast_expr (struct c_type_name *, tree);
00565 extern tree build_c_cast (tree, tree);
00566 extern void store_init_value (tree, tree);
00567 extern void error_init (const char *);
00568 extern void pedwarn_init (const char *);
00569 extern void maybe_warn_string_init (tree, struct c_expr);
00570 extern void start_init (tree, tree, int);
00571 extern void finish_init (void);
00572 extern void really_start_incremental_init (tree);
00573 extern void push_init_level (int);
00574 extern struct c_expr pop_init_level (int);
00575 extern void set_init_index (tree, tree);
00576 extern void set_init_label (tree);
00577 extern void process_init_element (struct c_expr);
00578 extern tree build_compound_literal (tree, tree);
00579 extern tree c_start_case (tree);
00580 extern void c_finish_case (tree);
00581 extern tree build_asm_expr (tree, tree, tree, tree, bool);
00582 extern tree build_asm_stmt (tree, tree);
00583 extern tree c_convert_parm_for_inlining (tree, tree, tree, int);
00584 extern int c_types_compatible_p (tree, tree);
00585 extern tree c_begin_compound_stmt (bool);
00586 extern tree c_end_compound_stmt (tree, bool);
00587 extern void c_finish_if_stmt (location_t, tree, tree, tree, bool);
00588 extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool);
00589 extern tree c_begin_stmt_expr (void);
00590 extern tree c_finish_stmt_expr (tree);
00591 extern tree c_process_expr_stmt (tree);
00592 extern tree c_finish_expr_stmt (tree);
00593 extern tree c_finish_return (tree);
00594 extern tree c_finish_bc_stmt (tree *, bool);
00595 extern tree c_finish_goto_label (tree);
00596 extern tree c_finish_goto_ptr (tree);
00597 extern void c_begin_vm_scope (unsigned int);
00598 extern void c_end_vm_scope (unsigned int);
00599 extern tree c_expr_to_decl (tree, bool *, bool *, bool *);
00600 extern tree c_begin_omp_parallel (void);
00601 extern tree c_finish_omp_parallel (tree, tree);
00602 extern tree c_finish_omp_clauses (tree);
00603
00604
00605
00606
00607 extern int current_function_returns_value;
00608
00609
00610
00611
00612 extern int current_function_returns_null;
00613
00614
00615
00616
00617 extern int current_function_returns_abnormally;
00618
00619
00620
00621 extern int system_header_p;
00622
00623
00624
00625
00626 extern bool c_override_global_bindings_to_false;
00627
00628
00629 extern bool c_eh_initialized_p;
00630
00631
00632 extern void c_finish_incomplete_decl (tree);
00633 extern void c_write_global_declarations (void);
00634
00635
00636
00637
00638 #if GCC_VERSION >= 4001
00639 #define ATTRIBUTE_GCC_CDIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m ,n))) ATTRIBUTE_NONNULL(m)
00640 #else
00641 #define ATTRIBUTE_GCC_CDIAG(m, n) ATTRIBUTE_NONNULL(m)
00642 #endif
00643
00644 extern void pedwarn_c90 (const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2);
00645 extern void pedwarn_c99 (const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2);
00646
00647 #endif