OSDN Git Service

* Makefile.in (ch-version.c): Constify a char*.
[pf3gnuchains/gcc-fork.git] / gcc / ch / lang.c
1 /* Language-specific hook definitions for CHILL front end.
2    Copyright (C) 1992, 93, 1994, 1998 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 #include "config.h"
23 #include "system.h"
24 #include "tree.h"
25 #include "ch-tree.h"
26 #include "lex.h"
27 #include "input.h"
28 #include "toplev.h"
29
30 /* Type node for boolean types.  */
31
32 tree boolean_type_node;
33
34 /* True if STRING(INDEX) yields a CHARS(1) (or BOOLS(1)) rather than
35    a CHAR (or BOOL).  Also, makes CHARS(1) similar for CHAR,
36    and BOOLS(1) similar to BOOL.  This is for compatibility
37    for the 1984 version of Z.200.*/
38 int flag_old_strings = 0;
39
40 /* This is set non-zero to force user input tokens to lower case.
41    This is non-standard.  See Z.200, page 8. */
42 int ignore_case = 1;
43
44 /* True if reserved and predefined words ('special' words in the Z.200
45    terminology) are in uppercase.  Obviously, this had better not be 
46    true if we're ignoring input case. */
47 int special_UC = 0;
48
49 /* The actual name of the input file, regardless of any #line directives */
50 char* chill_real_input_filename;
51 extern FILE* finput;
52
53 extern int maximum_field_alignment;
54
55 static int deep_const_expr                      PROTO ((tree));
56 static void chill_print_error_function          PROTO ((const char *));
57 \f
58 /* return 1 if the expression tree given has all
59    constant nodes as its leaves; return 0 otherwise. */
60 static int
61 deep_const_expr (exp)
62      tree exp;
63 {
64   enum chill_tree_code code;
65   int length;
66   int i;
67
68   if (exp == NULL_TREE)
69     return 0;
70
71   code = TREE_CODE (exp);
72   length = tree_code_length[(int) code];
73
74   /* constant leaf?  return TRUE */
75   if (TREE_CODE_CLASS (code) == 'c')
76     return 1;
77
78   /* recursively check next level down */
79   for (i = 0; i < length; i++)
80     if (! deep_const_expr (TREE_OPERAND (exp, i)))
81       return 0;
82   return 1;      
83 }
84
85
86 tree
87 const_expr (exp)
88      tree exp;
89 {
90   if (TREE_CODE (exp) == INTEGER_CST)
91     return exp;
92   if (TREE_CODE (exp) == CONST_DECL)
93     return const_expr (DECL_INITIAL (exp));
94   if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
95       && DECL_INITIAL (exp) != NULL_TREE
96       && TREE_READONLY (exp))
97     return DECL_INITIAL (exp);
98   if (deep_const_expr (exp))
99     return exp;
100   if (TREE_CODE (exp) != ERROR_MARK)
101     error ("non-constant expression");
102   return error_mark_node;
103 }
104
105 /* Each of the functions defined here
106    is an alternative to a function in objc-actions.c.  */
107    
108 /* Used by c-lex.c, but only for objc.  */
109 tree
110 lookup_interface (arg)
111      tree arg ATTRIBUTE_UNUSED;
112 {
113   return 0;
114 }
115
116 int
117 maybe_objc_comptypes (lhs, rhs)
118      tree lhs ATTRIBUTE_UNUSED, rhs ATTRIBUTE_UNUSED;
119 {
120   return -1;
121 }
122
123 tree
124 maybe_building_objc_message_expr ()
125 {
126   return 0;
127 }
128
129 int
130 recognize_objc_keyword ()
131 {
132   return 0;
133 }
134
135 void
136 lang_init_options ()
137 {
138 }
139
140 /* used by print-tree.c */
141
142 void
143 lang_print_xnode (file, node, indent)
144      FILE *file ATTRIBUTE_UNUSED;
145      tree node ATTRIBUTE_UNUSED;
146      int indent ATTRIBUTE_UNUSED;
147 {
148 }
149
150 void
151 GNU_xref_begin ()
152 {
153   fatal ("GCC does not yet support XREF");
154 }
155
156 void
157 GNU_xref_end ()
158 {
159   fatal ("GCC does not yet support XREF");
160 }
161 \f
162 /*
163  * process chill-specific compiler command-line options
164  */
165 int
166 lang_decode_option (argc, argv)
167      int argc;
168      char **argv;
169 {
170   char *p = argv[0];
171   static int explicit_ignore_case = 0;
172   if (!strcmp(p, "-lang-chill"))
173     ; /* do nothing */
174   else if (!strcmp (p, "-fruntime-checking"))
175     {
176       range_checking = 1;
177       empty_checking = 1;
178     }
179   else if (!strcmp (p, "-fno-runtime-checking"))
180     {
181       range_checking = 0;
182       empty_checking = 0;
183       runtime_checking_flag = 0;
184     }
185   else if (!strcmp (p, "-flocal-loop-counter"))
186     flag_local_loop_counter = 1;
187   else if (!strcmp (p, "-fno-local-loop-counter"))
188     flag_local_loop_counter = 0;
189   else if (!strcmp (p, "-fold-strings"))
190     flag_old_strings = 1;
191   else if (!strcmp (p, "-fno-old-strings"))
192     flag_old_strings = 0;
193   else if (!strcmp (p, "-fignore-case"))
194     {
195       explicit_ignore_case = 1;
196       if (special_UC)
197         {
198           error ("Ignoring case upon input and");
199           error ("making special words uppercase wouldn't work.");
200         }
201       else
202         ignore_case = 1;
203     }
204   else if (!strcmp (p, "-fno-ignore-case"))
205     ignore_case = 0;
206   else if (!strcmp (p, "-fspecial_UC"))
207     {
208       if (explicit_ignore_case)
209         {
210           error ("Making special words uppercase and");
211           error (" ignoring case upon input wouldn't work.");
212         }
213       else
214         special_UC = 1, ignore_case = 0;
215     }
216   else if (!strcmp (p, "-fspecial_LC"))
217     special_UC = 0;
218   else if (!strcmp (p, "-fpack"))
219     maximum_field_alignment = BITS_PER_UNIT;
220   else if (!strcmp (p, "-fno-pack"))
221     maximum_field_alignment = 0;
222   else if (!strcmp (p, "-fchill-grant-only"))
223     grant_only_flag = 1;
224   else if (!strcmp (p, "-fgrant-only"))
225     grant_only_flag = 1;
226   /* user has specified a seize-file path */
227   else if (p[0] == '-' && p[1] == 'I')
228     register_seize_path (&p[2]);
229   if (!strcmp(p, "-itu"))        /* Force Z.200 semantics */
230     {
231       pedantic = 1;   /* FIXME: new flag name? */
232       flag_local_loop_counter = 1;      
233     }
234   else
235     return c_decode_option (argc, argv);
236
237   return 1;
238 }
239
240 static void
241 chill_print_error_function (file)
242      const char *file;
243 {
244   static tree last_error_function = NULL_TREE;
245   static struct module *last_error_module = NULL;
246
247   if (last_error_function == current_function_decl
248       && last_error_module == current_module)
249     return;
250
251   last_error_function = current_function_decl;
252   last_error_module = current_module;
253
254   if (file)
255     fprintf (stderr, "%s: ", file);
256
257   if (current_function_decl == global_function_decl
258       || current_function_decl == NULL_TREE)
259     {
260       if (current_module == NULL)
261         fprintf (stderr, "At top level:\n");
262       else
263         fprintf (stderr, "In module %s:\n",
264                  IDENTIFIER_POINTER (current_module->name));
265     }
266   else
267     {
268       char *kind = "function";
269       char *name = (*decl_printable_name) (current_function_decl, 2);
270       fprintf (stderr, "In %s `%s':\n", kind, name);
271     }
272 }
273
274 /* Print an error message for invalid use of an incomplete type.
275    VALUE is the expression that was used (or 0 if that isn't known)
276    and TYPE is the type that was invalid.  */
277
278 void
279 incomplete_type_error (value, type)
280      tree value ATTRIBUTE_UNUSED;
281      tree type ATTRIBUTE_UNUSED;
282 {
283   error ("internal error - use of undefined type");
284 }
285
286 void
287 lang_init ()
288 {
289   chill_real_input_filename = input_filename;
290
291   /* the beginning of the file is a new line; check for # */
292   /* With luck, we discover the real source file's name from that
293      and put it in input_filename.  */
294
295   ungetc (check_newline (), finput);
296
297   /* set default grant file */
298   set_default_grant_file ();
299
300   print_error_function = chill_print_error_function;
301 }