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