OSDN Git Service

* java-tree.h (finalize_identifier_node): Don't declare.
[pf3gnuchains/gcc-fork.git] / gcc / java / decl.c
1 /* Process declarations and variables for the GNU compiler for the
2    Java(TM) language.
3
4    Copyright (C) 1996, 1998 Free Software Foundation, Inc.
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING.  If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
22
23 Java and all Java-based marks are trademarks or registered trademarks
24 of Sun Microsystems, Inc. in the United States and other countries.
25 The Free Software Foundation is independent of Sun Microsystems, Inc.  */
26
27 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
28
29 #include "config.h"
30 #include "system.h"
31 #include "tree.h"
32 #include "java-tree.h"
33 #include "jcf.h"
34 #include "toplev.h"
35
36 #ifndef INT_TYPE_SIZE
37 #define INT_TYPE_SIZE BITS_PER_WORD
38 #endif
39
40 /* The DECL_MAP is a mapping from (index, type) to a decl node.
41    If index < max_locals, it is the index of a local variable.
42    if index >= max_locals, then index-max_locals is a stack slot.
43    The DECL_MAP mapping is represented as a TREE_VEC whose elements
44    are a list of decls (VAR_DECL or PARM_DECL) chained by
45    DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
46    we search the chain for a decl with a matching TREE_TYPE. */
47
48 tree decl_map;
49
50 /* A list of local variables VAR_DECLs for this method that we have seen
51    debug information, but we have not reached their starting (byte) PC yet. */
52
53 tree pending_local_decls = NULL_TREE;
54
55 /* Push a local variable or stack slot into the decl_map,
56    and assign it an rtl. */
57
58 tree
59 push_jvm_slot (index, decl)
60      int index;
61      tree decl;
62 {
63   struct rtx_def *rtl = NULL;
64   tree type = TREE_TYPE (decl);
65   tree tmp;
66
67   DECL_CONTEXT (decl) = current_function_decl;
68   layout_decl (decl, 0);
69
70   /* See if we have an appropriate rtl (i.e. same mode) at this index.
71      If so, we must use it. */ 
72   tmp = TREE_VEC_ELT (decl_map, index);
73   while (tmp != NULL_TREE)
74     {
75       if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)))
76         rtl = DECL_RTL (tmp);
77       if (rtl != NULL)
78         break;
79      tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
80     }
81   if (rtl != NULL)
82     DECL_RTL (decl) = rtl;
83   else
84     {
85       if (index >= DECL_MAX_LOCALS (current_function_decl))
86         DECL_REGISTER (decl) = 1;
87       expand_decl (decl);
88     }
89
90   /* Now link the decl into the decl_map. */
91   if (DECL_LANG_SPECIFIC (decl) == NULL)
92     {
93       DECL_LANG_SPECIFIC (decl)
94         = (struct lang_decl *) permalloc (sizeof (struct lang_decl_var));
95       DECL_LOCAL_START_PC (decl) = 0;
96       DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
97       DECL_LOCAL_SLOT_NUMBER (decl) = index;
98     }
99   DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
100   TREE_VEC_ELT (decl_map, index) = decl;
101   return decl;
102 }
103
104 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
105    that is valid at PC (or -1 if any pc).
106    If there is no existing matching decl, allocate one.
107    If we find a decl with matching modes but different types,
108    we re-use the rtl, but create a new decl. */
109
110 tree
111 find_local_variable (index, type, pc)
112      int index;
113      tree type;
114      int pc;
115 {
116   struct rtx_def *rtl = NULL;
117   tree decl = TREE_VEC_ELT (decl_map, index);
118   tree best = NULL_TREE;
119   while (decl != NULL_TREE)
120     {
121       int in_range;
122       in_range = pc < 0
123         || (pc >= DECL_LOCAL_START_PC (decl)
124             && pc < DECL_LOCAL_END_PC (decl));
125
126       if ((TREE_TYPE (decl) == type
127            || (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
128                && type == ptr_type_node))
129            && in_range)
130         {
131           if (best == NULL_TREE
132               || (TREE_TYPE (decl) == type && TREE_TYPE (best) != type)
133               || DECL_LOCAL_START_PC (decl) > DECL_LOCAL_START_PC (best)
134               || DECL_LOCAL_END_PC (decl) < DECL_LOCAL_START_PC (decl))
135             best = decl;
136         }
137       decl = DECL_LOCAL_SLOT_CHAIN (decl);
138     }
139   if (best != NULL_TREE)
140     return best;
141   return push_jvm_slot (index, build_decl (VAR_DECL, NULL_TREE, type));
142 }
143
144
145 /* Same as find_local_index, except that INDEX is a stack index. */
146
147 tree
148 find_stack_slot (index, type)
149      int index;
150      tree type;
151 {
152   return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
153                               type, -1);
154 }
155
156 struct binding_level
157   {
158     /* A chain of _DECL nodes for all variables, constants, functions,
159      * and typedef types.  These are in the reverse of the order supplied.
160      */
161     tree names;
162
163     /* For each level, a list of shadowed outer-level local definitions
164        to be restored when this level is popped.
165        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
166        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
167     tree shadowed;
168
169     /* For each level (except not the global one),
170        a chain of BLOCK nodes for all the levels
171        that were entered and exited one level down.  */
172     tree blocks;
173
174     /* The BLOCK node for this level, if one has been preallocated.
175        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
176     tree this_block;
177
178     /* The binding level which this one is contained in (inherits from).  */
179     struct binding_level *level_chain;
180
181     /* 1 means make a BLOCK for this level regardless of all else.
182        2 for temporary binding contours created by the compiler.  */
183     char keep;
184
185     /* Nonzero means make a BLOCK if this level has any subblocks.  */
186     char keep_if_subblocks;
187
188     /* Nonzero if this level can safely have additional
189        cleanup-needing variables added to it.  */
190     char more_cleanups_ok;
191     char have_cleanups;
192
193     /* The bytecode PC that marks the end of this level. */
194     int end_pc;
195   };
196
197 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
198
199 /* The binding level currently in effect.  */
200
201 static struct binding_level *current_binding_level;
202
203 /* A chain of binding_level structures awaiting reuse.  */
204
205 static struct binding_level *free_binding_level;
206
207 /* The outermost binding level, for names of file scope.
208    This is created when the compiler is started and exists
209    through the entire run.  */
210
211 static struct binding_level *global_binding_level;
212
213 /* Binding level structures are initialized by copying this one.  */
214
215 static struct binding_level clear_binding_level
216   = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
217        NULL_BINDING_LEVEL, 0, 0, 0, 0, 1000000000};
218
219 #if 0
220 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
221    that have names.  Here so we can clear out their names' definitions
222    at the end of the function.  */
223
224 static tree named_labels;
225
226 /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
227
228 static tree shadowed_labels;
229 #endif
230
231 int flag_traditional;
232
233 /* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
234
235 static int keep_next_level_flag;
236
237 /* Nonzero means make a BLOCK for the next level pushed
238    if it has subblocks.  */
239
240 static int keep_next_if_subblocks;
241   
242 /* The FUNCTION_DECL for the function currently being compiled,
243    or 0 if between functions.  */
244 tree current_function_decl;
245
246 /* The type node for the ordinary character type.  */
247 tree char_type_node;
248
249 tree object_type_node;
250 tree object_ptr_type_node;
251 tree string_type_node;
252 tree throwable_type_node;
253 tree runtime_exception_type_node;
254 tree error_exception_type_node;
255
256 tree boolean_type_node;
257
258 tree float_type_node;
259 tree double_type_node;
260
261 /* a VOID_TYPE node.  */
262
263 tree void_type_node;
264 tree ptr_type_node;
265 tree return_address_type_node;
266
267 tree integer_type_node;
268
269 tree byte_type_node;
270 tree short_type_node;
271 tree int_type_node;
272 tree long_type_node;
273
274 tree promoted_byte_type_node;
275 tree promoted_short_type_node;
276 tree promoted_char_type_node;
277 tree promoted_boolean_type_node;
278
279 tree unsigned_byte_type_node;
280 tree unsigned_short_type_node;
281 tree unsigned_int_type_node;
282 tree unsigned_long_type_node;
283
284 /* The type for struct methodtable. */
285 tree methodtable_type;
286 tree methodtable_ptr_type;
287
288 tree utf8const_type;
289 tree utf8const_ptr_type;
290 tree class_type_node;
291 tree class_ptr_type;
292 tree field_type_node;
293 tree field_ptr_type_node;
294 tree field_info_union_node;
295 tree jexception_type;
296 tree jexception_ptr_type;
297 tree lineNumberEntry_type;
298 tree lineNumbers_type;
299 tree constants_type_node;
300 tree dtable_type;
301 tree dtable_ptr_type;
302 tree method_type_node;
303 tree method_ptr_type_node;
304 tree nativecode_ptr_array_type_node;
305 tree one_elt_array_domain_type;
306 tree access_flags_type_node;
307 tree class_dtable_decl;
308
309 /* a node which has tree code ERROR_MARK, and whose type is itself.
310    All erroneous expressions are replaced with this node.  All functions
311    that accept nodes as arguments should avoid generating error messages
312    if this node is one of the arguments, since it is undesirable to get
313    multiple error messages from one error in the input.  */
314
315 tree error_mark_node;
316
317 /* Two expressions that are constants with value zero.
318    The first is of type `int', the second of type `void *'.  */
319 tree integer_zero_node;
320 tree null_pointer_node;
321
322 /* Nodes for boolean constants TRUE and FALSE. */
323 tree boolean_true_node, boolean_false_node;
324
325 tree TYPE_identifier_node;
326 tree init_identifier_node;
327 tree clinit_identifier_node;
328 tree void_signature_node;
329 tree length_identifier_node;
330 tree this_identifier_node;
331 tree super_identifier_node;
332
333 /* References to internal libjava functions we use. */
334 tree alloc_object_node;
335 tree soft_instanceof_node;
336 tree soft_checkcast_node;
337 tree soft_initclass_node;
338 tree soft_newarray_node;
339 tree soft_anewarray_node;
340 tree soft_multianewarray_node;
341 tree soft_badarrayindex_node;
342 tree throw_node;
343 tree soft_checkarraystore_node;
344 tree soft_monitorenter_node;
345 tree soft_monitorexit_node;
346 tree soft_lookupinterfacemethod_node;
347 tree soft_fmod_node;
348 tree soft_exceptioninfo_call_node;
349
350 /* Build (and pushdecl) a "promoted type" for all standard
351    types shorter than int.  */
352
353 static tree
354 push_promoted_type (name, actual_type)
355      char *name;
356      tree actual_type;
357 {
358   tree type = make_node (TREE_CODE (actual_type));
359 #if 1
360   tree in_min = TYPE_MIN_VALUE (int_type_node);
361   tree in_max = TYPE_MAX_VALUE (int_type_node);
362 #else
363   tree in_min = TYPE_MIN_VALUE (actual_type);
364   tree in_max = TYPE_MAX_VALUE (actual_type);
365 #endif
366   TYPE_MIN_VALUE (type) = build_int_2 (TREE_INT_CST_LOW (in_min),
367                                        TREE_INT_CST_HIGH (in_min));
368   TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
369   TYPE_MAX_VALUE (type) = build_int_2 (TREE_INT_CST_LOW (in_max),
370                                        TREE_INT_CST_HIGH (in_max));
371   TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
372   TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
373   layout_type (type);
374   pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
375   return type;
376 }
377
378 /* Nodes for integer constants.  */
379 tree integer_one_node, integer_two_node, integer_four_node;
380 tree integer_negative_one_node;
381
382 /* Return a definition for a builtin function named NAME and whose data type
383    is TYPE.  TYPE should be a function type with argument types.
384    FUNCTION_CODE tells later passes how to compile calls to this function.
385    See tree.h for its possible values.
386
387    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
388    the name to be called if we can't opencode the function.  */
389
390 tree
391 builtin_function (name, type, function_code, library_name)
392      char *name;
393      tree type;
394      enum built_in_function function_code;
395      char *library_name;
396 {
397   tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
398   DECL_EXTERNAL (decl) = 1;
399   TREE_PUBLIC (decl) = 1;
400   if (library_name)
401     DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
402   make_decl_rtl (decl, NULL_PTR, 1);
403   pushdecl (decl);
404   if (function_code != NOT_BUILT_IN)
405     {
406       DECL_BUILT_IN (decl) = 1;
407       DECL_FUNCTION_CODE (decl) = function_code;
408     }
409   return decl;
410 }
411
412 void
413 init_decl_processing ()
414 {
415   tree field;
416   tree t;
417
418   current_function_decl = NULL;
419   current_binding_level = NULL_BINDING_LEVEL;
420   free_binding_level = NULL_BINDING_LEVEL;
421   pushlevel (0);        /* make the binding_level structure for global names */
422   global_binding_level = current_binding_level;
423
424   error_mark_node = make_node (ERROR_MARK);
425   TREE_TYPE (error_mark_node) = error_mark_node;
426
427   /* Create sizetype first - needed for other types. */
428   sizetype = make_unsigned_type (POINTER_SIZE);
429   size_zero_node = build_int_2 (0, 0);
430   TREE_TYPE (size_zero_node) = sizetype;
431   size_one_node = build_int_2 (1, 0);
432   TREE_TYPE (size_one_node) = sizetype;
433
434   byte_type_node = make_signed_type (8);
435   pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
436   short_type_node = make_signed_type (16);
437   pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
438   int_type_node = make_signed_type (32);
439   pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
440   long_type_node = make_signed_type (64);
441   pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
442
443   unsigned_byte_type_node = make_unsigned_type (8);
444   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
445                         unsigned_byte_type_node));
446   unsigned_short_type_node = make_unsigned_type (16);
447   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
448                         unsigned_short_type_node));
449   unsigned_int_type_node = make_unsigned_type (32);
450   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
451                         unsigned_int_type_node));
452   unsigned_long_type_node = make_unsigned_type (64);
453   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
454                         unsigned_long_type_node));
455
456   integer_type_node = type_for_size (INT_TYPE_SIZE, 0);
457
458   integer_zero_node = build_int_2 (0, 0);
459   integer_one_node = build_int_2 (1, 0);
460   integer_two_node = build_int_2 (2, 0);
461   integer_four_node = build_int_2 (4, 0);
462   integer_negative_one_node = build_int_2 (-1, 0);
463
464   void_type_node = make_node (VOID_TYPE);
465   pushdecl (build_decl (TYPE_DECL, get_identifier ("void"), void_type_node));
466   layout_type (void_type_node); /* Uses size_zero_node */
467   ptr_type_node = build_pointer_type (void_type_node);
468   t = make_node (VOID_TYPE);
469   layout_type (t); /* Uses size_zero_node */
470   return_address_type_node = build_pointer_type (t);
471
472   null_pointer_node = build_int_2 (0, 0);
473   TREE_TYPE (null_pointer_node) = ptr_type_node;
474
475 #if 0
476   /* Make a type to be the domain of a few array types
477      whose domains don't really matter.
478      200 is small enough that it always fits in size_t
479      and large enough that it can hold most function names for the
480      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
481   short_array_type_node = build_prim_array_type (short_type_node, 200);
482 #endif
483   char_type_node = make_node (CHAR_TYPE);
484   TYPE_PRECISION (char_type_node) = 16;
485   fixup_unsigned_type (char_type_node);
486   pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
487
488   boolean_type_node = make_node (BOOLEAN_TYPE);
489   TYPE_PRECISION (boolean_type_node) = 1;
490   fixup_unsigned_type (boolean_type_node);
491   pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
492                         boolean_type_node));
493   boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
494   boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
495
496   promoted_byte_type_node
497     = push_promoted_type ("promoted_byte", byte_type_node);
498   promoted_short_type_node
499     = push_promoted_type ("promoted_short", short_type_node);
500   promoted_char_type_node
501     = push_promoted_type ("promoted_char", char_type_node);
502   promoted_boolean_type_node
503     = push_promoted_type ("promoted_boolean", boolean_type_node);
504
505   float_type_node = make_node (REAL_TYPE);
506   TYPE_PRECISION (float_type_node) = 32;
507   pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
508                         float_type_node));
509   layout_type (float_type_node);
510
511   double_type_node = make_node (REAL_TYPE);
512   TYPE_PRECISION (double_type_node) = 64;
513   pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
514                         double_type_node));
515   layout_type (double_type_node);
516
517   object_type_node = lookup_class (get_identifier ("java.lang.Object"));
518   object_ptr_type_node = promote_type (object_type_node);
519   string_type_node = lookup_class (get_identifier ("java.lang.String"));
520   class_type_node = lookup_class (get_identifier ("java.lang.Class"));
521   throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
522   runtime_exception_type_node = 
523     lookup_class (get_identifier ("java.lang.RuntimeException"));
524   error_exception_type_node = 
525     lookup_class (get_identifier ("java.lang.Error"));
526
527   methodtable_type = make_node (RECORD_TYPE);
528   layout_type (methodtable_type);
529   pushdecl (build_decl (TYPE_DECL, get_identifier ("methodtable"),
530                         methodtable_type));
531   methodtable_ptr_type = build_pointer_type (methodtable_type);
532
533   TYPE_identifier_node = get_identifier ("TYPE");
534   init_identifier_node = get_identifier ("<init>");
535   clinit_identifier_node = get_identifier ("<clinit>");
536   void_signature_node = get_identifier ("()V");
537   length_identifier_node = get_identifier ("length");
538   this_identifier_node = get_identifier ("this");
539   super_identifier_node = get_identifier ("super");
540
541   /* for lack of a better place to put this stub call */
542   init_expr_processing();
543
544   utf8const_type = make_node (RECORD_TYPE);
545   PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
546   PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
547   FINISH_RECORD (utf8const_type);
548   utf8const_ptr_type = build_pointer_type (utf8const_type);
549
550   constants_type_node = make_node (RECORD_TYPE);
551   PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
552   PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
553   PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
554   FINISH_RECORD (constants_type_node);
555   pushdecl (build_decl (TYPE_DECL, get_identifier ("constants"),
556                         constants_type_node));
557
558   access_flags_type_node = unsigned_short_type_node;
559
560   dtable_type = make_node (RECORD_TYPE);
561   dtable_ptr_type = build_pointer_type (dtable_type);
562
563   PUSH_FIELD (object_type_node, field, "dtable", dtable_ptr_type);
564   PUSH_FIELD (object_type_node, field, "sync_info", ptr_type_node);
565   for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
566     FIELD_PRIVATE (t) = 1;
567   FINISH_RECORD (object_type_node);
568
569   class_dtable_decl = build_dtable_decl (class_type_node);
570   TREE_STATIC (class_dtable_decl) = 1;
571   DECL_ARTIFICIAL (class_dtable_decl) = 1;
572   DECL_IGNORED_P (class_dtable_decl) = 1;
573   rest_of_decl_compilation (class_dtable_decl, (char*) 0, 1, 0);
574
575   field_type_node = make_node (RECORD_TYPE);
576   field_ptr_type_node = build_pointer_type (field_type_node);
577   method_type_node = make_node (RECORD_TYPE);
578   method_ptr_type_node = build_pointer_type (method_type_node);
579
580   set_super_info (0, class_type_node, object_type_node, 0);
581   set_super_info (0, string_type_node, object_type_node, 0);
582   class_ptr_type = build_pointer_type (class_type_node);
583
584   PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
585   PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
586   PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
587   PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
588   PUSH_FIELD (class_type_node, field, "subclass_head", class_ptr_type);
589   PUSH_FIELD (class_type_node, field, "subclass_next", class_ptr_type);
590   PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
591   PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
592   PUSH_FIELD (class_type_node, field, "nmethods", short_type_node);
593   PUSH_FIELD (class_type_node, field, "msize", short_type_node);
594   PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
595   PUSH_FIELD (class_type_node, field, "bfsize", int_type_node);
596   PUSH_FIELD (class_type_node, field, "nfields", short_type_node);
597   PUSH_FIELD (class_type_node, field, "nsfields", short_type_node);
598   PUSH_FIELD (class_type_node, field, "dtable", dtable_ptr_type);
599   PUSH_FIELD (class_type_node, field, "interfaces",
600               build_pointer_type (class_ptr_type));
601   PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
602   PUSH_FIELD (class_type_node, field, "interface_len", short_type_node);
603   PUSH_FIELD (class_type_node, field, "state", byte_type_node);
604   PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
605   for (t = TYPE_FIELDS (class_type_node);  t != NULL_TREE;  t = TREE_CHAIN (t))
606     FIELD_PRIVATE (t) = 1;
607   push_super_field (class_type_node, object_type_node);
608   FINISH_RECORD (class_type_node);
609   pushdecl (build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node));
610
611   field_info_union_node = make_node (UNION_TYPE);
612   PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
613   PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
614 #if 0
615   PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
616 #endif
617   layout_type (field_info_union_node);
618
619   PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
620   PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
621   PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
622   PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
623   PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
624   FINISH_RECORD (field_type_node);
625   CLASS_LOADED_P (field_type_node) = 1;
626   pushdecl (build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node));
627
628   one_elt_array_domain_type = build_index_type (integer_one_node);
629   nativecode_ptr_array_type_node
630     = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
631
632   PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
633   PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
634   FINISH_RECORD (dtable_type);
635   pushdecl (build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type));
636
637 #define jint_type int_type_node
638 #define jint_ptr_type ptr_type_node
639
640   jexception_type = make_node (RECORD_TYPE);
641   PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
642   PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
643   PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
644   PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
645   FINISH_RECORD (jexception_type);
646   pushdecl (build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node));
647   jexception_ptr_type = build_pointer_type (jexception_type);
648
649   lineNumberEntry_type = make_node (RECORD_TYPE);
650   PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
651   PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
652   FINISH_RECORD (lineNumberEntry_type);
653
654   lineNumbers_type = make_node (RECORD_TYPE);
655   PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
656   FINISH_RECORD (lineNumbers_type);
657
658 #define instn_ptr_type_node ptr_type_node       /* XXX JH */
659
660 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
661
662   PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
663   PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
664   PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
665   PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
666   FINISH_RECORD (method_type_node);
667   CLASS_LOADED_P (method_type_node) = 1;
668   pushdecl (build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node));
669
670   t = tree_cons (NULL_TREE, class_ptr_type,
671                  build_tree_list (NULL_TREE, int_type_node));
672   alloc_object_node = builtin_function ("_Jv_AllocObject",
673                                         build_function_type (ptr_type_node, t),
674                                         NOT_BUILT_IN, NULL_PTR);
675   soft_initclass_node = builtin_function ("_Jv_InitClass",
676                                           build_function_type (void_type_node,
677                                                                t),
678                                           NOT_BUILT_IN, NULL_PTR);
679   t = build_tree_list (NULL_TREE, void_type_node);
680   throw_node = builtin_function ("_Jv_Throw",
681                                  build_function_type (ptr_type_node, t),
682                                  NOT_BUILT_IN, NULL_PTR);
683   soft_monitorenter_node 
684       = builtin_function ("_Jv_MonitorEnter",
685                           build_function_type (int_type_node, t),
686                           NOT_BUILT_IN, NULL_PTR);
687   soft_monitorexit_node 
688       = builtin_function ("_Jv_MonitorExit",
689                           build_function_type (int_type_node, t),
690                           NOT_BUILT_IN, NULL_PTR);
691   
692   t = tree_cons (NULL_TREE, int_type_node, 
693                  build_tree_list (NULL_TREE, int_type_node));
694   soft_newarray_node
695       = builtin_function ("_Jv_NewArray",
696                           build_function_type(ptr_type_node, t),
697                           NOT_BUILT_IN, NULL_PTR );
698
699   t = tree_cons (NULL_TREE, int_type_node,
700                  tree_cons (NULL_TREE, class_ptr_type,
701                             build_tree_list (NULL_TREE, 
702                                              object_ptr_type_node)));
703   soft_anewarray_node
704       = builtin_function ("_Jv_NewObjectArray",
705                           build_function_type (ptr_type_node, t),
706                           NOT_BUILT_IN, NULL_PTR );
707
708   t = tree_cons (NULL_TREE, ptr_type_node,
709                  build_tree_list (NULL_TREE, int_type_node));
710   soft_multianewarray_node
711       = builtin_function ("_Jv_NewMultiArray",
712                           build_function_type (ptr_type_node, t),
713                           NOT_BUILT_IN, NULL_PTR );
714
715   t = build_function_type (void_type_node, 
716                            build_tree_list (NULL_TREE, int_type_node));
717   soft_badarrayindex_node
718       = builtin_function ("_Jv_ThrowBadArrayIndex", t, 
719                           NOT_BUILT_IN, NULL_PTR);
720   TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
721   TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
722
723   t = tree_cons (NULL_TREE, class_ptr_type,
724                  build_tree_list (NULL_TREE, object_ptr_type_node));
725   soft_checkcast_node
726     = builtin_function ("_Jv_CheckCast",
727                         build_function_type (ptr_type_node, t),
728                         NOT_BUILT_IN, NULL_PTR);
729   t = tree_cons (NULL_TREE, object_ptr_type_node,
730                  build_tree_list (NULL_TREE, class_ptr_type));
731   soft_instanceof_node
732     = builtin_function ("_Jv_IsInstanceOf",
733                         build_function_type (promoted_boolean_type_node, t),
734                         NOT_BUILT_IN, NULL_PTR);
735   t = tree_cons (NULL_TREE, object_ptr_type_node,
736                  build_tree_list (NULL_TREE, object_ptr_type_node));
737   soft_checkarraystore_node
738     = builtin_function ("_Jv_CheckArrayStore",
739                         build_function_type (void_type_node, t),
740                         NOT_BUILT_IN, NULL_PTR);
741   t = tree_cons (NULL_TREE, ptr_type_node,
742                  tree_cons (NULL_TREE, ptr_type_node,
743                             build_tree_list (NULL_TREE, ptr_type_node)));
744   soft_lookupinterfacemethod_node 
745     = builtin_function ("_Jv_LookupInterfaceMethod",
746                         build_function_type (ptr_type_node, t),
747                         NOT_BUILT_IN, NULL_PTR);
748   t = tree_cons (NULL_TREE, double_type_node,
749                  build_tree_list (NULL_TREE, double_type_node));
750   soft_fmod_node
751     = builtin_function ("__builtin_fmod",
752                         build_function_type (double_type_node, t),
753                         BUILT_IN_FMOD, "fmod");
754
755   t = build_tree_list (NULL_TREE, void_type_node);
756   soft_exceptioninfo_call_node
757     = build (CALL_EXPR, 
758              ptr_type_node,
759              build_address_of 
760                (builtin_function ("_Jv_exception_info", 
761                                   build_function_type (ptr_type_node, t),
762                                   NOT_BUILT_IN, NULL_PTR)),
763              NULL_TREE, NULL_TREE);
764   TREE_SIDE_EFFECTS (soft_exceptioninfo_call_node) = 1;
765 #if 0
766   t = tree_cons (NULL_TREE, float_type_node,
767                  build_tree_list (NULL_TREE, float_type_node));
768   soft_fmodf_node
769     = builtin_function ("__builtin_fmodf",
770                         build_function_type (float_type_node, t),
771                         BUILT_IN_FMOD, "fmodf");
772 #endif
773     
774   init_class_processing ();
775 }
776
777
778 /* Look up NAME in the current binding level and its superiors
779    in the namespace of variables, functions and typedefs.
780    Return a ..._DECL node of some kind representing its definition,
781    or return 0 if it is undefined.  */
782
783 tree
784 lookup_name (name)
785      tree name;
786 {
787   register tree val;
788   if (current_binding_level != global_binding_level
789       && IDENTIFIER_LOCAL_VALUE (name))
790     val = IDENTIFIER_LOCAL_VALUE (name);
791   else
792     val = IDENTIFIER_GLOBAL_VALUE (name);
793   return val;
794 }
795
796 /* Similar to `lookup_name' but look only at current binding level and
797    the previous one if its the parameter level.  */
798
799 tree
800 lookup_name_current_level (name)
801      tree name;
802 {
803   register tree t;
804
805   if (current_binding_level == global_binding_level)
806     return IDENTIFIER_GLOBAL_VALUE (name);
807
808   if (IDENTIFIER_LOCAL_VALUE (name) == 0)
809     return 0;
810
811   for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
812     if (DECL_NAME (t) == name)
813       break;
814
815   return t;
816 }
817
818 /* Use a binding level to record a labeled block declaration */
819
820 void
821 push_labeled_block (lb)
822     tree lb;
823 {
824   register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
825   register struct binding_level *b = current_binding_level;
826   tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
827   if (oldlocal != 0)
828       b->shadowed = tree_cons (name, oldlocal, b->shadowed);
829   TREE_CHAIN (lb) = b->names;
830   b->names = lb;
831   IDENTIFIER_LOCAL_VALUE (name) = lb;
832 }
833
834 /* Pop the current binding level, reinstalling values for the previous
835    labeled block */
836
837 void
838 pop_labeled_block ()
839 {
840   struct binding_level *b = current_binding_level;
841   tree label =  b->names;
842   IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) = 
843     NULL_TREE;
844   if (b->shadowed)
845     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) = 
846       TREE_VALUE (b->shadowed);
847
848   /* Pop the current level, and free the structure for reuse.  */
849   current_binding_level = current_binding_level->level_chain;
850   b->level_chain = free_binding_level;
851   free_binding_level = b;
852 }
853
854 /* Record a decl-node X as belonging to the current lexical scope.
855    Check for errors (such as an incompatible declaration for the same
856    name already seen in the same scope).
857
858    Returns either X or an old decl for the same name.
859    If an old decl is returned, it may have been smashed
860    to agree with what X says.  */
861
862 tree
863 pushdecl (x)
864      tree x;
865 {
866   register tree t;
867   register tree name = DECL_NAME (x);
868   register struct binding_level *b = current_binding_level;
869
870   DECL_CONTEXT (x) = current_function_decl;
871   if (name)
872     {
873       char *file;
874       int line;
875       int different_binding_level = 0;
876
877       t = lookup_name_current_level (name);
878       if (t != 0 && t == error_mark_node)
879         /* error_mark_node is 0 for a while during initialization!  */
880         {
881           t = 0;
882           error_with_decl (x, "`%s' used prior to declaration");
883         }
884
885       if (t != 0)
886         {
887           file = DECL_SOURCE_FILE (t);
888           line = DECL_SOURCE_LINE (t);
889         }
890
891       /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
892          to point to the TYPE_DECL.
893          Since Java does not have typedefs, a type can only have
894          one (true) name, given by a class, interface, or builtin. */
895       if (TREE_CODE (x) == TYPE_DECL
896           && TYPE_NAME (TREE_TYPE (x)) == 0
897           && TREE_TYPE (x) != error_mark_node)
898         {
899           TYPE_NAME (TREE_TYPE (x)) = x;
900           TYPE_STUB_DECL (TREE_TYPE (x)) = x;
901         }
902
903       /* This name is new in its binding level.
904          Install the new declaration and return it.  */
905       if (b == global_binding_level)
906         {
907           /* Install a global value.  */
908           
909           IDENTIFIER_GLOBAL_VALUE (name) = x;
910         }
911       else
912         {
913           /* Here to install a non-global value.  */
914           tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
915           tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
916           IDENTIFIER_LOCAL_VALUE (name) = x;
917
918 #if 0
919           /* Warn if shadowing an argument at the top level of the body.  */
920           if (oldlocal != 0 && !DECL_EXTERNAL (x)
921               /* This warning doesn't apply to the parms of a nested fcn.  */
922               && ! current_binding_level->parm_flag
923               /* Check that this is one level down from the parms.  */
924               && current_binding_level->level_chain->parm_flag
925               /* Check that the decl being shadowed
926                  comes from the parm level, one level up.  */
927               && chain_member (oldlocal, current_binding_level->level_chain->names))
928             {
929               if (TREE_CODE (oldlocal) == PARM_DECL)
930                 pedwarn ("declaration of `%s' shadows a parameter",
931                          IDENTIFIER_POINTER (name));
932               else
933                 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
934                          IDENTIFIER_POINTER (name));
935             }
936
937           /* Maybe warn if shadowing something else.  */
938           else if (warn_shadow && !DECL_EXTERNAL (x)
939                    /* No shadow warnings for internally generated vars.  */
940                    && DECL_SOURCE_LINE (x) != 0
941                    /* No shadow warnings for vars made for inlining.  */
942                    && ! DECL_FROM_INLINE (x))
943             {
944               char *warnstring = 0;
945
946               if (TREE_CODE (x) == PARM_DECL
947                   && current_binding_level->level_chain->parm_flag)
948                 /* Don't warn about the parm names in function declarator
949                    within a function declarator.
950                    It would be nice to avoid warning in any function
951                    declarator in a declaration, as opposed to a definition,
952                    but there is no way to tell it's not a definition.  */
953                 ;
954               else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
955                 warnstring = "declaration of `%s' shadows a parameter";
956               else if (oldlocal != 0)
957                 warnstring = "declaration of `%s' shadows previous local";
958               else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
959                        && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
960                 warnstring = "declaration of `%s' shadows global declaration";
961
962               if (warnstring)
963                 warning (warnstring, IDENTIFIER_POINTER (name));
964             }
965 #endif
966
967           /* If storing a local value, there may already be one (inherited).
968              If so, record it for restoration when this binding level ends.  */
969           if (oldlocal != 0)
970             b->shadowed = tree_cons (name, oldlocal, b->shadowed);
971         }
972     }
973
974   /* Put decls on list in reverse order.
975      We will reverse them later if necessary.  */
976   TREE_CHAIN (x) = b->names;
977   b->names = x;
978
979   return x;
980 }
981 void
982 pushdecl_force_head (x)
983      tree x;
984 {
985   current_binding_level->names = x;
986 }
987
988 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate.  */
989
990 tree
991 pushdecl_top_level (x)
992      tree x;
993 {
994   register tree t;
995   register struct binding_level *b = current_binding_level;
996
997   current_binding_level = global_binding_level;
998   t = pushdecl (x);
999   current_binding_level = b;
1000   return t;
1001 }
1002
1003 /* Nonzero if we are currently in the global binding level.  */
1004
1005 int
1006 global_bindings_p ()
1007 {
1008   return current_binding_level == global_binding_level;
1009 }
1010
1011 /* Return the list of declarations of the current level.
1012    Note that this list is in reverse order unless/until
1013    you nreverse it; and when you do nreverse it, you must
1014    store the result back using `storedecls' or you will lose.  */
1015
1016 tree
1017 getdecls ()
1018 {
1019   return current_binding_level->names;
1020 }
1021
1022 /* Create a new `struct binding_level'.  */
1023
1024 static
1025 struct binding_level *
1026 make_binding_level ()
1027 {
1028   /* NOSTRICT */
1029   return (struct binding_level *) xmalloc (sizeof (struct binding_level));
1030 }
1031
1032 void
1033 pushlevel (unused)
1034      int unused;
1035 {
1036   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1037
1038 #if 0
1039   /* If this is the top level of a function,
1040      just make sure that NAMED_LABELS is 0.  */
1041
1042   if (current_binding_level == global_binding_level)
1043     named_labels = 0;
1044 #endif
1045
1046   /* Reuse or create a struct for this binding level.  */
1047
1048   if (free_binding_level)
1049     {
1050       newlevel = free_binding_level;
1051       free_binding_level = free_binding_level->level_chain;
1052     }
1053   else
1054     {
1055       newlevel = make_binding_level ();
1056     }
1057
1058   /* Add this level to the front of the chain (stack) of levels that
1059      are active.  */
1060
1061   *newlevel = clear_binding_level;
1062   newlevel->level_chain = current_binding_level;
1063   current_binding_level = newlevel;
1064   newlevel->keep = keep_next_level_flag;
1065   keep_next_level_flag = 0;
1066   newlevel->keep_if_subblocks = keep_next_if_subblocks;
1067   keep_next_if_subblocks = 0;
1068 }
1069
1070 /* Exit a binding level.
1071    Pop the level off, and restore the state of the identifier-decl mappings
1072    that were in effect when this level was entered.
1073
1074    If KEEP is nonzero, this level had explicit declarations, so
1075    and create a "block" (a BLOCK node) for the level
1076    to record its declarations and subblocks for symbol table output.
1077
1078    If FUNCTIONBODY is nonzero, this level is the body of a function,
1079    so create a block as if KEEP were set and also clear out all
1080    label names.
1081
1082    If REVERSE is nonzero, reverse the order of decls before putting
1083    them into the BLOCK.  */
1084
1085 tree
1086 poplevel (keep, reverse, functionbody)
1087      int keep;
1088      int reverse;
1089      int functionbody;
1090 {
1091   register tree link;
1092   /* The chain of decls was accumulated in reverse order.
1093      Put it into forward order, just for cleanliness.  */
1094   tree decls;
1095   tree subblocks = current_binding_level->blocks;
1096   tree block = 0;
1097   tree decl;
1098   int block_previously_created;
1099
1100   keep |= current_binding_level->keep;
1101
1102   /* Get the decls in the order they were written.
1103      Usually current_binding_level->names is in reverse order.
1104      But parameter decls were previously put in forward order.  */
1105
1106   if (reverse)
1107     current_binding_level->names
1108       = decls = nreverse (current_binding_level->names);
1109   else
1110     decls = current_binding_level->names;
1111
1112   /* Output any nested inline functions within this block
1113      if they weren't already output.  */
1114
1115   for (decl = decls; decl; decl = TREE_CHAIN (decl))
1116     if (TREE_CODE (decl) == FUNCTION_DECL
1117         && ! TREE_ASM_WRITTEN (decl)
1118         && DECL_INITIAL (decl) != 0
1119         && TREE_ADDRESSABLE (decl))
1120       {
1121         /* If this decl was copied from a file-scope decl
1122            on account of a block-scope extern decl,
1123            propagate TREE_ADDRESSABLE to the file-scope decl.
1124
1125            DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1126            true, since then the decl goes through save_for_inline_copying.  */
1127         if (DECL_ABSTRACT_ORIGIN (decl) != 0
1128             && DECL_ABSTRACT_ORIGIN (decl) != decl)
1129           TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1130         else
1131           {
1132             push_function_context ();
1133             output_inline_function (decl);
1134             pop_function_context ();
1135           }
1136       }
1137
1138   /* If there were any declarations in that level,
1139      or if this level is a function body,
1140      create a BLOCK to record them for the life of this function.  */
1141
1142   block = 0;
1143   block_previously_created = (current_binding_level->this_block != 0);
1144   if (block_previously_created)
1145     block = current_binding_level->this_block;
1146   else if (keep || functionbody
1147            || (current_binding_level->keep_if_subblocks && subblocks != 0))
1148     block = make_node (BLOCK);
1149   if (block != 0)
1150     {
1151       BLOCK_VARS (block) = decls;
1152       BLOCK_TYPE_TAGS (block) = NULL_TREE;
1153       BLOCK_SUBBLOCKS (block) = subblocks;
1154       remember_end_note (block);
1155     }
1156
1157   /* In each subblock, record that this is its superior.  */
1158
1159   for (link = subblocks; link; link = TREE_CHAIN (link))
1160     BLOCK_SUPERCONTEXT (link) = block;
1161
1162   /* Clear out the meanings of the local variables of this level.  */
1163
1164   for (link = decls; link; link = TREE_CHAIN (link))
1165     {
1166       tree name = DECL_NAME (link);
1167       if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1168         {
1169           /* If the ident. was used or addressed via a local extern decl,
1170              don't forget that fact.  */
1171           if (DECL_EXTERNAL (link))
1172             {
1173               if (TREE_USED (link))
1174                 TREE_USED (name) = 1;
1175               if (TREE_ADDRESSABLE (link))
1176                 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1177             }
1178           IDENTIFIER_LOCAL_VALUE (name) = 0;
1179         }
1180     }
1181
1182   /* Restore all name-meanings of the outer levels
1183      that were shadowed by this level.  */
1184
1185   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1186     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1187
1188   /* If the level being exited is the top level of a function,
1189      check over all the labels, and clear out the current
1190      (function local) meanings of their names.  */
1191
1192   if (functionbody)
1193     {
1194       /* If this is the top level block of a function,
1195          the vars are the function's parameters.
1196          Don't leave them in the BLOCK because they are
1197          found in the FUNCTION_DECL instead.  */
1198
1199       BLOCK_VARS (block) = 0;
1200
1201       /* Clear out the definitions of all label names,
1202          since their scopes end here,
1203          and add them to BLOCK_VARS.  */
1204
1205 #if 0
1206       for (link = named_labels; link; link = TREE_CHAIN (link))
1207         {
1208           register tree label = TREE_VALUE (link);
1209
1210           if (DECL_INITIAL (label) == 0)
1211             {
1212               error_with_decl (label, "label `%s' used but not defined");
1213               /* Avoid crashing later.  */
1214               define_label (input_filename, lineno,
1215                             DECL_NAME (label));
1216             }
1217           else if (warn_unused && !TREE_USED (label))
1218             warning_with_decl (label, "label `%s' defined but not used");
1219           IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1220
1221           /* Put the labels into the "variables" of the
1222              top-level block, so debugger can see them.  */
1223           TREE_CHAIN (label) = BLOCK_VARS (block);
1224           BLOCK_VARS (block) = label;
1225         }
1226 #endif
1227     }
1228
1229   /* Pop the current level, and free the structure for reuse.  */
1230
1231   {
1232     register struct binding_level *level = current_binding_level;
1233     current_binding_level = current_binding_level->level_chain;
1234
1235     level->level_chain = free_binding_level;
1236     free_binding_level = level;
1237   }
1238
1239   /* Dispose of the block that we just made inside some higher level.  */
1240   if (functionbody)
1241     DECL_INITIAL (current_function_decl) = block;
1242   else if (block)
1243     {
1244       if (!block_previously_created)
1245         current_binding_level->blocks
1246           = chainon (current_binding_level->blocks, block);
1247     }
1248   /* If we did not make a block for the level just exited,
1249      any blocks made for inner levels
1250      (since they cannot be recorded as subblocks in that level)
1251      must be carried forward so they will later become subblocks
1252      of something else.  */
1253   else if (subblocks)
1254     current_binding_level->blocks
1255       = chainon (current_binding_level->blocks, subblocks);
1256
1257   /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1258      binding contour so that they point to the appropriate construct, i.e.
1259      either to the current FUNCTION_DECL node, or else to the BLOCK node
1260      we just constructed.
1261
1262      Note that for tagged types whose scope is just the formal parameter
1263      list for some function type specification, we can't properly set
1264      their TYPE_CONTEXTs here, because we don't have a pointer to the
1265      appropriate FUNCTION_TYPE node readily available to us.  For those
1266      cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1267      in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1268      node which will represent the "scope" for these "parameter list local"
1269      tagged types.
1270   */
1271
1272   if (block)
1273     TREE_USED (block) = 1;
1274   return block;
1275 }
1276
1277 void
1278 maybe_pushlevels (pc)
1279      int pc;
1280 {
1281   while (pending_local_decls != NULL_TREE &&
1282          DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1283     {
1284       tree *ptr = &pending_local_decls;
1285       tree decl = *ptr;
1286       int end_pc = DECL_LOCAL_END_PC (decl);
1287
1288       while (*ptr != NULL_TREE
1289              && DECL_LOCAL_START_PC (*ptr) <= pc
1290              && DECL_LOCAL_END_PC (*ptr) == end_pc)
1291         ptr = &TREE_CHAIN (*ptr);
1292       pending_local_decls = *ptr;
1293       *ptr = NULL_TREE;
1294
1295       /* Force non-nested range to be nested in current range. */
1296       if (end_pc > current_binding_level->end_pc)
1297         end_pc = current_binding_level->end_pc;
1298
1299       pushlevel (1);
1300       expand_start_bindings (0);
1301       current_binding_level->end_pc = end_pc;
1302       
1303       current_binding_level->names = decl;
1304       for ( ; decl != NULL_TREE;  decl = TREE_CHAIN (decl))
1305         {
1306           push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1307         }
1308     }
1309 }
1310
1311 void
1312 maybe_poplevels (pc)
1313      int pc;
1314 {
1315   while (current_binding_level->end_pc <= pc)
1316     {
1317       expand_end_bindings (getdecls (), 1, 0);
1318       poplevel (1, 0, 0);
1319     }
1320 }
1321
1322 /* Insert BLOCK at the end of the list of subblocks of the
1323    current binding level.  This is used when a BIND_EXPR is expanded,
1324    to handle the BLOCK node inside the BIND_EXPR.  */
1325
1326 void
1327 insert_block (block)
1328      tree block;
1329 {
1330   TREE_USED (block) = 1;
1331   abort ();
1332   current_binding_level->blocks
1333     = chainon (current_binding_level->blocks, block);
1334 }
1335
1336 /* Set the BLOCK node for the innermost scope
1337    (the one we are currently in).  */
1338
1339 void
1340 set_block (block)
1341      register tree block;
1342 {
1343   current_binding_level->this_block = block;
1344 }
1345
1346 /* integrate_decl_tree calls this function. */
1347
1348 void
1349 copy_lang_decl (node)
1350      tree node;
1351 {
1352   int lang_decl_size
1353     = TREE_CODE (node) == VAR_DECL ? sizeof (struct lang_decl_var)
1354     : sizeof (struct lang_decl);
1355   struct lang_decl *x = (struct lang_decl *) oballoc (lang_decl_size);
1356   bcopy (DECL_LANG_SPECIFIC (node), x, lang_decl_size);
1357   DECL_LANG_SPECIFIC (node) = x;
1358 }
1359
1360 /* If DECL has a cleanup, build and return that cleanup here.
1361    This is a callback called by expand_expr.  */
1362
1363 tree
1364 maybe_build_cleanup (decl)
1365      tree decl;
1366 {
1367   /* There are no cleanups in Java (I think).  */
1368   return NULL_TREE;
1369 }
1370
1371 void
1372 give_name_to_locals (jcf)
1373      JCF *jcf;
1374 {
1375   int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1376   tree parm;
1377   pending_local_decls = NULL_TREE;
1378   if (n == 0)
1379     return;
1380   JCF_SEEK (jcf, n);
1381   n = JCF_readu2 (jcf);
1382   for (i = 0; i < n; i++)
1383     {
1384       int start_pc = JCF_readu2 (jcf);
1385       int length = JCF_readu2 (jcf);
1386       int name_index = JCF_readu2 (jcf);
1387       int signature_index = JCF_readu2 (jcf);
1388       int slot = JCF_readu2 (jcf);
1389       tree name = get_name_constant (jcf, name_index);
1390       tree type = parse_signature (jcf, signature_index);
1391       if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1392           && start_pc == 0
1393           && length == DECL_CODE_LENGTH (current_function_decl))
1394         {
1395           tree decl = TREE_VEC_ELT (decl_map, slot);
1396           DECL_NAME (decl) = name;
1397           DECL_ASSEMBLER_NAME (decl) = name;
1398           if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1399             warning ("bad type in parameter debug info");
1400         }
1401       else
1402         {
1403           tree *ptr;
1404           int end_pc = start_pc + length;
1405           tree decl = build_decl (VAR_DECL, name, type);
1406           if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1407             {
1408               warning_with_decl (decl,
1409                          "bad PC range for debug info for local `%s'");
1410               end_pc = DECL_CODE_LENGTH (current_function_decl);
1411             }
1412           DECL_LANG_SPECIFIC (decl)
1413             = (struct lang_decl *) permalloc (sizeof (struct lang_decl_var));
1414           DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1415           DECL_LOCAL_START_PC (decl) = start_pc;
1416           DECL_LOCAL_END_PC (decl) = end_pc;
1417
1418           /* Now insert the new decl in the proper place in
1419              pending_local_decls.  We are essentially doing an insertion sort,
1420              which works fine, since the list input will normally already
1421              be sorted. */
1422           ptr = &pending_local_decls;
1423           while (*ptr != NULL_TREE
1424                  && (DECL_LOCAL_START_PC (*ptr) > start_pc
1425                      || (DECL_LOCAL_START_PC (*ptr) == start_pc
1426                          && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1427             ptr = &TREE_CHAIN (*ptr);
1428           TREE_CHAIN (decl) = *ptr;
1429           *ptr = decl;
1430         }
1431     }
1432
1433   pending_local_decls = nreverse (pending_local_decls);
1434
1435   /* Fill in default names for the parameters. */ 
1436   for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1437        parm != NULL_TREE;  parm = TREE_CHAIN (parm), i++)
1438     {
1439       if (DECL_NAME (parm) == NULL_TREE)
1440         {
1441           int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1442           if (arg_i == 0)
1443             DECL_NAME (parm) = get_identifier ("this");
1444           else
1445             {
1446               char buffer[12];
1447               sprintf (buffer, "ARG_%d", arg_i);
1448               DECL_NAME (parm) = get_identifier (buffer);
1449             }
1450           DECL_ASSEMBLER_NAME (parm) = DECL_NAME (parm);
1451         }
1452     }
1453 }
1454
1455 void
1456 complete_start_java_method (fndecl)
1457   tree fndecl;
1458 {
1459   tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1460   /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1461   if (INTEGRAL_TYPE_P (restype)
1462       && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1463     restype = integer_type_node;
1464   DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype);
1465
1466   if (! flag_emit_class_files)
1467     {
1468       /* Initialize the RTL code for the function.  */
1469       init_function_start (fndecl, input_filename, lineno);
1470
1471       /* Set up parameters and prepare for return, for the function.  */
1472       expand_function_start (fndecl, 0);
1473     }
1474
1475   /* Allocate further tree nodes temporarily during compilation
1476      of this function only.  */
1477   temporary_allocation ();
1478
1479 #if 0
1480       /* If this fcn was already referenced via a block-scope `extern' decl (or
1481          an implicit decl), propagate certain information about the usage. */
1482       if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1483         TREE_ADDRESSABLE (current_function_decl) = 1;
1484
1485 #endif
1486
1487   if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl))
1488     {
1489       tree clas = DECL_CONTEXT (fndecl);
1490       tree init = build (CALL_EXPR, void_type_node,
1491                          build_address_of (soft_initclass_node),
1492                          build_tree_list (NULL_TREE, build_class_ref (clas)),
1493                          NULL_TREE);
1494       TREE_SIDE_EFFECTS (init) = 1;
1495       expand_expr_stmt (init);
1496     }
1497
1498   if (METHOD_SYNCHRONIZED (fndecl))
1499     {
1500       /* FIXME: surround the function body by a try/finally set.  */
1501     }
1502
1503   /* Push local variables. Function compiled from source code are
1504      using a different local variables management, and for them,
1505      pushlevel shouldn't be called from here.  */
1506   if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1507     {
1508       pushlevel (2);
1509       if (! flag_emit_class_files)
1510         expand_start_bindings (1);
1511     }
1512 }
1513
1514 void
1515 start_java_method (fndecl)
1516      tree fndecl;
1517 {
1518   tree tem, *ptr;
1519   int i;
1520
1521   current_function_decl = fndecl;
1522   announce_function (fndecl);
1523
1524   i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1525   decl_map = make_tree_vec (i);
1526   type_map = (tree *) oballoc (i * sizeof (tree));
1527
1528   pushlevel (1);  /* Push parameters. */
1529
1530   ptr = &DECL_ARGUMENTS (fndecl);
1531   for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1532        tem != NULL_TREE; tem = TREE_CHAIN (tem), i++)
1533     {
1534       tree parm_name = NULL_TREE, parm_decl;
1535       tree parm_type = TREE_VALUE (tem);
1536       if (i >= DECL_MAX_LOCALS(fndecl))
1537         fatal ("function has more parameters than local slots");
1538
1539       parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1540       DECL_CONTEXT (parm_decl) = fndecl;
1541 #ifdef PROMOTE_PROTOTYPES
1542       if (TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1543           && INTEGRAL_TYPE_P (parm_type))
1544         parm_type = integer_type_node;
1545 #endif
1546       DECL_ARG_TYPE (parm_decl) = parm_type;
1547
1548       *ptr = parm_decl;
1549       ptr = &TREE_CHAIN (parm_decl);
1550
1551       /* Add parm_decl to the decl_map. */
1552       push_jvm_slot (i, parm_decl);
1553
1554       type_map[i] = TREE_TYPE (parm_decl);
1555       if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1556         {
1557           i++;
1558           type_map[i] = void_type_node;
1559         }
1560     }
1561   *ptr = NULL_TREE;
1562   DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1563
1564   while (i < DECL_MAX_LOCALS(fndecl))
1565     type_map[i++] = NULL_TREE;
1566
1567   complete_start_java_method (fndecl);
1568 }
1569
1570 void
1571 end_java_method ()
1572 {
1573   tree fndecl = current_function_decl;
1574
1575   expand_end_bindings (getdecls (), 1, 0);
1576   /* pop out of function */
1577   poplevel (1, 1, 0);
1578
1579   /* pop out of its parameters */
1580   poplevel (1, 0, 1);
1581
1582   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1583
1584   emit_handlers ();
1585
1586   /* Generate rtl for function exit.  */
1587   expand_function_end (input_filename, lineno, 0);
1588
1589   /* Run the optimizers and output assembler code for this function. */
1590   rest_of_compilation (fndecl);
1591
1592   current_function_decl = NULL_TREE;
1593   permanent_allocation (1);
1594 }
1595
1596 tree 
1597 build_decl_no_layout (code, name, type)
1598      enum tree_code code;
1599      tree name, type;
1600 {
1601   tree decl = build_decl (TYPE_DECL, name, type);
1602   TREE_SET_CODE (decl, code);
1603   return decl;
1604 }