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