OSDN Git Service

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