decl.c (java_init_decl_processing): Declare signers field.
[gcc.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 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
667 /* This isn't exactly true, but it is what we have in the source.
668 There is an unresolved issue here, which is whether the vtable
669 should be marked by the GC. */
670 if (! flag_hash_synchronization)
671 PUSH_FIELD (object_type_node, field, "sync_info",
672 build_pointer_type (object_type_node));
673 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
674 FIELD_PRIVATE (t) = 1;
675 FINISH_RECORD (object_type_node);
676
677 field_type_node = make_node (RECORD_TYPE);
678 field_ptr_type_node = build_pointer_type (field_type_node);
679 method_type_node = make_node (RECORD_TYPE);
680 method_ptr_type_node = build_pointer_type (method_type_node);
681
682 set_super_info (0, class_type_node, object_type_node, 0);
683 set_super_info (0, string_type_node, object_type_node, 0);
684 class_ptr_type = build_pointer_type (class_type_node);
685
686 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
687 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
688 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
689 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
690 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
691 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
692 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
693 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
694 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
695 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
696 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
697 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
698 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
699 PUSH_FIELD (class_type_node, field, "otable", otable_ptr_type);
700 PUSH_FIELD (class_type_node, field, "otable_syms",
701 symbols_array_ptr_type);
702 PUSH_FIELD (class_type_node, field, "atable", atable_ptr_type);
703 PUSH_FIELD (class_type_node, field, "atable_syms",
704 symbols_array_ptr_type);
705 PUSH_FIELD (class_type_node, field, "interfaces",
706 build_pointer_type (class_ptr_type));
707 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
708 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
709 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
710 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
711 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
712 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
713 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
714 PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);
715 PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
716 PUSH_FIELD (class_type_node, field, "signers", ptr_type_node);
717 PUSH_FIELD (class_type_node, field, "chain", ptr_type_node);
718 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
719 FIELD_PRIVATE (t) = 1;
720 push_super_field (class_type_node, object_type_node);
721
722 FINISH_RECORD (class_type_node);
723 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
724
725 field_info_union_node = make_node (UNION_TYPE);
726 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
727 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
728 #if 0
729 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
730 #endif
731 layout_type (field_info_union_node);
732
733 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
734 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
735 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
736 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
737 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
738 FINISH_RECORD (field_type_node);
739 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
740
741 nativecode_ptr_array_type_node
742 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
743
744 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
745 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
746 FINISH_RECORD (dtable_type);
747 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
748
749 #define jint_type int_type_node
750 #define jint_ptr_type ptr_type_node
751
752 jexception_type = make_node (RECORD_TYPE);
753 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
754 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
755 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
756 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
757 FINISH_RECORD (jexception_type);
758 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
759 jexception_ptr_type = build_pointer_type (jexception_type);
760
761 lineNumberEntry_type = make_node (RECORD_TYPE);
762 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
763 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
764 FINISH_RECORD (lineNumberEntry_type);
765
766 lineNumbers_type = make_node (RECORD_TYPE);
767 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
768 FINISH_RECORD (lineNumbers_type);
769
770 #define instn_ptr_type_node ptr_type_node /* XXX JH */
771
772 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
773
774 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
775 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
776 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
777 PUSH_FIELD (method_type_node, field, "index", unsigned_short_type_node);
778 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
779 PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
780 FINISH_RECORD (method_type_node);
781 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
782
783 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
784
785 t = tree_cons (NULL_TREE, class_ptr_type,
786 tree_cons (NULL_TREE, int_type_node, endlink));
787 alloc_object_node = builtin_function ("_Jv_AllocObject",
788 build_function_type (ptr_type_node, t),
789 0, NOT_BUILT_IN, NULL, NULL_TREE);
790 DECL_IS_MALLOC (alloc_object_node) = 1;
791 alloc_no_finalizer_node =
792 builtin_function ("_Jv_AllocObjectNoFinalizer",
793 build_function_type (ptr_type_node, t),
794 0, NOT_BUILT_IN, NULL, NULL_TREE);
795 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
796
797 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
798 soft_initclass_node = builtin_function ("_Jv_InitClass",
799 build_function_type (void_type_node,
800 t),
801 0, NOT_BUILT_IN, NULL, NULL_TREE);
802
803 throw_node = builtin_function ("_Jv_Throw",
804 build_function_type (ptr_type_node, t),
805 0, NOT_BUILT_IN, NULL, NULL_TREE);
806 /* Mark throw_nodes as `noreturn' functions with side effects. */
807 TREE_THIS_VOLATILE (throw_node) = 1;
808 TREE_SIDE_EFFECTS (throw_node) = 1;
809
810 t = build_function_type (int_type_node, endlink);
811 soft_monitorenter_node
812 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
813 NULL, NULL_TREE);
814 soft_monitorexit_node
815 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
816 NULL, NULL_TREE);
817
818 t = tree_cons (NULL_TREE, int_type_node,
819 tree_cons (NULL_TREE, int_type_node, endlink));
820 soft_newarray_node
821 = builtin_function ("_Jv_NewPrimArray",
822 build_function_type(ptr_type_node, t),
823 0, NOT_BUILT_IN, NULL, NULL_TREE);
824 DECL_IS_MALLOC (soft_newarray_node) = 1;
825
826 t = tree_cons (NULL_TREE, int_type_node,
827 tree_cons (NULL_TREE, class_ptr_type,
828 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
829 soft_anewarray_node
830 = builtin_function ("_Jv_NewObjectArray",
831 build_function_type (ptr_type_node, t),
832 0, NOT_BUILT_IN, NULL, NULL_TREE);
833 DECL_IS_MALLOC (soft_anewarray_node) = 1;
834
835 /* There is no endlink here because _Jv_NewMultiArray is a varargs
836 function. */
837 t = tree_cons (NULL_TREE, ptr_type_node,
838 tree_cons (NULL_TREE, int_type_node, NULL_TREE));
839 soft_multianewarray_node
840 = builtin_function ("_Jv_NewMultiArray",
841 build_function_type (ptr_type_node, t),
842 0, NOT_BUILT_IN, NULL, NULL_TREE);
843 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
844
845 t = build_function_type (void_type_node,
846 tree_cons (NULL_TREE, int_type_node, endlink));
847 soft_badarrayindex_node
848 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
849 0, NOT_BUILT_IN, NULL, NULL_TREE);
850 /* Mark soft_badarrayindex_node as a `noreturn' function with side
851 effects. */
852 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
853 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
854
855 soft_nullpointer_node
856 = builtin_function ("_Jv_ThrowNullPointerException",
857 build_function_type (void_type_node, endlink),
858 0, NOT_BUILT_IN, NULL, NULL_TREE);
859 /* Mark soft_nullpointer_node as a `noreturn' function with side
860 effects. */
861 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
862 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
863
864 t = tree_cons (NULL_TREE, class_ptr_type,
865 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
866 soft_checkcast_node
867 = builtin_function ("_Jv_CheckCast",
868 build_function_type (ptr_type_node, t),
869 0, NOT_BUILT_IN, NULL, NULL_TREE);
870 t = tree_cons (NULL_TREE, object_ptr_type_node,
871 tree_cons (NULL_TREE, class_ptr_type, endlink));
872 soft_instanceof_node
873 = builtin_function ("_Jv_IsInstanceOf",
874 build_function_type (boolean_type_node, t),
875 0, NOT_BUILT_IN, NULL, NULL_TREE);
876 t = tree_cons (NULL_TREE, object_ptr_type_node,
877 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
878 soft_checkarraystore_node
879 = builtin_function ("_Jv_CheckArrayStore",
880 build_function_type (void_type_node, t),
881 0, NOT_BUILT_IN, NULL, NULL_TREE);
882 t = tree_cons (NULL_TREE, ptr_type_node,
883 tree_cons (NULL_TREE, ptr_type_node,
884 tree_cons (NULL_TREE, int_type_node, endlink)));
885 soft_lookupinterfacemethod_node
886 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
887 build_function_type (ptr_type_node, t),
888 0, NOT_BUILT_IN, NULL, NULL_TREE);
889
890 t = tree_cons (NULL_TREE, object_ptr_type_node,
891 tree_cons (NULL_TREE, ptr_type_node,
892 tree_cons (NULL_TREE, ptr_type_node,
893 tree_cons (NULL_TREE, int_type_node,
894 endlink))));
895 soft_lookupjnimethod_node
896 = builtin_function ("_Jv_LookupJNIMethod",
897 build_function_type (ptr_type_node, t),
898 0, NOT_BUILT_IN, NULL, NULL_TREE);
899 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
900 soft_getjnienvnewframe_node
901 = builtin_function ("_Jv_GetJNIEnvNewFrame",
902 build_function_type (ptr_type_node, t),
903 0, NOT_BUILT_IN, NULL, NULL_TREE);
904 soft_jnipopsystemframe_node
905 = builtin_function ("_Jv_JNI_PopSystemFrame",
906 build_function_type (ptr_type_node, t),
907 0, NOT_BUILT_IN, NULL, NULL_TREE);
908
909 soft_idiv_node
910 = builtin_function ("_Jv_divI",
911 build_function_type (int_type_node, t),
912 0, NOT_BUILT_IN, NULL, NULL_TREE);
913
914 soft_irem_node
915 = builtin_function ("_Jv_remI",
916 build_function_type (int_type_node, t),
917 0, NOT_BUILT_IN, NULL, NULL_TREE);
918
919 soft_ldiv_node
920 = builtin_function ("_Jv_divJ",
921 build_function_type (long_type_node, t),
922 0, NOT_BUILT_IN, NULL, NULL_TREE);
923
924 soft_lrem_node
925 = builtin_function ("_Jv_remJ",
926 build_function_type (long_type_node, t),
927 0, NOT_BUILT_IN, NULL, NULL_TREE);
928
929 /* Initialize variables for except.c. */
930 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
931 ? "__gcj_personality_sj0"
932 : "__gcj_personality_v0");
933 lang_eh_runtime_type = prepare_eh_table_type;
934
935 init_jcf_parse ();
936
937 initialize_builtins ();
938
939 soft_fmod_node = built_in_decls[BUILT_IN_FMOD];
940 #if 0
941 soft_fmodf_node = built_in_decls[BUILT_IN_FMODF];
942 #endif
943 }
944
945
946 /* Look up NAME in the current binding level and its superiors
947 in the namespace of variables, functions and typedefs.
948 Return a ..._DECL node of some kind representing its definition,
949 or return 0 if it is undefined. */
950
951 tree
952 lookup_name (tree name)
953 {
954 register tree val;
955 if (current_binding_level != global_binding_level
956 && IDENTIFIER_LOCAL_VALUE (name))
957 val = IDENTIFIER_LOCAL_VALUE (name);
958 else
959 val = IDENTIFIER_GLOBAL_VALUE (name);
960 return val;
961 }
962
963 /* Similar to `lookup_name' but look only at current binding level and
964 the previous one if its the parameter level. */
965
966 static tree
967 lookup_name_current_level (tree name)
968 {
969 register tree t;
970
971 if (current_binding_level == global_binding_level)
972 return IDENTIFIER_GLOBAL_VALUE (name);
973
974 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
975 return 0;
976
977 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
978 if (DECL_NAME (t) == name)
979 break;
980
981 return t;
982 }
983
984 /* Use a binding level to record a labeled block declaration */
985
986 void
987 push_labeled_block (tree lb)
988 {
989 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
990 register struct binding_level *b = current_binding_level;
991 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
992 if (oldlocal != 0)
993 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
994 TREE_CHAIN (lb) = b->names;
995 b->names = lb;
996 IDENTIFIER_LOCAL_VALUE (name) = lb;
997 }
998
999 /* Pop the current binding level, reinstalling values for the previous
1000 labeled block */
1001
1002 void
1003 pop_labeled_block (void)
1004 {
1005 struct binding_level *b = current_binding_level;
1006 tree label = b->names;
1007 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
1008 NULL_TREE;
1009 if (b->shadowed)
1010 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
1011 TREE_VALUE (b->shadowed);
1012
1013 /* Pop the current level, and free the structure for reuse. */
1014 current_binding_level = current_binding_level->level_chain;
1015 b->level_chain = free_binding_level;
1016 free_binding_level = b;
1017 }
1018
1019 /* Record a decl-node X as belonging to the current lexical scope.
1020 Check for errors (such as an incompatible declaration for the same
1021 name already seen in the same scope).
1022
1023 Returns either X or an old decl for the same name.
1024 If an old decl is returned, it may have been smashed
1025 to agree with what X says. */
1026
1027 tree
1028 pushdecl (tree x)
1029 {
1030 register tree t;
1031 register tree name = DECL_NAME (x);
1032 register struct binding_level *b = current_binding_level;
1033
1034 if (TREE_CODE (x) != TYPE_DECL)
1035 DECL_CONTEXT (x) = current_function_decl;
1036 if (name)
1037 {
1038 t = lookup_name_current_level (name);
1039 if (t != 0 && t == error_mark_node)
1040 /* error_mark_node is 0 for a while during initialization! */
1041 {
1042 t = 0;
1043 error ("%J'%D' used prior to declaration", x, x);
1044 }
1045
1046 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1047 to point to the TYPE_DECL.
1048 Since Java does not have typedefs, a type can only have
1049 one (true) name, given by a class, interface, or builtin. */
1050 if (TREE_CODE (x) == TYPE_DECL
1051 && TYPE_NAME (TREE_TYPE (x)) == 0
1052 && TREE_TYPE (x) != error_mark_node)
1053 {
1054 TYPE_NAME (TREE_TYPE (x)) = x;
1055 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1056 }
1057
1058 /* This name is new in its binding level.
1059 Install the new declaration and return it. */
1060 if (b == global_binding_level)
1061 {
1062 /* Install a global value. */
1063
1064 IDENTIFIER_GLOBAL_VALUE (name) = x;
1065 }
1066 else
1067 {
1068 /* Here to install a non-global value. */
1069 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1070 IDENTIFIER_LOCAL_VALUE (name) = x;
1071
1072 #if 0
1073 /* Warn if shadowing an argument at the top level of the body. */
1074 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1075 /* This warning doesn't apply to the parms of a nested fcn. */
1076 && ! current_binding_level->parm_flag
1077 /* Check that this is one level down from the parms. */
1078 && current_binding_level->level_chain->parm_flag
1079 /* Check that the decl being shadowed
1080 comes from the parm level, one level up. */
1081 && chain_member (oldlocal, current_binding_level->level_chain->names))
1082 {
1083 if (TREE_CODE (oldlocal) == PARM_DECL)
1084 pedwarn ("declaration of `%s' shadows a parameter",
1085 IDENTIFIER_POINTER (name));
1086 else
1087 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1088 IDENTIFIER_POINTER (name));
1089 }
1090
1091 /* Maybe warn if shadowing something else. */
1092 else if (warn_shadow && !DECL_EXTERNAL (x)
1093 /* No shadow warnings for internally generated vars. */
1094 && DECL_SOURCE_LINE (x) != 0
1095 /* No shadow warnings for vars made for inlining. */
1096 && ! DECL_FROM_INLINE (x))
1097 {
1098 const char *warnstring = 0;
1099
1100 if (TREE_CODE (x) == PARM_DECL
1101 && current_binding_level->level_chain->parm_flag)
1102 /* Don't warn about the parm names in function declarator
1103 within a function declarator.
1104 It would be nice to avoid warning in any function
1105 declarator in a declaration, as opposed to a definition,
1106 but there is no way to tell it's not a definition. */
1107 ;
1108 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1109 warnstring = "declaration of `%s' shadows a parameter";
1110 else if (oldlocal != 0)
1111 warnstring = "declaration of `%s' shadows previous local";
1112 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1113 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1114 warnstring = "declaration of `%s' shadows global declaration";
1115
1116 if (warnstring)
1117 warning (warnstring, IDENTIFIER_POINTER (name));
1118 }
1119 #endif
1120
1121 /* If storing a local value, there may already be one (inherited).
1122 If so, record it for restoration when this binding level ends. */
1123 if (oldlocal != 0)
1124 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1125 }
1126 }
1127
1128 /* Put decls on list in reverse order.
1129 We will reverse them later if necessary. */
1130 TREE_CHAIN (x) = b->names;
1131 b->names = x;
1132
1133 return x;
1134 }
1135
1136 void
1137 pushdecl_force_head (tree x)
1138 {
1139 current_binding_level->names = x;
1140 }
1141
1142 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1143
1144 tree
1145 pushdecl_top_level (tree x)
1146 {
1147 register tree t;
1148 register struct binding_level *b = current_binding_level;
1149
1150 current_binding_level = global_binding_level;
1151 t = pushdecl (x);
1152 current_binding_level = b;
1153 return t;
1154 }
1155
1156 /* Nonzero if we are currently in the global binding level. */
1157
1158 int
1159 global_bindings_p (void)
1160 {
1161 return current_binding_level == global_binding_level;
1162 }
1163
1164 /* Return the list of declarations of the current level.
1165 Note that this list is in reverse order unless/until
1166 you nreverse it; and when you do nreverse it, you must
1167 store the result back using `storedecls' or you will lose. */
1168
1169 tree
1170 getdecls (void)
1171 {
1172 return current_binding_level->names;
1173 }
1174
1175 /* Create a new `struct binding_level'. */
1176
1177 static struct binding_level *
1178 make_binding_level (void)
1179 {
1180 /* NOSTRICT */
1181 return xmalloc (sizeof (struct binding_level));
1182 }
1183
1184 void
1185 pushlevel (int unused ATTRIBUTE_UNUSED)
1186 {
1187 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1188
1189 #if 0
1190 /* If this is the top level of a function,
1191 just make sure that NAMED_LABELS is 0. */
1192
1193 if (current_binding_level == global_binding_level)
1194 named_labels = 0;
1195 #endif
1196
1197 /* Reuse or create a struct for this binding level. */
1198
1199 if (free_binding_level)
1200 {
1201 newlevel = free_binding_level;
1202 free_binding_level = free_binding_level->level_chain;
1203 }
1204 else
1205 {
1206 newlevel = make_binding_level ();
1207 }
1208
1209 /* Add this level to the front of the chain (stack) of levels that
1210 are active. */
1211
1212 *newlevel = clear_binding_level;
1213 newlevel->level_chain = current_binding_level;
1214 current_binding_level = newlevel;
1215 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1216 newlevel->binding_depth = binding_depth;
1217 indent ();
1218 fprintf (stderr, "push %s level 0x%08x pc %d\n",
1219 (is_class_level) ? "class" : "block", newlevel, current_pc);
1220 is_class_level = 0;
1221 binding_depth++;
1222 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1223 }
1224
1225 /* Exit a binding level.
1226 Pop the level off, and restore the state of the identifier-decl mappings
1227 that were in effect when this level was entered.
1228
1229 If KEEP is nonzero, this level had explicit declarations, so
1230 and create a "block" (a BLOCK node) for the level
1231 to record its declarations and subblocks for symbol table output.
1232
1233 If FUNCTIONBODY is nonzero, this level is the body of a function,
1234 so create a block as if KEEP were set and also clear out all
1235 label names.
1236
1237 If REVERSE is nonzero, reverse the order of decls before putting
1238 them into the BLOCK. */
1239
1240 tree
1241 poplevel (int keep, int reverse, int functionbody)
1242 {
1243 register tree link;
1244 /* The chain of decls was accumulated in reverse order.
1245 Put it into forward order, just for cleanliness. */
1246 tree decls;
1247 tree subblocks = current_binding_level->blocks;
1248 tree block = 0;
1249 tree decl;
1250 int block_previously_created;
1251
1252 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1253 binding_depth--;
1254 indent ();
1255 if (current_binding_level->end_pc != LARGEST_PC)
1256 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1257 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1258 current_binding_level->end_pc);
1259 else
1260 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1261 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1262 #if 0
1263 if (is_class_level != (current_binding_level == class_binding_level))
1264 {
1265 indent ();
1266 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1267 }
1268 is_class_level = 0;
1269 #endif
1270 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1271
1272 /* Get the decls in the order they were written.
1273 Usually current_binding_level->names is in reverse order.
1274 But parameter decls were previously put in forward order. */
1275
1276 if (reverse)
1277 current_binding_level->names
1278 = decls = nreverse (current_binding_level->names);
1279 else
1280 decls = current_binding_level->names;
1281
1282 /* Output any nested inline functions within this block
1283 if they weren't already output. */
1284
1285 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1286 if (TREE_CODE (decl) == FUNCTION_DECL
1287 && ! TREE_ASM_WRITTEN (decl)
1288 && DECL_INITIAL (decl) != 0
1289 && TREE_ADDRESSABLE (decl))
1290 {
1291 /* If this decl was copied from a file-scope decl
1292 on account of a block-scope extern decl,
1293 propagate TREE_ADDRESSABLE to the file-scope decl.
1294
1295 DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1296 true, since then the decl goes through save_for_inline_copying. */
1297 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1298 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1299 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1300 else
1301 {
1302 push_function_context ();
1303 output_inline_function (decl);
1304 pop_function_context ();
1305 }
1306 }
1307
1308 /* If there were any declarations in that level,
1309 or if this level is a function body,
1310 create a BLOCK to record them for the life of this function. */
1311
1312 block = 0;
1313 block_previously_created = (current_binding_level->this_block != 0);
1314 if (block_previously_created)
1315 block = current_binding_level->this_block;
1316 else if (keep || functionbody)
1317 block = make_node (BLOCK);
1318 if (block != 0)
1319 {
1320 BLOCK_VARS (block) = decls;
1321 BLOCK_SUBBLOCKS (block) = subblocks;
1322 }
1323
1324 /* In each subblock, record that this is its superior. */
1325
1326 for (link = subblocks; link; link = TREE_CHAIN (link))
1327 BLOCK_SUPERCONTEXT (link) = block;
1328
1329 /* Clear out the meanings of the local variables of this level. */
1330
1331 for (link = decls; link; link = TREE_CHAIN (link))
1332 {
1333 tree name = DECL_NAME (link);
1334 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1335 {
1336 /* If the ident. was used or addressed via a local extern decl,
1337 don't forget that fact. */
1338 if (DECL_EXTERNAL (link))
1339 {
1340 if (TREE_USED (link))
1341 TREE_USED (name) = 1;
1342 if (TREE_ADDRESSABLE (link))
1343 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1344 }
1345 IDENTIFIER_LOCAL_VALUE (name) = 0;
1346 }
1347 }
1348
1349 /* Restore all name-meanings of the outer levels
1350 that were shadowed by this level. */
1351
1352 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1353 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1354
1355 /* If the level being exited is the top level of a function,
1356 check over all the labels, and clear out the current
1357 (function local) meanings of their names. */
1358
1359 if (functionbody)
1360 {
1361 /* If this is the top level block of a function,
1362 the vars are the function's parameters.
1363 Don't leave them in the BLOCK because they are
1364 found in the FUNCTION_DECL instead. */
1365
1366 BLOCK_VARS (block) = 0;
1367
1368 /* Clear out the definitions of all label names,
1369 since their scopes end here,
1370 and add them to BLOCK_VARS. */
1371
1372 #if 0
1373 for (link = named_labels; link; link = TREE_CHAIN (link))
1374 {
1375 register tree label = TREE_VALUE (link);
1376
1377 if (DECL_INITIAL (label) == 0)
1378 {
1379 error ("%Jlabel '%D' used but not defined", label, label);
1380 /* Avoid crashing later. */
1381 define_label (input_location, DECL_NAME (label));
1382 }
1383 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1384 warning ("%Jlabel '%D' defined but not used", label, label);
1385 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1386
1387 /* Put the labels into the "variables" of the
1388 top-level block, so debugger can see them. */
1389 TREE_CHAIN (label) = BLOCK_VARS (block);
1390 BLOCK_VARS (block) = label;
1391 }
1392 #endif
1393 }
1394
1395 /* Pop the current level, and free the structure for reuse. */
1396
1397 {
1398 register struct binding_level *level = current_binding_level;
1399 current_binding_level = current_binding_level->level_chain;
1400
1401 level->level_chain = free_binding_level;
1402 free_binding_level = level;
1403 }
1404
1405 /* Dispose of the block that we just made inside some higher level. */
1406 if (functionbody)
1407 DECL_INITIAL (current_function_decl) = block;
1408 else if (block)
1409 {
1410 if (!block_previously_created)
1411 current_binding_level->blocks
1412 = chainon (current_binding_level->blocks, block);
1413 }
1414 /* If we did not make a block for the level just exited,
1415 any blocks made for inner levels
1416 (since they cannot be recorded as subblocks in that level)
1417 must be carried forward so they will later become subblocks
1418 of something else. */
1419 else if (subblocks)
1420 current_binding_level->blocks
1421 = chainon (current_binding_level->blocks, subblocks);
1422
1423 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1424 binding contour so that they point to the appropriate construct, i.e.
1425 either to the current FUNCTION_DECL node, or else to the BLOCK node
1426 we just constructed.
1427
1428 Note that for tagged types whose scope is just the formal parameter
1429 list for some function type specification, we can't properly set
1430 their TYPE_CONTEXTs here, because we don't have a pointer to the
1431 appropriate FUNCTION_TYPE node readily available to us. For those
1432 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1433 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1434 node which will represent the "scope" for these "parameter list local"
1435 tagged types.
1436 */
1437
1438 if (block)
1439 TREE_USED (block) = 1;
1440 return block;
1441 }
1442
1443 void
1444 maybe_pushlevels (int pc)
1445 {
1446 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1447 current_pc = pc;
1448 #endif
1449
1450 while (pending_local_decls != NULL_TREE &&
1451 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1452 {
1453 tree *ptr = &pending_local_decls;
1454 tree decl = *ptr;
1455 int end_pc = DECL_LOCAL_END_PC (decl);
1456
1457 while (*ptr != NULL_TREE
1458 && DECL_LOCAL_START_PC (*ptr) <= pc
1459 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1460 ptr = &TREE_CHAIN (*ptr);
1461 pending_local_decls = *ptr;
1462 *ptr = NULL_TREE;
1463
1464 /* Force non-nested range to be nested in current range. */
1465 if (end_pc > current_binding_level->end_pc)
1466 end_pc = current_binding_level->end_pc;
1467
1468 maybe_start_try (pc, end_pc);
1469
1470 pushlevel (1);
1471 expand_start_bindings (0);
1472
1473 current_binding_level->end_pc = end_pc;
1474 current_binding_level->start_pc = pc;
1475 current_binding_level->names = decl;
1476 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1477 {
1478 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1479 }
1480 }
1481
1482 maybe_start_try (pc, 0);
1483 }
1484
1485 void
1486 maybe_poplevels (int pc)
1487 {
1488 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1489 current_pc = pc;
1490 #endif
1491
1492 while (current_binding_level->end_pc <= pc)
1493 {
1494 expand_end_bindings (getdecls (), 1, 0);
1495 maybe_end_try (current_binding_level->start_pc, pc);
1496 poplevel (1, 0, 0);
1497 }
1498 maybe_end_try (0, pc);
1499 }
1500
1501 /* Terminate any binding which began during the range beginning at
1502 start_pc. This tidies up improperly nested local variable ranges
1503 and exception handlers; a variable declared within an exception
1504 range is forcibly terminated when that exception ends. */
1505
1506 void
1507 force_poplevels (int start_pc)
1508 {
1509 while (current_binding_level->start_pc > start_pc)
1510 {
1511 if (pedantic && current_binding_level->start_pc > start_pc)
1512 warning ("%JIn %D: overlapped variable and exception ranges at %d",
1513 current_function_decl, current_function_decl,
1514 current_binding_level->start_pc);
1515 expand_end_bindings (getdecls (), 1, 0);
1516 poplevel (1, 0, 0);
1517 }
1518 }
1519
1520 /* Insert BLOCK at the end of the list of subblocks of the
1521 current binding level. This is used when a BIND_EXPR is expanded,
1522 to handle the BLOCK node inside the BIND_EXPR. */
1523
1524 void
1525 insert_block (tree block)
1526 {
1527 TREE_USED (block) = 1;
1528 current_binding_level->blocks
1529 = chainon (current_binding_level->blocks, block);
1530 }
1531
1532 /* Set the BLOCK node for the innermost scope
1533 (the one we are currently in). */
1534
1535 void
1536 set_block (tree block)
1537 {
1538 current_binding_level->this_block = block;
1539 current_binding_level->names = chainon (current_binding_level->names,
1540 BLOCK_VARS (block));
1541 current_binding_level->blocks = chainon (current_binding_level->blocks,
1542 BLOCK_SUBBLOCKS (block));
1543 }
1544
1545 /* integrate_decl_tree calls this function. */
1546
1547 void
1548 java_dup_lang_specific_decl (tree node)
1549 {
1550 int lang_decl_size;
1551 struct lang_decl *x;
1552
1553 if (!DECL_LANG_SPECIFIC (node))
1554 return;
1555
1556 lang_decl_size = sizeof (struct lang_decl);
1557 x = ggc_alloc (lang_decl_size);
1558 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1559 DECL_LANG_SPECIFIC (node) = x;
1560 }
1561
1562 void
1563 give_name_to_locals (JCF *jcf)
1564 {
1565 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1566 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1567 tree parm;
1568 pending_local_decls = NULL_TREE;
1569 if (n == 0)
1570 return;
1571 JCF_SEEK (jcf, n);
1572 n = JCF_readu2 (jcf);
1573 for (i = 0; i < n; i++)
1574 {
1575 int start_pc = JCF_readu2 (jcf);
1576 int length = JCF_readu2 (jcf);
1577 int name_index = JCF_readu2 (jcf);
1578 int signature_index = JCF_readu2 (jcf);
1579 int slot = JCF_readu2 (jcf);
1580 tree name = get_name_constant (jcf, name_index);
1581 tree type = parse_signature (jcf, signature_index);
1582 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1583 && start_pc == 0
1584 && length == DECL_CODE_LENGTH (current_function_decl))
1585 {
1586 tree decl = TREE_VEC_ELT (decl_map, slot);
1587 DECL_NAME (decl) = name;
1588 SET_DECL_ASSEMBLER_NAME (decl, name);
1589 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1590 warning ("bad type in parameter debug info");
1591 }
1592 else
1593 {
1594 tree *ptr;
1595 int end_pc = start_pc + length;
1596 tree decl = build_decl (VAR_DECL, name, type);
1597 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1598 {
1599 warning ("%Jbad PC range for debug info for local '%D'",
1600 decl, decl);
1601 end_pc = DECL_CODE_LENGTH (current_function_decl);
1602 }
1603
1604 /* Adjust start_pc if necessary so that the local's first
1605 store operation will use the relevant DECL as a
1606 destination. Fore more information, read the leading
1607 comments for expr.c:maybe_adjust_start_pc. */
1608 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1609
1610 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1611 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1612 DECL_LOCAL_START_PC (decl) = start_pc;
1613 #if 0
1614 /* FIXME: The range used internally for exceptions and local
1615 variable ranges, is a half-open interval:
1616 start_pc <= pc < end_pc. However, the range used in the
1617 Java VM spec is inclusive at both ends:
1618 start_pc <= pc <= end_pc. */
1619 end_pc++;
1620 #endif
1621 DECL_LOCAL_END_PC (decl) = end_pc;
1622
1623 /* Now insert the new decl in the proper place in
1624 pending_local_decls. We are essentially doing an insertion sort,
1625 which works fine, since the list input will normally already
1626 be sorted. */
1627 ptr = &pending_local_decls;
1628 while (*ptr != NULL_TREE
1629 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1630 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1631 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1632 ptr = &TREE_CHAIN (*ptr);
1633 TREE_CHAIN (decl) = *ptr;
1634 *ptr = decl;
1635 }
1636 }
1637
1638 pending_local_decls = nreverse (pending_local_decls);
1639
1640 /* Fill in default names for the parameters. */
1641 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1642 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1643 {
1644 if (DECL_NAME (parm) == NULL_TREE)
1645 {
1646 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1647 if (arg_i == 0)
1648 DECL_NAME (parm) = get_identifier ("this");
1649 else
1650 {
1651 char buffer[12];
1652 sprintf (buffer, "ARG_%d", arg_i);
1653 DECL_NAME (parm) = get_identifier (buffer);
1654 }
1655 SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1656 }
1657 }
1658 }
1659
1660 tree
1661 build_result_decl (tree fndecl)
1662 {
1663 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1664 tree result = DECL_RESULT (fndecl);
1665 if (! result)
1666 {
1667 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1668 if (INTEGRAL_TYPE_P (restype)
1669 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1670 restype = integer_type_node;
1671 result = build_decl (RESULT_DECL, NULL_TREE, restype);
1672 DECL_CONTEXT (result) = fndecl;
1673 DECL_RESULT (fndecl) = result;
1674 }
1675 return result;
1676 }
1677
1678 void
1679 complete_start_java_method (tree fndecl)
1680 {
1681 if (! flag_emit_class_files)
1682 {
1683 /* Initialize the RTL code for the function. */
1684 init_function_start (fndecl);
1685
1686 /* Set up parameters and prepare for return, for the function. */
1687 expand_function_start (fndecl, 0);
1688 }
1689
1690 #if 0
1691 /* If this fcn was already referenced via a block-scope `extern' decl (or
1692 an implicit decl), propagate certain information about the usage. */
1693 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1694 TREE_ADDRESSABLE (current_function_decl) = 1;
1695
1696 #endif
1697
1698 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1699 && ! flag_emit_class_files
1700 && ! DECL_CLINIT_P (fndecl)
1701 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1702 {
1703 tree clas = DECL_CONTEXT (fndecl);
1704 tree init = build (CALL_EXPR, void_type_node,
1705 build_address_of (soft_initclass_node),
1706 build_tree_list (NULL_TREE, build_class_ref (clas)),
1707 NULL_TREE);
1708 TREE_SIDE_EFFECTS (init) = 1;
1709 expand_expr_stmt (init);
1710 }
1711
1712 /* Push local variables. Function compiled from source code are
1713 using a different local variables management, and for them,
1714 pushlevel shouldn't be called from here. */
1715 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1716 {
1717 pushlevel (2);
1718 if (! flag_emit_class_files)
1719 expand_start_bindings (1);
1720 }
1721
1722 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1723 {
1724 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1725 tree enter, exit, lock;
1726 if (METHOD_STATIC (fndecl))
1727 lock = build_class_ref (DECL_CONTEXT (fndecl));
1728 else
1729 lock = DECL_ARGUMENTS (fndecl);
1730 BUILD_MONITOR_ENTER (enter, lock);
1731 BUILD_MONITOR_EXIT (exit, lock);
1732 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1733 {
1734 expand_expr_stmt (enter);
1735 expand_decl_cleanup (NULL_TREE, exit);
1736 }
1737 else
1738 {
1739 tree function_body = DECL_FUNCTION_BODY (fndecl);
1740 tree body = BLOCK_EXPR_BODY (function_body);
1741 lock = build (COMPOUND_EXPR, void_type_node,
1742 enter,
1743 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
1744 TREE_SIDE_EFFECTS (lock) = 1;
1745 BLOCK_EXPR_BODY (function_body) = lock;
1746 }
1747 }
1748 }
1749
1750 void
1751 start_java_method (tree fndecl)
1752 {
1753 tree tem, *ptr;
1754 int i;
1755
1756 current_function_decl = fndecl;
1757 announce_function (fndecl);
1758
1759 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1760 decl_map = make_tree_vec (i);
1761 type_map = xrealloc (type_map, i * sizeof (tree));
1762
1763 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1764 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1765 current_pc = 0;
1766 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1767 pushlevel (1); /* Push parameters. */
1768
1769 ptr = &DECL_ARGUMENTS (fndecl);
1770 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1771 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1772 {
1773 tree parm_name = NULL_TREE, parm_decl;
1774 tree parm_type = TREE_VALUE (tem);
1775 if (i >= DECL_MAX_LOCALS (fndecl))
1776 abort ();
1777
1778 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1779 DECL_CONTEXT (parm_decl) = fndecl;
1780 if (PROMOTE_PROTOTYPES
1781 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1782 && INTEGRAL_TYPE_P (parm_type))
1783 parm_type = integer_type_node;
1784 DECL_ARG_TYPE (parm_decl) = parm_type;
1785
1786 *ptr = parm_decl;
1787 ptr = &TREE_CHAIN (parm_decl);
1788
1789 /* Add parm_decl to the decl_map. */
1790 push_jvm_slot (i, parm_decl);
1791
1792 type_map[i] = TREE_TYPE (parm_decl);
1793 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1794 {
1795 i++;
1796 type_map[i] = void_type_node;
1797 }
1798 }
1799 *ptr = NULL_TREE;
1800 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1801
1802 while (i < DECL_MAX_LOCALS(fndecl))
1803 type_map[i++] = NULL_TREE;
1804
1805 build_result_decl (fndecl);
1806 complete_start_java_method (fndecl);
1807 }
1808
1809 void
1810 end_java_method (void)
1811 {
1812 tree fndecl = current_function_decl;
1813
1814 expand_end_bindings (getdecls (), 1, 0);
1815 /* pop out of function */
1816 poplevel (1, 1, 0);
1817
1818 /* pop out of its parameters */
1819 poplevel (1, 0, 1);
1820
1821 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1822
1823 /* Generate rtl for function exit. */
1824 expand_function_end ();
1825
1826 /* Run the optimizers and output assembler code for this function. */
1827 rest_of_compilation (fndecl);
1828
1829 current_function_decl = NULL_TREE;
1830 }
1831
1832 /* Expand a function's body. */
1833
1834 void
1835 java_expand_body (tree fndecl)
1836 {
1837 location_t saved_location = input_location;
1838
1839 current_function_decl = fndecl;
1840 input_location = DECL_SOURCE_LOCATION (fndecl);
1841
1842 timevar_push (TV_EXPAND);
1843
1844 /* Prepare the function for tree completion. */
1845 start_complete_expand_method (fndecl);
1846
1847 if (! flag_emit_class_files && ! flag_emit_xref)
1848 {
1849 /* Initialize the RTL code for the function. */
1850 init_function_start (fndecl);
1851
1852 /* Set up parameters and prepare for return, for the function. */
1853 expand_function_start (fndecl, 0);
1854
1855 /* Generate the RTL for this function. */
1856 expand_expr_stmt_value (DECL_SAVED_TREE (fndecl), 0, 1);
1857 }
1858
1859 /* Pop out of its parameters. */
1860 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
1861 poplevel (1, 0, 1);
1862 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1863
1864 if (! flag_emit_class_files && ! flag_emit_xref)
1865 {
1866 /* Generate RTL for function exit. */
1867 input_line = DECL_FUNCTION_LAST_LINE (fndecl);
1868 expand_function_end ();
1869
1870 /* Run the optimizers and output the assembler code
1871 for this function. */
1872 rest_of_compilation (fndecl);
1873 }
1874
1875 timevar_pop (TV_EXPAND);
1876
1877 input_location = saved_location;
1878
1879 current_function_decl = NULL_TREE;
1880 }
1881
1882 /* We pessimistically marked all methods and fields external until we
1883 knew what set of classes we were planning to compile. Now mark those
1884 associated with CLASS to be generated locally as not external. */
1885
1886 static void
1887 java_mark_decl_local (tree decl)
1888 {
1889 DECL_EXTERNAL (decl) = 0;
1890
1891 /* If we've already constructed DECL_RTL, give encode_section_info
1892 a second chance, now that we've changed the flags. */
1893 if (DECL_RTL_SET_P (decl))
1894 make_decl_rtl (decl, NULL);
1895 }
1896
1897 void
1898 java_mark_class_local (tree class)
1899 {
1900 tree t;
1901
1902 for (t = TYPE_FIELDS (class); t ; t = TREE_CHAIN (t))
1903 if (FIELD_STATIC (t))
1904 java_mark_decl_local (t);
1905
1906 for (t = TYPE_METHODS (class); t ; t = TREE_CHAIN (t))
1907 if (!METHOD_ABSTRACT (t) && (!METHOD_NATIVE (t) || flag_jni))
1908 java_mark_decl_local (t);
1909 }
1910
1911 #include "gt-java-decl.h"