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