* splay-tree.h (splay_tree_max): New function.
[official-gcc.git] / gcc / ch / lang.c
blob0c493b70bfe887c21a201ffa300e5b8aaab29500
1 /* Language-specific hook definitions for CHILL front end.
2 Copyright (C) 1992, 1993, 1994, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "tree.h"
26 #include "ch-tree.h"
27 #include "lex.h"
28 #include "input.h"
29 #include "toplev.h"
30 #include "rtl.h"
31 #include "expr.h"
33 /* Type node for boolean types. */
35 tree boolean_type_node;
37 /* True if STRING(INDEX) yields a CHARS(1) (or BOOLS(1)) rather than
38 a CHAR (or BOOL). Also, makes CHARS(1) similar for CHAR,
39 and BOOLS(1) similar to BOOL. This is for compatibility
40 for the 1984 version of Z.200.*/
41 int flag_old_strings = 0;
43 /* This is set non-zero to force user input tokens to lower case.
44 This is non-standard. See Z.200, page 8. */
45 int ignore_case = 1;
47 /* True if reserved and predefined words ('special' words in the Z.200
48 terminology) are in uppercase. Obviously, this had better not be
49 true if we're ignoring input case. */
50 int special_UC = 0;
52 /* The actual name of the input file, regardless of any #line directives */
53 const char* chill_real_input_filename;
54 extern FILE* finput;
56 static int deep_const_expr PARAMS ((tree));
57 static void chill_print_error_function PARAMS ((const char *));
59 /* Return 1 if the expression tree given has all
60 constant nodes as its leaves,otherwise. */
62 static int
63 deep_const_expr (exp)
64 tree exp;
66 enum chill_tree_code code;
67 int length;
68 int i;
70 if (exp == NULL_TREE)
71 return 0;
73 code = TREE_CODE (exp);
74 length = first_rtl_op (TREE_CODE (exp));
76 /* constant leaf? return TRUE */
77 if (TREE_CODE_CLASS (code) == 'c')
78 return 1;
80 /* Recursively check next level down. */
81 for (i = 0; i < length; i++)
82 if (! deep_const_expr (TREE_OPERAND (exp, i)))
83 return 0;
84 return 1;
88 tree
89 const_expr (exp)
90 tree exp;
92 if (TREE_CODE (exp) == INTEGER_CST)
93 return exp;
94 if (TREE_CODE (exp) == CONST_DECL)
95 return const_expr (DECL_INITIAL (exp));
96 if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
97 && DECL_INITIAL (exp) != NULL_TREE
98 && TREE_READONLY (exp))
99 return DECL_INITIAL (exp);
100 if (deep_const_expr (exp))
101 return exp;
102 if (TREE_CODE (exp) != ERROR_MARK)
103 error ("non-constant expression");
104 return error_mark_node;
107 /* Each of the functions defined here
108 is an alternative to a function in objc-actions.c. */
110 /* Used by c-lex.c, but only for objc. */
111 tree
112 lookup_interface (arg)
113 tree arg ATTRIBUTE_UNUSED;
115 return 0;
119 maybe_objc_comptypes (lhs, rhs)
120 tree lhs ATTRIBUTE_UNUSED, rhs ATTRIBUTE_UNUSED;
122 return -1;
125 tree
126 maybe_building_objc_message_expr ()
128 return 0;
132 recognize_objc_keyword ()
134 return 0;
137 void
138 lang_init_options ()
142 /* used by print-tree.c */
144 void
145 lang_print_xnode (file, node, indent)
146 FILE *file ATTRIBUTE_UNUSED;
147 tree node ATTRIBUTE_UNUSED;
148 int indent ATTRIBUTE_UNUSED;
153 * process chill-specific compiler command-line options
154 * do not complain if the option is not recognised
157 lang_decode_option (argc, argv)
158 int argc;
159 char **argv;
161 char *p = argv[0];
162 static int explicit_ignore_case = 0;
163 if (!strcmp(p, "-lang-chill"))
164 ; /* do nothing */
165 else if (!strcmp (p, "-fruntime-checking"))
167 range_checking = 1;
168 empty_checking = 1;
170 else if (!strcmp (p, "-fno-runtime-checking"))
172 range_checking = 0;
173 empty_checking = 0;
174 runtime_checking_flag = 0;
176 else if (!strcmp (p, "-flocal-loop-counter"))
177 flag_local_loop_counter = 1;
178 else if (!strcmp (p, "-fno-local-loop-counter"))
179 flag_local_loop_counter = 0;
180 else if (!strcmp (p, "-fold-strings"))
181 flag_old_strings = 1;
182 else if (!strcmp (p, "-fno-old-strings"))
183 flag_old_strings = 0;
184 else if (!strcmp (p, "-fignore-case"))
186 explicit_ignore_case = 1;
187 if (special_UC)
189 error ("Ignoring case upon input and");
190 error ("making special words uppercase wouldn't work.");
192 else
193 ignore_case = 1;
195 else if (!strcmp (p, "-fno-ignore-case"))
196 ignore_case = 0;
197 else if (!strcmp (p, "-fspecial_UC"))
199 if (explicit_ignore_case)
201 error ("Making special words uppercase and");
202 error (" ignoring case upon input wouldn't work.");
204 else
205 special_UC = 1, ignore_case = 0;
207 else if (!strcmp (p, "-fspecial_LC"))
208 special_UC = 0;
209 else if (!strcmp (p, "-fpack"))
210 maximum_field_alignment = BITS_PER_UNIT;
211 else if (!strcmp (p, "-fno-pack"))
212 maximum_field_alignment = 0;
213 else if (!strcmp (p, "-fchill-grant-only"))
214 grant_only_flag = 1;
215 else if (!strcmp (p, "-fgrant-only"))
216 grant_only_flag = 1;
217 /* user has specified a seize-file path */
218 else if (p[0] == '-' && p[1] == 'I')
219 register_seize_path (&p[2]);
220 if (!strcmp(p, "-itu")) /* Force Z.200 semantics */
222 pedantic = 1; /* FIXME: new flag name? */
223 flag_local_loop_counter = 1;
225 else
226 return c_decode_option (argc, argv);
228 return 1;
231 static void
232 chill_print_error_function (file)
233 const char *file;
235 static tree last_error_function = NULL_TREE;
236 static struct module *last_error_module = NULL;
238 if (last_error_function == current_function_decl
239 && last_error_module == current_module)
240 return;
242 last_error_function = current_function_decl;
243 last_error_module = current_module;
245 if (file)
246 fprintf (stderr, "%s: ", file);
248 if (current_function_decl == global_function_decl
249 || current_function_decl == NULL_TREE)
251 if (current_module == NULL)
252 fprintf (stderr, "At top level:\n");
253 else
254 fprintf (stderr, "In module %s:\n",
255 IDENTIFIER_POINTER (current_module->name));
257 else
259 const char *kind = "function";
260 const char *name = (*decl_printable_name) (current_function_decl, 2);
261 fprintf (stderr, "In %s `%s':\n", kind, name);
265 /* Print an error message for invalid use of an incomplete type.
266 VALUE is the expression that was used (or 0 if that isn't known)
267 and TYPE is the type that was invalid. */
269 void
270 incomplete_type_error (value, type)
271 tree value ATTRIBUTE_UNUSED;
272 tree type ATTRIBUTE_UNUSED;
274 error ("internal error - use of undefined type");
277 /* Return the typed-based alias set for T, which may be an expression
278 or a type. Return -1 if we don't do anything special. */
280 HOST_WIDE_INT
281 lang_get_alias_set (t)
282 tree t ATTRIBUTE_UNUSED;
284 /* ??? Need to figure out what the rules are. Certainly we'd need
285 to handle union-like things, and probably variant records.
286 Until then, turn off type-based aliasing completely. */
287 return 0;
290 void
291 lang_init ()
293 chill_real_input_filename = input_filename;
295 /* the beginning of the file is a new line; check for # */
296 /* With luck, we discover the real source file's name from that
297 and put it in input_filename. */
299 ungetc (check_newline (), finput);
301 /* set default grant file */
302 set_default_grant_file ();
304 print_error_function = chill_print_error_function;