OSDN Git Service

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