OSDN Git Service

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