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