3 TREELANG Compiler back end interface (treetree.c)
6 If you want a working example of how to write a front end to GCC,
7 you are in the right place.
9 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
10 2001, 2002 Free Software Foundation, Inc.
12 This code is based on toy.c written by Richard Kenner.
14 It was later modified by Jonathan Bartlett whose changes have all
15 been removed (by Tim Josling).
17 Various bits and pieces were cloned from the GCC main tree, as
18 GCC evolved, for COBOLForGCC, by Tim Josling.
20 It was adapted to TREELANG by Tim Josling 2001.
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
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 ---------------------------------------------------------------------------
48 Assumption: garbage collection is never called implicitly. It will
49 not be called 'at any time' when short of memory. It will only be
50 called explicitly at the end of each function. This removes the
51 need for a *lot* of bother to ensure everything is in the mark trees
54 /* Note it is OK to use GCC extensions such as long long in a compiler front end.
55 This is because the GCC front ends are built using GCC. */
61 #include "coretypes.h"
71 #include "langhooks-def.h"
72 #include "langhooks.h"
77 extern int option_main;
78 extern char **file_names;
80 /* The front end language hooks (addresses of code for this front
81 end). Mostly just use the C routines. */
83 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
84 #define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion
85 #undef LANG_HOOKS_MARK_ADDRESSABLE
86 #define LANG_HOOKS_MARK_ADDRESSABLE c_mark_addressable
87 #undef LANG_HOOKS_SIGNED_TYPE
88 #define LANG_HOOKS_SIGNED_TYPE c_common_signed_type
89 #undef LANG_HOOKS_UNSIGNED_TYPE
90 #define LANG_HOOKS_UNSIGNED_TYPE c_common_unsigned_type
91 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
92 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type
93 #undef LANG_HOOKS_TYPE_FOR_MODE
94 #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
95 #undef LANG_HOOKS_TYPE_FOR_SIZE
96 #define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
97 #undef LANG_HOOKS_PARSE_FILE
98 #define LANG_HOOKS_PARSE_FILE treelang_parse_file
99 #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
100 #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table
101 #undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
102 #define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table
103 #undef LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES
104 #define LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES c_insert_default_attributes
106 /* Hook routines and data unique to treelang. */
108 #undef LANG_HOOKS_INIT
109 #define LANG_HOOKS_INIT treelang_init
110 #undef LANG_HOOKS_NAME
111 #define LANG_HOOKS_NAME "GNU treelang"
112 #undef LANG_HOOKS_FINISH
113 #define LANG_HOOKS_FINISH treelang_finish
114 #undef LANG_HOOKS_DECODE_OPTION
115 #define LANG_HOOKS_DECODE_OPTION treelang_decode_option
116 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
118 /* Tree code type/name/code tables. */
120 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
122 const char tree_code_type[] = {
128 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
130 const unsigned char tree_code_length[] = {
136 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
138 const char *const tree_code_name[] = {
144 /* Number of bits in int and char - accessed by front end. */
146 unsigned int tree_code_int_size = 0;
147 unsigned int tree_code_char_size = 0;
149 /* Return the tree stuff for this type TYPE_NUM. */
152 tree_code_get_type (int type_num)
157 return signed_char_type_node;
160 return unsigned_char_type_node;
163 return integer_type_node;
166 return unsigned_type_node;
169 return void_type_node;
176 /* Output the code for the start of an if statement. The test
177 expression is EXP (true if not zero), and the stmt occurred at line
178 LINENO in file FILENAME. */
181 tree_code_if_start (tree exp, unsigned char* filename, int lineno)
184 cond_exp = build (NE_EXPR,
187 build1 (CONVERT_EXPR, TREE_TYPE (exp), integer_zero_node));
188 emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
189 expand_start_cond (cond_exp, /* Exit-able if nonzero. */ 0);
192 /* Output the code for the else of an if statement. The else occurred
193 at line LINENO in file FILENAME. */
196 tree_code_if_else (unsigned char* filename, int lineno)
198 emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
199 expand_start_else ();
202 /* Output the code for the end_if an if statement. The end_if (final brace) occurred
203 at line LINENO in file FILENAME. */
206 tree_code_if_end (unsigned char* filename, int lineno)
208 emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
212 /* Create a function. The prototype name is NAME, storage class is
213 STORAGE_CLASS, type of return variable is RET_TYPE, parameter lists
214 is PARMS, returns decl for this function. */
217 tree_code_create_function_prototype (unsigned char* chars,
218 unsigned int storage_class,
219 unsigned int ret_type,
220 struct prod_token_parm_item* parms,
221 unsigned char* filename,
226 struct prod_token_parm_item* parm;
227 tree type_list = NULL_TREE;
232 /* Build the type. */
233 id = get_identifier ((const char*)chars);
234 for (parm = parms; parm; parm = parm->tp.par.next)
236 type_node = get_type_for_numeric_type (parm->type);
237 type_list = tree_cons (NULL_TREE, type_node, type_list);
239 /* Last parm if void indicates fixed length list (as opposed to
240 printf style va_* list). */
241 type_list = tree_cons (NULL_TREE, void_type_node, type_list);
242 /* The back end needs them in reverse order. */
243 type_list = nreverse (type_list);
245 type_node = get_type_for_numeric_type (ret_type);
246 fn_type = build_function_type (type_node, type_list);
248 id = get_identifier ((const char*)chars);
249 fn_decl = build_decl (FUNCTION_DECL, id, fn_type);
251 DECL_CONTEXT (fn_decl) = NULL_TREE; /* Nested functions not supported here. */
252 DECL_SOURCE_FILE (fn_decl) = (const char *)filename;
253 /* if (lineno > 1000000)
254 ; */ /* Probably the line # is rubbish because someone forgot to set
255 the line number - and unfortunately impossible line #s are used as
256 magic flags at various times. The longest known function for
257 example is about 550,000 lines (it was written in COBOL). */
258 DECL_SOURCE_LINE (fn_decl) = lineno;
260 TREE_USED (fn_decl) = 1;
262 /* Real name (optional). */
263 SET_DECL_ASSEMBLER_NAME (fn_decl, DECL_NAME (fn_decl));
265 TREE_PUBLIC (fn_decl) = 0;
266 DECL_EXTERNAL (fn_decl) = 0;
267 TREE_STATIC (fn_decl) = 0;
268 switch (storage_class)
271 TREE_PUBLIC (fn_decl) = 0;
274 case EXTERNAL_DEFINITION_STORAGE:
275 TREE_PUBLIC (fn_decl) = 1;
276 TREE_STATIC (fn_decl) = 0;
277 DECL_EXTERNAL (fn_decl) = 0;
280 case EXTERNAL_REFERENCE_STORAGE:
281 TREE_PUBLIC (fn_decl) = 0;
282 DECL_EXTERNAL (fn_decl) = 1;
286 case AUTOMATIC_STORAGE:
291 /* Process declaration of function defined elsewhere. */
292 rest_of_decl_compilation (fn_decl, NULL, 1, 0);
298 /* Output code for start of function; the decl of the function is in
299 PREV_SAVED (as created by tree_code_create_function_prototype),
300 the function is at line number LINENO in file FILENAME. The
301 parameter details are in the lists PARMS. Returns nothing. */
303 tree_code_create_function_initial (tree prev_saved,
304 unsigned char* filename,
306 struct prod_token_parm_item* parms)
315 struct prod_token_parm_item* this_parm;
316 struct prod_token_parm_item* parm;
318 fn_decl = prev_saved;
322 /* Output message if not -quiet. */
323 announce_function (fn_decl);
325 /* This has something to do with forcing output also. */
328 /* Set current function for error msgs etc. */
329 current_function_decl = fn_decl;
330 DECL_INITIAL (fn_decl) = error_mark_node;
332 DECL_SOURCE_FILE (fn_decl) = (const char *)filename;
333 DECL_SOURCE_LINE (fn_decl) = lineno;
335 /* Prepare creation of rtl for a new function. */
337 resultdecl = DECL_RESULT (fn_decl) = build_decl (RESULT_DECL, NULL_TREE, TREE_TYPE (TREE_TYPE (fn_decl)));
338 DECL_CONTEXT (DECL_RESULT (fn_decl)) = fn_decl;
339 DECL_SOURCE_FILE (resultdecl) = (const char *)filename;
340 DECL_SOURCE_LINE (resultdecl) = lineno;
341 /* Work out the size. ??? is this needed. */
342 layout_decl (DECL_RESULT (fn_decl), 0);
344 /* Make the argument variable decls. */
345 parm_list = NULL_TREE;
346 for (parm = parms; parm; parm = parm->tp.par.next)
348 parm_decl = build_decl (PARM_DECL, get_identifier
349 ((const char*) (parm->tp.par.variable_name)),
350 get_type_for_numeric_type (parm->type));
352 /* Some languages have different nominal and real types. */
353 DECL_ARG_TYPE (parm_decl) = TREE_TYPE (parm_decl);
354 if (!DECL_ARG_TYPE (parm_decl))
358 DECL_CONTEXT (parm_decl) = fn_decl;
359 DECL_SOURCE_FILE (parm_decl) = (const char *)filename;
360 DECL_SOURCE_LINE (parm_decl) = lineno;
361 parm_list = chainon (parm_decl, parm_list);
364 /* Back into reverse order as the back end likes them. */
365 parm_list = nreverse (parm_list);
367 DECL_ARGUMENTS (fn_decl) = parm_list;
369 /* Save the decls for use when the args are referred to. */
370 for (param_decl = DECL_ARGUMENTS (fn_decl),
373 param_decl = TREE_CHAIN (param_decl),
374 this_parm = this_parm->tp.par.next)
377 abort (); /* Too few. */
378 *this_parm->tp.par.where_to_put_var_tree = param_decl;
381 abort (); /* Too many. */
383 /* Output the decl rtl (not the rtl for the function code). ???.
384 If the function is not defined in this file, when should you
386 make_decl_rtl (fn_decl, NULL);
388 /* Use filename/lineno from above. */
389 init_function_start (fn_decl, (const char *)filename, lineno);
391 /* Create rtl for startup code of function, such as saving registers. */
393 expand_function_start (fn_decl, 0);
395 /* Function.c requires a push at the start of the function. that
396 looks like a bug to me but let's make it happy. */
398 (*lang_hooks.decls.pushlevel) (0);
400 /* Create rtl for the start of a new scope. */
402 expand_start_bindings (2);
404 /* Put the parameters into the symbol table. */
406 for (first_param = param_decl = nreverse (DECL_ARGUMENTS (fn_decl));
408 param_decl = next_param)
410 next_param = TREE_CHAIN (param_decl);
411 TREE_CHAIN (param_decl) = NULL;
412 /* layout_decl (param_decl, 0); Already done in build_decl tej 13/4/2002. */
413 pushdecl (param_decl);
414 if (DECL_CONTEXT (param_decl) != current_function_decl)
418 /* Store back the PARM_DECL nodes. They appear in the right order. */
419 DECL_ARGUMENTS (fn_decl) = getdecls ();
421 /* Force it to be output, else may be solely inlined. */
422 TREE_ADDRESSABLE (fn_decl) = 1;
424 /* Stop -O3 from deleting it. */
425 TREE_USED (fn_decl) = 1;
427 /* Add a new level to the debugger symbol table. */
429 (*lang_hooks.decls.pushlevel) (0);
431 /* Create rtl for the start of a new scope. */
433 expand_start_bindings (0);
435 emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
438 /* Wrapup a function contained in file FILENAME, ending at line LINENO. */
440 tree_code_create_function_wrapup (unsigned char* filename,
446 fn_decl = current_function_decl;
448 emit_line_note ((const char *)filename, lineno); /* Output the line number information. */
450 /* Get completely built level from debugger symbol table. */
452 block = (*lang_hooks.decls.poplevel) (1, 0, 0);
454 /* Emit rtl for end of scope. */
456 expand_end_bindings (block, 0, 1);
458 /* Emit rtl for end of function. */
460 expand_function_end ((const char *)filename, lineno, 0);
464 block = (*lang_hooks.decls.poplevel) (1, 0, 1);
466 /* And attach it to the function. */
468 DECL_INITIAL (fn_decl) = block;
470 /* Emit rtl for end of scope. */
472 expand_end_bindings (block, 0, 1);
474 /* Call optimization and convert optimized rtl to assembly code. */
476 rest_of_compilation (fn_decl);
478 /* We are not inside of any scope now. */
480 current_function_decl = NULL_TREE;
486 The storage class is STORAGE_CLASS (eg LOCAL).
487 The name is CHARS/LENGTH.
488 The type is EXPRESSION_TYPE (eg UNSIGNED_TYPE).
489 The init tree is INIT.
493 tree_code_create_variable (unsigned int storage_class,
494 unsigned char* chars,
496 unsigned int expression_type,
498 unsigned char* filename,
505 /* 1. Build the type. */
506 var_type = get_type_for_numeric_type (expression_type);
508 /* 2. Build the name. */
509 if (chars[length] != 0)
510 abort (); /* Should be null terminated. */
512 var_id = get_identifier ((const char*)chars);
514 /* 3. Build the decl and set up init. */
515 var_decl = build_decl (VAR_DECL, var_id, var_type);
517 /* 3a. Initialization. */
519 DECL_INITIAL (var_decl) = build1 (CONVERT_EXPR, var_type, init);
521 DECL_INITIAL (var_decl) = NULL_TREE;
523 /* 4. Compute size etc. */
524 layout_decl (var_decl, 0);
526 if (TYPE_SIZE (var_type) == 0)
527 abort (); /* Did not calculate size. */
529 DECL_CONTEXT (var_decl) = current_function_decl;
531 DECL_SOURCE_FILE (var_decl) = (const char *)filename;
532 DECL_SOURCE_LINE (var_decl) = lineno;
534 /* Set the storage mode and whether only visible in the same file. */
535 switch (storage_class)
538 TREE_STATIC (var_decl) = 1;
539 TREE_PUBLIC (var_decl) = 0;
542 case AUTOMATIC_STORAGE:
543 TREE_STATIC (var_decl) = 0;
544 TREE_PUBLIC (var_decl) = 0;
547 case EXTERNAL_DEFINITION_STORAGE:
548 TREE_STATIC (var_decl) = 0;
549 TREE_PUBLIC (var_decl) = 1;
552 case EXTERNAL_REFERENCE_STORAGE:
553 DECL_EXTERNAL (var_decl) = 1;
554 TREE_PUBLIC (var_decl) = 0;
561 /* This should really only be set if the variable is used. */
562 TREE_USED (var_decl) = 1;
564 /* Expand declaration and initial value if any. */
566 if (TREE_STATIC (var_decl))
567 rest_of_decl_compilation (var_decl, 0, 0, 0);
570 expand_decl (var_decl);
571 if (DECL_INITIAL (var_decl))
572 expand_decl_init (var_decl);
575 return pushdecl (copy_node (var_decl));
580 /* Generate code for return statement. Type is in TYPE, expression
581 is in EXP if present. */
584 tree_code_generate_return (tree type, tree exp)
589 for (param = DECL_ARGUMENTS (current_function_decl);
591 param = TREE_CHAIN (param))
593 if (DECL_CONTEXT (param) != current_function_decl)
599 setret = build (MODIFY_EXPR, type, DECL_RESULT (current_function_decl),
600 build1 (CONVERT_EXPR, type, exp));
601 TREE_SIDE_EFFECTS (setret) = 1;
602 TREE_USED (setret) = 1;
603 expand_expr_stmt (setret);
605 expand_return (DECL_RESULT (current_function_decl));
608 /* Output the code for this expression statement CODE. */
612 tree_code_output_expression_statement (tree code,
613 unsigned char* filename, int lineno)
615 /* Output the line number information. */
616 emit_line_note ((const char *)filename, lineno);
617 TREE_USED (code) = 1;
618 TREE_SIDE_EFFECTS (code) = 1;
619 expand_expr_stmt (code);
622 /* Return a tree for a constant integer value in the token TOK. No
623 size checking is done. */
626 tree_code_get_integer_value (unsigned char* chars, unsigned int length)
628 long long int val = 0;
630 unsigned int start = 0;
634 case (unsigned char)'-':
639 case (unsigned char)'+':
646 for (ix = start; ix < length; ix++)
647 val = val * 10 + chars[ix] - (unsigned char)'0';
649 return build_int_2 (val & 0xffffffff, (val >> 32) & 0xffffffff);
652 /* Return the tree for an expresssion, type EXP_TYPE (see treetree.h)
653 with tree type TYPE and with operands1 OP1, OP2 (maybe), OP3 (maybe). */
655 tree_code_get_expression (unsigned int exp_type,
656 tree type, tree op1, tree op2, tree op3 ATTRIBUTE_UNUSED)
666 operator = MODIFY_EXPR;
667 ret1 = build (operator, type,
669 build1 (CONVERT_EXPR, type, op2));
674 operator = PLUS_EXPR;
675 goto binary_expression;
678 operator = MINUS_EXPR;
679 goto binary_expression;
683 goto binary_expression;
685 /* Expand a binary expression. Ensure the operands are the right type. */
689 ret1 = build (operator, type,
690 build1 (CONVERT_EXPR, type, op1),
691 build1 (CONVERT_EXPR, type, op2));
694 /* Reference to a variable. This is dead easy, just return the
695 decl for the variable. If the TYPE is different than the
696 variable type, convert it. */
700 if (type == TREE_TYPE (op1))
703 ret1 = build1 (CONVERT_EXPR, type, op1);
706 case EXP_FUNCTION_INVOCATION:
711 fun_ptr = build1 (ADDR_EXPR, build_pointer_type (type), op1);
712 ret1 = build (CALL_EXPR, type, fun_ptr, nreverse (op2));
723 /* Init parameter list and return empty list. */
726 tree_code_init_parameters (void)
731 /* Add a parameter EXP whose expression type is EXP_PROTO to list
732 LIST, returning the new list. */
735 tree_code_add_parameter (tree list, tree proto_exp, tree exp)
738 new_exp = tree_cons (NULL_TREE,
739 build1 (CONVERT_EXPR, TREE_TYPE (proto_exp), exp),
743 return chainon (new_exp, list);
746 /* Get the tree type for this type whose number is NUMERIC_TYPE. */
749 get_type_for_numeric_type (unsigned int numeric_type)
754 switch (numeric_type)
757 return void_type_node;
760 size1 = tree_code_int_size;
765 size1 = tree_code_int_size;
770 size1 = tree_code_char_size;
775 size1 = tree_code_char_size;
783 return tree_code_get_numeric_type (size1, sign1);
787 /* Return tree representing a numeric type of size SIZE1 bits and
788 signed if SIGN1 != 0. */
790 tree_code_get_numeric_type (unsigned int size1, unsigned int sign1)
793 if (size1 == tree_code_int_size)
796 ret1 = integer_type_node;
798 ret1 = unsigned_type_node;
801 if (size1 == tree_code_char_size)
804 ret1 = signed_char_type_node;
806 ret1 = unsigned_char_type_node;
814 /* Garbage Collection. */
816 /* Callback to mark storage M as used always. */
819 tree_ggc_storage_always_used (void * m)
821 void **mm; /* Actually M is a pointer to a pointer to the memory. */
828 /* Following from c-lang.c. */
830 /* Used by c-typeck.c (build_external_ref), but only for objc. */
833 lookup_objc_ivar (tree id ATTRIBUTE_UNUSED)
838 /* Dummy routines called from c code. Save copying c-decl.c, c-common.c etc. */
841 objc_is_id (tree arg ATTRIBUTE_UNUSED)
847 check_function_format (int *status ATTRIBUTE_UNUSED,
848 tree attrs ATTRIBUTE_UNUSED,
849 tree params ATTRIBUTE_UNUSED)
854 /* Tell the c code we are not objective C. */
857 objc_comptypes (tree lhs ATTRIBUTE_UNUSED,
858 tree rhs ATTRIBUTE_UNUSED,
859 int reflexive ATTRIBUTE_UNUSED)
864 /* Should not be called for treelang. */
867 build_stmt VPARAMS ((enum tree_code code ATTRIBUTE_UNUSED, ...))
872 /* Should not be called for treelang. */
875 add_stmt (tree t ATTRIBUTE_UNUSED)
880 /* Should not be called for treelang. */
883 build_return_stmt (tree expr ATTRIBUTE_UNUSED)
888 /* C warning, ignore. */
891 pedwarn_c99 VPARAMS ((const char *msgid ATTRIBUTE_UNUSED, ...))
896 /* Should not be called for treelang. */
899 build_case_label (tree low_value ATTRIBUTE_UNUSED,
900 tree high_value ATTRIBUTE_UNUSED,
901 tree label_decl ATTRIBUTE_UNUSED)
906 /* Should not be called for treelang. */
909 emit_local_var (tree decl ATTRIBUTE_UNUSED)
914 /* Should not be called for treelang. */
917 expand_stmt (tree t ATTRIBUTE_UNUSED)
922 /* Should not be called for treelang. */
925 cpp_create_reader (enum c_lang lang ATTRIBUTE_UNUSED)
930 /* Should not be called for treelang. */
933 init_c_lex (const char *filename ATTRIBUTE_UNUSED)
938 /* Should not be called for treelang. */
940 void init_pragma (void);
948 /* Should not be called for treelang. */
951 cpp_finish (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f ATTRIBUTE_UNUSED)
956 /* Should not be called for treelang. */
959 cpp_errors (cpp_reader *pfile ATTRIBUTE_UNUSED)
964 /* Dummy called by C. */
967 handle_format_attribute (tree *node ATTRIBUTE_UNUSED,
968 tree name ATTRIBUTE_UNUSED,
969 tree args ATTRIBUTE_UNUSED,
970 int flags ATTRIBUTE_UNUSED,
971 bool *no_add_attrs ATTRIBUTE_UNUSED)
976 /* Should not be called for treelang. */
979 handle_format_arg_attribute (tree *node ATTRIBUTE_UNUSED,
980 tree name ATTRIBUTE_UNUSED,
981 tree args ATTRIBUTE_UNUSED,
982 int flags ATTRIBUTE_UNUSED,
983 bool *no_add_attrs ATTRIBUTE_UNUSED)
988 /* Should not be called for treelang. */
991 cpp_handle_option (cpp_reader *pfile ATTRIBUTE_UNUSED,
992 int argc ATTRIBUTE_UNUSED,
993 char **argv ATTRIBUTE_UNUSED)
998 /* Should not be called for treelang. */
1001 cpp_assert (cpp_reader * cr ATTRIBUTE_UNUSED,
1002 const char *s ATTRIBUTE_UNUSED)
1007 /* Should not be called for treelang. */
1010 set_Wformat (int setting ATTRIBUTE_UNUSED)
1015 /* Used for objective C. */
1018 objc_check_decl (tree decl ATTRIBUTE_UNUSED);
1021 objc_check_decl (tree decl ATTRIBUTE_UNUSED)
1026 /* Tell the c code we are not objective C. */
1029 objc_message_selector (void);
1032 objc_message_selector ()
1037 /* Should not be called for treelang. */
1040 gen_aux_info_record (tree fndecl ATTRIBUTE_UNUSED,
1041 int is_definition ATTRIBUTE_UNUSED,
1042 int is_implicit ATTRIBUTE_UNUSED,
1043 int is_prototyped ATTRIBUTE_UNUSED)
1048 /* Should not be called for treelang, but it is. */
1056 /* Should not be called for treelang. */
1058 void maybe_apply_pragma_weak (tree decl);
1061 maybe_apply_pragma_weak (tree decl ATTRIBUTE_UNUSED)
1066 /* Should not be called for treelang. */
1069 add_decl_stmt (tree decl ATTRIBUTE_UNUSED)
1074 /* Should not be called for treelang. */
1077 maybe_apply_renaming_pragma (tree decl, tree asmname);
1079 /* Should not be called for treelang. */
1082 maybe_apply_renaming_pragma (tree decl ATTRIBUTE_UNUSED, tree asmname ATTRIBUTE_UNUSED)
1087 /* Should not be called for treelang. */
1090 begin_stmt_tree (tree *t ATTRIBUTE_UNUSED)
1095 /* Should not be called for treelang. */
1098 finish_stmt_tree (tree *t ATTRIBUTE_UNUSED)
1103 /* Should not be called for treelang. */
1106 defer_fn (tree fn ATTRIBUTE_UNUSED)
1111 /* Should not be called for treelang. */
1114 *cpp_get_options (cpp_reader * cr ATTRIBUTE_UNUSED)
1119 /* Should not be called for treelang. */
1122 cpp_define (cpp_reader * cr ATTRIBUTE_UNUSED, const char * c ATTRIBUTE_UNUSED)
1127 /* Should not be called for treelang. */
1130 cpp_get_callbacks (cpp_reader * cr ATTRIBUTE_UNUSED)
1135 /* Create the predefined scalar types of C,
1136 and some nodes representing standard constants (0, 1, (void *) 0).
1137 Initialize the global binding level.
1138 Make definitions for built-in primitive functions. */
1140 /* `unsigned long' is the standard type for sizeof.
1141 Note that stddef.h uses `unsigned long',
1142 and this must agree, even if long and int are the same size. */
1144 /* The reserved keyword table. */
1148 ENUM_BITFIELD(rid) rid : 16;
1149 unsigned int disable : 16;
1152 static const struct resword reswords[] =
1154 { "_Bool", RID_BOOL, 0 },
1155 { "_Complex", RID_COMPLEX, 0 },
1156 { "__FUNCTION__", RID_FUNCTION_NAME, 0 },
1157 { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
1158 { "__alignof", RID_ALIGNOF, 0 },
1159 { "__alignof__", RID_ALIGNOF, 0 },
1160 { "__asm", RID_ASM, 0 },
1161 { "__asm__", RID_ASM, 0 },
1162 { "__attribute", RID_ATTRIBUTE, 0 },
1163 { "__attribute__", RID_ATTRIBUTE, 0 },
1164 { "__bounded", RID_BOUNDED, 0 },
1165 { "__bounded__", RID_BOUNDED, 0 },
1166 { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
1167 { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
1168 { "__builtin_va_arg", RID_VA_ARG, 0 },
1169 { "__complex", RID_COMPLEX, 0 },
1170 { "__complex__", RID_COMPLEX, 0 },
1171 { "__const", RID_CONST, 0 },
1172 { "__const__", RID_CONST, 0 },
1173 { "__extension__", RID_EXTENSION, 0 },
1174 { "__func__", RID_C99_FUNCTION_NAME, 0 },
1175 { "__imag", RID_IMAGPART, 0 },
1176 { "__imag__", RID_IMAGPART, 0 },
1177 { "__inline", RID_INLINE, 0 },
1178 { "__inline__", RID_INLINE, 0 },
1179 { "__label__", RID_LABEL, 0 },
1180 { "__ptrbase", RID_PTRBASE, 0 },
1181 { "__ptrbase__", RID_PTRBASE, 0 },
1182 { "__ptrextent", RID_PTREXTENT, 0 },
1183 { "__ptrextent__", RID_PTREXTENT, 0 },
1184 { "__ptrvalue", RID_PTRVALUE, 0 },
1185 { "__ptrvalue__", RID_PTRVALUE, 0 },
1186 { "__real", RID_REALPART, 0 },
1187 { "__real__", RID_REALPART, 0 },
1188 { "__restrict", RID_RESTRICT, 0 },
1189 { "__restrict__", RID_RESTRICT, 0 },
1190 { "__signed", RID_SIGNED, 0 },
1191 { "__signed__", RID_SIGNED, 0 },
1192 { "__typeof", RID_TYPEOF, 0 },
1193 { "__typeof__", RID_TYPEOF, 0 },
1194 { "__unbounded", RID_UNBOUNDED, 0 },
1195 { "__unbounded__", RID_UNBOUNDED, 0 },
1196 { "__volatile", RID_VOLATILE, 0 },
1197 { "__volatile__", RID_VOLATILE, 0 },
1198 { "asm", RID_ASM, 0 },
1199 { "auto", RID_AUTO, 0 },
1200 { "break", RID_BREAK, 0 },
1201 { "case", RID_CASE, 0 },
1202 { "char", RID_CHAR, 0 },
1203 { "const", RID_CONST, 0 },
1204 { "continue", RID_CONTINUE, 0 },
1205 { "default", RID_DEFAULT, 0 },
1206 { "do", RID_DO, 0 },
1207 { "double", RID_DOUBLE, 0 },
1208 { "else", RID_ELSE, 0 },
1209 { "enum", RID_ENUM, 0 },
1210 { "extern", RID_EXTERN, 0 },
1211 { "float", RID_FLOAT, 0 },
1212 { "for", RID_FOR, 0 },
1213 { "goto", RID_GOTO, 0 },
1214 { "if", RID_IF, 0 },
1215 { "inline", RID_INLINE, 0 },
1216 { "int", RID_INT, 0 },
1217 { "long", RID_LONG, 0 },
1218 { "register", RID_REGISTER, 0 },
1219 { "restrict", RID_RESTRICT, 0 },
1220 { "return", RID_RETURN, 0 },
1221 { "short", RID_SHORT, 0 },
1222 { "signed", RID_SIGNED, 0 },
1223 { "sizeof", RID_SIZEOF, 0 },
1224 { "static", RID_STATIC, 0 },
1225 { "struct", RID_STRUCT, 0 },
1226 { "switch", RID_SWITCH, 0 },
1227 { "typedef", RID_TYPEDEF, 0 },
1228 { "typeof", RID_TYPEOF, 0 },
1229 { "union", RID_UNION, 0 },
1230 { "unsigned", RID_UNSIGNED, 0 },
1231 { "void", RID_VOID, 0 },
1232 { "volatile", RID_VOLATILE, 0 },
1233 { "while", RID_WHILE, 0 },
1235 #define N_reswords (sizeof reswords / sizeof (struct resword))
1237 /* Init enough to allow the C decl code to work, then clean up
1241 treelang_init_decl_processing ()
1246 /* It is not necessary to register ridpointers as a GC root, because
1247 all the trees it points to are permanently interned in the
1248 get_identifier hash anyway. */
1249 ridpointers = (tree *) xcalloc ((int) RID_MAX, sizeof (tree));
1251 for (i = 0; i < N_reswords; i++)
1253 id = get_identifier (reswords[i].word);
1254 C_RID_CODE (id) = reswords[i].rid;
1255 C_IS_RESERVED_WORD (id) = 1;
1256 ridpointers [(int) reswords[i].rid] = id;
1259 c_init_decl_processing ();
1261 /* ix86_return_pops_args takes the type of these so need to patch
1262 their own type as themselves. */
1264 for (i = 0; i < itk_none; i++)
1266 if (integer_types[i])
1267 TREE_TYPE (integer_types [i]) = integer_types[i];
1270 /* Probably these ones too. */
1271 TREE_TYPE (float_type_node) = float_type_node;
1272 TREE_TYPE (double_type_node) = double_type_node;
1273 TREE_TYPE (long_double_type_node) = long_double_type_node;
1277 /* Save typing debug_tree all the time. Dump a tree T pretty and