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