OSDN Git Service

2001-09-22 Alexandre Petit-Bianco <apbianco@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / java / decl.c
1 /* Process declarations and variables for the GNU compiler for the
2    Java(TM) language.
3    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
4    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 "rtl.h"
33 #include "toplev.h"
34 #include "flags.h"
35 #include "java-tree.h"
36 #include "jcf.h"
37 #include "function.h"
38 #include "expr.h"
39 #include "libfuncs.h"
40 #include "except.h"
41 #include "java-except.h"
42 #include "ggc.h"
43
44 #if defined (DEBUG_JAVA_BINDING_LEVELS)
45 extern void indent PROTO((void));
46 #endif
47
48 static tree push_jvm_slot PARAMS ((int, tree));
49 static tree lookup_name_current_level PARAMS ((tree));
50 static tree push_promoted_type PARAMS ((const char *, tree));
51 static struct binding_level *make_binding_level PARAMS ((void));
52 static tree create_primitive_vtable PARAMS ((const char *));
53 static tree check_local_named_variable PARAMS ((tree, tree, int, int *));
54 static tree check_local_unnamed_variable PARAMS ((tree, tree, tree));
55
56 /* Set to non-zero value in order to emit class initilization code
57    before static field references.  */
58 extern int always_initialize_class_p;
59
60 /* The DECL_MAP is a mapping from (index, type) to a decl node.
61    If index < max_locals, it is the index of a local variable.
62    if index >= max_locals, then index-max_locals is a stack slot.
63    The DECL_MAP mapping is represented as a TREE_VEC whose elements
64    are a list of decls (VAR_DECL or PARM_DECL) chained by
65    DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
66    we search the chain for a decl with a matching TREE_TYPE. */
67
68 tree decl_map;
69
70 /* A list of local variables VAR_DECLs for this method that we have seen
71    debug information, but we have not reached their starting (byte) PC yet. */
72
73 static tree pending_local_decls = NULL_TREE;
74
75 /* Push a local variable or stack slot into the decl_map,
76    and assign it an rtl. */
77
78 #if defined(DEBUG_JAVA_BINDING_LEVELS)
79 int binding_depth = 0;
80 int is_class_level = 0;
81 int current_pc;
82
83 void
84 indent ()
85 {
86   register unsigned i;
87
88   for (i = 0; i < binding_depth*2; i++)
89     putc (' ', stderr);
90 }
91 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
92
93 static tree
94 push_jvm_slot (index, decl)
95      int index;
96      tree decl;
97 {
98   struct rtx_def *rtl = NULL;
99   tree type = TREE_TYPE (decl);
100   tree tmp;
101
102   DECL_CONTEXT (decl) = current_function_decl;
103   layout_decl (decl, 0);
104
105   /* See if we have an appropriate rtl (i.e. same mode) at this index.
106      If so, we must use it. */ 
107   tmp = TREE_VEC_ELT (decl_map, index);
108   while (tmp != NULL_TREE)
109     {
110       if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)))
111         rtl = DECL_RTL_IF_SET (tmp);
112       if (rtl != NULL)
113         break;
114      tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
115     }
116   if (rtl != NULL)
117     SET_DECL_RTL (decl, rtl);
118   else
119     {
120       if (index >= DECL_MAX_LOCALS (current_function_decl))
121         DECL_REGISTER (decl) = 1;
122       expand_decl (decl);
123     }
124
125   /* Now link the decl into the decl_map. */
126   if (DECL_LANG_SPECIFIC (decl) == NULL)
127     {
128       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
129       DECL_LOCAL_START_PC (decl) = 0;
130       DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
131       DECL_LOCAL_SLOT_NUMBER (decl) = index;
132     }
133   DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
134   TREE_VEC_ELT (decl_map, index) = decl;
135   return decl;
136 }
137
138 /* Find out if 'decl' passed in fits the defined PC location better than
139    'best'.  Return decl if it does, return best if it doesn't.  If decl
140    is returned, then updated is set to true.  */
141
142 static tree
143 check_local_named_variable (best, decl, pc, updated)
144      tree best;
145      tree decl;
146      int pc;
147      int *updated;
148 {
149   if (pc >= DECL_LOCAL_START_PC (decl)
150       && pc < DECL_LOCAL_END_PC (decl))
151     {
152       if (best == NULL_TREE
153           || (DECL_LOCAL_START_PC (decl) > DECL_LOCAL_START_PC (best)
154               && DECL_LOCAL_END_PC (decl) < DECL_LOCAL_END_PC (best)))
155         {
156           *updated = 1;
157           return decl;
158         }
159     }
160   
161   return best;
162 }
163
164 /* Find the best declaration based upon type.  If 'decl' fits 'type' better
165    than 'best', return 'decl'.  Otherwise return 'best'.  */
166
167 static tree
168 check_local_unnamed_variable (best, decl, type)
169      tree best;
170      tree decl;
171      tree type;
172 {
173     if (TREE_TYPE (decl) == type
174         || (TREE_CODE (TREE_TYPE (decl)) == TREE_CODE (type)
175             && TYPE_PRECISION (TREE_TYPE (decl)) <= 32
176             && TYPE_PRECISION (type) <= 32
177             && TREE_CODE (type) != POINTER_TYPE)
178         || (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
179             && type == ptr_type_node))
180       {
181         if (best == NULL_TREE
182             || (TREE_TYPE (decl) == type && TREE_TYPE (best) != type))
183           return decl;
184       }
185
186     return best;
187 }
188
189
190 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
191    that is valid at PC (or -1 if any pc).
192    If there is no existing matching decl, allocate one.  */
193
194 tree
195 find_local_variable (index, type, pc)
196      int index;
197      tree type;
198      int pc;
199 {
200   tree decl = TREE_VEC_ELT (decl_map, index);
201   tree best = NULL_TREE;
202   int found_scoped_var = 0;
203
204   /* Scan through every declaration that has been created in this slot. */
205   while (decl != NULL_TREE)
206     {
207        /* Variables created in give_name_to_locals() have a name and have
208          a specified scope, so we can handle them specifically.  We want
209          to use the specific decls created for those so they are assigned
210          the right variables in the debugging information. */
211       if (DECL_NAME (decl) != NULL_TREE)
212         {
213           /* This is a variable we have a name for, so it has a scope
214              supplied in the class file.  But it only matters when we
215              actually have a PC to use.  If pc<0, then we are asking
216              for a stack slot and this decl won't be one of those. */
217           if (pc >= 0)
218             best = check_local_named_variable (best, decl, pc,
219                                                &found_scoped_var);
220         }
221       /* We scan for type information unless we found a variable in the
222          proper scope already. */
223       else if (!found_scoped_var)
224         {
225           /* If we don't have scoping information for a variable, we use
226              a different method to look it up. */
227           best = check_local_unnamed_variable (best, decl, type);
228         }
229
230       decl = DECL_LOCAL_SLOT_CHAIN (decl);
231     }
232
233   if (best != NULL_TREE)
234     return best;
235
236   /* If we don't find a match, create one with the type passed in. */
237   return push_jvm_slot (index, build_decl (VAR_DECL, NULL_TREE, type));
238 }
239
240
241 /* Same as find_local_index, except that INDEX is a stack index. */
242
243 tree
244 find_stack_slot (index, type)
245      int index;
246      tree type;
247 {
248   return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
249                               type, -1);
250 }
251
252 struct binding_level
253   {
254     /* A chain of _DECL nodes for all variables, constants, functions,
255      * and typedef types.  These are in the reverse of the order supplied.
256      */
257     tree names;
258
259     /* For each level, a list of shadowed outer-level local definitions
260        to be restored when this level is popped.
261        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
262        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
263     tree shadowed;
264
265     /* For each level (except not the global one),
266        a chain of BLOCK nodes for all the levels
267        that were entered and exited one level down.  */
268     tree blocks;
269
270     /* The BLOCK node for this level, if one has been preallocated.
271        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
272     tree this_block;
273
274     /* The binding level which this one is contained in (inherits from).  */
275     struct binding_level *level_chain;
276
277     /* The bytecode PC that marks the end of this level. */
278     int end_pc;
279     /* The bytecode PC that marks the start of this level. */
280     int start_pc;
281
282 #if defined(DEBUG_JAVA_BINDING_LEVELS)
283     /* Binding depth at which this level began.  */
284     unsigned binding_depth;
285 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
286   };
287
288 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
289
290 /* The binding level currently in effect.  */
291
292 static struct binding_level *current_binding_level;
293
294 /* A chain of binding_level structures awaiting reuse.  */
295
296 static struct binding_level *free_binding_level;
297
298 /* The outermost binding level, for names of file scope.
299    This is created when the compiler is started and exists
300    through the entire run.  */
301
302 static struct binding_level *global_binding_level;
303
304 /* A PC value bigger than any PC value we may ever may encounter. */
305
306 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
307
308 /* Binding level structures are initialized by copying this one.  */
309
310 static struct binding_level clear_binding_level
311   = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
312        NULL_BINDING_LEVEL, LARGEST_PC, 0};
313
314 #if 0
315 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
316    that have names.  Here so we can clear out their names' definitions
317    at the end of the function.  */
318
319 static tree named_labels;
320
321 /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
322
323 static tree shadowed_labels;
324 #endif
325
326 int flag_traditional;
327
328 tree java_global_trees[JTI_MAX];
329   
330 tree predef_filenames[PREDEF_FILENAMES_SIZE];
331
332 /* Build (and pushdecl) a "promoted type" for all standard
333    types shorter than int.  */
334
335 static tree
336 push_promoted_type (name, actual_type)
337      const char *name;
338      tree actual_type;
339 {
340   tree type = make_node (TREE_CODE (actual_type));
341 #if 1
342   tree in_min = TYPE_MIN_VALUE (int_type_node);
343   tree in_max = TYPE_MAX_VALUE (int_type_node);
344 #else
345   tree in_min = TYPE_MIN_VALUE (actual_type);
346   tree in_max = TYPE_MAX_VALUE (actual_type);
347 #endif
348   TYPE_MIN_VALUE (type) = copy_node (in_min);
349   TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
350   TYPE_MAX_VALUE (type) = copy_node (in_max);
351   TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
352   TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
353   layout_type (type);
354   pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
355   return type;
356 }
357
358 /* Return a definition for a builtin function named NAME and whose data type
359    is TYPE.  TYPE should be a function type with argument types.
360    FUNCTION_CODE tells later passes how to compile calls to this function.
361    See tree.h for its possible values.
362
363    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
364    the name to be called if we can't opencode the function.  */
365
366 tree
367 builtin_function (name, type, function_code, class, library_name)
368      const char *name;
369      tree type;
370      int function_code;
371      enum built_in_class class;
372      const char *library_name;
373 {
374   tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
375   DECL_EXTERNAL (decl) = 1;
376   TREE_PUBLIC (decl) = 1;
377   if (library_name)
378     SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
379   make_decl_rtl (decl, NULL);
380   pushdecl (decl);
381   DECL_BUILT_IN_CLASS (decl) = class;
382   DECL_FUNCTION_CODE (decl) = function_code;
383   return decl;
384 }
385
386 /* Return tree that represents a vtable for a primitive array.  */
387 static tree
388 create_primitive_vtable (name)
389      const char *name;
390 {
391   tree r;
392   char buf[50];
393
394   sprintf (buf, "_Jv_%sVTable", name);
395   r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
396   DECL_EXTERNAL (r) = 1;
397   return r;
398 }
399
400 void
401 init_decl_processing ()
402 {
403   register tree endlink;
404   tree field = NULL_TREE;
405   tree t;
406
407   init_class_processing ();
408
409   current_function_decl = NULL;
410   current_binding_level = NULL_BINDING_LEVEL;
411   free_binding_level = NULL_BINDING_LEVEL;
412   pushlevel (0);        /* make the binding_level structure for global names */
413   global_binding_level = current_binding_level;
414
415   /* The code here must be similar to build_common_tree_nodes{,_2} in
416      tree.c, especially as to the order of initializing common nodes.  */
417   error_mark_node = make_node (ERROR_MARK);
418   TREE_TYPE (error_mark_node) = error_mark_node;
419
420   /* Create sizetype first - needed for other types. */
421   initialize_sizetypes ();
422
423   byte_type_node = make_signed_type (8);
424   pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
425   short_type_node = make_signed_type (16);
426   pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
427   int_type_node = make_signed_type (32);
428   pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
429   long_type_node = make_signed_type (64);
430   pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
431
432   unsigned_byte_type_node = make_unsigned_type (8);
433   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
434                         unsigned_byte_type_node));
435   unsigned_short_type_node = make_unsigned_type (16);
436   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
437                         unsigned_short_type_node));
438   unsigned_int_type_node = make_unsigned_type (32);
439   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
440                         unsigned_int_type_node));
441   unsigned_long_type_node = make_unsigned_type (64);
442   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
443                         unsigned_long_type_node));
444
445   set_sizetype (make_unsigned_type (POINTER_SIZE));
446
447   /* Define these next since types below may used them.  */
448   integer_type_node = type_for_size (INT_TYPE_SIZE, 0);
449   integer_zero_node = build_int_2 (0, 0);
450   integer_one_node = build_int_2 (1, 0);
451   integer_two_node = build_int_2 (2, 0);
452   integer_four_node = build_int_2 (4, 0);
453   integer_minus_one_node = build_int_2 (-1, -1);
454
455   size_zero_node = size_int (0);
456   size_one_node = size_int (1);
457   bitsize_zero_node = bitsize_int (0);
458   bitsize_one_node = bitsize_int (1);
459   bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
460
461   long_zero_node = build_int_2 (0, 0);
462   TREE_TYPE (long_zero_node) = long_type_node;
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   /* Used by the parser to represent empty statements and blocks. */
476   empty_stmt_node = build1 (NOP_EXPR, void_type_node, size_zero_node);
477   CAN_COMPLETE_NORMALLY (empty_stmt_node) = 1;
478
479 #if 0
480   /* Make a type to be the domain of a few array types
481      whose domains don't really matter.
482      200 is small enough that it always fits in size_t
483      and large enough that it can hold most function names for the
484      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
485   short_array_type_node = build_prim_array_type (short_type_node, 200);
486 #endif
487   char_type_node = make_node (CHAR_TYPE);
488   TYPE_PRECISION (char_type_node) = 16;
489   fixup_unsigned_type (char_type_node);
490   pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
491
492   boolean_type_node = make_node (BOOLEAN_TYPE);
493   TYPE_PRECISION (boolean_type_node) = 1;
494   fixup_unsigned_type (boolean_type_node);
495   pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
496                         boolean_type_node));
497   boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
498   boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
499
500   promoted_byte_type_node
501     = push_promoted_type ("promoted_byte", byte_type_node);
502   promoted_short_type_node
503     = push_promoted_type ("promoted_short", short_type_node);
504   promoted_char_type_node
505     = push_promoted_type ("promoted_char", char_type_node);
506   promoted_boolean_type_node
507     = push_promoted_type ("promoted_boolean", boolean_type_node);
508
509   float_type_node = make_node (REAL_TYPE);
510   TYPE_PRECISION (float_type_node) = 32;
511   pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
512                         float_type_node));
513   layout_type (float_type_node);
514
515   double_type_node = make_node (REAL_TYPE);
516   TYPE_PRECISION (double_type_node) = 64;
517   pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
518                         double_type_node));
519   layout_type (double_type_node);
520
521   float_zero_node = build_real (float_type_node, dconst0);
522   double_zero_node = build_real (double_type_node, dconst0);
523
524   /* These are the vtables for arrays of primitives.  */
525   boolean_array_vtable = create_primitive_vtable ("boolean");
526   byte_array_vtable = create_primitive_vtable ("byte");
527   char_array_vtable = create_primitive_vtable ("char");
528   short_array_vtable = create_primitive_vtable ("short");
529   int_array_vtable = create_primitive_vtable ("int");
530   long_array_vtable = create_primitive_vtable ("long");
531   float_array_vtable = create_primitive_vtable ("float");
532   double_array_vtable = create_primitive_vtable ("double");
533
534   /* As you're adding items here, please update the code right after
535      this section, so that the filename containing the source code of
536      the pre-defined class gets registered correctly. */
537   unqualified_object_id_node = get_identifier ("Object");
538   object_type_node = lookup_class (get_identifier ("java.lang.Object"));
539   object_ptr_type_node = promote_type (object_type_node);
540   string_type_node = lookup_class (get_identifier ("java.lang.String"));
541   string_ptr_type_node = promote_type (string_type_node);
542   class_type_node = lookup_class (get_identifier ("java.lang.Class"));
543   throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
544   exception_type_node = lookup_class (get_identifier ("java.lang.Exception"));
545   runtime_exception_type_node = 
546     lookup_class (get_identifier ("java.lang.RuntimeException"));
547   error_exception_type_node = 
548     lookup_class (get_identifier ("java.lang.Error"));
549   class_not_found_type_node = 
550     lookup_class (get_identifier ("java.lang.ClassNotFoundException"));
551   no_class_def_found_type_node = 
552     lookup_class (get_identifier ("java.lang.NoClassDefFoundError"));
553
554   rawdata_ptr_type_node
555     = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
556
557   /* If you add to this section, don't forget to increase
558      PREDEF_FILENAMES_SIZE.  */
559   predef_filenames [0] = get_identifier ("java/lang/Class.java");
560   predef_filenames [1] = get_identifier ("java/lang/Error.java");
561   predef_filenames [2] = get_identifier ("java/lang/Object.java");
562   predef_filenames [3] = get_identifier ("java/lang/RuntimeException.java");
563   predef_filenames [4] = get_identifier ("java/lang/String.java");
564   predef_filenames [5] = get_identifier ("java/lang/Throwable.java");
565   predef_filenames [6] = get_identifier ("gnu/gcj/RawData.java");
566   predef_filenames [7] = get_identifier ("java/lang/Exception.java");
567   predef_filenames [8] =
568     get_identifier ("java/lang/ClassNotFoundException.java");
569   predef_filenames [9] =
570     get_identifier ("java/lang/NoClassDefFoundError.java");
571
572   methodtable_type = make_node (RECORD_TYPE);
573   layout_type (methodtable_type);
574   build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
575   methodtable_ptr_type = build_pointer_type (methodtable_type);
576
577   TYPE_identifier_node = get_identifier ("TYPE");
578   init_identifier_node = get_identifier ("<init>");
579   clinit_identifier_node = get_identifier ("<clinit>");
580   /* Legacy `$finit$' special method identifier. This needs to be
581      recognized as equivalent to `finit$' but isn't generated anymore.  */
582   finit_leg_identifier_node = get_identifier ("$finit$");
583   /* The new `finit$' special method identifier. This one is now
584      generated in place of `$finit$'.  */
585   finit_identifier_node = get_identifier ("finit$");
586   instinit_identifier_node = get_identifier ("instinit$");
587   void_signature_node = get_identifier ("()V");
588   length_identifier_node = get_identifier ("length");
589   this_identifier_node = get_identifier ("this");
590   super_identifier_node = get_identifier ("super");
591   continue_identifier_node = get_identifier ("continue");
592   access0_identifier_node = get_identifier ("access$0");
593   classdollar_identifier_node = get_identifier ("class$");
594
595   /* for lack of a better place to put this stub call */
596   init_expr_processing();
597
598   utf8const_type = make_node (RECORD_TYPE);
599   PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
600   PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
601   FINISH_RECORD (utf8const_type);
602   utf8const_ptr_type = build_pointer_type (utf8const_type);
603
604   constants_type_node = make_node (RECORD_TYPE);
605   PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
606   PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
607   PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
608   FINISH_RECORD (constants_type_node);
609   build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
610
611   access_flags_type_node = unsigned_short_type_node;
612
613   dtable_type = make_node (RECORD_TYPE);
614   dtable_ptr_type = build_pointer_type (dtable_type);
615
616   PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
617   /* This isn't exactly true, but it is what we have in the source.
618      There is an unresolved issue here, which is whether the vtable
619      should be marked by the GC.  */
620   if (! flag_hash_synchronization)
621     PUSH_FIELD (object_type_node, field, "sync_info",
622                 build_pointer_type (object_type_node));
623   for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
624     FIELD_PRIVATE (t) = 1;
625   FINISH_RECORD (object_type_node);
626
627   field_type_node = make_node (RECORD_TYPE);
628   field_ptr_type_node = build_pointer_type (field_type_node);
629   method_type_node = make_node (RECORD_TYPE);
630   method_ptr_type_node = build_pointer_type (method_type_node);
631
632   set_super_info (0, class_type_node, object_type_node, 0);
633   set_super_info (0, string_type_node, object_type_node, 0);
634   class_ptr_type = build_pointer_type (class_type_node);
635
636   PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
637   PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
638   PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
639   PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
640   PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
641   PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
642   PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
643   PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
644   PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
645   PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
646   PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
647   PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
648   PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
649   PUSH_FIELD (class_type_node, field, "interfaces",
650               build_pointer_type (class_ptr_type));
651   PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
652   PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
653   PUSH_FIELD (class_type_node, field, "state", byte_type_node);
654   PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
655   PUSH_FIELD (class_type_node, field, "depth", short_type_node);
656   PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
657   PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);  
658   PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);  
659   PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
660   for (t = TYPE_FIELDS (class_type_node);  t != NULL_TREE;  t = TREE_CHAIN (t))
661     FIELD_PRIVATE (t) = 1;
662   push_super_field (class_type_node, object_type_node);
663   FINISH_RECORD (class_type_node);
664   build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
665
666   field_info_union_node = make_node (UNION_TYPE);
667   PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
668   PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
669 #if 0
670   PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
671 #endif
672   layout_type (field_info_union_node);
673
674   PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
675   PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
676   PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
677   PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
678   PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
679   FINISH_RECORD (field_type_node);
680   build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
681
682   one_elt_array_domain_type = build_index_type (integer_one_node);
683   nativecode_ptr_array_type_node
684     = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
685
686   PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
687   PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
688   FINISH_RECORD (dtable_type);
689   build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
690
691 #define jint_type int_type_node
692 #define jint_ptr_type ptr_type_node
693
694   jexception_type = make_node (RECORD_TYPE);
695   PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
696   PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
697   PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
698   PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
699   FINISH_RECORD (jexception_type);
700   build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
701   jexception_ptr_type = build_pointer_type (jexception_type);
702
703   lineNumberEntry_type = make_node (RECORD_TYPE);
704   PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
705   PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
706   FINISH_RECORD (lineNumberEntry_type);
707
708   lineNumbers_type = make_node (RECORD_TYPE);
709   PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
710   FINISH_RECORD (lineNumbers_type);
711
712 #define instn_ptr_type_node ptr_type_node       /* XXX JH */
713
714 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
715
716   PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
717   PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
718   PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
719   PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
720   PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
721   FINISH_RECORD (method_type_node);
722   build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
723
724   endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
725
726   t = tree_cons (NULL_TREE, class_ptr_type,
727                  tree_cons (NULL_TREE, int_type_node, endlink));
728   alloc_object_node = builtin_function ("_Jv_AllocObject",
729                                         build_function_type (ptr_type_node, t),
730                                         0, NOT_BUILT_IN, NULL);
731   DECL_IS_MALLOC (alloc_object_node) = 1;
732
733   t = tree_cons (NULL_TREE, ptr_type_node, endlink);
734   soft_initclass_node = builtin_function ("_Jv_InitClass",
735                                           build_function_type (void_type_node,
736                                                                t),
737                                           0, NOT_BUILT_IN, NULL);
738
739   throw_node = builtin_function ("_Jv_Throw",
740                                  build_function_type (ptr_type_node, t),
741                                  0, NOT_BUILT_IN, NULL);
742   /* Mark throw_nodes as `noreturn' functions with side effects.  */
743   TREE_THIS_VOLATILE (throw_node) = 1;
744   TREE_SIDE_EFFECTS (throw_node) = 1;
745
746   t = build_function_type (int_type_node, endlink);
747   soft_monitorenter_node 
748     = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, NULL);
749   soft_monitorexit_node 
750     = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN, NULL);
751   
752   t = tree_cons (NULL_TREE, int_type_node, 
753                  tree_cons (NULL_TREE, int_type_node, endlink));
754   soft_newarray_node
755       = builtin_function ("_Jv_NewPrimArray",
756                           build_function_type(ptr_type_node, t),
757                           0, NOT_BUILT_IN, NULL);
758   DECL_IS_MALLOC (soft_newarray_node) = 1;
759
760   t = tree_cons (NULL_TREE, int_type_node,
761                  tree_cons (NULL_TREE, class_ptr_type,
762                             tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
763   soft_anewarray_node
764       = builtin_function ("_Jv_NewObjectArray",
765                           build_function_type (ptr_type_node, t),
766                           0, NOT_BUILT_IN, NULL);
767   DECL_IS_MALLOC (soft_anewarray_node) = 1;
768
769   t = tree_cons (NULL_TREE, ptr_type_node,
770                  tree_cons (NULL_TREE, int_type_node, endlink));
771   soft_multianewarray_node
772       = builtin_function ("_Jv_NewMultiArray",
773                           build_function_type (ptr_type_node, t),
774                           0, NOT_BUILT_IN, NULL);
775   DECL_IS_MALLOC (soft_multianewarray_node) = 1;
776
777   t = build_function_type (void_type_node, 
778                            tree_cons (NULL_TREE, int_type_node, endlink));
779   soft_badarrayindex_node
780       = builtin_function ("_Jv_ThrowBadArrayIndex", t, 
781                           0, NOT_BUILT_IN, NULL);
782   /* Mark soft_badarrayindex_node as a `noreturn' function with side
783      effects.  */
784   TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
785   TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
786
787   soft_nullpointer_node
788     = builtin_function ("_Jv_ThrowNullPointerException",
789                         build_function_type (void_type_node, endlink),
790                         0, NOT_BUILT_IN, NULL);
791   /* Mark soft_nullpointer_node as a `noreturn' function with side
792      effects.  */
793   TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
794   TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
795
796   t = tree_cons (NULL_TREE, class_ptr_type,
797                  tree_cons (NULL_TREE, object_ptr_type_node, endlink));
798   soft_checkcast_node
799     = builtin_function ("_Jv_CheckCast",
800                         build_function_type (ptr_type_node, t),
801                         0, NOT_BUILT_IN, NULL);
802   t = tree_cons (NULL_TREE, object_ptr_type_node,
803                  tree_cons (NULL_TREE, class_ptr_type, endlink));
804   soft_instanceof_node
805     = builtin_function ("_Jv_IsInstanceOf",
806                         build_function_type (boolean_type_node, t),
807                         0, NOT_BUILT_IN, NULL);
808   t = tree_cons (NULL_TREE, object_ptr_type_node,
809                  tree_cons (NULL_TREE, object_ptr_type_node, endlink));
810   soft_checkarraystore_node
811     = builtin_function ("_Jv_CheckArrayStore",
812                         build_function_type (void_type_node, t),
813                         0, NOT_BUILT_IN, NULL);
814   t = tree_cons (NULL_TREE, ptr_type_node,
815                  tree_cons (NULL_TREE, ptr_type_node,
816                             tree_cons (NULL_TREE, int_type_node, endlink)));
817   soft_lookupinterfacemethod_node 
818     = builtin_function ("_Jv_LookupInterfaceMethodIdx",
819                         build_function_type (ptr_type_node, t),
820                         0, NOT_BUILT_IN, NULL);
821
822   t = tree_cons (NULL_TREE, object_ptr_type_node,
823                  tree_cons (NULL_TREE, ptr_type_node,
824                             tree_cons (NULL_TREE, ptr_type_node, endlink)));
825   soft_lookupjnimethod_node
826     = builtin_function ("_Jv_LookupJNIMethod",
827                         build_function_type (ptr_type_node, t),
828                         0, NOT_BUILT_IN, NULL);
829   t = tree_cons (NULL_TREE, ptr_type_node, endlink);
830   soft_getjnienvnewframe_node
831     = builtin_function ("_Jv_GetJNIEnvNewFrame",
832                         build_function_type (ptr_type_node, t),
833                         0, NOT_BUILT_IN, NULL);
834   soft_jnipopsystemframe_node
835     = builtin_function ("_Jv_JNI_PopSystemFrame",
836                         build_function_type (ptr_type_node, t),
837                         0, NOT_BUILT_IN, NULL);
838
839   t = tree_cons (NULL_TREE, double_type_node,
840                  tree_cons (NULL_TREE, double_type_node, endlink));
841   soft_fmod_node
842     = builtin_function ("__builtin_fmod",
843                         build_function_type (double_type_node, t),
844                         BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmod");
845
846 #if 0
847   t = tree_cons (NULL_TREE, float_type_node,
848                  tree_cons (NULL_TREE, float_type_node, endlink));
849   soft_fmodf_node
850     = builtin_function ("__builtin_fmodf",
851                         build_function_type (float_type_node, t),
852                         BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmodf");
853 #endif
854     
855   soft_idiv_node
856     = builtin_function ("_Jv_divI",
857                         build_function_type (int_type_node, t),
858                         0, NOT_BUILT_IN, NULL);
859
860   soft_irem_node
861     = builtin_function ("_Jv_remI",
862                         build_function_type (int_type_node, t),
863                         0, NOT_BUILT_IN, NULL);
864
865   soft_ldiv_node
866     = builtin_function ("_Jv_divJ",
867                         build_function_type (long_type_node, t),
868                         0, NOT_BUILT_IN, NULL);
869
870   soft_lrem_node
871     = builtin_function ("_Jv_remJ",
872                         build_function_type (long_type_node, t),
873                         0, NOT_BUILT_IN, NULL);
874
875   /* Initialize variables for except.c.  */
876   eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
877                                              ? "__gcj_personality_sj0"
878                                              : "__gcj_personality_v0");
879   lang_eh_runtime_type = prepare_eh_table_type;
880
881   init_jcf_parse ();
882
883   /* Register nodes with the garbage collector.  */
884   ggc_add_tree_root (java_global_trees, 
885                      sizeof (java_global_trees) / sizeof (tree));
886   ggc_add_tree_root (predef_filenames,
887                      sizeof (predef_filenames) / sizeof (tree));
888   ggc_add_tree_root (&decl_map, 1);
889   ggc_add_tree_root (&pending_local_decls, 1);
890 }
891
892
893 /* Look up NAME in the current binding level and its superiors
894    in the namespace of variables, functions and typedefs.
895    Return a ..._DECL node of some kind representing its definition,
896    or return 0 if it is undefined.  */
897
898 tree
899 lookup_name (name)
900      tree name;
901 {
902   register tree val;
903   if (current_binding_level != global_binding_level
904       && IDENTIFIER_LOCAL_VALUE (name))
905     val = IDENTIFIER_LOCAL_VALUE (name);
906   else
907     val = IDENTIFIER_GLOBAL_VALUE (name);
908   return val;
909 }
910
911 /* Similar to `lookup_name' but look only at current binding level and
912    the previous one if its the parameter level.  */
913
914 static tree
915 lookup_name_current_level (name)
916      tree name;
917 {
918   register tree t;
919
920   if (current_binding_level == global_binding_level)
921     return IDENTIFIER_GLOBAL_VALUE (name);
922
923   if (IDENTIFIER_LOCAL_VALUE (name) == 0)
924     return 0;
925
926   for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
927     if (DECL_NAME (t) == name)
928       break;
929
930   return t;
931 }
932
933 /* Use a binding level to record a labeled block declaration */
934
935 void
936 push_labeled_block (lb)
937     tree lb;
938 {
939   register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
940   register struct binding_level *b = current_binding_level;
941   tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
942   if (oldlocal != 0)
943       b->shadowed = tree_cons (name, oldlocal, b->shadowed);
944   TREE_CHAIN (lb) = b->names;
945   b->names = lb;
946   IDENTIFIER_LOCAL_VALUE (name) = lb;
947 }
948
949 /* Pop the current binding level, reinstalling values for the previous
950    labeled block */
951
952 void
953 pop_labeled_block ()
954 {
955   struct binding_level *b = current_binding_level;
956   tree label =  b->names;
957   IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) = 
958     NULL_TREE;
959   if (b->shadowed)
960     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) = 
961       TREE_VALUE (b->shadowed);
962
963   /* Pop the current level, and free the structure for reuse.  */
964   current_binding_level = current_binding_level->level_chain;
965   b->level_chain = free_binding_level;
966   free_binding_level = b;
967 }
968
969 /* Record a decl-node X as belonging to the current lexical scope.
970    Check for errors (such as an incompatible declaration for the same
971    name already seen in the same scope).
972
973    Returns either X or an old decl for the same name.
974    If an old decl is returned, it may have been smashed
975    to agree with what X says.  */
976
977 tree
978 pushdecl (x)
979      tree x;
980 {
981   register tree t;
982   register tree name = DECL_NAME (x);
983   register struct binding_level *b = current_binding_level;
984   
985   if (TREE_CODE (x) != TYPE_DECL)
986     DECL_CONTEXT (x) = current_function_decl;
987   if (name)
988     {
989       const char *file;
990       int line;
991
992       t = lookup_name_current_level (name);
993       if (t != 0 && t == error_mark_node)
994         /* error_mark_node is 0 for a while during initialization!  */
995         {
996           t = 0;
997           error_with_decl (x, "`%s' used prior to declaration");
998         }
999
1000       if (t != 0)
1001         {
1002           file = DECL_SOURCE_FILE (t);
1003           line = DECL_SOURCE_LINE (t);
1004         }
1005
1006       /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1007          to point to the TYPE_DECL.
1008          Since Java does not have typedefs, a type can only have
1009          one (true) name, given by a class, interface, or builtin. */
1010       if (TREE_CODE (x) == TYPE_DECL
1011           && TYPE_NAME (TREE_TYPE (x)) == 0
1012           && TREE_TYPE (x) != error_mark_node)
1013         {
1014           TYPE_NAME (TREE_TYPE (x)) = x;
1015           TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1016         }
1017
1018       /* This name is new in its binding level.
1019          Install the new declaration and return it.  */
1020       if (b == global_binding_level)
1021         {
1022           /* Install a global value.  */
1023           
1024           IDENTIFIER_GLOBAL_VALUE (name) = x;
1025         }
1026       else
1027         {
1028           /* Here to install a non-global value.  */
1029           tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1030           IDENTIFIER_LOCAL_VALUE (name) = x;
1031
1032 #if 0
1033           /* Warn if shadowing an argument at the top level of the body.  */
1034           if (oldlocal != 0 && !DECL_EXTERNAL (x)
1035               /* This warning doesn't apply to the parms of a nested fcn.  */
1036               && ! current_binding_level->parm_flag
1037               /* Check that this is one level down from the parms.  */
1038               && current_binding_level->level_chain->parm_flag
1039               /* Check that the decl being shadowed
1040                  comes from the parm level, one level up.  */
1041               && chain_member (oldlocal, current_binding_level->level_chain->names))
1042             {
1043               if (TREE_CODE (oldlocal) == PARM_DECL)
1044                 pedwarn ("declaration of `%s' shadows a parameter",
1045                          IDENTIFIER_POINTER (name));
1046               else
1047                 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1048                          IDENTIFIER_POINTER (name));
1049             }
1050
1051           /* Maybe warn if shadowing something else.  */
1052           else if (warn_shadow && !DECL_EXTERNAL (x)
1053                    /* No shadow warnings for internally generated vars.  */
1054                    && DECL_SOURCE_LINE (x) != 0
1055                    /* No shadow warnings for vars made for inlining.  */
1056                    && ! DECL_FROM_INLINE (x))
1057             {
1058               const char *warnstring = 0;
1059
1060               if (TREE_CODE (x) == PARM_DECL
1061                   && current_binding_level->level_chain->parm_flag)
1062                 /* Don't warn about the parm names in function declarator
1063                    within a function declarator.
1064                    It would be nice to avoid warning in any function
1065                    declarator in a declaration, as opposed to a definition,
1066                    but there is no way to tell it's not a definition.  */
1067                 ;
1068               else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1069                 warnstring = "declaration of `%s' shadows a parameter";
1070               else if (oldlocal != 0)
1071                 warnstring = "declaration of `%s' shadows previous local";
1072               else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1073                        && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1074                 warnstring = "declaration of `%s' shadows global declaration";
1075
1076               if (warnstring)
1077                 warning (warnstring, IDENTIFIER_POINTER (name));
1078             }
1079 #endif
1080
1081           /* If storing a local value, there may already be one (inherited).
1082              If so, record it for restoration when this binding level ends.  */
1083           if (oldlocal != 0)
1084             b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1085         }
1086     }
1087
1088   /* Put decls on list in reverse order.
1089      We will reverse them later if necessary.  */
1090   TREE_CHAIN (x) = b->names;
1091   b->names = x;
1092
1093   return x;
1094 }
1095
1096 void
1097 pushdecl_force_head (x)
1098      tree x;
1099 {
1100   current_binding_level->names = x;
1101 }
1102
1103 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate.  */
1104
1105 tree
1106 pushdecl_top_level (x)
1107      tree x;
1108 {
1109   register tree t;
1110   register struct binding_level *b = current_binding_level;
1111
1112   current_binding_level = global_binding_level;
1113   t = pushdecl (x);
1114   current_binding_level = b;
1115   return t;
1116 }
1117
1118 /* Nonzero if we are currently in the global binding level.  */
1119
1120 int
1121 global_bindings_p ()
1122 {
1123   return current_binding_level == global_binding_level;
1124 }
1125
1126 /* Return the list of declarations of the current level.
1127    Note that this list is in reverse order unless/until
1128    you nreverse it; and when you do nreverse it, you must
1129    store the result back using `storedecls' or you will lose.  */
1130
1131 tree
1132 getdecls ()
1133 {
1134   return current_binding_level->names;
1135 }
1136
1137 /* Create a new `struct binding_level'.  */
1138
1139 static struct binding_level *
1140 make_binding_level ()
1141 {
1142   /* NOSTRICT */
1143   return (struct binding_level *) xmalloc (sizeof (struct binding_level));
1144 }
1145
1146 void
1147 pushlevel (unused)
1148   int unused ATTRIBUTE_UNUSED;
1149 {
1150   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1151
1152 #if 0
1153   /* If this is the top level of a function,
1154      just make sure that NAMED_LABELS is 0.  */
1155
1156   if (current_binding_level == global_binding_level)
1157     named_labels = 0;
1158 #endif
1159
1160   /* Reuse or create a struct for this binding level.  */
1161
1162   if (free_binding_level)
1163     {
1164       newlevel = free_binding_level;
1165       free_binding_level = free_binding_level->level_chain;
1166     }
1167   else
1168     {
1169       newlevel = make_binding_level ();
1170     }
1171
1172   /* Add this level to the front of the chain (stack) of levels that
1173      are active.  */
1174
1175   *newlevel = clear_binding_level;
1176   newlevel->level_chain = current_binding_level;
1177   current_binding_level = newlevel;
1178 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1179   newlevel->binding_depth = binding_depth;
1180   indent ();
1181   fprintf (stderr, "push %s level 0x%08x pc %d\n",
1182            (is_class_level) ? "class" : "block", newlevel, current_pc);
1183   is_class_level = 0;
1184   binding_depth++;
1185 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1186 }
1187
1188 /* Exit a binding level.
1189    Pop the level off, and restore the state of the identifier-decl mappings
1190    that were in effect when this level was entered.
1191
1192    If KEEP is nonzero, this level had explicit declarations, so
1193    and create a "block" (a BLOCK node) for the level
1194    to record its declarations and subblocks for symbol table output.
1195
1196    If FUNCTIONBODY is nonzero, this level is the body of a function,
1197    so create a block as if KEEP were set and also clear out all
1198    label names.
1199
1200    If REVERSE is nonzero, reverse the order of decls before putting
1201    them into the BLOCK.  */
1202
1203 tree
1204 poplevel (keep, reverse, functionbody)
1205      int keep;
1206      int reverse;
1207      int functionbody;
1208 {
1209   register tree link;
1210   /* The chain of decls was accumulated in reverse order.
1211      Put it into forward order, just for cleanliness.  */
1212   tree decls;
1213   tree subblocks = current_binding_level->blocks;
1214   tree block = 0;
1215   tree decl;
1216   int block_previously_created;
1217
1218 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1219   binding_depth--;
1220   indent ();
1221   if (current_binding_level->end_pc != LARGEST_PC)
1222     fprintf (stderr, "pop  %s level 0x%08x pc %d (end pc %d)\n",
1223              (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1224              current_binding_level->end_pc);
1225   else
1226     fprintf (stderr, "pop  %s level 0x%08x pc %d\n",
1227              (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1228 #if 0
1229   if (is_class_level != (current_binding_level == class_binding_level))
1230     {
1231       indent ();
1232       fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1233     }
1234   is_class_level = 0;
1235 #endif
1236 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1237
1238   /* Get the decls in the order they were written.
1239      Usually current_binding_level->names is in reverse order.
1240      But parameter decls were previously put in forward order.  */
1241
1242   if (reverse)
1243     current_binding_level->names
1244       = decls = nreverse (current_binding_level->names);
1245   else
1246     decls = current_binding_level->names;
1247
1248   /* Output any nested inline functions within this block
1249      if they weren't already output.  */
1250
1251   for (decl = decls; decl; decl = TREE_CHAIN (decl))
1252     if (TREE_CODE (decl) == FUNCTION_DECL
1253         && ! TREE_ASM_WRITTEN (decl)
1254         && DECL_INITIAL (decl) != 0
1255         && TREE_ADDRESSABLE (decl))
1256       {
1257         /* If this decl was copied from a file-scope decl
1258            on account of a block-scope extern decl,
1259            propagate TREE_ADDRESSABLE to the file-scope decl.
1260
1261            DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1262            true, since then the decl goes through save_for_inline_copying.  */
1263         if (DECL_ABSTRACT_ORIGIN (decl) != 0
1264             && DECL_ABSTRACT_ORIGIN (decl) != decl)
1265           TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1266         else
1267           {
1268             push_function_context ();
1269             output_inline_function (decl);
1270             pop_function_context ();
1271           }
1272       }
1273
1274   /* If there were any declarations in that level,
1275      or if this level is a function body,
1276      create a BLOCK to record them for the life of this function.  */
1277
1278   block = 0;
1279   block_previously_created = (current_binding_level->this_block != 0);
1280   if (block_previously_created)
1281     block = current_binding_level->this_block;
1282   else if (keep || functionbody)
1283     block = make_node (BLOCK);
1284   if (block != 0)
1285     {
1286       BLOCK_VARS (block) = decls;
1287       BLOCK_SUBBLOCKS (block) = subblocks;
1288     }
1289
1290   /* In each subblock, record that this is its superior.  */
1291
1292   for (link = subblocks; link; link = TREE_CHAIN (link))
1293     BLOCK_SUPERCONTEXT (link) = block;
1294
1295   /* Clear out the meanings of the local variables of this level.  */
1296
1297   for (link = decls; link; link = TREE_CHAIN (link))
1298     {
1299       tree name = DECL_NAME (link);
1300       if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1301         {
1302           /* If the ident. was used or addressed via a local extern decl,
1303              don't forget that fact.  */
1304           if (DECL_EXTERNAL (link))
1305             {
1306               if (TREE_USED (link))
1307                 TREE_USED (name) = 1;
1308               if (TREE_ADDRESSABLE (link))
1309                 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1310             }
1311           IDENTIFIER_LOCAL_VALUE (name) = 0;
1312         }
1313     }
1314
1315   /* Restore all name-meanings of the outer levels
1316      that were shadowed by this level.  */
1317
1318   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1319     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1320
1321   /* If the level being exited is the top level of a function,
1322      check over all the labels, and clear out the current
1323      (function local) meanings of their names.  */
1324
1325   if (functionbody)
1326     {
1327       /* If this is the top level block of a function,
1328          the vars are the function's parameters.
1329          Don't leave them in the BLOCK because they are
1330          found in the FUNCTION_DECL instead.  */
1331
1332       BLOCK_VARS (block) = 0;
1333
1334       /* Clear out the definitions of all label names,
1335          since their scopes end here,
1336          and add them to BLOCK_VARS.  */
1337
1338 #if 0
1339       for (link = named_labels; link; link = TREE_CHAIN (link))
1340         {
1341           register tree label = TREE_VALUE (link);
1342
1343           if (DECL_INITIAL (label) == 0)
1344             {
1345               error_with_decl (label, "label `%s' used but not defined");
1346               /* Avoid crashing later.  */
1347               define_label (input_filename, lineno,
1348                             DECL_NAME (label));
1349             }
1350           else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1351             warning_with_decl (label, "label `%s' defined but not used");
1352           IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1353
1354           /* Put the labels into the "variables" of the
1355              top-level block, so debugger can see them.  */
1356           TREE_CHAIN (label) = BLOCK_VARS (block);
1357           BLOCK_VARS (block) = label;
1358         }
1359 #endif
1360     }
1361
1362   /* Pop the current level, and free the structure for reuse.  */
1363
1364   {
1365     register struct binding_level *level = current_binding_level;
1366     current_binding_level = current_binding_level->level_chain;
1367
1368     level->level_chain = free_binding_level;
1369     free_binding_level = level;
1370   }
1371
1372   /* Dispose of the block that we just made inside some higher level.  */
1373   if (functionbody)
1374     DECL_INITIAL (current_function_decl) = block;
1375   else if (block)
1376     {
1377       if (!block_previously_created)
1378         current_binding_level->blocks
1379           = chainon (current_binding_level->blocks, block);
1380     }
1381   /* If we did not make a block for the level just exited,
1382      any blocks made for inner levels
1383      (since they cannot be recorded as subblocks in that level)
1384      must be carried forward so they will later become subblocks
1385      of something else.  */
1386   else if (subblocks)
1387     current_binding_level->blocks
1388       = chainon (current_binding_level->blocks, subblocks);
1389
1390   /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1391      binding contour so that they point to the appropriate construct, i.e.
1392      either to the current FUNCTION_DECL node, or else to the BLOCK node
1393      we just constructed.
1394
1395      Note that for tagged types whose scope is just the formal parameter
1396      list for some function type specification, we can't properly set
1397      their TYPE_CONTEXTs here, because we don't have a pointer to the
1398      appropriate FUNCTION_TYPE node readily available to us.  For those
1399      cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1400      in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1401      node which will represent the "scope" for these "parameter list local"
1402      tagged types.
1403   */
1404
1405   if (block)
1406     TREE_USED (block) = 1;
1407   return block;
1408 }
1409
1410 void
1411 maybe_pushlevels (pc)
1412      int pc;
1413 {
1414 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1415   current_pc = pc;
1416 #endif
1417
1418   while (pending_local_decls != NULL_TREE &&
1419          DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1420     {
1421       tree *ptr = &pending_local_decls;
1422       tree decl = *ptr;
1423       int end_pc = DECL_LOCAL_END_PC (decl);
1424
1425       while (*ptr != NULL_TREE
1426              && DECL_LOCAL_START_PC (*ptr) <= pc
1427              && DECL_LOCAL_END_PC (*ptr) == end_pc)
1428         ptr = &TREE_CHAIN (*ptr);
1429       pending_local_decls = *ptr;
1430       *ptr = NULL_TREE;
1431
1432       /* Force non-nested range to be nested in current range. */
1433       if (end_pc > current_binding_level->end_pc)
1434         end_pc = current_binding_level->end_pc;
1435
1436       maybe_start_try (pc, end_pc);
1437       
1438       pushlevel (1);
1439       expand_start_bindings (0);
1440
1441       current_binding_level->end_pc = end_pc;
1442       current_binding_level->start_pc = pc;      
1443       current_binding_level->names = decl;
1444       for ( ; decl != NULL_TREE;  decl = TREE_CHAIN (decl))
1445         {
1446           push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1447         }
1448     }      
1449
1450   maybe_start_try (pc, 0);
1451 }
1452
1453 void
1454 maybe_poplevels (pc)
1455      int pc;
1456 {
1457 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1458   current_pc = pc;
1459 #endif
1460
1461   while (current_binding_level->end_pc <= pc)
1462     {
1463       expand_end_bindings (getdecls (), 1, 0);
1464       maybe_end_try (current_binding_level->start_pc, pc);
1465       poplevel (1, 0, 0);
1466     }
1467   maybe_end_try (0, pc);
1468 }
1469
1470 /* Terminate any binding which began during the range beginning at
1471    start_pc.  This tidies up improperly nested local variable ranges
1472    and exception handlers; a variable declared within an exception
1473    range is forcibly terminated when that exception ends. */
1474
1475 void
1476 force_poplevels (start_pc)
1477      int start_pc;
1478 {
1479   while (current_binding_level->start_pc > start_pc)
1480     {
1481       if (pedantic && current_binding_level->start_pc > start_pc)
1482         warning_with_decl (current_function_decl, 
1483                            "In %s: overlapped variable and exception ranges at %d",
1484                            current_binding_level->start_pc);
1485       expand_end_bindings (getdecls (), 1, 0);
1486       poplevel (1, 0, 0);
1487     }
1488 }
1489
1490 /* Insert BLOCK at the end of the list of subblocks of the
1491    current binding level.  This is used when a BIND_EXPR is expanded,
1492    to handle the BLOCK node inside the BIND_EXPR.  */
1493
1494 void
1495 insert_block (block)
1496      tree block;
1497 {
1498   TREE_USED (block) = 1;
1499   current_binding_level->blocks
1500     = chainon (current_binding_level->blocks, block);
1501 }
1502
1503 /* Set the BLOCK node for the innermost scope
1504    (the one we are currently in).  */
1505
1506 void
1507 set_block (block)
1508      register tree block;
1509 {
1510   current_binding_level->this_block = block;
1511   current_binding_level->names = chainon (current_binding_level->names,
1512                                           BLOCK_VARS (block));
1513   current_binding_level->blocks = chainon (current_binding_level->blocks,
1514                                            BLOCK_SUBBLOCKS (block));
1515 }
1516
1517 /* integrate_decl_tree calls this function. */
1518
1519 void
1520 copy_lang_decl (node)
1521      tree node;
1522 {
1523   int lang_decl_size
1524     = TREE_CODE (node) == VAR_DECL ? sizeof (struct lang_decl_var)
1525     : sizeof (struct lang_decl);
1526   struct lang_decl *x = (struct lang_decl *) ggc_alloc (lang_decl_size);
1527   memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1528   DECL_LANG_SPECIFIC (node) = x;
1529 }
1530
1531 /* If DECL has a cleanup, build and return that cleanup here.
1532    This is a callback called by expand_expr.  */
1533
1534 tree
1535 maybe_build_cleanup (decl)
1536   tree decl ATTRIBUTE_UNUSED;
1537 {
1538   /* There are no cleanups in Java (I think).  */
1539   return NULL_TREE;
1540 }
1541
1542 void
1543 give_name_to_locals (jcf)
1544      JCF *jcf;
1545 {
1546   int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1547   int code_offset = DECL_CODE_OFFSET (current_function_decl);
1548   tree parm;
1549   pending_local_decls = NULL_TREE;
1550   if (n == 0)
1551     return;
1552   JCF_SEEK (jcf, n);
1553   n = JCF_readu2 (jcf);
1554   for (i = 0; i < n; i++)
1555     {
1556       int start_pc = JCF_readu2 (jcf);
1557       int length = JCF_readu2 (jcf);
1558       int name_index = JCF_readu2 (jcf);
1559       int signature_index = JCF_readu2 (jcf);
1560       int slot = JCF_readu2 (jcf);
1561       tree name = get_name_constant (jcf, name_index);
1562       tree type = parse_signature (jcf, signature_index);
1563       if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1564           && start_pc == 0
1565           && length == DECL_CODE_LENGTH (current_function_decl))
1566         {
1567           tree decl = TREE_VEC_ELT (decl_map, slot);
1568           DECL_NAME (decl) = name;
1569           SET_DECL_ASSEMBLER_NAME (decl, name);
1570           if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1571             warning ("bad type in parameter debug info");
1572         }
1573       else
1574         {
1575           tree *ptr;
1576           int end_pc = start_pc + length;
1577           tree decl = build_decl (VAR_DECL, name, type);
1578           if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1579             {
1580               warning_with_decl (decl,
1581                          "bad PC range for debug info for local `%s'");
1582               end_pc = DECL_CODE_LENGTH (current_function_decl);
1583             }
1584
1585           /* Adjust start_pc if necessary so that the local's first
1586              store operation will use the relevant DECL as a
1587              destination. Fore more information, read the leading
1588              comments for expr.c:maybe_adjust_start_pc. */
1589           start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1590
1591           MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1592           DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1593           DECL_LOCAL_START_PC (decl) = start_pc;
1594 #if 0
1595           /* FIXME: The range used internally for exceptions and local
1596              variable ranges, is a half-open interval: 
1597              start_pc <= pc < end_pc.  However, the range used in the
1598              Java VM spec is inclusive at both ends: 
1599              start_pc <= pc <= end_pc. */
1600           end_pc++;
1601 #endif
1602           DECL_LOCAL_END_PC (decl) = end_pc;
1603
1604           /* Now insert the new decl in the proper place in
1605              pending_local_decls.  We are essentially doing an insertion sort,
1606              which works fine, since the list input will normally already
1607              be sorted. */
1608           ptr = &pending_local_decls;
1609           while (*ptr != NULL_TREE
1610                  && (DECL_LOCAL_START_PC (*ptr) > start_pc
1611                      || (DECL_LOCAL_START_PC (*ptr) == start_pc
1612                          && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1613             ptr = &TREE_CHAIN (*ptr);
1614           TREE_CHAIN (decl) = *ptr;
1615           *ptr = decl;
1616         }
1617     }
1618
1619   pending_local_decls = nreverse (pending_local_decls);
1620
1621   /* Fill in default names for the parameters. */ 
1622   for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1623        parm != NULL_TREE;  parm = TREE_CHAIN (parm), i++)
1624     {
1625       if (DECL_NAME (parm) == NULL_TREE)
1626         {
1627           int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1628           if (arg_i == 0)
1629             DECL_NAME (parm) = get_identifier ("this");
1630           else
1631             {
1632               char buffer[12];
1633               sprintf (buffer, "ARG_%d", arg_i);
1634               DECL_NAME (parm) = get_identifier (buffer);
1635             }
1636           SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1637         }
1638     }
1639 }
1640
1641 tree
1642 build_result_decl (fndecl)
1643   tree fndecl;
1644 {
1645   tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1646   /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1647   if (INTEGRAL_TYPE_P (restype)
1648       && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1649     restype = integer_type_node;
1650   return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype));
1651 }
1652
1653 void
1654 complete_start_java_method (fndecl)
1655   tree fndecl;
1656 {
1657   if (! flag_emit_class_files)
1658     {
1659       /* Initialize the RTL code for the function.  */
1660       init_function_start (fndecl, input_filename, lineno);
1661
1662       /* Set up parameters and prepare for return, for the function.  */
1663       expand_function_start (fndecl, 0);
1664     }
1665
1666 #if 0
1667       /* If this fcn was already referenced via a block-scope `extern' decl (or
1668          an implicit decl), propagate certain information about the usage. */
1669       if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1670         TREE_ADDRESSABLE (current_function_decl) = 1;
1671
1672 #endif
1673
1674   if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1675       && ! flag_emit_class_files
1676       && ! DECL_CLINIT_P (fndecl)
1677       && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1678     {
1679       tree clas = DECL_CONTEXT (fndecl);
1680       tree init = build (CALL_EXPR, void_type_node,
1681                          build_address_of (soft_initclass_node),
1682                          build_tree_list (NULL_TREE, build_class_ref (clas)),
1683                          NULL_TREE);
1684       TREE_SIDE_EFFECTS (init) = 1;
1685       expand_expr_stmt (init);
1686     }
1687
1688   /* Push local variables. Function compiled from source code are
1689      using a different local variables management, and for them,
1690      pushlevel shouldn't be called from here.  */
1691   if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1692     {
1693       pushlevel (2);
1694       if (! flag_emit_class_files)
1695         expand_start_bindings (1);
1696     }
1697
1698   if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1699     {
1700       /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1701       tree enter, exit, lock;
1702       if (METHOD_STATIC (fndecl))
1703         lock = build_class_ref (DECL_CONTEXT (fndecl));
1704       else
1705         lock = DECL_ARGUMENTS (fndecl);
1706       BUILD_MONITOR_ENTER (enter, lock);
1707       BUILD_MONITOR_EXIT (exit, lock);
1708       if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1709         {
1710           expand_expr_stmt (enter);
1711           expand_decl_cleanup (NULL_TREE, exit);
1712         }
1713       else
1714         {
1715           tree function_body = DECL_FUNCTION_BODY (fndecl);
1716           tree body = BLOCK_EXPR_BODY (function_body);
1717           lock = build (WITH_CLEANUP_EXPR, void_type_node,
1718                         enter, exit, NULL_TREE);
1719           TREE_SIDE_EFFECTS (lock) = 1;
1720           lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
1721           TREE_SIDE_EFFECTS (lock) = 1;
1722           lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
1723           TREE_SIDE_EFFECTS (lock) = 1;
1724           BLOCK_EXPR_BODY (function_body) = lock;
1725         }
1726     }
1727 }
1728
1729 void
1730 start_java_method (fndecl)
1731      tree fndecl;
1732 {
1733   tree tem, *ptr;
1734   int i;
1735
1736   current_function_decl = fndecl;
1737   announce_function (fndecl);
1738
1739   i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1740   decl_map = make_tree_vec (i);
1741   type_map = (tree *) xrealloc (type_map, i * sizeof (tree));
1742
1743 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1744   fprintf (stderr, "%s:\n", (*decl_printable_name) (fndecl, 2));
1745   current_pc = 0;
1746 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1747   pushlevel (1);  /* Push parameters. */
1748
1749   ptr = &DECL_ARGUMENTS (fndecl);
1750   for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1751        tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1752     {
1753       tree parm_name = NULL_TREE, parm_decl;
1754       tree parm_type = TREE_VALUE (tem);
1755       if (i >= DECL_MAX_LOCALS (fndecl))
1756         abort ();
1757
1758       parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1759       DECL_CONTEXT (parm_decl) = fndecl;
1760       if (PROMOTE_PROTOTYPES
1761           && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1762           && INTEGRAL_TYPE_P (parm_type))
1763         parm_type = integer_type_node;
1764       DECL_ARG_TYPE (parm_decl) = parm_type;
1765
1766       *ptr = parm_decl;
1767       ptr = &TREE_CHAIN (parm_decl);
1768
1769       /* Add parm_decl to the decl_map. */
1770       push_jvm_slot (i, parm_decl);
1771
1772       type_map[i] = TREE_TYPE (parm_decl);
1773       if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1774         {
1775           i++;
1776           type_map[i] = void_type_node;
1777         }
1778     }
1779   *ptr = NULL_TREE;
1780   DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1781
1782   while (i < DECL_MAX_LOCALS(fndecl))
1783     type_map[i++] = NULL_TREE;
1784
1785   build_result_decl (fndecl);
1786   complete_start_java_method (fndecl);
1787 }
1788
1789 void
1790 end_java_method ()
1791 {
1792   tree fndecl = current_function_decl;
1793
1794   expand_end_bindings (getdecls (), 1, 0);
1795   /* pop out of function */
1796   poplevel (1, 1, 0);
1797
1798   /* pop out of its parameters */
1799   poplevel (1, 0, 1);
1800
1801   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1802
1803   /* Generate rtl for function exit.  */
1804   expand_function_end (input_filename, lineno, 0);
1805
1806   /* Run the optimizers and output assembler code for this function. */
1807   rest_of_compilation (fndecl);
1808
1809   current_function_decl = NULL_TREE;
1810 }
1811
1812 /* Mark language-specific parts of T for garbage-collection.  */
1813
1814 void
1815 lang_mark_tree (t)
1816      tree t;
1817 {
1818   if (TREE_CODE (t) == IDENTIFIER_NODE)
1819     {
1820       struct lang_identifier *li = (struct lang_identifier *) t;
1821       ggc_mark_tree (li->global_value);
1822       ggc_mark_tree (li->local_value);
1823       ggc_mark_tree (li->utf8_ref);
1824     }
1825   else if (TREE_CODE (t) == VAR_DECL
1826            || TREE_CODE (t) == PARM_DECL
1827            || TREE_CODE (t) == FIELD_DECL)
1828     {
1829       struct lang_decl_var *ldv = 
1830         ((struct lang_decl_var *) DECL_LANG_SPECIFIC (t));
1831       if (ldv)
1832         {
1833           ggc_mark (ldv);
1834           ggc_mark_tree (ldv->slot_chain);
1835           ggc_mark_tree (ldv->am);
1836           ggc_mark_tree (ldv->wfl);
1837         }
1838     }
1839   else if (TREE_CODE (t) == FUNCTION_DECL)
1840     {
1841       struct lang_decl *ld = DECL_LANG_SPECIFIC (t);
1842       
1843       if (ld)
1844         {
1845           ggc_mark (ld);
1846           ggc_mark_tree (ld->wfl);
1847           ggc_mark_tree (ld->throws_list);
1848           ggc_mark_tree (ld->function_decl_body);
1849           ggc_mark_tree (ld->called_constructor);
1850           ggc_mark_tree (ld->inner_access);
1851           ggc_mark_tree_hash_table (&ld->init_test_table);
1852           ggc_mark_tree_hash_table (&ld->ict);
1853           ggc_mark_tree_hash_table (&ld->smic);
1854         }
1855     }
1856   else if (TYPE_P (t))
1857     {
1858       struct lang_type *lt = TYPE_LANG_SPECIFIC (t);
1859       
1860       if (lt)
1861         {
1862           ggc_mark (lt);
1863           ggc_mark_tree (lt->signature);
1864           ggc_mark_tree (lt->cpool_data_ref);
1865           ggc_mark_tree (lt->finit_stmt_list);
1866           ggc_mark_tree (lt->clinit_stmt_list);
1867           ggc_mark_tree (lt->ii_block);
1868           ggc_mark_tree (lt->dot_class);
1869           ggc_mark_tree (lt->package_list);
1870         }
1871     }
1872 }