Merge from the pain train
[official-gcc.git] / gcc / treelang / treetree.c
blobaea6e0ba5cbc6838671c3d02a63d8bca4ed0a685
1 /* TREELANG Compiler interface to GCC's middle end (treetree.c)
2 Called by the parser.
4 If you want a working example of how to write a front end to GCC,
5 you are in the right place.
7 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
8 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
10 This code is based on toy.c written by Richard Kenner.
12 It was later modified by Jonathan Bartlett whose changes have all
13 been removed (by Tim Josling).
15 Various bits and pieces were cloned from the GCC main tree, as
16 GCC evolved, for COBOLForGCC, by Tim Josling.
18 It was adapted to TREELANG by Tim Josling 2001.
20 Updated to function-at-a-time by James A. Morrison, 2004.
22 -----------------------------------------------------------------------
24 This program is free software; you can redistribute it and/or modify it
25 under the terms of the GNU General Public License as published by the
26 Free Software Foundation; either version 2, or (at your option) any
27 later version.
29 This program is distributed in the hope that it will be useful,
30 but WITHOUT ANY WARRANTY; without even the implied warranty of
31 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 GNU General Public License for more details.
34 You should have received a copy of the GNU General Public License
35 along with this program; if not, write to the Free Software
36 Foundation, 59 Temple Place - Suite 330,
37 Boston, MA 02111-1307, USA.
39 In other words, you are welcome to use, share and improve this program.
40 You are forbidden to forbid anyone else to use, share and improve
41 what you give them. Help stamp out software-hoarding!
43 ----------------------------------------------------------------------- */
45 /* Assumption: garbage collection is never called implicitly. It will
46 not be called 'at any time' when short of memory. It will only be
47 called explicitly at the end of each function. This removes the
48 need for a *lot* of bother to ensure everything is in the mark trees
49 at all times. */
51 /* Note, it is OK to use GCC extensions such as long long in a compiler front
52 end. This is because the GCC front ends are built using GCC. */
54 /* GCC headers. */
56 #include "config.h"
57 #include "system.h"
58 #include "coretypes.h"
59 #include "tm.h"
60 #include "tree.h"
61 #include "tree-dump.h"
62 #include "tree-iterator.h"
63 #include "tree-gimple.h"
64 #include "function.h"
65 #include "flags.h"
66 #include "output.h"
67 #include "ggc.h"
68 #include "toplev.h"
69 #include "varray.h"
70 #include "langhooks-def.h"
71 #include "langhooks.h"
72 #include "target.h"
74 #include "cgraph.h"
76 #include "treelang.h"
77 #include "treetree.h"
78 #include "opts.h"
80 extern int option_main;
81 extern char **file_names;
83 /* Types expected by gcc's garbage collector.
84 These types exist to allow language front-ends to
85 add extra information in gcc's parse tree data structure.
86 But the treelang front end doesn't use them -- it has
87 its own parse tree data structure.
88 We define them here only to satisfy gcc's garbage collector. */
90 /* Language-specific identifier information. */
92 struct lang_identifier GTY(())
94 struct tree_identifier common;
97 /* Language-specific tree node information. */
99 union lang_tree_node
100 GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE")))
102 union tree_node GTY ((tag ("0"),
103 desc ("tree_node_structure (&%h)")))
104 generic;
105 struct lang_identifier GTY ((tag ("1"))) identifier;
108 /* Language-specific type information. */
110 struct lang_type GTY(())
112 char junk; /* dummy field to ensure struct is not empty */
115 /* Language-specific declaration information. */
117 struct lang_decl GTY(())
119 char junk; /* dummy field to ensure struct is not empty */
122 struct language_function GTY(())
124 char junk; /* dummy field to ensure struct is not empty */
127 static tree tree_lang_truthvalue_conversion (tree expr);
128 static bool tree_mark_addressable (tree exp);
129 static tree tree_lang_type_for_size (unsigned precision, int unsignedp);
130 static tree tree_lang_type_for_mode (enum machine_mode mode, int unsignedp);
131 static tree tree_lang_unsigned_type (tree type_node);
132 static tree tree_lang_signed_type (tree type_node);
133 static tree tree_lang_signed_or_unsigned_type (int unsignedp, tree type);
135 /* Functions to keep track of the current scope. */
136 static void pushlevel (int ignore);
137 static tree poplevel (int keep, int reverse, int functionbody);
138 static tree pushdecl (tree decl);
139 static tree* getstmtlist (void);
141 /* Langhooks. */
142 static tree builtin_function (const char *name, tree type, int function_code,
143 enum built_in_class class, const char *library_name,
144 tree attrs);
145 static tree getdecls (void);
146 static int global_bindings_p (void);
147 static void insert_block (tree);
149 static void tree_push_type_decl (tree id, tree type_node);
150 static void treelang_expand_function (tree fndecl);
152 /* The front end language hooks (addresses of code for this front
153 end). These are not really very language-dependent, i.e.
154 treelang, C, Mercury, etc. can all use almost the same definitions. */
156 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
157 #define LANG_HOOKS_TRUTHVALUE_CONVERSION tree_lang_truthvalue_conversion
158 #undef LANG_HOOKS_MARK_ADDRESSABLE
159 #define LANG_HOOKS_MARK_ADDRESSABLE tree_mark_addressable
160 #undef LANG_HOOKS_SIGNED_TYPE
161 #define LANG_HOOKS_SIGNED_TYPE tree_lang_signed_type
162 #undef LANG_HOOKS_UNSIGNED_TYPE
163 #define LANG_HOOKS_UNSIGNED_TYPE tree_lang_unsigned_type
164 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
165 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE tree_lang_signed_or_unsigned_type
166 #undef LANG_HOOKS_TYPE_FOR_MODE
167 #define LANG_HOOKS_TYPE_FOR_MODE tree_lang_type_for_mode
168 #undef LANG_HOOKS_TYPE_FOR_SIZE
169 #define LANG_HOOKS_TYPE_FOR_SIZE tree_lang_type_for_size
170 #undef LANG_HOOKS_PARSE_FILE
171 #define LANG_HOOKS_PARSE_FILE treelang_parse_file
173 #undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION
174 #define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION treelang_expand_function
176 /* #undef LANG_HOOKS_TYPES_COMPATIBLE_P
177 #define LANG_HOOKS_TYPES_COMPATIBLE_P hook_bool_tree_tree_true
179 /* Hook routines and data unique to treelang. */
181 #undef LANG_HOOKS_INIT
182 #define LANG_HOOKS_INIT treelang_init
183 #undef LANG_HOOKS_NAME
184 #define LANG_HOOKS_NAME "GNU treelang"
185 #undef LANG_HOOKS_FINISH
186 #define LANG_HOOKS_FINISH treelang_finish
187 #undef LANG_HOOKS_INIT_OPTIONS
188 #define LANG_HOOKS_INIT_OPTIONS treelang_init_options
189 #undef LANG_HOOKS_HANDLE_OPTION
190 #define LANG_HOOKS_HANDLE_OPTION treelang_handle_option
191 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
193 /* Tree code type/name/code tables. */
195 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
197 const enum tree_code_class tree_code_type[] = {
198 #include "tree.def"
199 tcc_exceptional
201 #undef DEFTREECODE
203 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
205 const unsigned char tree_code_length[] = {
206 #include "tree.def"
209 #undef DEFTREECODE
211 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
213 const char *const tree_code_name[] = {
214 #include "tree.def"
215 "@@dummy"
217 #undef DEFTREECODE
219 /* Number of bits in int and char - accessed by front end. */
221 unsigned int tree_code_int_size = SIZEOF_INT * HOST_BITS_PER_CHAR;
223 unsigned int tree_code_char_size = HOST_BITS_PER_CHAR;
225 /* Return the tree stuff for this type TYPE_NUM. */
227 tree
228 tree_code_get_type (int type_num)
230 switch (type_num)
232 case SIGNED_CHAR:
233 return signed_char_type_node;
235 case UNSIGNED_CHAR:
236 return unsigned_char_type_node;
238 case SIGNED_INT:
239 return integer_type_node;
241 case UNSIGNED_INT:
242 return unsigned_type_node;
244 case VOID_TYPE:
245 return void_type_node;
247 default:
248 gcc_unreachable ();
252 /* Output the code for the start of an if statement. The test
253 expression is EXP (true if not zero), and the stmt occurred at line
254 LINENO in file FILENAME. */
256 void
257 tree_code_if_start (tree exp, location_t loc)
259 tree cond_exp, cond;
260 cond_exp = fold (build2 (NE_EXPR, boolean_type_node, exp,
261 fold (build1 (CONVERT_EXPR, TREE_TYPE (exp),
262 integer_zero_node))));
263 SET_EXPR_LOCATION (cond_exp, loc);
264 cond = build3 (COND_EXPR, void_type_node, cond_exp, NULL_TREE,
265 NULL_TREE);
266 SET_EXPR_LOCATION (cond, loc);
267 append_to_statement_list_force (cond, getstmtlist ());
268 pushlevel (0);
271 /* Output the code for the else of an if statement. The else occurred
272 at line LINENO in file FILENAME. */
274 void
275 tree_code_if_else (location_t loc ATTRIBUTE_UNUSED)
277 tree stmts = *getstmtlist ();
278 tree block = poplevel (1, 0, 0);
279 if (BLOCK_VARS (block))
281 tree bindexpr = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (block),
282 stmts, block);
283 stmts = alloc_stmt_list ();
284 append_to_statement_list (bindexpr, &stmts);
287 TREE_OPERAND (STATEMENT_LIST_TAIL (*getstmtlist ())->stmt, 1) = stmts;
288 pushlevel (0);
291 /* Output the code for the end_if an if statement. The end_if (final brace)
292 occurred at line LINENO in file FILENAME. */
294 void
295 tree_code_if_end (location_t loc ATTRIBUTE_UNUSED)
297 tree stmts = *getstmtlist ();
298 tree block = poplevel (1, 0, 0);
299 if (BLOCK_VARS (block))
301 tree bindexpr = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (block),
302 stmts, block);
303 stmts = alloc_stmt_list ();
304 append_to_statement_list (bindexpr, &stmts);
307 TREE_OPERAND (STATEMENT_LIST_TAIL (*getstmtlist ())->stmt, 2) = stmts;
310 /* Create a function. The prototype name is NAME, storage class is
311 STORAGE_CLASS, type of return variable is RET_TYPE, parameter lists
312 is PARMS, returns decl for this function. */
314 tree
315 tree_code_create_function_prototype (unsigned char* chars,
316 unsigned int storage_class,
317 unsigned int ret_type,
318 struct prod_token_parm_item* parms,
319 location_t loc)
322 tree id;
323 struct prod_token_parm_item* parm;
324 tree type_list = NULL_TREE;
325 tree type_node;
326 tree fn_type;
327 tree fn_decl;
328 tree parm_list = NULL_TREE;
330 /* Build the type. */
331 id = get_identifier ((const char*)chars);
332 for (parm = parms; parm; parm = parm->tp.par.next)
334 gcc_assert (parm->category == parameter_category);
335 type_node = tree_code_get_type (parm->type);
336 type_list = tree_cons (NULL_TREE, type_node, type_list);
338 /* Last parm if void indicates fixed length list (as opposed to
339 printf style va_* list). */
340 type_list = tree_cons (NULL_TREE, void_type_node, type_list);
342 /* The back end needs them in reverse order. */
343 type_list = nreverse (type_list);
345 type_node = tree_code_get_type (ret_type);
346 fn_type = build_function_type (type_node, type_list);
348 id = get_identifier ((const char*)chars);
349 fn_decl = build_decl (FUNCTION_DECL, id, fn_type);
351 /* Nested functions not supported here. */
352 DECL_CONTEXT (fn_decl) = NULL_TREE;
353 DECL_SOURCE_LOCATION (fn_decl) = loc;
355 TREE_PUBLIC (fn_decl) = 0;
356 DECL_EXTERNAL (fn_decl) = 0;
357 TREE_STATIC (fn_decl) = 0;
358 switch (storage_class)
360 case STATIC_STORAGE:
361 break;
363 case EXTERNAL_DEFINITION_STORAGE:
364 TREE_PUBLIC (fn_decl) = 1;
365 break;
367 case EXTERNAL_REFERENCE_STORAGE:
368 DECL_EXTERNAL (fn_decl) = 1;
369 break;
371 case AUTOMATIC_STORAGE:
372 default:
373 gcc_unreachable ();
376 /* Make the argument variable decls. */
377 for (parm = parms; parm; parm = parm->tp.par.next)
379 tree parm_decl = build_decl (PARM_DECL, get_identifier
380 ((const char*) (parm->tp.par.variable_name)),
381 tree_code_get_type (parm->type));
383 /* Some languages have different nominal and real types. */
384 DECL_ARG_TYPE (parm_decl) = TREE_TYPE (parm_decl);
385 gcc_assert (DECL_ARG_TYPE (parm_decl));
386 gcc_assert (fn_decl);
387 DECL_CONTEXT (parm_decl) = fn_decl;
388 DECL_SOURCE_LOCATION (parm_decl) = loc;
389 parm_list = chainon (parm_decl, parm_list);
392 /* Back into reverse order as the back end likes them. */
393 parm_list = nreverse (parm_list);
395 DECL_ARGUMENTS (fn_decl) = parm_list;
397 /* Save the decls for use when the args are referred to. */
398 for (parm = parms; parm_list;
399 parm_list = TREE_CHAIN (parm_list),
400 parm = parm->tp.par.next)
402 gcc_assert (parm); /* Too few. */
403 *parm->tp.par.where_to_put_var_tree = parm_list;
405 gcc_assert (!parm); /* Too many. */
407 /* Process declaration of function defined elsewhere. */
408 rest_of_decl_compilation (fn_decl, 1, 0);
410 return fn_decl;
414 /* Output code for start of function; the decl of the function is in
415 PREV_SAVED (as created by tree_code_create_function_prototype),
416 the function is at line number LINENO in file FILENAME. The
417 parameter details are in the lists PARMS. Returns nothing. */
419 void
420 tree_code_create_function_initial (tree prev_saved,
421 location_t loc)
423 tree fn_decl;
424 tree resultdecl;
426 fn_decl = prev_saved;
427 gcc_assert (fn_decl);
429 /* Output message if not -quiet. */
430 announce_function (fn_decl);
432 /* This has something to do with forcing output also. */
433 pushdecl (fn_decl);
435 /* Set current function for error msgs etc. */
436 current_function_decl = fn_decl;
437 DECL_INITIAL (fn_decl) = error_mark_node;
439 DECL_SOURCE_LOCATION (fn_decl) = loc;
441 /* Create a DECL for the functions result. */
442 resultdecl =
443 build_decl (RESULT_DECL, NULL_TREE, TREE_TYPE (TREE_TYPE (fn_decl)));
444 DECL_CONTEXT (resultdecl) = fn_decl;
445 DECL_ARTIFICIAL (resultdecl) = 1;
446 DECL_IGNORED_P (resultdecl) = 1;
447 DECL_SOURCE_LOCATION (resultdecl) = loc;
448 DECL_RESULT (fn_decl) = resultdecl;
450 /* Create a new level at the start of the function. */
452 pushlevel (0);
454 TREE_STATIC (fn_decl) = 1;
457 /* Wrapup a function contained in file FILENAME, ending at line LINENO. */
458 void
459 tree_code_create_function_wrapup (location_t loc)
461 tree block;
462 tree fn_decl;
463 tree stmts = *getstmtlist ();
465 fn_decl = current_function_decl;
467 /* Pop the level. */
469 block = poplevel (1, 0, 1);
471 /* And attach it to the function. */
473 DECL_SAVED_TREE (fn_decl) = build3 (BIND_EXPR, void_type_node,
474 BLOCK_VARS (block),
475 stmts, block);
477 allocate_struct_function (fn_decl);
478 cfun->function_end_locus = loc;
480 /* Dump the original tree to a file. */
481 dump_function (TDI_original, fn_decl);
483 /* Convert current function to GIMPLE for the middle end. */
484 gimplify_function_tree (fn_decl);
485 dump_function (TDI_generic, fn_decl);
487 /* We are not inside of any scope now. */
488 current_function_decl = NULL_TREE;
489 cfun = NULL;
491 /* Pass the current function off to the middle end. */
492 (void)cgraph_node (fn_decl);
493 cgraph_finalize_function (fn_decl, false);
496 /* Create a variable.
498 The storage class is STORAGE_CLASS (eg LOCAL).
499 The name is CHARS/LENGTH.
500 The type is EXPRESSION_TYPE (eg UNSIGNED_TYPE).
501 The init tree is INIT. */
503 tree
504 tree_code_create_variable (unsigned int storage_class,
505 unsigned char* chars,
506 unsigned int length,
507 unsigned int expression_type,
508 tree init,
509 location_t loc)
511 tree var_type;
512 tree var_id;
513 tree var_decl;
515 /* 1. Build the type. */
516 var_type = tree_code_get_type (expression_type);
518 /* 2. Build the name. */
519 gcc_assert (chars[length] == 0); /* Should be null terminated. */
521 var_id = get_identifier ((const char*)chars);
523 /* 3. Build the decl and set up init. */
524 var_decl = build_decl (VAR_DECL, var_id, var_type);
526 /* 3a. Initialization. */
527 if (init)
528 DECL_INITIAL (var_decl) = fold (build1 (CONVERT_EXPR, var_type, init));
529 else
530 DECL_INITIAL (var_decl) = NULL_TREE;
532 gcc_assert (TYPE_SIZE (var_type) != 0); /* Did not calculate size. */
534 DECL_CONTEXT (var_decl) = current_function_decl;
536 DECL_SOURCE_LOCATION (var_decl) = loc;
538 DECL_EXTERNAL (var_decl) = 0;
539 TREE_PUBLIC (var_decl) = 0;
540 TREE_STATIC (var_decl) = 0;
541 /* Set the storage mode and whether only visible in the same file. */
542 switch (storage_class)
544 case STATIC_STORAGE:
545 TREE_STATIC (var_decl) = 1;
546 break;
548 case AUTOMATIC_STORAGE:
549 break;
551 case EXTERNAL_DEFINITION_STORAGE:
552 TREE_PUBLIC (var_decl) = 1;
553 break;
555 case EXTERNAL_REFERENCE_STORAGE:
556 DECL_EXTERNAL (var_decl) = 1;
557 break;
559 default:
560 gcc_unreachable ();
563 TYPE_NAME (TREE_TYPE (var_decl)) = TYPE_NAME (var_type);
564 return pushdecl (copy_node (var_decl));
568 /* Generate code for return statement. Type is in TYPE, expression
569 is in EXP if present. */
571 void
572 tree_code_generate_return (tree type, tree exp)
574 tree setret;
575 #ifdef ENABLE_CHECKING
576 tree param;
578 for (param = DECL_ARGUMENTS (current_function_decl);
579 param;
580 param = TREE_CHAIN (param))
581 gcc_assert (DECL_CONTEXT (param) == current_function_decl);
582 #endif
584 if (exp && TREE_TYPE (TREE_TYPE (current_function_decl)) != void_type_node)
586 setret = fold (build2 (MODIFY_EXPR, type,
587 DECL_RESULT (current_function_decl),
588 fold (build1 (CONVERT_EXPR, type, exp))));
589 TREE_SIDE_EFFECTS (setret) = 1;
590 TREE_USED (setret) = 1;
591 setret = build1 (RETURN_EXPR, type, setret);
592 /* Use EXPR_LOCUS so we don't lose any information about the file we
593 are compiling. */
594 SET_EXPR_LOCUS (setret, EXPR_LOCUS (exp));
596 else
597 setret = build1 (RETURN_EXPR, type, NULL_TREE);
599 append_to_statement_list_force (setret, getstmtlist ());
603 /* Output the code for this expression statement CODE. */
605 void
606 tree_code_output_expression_statement (tree code, location_t loc)
608 /* Output the line number information. */
609 SET_EXPR_LOCATION (code, loc);
610 TREE_USED (code) = 1;
611 TREE_SIDE_EFFECTS (code) = 1;
612 /* put CODE into the code list. */
613 append_to_statement_list_force (code, getstmtlist ());
616 /* Return a tree for a constant integer value in the token TOK. No
617 size checking is done. */
619 tree
620 tree_code_get_integer_value (unsigned char* chars, unsigned int length)
622 long long int val = 0;
623 unsigned int ix;
624 unsigned int start = 0;
625 int negative = 1;
626 switch (chars[0])
628 case (unsigned char)'-':
629 negative = -1;
630 start = 1;
631 break;
633 case (unsigned char)'+':
634 start = 1;
635 break;
637 default:
638 break;
640 for (ix = start; ix < length; ix++)
641 val = val * 10 + chars[ix] - (unsigned char)'0';
642 val = val*negative;
643 return build_int_cst_wide (start == 1 ?
644 integer_type_node : unsigned_type_node,
645 val & 0xffffffff, (val >> 32) & 0xffffffff);
648 /* Return the tree for an expresssion, type EXP_TYPE (see treetree.h)
649 with tree type TYPE and with operands1 OP1, OP2 (maybe), OP3 (maybe). */
650 tree
651 tree_code_get_expression (unsigned int exp_type,
652 tree type, tree op1, tree op2,
653 tree op3 ATTRIBUTE_UNUSED,
654 location_t loc)
656 tree ret1;
657 int operator;
659 switch (exp_type)
661 case EXP_ASSIGN:
662 gcc_assert (op1 && op2);
663 operator = MODIFY_EXPR;
664 ret1 = fold (build2 (operator, void_type_node, op1,
665 fold (build1 (CONVERT_EXPR, TREE_TYPE (op1),
666 op2))));
668 break;
670 case EXP_PLUS:
671 operator = PLUS_EXPR;
672 goto binary_expression;
674 case EXP_MINUS:
675 operator = MINUS_EXPR;
676 goto binary_expression;
678 case EXP_EQUALS:
679 operator = EQ_EXPR;
680 goto binary_expression;
682 /* Expand a binary expression. Ensure the operands are the right type. */
683 binary_expression:
684 gcc_assert (op1 && op2);
685 ret1 = fold (build2 (operator, type,
686 fold (build1 (CONVERT_EXPR, type, op1)),
687 fold (build1 (CONVERT_EXPR, type, op2))));
688 break;
690 /* Reference to a variable. This is dead easy, just return the
691 decl for the variable. If the TYPE is different than the
692 variable type, convert it. However, to keep accurate location
693 information we wrap it in a NOP_EXPR is is easily stripped. */
694 case EXP_REFERENCE:
695 gcc_assert (op1);
696 TREE_USED (op1) = 1;
697 if (type == TREE_TYPE (op1))
698 ret1 = build1 (NOP_EXPR, type, op1);
699 else
700 ret1 = fold (build1 (CONVERT_EXPR, type, op1));
701 break;
703 case EXP_FUNCTION_INVOCATION:
704 gcc_assert (op1);
706 tree fun_ptr;
707 TREE_USED (op1) = 1;
708 fun_ptr = fold (build1 (ADDR_EXPR,
709 build_pointer_type (TREE_TYPE (op1)), op1));
710 ret1 = build3 (CALL_EXPR, type, fun_ptr, nreverse (op2), NULL_TREE);
712 break;
714 default:
715 gcc_unreachable ();
718 /* Declarations already have a location and constants can be shared so they
719 shouldn't a location set on them. */
720 if (! DECL_P (ret1) && ! TREE_CONSTANT (ret1))
721 SET_EXPR_LOCATION (ret1, loc);
722 return ret1;
725 /* Init parameter list and return empty list. */
727 tree
728 tree_code_init_parameters (void)
730 return NULL_TREE;
733 /* Add a parameter EXP whose expression type is EXP_PROTO to list
734 LIST, returning the new list. */
736 tree
737 tree_code_add_parameter (tree list, tree proto_exp, tree exp)
739 tree new_exp;
740 new_exp = tree_cons (NULL_TREE,
741 fold (build1 (CONVERT_EXPR, TREE_TYPE (proto_exp),
742 exp)), NULL_TREE);
743 if (!list)
744 return new_exp;
745 return chainon (new_exp, list);
748 /* Get a stringpool entry for a string S of length L. This is needed
749 because the GTY routines don't mark strings, forcing you to put
750 them into stringpool, which is never freed. */
752 const char*
753 get_string (const char *s, size_t l)
755 tree t;
756 t = get_identifier_with_length (s, l);
757 return IDENTIFIER_POINTER(t);
760 /* Save typing debug_tree all the time. Dump a tree T pretty and
761 concise. */
763 void dt (tree t);
765 void
766 dt (tree t)
768 debug_tree (t);
771 /* Routines Expected by gcc: */
773 /* These are used to build types for various sizes. The code below
774 is a simplified version of that of GNAT. */
776 #ifndef MAX_BITS_PER_WORD
777 #define MAX_BITS_PER_WORD BITS_PER_WORD
778 #endif
780 /* This variable keeps a table for types for each precision so that we only
781 allocate each of them once. Signed and unsigned types are kept separate. */
782 static GTY(()) tree signed_and_unsigned_types[MAX_BITS_PER_WORD + 1][2];
784 /* XXX is this definition OK? */
785 static tree
786 tree_lang_truthvalue_conversion (tree expr)
788 return expr;
791 /* Mark EXP saying that we need to be able to take the
792 address of it; it should not be allocated in a register.
793 Value is 1 if successful.
795 This implementation was copied from c-decl.c. */
797 static bool
798 tree_mark_addressable (tree exp)
800 register tree x = exp;
801 while (1)
802 switch (TREE_CODE (x))
804 case COMPONENT_REF:
805 case ADDR_EXPR:
806 case ARRAY_REF:
807 case REALPART_EXPR:
808 case IMAGPART_EXPR:
809 x = TREE_OPERAND (x, 0);
810 break;
812 case CONSTRUCTOR:
813 TREE_ADDRESSABLE (x) = 1;
814 return 1;
816 case VAR_DECL:
817 case CONST_DECL:
818 case PARM_DECL:
819 case RESULT_DECL:
820 if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
821 && DECL_NONLOCAL (x))
823 if (TREE_PUBLIC (x))
825 error ("Global register variable %qD used in nested function.",
827 return 0;
829 pedwarn ("Register variable %qD used in nested function.", x);
831 else if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x))
833 if (TREE_PUBLIC (x))
835 error ("Address of global register variable %qD requested.",
837 return 0;
840 pedwarn ("Address of register variable %qD requested.", x);
843 /* drops in */
844 case FUNCTION_DECL:
845 TREE_ADDRESSABLE (x) = 1;
847 default:
848 return 1;
852 /* Return an integer type with the number of bits of precision given by
853 PRECISION. UNSIGNEDP is nonzero if the type is unsigned; otherwise
854 it is a signed type. */
856 static tree
857 tree_lang_type_for_size (unsigned precision, int unsignedp)
859 tree t;
861 if (precision <= MAX_BITS_PER_WORD
862 && signed_and_unsigned_types[precision][unsignedp] != 0)
863 return signed_and_unsigned_types[precision][unsignedp];
865 if (unsignedp)
866 t = signed_and_unsigned_types[precision][1]
867 = make_unsigned_type (precision);
868 else
869 t = signed_and_unsigned_types[precision][0]
870 = make_signed_type (precision);
872 return t;
875 /* Return a data type that has machine mode MODE. UNSIGNEDP selects
876 an unsigned type; otherwise a signed type is returned. */
878 static tree
879 tree_lang_type_for_mode (enum machine_mode mode, int unsignedp)
881 if (SCALAR_INT_MODE_P (mode))
882 return tree_lang_type_for_size (GET_MODE_BITSIZE (mode), unsignedp);
883 else
884 return NULL_TREE;
887 /* Return the unsigned version of a TYPE_NODE, a scalar type. */
889 static tree
890 tree_lang_unsigned_type (tree type_node)
892 return tree_lang_type_for_size (TYPE_PRECISION (type_node), 1);
895 /* Return the signed version of a TYPE_NODE, a scalar type. */
897 static tree
898 tree_lang_signed_type (tree type_node)
900 return tree_lang_type_for_size (TYPE_PRECISION (type_node), 0);
903 /* Return a type the same as TYPE except unsigned or signed according to
904 UNSIGNEDP. */
906 static tree
907 tree_lang_signed_or_unsigned_type (int unsignedp, tree type)
909 if (! INTEGRAL_TYPE_P (type) || TYPE_UNSIGNED (type) == unsignedp)
910 return type;
911 else
912 return tree_lang_type_for_size (TYPE_PRECISION (type), unsignedp);
915 /* These functions and variables deal with binding contours. We only
916 need these functions for the list of PARM_DECLs, but we leave the
917 functions more general; these are a simplified version of the
918 functions from GNAT. */
920 /* For each binding contour we allocate a binding_level structure which records
921 the entities defined or declared in that contour. Contours include:
923 the global one
924 one for each subprogram definition
925 one for each compound statement (declare block)
927 Binding contours are used to create GCC tree BLOCK nodes. */
929 struct binding_level
931 /* A chain of ..._DECL nodes for all variables, constants, functions,
932 parameters and type declarations. These ..._DECL nodes are chained
933 through the TREE_CHAIN field. Note that these ..._DECL nodes are stored
934 in the reverse of the order supplied to be compatible with the
935 back-end. */
936 tree names;
937 /* For each level (except the global one), a chain of BLOCK nodes for all
938 the levels that were entered and exited one level down from this one. */
939 tree blocks;
941 tree stmts;
942 /* The binding level containing this one (the enclosing binding level). */
943 struct binding_level *level_chain;
946 /* The binding level currently in effect. */
947 static struct binding_level *current_binding_level = NULL;
949 /* The outermost binding level. This binding level is created when the
950 compiler is started and it will exist through the entire compilation. */
951 static struct binding_level *global_binding_level;
953 /* Binding level structures are initialized by copying this one. */
954 static struct binding_level clear_binding_level = {NULL, NULL, NULL, NULL };
956 /* Return non-zero if we are currently in the global binding level. */
958 static int
959 global_bindings_p (void)
961 return current_binding_level == global_binding_level ? -1 : 0;
965 /* Return the list of declarations in the current level. Note that this list
966 is in reverse order (it has to be so for back-end compatibility). */
968 static tree
969 getdecls (void)
971 return current_binding_level->names;
974 /* Return a STATMENT_LIST for the current block. */
976 static tree*
977 getstmtlist (void)
979 return &current_binding_level->stmts;
982 /* Enter a new binding level. The input parameter is ignored, but has to be
983 specified for back-end compatibility. */
985 static void
986 pushlevel (int ignore ATTRIBUTE_UNUSED)
988 struct binding_level *newlevel = xmalloc (sizeof (struct binding_level));
990 *newlevel = clear_binding_level;
992 /* Add this level to the front of the chain (stack) of levels that are
993 active. */
994 newlevel->level_chain = current_binding_level;
995 current_binding_level = newlevel;
996 current_binding_level->stmts = alloc_stmt_list ();
999 /* Exit a binding level.
1000 Pop the level off, and restore the state of the identifier-decl mappings
1001 that were in effect when this level was entered.
1003 If KEEP is nonzero, this level had explicit declarations, so
1004 and create a "block" (a BLOCK node) for the level
1005 to record its declarations and subblocks for symbol table output.
1007 If FUNCTIONBODY is nonzero, this level is the body of a function,
1008 so create a block as if KEEP were set and also clear out all
1009 label names.
1011 If REVERSE is nonzero, reverse the order of decls before putting
1012 them into the BLOCK. */
1014 static tree
1015 poplevel (int keep, int reverse, int functionbody)
1017 /* Points to a BLOCK tree node. This is the BLOCK node construted for the
1018 binding level that we are about to exit and which is returned by this
1019 routine. */
1020 tree block_node = NULL_TREE;
1021 tree decl_chain;
1022 tree subblock_chain = current_binding_level->blocks;
1023 tree subblock_node;
1025 /* Reverse the list of *_DECL nodes if desired. Note that the ..._DECL
1026 nodes chained through the `names' field of current_binding_level are in
1027 reverse order except for PARM_DECL node, which are explicitely stored in
1028 the right order. */
1029 decl_chain = (reverse) ? nreverse (current_binding_level->names)
1030 : current_binding_level->names;
1032 /* If there were any declarations in the current binding level, or if this
1033 binding level is a function body, or if there are any nested blocks then
1034 create a BLOCK node to record them for the life of this function. */
1035 if (keep || functionbody)
1036 block_node = build_block (keep ? decl_chain : 0, 0, subblock_chain, 0, 0);
1038 /* Record the BLOCK node just built as the subblock its enclosing scope. */
1039 for (subblock_node = subblock_chain; subblock_node;
1040 subblock_node = TREE_CHAIN (subblock_node))
1041 BLOCK_SUPERCONTEXT (subblock_node) = block_node;
1043 /* Clear out the meanings of the local variables of this level. */
1045 for (subblock_node = decl_chain; subblock_node;
1046 subblock_node = TREE_CHAIN (subblock_node))
1047 if (DECL_NAME (subblock_node) != 0)
1048 /* If the identifier was used or addressed via a local extern decl,
1049 don't forget that fact. */
1050 if (DECL_EXTERNAL (subblock_node))
1052 if (TREE_USED (subblock_node))
1053 TREE_USED (DECL_NAME (subblock_node)) = 1;
1056 /* Pop the current level. */
1057 current_binding_level = current_binding_level->level_chain;
1059 if (functionbody)
1061 /* This is the top level block of a function. */
1062 DECL_INITIAL (current_function_decl) = block_node;
1064 else if (block_node)
1066 current_binding_level->blocks
1067 = chainon (current_binding_level->blocks, block_node);
1070 /* If we did not make a block for the level just exited, any blocks made for
1071 inner levels (since they cannot be recorded as subblocks in that level)
1072 must be carried forward so they will later become subblocks of something
1073 else. */
1074 else if (subblock_chain)
1075 current_binding_level->blocks
1076 = chainon (current_binding_level->blocks, subblock_chain);
1077 if (block_node)
1078 TREE_USED (block_node) = 1;
1080 return block_node;
1083 /* Insert BLOCK at the end of the list of subblocks of the
1084 current binding level. This is used when a BIND_EXPR is expanded,
1085 to handle the BLOCK node inside the BIND_EXPR. */
1087 static void
1088 insert_block (tree block)
1090 TREE_USED (block) = 1;
1091 current_binding_level->blocks
1092 = chainon (current_binding_level->blocks, block);
1096 /* Records a ..._DECL node DECL as belonging to the current lexical scope.
1097 Returns the ..._DECL node. */
1099 tree
1100 pushdecl (tree decl)
1102 /* External objects aren't nested, other objects may be. */
1104 if ((DECL_EXTERNAL (decl)) || (decl==current_function_decl))
1105 DECL_CONTEXT (decl) = 0;
1106 else
1107 DECL_CONTEXT (decl) = current_function_decl;
1109 /* Put the declaration on the list. The list of declarations is in reverse
1110 order. The list will be reversed later if necessary. This needs to be
1111 this way for compatibility with the back-end. */
1113 TREE_CHAIN (decl) = current_binding_level->names;
1114 current_binding_level->names = decl;
1116 /* For the declartion of a type, set its name if it is not already set. */
1118 if (TREE_CODE (decl) == TYPE_DECL
1119 && TYPE_NAME (TREE_TYPE (decl)) == 0)
1120 TYPE_NAME (TREE_TYPE (decl)) = DECL_NAME (decl);
1122 /* Put automatic variables into the intermediate representation. */
1123 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl)
1124 && !TREE_STATIC (decl) && !TREE_PUBLIC (decl))
1125 tree_code_output_expression_statement (build1 (DECL_EXPR, void_type_node,
1126 decl),
1127 DECL_SOURCE_LOCATION (decl));
1128 return decl;
1132 static void
1133 tree_push_type_decl(tree id, tree type_node)
1135 tree decl = build_decl (TYPE_DECL, id, type_node);
1136 TYPE_NAME (type_node) = id;
1137 pushdecl (decl);
1140 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
1142 /* Create the predefined scalar types of C,
1143 and some nodes representing standard constants (0, 1, (void *) 0).
1144 Initialize the global binding level.
1145 Make definitions for built-in primitive functions. */
1147 void
1148 treelang_init_decl_processing (void)
1150 current_function_decl = NULL;
1151 current_binding_level = NULL_BINDING_LEVEL;
1152 pushlevel (0); /* make the binding_level structure for global names */
1153 global_binding_level = current_binding_level;
1155 build_common_tree_nodes (flag_signed_char, false);
1157 /* set standard type names */
1159 /* Define `int' and `char' last so that they are not overwritten. */
1160 tree_push_type_decl (NULL_TREE, intQI_type_node);
1161 tree_push_type_decl (NULL_TREE, intHI_type_node);
1162 tree_push_type_decl (NULL_TREE, intSI_type_node);
1163 tree_push_type_decl (NULL_TREE, intDI_type_node);
1164 #if HOST_BITS_PER_WIDE_INT >= 64
1165 tree_push_type_decl (NULL_TREE, intTI_type_node);
1166 #endif
1167 tree_push_type_decl (NULL_TREE, unsigned_intQI_type_node);
1168 tree_push_type_decl (NULL_TREE, unsigned_intHI_type_node);
1169 tree_push_type_decl (NULL_TREE, unsigned_intSI_type_node);
1170 tree_push_type_decl (NULL_TREE, unsigned_intDI_type_node);
1171 #if HOST_BITS_PER_WIDE_INT >= 64
1172 tree_push_type_decl (NULL_TREE, unsigned_intTI_type_node);
1173 #endif
1175 tree_push_type_decl (get_identifier ("int"), integer_type_node);
1176 tree_push_type_decl (get_identifier ("char"), char_type_node);
1177 tree_push_type_decl (get_identifier ("long int"),
1178 long_integer_type_node);
1179 tree_push_type_decl (get_identifier ("unsigned int"),
1180 unsigned_type_node);
1181 tree_push_type_decl (get_identifier ("long unsigned int"),
1182 long_unsigned_type_node);
1183 tree_push_type_decl (get_identifier ("long long int"),
1184 long_long_integer_type_node);
1185 tree_push_type_decl (get_identifier ("long long unsigned int"),
1186 long_long_unsigned_type_node);
1187 tree_push_type_decl (get_identifier ("short int"),
1188 short_integer_type_node);
1189 tree_push_type_decl (get_identifier ("short unsigned int"),
1190 short_unsigned_type_node);
1191 tree_push_type_decl (get_identifier ("signed char"),
1192 signed_char_type_node);
1193 tree_push_type_decl (get_identifier ("unsigned char"),
1194 unsigned_char_type_node);
1195 size_type_node = make_unsigned_type (POINTER_SIZE);
1196 tree_push_type_decl (get_identifier ("size_t"), size_type_node);
1197 set_sizetype (size_type_node);
1199 build_common_tree_nodes_2 (/* short_double= */ 0);
1201 tree_push_type_decl (get_identifier ("float"), float_type_node);
1202 tree_push_type_decl (get_identifier ("double"), double_type_node);
1203 tree_push_type_decl (get_identifier ("long double"), long_double_type_node);
1204 tree_push_type_decl (get_identifier ("void"), void_type_node);
1206 build_common_builtin_nodes ();
1207 (*targetm.init_builtins) ();
1209 pedantic_lvalues = pedantic;
1212 /* Return a definition for a builtin function named NAME and whose data type
1213 is TYPE. TYPE should be a function type with argument types.
1214 FUNCTION_CODE tells later passes how to compile calls to this function.
1215 See tree.h for its possible values.
1217 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
1218 the name to be called if we can't opencode the function. If
1219 ATTRS is nonzero, use that for the function's attribute list.
1221 copied from gcc/c-decl.c
1224 static tree
1225 builtin_function (const char *name, tree type, int function_code,
1226 enum built_in_class class, const char *library_name,
1227 tree attrs)
1229 tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
1230 DECL_EXTERNAL (decl) = 1;
1231 TREE_PUBLIC (decl) = 1;
1232 if (library_name)
1233 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
1234 pushdecl (decl);
1235 DECL_BUILT_IN_CLASS (decl) = class;
1236 DECL_FUNCTION_CODE (decl) = function_code;
1238 /* Possibly apply some default attributes to this built-in function. */
1239 if (attrs)
1240 decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN);
1241 else
1242 decl_attributes (&decl, NULL_TREE, 0);
1244 return decl;
1247 /* Treelang expand function langhook. */
1249 static void
1250 treelang_expand_function (tree fndecl)
1252 /* We have nothing special to do while expanding functions for treelang. */
1253 tree_rest_of_compilation (fndecl);
1256 #include "debug.h" /* for debug_hooks, needed by gt-treelang-treetree.h */
1257 #include "gt-treelang-treetree.h"