Home | History | Annotate | Line # | Download | only in d
      1 /* d-tree.h -- Definitions and declarations for code generation.
      2    Copyright (C) 2006-2022 Free Software Foundation, Inc.
      3 
      4 GCC is free software; you can redistribute it and/or modify
      5 it under the terms of the GNU General Public License as published by
      6 the Free Software Foundation; either version 3, or (at your option)
      7 any later version.
      8 
      9 GCC is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 GNU General Public License for more details.
     13 
     14 You should have received a copy of the GNU General Public License
     15 along with GCC; see the file COPYING3.  If not see
     16 <http://www.gnu.org/licenses/>.  */
     17 
     18 #ifndef GCC_D_TREE_H
     19 #define GCC_D_TREE_H
     20 
     21 /* Forward type declarations to avoid including unnecessary headers.  */
     22 
     23 class Dsymbol;
     24 class Declaration;
     25 class AggregateDeclaration;
     26 class ClassDeclaration;
     27 class EnumDeclaration;
     28 class FuncDeclaration;
     29 class StructDeclaration;
     30 class TypeInfoDeclaration;
     31 class VarDeclaration;
     32 class Expression;
     33 class ClassReferenceExp;
     34 class IndexExp;
     35 class SliceExp;
     36 class Module;
     37 class Statement;
     38 class Type;
     39 class TypeFunction;
     40 class Parameter;
     41 struct BaseClass;
     42 struct Scope;
     43 struct Loc;
     44 
     45 template <typename TYPE> struct Array;
     46 typedef Array <Expression *> Expressions;
     47 
     48 /* Usage of TREE_LANG_FLAG_?:
     49    0: METHOD_CALL_EXPR
     50 
     51    Usage of TYPE_LANG_FLAG_?:
     52    0: TYPE_SHARED
     53    1: TYPE_IMAGINARY_FLOAT (in REAL_TYPE).
     54       ANON_AGGR_TYPE_P (in RECORD_TYPE, UNION_TYPE).
     55    2: CLASS_TYPE_P (in RECORD_TYPE).
     56    3: TYPE_DYNAMIC_ARRAY (in RECORD_TYPE).
     57    4: TYPE_DELEGATE (in RECORD_TYPE).
     58    5: TYPE_ASSOCIATIVE_ARRAY (in RECORD_TYPE).
     59 
     60    Usage of DECL_LANG_FLAG_?:
     61    0: LABEL_VARIABLE_CASE (in LABEL_DECL).
     62       DECL_BUILT_IN_CTFE (in FUNCTION_DECL).
     63    1: DECL_IN_UNITTEST_CONDITION_P (in FUNCTION_DECL).
     64    2: DECL_INSTANTIATED (in FUNCTION_DECL, VAR_DECL).  */
     65 
     66 /* Language-specific tree checkers.  */
     67 
     68 #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
     69   TREE_CHECK2 (NODE, VAR_DECL, FUNCTION_DECL)
     70 
     71 /* The kinds of scopes we recognize.  */
     72 
     73 enum level_kind
     74 {
     75   level_block,		/* An ordinary block scope.  */
     76   level_try,		/* A try-block.  */
     77   level_catch,		/* A catch-block.  */
     78   level_finally,	/* A finally-block.  */
     79   level_cond,		/* The scope for an if condition.  */
     80   level_switch,		/* The scope for a switch statement.  */
     81   level_loop,		/* A for, do-while, or unrolled-loop block.  */
     82   level_with,		/* The scope for a with statement.  */
     83   level_function	/* The block representing an entire function.  */
     84 };
     85 
     86 /* List of codes for internally recognised compiler intrinsics.  */
     87 
     88 enum intrinsic_code
     89 {
     90 #define DEF_D_INTRINSIC(CODE, B, N, M, D, C) CODE,
     91 
     92 #include "intrinsics.def"
     93 
     94 #undef DEF_D_INTRINSIC
     95   INTRINSIC_LAST
     96 };
     97 
     98 /* For use with break and continue statements.  */
     99 
    100 enum bc_kind
    101 {
    102   bc_break    = 0,
    103   bc_continue = 1
    104 };
    105 
    106 /* The datatype used to implement D scope.  It is needed primarily to support
    107    the back-end, but also helps debugging information for local variables.  */
    108 
    109 struct GTY((chain_next ("%h.level_chain"))) binding_level
    110 {
    111   /* A chain of declarations for all variables, constants and functions.
    112      These are in the reverse of the order supplied.  */
    113   tree names;
    114 
    115   /* For each level (except the global one), a chain of BLOCK nodes for
    116      all the levels that were entered and exited one level down.  */
    117   tree blocks;
    118 
    119   /* The binding level this one is contained in.  */
    120   binding_level *level_chain;
    121 
    122   /* The kind of scope this object represents.  */
    123   ENUM_BITFIELD (level_kind) kind : 4;
    124 };
    125 
    126 /* The binding level currently in effect.  */
    127 extern GTY(()) binding_level *current_binding_level;
    128 extern GTY(()) binding_level *global_binding_level;
    129 
    130 /* Used only for jumps to as-yet undefined labels, since jumps to
    131    defined labels can have their validity checked immediately.  */
    132 
    133 struct GTY((chain_next ("%h.next"))) d_label_use_entry
    134 {
    135   d_label_use_entry *next;
    136 
    137   /* The frontend Statement associated with the jump.  */
    138   Statement * GTY((skip)) statement;
    139 
    140   /* The binding level to which this entry is *currently* attached.
    141      This is initially the binding level in which the goto appeared,
    142      but is modified as scopes are closed.  */
    143   binding_level *level;
    144 };
    145 
    146 /* A list of all LABEL_DECLs in the function that have names.  Here so
    147    we can clear out their names' definitions at the end of the
    148    function, and so we can check the validity of jumps to these labels.  */
    149 
    150 struct GTY(()) d_label_entry
    151 {
    152   /* The label decl itself.  */
    153   tree label;
    154 
    155   /* The frontend Statement associated with the label.  */
    156   Statement * GTY((skip)) statement;
    157 
    158   /* The binding level to which the label is *currently* attached.
    159      This is initially set to the binding level in which the label
    160      is defined, but is modified as scopes are closed.  */
    161   binding_level *level;
    162 
    163   /* A list of forward references of the label.  */
    164   d_label_use_entry *fwdrefs;
    165 
    166   /* The following bits are set after the label is defined, and are
    167      updated as scopes are popped.  They indicate that a backward jump
    168      to the label will illegally enter a scope of the given flavor.  */
    169   bool in_try_scope;
    170   bool in_catch_scope;
    171 
    172   /* If set, the label we reference represents a break/continue pair.  */
    173   bool bc_label;
    174 };
    175 
    176 /* Frame information for a function declaration.  */
    177 
    178 struct GTY(()) tree_frame_info
    179 {
    180   struct tree_common common;
    181   tree frame_type;
    182 };
    183 
    184 /* True if the function creates a nested frame.  */
    185 #define FRAMEINFO_CREATES_FRAME(NODE) \
    186   (TREE_LANG_FLAG_0 (FUNCFRAME_INFO_CHECK (NODE)))
    187 
    188 /* True if the function has a static chain passed in its DECL_ARGUMENTS.  */
    189 #define FRAMEINFO_STATIC_CHAIN(NODE) \
    190   (TREE_LANG_FLAG_1 (FUNCFRAME_INFO_CHECK (NODE)))
    191 
    192 /* True if the function frame is a closure (initialized on the heap).  */
    193 #define FRAMEINFO_IS_CLOSURE(NODE) \
    194   (TREE_LANG_FLAG_2 (FUNCFRAME_INFO_CHECK (NODE)))
    195 
    196 #define FRAMEINFO_TYPE(NODE) \
    197   (((tree_frame_info *) FUNCFRAME_INFO_CHECK (NODE))->frame_type)
    198 
    199 /* Language-dependent contents of an identifier.  */
    200 
    201 struct GTY(()) lang_identifier
    202 {
    203   struct tree_identifier common;
    204 
    205   /* The identifier as the user sees it.  */
    206   tree pretty_ident;
    207 
    208   /* The back-end tree associated with this identifier.  */
    209   tree decl_tree;
    210 
    211   /* The frontend Declaration associated with this identifier.  */
    212   Declaration * GTY((skip)) dsymbol;
    213   AggregateDeclaration * GTY((skip)) daggregate;
    214 };
    215 
    216 #define IDENTIFIER_LANG_SPECIFIC(NODE) \
    217   ((struct lang_identifier *) IDENTIFIER_NODE_CHECK (NODE))
    218 
    219 #define IDENTIFIER_PRETTY_NAME(NODE) \
    220   (IDENTIFIER_LANG_SPECIFIC (NODE)->pretty_ident)
    221 
    222 #define IDENTIFIER_DECL_TREE(NODE) \
    223   (IDENTIFIER_LANG_SPECIFIC (NODE)->decl_tree)
    224 
    225 #define IDENTIFIER_DSYMBOL(NODE) \
    226   (IDENTIFIER_LANG_SPECIFIC (NODE)->dsymbol)
    227 
    228 #define IDENTIFIER_DAGGREGATE(NODE) \
    229   (IDENTIFIER_LANG_SPECIFIC (NODE)->daggregate)
    230 
    231 /* Global state pertinent to the current function.  */
    232 
    233 struct GTY(()) language_function
    234 {
    235   /* Our function and enclosing module.  */
    236   FuncDeclaration * GTY((skip)) function;
    237   Module * GTY((skip)) module;
    238 
    239   /* Static chain of function, for D2, this is a closure.  */
    240   tree static_chain;
    241 
    242   /* Stack of statement lists being collected while we are
    243      compiling the function.  */
    244   vec <tree, va_gc> *stmt_list;
    245 
    246   /* Variables that are in scope that will need destruction later.  */
    247   vec <tree, va_gc> *vars_in_scope;
    248 
    249   /* Table of all used or defined labels in the function.  */
    250   hash_map <Statement *, d_label_entry> *labels;
    251 };
    252 
    253 /* The D front end types have not been integrated into the GCC garbage
    254    collection system.  Handle this by using the "skip" attribute.  */
    255 
    256 struct GTY(()) lang_decl
    257 {
    258   Declaration * GTY((skip)) decl;
    259 
    260   /* FIELD_DECL in frame struct that this variable is allocated in.  */
    261   tree frame_field;
    262 
    263   /* RESULT_DECL in a function that returns by nrvo.  */
    264   tree named_result;
    265 
    266   /* Chain of DECL_LANG_THUNKS in a function.  */
    267   tree thunks;
    268 
    269   /* In a FUNCTION_DECL, this is the THUNK_LANG_OFFSET.  */
    270   int offset;
    271 
    272   /* In a FUNCTION_DECL, if this is an intrinsic, the code for it.  */
    273   enum intrinsic_code intrinsic;
    274 
    275   /* FUNCFRAME_INFO in a function that has non-local references.  */
    276   tree frame_info;
    277 };
    278 
    279 /* The current D per-function global variables.  */
    280 
    281 #define d_function_chain (cfun ? cfun->language : NULL)
    282 
    283 /* The D frontend Declaration AST for GCC decl NODE.  */
    284 #define DECL_LANG_FRONTEND(NODE) \
    285   (DECL_LANG_SPECIFIC (NODE) \
    286    ? DECL_LANG_SPECIFIC (NODE)->decl : NULL)
    287 
    288 #define SET_DECL_LANG_FRAME_FIELD(NODE, VAL) \
    289   DECL_LANG_SPECIFIC (NODE)->frame_field = VAL
    290 
    291 #define DECL_LANG_FRAME_FIELD(NODE) \
    292   (DECL_P (NODE) \
    293    ? DECL_LANG_SPECIFIC (NODE)->frame_field : NULL)
    294 
    295 #define SET_DECL_LANG_NRVO(NODE, VAL) \
    296   DECL_LANG_SPECIFIC (NODE)->named_result = VAL
    297 
    298 #define DECL_LANG_NRVO(NODE) \
    299   (DECL_P (NODE) \
    300    ? DECL_LANG_SPECIFIC (NODE)->named_result : NULL)
    301 
    302 #define DECL_LANG_THUNKS(NODE) \
    303   DECL_LANG_SPECIFIC (NODE)->thunks
    304 
    305 #define THUNK_LANG_OFFSET(NODE) \
    306   DECL_LANG_SPECIFIC (NODE)->offset
    307 
    308 #define DECL_INTRINSIC_CODE(NODE) \
    309   DECL_LANG_SPECIFIC (NODE)->intrinsic
    310 
    311 #define DECL_LANG_FRAMEINFO(NODE) \
    312   DECL_LANG_SPECIFIC (NODE)->frame_info
    313 
    314 /* The lang_type field is not set for every GCC type.  */
    315 
    316 struct GTY(()) lang_type
    317 {
    318   Type * GTY((skip)) type;
    319 };
    320 
    321 /* The D frontend Type AST for GCC type NODE.  */
    322 #define TYPE_LANG_FRONTEND(NODE) \
    323   (TYPE_LANG_SPECIFIC (NODE) \
    324    ? TYPE_LANG_SPECIFIC (NODE)->type : NULL)
    325 
    326 
    327 enum d_tree_node_structure_enum
    328 {
    329   TS_D_GENERIC,
    330   TS_D_IDENTIFIER,
    331   TS_D_FRAMEINFO,
    332   LAST_TS_D_ENUM
    333 };
    334 
    335 /* The resulting tree type.  */
    336 
    337 union GTY((desc ("d_tree_node_structure (&%h)"),
    338 	   chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON)"
    339 		       " ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
    340 lang_tree_node
    341 {
    342   union tree_node GTY ((tag ("TS_D_GENERIC"),
    343 			desc ("tree_node_structure (&%h)"))) generic;
    344   lang_identifier GTY ((tag ("TS_D_IDENTIFIER"))) identifier;
    345   tree_frame_info GTY ((tag ("TS_D_FRAMEINFO"))) frameinfo;
    346 };
    347 
    348 /* True if the Tdelegate typed expression is not really a variable,
    349    but a literal function / method reference.  */
    350 #define METHOD_CALL_EXPR(NODE) \
    351   (TREE_LANG_FLAG_0 (NODE))
    352 
    353 /* True if the type was declared 'shared'.  */
    354 #define TYPE_SHARED(NODE) \
    355   (TYPE_LANG_FLAG_0 (NODE))
    356 
    357 /* True if the type is an imaginary float type.  */
    358 #define TYPE_IMAGINARY_FLOAT(NODE) \
    359   (TYPE_LANG_FLAG_1 (REAL_TYPE_CHECK (NODE)))
    360 
    361 /* True if the type is an anonymous record or union.  */
    362 #define ANON_AGGR_TYPE_P(NODE) \
    363   (TYPE_LANG_FLAG_1 (RECORD_OR_UNION_CHECK (NODE)))
    364 
    365 /* True if the type is the underlying record for a class.  */
    366 #define CLASS_TYPE_P(NODE) \
    367   (TYPE_LANG_FLAG_2 (RECORD_TYPE_CHECK (NODE)))
    368 
    369 /* True if the type is a D dynamic array.  */
    370 #define TYPE_DYNAMIC_ARRAY(NODE) \
    371   (TYPE_LANG_FLAG_3 (RECORD_TYPE_CHECK (NODE)))
    372 
    373 /* True if the type is a D delegate.  */
    374 #define TYPE_DELEGATE(NODE) \
    375   (TYPE_LANG_FLAG_4 (RECORD_TYPE_CHECK (NODE)))
    376 
    377 /* True if the type is a D associative array.  */
    378 #define TYPE_ASSOCIATIVE_ARRAY(NODE) \
    379   (TYPE_LANG_FLAG_5 (RECORD_TYPE_CHECK (NODE)))
    380 
    381 /* True if the decl is a variable case label decl.  */
    382 #define LABEL_VARIABLE_CASE(NODE) \
    383   (DECL_LANG_FLAG_0 (LABEL_DECL_CHECK (NODE)))
    384 
    385 /* True if the decl is a CTFE built-in.  */
    386 #define DECL_BUILT_IN_CTFE(NODE) \
    387   (DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE)))
    388 
    389 /* True if the decl is only compiled in when unittests are turned on.  */
    390 #define DECL_IN_UNITTEST_CONDITION_P(NODE) \
    391   (DECL_LANG_FLAG_1 (FUNCTION_DECL_CHECK (NODE)))
    392 
    393 /* True if the decl comes from a template instance.  */
    394 #define DECL_INSTANTIATED(NODE) \
    395   (DECL_LANG_FLAG_2 (VAR_OR_FUNCTION_DECL_CHECK (NODE)))
    396 
    397 enum d_tree_index
    398 {
    399   DTI_VTABLE_ENTRY_TYPE,
    400   DTI_VTBL_PTR_TYPE,
    401   DTI_VTBL_INTERFACE_TYPE,
    402 
    403   DTI_BOOL_TYPE,
    404   DTI_CHAR_TYPE,
    405   DTI_WCHAR_TYPE,
    406   DTI_DCHAR_TYPE,
    407 
    408   DTI_BYTE_TYPE,
    409   DTI_UBYTE_TYPE,
    410   DTI_SHORT_TYPE,
    411   DTI_USHORT_TYPE,
    412   DTI_INT_TYPE,
    413   DTI_UINT_TYPE,
    414   DTI_LONG_TYPE,
    415   DTI_ULONG_TYPE,
    416   DTI_CENT_TYPE,
    417   DTI_UCENT_TYPE,
    418 
    419   DTI_IFLOAT_TYPE,
    420   DTI_IDOUBLE_TYPE,
    421   DTI_IREAL_TYPE,
    422 
    423   DTI_UNKNOWN_TYPE,
    424 
    425   DTI_ARRAY_TYPE,
    426   DTI_NULL_ARRAY,
    427   DTI_BOTTOM_TYPE,
    428 
    429   DTI_BOOL_FALSE,
    430   DTI_BOOL_TRUE,
    431 
    432   DTI_MAX
    433 };
    434 
    435 extern GTY(()) tree d_global_trees[DTI_MAX];
    436 
    437 #define vtable_entry_type		d_global_trees[DTI_VTABLE_ENTRY_TYPE]
    438 #define vtbl_ptr_type_node		d_global_trees[DTI_VTBL_PTR_TYPE]
    439 #define vtbl_interface_type_node	d_global_trees[DTI_VTBL_INTERFACE_TYPE]
    440 /* D built-in language types.  */
    441 #define d_bool_type			d_global_trees[DTI_BOOL_TYPE]
    442 #define d_byte_type			d_global_trees[DTI_BYTE_TYPE]
    443 #define d_ubyte_type			d_global_trees[DTI_UBYTE_TYPE]
    444 #define d_short_type			d_global_trees[DTI_SHORT_TYPE]
    445 #define d_ushort_type			d_global_trees[DTI_USHORT_TYPE]
    446 #define d_int_type			d_global_trees[DTI_INT_TYPE]
    447 #define d_uint_type			d_global_trees[DTI_UINT_TYPE]
    448 #define d_long_type			d_global_trees[DTI_LONG_TYPE]
    449 #define d_ulong_type			d_global_trees[DTI_ULONG_TYPE]
    450 #define d_cent_type			d_global_trees[DTI_CENT_TYPE]
    451 #define d_ucent_type			d_global_trees[DTI_UCENT_TYPE]
    452 /* Imaginary floating-point types.  */
    453 #define ifloat_type_node		d_global_trees[DTI_IFLOAT_TYPE]
    454 #define idouble_type_node		d_global_trees[DTI_IDOUBLE_TYPE]
    455 #define ireal_type_node			d_global_trees[DTI_IREAL_TYPE]
    456 /* UTF-8, 16 and 32 types.  */
    457 #define char8_type_node			d_global_trees[DTI_CHAR_TYPE]
    458 #define char16_type_node		d_global_trees[DTI_DCHAR_TYPE]
    459 #define char32_type_node		d_global_trees[DTI_WCHAR_TYPE]
    460 /* Empty record type used as placeholder when real type is unknown.  */
    461 #define unknown_type_node		d_global_trees[DTI_UNKNOWN_TYPE]
    462 /* Generic dynamic array type void[].  */
    463 #define array_type_node			d_global_trees[DTI_ARRAY_TYPE]
    464 /* Null initializer for dynamic arrays.  */
    465 #define null_array_node			d_global_trees[DTI_NULL_ARRAY]
    466 /* The bottom type, referred to as `noreturn` in code.  */
    467 #define noreturn_type_node		d_global_trees[DTI_BOTTOM_TYPE]
    468 /* D boolean values are always byte-sized, unlike boolean_type_node.  */
    469 #define d_bool_false_node		d_global_trees[DTI_BOOL_FALSE]
    470 #define d_bool_true_node		d_global_trees[DTI_BOOL_TRUE]
    471 
    472 /* A prefix for internal variables, which are not user-visible.  */
    473 #if !defined (NO_DOT_IN_LABEL)
    474 # define GDC_PREFIX(x) "gdc." x
    475 #elif !defined (NO_DOLLAR_IN_LABEL)
    476 # define GDC_PREFIX(x) "gdc$" x
    477 #else
    478 # define GDC_PREFIX(x) "gdc_" x
    479 #endif
    480 
    481 /* Internally recognised D runtime library functions.  */
    482 
    483 enum libcall_fn
    484 {
    485 #define DEF_D_RUNTIME(CODE, N, T, P, F) LIBCALL_ ## CODE,
    486 
    487 #include "runtime.def"
    488 
    489 #undef DEF_D_RUNTIME
    490   LIBCALL_LAST
    491 };
    492 
    493 /* Gate for when the D frontend makes an early call into the codegen pass, such
    494    as when it requires target information or CTFE evaluation.  As full semantic
    495    may not be completed, we only want to build the superficial tree structure
    496    without finishing any decls or types.  */
    497 extern bool doing_semantic_analysis_p;
    498 
    499 /* In d-attribs.c.  */
    500 extern tree insert_type_attribute (tree, const char *, tree = NULL_TREE);
    501 extern tree insert_decl_attribute (tree, const char *, tree = NULL_TREE);
    502 extern void apply_user_attributes (Dsymbol *, tree);
    503 
    504 /* In d-builtins.cc.  */
    505 extern const attribute_spec d_langhook_attribute_table[];
    506 extern const attribute_spec d_langhook_common_attribute_table[];
    507 extern Type *build_frontend_type (tree);
    508 
    509 extern tree d_builtin_function (tree);
    510 extern tree d_builtin_function_ext_scope (tree);
    511 extern void d_init_builtins (void);
    512 extern void d_register_builtin_type (tree, const char *);
    513 extern void d_build_builtins_module (Module *);
    514 extern void d_maybe_set_builtin (Module *);
    515 extern Expression *d_eval_constant_expression (const Loc &, tree);
    516 extern void d_init_versions (void);
    517 
    518 /* In d-codegen.cc.  */
    519 extern location_t make_location_t (const Loc &);
    520 extern tree d_decl_context (Dsymbol *);
    521 extern tree copy_aggregate_type (tree);
    522 extern bool declaration_reference_p (Declaration *);
    523 extern tree declaration_type (Declaration *);
    524 extern bool parameter_reference_p (Parameter *);
    525 extern tree parameter_type (Parameter *);
    526 extern tree build_integer_cst (dinteger_t, tree = d_int_type);
    527 extern tree build_float_cst (const real_t &, Type *);
    528 extern tree d_array_length (tree);
    529 extern tree d_array_ptr (tree);
    530 extern tree d_array_value (tree, tree, tree);
    531 extern tree get_array_length (tree, Type *);
    532 extern tree build_class_binfo (tree, ClassDeclaration *);
    533 extern tree build_interface_binfo (tree, ClassDeclaration *, unsigned &);
    534 extern tree delegate_method (tree);
    535 extern tree delegate_object (tree);
    536 extern tree build_delegate_cst (tree, tree, Type *);
    537 extern tree build_method_call (tree, tree, Type *);
    538 extern void extract_from_method_call (tree, tree &, tree &);
    539 extern tree build_typeof_null_value (Type *);
    540 extern tree build_vindex_ref (tree, tree, size_t);
    541 extern tree d_save_expr (tree);
    542 extern tree stabilize_expr (tree *);
    543 extern tree build_target_expr (tree, tree);
    544 extern tree force_target_expr (tree);
    545 extern tree build_address (tree);
    546 extern tree d_mark_addressable (tree);
    547 extern tree d_mark_used (tree);
    548 extern tree d_mark_read (tree);
    549 extern tree build_memcmp_call (tree, tree, tree);
    550 extern tree build_memcpy_call (tree, tree, tree);
    551 extern tree build_memset_call (tree, tree = NULL_TREE);
    552 extern bool identity_compare_p (StructDeclaration *);
    553 extern tree build_float_identity (tree_code, tree, tree);
    554 extern tree build_struct_comparison (tree_code, StructDeclaration *,
    555 				     tree, tree);
    556 extern tree build_array_struct_comparison (tree_code, StructDeclaration *,
    557 					   tree, tree, tree);
    558 extern tree build_struct_literal (tree, vec <constructor_elt, va_gc> *);
    559 extern tree component_ref (tree, tree);
    560 extern tree build_assign (tree_code, tree, tree);
    561 extern tree modify_expr (tree, tree);
    562 extern tree build_nop (tree, tree);
    563 extern tree build_vconvert (tree, tree);
    564 extern tree build_boolop (tree_code, tree, tree);
    565 extern tree build_condition (tree, tree, tree, tree);
    566 extern tree build_vcondition (tree, tree, tree);
    567 extern tree compound_expr (tree, tree);
    568 extern tree return_expr (tree);
    569 extern tree size_mult_expr (tree, tree);
    570 extern tree real_part (tree);
    571 extern tree imaginary_part (tree);
    572 extern tree complex_expr (tree, tree, tree);
    573 extern tree underlying_complex_expr (tree, tree);
    574 extern tree indirect_ref (tree, tree);
    575 extern tree build_deref (tree);
    576 extern tree build_array_index (tree, tree);
    577 extern tree build_offset_op (tree_code, tree, tree);
    578 extern tree build_offset (tree, tree);
    579 extern tree build_memref (tree, tree, tree);
    580 extern tree build_array_set (tree, tree, tree);
    581 extern tree build_array_from_val (Type *, tree);
    582 extern tree build_array_from_exprs (Type *, Expressions *, bool);
    583 extern tree void_okay_p (tree);
    584 extern tree build_assert_call (const Loc &, libcall_fn, tree = NULL_TREE);
    585 extern tree build_array_bounds_call (const Loc &);
    586 extern tree build_bounds_index_condition (IndexExp *, tree, tree);
    587 extern tree build_bounds_slice_condition (SliceExp *, tree, tree, tree);
    588 extern bool array_bounds_check (void);
    589 extern bool checkaction_trap_p (void);
    590 extern TypeFunction *get_function_type (Type *);
    591 extern bool call_by_alias_p (FuncDeclaration *, FuncDeclaration *);
    592 extern tree d_build_call_expr (FuncDeclaration *, tree, Expressions *);
    593 extern tree d_build_call (TypeFunction *, tree, tree, Expressions *);
    594 extern tree build_float_modulus (tree, tree, tree);
    595 extern tree build_vthis_function (tree, tree);
    596 extern tree error_no_frame_access (Dsymbol *);
    597 extern tree get_frame_for_symbol (Dsymbol *);
    598 extern tree build_vthis (AggregateDeclaration *);
    599 extern void build_closure (FuncDeclaration *);
    600 extern tree get_frameinfo (FuncDeclaration *);
    601 extern tree get_framedecl (FuncDeclaration *, FuncDeclaration *);
    602 
    603 /* In d-convert.cc.  */
    604 extern bool decl_with_nonnull_addr_p (const_tree);
    605 extern tree d_truthvalue_conversion (tree);
    606 extern tree d_convert (tree, tree);
    607 extern tree convert_expr (tree, Type *, Type *);
    608 extern tree convert_for_rvalue (tree, Type *, Type *);
    609 extern tree convert_for_assignment (Expression *, Type *, bool = false);
    610 extern tree convert_for_argument (Expression *, Parameter *);
    611 extern tree convert_for_condition (tree, Type *);
    612 extern tree d_array_convert (Expression *);
    613 extern tree d_array_convert (Type *, Expression *);
    614 
    615 /* In d-gimplify.cc.  */
    616 extern int d_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
    617 
    618 /* In d-incpath.cc.  */
    619 extern void add_import_paths (const char *, const char *, bool);
    620 
    621 /* In d-lang.cc.  */
    622 extern void d_add_builtin_module (Module *);
    623 extern d_tree_node_structure_enum d_tree_node_structure (lang_tree_node *);
    624 extern struct lang_type *build_lang_type (Type *);
    625 extern struct lang_decl *build_lang_decl (Declaration *);
    626 extern tree d_pushdecl (tree);
    627 extern void d_keep (tree);
    628 
    629 /* In decl.cc.  */
    630 extern const char *d_mangle_decl (Dsymbol *);
    631 extern tree mangle_internal_decl (Dsymbol *, const char *, const char *);
    632 extern void build_decl_tree (Dsymbol *);
    633 extern tree get_symbol_decl (Declaration *);
    634 extern tree declare_extern_var (tree, tree);
    635 extern void declare_local_var (VarDeclaration *);
    636 extern tree build_local_temp (tree);
    637 extern tree get_decl_tree (Declaration *);
    638 extern void d_finish_decl (tree);
    639 extern tree make_thunk (FuncDeclaration *, int);
    640 extern tree start_function (FuncDeclaration *);
    641 extern void finish_function (tree);
    642 extern tree get_vtable_decl (ClassDeclaration *);
    643 extern tree build_new_class_expr (ClassReferenceExp *);
    644 extern tree aggregate_initializer_decl (AggregateDeclaration *);
    645 extern tree layout_struct_initializer (StructDeclaration *);
    646 extern tree layout_class_initializer (ClassDeclaration *);
    647 extern tree enum_initializer_decl (EnumDeclaration *);
    648 extern tree build_artificial_decl (tree, tree, const char * = NULL);
    649 extern tree create_field_decl (tree, const char *, int, int);
    650 extern void build_type_decl (tree, Dsymbol *);
    651 extern void set_linkage_for_decl (tree);
    652 
    653 /* In expr.cc.  */
    654 extern tree build_expr (Expression *, bool = false, bool = false);
    655 extern tree build_expr_dtor (Expression *);
    656 extern tree build_return_dtor (Expression *, Type *, TypeFunction *);
    657 
    658 /* In imports.cc.  */
    659 extern tree build_import_decl (Dsymbol *);
    660 
    661 /* In intrinsics.cc.  */
    662 extern void maybe_set_intrinsic (FuncDeclaration *);
    663 extern tree maybe_expand_intrinsic (tree);
    664 
    665 /* In modules.cc.  */
    666 extern void build_module_tree (Module *);
    667 extern tree d_module_context (void);
    668 extern void register_module_decl (Declaration *);
    669 extern void d_defer_declaration (Declaration *);
    670 extern void d_finish_compilation (tree *, int);
    671 
    672 /* In runtime.cc.  */
    673 extern tree build_libcall (libcall_fn, Type *, int ...);
    674 
    675 /* In typeinfo.cc.  */
    676 extern bool have_typeinfo_p (ClassDeclaration *);
    677 extern tree layout_typeinfo (TypeInfoDeclaration *);
    678 extern tree layout_classinfo (ClassDeclaration *);
    679 extern unsigned base_vtable_offset (ClassDeclaration *, BaseClass *);
    680 extern tree get_typeinfo_decl (TypeInfoDeclaration *);
    681 extern tree get_classinfo_decl (ClassDeclaration *);
    682 extern void check_typeinfo_type (const Loc &, Scope *, Expression * = NULL);
    683 extern tree build_typeinfo (const Loc &, Type *, Expression * = NULL);
    684 extern tree build_typeinfo (Expression *, Type *);
    685 extern void create_typeinfo (Type *, Module *);
    686 extern void create_tinfo_types (Module *);
    687 extern void layout_cpp_typeinfo (ClassDeclaration *);
    688 extern tree get_cpp_typeinfo_decl (ClassDeclaration *);
    689 extern bool speculative_type_p (Type *);
    690 
    691 /* In toir.cc.  */
    692 extern void push_binding_level (level_kind);
    693 extern tree pop_binding_level (void);
    694 extern void push_stmt_list (void);
    695 extern tree pop_stmt_list (void);
    696 extern void add_stmt (tree);
    697 extern void build_function_body (FuncDeclaration *);
    698 
    699 /* In types.cc.  */
    700 extern tree d_unsigned_type (tree);
    701 extern tree d_signed_type (tree);
    702 extern bool valist_array_p (Type *);
    703 extern bool empty_aggregate_p (tree);
    704 extern bool same_type_p (Type *, Type *);
    705 extern Type *get_object_type (void);
    706 extern tree make_array_type (Type *, unsigned HOST_WIDE_INT);
    707 extern tree make_struct_type (const char *, int n, ...);
    708 extern tree insert_type_modifiers (tree, unsigned);
    709 extern void insert_aggregate_field (tree, tree, size_t);
    710 extern void finish_aggregate_type (unsigned, unsigned, tree);
    711 extern tree build_ctype (Type *);
    712 
    713 #endif  /* GCC_D_TREE_H  */
    714