1 /* Process declarations and variables for the GNU compiler for the
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
4 Free Software Foundation, Inc.
6 This file is part of GNU CC.
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)
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.
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.
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. */
27 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
35 #include "java-tree.h"
41 #include "java-except.h"
44 #if defined (DEBUG_JAVA_BINDING_LEVELS)
45 extern void indent PROTO((void));
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));
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;
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. */
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. */
73 static tree pending_local_decls = NULL_TREE;
75 /* Push a local variable or stack slot into the decl_map,
76 and assign it an rtl. */
78 #if defined(DEBUG_JAVA_BINDING_LEVELS)
79 int binding_depth = 0;
80 int is_class_level = 0;
88 for (i = 0; i < binding_depth*2; i++)
91 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
94 push_jvm_slot (index, decl)
98 struct rtx_def *rtl = NULL;
99 tree type = TREE_TYPE (decl);
102 DECL_CONTEXT (decl) = current_function_decl;
103 layout_decl (decl, 0);
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)
110 if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)))
111 rtl = DECL_RTL_IF_SET (tmp);
114 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
117 SET_DECL_RTL (decl, rtl);
120 if (index >= DECL_MAX_LOCALS (current_function_decl))
121 DECL_REGISTER (decl) = 1;
125 /* Now link the decl into the decl_map. */
126 if (DECL_LANG_SPECIFIC (decl) == NULL)
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;
133 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
134 TREE_VEC_ELT (decl_map, index) = decl;
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. */
143 check_local_named_variable (best, decl, pc, updated)
149 if (pc >= DECL_LOCAL_START_PC (decl)
150 && pc < DECL_LOCAL_END_PC (decl))
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)))
164 /* Find the best declaration based upon type. If 'decl' fits 'type' better
165 than 'best', return 'decl'. Otherwise return 'best'. */
168 check_local_unnamed_variable (best, decl, type)
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))
181 if (best == NULL_TREE
182 || (TREE_TYPE (decl) == type && TREE_TYPE (best) != type))
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. */
195 find_local_variable (index, type, pc)
200 tree decl = TREE_VEC_ELT (decl_map, index);
201 tree best = NULL_TREE;
202 int found_scoped_var = 0;
204 /* Scan through every declaration that has been created in this slot. */
205 while (decl != NULL_TREE)
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)
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. */
218 best = check_local_named_variable (best, decl, pc,
221 /* We scan for type information unless we found a variable in the
222 proper scope already. */
223 else if (!found_scoped_var)
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);
230 decl = DECL_LOCAL_SLOT_CHAIN (decl);
233 if (best != NULL_TREE)
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));
241 /* Same as find_local_index, except that INDEX is a stack index. */
244 find_stack_slot (index, type)
248 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
254 /* A chain of _DECL nodes for all variables, constants, functions,
255 * and typedef types. These are in the reverse of the order supplied.
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). */
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. */
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. */
274 /* The binding level which this one is contained in (inherits from). */
275 struct binding_level *level_chain;
277 /* The bytecode PC that marks the end of this level. */
279 /* The bytecode PC that marks the start of this level. */
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) */
288 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
290 /* The binding level currently in effect. */
292 static struct binding_level *current_binding_level;
294 /* A chain of binding_level structures awaiting reuse. */
296 static struct binding_level *free_binding_level;
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. */
302 static struct binding_level *global_binding_level;
304 /* A PC value bigger than any PC value we may ever may encounter. */
306 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
308 /* Binding level structures are initialized by copying this one. */
310 static struct binding_level clear_binding_level
311 = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
312 NULL_BINDING_LEVEL, LARGEST_PC, 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. */
319 static tree named_labels;
321 /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
323 static tree shadowed_labels;
326 int flag_traditional;
328 tree java_global_trees[JTI_MAX];
330 tree predef_filenames[PREDEF_FILENAMES_SIZE];
332 /* Build (and pushdecl) a "promoted type" for all standard
333 types shorter than int. */
336 push_promoted_type (name, actual_type)
340 tree type = make_node (TREE_CODE (actual_type));
342 tree in_min = TYPE_MIN_VALUE (int_type_node);
343 tree in_max = TYPE_MAX_VALUE (int_type_node);
345 tree in_min = TYPE_MIN_VALUE (actual_type);
346 tree in_max = TYPE_MAX_VALUE (actual_type);
348 TYPE_MIN_VALUE (type) = copy_node (in_min);
349 TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
350 TYPE_MAX_VALUE (type) = copy_node (in_max);
351 TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
352 TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
354 pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
358 /* Return a definition for a builtin function named NAME and whose data type
359 is TYPE. TYPE should be a function type with argument types.
360 FUNCTION_CODE tells later passes how to compile calls to this function.
361 See tree.h for its possible values.
363 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
364 the name to be called if we can't opencode the function. */
367 builtin_function (name, type, function_code, class, library_name)
371 enum built_in_class class;
372 const char *library_name;
374 tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
375 DECL_EXTERNAL (decl) = 1;
376 TREE_PUBLIC (decl) = 1;
378 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
379 make_decl_rtl (decl, NULL);
381 DECL_BUILT_IN_CLASS (decl) = class;
382 DECL_FUNCTION_CODE (decl) = function_code;
386 /* Return tree that represents a vtable for a primitive array. */
388 create_primitive_vtable (name)
394 sprintf (buf, "_Jv_%sVTable", name);
395 r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
396 DECL_EXTERNAL (r) = 1;
401 init_decl_processing ()
403 register tree endlink;
404 tree field = NULL_TREE;
407 init_class_processing ();
409 current_function_decl = NULL;
410 current_binding_level = NULL_BINDING_LEVEL;
411 free_binding_level = NULL_BINDING_LEVEL;
412 pushlevel (0); /* make the binding_level structure for global names */
413 global_binding_level = current_binding_level;
415 /* The code here must be similar to build_common_tree_nodes{,_2} in
416 tree.c, especially as to the order of initializing common nodes. */
417 error_mark_node = make_node (ERROR_MARK);
418 TREE_TYPE (error_mark_node) = error_mark_node;
420 /* Create sizetype first - needed for other types. */
421 initialize_sizetypes ();
423 byte_type_node = make_signed_type (8);
424 pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
425 short_type_node = make_signed_type (16);
426 pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
427 int_type_node = make_signed_type (32);
428 pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
429 long_type_node = make_signed_type (64);
430 pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
432 unsigned_byte_type_node = make_unsigned_type (8);
433 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
434 unsigned_byte_type_node));
435 unsigned_short_type_node = make_unsigned_type (16);
436 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
437 unsigned_short_type_node));
438 unsigned_int_type_node = make_unsigned_type (32);
439 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
440 unsigned_int_type_node));
441 unsigned_long_type_node = make_unsigned_type (64);
442 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
443 unsigned_long_type_node));
445 set_sizetype (make_unsigned_type (POINTER_SIZE));
447 /* Define these next since types below may used them. */
448 integer_type_node = type_for_size (INT_TYPE_SIZE, 0);
449 integer_zero_node = build_int_2 (0, 0);
450 integer_one_node = build_int_2 (1, 0);
451 integer_two_node = build_int_2 (2, 0);
452 integer_four_node = build_int_2 (4, 0);
453 integer_minus_one_node = build_int_2 (-1, -1);
455 size_zero_node = size_int (0);
456 size_one_node = size_int (1);
457 bitsize_zero_node = bitsize_int (0);
458 bitsize_one_node = bitsize_int (1);
459 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
461 long_zero_node = build_int_2 (0, 0);
462 TREE_TYPE (long_zero_node) = long_type_node;
464 void_type_node = make_node (VOID_TYPE);
465 pushdecl (build_decl (TYPE_DECL, get_identifier ("void"), void_type_node));
466 layout_type (void_type_node); /* Uses size_zero_node */
467 ptr_type_node = build_pointer_type (void_type_node);
468 t = make_node (VOID_TYPE);
469 layout_type (t); /* Uses size_zero_node */
470 return_address_type_node = build_pointer_type (t);
472 null_pointer_node = build_int_2 (0, 0);
473 TREE_TYPE (null_pointer_node) = ptr_type_node;
475 /* Used by the parser to represent empty statements and blocks. */
476 empty_stmt_node = build1 (NOP_EXPR, void_type_node, size_zero_node);
477 CAN_COMPLETE_NORMALLY (empty_stmt_node) = 1;
480 /* Make a type to be the domain of a few array types
481 whose domains don't really matter.
482 200 is small enough that it always fits in size_t
483 and large enough that it can hold most function names for the
484 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
485 short_array_type_node = build_prim_array_type (short_type_node, 200);
487 char_type_node = make_node (CHAR_TYPE);
488 TYPE_PRECISION (char_type_node) = 16;
489 fixup_unsigned_type (char_type_node);
490 pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
492 boolean_type_node = make_node (BOOLEAN_TYPE);
493 TYPE_PRECISION (boolean_type_node) = 1;
494 fixup_unsigned_type (boolean_type_node);
495 pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
497 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
498 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
500 promoted_byte_type_node
501 = push_promoted_type ("promoted_byte", byte_type_node);
502 promoted_short_type_node
503 = push_promoted_type ("promoted_short", short_type_node);
504 promoted_char_type_node
505 = push_promoted_type ("promoted_char", char_type_node);
506 promoted_boolean_type_node
507 = push_promoted_type ("promoted_boolean", boolean_type_node);
509 float_type_node = make_node (REAL_TYPE);
510 TYPE_PRECISION (float_type_node) = 32;
511 pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
513 layout_type (float_type_node);
515 double_type_node = make_node (REAL_TYPE);
516 TYPE_PRECISION (double_type_node) = 64;
517 pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
519 layout_type (double_type_node);
521 float_zero_node = build_real (float_type_node, dconst0);
522 double_zero_node = build_real (double_type_node, dconst0);
524 /* These are the vtables for arrays of primitives. */
525 boolean_array_vtable = create_primitive_vtable ("boolean");
526 byte_array_vtable = create_primitive_vtable ("byte");
527 char_array_vtable = create_primitive_vtable ("char");
528 short_array_vtable = create_primitive_vtable ("short");
529 int_array_vtable = create_primitive_vtable ("int");
530 long_array_vtable = create_primitive_vtable ("long");
531 float_array_vtable = create_primitive_vtable ("float");
532 double_array_vtable = create_primitive_vtable ("double");
534 /* As you're adding items here, please update the code right after
535 this section, so that the filename containing the source code of
536 the pre-defined class gets registered correctly. */
537 unqualified_object_id_node = get_identifier ("Object");
538 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
539 object_ptr_type_node = promote_type (object_type_node);
540 string_type_node = lookup_class (get_identifier ("java.lang.String"));
541 string_ptr_type_node = promote_type (string_type_node);
542 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
543 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
544 runtime_exception_type_node =
545 lookup_class (get_identifier ("java.lang.RuntimeException"));
546 error_exception_type_node =
547 lookup_class (get_identifier ("java.lang.Error"));
548 rawdata_ptr_type_node
549 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
551 /* If you add to this section, don't forget to increase
552 PREDEF_FILENAMES_SIZE. */
553 predef_filenames [0] = get_identifier ("java/lang/Class.java");
554 predef_filenames [1] = get_identifier ("java/lang/Error.java");
555 predef_filenames [2] = get_identifier ("java/lang/Object.java");
556 predef_filenames [3] = get_identifier ("java/lang/RuntimeException.java");
557 predef_filenames [4] = get_identifier ("java/lang/String.java");
558 predef_filenames [5] = get_identifier ("java/lang/Throwable.java");
559 predef_filenames [6] = get_identifier ("gnu/gcj/RawData.java");
561 methodtable_type = make_node (RECORD_TYPE);
562 layout_type (methodtable_type);
563 build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
564 methodtable_ptr_type = build_pointer_type (methodtable_type);
566 TYPE_identifier_node = get_identifier ("TYPE");
567 init_identifier_node = get_identifier ("<init>");
568 clinit_identifier_node = get_identifier ("<clinit>");
569 /* Legacy `$finit$' special method identifier. This needs to be
570 recognized as equivalent to `finit$' but isn't generated anymore. */
571 finit_leg_identifier_node = get_identifier ("$finit$");
572 /* The new `finit$' special method identifier. This one is now
573 generated in place of `$finit$'. */
574 finit_identifier_node = get_identifier ("finit$");
575 void_signature_node = get_identifier ("()V");
576 length_identifier_node = get_identifier ("length");
577 this_identifier_node = get_identifier ("this");
578 super_identifier_node = get_identifier ("super");
579 continue_identifier_node = get_identifier ("continue");
580 access0_identifier_node = get_identifier ("access$0");
581 classdollar_identifier_node = get_identifier ("class$");
583 /* for lack of a better place to put this stub call */
584 init_expr_processing();
586 utf8const_type = make_node (RECORD_TYPE);
587 PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
588 PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
589 FINISH_RECORD (utf8const_type);
590 utf8const_ptr_type = build_pointer_type (utf8const_type);
592 constants_type_node = make_node (RECORD_TYPE);
593 PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
594 PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
595 PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
596 FINISH_RECORD (constants_type_node);
597 build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
599 access_flags_type_node = unsigned_short_type_node;
601 dtable_type = make_node (RECORD_TYPE);
602 dtable_ptr_type = build_pointer_type (dtable_type);
604 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
605 /* This isn't exactly true, but it is what we have in the source.
606 There is an unresolved issue here, which is whether the vtable
607 should be marked by the GC. */
608 if (! flag_hash_synchronization)
609 PUSH_FIELD (object_type_node, field, "sync_info",
610 build_pointer_type (object_type_node));
611 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
612 FIELD_PRIVATE (t) = 1;
613 FINISH_RECORD (object_type_node);
615 field_type_node = make_node (RECORD_TYPE);
616 field_ptr_type_node = build_pointer_type (field_type_node);
617 method_type_node = make_node (RECORD_TYPE);
618 method_ptr_type_node = build_pointer_type (method_type_node);
620 set_super_info (0, class_type_node, object_type_node, 0);
621 set_super_info (0, string_type_node, object_type_node, 0);
622 class_ptr_type = build_pointer_type (class_type_node);
624 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
625 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
626 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
627 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
628 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
629 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
630 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
631 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
632 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
633 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
634 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
635 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
636 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
637 PUSH_FIELD (class_type_node, field, "interfaces",
638 build_pointer_type (class_ptr_type));
639 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
640 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
641 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
642 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
643 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
644 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
645 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
646 PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);
647 PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
648 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
649 FIELD_PRIVATE (t) = 1;
650 push_super_field (class_type_node, object_type_node);
651 FINISH_RECORD (class_type_node);
652 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
654 field_info_union_node = make_node (UNION_TYPE);
655 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
656 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
658 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
660 layout_type (field_info_union_node);
662 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
663 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
664 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
665 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
666 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
667 FINISH_RECORD (field_type_node);
668 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
670 one_elt_array_domain_type = build_index_type (integer_one_node);
671 nativecode_ptr_array_type_node
672 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
674 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
675 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
676 FINISH_RECORD (dtable_type);
677 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
679 #define jint_type int_type_node
680 #define jint_ptr_type ptr_type_node
682 jexception_type = make_node (RECORD_TYPE);
683 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
684 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
685 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
686 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
687 FINISH_RECORD (jexception_type);
688 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
689 jexception_ptr_type = build_pointer_type (jexception_type);
691 lineNumberEntry_type = make_node (RECORD_TYPE);
692 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
693 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
694 FINISH_RECORD (lineNumberEntry_type);
696 lineNumbers_type = make_node (RECORD_TYPE);
697 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
698 FINISH_RECORD (lineNumbers_type);
700 #define instn_ptr_type_node ptr_type_node /* XXX JH */
702 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
704 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
705 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
706 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
707 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
708 FINISH_RECORD (method_type_node);
709 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
711 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
713 t = tree_cons (NULL_TREE, class_ptr_type,
714 tree_cons (NULL_TREE, int_type_node, endlink));
715 alloc_object_node = builtin_function ("_Jv_AllocObject",
716 build_function_type (ptr_type_node, t),
717 0, NOT_BUILT_IN, NULL);
718 DECL_IS_MALLOC (alloc_object_node) = 1;
720 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
721 soft_initclass_node = builtin_function ("_Jv_InitClass",
722 build_function_type (void_type_node,
724 0, NOT_BUILT_IN, NULL);
726 throw_node = builtin_function ("_Jv_Throw",
727 build_function_type (ptr_type_node, t),
728 0, NOT_BUILT_IN, NULL);
729 /* Mark throw_nodes as `noreturn' functions with side effects. */
730 TREE_THIS_VOLATILE (throw_node) = 1;
731 TREE_SIDE_EFFECTS (throw_node) = 1;
733 t = build_function_type (int_type_node, endlink);
734 soft_monitorenter_node
735 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, NULL);
736 soft_monitorexit_node
737 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN, NULL);
739 t = tree_cons (NULL_TREE, int_type_node,
740 tree_cons (NULL_TREE, int_type_node, endlink));
742 = builtin_function ("_Jv_NewPrimArray",
743 build_function_type(ptr_type_node, t),
744 0, NOT_BUILT_IN, NULL);
745 DECL_IS_MALLOC (soft_newarray_node) = 1;
747 t = tree_cons (NULL_TREE, int_type_node,
748 tree_cons (NULL_TREE, class_ptr_type,
749 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
751 = builtin_function ("_Jv_NewObjectArray",
752 build_function_type (ptr_type_node, t),
753 0, NOT_BUILT_IN, NULL);
754 DECL_IS_MALLOC (soft_anewarray_node) = 1;
756 t = tree_cons (NULL_TREE, ptr_type_node,
757 tree_cons (NULL_TREE, int_type_node, endlink));
758 soft_multianewarray_node
759 = builtin_function ("_Jv_NewMultiArray",
760 build_function_type (ptr_type_node, t),
761 0, NOT_BUILT_IN, NULL);
762 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
764 t = build_function_type (void_type_node,
765 tree_cons (NULL_TREE, int_type_node, endlink));
766 soft_badarrayindex_node
767 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
768 0, NOT_BUILT_IN, NULL);
769 /* Mark soft_badarrayindex_node as a `noreturn' function with side
771 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
772 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
774 soft_nullpointer_node
775 = builtin_function ("_Jv_ThrowNullPointerException",
776 build_function_type (void_type_node, endlink),
777 0, NOT_BUILT_IN, NULL);
778 /* Mark soft_nullpointer_node as a `noreturn' function with side
780 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
781 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
783 t = tree_cons (NULL_TREE, class_ptr_type,
784 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
786 = builtin_function ("_Jv_CheckCast",
787 build_function_type (ptr_type_node, t),
788 0, NOT_BUILT_IN, NULL);
789 t = tree_cons (NULL_TREE, object_ptr_type_node,
790 tree_cons (NULL_TREE, class_ptr_type, endlink));
792 = builtin_function ("_Jv_IsInstanceOf",
793 build_function_type (boolean_type_node, t),
794 0, NOT_BUILT_IN, NULL);
795 t = tree_cons (NULL_TREE, object_ptr_type_node,
796 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
797 soft_checkarraystore_node
798 = builtin_function ("_Jv_CheckArrayStore",
799 build_function_type (void_type_node, t),
800 0, NOT_BUILT_IN, NULL);
801 t = tree_cons (NULL_TREE, ptr_type_node,
802 tree_cons (NULL_TREE, ptr_type_node,
803 tree_cons (NULL_TREE, int_type_node, endlink)));
804 soft_lookupinterfacemethod_node
805 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
806 build_function_type (ptr_type_node, t),
807 0, NOT_BUILT_IN, NULL);
809 t = tree_cons (NULL_TREE, object_ptr_type_node,
810 tree_cons (NULL_TREE, ptr_type_node,
811 tree_cons (NULL_TREE, ptr_type_node, endlink)));
812 soft_lookupjnimethod_node
813 = builtin_function ("_Jv_LookupJNIMethod",
814 build_function_type (ptr_type_node, t),
815 0, NOT_BUILT_IN, NULL);
816 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
817 soft_getjnienvnewframe_node
818 = builtin_function ("_Jv_GetJNIEnvNewFrame",
819 build_function_type (ptr_type_node, t),
820 0, NOT_BUILT_IN, NULL);
821 soft_jnipopsystemframe_node
822 = builtin_function ("_Jv_JNI_PopSystemFrame",
823 build_function_type (ptr_type_node, t),
824 0, NOT_BUILT_IN, NULL);
826 t = tree_cons (NULL_TREE, double_type_node,
827 tree_cons (NULL_TREE, double_type_node, endlink));
829 = builtin_function ("__builtin_fmod",
830 build_function_type (double_type_node, t),
831 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmod");
834 t = tree_cons (NULL_TREE, float_type_node,
835 tree_cons (NULL_TREE, float_type_node, endlink));
837 = builtin_function ("__builtin_fmodf",
838 build_function_type (float_type_node, t),
839 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmodf");
843 = builtin_function ("_Jv_divI",
844 build_function_type (int_type_node, t),
845 0, NOT_BUILT_IN, NULL);
848 = builtin_function ("_Jv_remI",
849 build_function_type (int_type_node, t),
850 0, NOT_BUILT_IN, NULL);
853 = builtin_function ("_Jv_divJ",
854 build_function_type (long_type_node, t),
855 0, NOT_BUILT_IN, NULL);
858 = builtin_function ("_Jv_remJ",
859 build_function_type (long_type_node, t),
860 0, NOT_BUILT_IN, NULL);
862 /* Initialize variables for except.c. */
863 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
864 ? "__gcj_personality_sj0"
865 : "__gcj_personality_v0");
866 lang_eh_runtime_type = prepare_eh_table_type;
870 /* Register nodes with the garbage collector. */
871 ggc_add_tree_root (java_global_trees,
872 sizeof (java_global_trees) / sizeof (tree));
873 ggc_add_tree_root (predef_filenames,
874 sizeof (predef_filenames) / sizeof (tree));
875 ggc_add_tree_root (&decl_map, 1);
876 ggc_add_tree_root (&pending_local_decls, 1);
880 /* Look up NAME in the current binding level and its superiors
881 in the namespace of variables, functions and typedefs.
882 Return a ..._DECL node of some kind representing its definition,
883 or return 0 if it is undefined. */
890 if (current_binding_level != global_binding_level
891 && IDENTIFIER_LOCAL_VALUE (name))
892 val = IDENTIFIER_LOCAL_VALUE (name);
894 val = IDENTIFIER_GLOBAL_VALUE (name);
898 /* Similar to `lookup_name' but look only at current binding level and
899 the previous one if its the parameter level. */
902 lookup_name_current_level (name)
907 if (current_binding_level == global_binding_level)
908 return IDENTIFIER_GLOBAL_VALUE (name);
910 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
913 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
914 if (DECL_NAME (t) == name)
920 /* Use a binding level to record a labeled block declaration */
923 push_labeled_block (lb)
926 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
927 register struct binding_level *b = current_binding_level;
928 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
930 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
931 TREE_CHAIN (lb) = b->names;
933 IDENTIFIER_LOCAL_VALUE (name) = lb;
936 /* Pop the current binding level, reinstalling values for the previous
942 struct binding_level *b = current_binding_level;
943 tree label = b->names;
944 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
947 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
948 TREE_VALUE (b->shadowed);
950 /* Pop the current level, and free the structure for reuse. */
951 current_binding_level = current_binding_level->level_chain;
952 b->level_chain = free_binding_level;
953 free_binding_level = b;
956 /* Record a decl-node X as belonging to the current lexical scope.
957 Check for errors (such as an incompatible declaration for the same
958 name already seen in the same scope).
960 Returns either X or an old decl for the same name.
961 If an old decl is returned, it may have been smashed
962 to agree with what X says. */
969 register tree name = DECL_NAME (x);
970 register struct binding_level *b = current_binding_level;
972 if (TREE_CODE (x) != TYPE_DECL)
973 DECL_CONTEXT (x) = current_function_decl;
979 t = lookup_name_current_level (name);
980 if (t != 0 && t == error_mark_node)
981 /* error_mark_node is 0 for a while during initialization! */
984 error_with_decl (x, "`%s' used prior to declaration");
989 file = DECL_SOURCE_FILE (t);
990 line = DECL_SOURCE_LINE (t);
993 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
994 to point to the TYPE_DECL.
995 Since Java does not have typedefs, a type can only have
996 one (true) name, given by a class, interface, or builtin. */
997 if (TREE_CODE (x) == TYPE_DECL
998 && TYPE_NAME (TREE_TYPE (x)) == 0
999 && TREE_TYPE (x) != error_mark_node)
1001 TYPE_NAME (TREE_TYPE (x)) = x;
1002 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1005 /* This name is new in its binding level.
1006 Install the new declaration and return it. */
1007 if (b == global_binding_level)
1009 /* Install a global value. */
1011 IDENTIFIER_GLOBAL_VALUE (name) = x;
1015 /* Here to install a non-global value. */
1016 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1017 IDENTIFIER_LOCAL_VALUE (name) = x;
1020 /* Warn if shadowing an argument at the top level of the body. */
1021 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1022 /* This warning doesn't apply to the parms of a nested fcn. */
1023 && ! current_binding_level->parm_flag
1024 /* Check that this is one level down from the parms. */
1025 && current_binding_level->level_chain->parm_flag
1026 /* Check that the decl being shadowed
1027 comes from the parm level, one level up. */
1028 && chain_member (oldlocal, current_binding_level->level_chain->names))
1030 if (TREE_CODE (oldlocal) == PARM_DECL)
1031 pedwarn ("declaration of `%s' shadows a parameter",
1032 IDENTIFIER_POINTER (name));
1034 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1035 IDENTIFIER_POINTER (name));
1038 /* Maybe warn if shadowing something else. */
1039 else if (warn_shadow && !DECL_EXTERNAL (x)
1040 /* No shadow warnings for internally generated vars. */
1041 && DECL_SOURCE_LINE (x) != 0
1042 /* No shadow warnings for vars made for inlining. */
1043 && ! DECL_FROM_INLINE (x))
1045 const char *warnstring = 0;
1047 if (TREE_CODE (x) == PARM_DECL
1048 && current_binding_level->level_chain->parm_flag)
1049 /* Don't warn about the parm names in function declarator
1050 within a function declarator.
1051 It would be nice to avoid warning in any function
1052 declarator in a declaration, as opposed to a definition,
1053 but there is no way to tell it's not a definition. */
1055 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1056 warnstring = "declaration of `%s' shadows a parameter";
1057 else if (oldlocal != 0)
1058 warnstring = "declaration of `%s' shadows previous local";
1059 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1060 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1061 warnstring = "declaration of `%s' shadows global declaration";
1064 warning (warnstring, IDENTIFIER_POINTER (name));
1068 /* If storing a local value, there may already be one (inherited).
1069 If so, record it for restoration when this binding level ends. */
1071 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1075 /* Put decls on list in reverse order.
1076 We will reverse them later if necessary. */
1077 TREE_CHAIN (x) = b->names;
1084 pushdecl_force_head (x)
1087 current_binding_level->names = x;
1090 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1093 pushdecl_top_level (x)
1097 register struct binding_level *b = current_binding_level;
1099 current_binding_level = global_binding_level;
1101 current_binding_level = b;
1105 /* Nonzero if we are currently in the global binding level. */
1108 global_bindings_p ()
1110 return current_binding_level == global_binding_level;
1113 /* Return the list of declarations of the current level.
1114 Note that this list is in reverse order unless/until
1115 you nreverse it; and when you do nreverse it, you must
1116 store the result back using `storedecls' or you will lose. */
1121 return current_binding_level->names;
1124 /* Create a new `struct binding_level'. */
1126 static struct binding_level *
1127 make_binding_level ()
1130 return (struct binding_level *) xmalloc (sizeof (struct binding_level));
1135 int unused ATTRIBUTE_UNUSED;
1137 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1140 /* If this is the top level of a function,
1141 just make sure that NAMED_LABELS is 0. */
1143 if (current_binding_level == global_binding_level)
1147 /* Reuse or create a struct for this binding level. */
1149 if (free_binding_level)
1151 newlevel = free_binding_level;
1152 free_binding_level = free_binding_level->level_chain;
1156 newlevel = make_binding_level ();
1159 /* Add this level to the front of the chain (stack) of levels that
1162 *newlevel = clear_binding_level;
1163 newlevel->level_chain = current_binding_level;
1164 current_binding_level = newlevel;
1165 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1166 newlevel->binding_depth = binding_depth;
1168 fprintf (stderr, "push %s level 0x%08x pc %d\n",
1169 (is_class_level) ? "class" : "block", newlevel, current_pc);
1172 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1175 /* Exit a binding level.
1176 Pop the level off, and restore the state of the identifier-decl mappings
1177 that were in effect when this level was entered.
1179 If KEEP is nonzero, this level had explicit declarations, so
1180 and create a "block" (a BLOCK node) for the level
1181 to record its declarations and subblocks for symbol table output.
1183 If FUNCTIONBODY is nonzero, this level is the body of a function,
1184 so create a block as if KEEP were set and also clear out all
1187 If REVERSE is nonzero, reverse the order of decls before putting
1188 them into the BLOCK. */
1191 poplevel (keep, reverse, functionbody)
1197 /* The chain of decls was accumulated in reverse order.
1198 Put it into forward order, just for cleanliness. */
1200 tree subblocks = current_binding_level->blocks;
1203 int block_previously_created;
1205 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1208 if (current_binding_level->end_pc != LARGEST_PC)
1209 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1210 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1211 current_binding_level->end_pc);
1213 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1214 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1216 if (is_class_level != (current_binding_level == class_binding_level))
1219 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1223 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1225 /* Get the decls in the order they were written.
1226 Usually current_binding_level->names is in reverse order.
1227 But parameter decls were previously put in forward order. */
1230 current_binding_level->names
1231 = decls = nreverse (current_binding_level->names);
1233 decls = current_binding_level->names;
1235 /* Output any nested inline functions within this block
1236 if they weren't already output. */
1238 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1239 if (TREE_CODE (decl) == FUNCTION_DECL
1240 && ! TREE_ASM_WRITTEN (decl)
1241 && DECL_INITIAL (decl) != 0
1242 && TREE_ADDRESSABLE (decl))
1244 /* If this decl was copied from a file-scope decl
1245 on account of a block-scope extern decl,
1246 propagate TREE_ADDRESSABLE to the file-scope decl.
1248 DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1249 true, since then the decl goes through save_for_inline_copying. */
1250 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1251 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1252 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1255 push_function_context ();
1256 output_inline_function (decl);
1257 pop_function_context ();
1261 /* If there were any declarations in that level,
1262 or if this level is a function body,
1263 create a BLOCK to record them for the life of this function. */
1266 block_previously_created = (current_binding_level->this_block != 0);
1267 if (block_previously_created)
1268 block = current_binding_level->this_block;
1269 else if (keep || functionbody)
1270 block = make_node (BLOCK);
1273 BLOCK_VARS (block) = decls;
1274 BLOCK_SUBBLOCKS (block) = subblocks;
1277 /* In each subblock, record that this is its superior. */
1279 for (link = subblocks; link; link = TREE_CHAIN (link))
1280 BLOCK_SUPERCONTEXT (link) = block;
1282 /* Clear out the meanings of the local variables of this level. */
1284 for (link = decls; link; link = TREE_CHAIN (link))
1286 tree name = DECL_NAME (link);
1287 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1289 /* If the ident. was used or addressed via a local extern decl,
1290 don't forget that fact. */
1291 if (DECL_EXTERNAL (link))
1293 if (TREE_USED (link))
1294 TREE_USED (name) = 1;
1295 if (TREE_ADDRESSABLE (link))
1296 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1298 IDENTIFIER_LOCAL_VALUE (name) = 0;
1302 /* Restore all name-meanings of the outer levels
1303 that were shadowed by this level. */
1305 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1306 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1308 /* If the level being exited is the top level of a function,
1309 check over all the labels, and clear out the current
1310 (function local) meanings of their names. */
1314 /* If this is the top level block of a function,
1315 the vars are the function's parameters.
1316 Don't leave them in the BLOCK because they are
1317 found in the FUNCTION_DECL instead. */
1319 BLOCK_VARS (block) = 0;
1321 /* Clear out the definitions of all label names,
1322 since their scopes end here,
1323 and add them to BLOCK_VARS. */
1326 for (link = named_labels; link; link = TREE_CHAIN (link))
1328 register tree label = TREE_VALUE (link);
1330 if (DECL_INITIAL (label) == 0)
1332 error_with_decl (label, "label `%s' used but not defined");
1333 /* Avoid crashing later. */
1334 define_label (input_filename, lineno,
1337 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1338 warning_with_decl (label, "label `%s' defined but not used");
1339 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1341 /* Put the labels into the "variables" of the
1342 top-level block, so debugger can see them. */
1343 TREE_CHAIN (label) = BLOCK_VARS (block);
1344 BLOCK_VARS (block) = label;
1349 /* Pop the current level, and free the structure for reuse. */
1352 register struct binding_level *level = current_binding_level;
1353 current_binding_level = current_binding_level->level_chain;
1355 level->level_chain = free_binding_level;
1356 free_binding_level = level;
1359 /* Dispose of the block that we just made inside some higher level. */
1361 DECL_INITIAL (current_function_decl) = block;
1364 if (!block_previously_created)
1365 current_binding_level->blocks
1366 = chainon (current_binding_level->blocks, block);
1368 /* If we did not make a block for the level just exited,
1369 any blocks made for inner levels
1370 (since they cannot be recorded as subblocks in that level)
1371 must be carried forward so they will later become subblocks
1372 of something else. */
1374 current_binding_level->blocks
1375 = chainon (current_binding_level->blocks, subblocks);
1377 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1378 binding contour so that they point to the appropriate construct, i.e.
1379 either to the current FUNCTION_DECL node, or else to the BLOCK node
1380 we just constructed.
1382 Note that for tagged types whose scope is just the formal parameter
1383 list for some function type specification, we can't properly set
1384 their TYPE_CONTEXTs here, because we don't have a pointer to the
1385 appropriate FUNCTION_TYPE node readily available to us. For those
1386 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1387 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1388 node which will represent the "scope" for these "parameter list local"
1393 TREE_USED (block) = 1;
1398 maybe_pushlevels (pc)
1401 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1405 while (pending_local_decls != NULL_TREE &&
1406 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1408 tree *ptr = &pending_local_decls;
1410 int end_pc = DECL_LOCAL_END_PC (decl);
1412 while (*ptr != NULL_TREE
1413 && DECL_LOCAL_START_PC (*ptr) <= pc
1414 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1415 ptr = &TREE_CHAIN (*ptr);
1416 pending_local_decls = *ptr;
1419 /* Force non-nested range to be nested in current range. */
1420 if (end_pc > current_binding_level->end_pc)
1421 end_pc = current_binding_level->end_pc;
1423 maybe_start_try (pc, end_pc);
1426 expand_start_bindings (0);
1428 current_binding_level->end_pc = end_pc;
1429 current_binding_level->start_pc = pc;
1430 current_binding_level->names = decl;
1431 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1433 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1437 maybe_start_try (pc, 0);
1441 maybe_poplevels (pc)
1444 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1448 while (current_binding_level->end_pc <= pc)
1450 expand_end_bindings (getdecls (), 1, 0);
1451 maybe_end_try (current_binding_level->start_pc, pc);
1454 maybe_end_try (0, pc);
1457 /* Terminate any binding which began during the range beginning at
1458 start_pc. This tidies up improperly nested local variable ranges
1459 and exception handlers; a variable declared within an exception
1460 range is forcibly terminated when that exception ends. */
1463 force_poplevels (start_pc)
1466 while (current_binding_level->start_pc > start_pc)
1468 if (pedantic && current_binding_level->start_pc > start_pc)
1469 warning_with_decl (current_function_decl,
1470 "In %s: overlapped variable and exception ranges at %d",
1471 current_binding_level->start_pc);
1472 expand_end_bindings (getdecls (), 1, 0);
1477 /* Insert BLOCK at the end of the list of subblocks of the
1478 current binding level. This is used when a BIND_EXPR is expanded,
1479 to handle the BLOCK node inside the BIND_EXPR. */
1482 insert_block (block)
1485 TREE_USED (block) = 1;
1486 current_binding_level->blocks
1487 = chainon (current_binding_level->blocks, block);
1490 /* Set the BLOCK node for the innermost scope
1491 (the one we are currently in). */
1495 register tree block;
1497 current_binding_level->this_block = block;
1498 current_binding_level->names = chainon (current_binding_level->names,
1499 BLOCK_VARS (block));
1500 current_binding_level->blocks = chainon (current_binding_level->blocks,
1501 BLOCK_SUBBLOCKS (block));
1504 /* integrate_decl_tree calls this function. */
1507 copy_lang_decl (node)
1511 = TREE_CODE (node) == VAR_DECL ? sizeof (struct lang_decl_var)
1512 : sizeof (struct lang_decl);
1513 struct lang_decl *x = (struct lang_decl *) ggc_alloc (lang_decl_size);
1514 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1515 DECL_LANG_SPECIFIC (node) = x;
1518 /* If DECL has a cleanup, build and return that cleanup here.
1519 This is a callback called by expand_expr. */
1522 maybe_build_cleanup (decl)
1523 tree decl ATTRIBUTE_UNUSED;
1525 /* There are no cleanups in Java (I think). */
1530 give_name_to_locals (jcf)
1533 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1534 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1536 pending_local_decls = NULL_TREE;
1540 n = JCF_readu2 (jcf);
1541 for (i = 0; i < n; i++)
1543 int start_pc = JCF_readu2 (jcf);
1544 int length = JCF_readu2 (jcf);
1545 int name_index = JCF_readu2 (jcf);
1546 int signature_index = JCF_readu2 (jcf);
1547 int slot = JCF_readu2 (jcf);
1548 tree name = get_name_constant (jcf, name_index);
1549 tree type = parse_signature (jcf, signature_index);
1550 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1552 && length == DECL_CODE_LENGTH (current_function_decl))
1554 tree decl = TREE_VEC_ELT (decl_map, slot);
1555 DECL_NAME (decl) = name;
1556 SET_DECL_ASSEMBLER_NAME (decl, name);
1557 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1558 warning ("bad type in parameter debug info");
1563 int end_pc = start_pc + length;
1564 tree decl = build_decl (VAR_DECL, name, type);
1565 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1567 warning_with_decl (decl,
1568 "bad PC range for debug info for local `%s'");
1569 end_pc = DECL_CODE_LENGTH (current_function_decl);
1572 /* Adjust start_pc if necessary so that the local's first
1573 store operation will use the relevant DECL as a
1574 destination. Fore more information, read the leading
1575 comments for expr.c:maybe_adjust_start_pc. */
1576 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1578 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1579 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1580 DECL_LOCAL_START_PC (decl) = start_pc;
1582 /* FIXME: The range used internally for exceptions and local
1583 variable ranges, is a half-open interval:
1584 start_pc <= pc < end_pc. However, the range used in the
1585 Java VM spec is inclusive at both ends:
1586 start_pc <= pc <= end_pc. */
1589 DECL_LOCAL_END_PC (decl) = end_pc;
1591 /* Now insert the new decl in the proper place in
1592 pending_local_decls. We are essentially doing an insertion sort,
1593 which works fine, since the list input will normally already
1595 ptr = &pending_local_decls;
1596 while (*ptr != NULL_TREE
1597 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1598 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1599 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1600 ptr = &TREE_CHAIN (*ptr);
1601 TREE_CHAIN (decl) = *ptr;
1606 pending_local_decls = nreverse (pending_local_decls);
1608 /* Fill in default names for the parameters. */
1609 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1610 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1612 if (DECL_NAME (parm) == NULL_TREE)
1614 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1616 DECL_NAME (parm) = get_identifier ("this");
1620 sprintf (buffer, "ARG_%d", arg_i);
1621 DECL_NAME (parm) = get_identifier (buffer);
1623 SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1629 build_result_decl (fndecl)
1632 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1633 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1634 if (INTEGRAL_TYPE_P (restype)
1635 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1636 restype = integer_type_node;
1637 return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype));
1641 complete_start_java_method (fndecl)
1644 if (! flag_emit_class_files)
1646 /* Initialize the RTL code for the function. */
1647 init_function_start (fndecl, input_filename, lineno);
1649 /* Set up parameters and prepare for return, for the function. */
1650 expand_function_start (fndecl, 0);
1654 /* If this fcn was already referenced via a block-scope `extern' decl (or
1655 an implicit decl), propagate certain information about the usage. */
1656 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1657 TREE_ADDRESSABLE (current_function_decl) = 1;
1661 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1662 && ! flag_emit_class_files
1663 && ! DECL_CLINIT_P (fndecl)
1664 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1666 tree clas = DECL_CONTEXT (fndecl);
1667 tree init = build (CALL_EXPR, void_type_node,
1668 build_address_of (soft_initclass_node),
1669 build_tree_list (NULL_TREE, build_class_ref (clas)),
1671 TREE_SIDE_EFFECTS (init) = 1;
1672 expand_expr_stmt (init);
1675 /* Push local variables. Function compiled from source code are
1676 using a different local variables management, and for them,
1677 pushlevel shouldn't be called from here. */
1678 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1681 if (! flag_emit_class_files)
1682 expand_start_bindings (1);
1685 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1687 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1688 tree enter, exit, lock;
1689 if (METHOD_STATIC (fndecl))
1690 lock = build_class_ref (DECL_CONTEXT (fndecl));
1692 lock = DECL_ARGUMENTS (fndecl);
1693 BUILD_MONITOR_ENTER (enter, lock);
1694 BUILD_MONITOR_EXIT (exit, lock);
1695 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1697 expand_expr_stmt (enter);
1698 expand_decl_cleanup (NULL_TREE, exit);
1702 tree function_body = DECL_FUNCTION_BODY (fndecl);
1703 tree body = BLOCK_EXPR_BODY (function_body);
1704 lock = build (WITH_CLEANUP_EXPR, void_type_node,
1705 enter, exit, NULL_TREE);
1706 TREE_SIDE_EFFECTS (lock) = 1;
1707 lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
1708 TREE_SIDE_EFFECTS (lock) = 1;
1709 lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
1710 TREE_SIDE_EFFECTS (lock) = 1;
1711 BLOCK_EXPR_BODY (function_body) = lock;
1717 start_java_method (fndecl)
1723 current_function_decl = fndecl;
1724 announce_function (fndecl);
1726 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1727 decl_map = make_tree_vec (i);
1728 type_map = (tree *) xrealloc (type_map, i * sizeof (tree));
1730 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1731 fprintf (stderr, "%s:\n", (*decl_printable_name) (fndecl, 2));
1733 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1734 pushlevel (1); /* Push parameters. */
1736 ptr = &DECL_ARGUMENTS (fndecl);
1737 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1738 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1740 tree parm_name = NULL_TREE, parm_decl;
1741 tree parm_type = TREE_VALUE (tem);
1742 if (i >= DECL_MAX_LOCALS (fndecl))
1745 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1746 DECL_CONTEXT (parm_decl) = fndecl;
1747 if (PROMOTE_PROTOTYPES
1748 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1749 && INTEGRAL_TYPE_P (parm_type))
1750 parm_type = integer_type_node;
1751 DECL_ARG_TYPE (parm_decl) = parm_type;
1754 ptr = &TREE_CHAIN (parm_decl);
1756 /* Add parm_decl to the decl_map. */
1757 push_jvm_slot (i, parm_decl);
1759 type_map[i] = TREE_TYPE (parm_decl);
1760 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1763 type_map[i] = void_type_node;
1767 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1769 while (i < DECL_MAX_LOCALS(fndecl))
1770 type_map[i++] = NULL_TREE;
1772 build_result_decl (fndecl);
1773 complete_start_java_method (fndecl);
1779 tree fndecl = current_function_decl;
1781 expand_end_bindings (getdecls (), 1, 0);
1782 /* pop out of function */
1785 /* pop out of its parameters */
1788 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1790 /* Generate rtl for function exit. */
1791 expand_function_end (input_filename, lineno, 0);
1793 /* Run the optimizers and output assembler code for this function. */
1794 rest_of_compilation (fndecl);
1796 current_function_decl = NULL_TREE;
1799 /* Mark language-specific parts of T for garbage-collection. */
1805 if (TREE_CODE (t) == IDENTIFIER_NODE)
1807 struct lang_identifier *li = (struct lang_identifier *) t;
1808 ggc_mark_tree (li->global_value);
1809 ggc_mark_tree (li->local_value);
1810 ggc_mark_tree (li->utf8_ref);
1812 else if (TREE_CODE (t) == VAR_DECL
1813 || TREE_CODE (t) == PARM_DECL
1814 || TREE_CODE (t) == FIELD_DECL)
1816 struct lang_decl_var *ldv =
1817 ((struct lang_decl_var *) DECL_LANG_SPECIFIC (t));
1821 ggc_mark_tree (ldv->slot_chain);
1822 ggc_mark_tree (ldv->am);
1823 ggc_mark_tree (ldv->wfl);
1826 else if (TREE_CODE (t) == FUNCTION_DECL)
1828 struct lang_decl *ld = DECL_LANG_SPECIFIC (t);
1833 ggc_mark_tree (ld->wfl);
1834 ggc_mark_tree (ld->throws_list);
1835 ggc_mark_tree (ld->function_decl_body);
1836 ggc_mark_tree (ld->called_constructor);
1837 ggc_mark_tree (ld->inner_access);
1838 ggc_mark_tree_hash_table (&ld->init_test_table);
1839 ggc_mark_tree_hash_table (&ld->ict);
1840 ggc_mark_tree_hash_table (&ld->smic);
1843 else if (TYPE_P (t))
1845 struct lang_type *lt = TYPE_LANG_SPECIFIC (t);
1850 ggc_mark_tree (lt->signature);
1851 ggc_mark_tree (lt->cpool_data_ref);
1852 ggc_mark_tree (lt->finit_stmt_list);
1853 ggc_mark_tree (lt->clinit_stmt_list);
1854 ggc_mark_tree (lt->ii_block);
1855 ggc_mark_tree (lt->dot_class);
1856 ggc_mark_tree (lt->package_list);