OSDN Git Service

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