OSDN Git Service

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