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,
10 1999, 2000, 2001, 2002, 2003, 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"
78 extern int option_main
;
79 extern char **file_names
;
81 /* The front end language hooks (addresses of code for this front
82 end). Mostly just use the C routines. */
84 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
85 #define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion
86 #undef LANG_HOOKS_MARK_ADDRESSABLE
87 #define LANG_HOOKS_MARK_ADDRESSABLE c_mark_addressable
88 #undef LANG_HOOKS_SIGNED_TYPE
89 #define LANG_HOOKS_SIGNED_TYPE c_common_signed_type
90 #undef LANG_HOOKS_UNSIGNED_TYPE
91 #define LANG_HOOKS_UNSIGNED_TYPE c_common_unsigned_type
92 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
93 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type
94 #undef LANG_HOOKS_TYPE_FOR_MODE
95 #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
96 #undef LANG_HOOKS_TYPE_FOR_SIZE
97 #define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
98 #undef LANG_HOOKS_PARSE_FILE
99 #define LANG_HOOKS_PARSE_FILE treelang_parse_file
100 #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
101 #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table
102 #undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
103 #define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table
104 #undef LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES
105 #define LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES c_insert_default_attributes
107 /* Hook routines and data unique to treelang. */
109 #undef LANG_HOOKS_INIT
110 #define LANG_HOOKS_INIT treelang_init
111 #undef LANG_HOOKS_NAME
112 #define LANG_HOOKS_NAME "GNU treelang"
113 #undef LANG_HOOKS_FINISH
114 #define LANG_HOOKS_FINISH treelang_finish
115 #undef LANG_HOOKS_INIT_OPTIONS
116 #define LANG_HOOKS_INIT_OPTIONS treelang_init_options
117 #undef LANG_HOOKS_HANDLE_OPTION
118 #define LANG_HOOKS_HANDLE_OPTION treelang_handle_option
119 const struct lang_hooks lang_hooks
= LANG_HOOKS_INITIALIZER
;
121 /* Tree code type/name/code tables. */
123 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
125 const char tree_code_type
[] = {
131 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
133 const unsigned char tree_code_length
[] = {
139 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
141 const char *const tree_code_name
[] = {
147 /* Number of bits in int and char - accessed by front end. */
149 unsigned int tree_code_int_size
= SIZEOF_INT
* HOST_BITS_PER_CHAR
;
151 unsigned int tree_code_char_size
= HOST_BITS_PER_CHAR
;
153 /* Return the tree stuff for this type TYPE_NUM. */
156 tree_code_get_type (int type_num
)
161 return signed_char_type_node
;
164 return unsigned_char_type_node
;
167 return integer_type_node
;
170 return unsigned_type_node
;
173 return void_type_node
;
180 /* Output the code for the start of an if statement. The test
181 expression is EXP (true if not zero), and the stmt occurred at line
182 LINENO in file FILENAME. */
185 tree_code_if_start (tree exp
, location_t loc
)
188 cond_exp
= build (NE_EXPR
,
191 build1 (CONVERT_EXPR
, TREE_TYPE (exp
), integer_zero_node
));
192 emit_line_note (loc
.file
, loc
.line
); /* Output the line number information. */
193 expand_start_cond (cond_exp
, /* Exit-able if nonzero. */ 0);
196 /* Output the code for the else of an if statement. The else occurred
197 at line LINENO in file FILENAME. */
200 tree_code_if_else (location_t loc
)
202 emit_line_note (loc
.file
, loc
.line
); /* Output the line number information. */
203 expand_start_else ();
206 /* Output the code for the end_if an if statement. The end_if (final brace) occurred
207 at line LINENO in file FILENAME. */
210 tree_code_if_end (location_t loc
)
212 emit_line_note (loc
.file
, loc
.line
); /* Output the line number information. */
216 /* Create a function. The prototype name is NAME, storage class is
217 STORAGE_CLASS, type of return variable is RET_TYPE, parameter lists
218 is PARMS, returns decl for this function. */
221 tree_code_create_function_prototype (unsigned char* chars
,
222 unsigned int storage_class
,
223 unsigned int ret_type
,
224 struct prod_token_parm_item
* parms
,
229 struct prod_token_parm_item
* parm
;
230 tree type_list
= NULL_TREE
;
235 /* Build the type. */
236 id
= get_identifier ((const char*)chars
);
237 for (parm
= parms
; parm
; parm
= parm
->tp
.par
.next
)
239 if (parm
->category
!= parameter_category
)
241 type_node
= get_type_for_numeric_type (parm
->type
);
242 type_list
= tree_cons (NULL_TREE
, type_node
, type_list
);
244 /* Last parm if void indicates fixed length list (as opposed to
245 printf style va_* list). */
246 type_list
= tree_cons (NULL_TREE
, void_type_node
, type_list
);
247 /* The back end needs them in reverse order. */
248 type_list
= nreverse (type_list
);
250 type_node
= get_type_for_numeric_type (ret_type
);
251 fn_type
= build_function_type (type_node
, type_list
);
253 id
= get_identifier ((const char*)chars
);
254 fn_decl
= build_decl (FUNCTION_DECL
, id
, fn_type
);
256 DECL_CONTEXT (fn_decl
) = NULL_TREE
; /* Nested functions not supported here. */
257 DECL_SOURCE_LOCATION (fn_decl
) = loc
;
259 TREE_USED (fn_decl
) = 1;
261 /* Real name (optional). */
262 SET_DECL_ASSEMBLER_NAME (fn_decl
, DECL_NAME (fn_decl
));
264 TREE_PUBLIC (fn_decl
) = 0;
265 DECL_EXTERNAL (fn_decl
) = 0;
266 TREE_STATIC (fn_decl
) = 0;
267 switch (storage_class
)
270 TREE_PUBLIC (fn_decl
) = 0;
273 case EXTERNAL_DEFINITION_STORAGE
:
274 TREE_PUBLIC (fn_decl
) = 1;
275 TREE_STATIC (fn_decl
) = 0;
276 DECL_EXTERNAL (fn_decl
) = 0;
279 case EXTERNAL_REFERENCE_STORAGE
:
280 TREE_PUBLIC (fn_decl
) = 0;
281 DECL_EXTERNAL (fn_decl
) = 1;
285 case AUTOMATIC_STORAGE
:
290 /* Process declaration of function defined elsewhere. */
291 rest_of_decl_compilation (fn_decl
, NULL
, 1, 0);
297 /* Output code for start of function; the decl of the function is in
298 PREV_SAVED (as created by tree_code_create_function_prototype),
299 the function is at line number LINENO in file FILENAME. The
300 parameter details are in the lists PARMS. Returns nothing. */
302 tree_code_create_function_initial (tree prev_saved
,
304 struct prod_token_parm_item
* parms
)
313 struct prod_token_parm_item
* this_parm
;
314 struct prod_token_parm_item
* parm
;
316 fn_decl
= prev_saved
;
320 /* Output message if not -quiet. */
321 announce_function (fn_decl
);
323 /* This has something to do with forcing output also. */
326 /* Set current function for error msgs etc. */
327 current_function_decl
= fn_decl
;
328 DECL_INITIAL (fn_decl
) = error_mark_node
;
330 DECL_SOURCE_LOCATION (fn_decl
) = loc
;
332 /* Prepare creation of rtl for a new function. */
334 resultdecl
= DECL_RESULT (fn_decl
)
335 = build_decl (RESULT_DECL
, NULL_TREE
, TREE_TYPE (TREE_TYPE (fn_decl
)));
336 DECL_CONTEXT (DECL_RESULT (fn_decl
)) = fn_decl
;
337 DECL_SOURCE_LOCATION (resultdecl
) = loc
;
339 /* Work out the size. ??? is this needed. */
340 layout_decl (DECL_RESULT (fn_decl
), 0);
342 /* Make the argument variable decls. */
343 parm_list
= NULL_TREE
;
344 for (parm
= parms
; parm
; parm
= parm
->tp
.par
.next
)
346 parm_decl
= build_decl (PARM_DECL
, get_identifier
347 ((const char*) (parm
->tp
.par
.variable_name
)),
348 get_type_for_numeric_type (parm
->type
));
350 /* Some languages have different nominal and real types. */
351 DECL_ARG_TYPE (parm_decl
) = TREE_TYPE (parm_decl
);
352 if (!DECL_ARG_TYPE (parm_decl
))
356 DECL_CONTEXT (parm_decl
) = fn_decl
;
357 DECL_SOURCE_LOCATION (parm_decl
) = loc
;
358 parm_list
= chainon (parm_decl
, parm_list
);
361 /* Back into reverse order as the back end likes them. */
362 parm_list
= nreverse (parm_list
);
364 DECL_ARGUMENTS (fn_decl
) = parm_list
;
366 /* Save the decls for use when the args are referred to. */
367 for (param_decl
= DECL_ARGUMENTS (fn_decl
),
370 param_decl
= TREE_CHAIN (param_decl
),
371 this_parm
= this_parm
->tp
.par
.next
)
374 abort (); /* Too few. */
375 *this_parm
->tp
.par
.where_to_put_var_tree
= param_decl
;
378 abort (); /* Too many. */
380 /* Output the decl rtl (not the rtl for the function code). ???.
381 If the function is not defined in this file, when should you
383 make_decl_rtl (fn_decl
, NULL
);
385 init_function_start (fn_decl
);
387 /* Create rtl for startup code of function, such as saving registers. */
389 expand_function_start (fn_decl
, 0);
391 /* Function.c requires a push at the start of the function. that
392 looks like a bug to me but let's make it happy. */
394 (*lang_hooks
.decls
.pushlevel
) (0);
396 /* Create rtl for the start of a new scope. */
398 expand_start_bindings (2);
400 /* Put the parameters into the symbol table. */
402 for (first_param
= param_decl
= nreverse (DECL_ARGUMENTS (fn_decl
));
404 param_decl
= next_param
)
406 next_param
= TREE_CHAIN (param_decl
);
407 TREE_CHAIN (param_decl
) = NULL
;
408 /* layout_decl (param_decl, 0); Already done in build_decl tej 13/4/2002. */
409 pushdecl (param_decl
);
410 if (DECL_CONTEXT (param_decl
) != current_function_decl
)
414 /* Store back the PARM_DECL nodes. They appear in the right order. */
415 DECL_ARGUMENTS (fn_decl
) = getdecls ();
417 /* Force it to be output, else may be solely inlined. */
418 TREE_ADDRESSABLE (fn_decl
) = 1;
420 /* Stop -O3 from deleting it. */
421 TREE_USED (fn_decl
) = 1;
423 /* Add a new level to the debugger symbol table. */
425 (*lang_hooks
.decls
.pushlevel
) (0);
427 /* Create rtl for the start of a new scope. */
429 expand_start_bindings (0);
431 emit_line_note (loc
.file
, loc
.line
); /* Output the line number information. */
434 /* Wrapup a function contained in file FILENAME, ending at line LINENO. */
436 tree_code_create_function_wrapup (location_t loc
)
441 fn_decl
= current_function_decl
;
443 emit_line_note (loc
.file
, loc
.line
); /* Output the line number information. */
445 /* Get completely built level from debugger symbol table. */
447 block
= (*lang_hooks
.decls
.poplevel
) (1, 0, 0);
449 /* Emit rtl for end of scope. */
451 expand_end_bindings (block
, 0, 1);
453 /* Emit rtl for end of function. */
455 expand_function_end ();
459 block
= (*lang_hooks
.decls
.poplevel
) (1, 0, 1);
461 /* And attach it to the function. */
463 DECL_INITIAL (fn_decl
) = block
;
465 /* Emit rtl for end of scope. */
467 expand_end_bindings (block
, 0, 1);
469 /* Call optimization and convert optimized rtl to assembly code. */
471 rest_of_compilation (fn_decl
);
473 /* We are not inside of any scope now. */
475 current_function_decl
= NULL_TREE
;
481 The storage class is STORAGE_CLASS (eg LOCAL).
482 The name is CHARS/LENGTH.
483 The type is EXPRESSION_TYPE (eg UNSIGNED_TYPE).
484 The init tree is INIT.
488 tree_code_create_variable (unsigned int storage_class
,
489 unsigned char* chars
,
491 unsigned int expression_type
,
499 /* 1. Build the type. */
500 var_type
= get_type_for_numeric_type (expression_type
);
502 /* 2. Build the name. */
503 if (chars
[length
] != 0)
504 abort (); /* Should be null terminated. */
506 var_id
= get_identifier ((const char*)chars
);
508 /* 3. Build the decl and set up init. */
509 var_decl
= build_decl (VAR_DECL
, var_id
, var_type
);
511 /* 3a. Initialization. */
513 DECL_INITIAL (var_decl
) = build1 (CONVERT_EXPR
, var_type
, init
);
515 DECL_INITIAL (var_decl
) = NULL_TREE
;
517 /* 4. Compute size etc. */
518 layout_decl (var_decl
, 0);
520 if (TYPE_SIZE (var_type
) == 0)
521 abort (); /* Did not calculate size. */
523 DECL_CONTEXT (var_decl
) = current_function_decl
;
525 DECL_SOURCE_LOCATION (var_decl
) = loc
;
527 /* Set the storage mode and whether only visible in the same file. */
528 switch (storage_class
)
531 TREE_STATIC (var_decl
) = 1;
532 TREE_PUBLIC (var_decl
) = 0;
535 case AUTOMATIC_STORAGE
:
536 TREE_STATIC (var_decl
) = 0;
537 TREE_PUBLIC (var_decl
) = 0;
540 case EXTERNAL_DEFINITION_STORAGE
:
541 TREE_STATIC (var_decl
) = 0;
542 TREE_PUBLIC (var_decl
) = 1;
545 case EXTERNAL_REFERENCE_STORAGE
:
546 DECL_EXTERNAL (var_decl
) = 1;
547 TREE_PUBLIC (var_decl
) = 0;
554 /* This should really only be set if the variable is used. */
555 TREE_USED (var_decl
) = 1;
557 /* Expand declaration and initial value if any. */
559 if (TREE_STATIC (var_decl
))
560 rest_of_decl_compilation (var_decl
, 0, 0, 0);
563 expand_decl (var_decl
);
564 if (DECL_INITIAL (var_decl
))
565 expand_decl_init (var_decl
);
568 return pushdecl (copy_node (var_decl
));
573 /* Generate code for return statement. Type is in TYPE, expression
574 is in EXP if present. */
577 tree_code_generate_return (tree type
, tree exp
)
582 for (param
= DECL_ARGUMENTS (current_function_decl
);
584 param
= TREE_CHAIN (param
))
586 if (DECL_CONTEXT (param
) != current_function_decl
)
592 setret
= build (MODIFY_EXPR
, type
, DECL_RESULT (current_function_decl
),
593 build1 (CONVERT_EXPR
, type
, exp
));
594 TREE_SIDE_EFFECTS (setret
) = 1;
595 TREE_USED (setret
) = 1;
596 expand_expr_stmt (setret
);
598 expand_return (DECL_RESULT (current_function_decl
));
601 /* Output the code for this expression statement CODE. */
605 tree_code_output_expression_statement (tree code
,
608 /* Output the line number information. */
609 emit_line_note (loc
.file
, loc
.line
);
610 TREE_USED (code
) = 1;
611 TREE_SIDE_EFFECTS (code
) = 1;
612 expand_expr_stmt (code
);
615 /* Return a tree for a constant integer value in the token TOK. No
616 size checking is done. */
619 tree_code_get_integer_value (unsigned char* chars
, unsigned int length
)
621 long long int val
= 0;
623 unsigned int start
= 0;
627 case (unsigned char)'-':
632 case (unsigned char)'+':
639 for (ix
= start
; ix
< length
; ix
++)
640 val
= val
* 10 + chars
[ix
] - (unsigned char)'0';
642 return build_int_2 (val
& 0xffffffff, (val
>> 32) & 0xffffffff);
645 /* Return the tree for an expresssion, type EXP_TYPE (see treetree.h)
646 with tree type TYPE and with operands1 OP1, OP2 (maybe), OP3 (maybe). */
648 tree_code_get_expression (unsigned int exp_type
,
649 tree type
, tree op1
, tree op2
, tree op3 ATTRIBUTE_UNUSED
)
659 operator = MODIFY_EXPR
;
660 ret1
= build (operator, type
,
662 build1 (CONVERT_EXPR
, type
, op2
));
667 operator = PLUS_EXPR
;
668 goto binary_expression
;
671 operator = MINUS_EXPR
;
672 goto binary_expression
;
676 goto binary_expression
;
678 /* Expand a binary expression. Ensure the operands are the right type. */
682 ret1
= build (operator, type
,
683 build1 (CONVERT_EXPR
, type
, op1
),
684 build1 (CONVERT_EXPR
, type
, op2
));
687 /* Reference to a variable. This is dead easy, just return the
688 decl for the variable. If the TYPE is different than the
689 variable type, convert it. */
693 if (type
== TREE_TYPE (op1
))
696 ret1
= build1 (CONVERT_EXPR
, type
, op1
);
699 case EXP_FUNCTION_INVOCATION
:
704 fun_ptr
= build1 (ADDR_EXPR
, build_pointer_type (type
), op1
);
705 ret1
= build (CALL_EXPR
, type
, fun_ptr
, nreverse (op2
));
716 /* Init parameter list and return empty list. */
719 tree_code_init_parameters (void)
724 /* Add a parameter EXP whose expression type is EXP_PROTO to list
725 LIST, returning the new list. */
728 tree_code_add_parameter (tree list
, tree proto_exp
, tree exp
)
731 new_exp
= tree_cons (NULL_TREE
,
732 build1 (CONVERT_EXPR
, TREE_TYPE (proto_exp
), exp
),
736 return chainon (new_exp
, list
);
739 /* Get the tree type for this type whose number is NUMERIC_TYPE. */
742 get_type_for_numeric_type (unsigned int numeric_type
)
747 switch (numeric_type
)
750 return void_type_node
;
753 size1
= tree_code_int_size
;
758 size1
= tree_code_int_size
;
763 size1
= tree_code_char_size
;
768 size1
= tree_code_char_size
;
776 return tree_code_get_numeric_type (size1
, sign1
);
780 /* Return tree representing a numeric type of size SIZE1 bits and
781 signed if SIGN1 != 0. */
783 tree_code_get_numeric_type (unsigned int size1
, unsigned int sign1
)
788 if (size1
== tree_code_int_size
)
791 ret1
= integer_type_node
;
793 ret1
= unsigned_type_node
;
796 if (size1
== tree_code_char_size
)
799 ret1
= signed_char_type_node
;
801 ret1
= unsigned_char_type_node
;
809 /* Garbage Collection. */
811 /* Callback to mark storage M as used always. */
814 tree_ggc_storage_always_used (void * m
)
816 void **mm
; /* Actually M is a pointer to a pointer to the memory. */
823 /* Following from c-lang.c. */
825 /* Used by c-typeck.c (build_external_ref), but only for objc. */
828 lookup_objc_ivar (tree id ATTRIBUTE_UNUSED
)
833 /* Dummy routines called from c code. Save copying c-decl.c, c-common.c etc. */
836 objc_is_id (tree arg ATTRIBUTE_UNUSED
)
842 check_function_format (int *status ATTRIBUTE_UNUSED
,
843 tree attrs ATTRIBUTE_UNUSED
,
844 tree params ATTRIBUTE_UNUSED
)
849 /* Tell the c code we are not objective C. */
852 objc_comptypes (tree lhs ATTRIBUTE_UNUSED
,
853 tree rhs ATTRIBUTE_UNUSED
,
854 int reflexive ATTRIBUTE_UNUSED
)
859 /* Should not be called for treelang. Needed by RS6000 backend. */
861 int c_lex (tree
*value
);
864 c_lex (tree
*value ATTRIBUTE_UNUSED
)
869 /* Should not be called for treelang. */
872 build_stmt (enum tree_code code ATTRIBUTE_UNUSED
, ...)
877 /* Should not be called for treelang. */
880 add_stmt (tree t ATTRIBUTE_UNUSED
)
885 /* Should not be called for treelang. */
888 build_return_stmt (tree expr ATTRIBUTE_UNUSED
)
893 /* C warning, ignore. */
896 pedwarn_c99 (const char *msgid ATTRIBUTE_UNUSED
, ...)
901 /* Should not be called for treelang. */
904 build_case_label (tree low_value ATTRIBUTE_UNUSED
,
905 tree high_value ATTRIBUTE_UNUSED
,
906 tree label_decl ATTRIBUTE_UNUSED
)
911 /* Should not be called for treelang. */
914 emit_local_var (tree decl ATTRIBUTE_UNUSED
)
919 /* Should not be called for treelang. */
922 expand_stmt (tree t ATTRIBUTE_UNUSED
)
927 /* Should not be called for treelang. */
930 cpp_create_reader (enum c_lang lang ATTRIBUTE_UNUSED
,
931 struct ht
*table ATTRIBUTE_UNUSED
)
936 /* Should not be called for treelang. */
944 /* Should not be called for treelang. */
946 void init_pragma (void);
954 /* Should not be called for treelang. */
957 cpp_finish (cpp_reader
*pfile ATTRIBUTE_UNUSED
, FILE *f ATTRIBUTE_UNUSED
)
962 /* Should not be called for treelang. */
965 cpp_errors (cpp_reader
*pfile ATTRIBUTE_UNUSED
)
970 /* Dummy called by C. */
973 handle_format_attribute (tree
*node ATTRIBUTE_UNUSED
,
974 tree name ATTRIBUTE_UNUSED
,
975 tree args ATTRIBUTE_UNUSED
,
976 int flags ATTRIBUTE_UNUSED
,
977 bool *no_add_attrs ATTRIBUTE_UNUSED
)
982 /* Should not be called for treelang. */
985 handle_format_arg_attribute (tree
*node ATTRIBUTE_UNUSED
,
986 tree name ATTRIBUTE_UNUSED
,
987 tree args ATTRIBUTE_UNUSED
,
988 int flags ATTRIBUTE_UNUSED
,
989 bool *no_add_attrs ATTRIBUTE_UNUSED
)
994 /* Should not be called for treelang. */
997 cpp_assert (cpp_reader
* cr ATTRIBUTE_UNUSED
,
998 const char *s ATTRIBUTE_UNUSED
)
1003 /* Should not be called for treelang. */
1006 set_Wformat (int setting ATTRIBUTE_UNUSED
)
1011 /* Used for objective C. */
1014 objc_check_decl (tree decl ATTRIBUTE_UNUSED
);
1017 objc_check_decl (tree decl ATTRIBUTE_UNUSED
)
1022 /* Tell the c code we are not objective C. */
1025 objc_message_selector (void);
1028 objc_message_selector ()
1033 /* Should not be called for treelang. */
1036 gen_aux_info_record (tree fndecl ATTRIBUTE_UNUSED
,
1037 int is_definition ATTRIBUTE_UNUSED
,
1038 int is_implicit ATTRIBUTE_UNUSED
,
1039 int is_prototyped ATTRIBUTE_UNUSED
)
1044 /* Should not be called for treelang, but it is. */
1052 /* Should not be called for treelang. */
1054 void maybe_apply_pragma_weak (tree decl
);
1057 maybe_apply_pragma_weak (tree decl ATTRIBUTE_UNUSED
)
1062 /* Should not be called for treelang. */
1065 add_decl_stmt (tree decl ATTRIBUTE_UNUSED
)
1070 /* Should not be called for treelang. */
1073 maybe_apply_renaming_pragma (tree decl
, tree asmname
);
1075 /* Should not be called for treelang. */
1078 maybe_apply_renaming_pragma (tree decl ATTRIBUTE_UNUSED
, tree asmname ATTRIBUTE_UNUSED
)
1083 /* Should not be called for treelang. */
1086 begin_stmt_tree (tree
*t ATTRIBUTE_UNUSED
)
1091 /* Should not be called for treelang. */
1094 finish_stmt_tree (tree
*t ATTRIBUTE_UNUSED
)
1099 /* Should not be called for treelang. */
1102 defer_fn (tree fn ATTRIBUTE_UNUSED
)
1107 /* Should not be called for treelang. */
1110 *cpp_get_options (cpp_reader
* cr ATTRIBUTE_UNUSED
)
1115 /* Should not be called for treelang. */
1118 cpp_define (cpp_reader
* cr ATTRIBUTE_UNUSED
, const char * c ATTRIBUTE_UNUSED
)
1123 /* Should not be called for treelang. */
1126 cpp_get_callbacks (cpp_reader
* cr ATTRIBUTE_UNUSED
)
1131 /* Create the predefined scalar types of C,
1132 and some nodes representing standard constants (0, 1, (void *) 0).
1133 Initialize the global binding level.
1134 Make definitions for built-in primitive functions. */
1136 /* `unsigned long' is the standard type for sizeof.
1137 Note that stddef.h uses `unsigned long',
1138 and this must agree, even if long and int are the same size. */
1140 /* The reserved keyword table. */
1144 ENUM_BITFIELD(rid
) rid
: 16;
1145 unsigned int disable
: 16;
1148 static const struct resword reswords
[] =
1150 { "_Bool", RID_BOOL
, 0 },
1151 { "_Complex", RID_COMPLEX
, 0 },
1152 { "__FUNCTION__", RID_FUNCTION_NAME
, 0 },
1153 { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME
, 0 },
1154 { "__alignof", RID_ALIGNOF
, 0 },
1155 { "__alignof__", RID_ALIGNOF
, 0 },
1156 { "__asm", RID_ASM
, 0 },
1157 { "__asm__", RID_ASM
, 0 },
1158 { "__attribute", RID_ATTRIBUTE
, 0 },
1159 { "__attribute__", RID_ATTRIBUTE
, 0 },
1160 { "__builtin_choose_expr", RID_CHOOSE_EXPR
, 0 },
1161 { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P
, 0 },
1162 { "__builtin_va_arg", RID_VA_ARG
, 0 },
1163 { "__complex", RID_COMPLEX
, 0 },
1164 { "__complex__", RID_COMPLEX
, 0 },
1165 { "__const", RID_CONST
, 0 },
1166 { "__const__", RID_CONST
, 0 },
1167 { "__extension__", RID_EXTENSION
, 0 },
1168 { "__func__", RID_C99_FUNCTION_NAME
, 0 },
1169 { "__imag", RID_IMAGPART
, 0 },
1170 { "__imag__", RID_IMAGPART
, 0 },
1171 { "__inline", RID_INLINE
, 0 },
1172 { "__inline__", RID_INLINE
, 0 },
1173 { "__label__", RID_LABEL
, 0 },
1174 { "__ptrbase", RID_PTRBASE
, 0 },
1175 { "__ptrbase__", RID_PTRBASE
, 0 },
1176 { "__ptrextent", RID_PTREXTENT
, 0 },
1177 { "__ptrextent__", RID_PTREXTENT
, 0 },
1178 { "__ptrvalue", RID_PTRVALUE
, 0 },
1179 { "__ptrvalue__", RID_PTRVALUE
, 0 },
1180 { "__real", RID_REALPART
, 0 },
1181 { "__real__", RID_REALPART
, 0 },
1182 { "__restrict", RID_RESTRICT
, 0 },
1183 { "__restrict__", RID_RESTRICT
, 0 },
1184 { "__signed", RID_SIGNED
, 0 },
1185 { "__signed__", RID_SIGNED
, 0 },
1186 { "__typeof", RID_TYPEOF
, 0 },
1187 { "__typeof__", RID_TYPEOF
, 0 },
1188 { "__volatile", RID_VOLATILE
, 0 },
1189 { "__volatile__", RID_VOLATILE
, 0 },
1190 { "asm", RID_ASM
, 0 },
1191 { "auto", RID_AUTO
, 0 },
1192 { "break", RID_BREAK
, 0 },
1193 { "case", RID_CASE
, 0 },
1194 { "char", RID_CHAR
, 0 },
1195 { "const", RID_CONST
, 0 },
1196 { "continue", RID_CONTINUE
, 0 },
1197 { "default", RID_DEFAULT
, 0 },
1198 { "do", RID_DO
, 0 },
1199 { "double", RID_DOUBLE
, 0 },
1200 { "else", RID_ELSE
, 0 },
1201 { "enum", RID_ENUM
, 0 },
1202 { "extern", RID_EXTERN
, 0 },
1203 { "float", RID_FLOAT
, 0 },
1204 { "for", RID_FOR
, 0 },
1205 { "goto", RID_GOTO
, 0 },
1206 { "if", RID_IF
, 0 },
1207 { "inline", RID_INLINE
, 0 },
1208 { "int", RID_INT
, 0 },
1209 { "long", RID_LONG
, 0 },
1210 { "register", RID_REGISTER
, 0 },
1211 { "restrict", RID_RESTRICT
, 0 },
1212 { "return", RID_RETURN
, 0 },
1213 { "short", RID_SHORT
, 0 },
1214 { "signed", RID_SIGNED
, 0 },
1215 { "sizeof", RID_SIZEOF
, 0 },
1216 { "static", RID_STATIC
, 0 },
1217 { "struct", RID_STRUCT
, 0 },
1218 { "switch", RID_SWITCH
, 0 },
1219 { "typedef", RID_TYPEDEF
, 0 },
1220 { "typeof", RID_TYPEOF
, 0 },
1221 { "union", RID_UNION
, 0 },
1222 { "unsigned", RID_UNSIGNED
, 0 },
1223 { "void", RID_VOID
, 0 },
1224 { "volatile", RID_VOLATILE
, 0 },
1225 { "while", RID_WHILE
, 0 },
1227 #define N_reswords (sizeof reswords / sizeof (struct resword))
1229 /* Init enough to allow the C decl code to work, then clean up
1233 treelang_init_decl_processing ()
1238 ridpointers
= (tree
*) ggc_calloc ((int) RID_MAX
, sizeof (tree
));
1240 for (i
= 0; i
< N_reswords
; i
++)
1242 id
= get_identifier (reswords
[i
].word
);
1243 C_RID_CODE (id
) = reswords
[i
].rid
;
1244 C_IS_RESERVED_WORD (id
) = 1;
1245 ridpointers
[(int) reswords
[i
].rid
] = id
;
1248 c_init_decl_processing ();
1250 /* ix86_return_pops_args takes the type of these so need to patch
1251 their own type as themselves. */
1253 for (i
= 0; i
< itk_none
; i
++)
1255 if (integer_types
[i
])
1256 TREE_TYPE (integer_types
[i
]) = integer_types
[i
];
1259 /* Probably these ones too. */
1260 TREE_TYPE (float_type_node
) = float_type_node
;
1261 TREE_TYPE (double_type_node
) = double_type_node
;
1262 TREE_TYPE (long_double_type_node
) = long_double_type_node
;
1266 /* Save typing debug_tree all the time. Dump a tree T pretty and
1277 /* Get a stringpool entry for a string S of length L. This is needed
1278 because the GTY routines don't mark strings, forcing you to put
1279 them into stringpool, which is never freed. */
1282 get_string (const char *s
, size_t l
)
1285 t
= get_identifier_with_length (s
, l
);
1286 return IDENTIFIER_POINTER(t
);