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