1 /* Process declarations and variables for the GNU compiler for the
3 Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
33 #include "java-tree.h"
39 #include "java-except.h"
42 #if defined (DEBUG_JAVA_BINDING_LEVELS)
43 extern void indent PROTO((void));
46 static tree push_jvm_slot PARAMS ((int, tree));
47 static tree lookup_name_current_level PARAMS ((tree));
48 static tree push_promoted_type PARAMS ((const char *, tree));
49 static struct binding_level *make_binding_level PARAMS ((void));
50 static boolean emit_init_test_initialization PARAMS ((struct hash_entry *,
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;
77 /* Push a local variable or stack slot into the decl_map,
78 and assign it an rtl. */
80 #if defined(DEBUG_JAVA_BINDING_LEVELS)
81 int binding_depth = 0;
82 int is_class_level = 0;
90 for (i = 0; i < binding_depth*2; i++)
93 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
96 push_jvm_slot (index, decl)
100 struct rtx_def *rtl = NULL;
101 tree type = TREE_TYPE (decl);
104 DECL_CONTEXT (decl) = current_function_decl;
105 layout_decl (decl, 0);
107 /* See if we have an appropriate rtl (i.e. same mode) at this index.
108 If so, we must use it. */
109 tmp = TREE_VEC_ELT (decl_map, index);
110 while (tmp != NULL_TREE)
112 if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)))
113 rtl = DECL_RTL (tmp);
116 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
119 DECL_RTL (decl) = rtl;
122 if (index >= DECL_MAX_LOCALS (current_function_decl))
123 DECL_REGISTER (decl) = 1;
127 /* Now link the decl into the decl_map. */
128 if (DECL_LANG_SPECIFIC (decl) == NULL)
130 DECL_LANG_SPECIFIC (decl)
131 = (struct lang_decl *) ggc_alloc (sizeof (struct lang_decl_var));
132 DECL_LOCAL_START_PC (decl) = 0;
133 DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
134 DECL_LOCAL_SLOT_NUMBER (decl) = index;
136 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
137 TREE_VEC_ELT (decl_map, index) = decl;
141 /* Find out if 'decl' passed in fits the defined PC location better than
142 'best'. Return decl if it does, return best if it doesn't. If decl
143 is returned, then updated is set to true. */
146 check_local_named_variable (best, decl, pc, updated)
152 if (pc >= DECL_LOCAL_START_PC (decl)
153 && pc < DECL_LOCAL_END_PC (decl))
155 if (best == NULL_TREE
156 || (DECL_LOCAL_START_PC (decl) > DECL_LOCAL_START_PC (best)
157 && DECL_LOCAL_END_PC (decl) < DECL_LOCAL_END_PC (best)))
167 /* Find the best declaration based upon type. If 'decl' fits 'type' better
168 than 'best', return 'decl'. Otherwise return 'best'. */
171 check_local_unnamed_variable (best, decl, type)
176 if (TREE_TYPE (decl) == type
177 || (TREE_CODE (TREE_TYPE (decl)) == TREE_CODE (type)
178 && TYPE_PRECISION (TREE_TYPE (decl)) <= 32
179 && TYPE_PRECISION (type) <= 32
180 && TREE_CODE (type) != POINTER_TYPE)
181 || (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
182 && type == ptr_type_node))
184 if (best == NULL_TREE
185 || (TREE_TYPE (decl) == type && TREE_TYPE (best) != type))
193 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
194 that is valid at PC (or -1 if any pc).
195 If there is no existing matching decl, allocate one. */
198 find_local_variable (index, type, pc)
203 tree decl = TREE_VEC_ELT (decl_map, index);
204 tree best = NULL_TREE;
205 int found_scoped_var = 0;
207 /* Scan through every declaration that has been created in this slot. */
208 while (decl != NULL_TREE)
210 /* Variables created in give_name_to_locals() have a name and have
211 a specified scope, so we can handle them specifically. We want
212 to use the specific decls created for those so they are assigned
213 the right variables in the debugging information. */
214 if (DECL_NAME (decl) != NULL_TREE)
216 /* This is a variable we have a name for, so it has a scope
217 supplied in the class file. But it only matters when we
218 actually have a PC to use. If pc<0, then we are asking
219 for a stack slot and this decl won't be one of those. */
221 best = check_local_named_variable (best, decl, pc,
224 /* We scan for type information unless we found a variable in the
225 proper scope already. */
226 else if (!found_scoped_var)
228 /* If we don't have scoping information for a variable, we use
229 a different method to look it up. */
230 best = check_local_unnamed_variable (best, decl, type);
233 decl = DECL_LOCAL_SLOT_CHAIN (decl);
236 if (best != NULL_TREE)
239 /* If we don't find a match, create one with the type passed in. */
240 return push_jvm_slot (index, build_decl (VAR_DECL, NULL_TREE, type));
244 /* Same as find_local_index, except that INDEX is a stack index. */
247 find_stack_slot (index, type)
251 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
257 /* A chain of _DECL nodes for all variables, constants, functions,
258 * and typedef types. These are in the reverse of the order supplied.
262 /* For each level, a list of shadowed outer-level local definitions
263 to be restored when this level is popped.
264 Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
265 whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
268 /* For each level (except not the global one),
269 a chain of BLOCK nodes for all the levels
270 that were entered and exited one level down. */
273 /* The BLOCK node for this level, if one has been preallocated.
274 If 0, the BLOCK is allocated (if needed) when the level is popped. */
277 /* The binding level which this one is contained in (inherits from). */
278 struct binding_level *level_chain;
280 /* 1 means make a BLOCK for this level regardless of all else.
281 2 for temporary binding contours created by the compiler. */
284 /* Nonzero means make a BLOCK if this level has any subblocks. */
285 char keep_if_subblocks;
287 /* Nonzero if this level can safely have additional
288 cleanup-needing variables added to it. */
289 char more_cleanups_ok;
292 /* The bytecode PC that marks the end of this level. */
294 /* The bytecode PC that marks the start of this level. */
297 #if defined(DEBUG_JAVA_BINDING_LEVELS)
298 /* Binding depth at which this level began. */
299 unsigned binding_depth;
300 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
303 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
305 /* The binding level currently in effect. */
307 static struct binding_level *current_binding_level;
309 /* A chain of binding_level structures awaiting reuse. */
311 static struct binding_level *free_binding_level;
313 /* The outermost binding level, for names of file scope.
314 This is created when the compiler is started and exists
315 through the entire run. */
317 static struct binding_level *global_binding_level;
319 /* A PC value bigger than any PC value we may ever may encounter. */
321 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
323 /* Binding level structures are initialized by copying this one. */
325 static struct binding_level clear_binding_level
326 = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
327 NULL_BINDING_LEVEL, 0, 0, 0, 0, LARGEST_PC, 0};
330 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
331 that have names. Here so we can clear out their names' definitions
332 at the end of the function. */
334 static tree named_labels;
336 /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
338 static tree shadowed_labels;
341 int flag_traditional;
343 /* Nonzero means unconditionally make a BLOCK for the next level pushed. */
345 static int keep_next_level_flag;
347 /* Nonzero means make a BLOCK for the next level pushed
348 if it has subblocks. */
350 static int keep_next_if_subblocks;
352 tree java_global_trees[JTI_MAX];
354 tree predef_filenames[PREDEF_FILENAMES_SIZE];
356 /* Build (and pushdecl) a "promoted type" for all standard
357 types shorter than int. */
360 push_promoted_type (name, actual_type)
364 tree type = make_node (TREE_CODE (actual_type));
366 tree in_min = TYPE_MIN_VALUE (int_type_node);
367 tree in_max = TYPE_MAX_VALUE (int_type_node);
369 tree in_min = TYPE_MIN_VALUE (actual_type);
370 tree in_max = TYPE_MAX_VALUE (actual_type);
372 TYPE_MIN_VALUE (type) = copy_node (in_min);
373 TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
374 TYPE_MAX_VALUE (type) = copy_node (in_max);
375 TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
376 TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
378 pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
382 /* Return a definition for a builtin function named NAME and whose data type
383 is TYPE. TYPE should be a function type with argument types.
384 FUNCTION_CODE tells later passes how to compile calls to this function.
385 See tree.h for its possible values.
387 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
388 the name to be called if we can't opencode the function. */
391 builtin_function (name, type, function_code, class, library_name)
395 enum built_in_class class;
396 const char *library_name;
398 tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
399 DECL_EXTERNAL (decl) = 1;
400 TREE_PUBLIC (decl) = 1;
402 DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
403 make_decl_rtl (decl, NULL_PTR, 1);
405 DECL_BUILT_IN_CLASS (decl) = class;
406 DECL_FUNCTION_CODE (decl) = function_code;
410 /* Return tree that represents a vtable for a primitive array. */
412 create_primitive_vtable (name)
418 sprintf (buf, "_Jv_%sVTable", name);
419 r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
420 DECL_EXTERNAL (r) = 1;
421 make_decl_rtl (r, buf, 1);
426 init_decl_processing ()
428 register tree endlink;
429 tree field = NULL_TREE;
432 init_class_processing ();
434 current_function_decl = NULL;
435 current_binding_level = NULL_BINDING_LEVEL;
436 free_binding_level = NULL_BINDING_LEVEL;
437 pushlevel (0); /* make the binding_level structure for global names */
438 global_binding_level = current_binding_level;
440 /* The code here must be similar to build_common_tree_nodes{,_2} in
441 tree.c, especially as to the order of initializing common nodes. */
442 error_mark_node = make_node (ERROR_MARK);
443 TREE_TYPE (error_mark_node) = error_mark_node;
445 /* Create sizetype first - needed for other types. */
446 initialize_sizetypes ();
448 byte_type_node = make_signed_type (8);
449 pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
450 short_type_node = make_signed_type (16);
451 pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
452 int_type_node = make_signed_type (32);
453 pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
454 long_type_node = make_signed_type (64);
455 pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
457 unsigned_byte_type_node = make_unsigned_type (8);
458 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
459 unsigned_byte_type_node));
460 unsigned_short_type_node = make_unsigned_type (16);
461 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
462 unsigned_short_type_node));
463 unsigned_int_type_node = make_unsigned_type (32);
464 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
465 unsigned_int_type_node));
466 unsigned_long_type_node = make_unsigned_type (64);
467 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
468 unsigned_long_type_node));
470 set_sizetype (make_unsigned_type (POINTER_SIZE));
472 /* Define these next since types below may used them. */
473 integer_type_node = type_for_size (INT_TYPE_SIZE, 0);
474 integer_zero_node = build_int_2 (0, 0);
475 integer_one_node = build_int_2 (1, 0);
476 integer_two_node = build_int_2 (2, 0);
477 integer_four_node = build_int_2 (4, 0);
478 integer_negative_one_node = build_int_2 (-1, 0);
480 size_zero_node = size_int (0);
481 size_one_node = size_int (1);
482 bitsize_zero_node = bitsize_int (0);
483 bitsize_one_node = bitsize_int (1);
484 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
486 long_zero_node = build_int_2 (0, 0);
487 TREE_TYPE (long_zero_node) = long_type_node;
489 void_type_node = make_node (VOID_TYPE);
490 pushdecl (build_decl (TYPE_DECL, get_identifier ("void"), void_type_node));
491 layout_type (void_type_node); /* Uses size_zero_node */
492 ptr_type_node = build_pointer_type (void_type_node);
493 t = make_node (VOID_TYPE);
494 layout_type (t); /* Uses size_zero_node */
495 return_address_type_node = build_pointer_type (t);
497 null_pointer_node = build_int_2 (0, 0);
498 TREE_TYPE (null_pointer_node) = ptr_type_node;
500 /* Used by the parser to represent empty statements and blocks. */
501 empty_stmt_node = build1 (NOP_EXPR, void_type_node, size_zero_node);
502 CAN_COMPLETE_NORMALLY (empty_stmt_node) = 1;
505 /* Make a type to be the domain of a few array types
506 whose domains don't really matter.
507 200 is small enough that it always fits in size_t
508 and large enough that it can hold most function names for the
509 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
510 short_array_type_node = build_prim_array_type (short_type_node, 200);
512 char_type_node = make_node (CHAR_TYPE);
513 TYPE_PRECISION (char_type_node) = 16;
514 fixup_unsigned_type (char_type_node);
515 pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
517 boolean_type_node = make_node (BOOLEAN_TYPE);
518 TYPE_PRECISION (boolean_type_node) = 1;
519 fixup_unsigned_type (boolean_type_node);
520 pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
522 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
523 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
525 promoted_byte_type_node
526 = push_promoted_type ("promoted_byte", byte_type_node);
527 promoted_short_type_node
528 = push_promoted_type ("promoted_short", short_type_node);
529 promoted_char_type_node
530 = push_promoted_type ("promoted_char", char_type_node);
531 promoted_boolean_type_node
532 = push_promoted_type ("promoted_boolean", boolean_type_node);
534 float_type_node = make_node (REAL_TYPE);
535 TYPE_PRECISION (float_type_node) = 32;
536 pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
538 layout_type (float_type_node);
540 double_type_node = make_node (REAL_TYPE);
541 TYPE_PRECISION (double_type_node) = 64;
542 pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
544 layout_type (double_type_node);
546 float_zero_node = build_real (float_type_node, dconst0);
547 double_zero_node = build_real (double_type_node, dconst0);
549 /* These are the vtables for arrays of primitives. */
550 boolean_array_vtable = create_primitive_vtable ("boolean");
551 byte_array_vtable = create_primitive_vtable ("byte");
552 char_array_vtable = create_primitive_vtable ("char");
553 short_array_vtable = create_primitive_vtable ("short");
554 int_array_vtable = create_primitive_vtable ("int");
555 long_array_vtable = create_primitive_vtable ("long");
556 float_array_vtable = create_primitive_vtable ("float");
557 double_array_vtable = create_primitive_vtable ("double");
559 /* As you're adding items here, please update the code right after
560 this section, so that the filename containing the source code of
561 the pre-defined class gets registered correctly. */
562 unqualified_object_id_node = get_identifier ("Object");
563 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
564 object_ptr_type_node = promote_type (object_type_node);
565 string_type_node = lookup_class (get_identifier ("java.lang.String"));
566 string_ptr_type_node = promote_type (string_type_node);
567 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
568 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
569 runtime_exception_type_node =
570 lookup_class (get_identifier ("java.lang.RuntimeException"));
571 error_exception_type_node =
572 lookup_class (get_identifier ("java.lang.Error"));
573 rawdata_ptr_type_node
574 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
576 /* If you add to this section, don't forget to increase
577 PREDEF_FILENAMES_SIZE. */
578 predef_filenames [0] = get_identifier ("java/lang/Class.java");
579 predef_filenames [1] = get_identifier ("java/lang/Error.java");
580 predef_filenames [2] = get_identifier ("java/lang/Object.java");
581 predef_filenames [3] = get_identifier ("java/lang/RuntimeException.java");
582 predef_filenames [4] = get_identifier ("java/lang/String.java");
583 predef_filenames [5] = get_identifier ("java/lang/Throwable.java");
584 predef_filenames [6] = get_identifier ("gnu/gcj/RawData.java");
586 methodtable_type = make_node (RECORD_TYPE);
587 layout_type (methodtable_type);
588 build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
589 methodtable_ptr_type = build_pointer_type (methodtable_type);
591 TYPE_identifier_node = get_identifier ("TYPE");
592 init_identifier_node = get_identifier ("<init>");
593 clinit_identifier_node = get_identifier ("<clinit>");
594 /* Legacy `$finit$' special method identifier. This needs to be
595 recognized as equivalent to `finit$' but isn't generated anymore. */
596 finit_leg_identifier_node = get_identifier ("$finit$");
597 /* The new `finit$' special method identifier. This one is now
598 generated in place of `$finit$'. */
599 finit_identifier_node = get_identifier ("finit$");
600 void_signature_node = get_identifier ("()V");
601 length_identifier_node = get_identifier ("length");
602 this_identifier_node = get_identifier ("this");
603 super_identifier_node = get_identifier ("super");
604 continue_identifier_node = get_identifier ("continue");
605 access0_identifier_node = get_identifier ("access$0");
607 /* for lack of a better place to put this stub call */
608 init_expr_processing();
610 utf8const_type = make_node (RECORD_TYPE);
611 PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
612 PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
613 FINISH_RECORD (utf8const_type);
614 utf8const_ptr_type = build_pointer_type (utf8const_type);
616 constants_type_node = make_node (RECORD_TYPE);
617 PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
618 PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
619 PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
620 FINISH_RECORD (constants_type_node);
621 build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
623 access_flags_type_node = unsigned_short_type_node;
625 dtable_type = make_node (RECORD_TYPE);
626 dtable_ptr_type = build_pointer_type (dtable_type);
628 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
629 /* This isn't exactly true, but it is what we have in the source.
630 There is an unresolved issue here, which is whether the vtable
631 should be marked by the GC. */
632 if (! flag_hash_synchronization)
633 PUSH_FIELD (object_type_node, field, "sync_info",
634 build_pointer_type (object_type_node));
635 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
636 FIELD_PRIVATE (t) = 1;
637 FINISH_RECORD (object_type_node);
639 class_dtable_decl = build_dtable_decl (class_type_node);
640 TREE_STATIC (class_dtable_decl) = 1;
641 DECL_ARTIFICIAL (class_dtable_decl) = 1;
642 DECL_IGNORED_P (class_dtable_decl) = 1;
643 rest_of_decl_compilation (class_dtable_decl, (char*) 0, 1, 0);
645 field_type_node = make_node (RECORD_TYPE);
646 field_ptr_type_node = build_pointer_type (field_type_node);
647 method_type_node = make_node (RECORD_TYPE);
648 method_ptr_type_node = build_pointer_type (method_type_node);
650 set_super_info (0, class_type_node, object_type_node, 0);
651 set_super_info (0, string_type_node, object_type_node, 0);
652 class_ptr_type = build_pointer_type (class_type_node);
654 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
655 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
656 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
657 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
658 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
659 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
660 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
661 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
662 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
663 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
664 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
665 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
666 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
667 PUSH_FIELD (class_type_node, field, "interfaces",
668 build_pointer_type (class_ptr_type));
669 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
670 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
671 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
672 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
673 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
674 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
675 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
676 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
677 FIELD_PRIVATE (t) = 1;
678 push_super_field (class_type_node, object_type_node);
679 FINISH_RECORD (class_type_node);
680 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
682 field_info_union_node = make_node (UNION_TYPE);
683 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
684 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
686 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
688 layout_type (field_info_union_node);
690 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
691 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
692 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
693 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
694 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
695 FINISH_RECORD (field_type_node);
696 CLASS_LOADED_P (field_type_node) = 1;
697 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
699 one_elt_array_domain_type = build_index_type (integer_one_node);
700 nativecode_ptr_array_type_node
701 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
703 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
704 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
705 FINISH_RECORD (dtable_type);
706 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
708 #define jint_type int_type_node
709 #define jint_ptr_type ptr_type_node
711 jexception_type = make_node (RECORD_TYPE);
712 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
713 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
714 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
715 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
716 FINISH_RECORD (jexception_type);
717 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
718 jexception_ptr_type = build_pointer_type (jexception_type);
720 lineNumberEntry_type = make_node (RECORD_TYPE);
721 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
722 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
723 FINISH_RECORD (lineNumberEntry_type);
725 lineNumbers_type = make_node (RECORD_TYPE);
726 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
727 FINISH_RECORD (lineNumbers_type);
729 #define instn_ptr_type_node ptr_type_node /* XXX JH */
731 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
733 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
734 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
735 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
736 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
737 FINISH_RECORD (method_type_node);
738 CLASS_LOADED_P (method_type_node) = 1;
739 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
741 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
743 t = tree_cons (NULL_TREE, class_ptr_type,
744 tree_cons (NULL_TREE, int_type_node, endlink));
745 alloc_object_node = builtin_function ("_Jv_AllocObject",
746 build_function_type (ptr_type_node, t),
747 0, NOT_BUILT_IN, NULL_PTR);
748 DECL_IS_MALLOC (alloc_object_node) = 1;
750 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
751 soft_initclass_node = builtin_function ("_Jv_InitClass",
752 build_function_type (void_type_node,
756 throw_node[0] = builtin_function ("_Jv_Throw",
757 build_function_type (ptr_type_node, t),
758 0, NOT_BUILT_IN, NULL_PTR);
759 /* Mark throw_nodes as `noreturn' functions with side effects. */
760 TREE_THIS_VOLATILE (throw_node[0]) = 1;
761 TREE_SIDE_EFFECTS (throw_node[0]) = 1;
762 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
763 throw_node[1] = builtin_function ("_Jv_Sjlj_Throw",
764 build_function_type (ptr_type_node, t),
765 0, NOT_BUILT_IN, NULL_PTR);
766 TREE_THIS_VOLATILE (throw_node[1]) = 1;
767 TREE_SIDE_EFFECTS (throw_node[1]) = 1;
768 t = build_function_type (int_type_node, endlink);
769 soft_monitorenter_node
770 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
772 soft_monitorexit_node
773 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
776 t = tree_cons (NULL_TREE, int_type_node,
777 tree_cons (NULL_TREE, int_type_node, endlink));
779 = builtin_function ("_Jv_NewArray",
780 build_function_type(ptr_type_node, t),
781 0, NOT_BUILT_IN, NULL_PTR);
782 DECL_IS_MALLOC (soft_newarray_node) = 1;
784 t = tree_cons (NULL_TREE, int_type_node,
785 tree_cons (NULL_TREE, class_ptr_type,
786 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
788 = builtin_function ("_Jv_NewObjectArray",
789 build_function_type (ptr_type_node, t),
790 0, NOT_BUILT_IN, NULL_PTR);
791 DECL_IS_MALLOC (soft_anewarray_node) = 1;
793 t = tree_cons (NULL_TREE, ptr_type_node,
794 tree_cons (NULL_TREE, int_type_node, endlink));
795 soft_multianewarray_node
796 = builtin_function ("_Jv_NewMultiArray",
797 build_function_type (ptr_type_node, t),
798 0, NOT_BUILT_IN, NULL_PTR);
799 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
801 t = build_function_type (void_type_node,
802 tree_cons (NULL_TREE, int_type_node, endlink));
803 soft_badarrayindex_node
804 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
805 0, NOT_BUILT_IN, NULL_PTR);
806 /* Mark soft_badarrayindex_node as a `noreturn' function with side
808 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
809 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
811 soft_nullpointer_node
812 = builtin_function ("_Jv_ThrowNullPointerException",
813 build_function_type (void_type_node, endlink),
814 0, NOT_BUILT_IN, NULL_PTR);
815 /* Mark soft_nullpointer_node as a `noreturn' function with side
817 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
818 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
820 t = tree_cons (NULL_TREE, class_ptr_type,
821 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
823 = builtin_function ("_Jv_CheckCast",
824 build_function_type (ptr_type_node, t),
825 0, NOT_BUILT_IN, NULL_PTR);
826 t = tree_cons (NULL_TREE, object_ptr_type_node,
827 tree_cons (NULL_TREE, class_ptr_type, endlink));
829 = builtin_function ("_Jv_IsInstanceOf",
830 build_function_type (boolean_type_node, t),
831 0, NOT_BUILT_IN, NULL_PTR);
832 t = tree_cons (NULL_TREE, object_ptr_type_node,
833 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
834 soft_checkarraystore_node
835 = builtin_function ("_Jv_CheckArrayStore",
836 build_function_type (void_type_node, t),
837 0, NOT_BUILT_IN, NULL_PTR);
838 t = tree_cons (NULL_TREE, ptr_type_node,
839 tree_cons (NULL_TREE, ptr_type_node,
840 tree_cons (NULL_TREE, int_type_node, endlink)));
841 soft_lookupinterfacemethod_node
842 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
843 build_function_type (ptr_type_node, t),
844 0, NOT_BUILT_IN, NULL_PTR);
846 t = tree_cons (NULL_TREE, object_ptr_type_node,
847 tree_cons (NULL_TREE, ptr_type_node,
848 tree_cons (NULL_TREE, ptr_type_node, endlink)));
849 soft_lookupjnimethod_node
850 = builtin_function ("_Jv_LookupJNIMethod",
851 build_function_type (ptr_type_node, t),
852 0, NOT_BUILT_IN, NULL_PTR);
853 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
854 soft_getjnienvnewframe_node
855 = builtin_function ("_Jv_GetJNIEnvNewFrame",
856 build_function_type (ptr_type_node, t),
857 0, NOT_BUILT_IN, NULL_PTR);
858 soft_jnipopsystemframe_node
859 = builtin_function ("_Jv_JNI_PopSystemFrame",
860 build_function_type (ptr_type_node, t),
861 0, NOT_BUILT_IN, NULL_PTR);
863 t = tree_cons (NULL_TREE, double_type_node,
864 tree_cons (NULL_TREE, double_type_node, endlink));
866 = builtin_function ("__builtin_fmod",
867 build_function_type (double_type_node, t),
868 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmod");
870 soft_exceptioninfo_call_node
874 (builtin_function ("_Jv_exception_info",
875 build_function_type (ptr_type_node, endlink),
876 0, NOT_BUILT_IN, NULL_PTR)),
877 NULL_TREE, NULL_TREE);
878 TREE_SIDE_EFFECTS (soft_exceptioninfo_call_node) = 1;
880 t = tree_cons (NULL_TREE, float_type_node,
881 tree_cons (NULL_TREE, float_type_node, endlink));
883 = builtin_function ("__builtin_fmodf",
884 build_function_type (float_type_node, t),
885 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmodf");
889 = builtin_function ("_Jv_divI",
890 build_function_type (int_type_node, t),
891 0, NOT_BUILT_IN, NULL_PTR);
894 = builtin_function ("_Jv_remI",
895 build_function_type (int_type_node, t),
896 0, NOT_BUILT_IN, NULL_PTR);
899 = builtin_function ("_Jv_divJ",
900 build_function_type (long_type_node, t),
901 0, NOT_BUILT_IN, NULL_PTR);
904 = builtin_function ("_Jv_remJ",
905 build_function_type (long_type_node, t),
906 0, NOT_BUILT_IN, NULL_PTR);
910 /* Register nodes with the garbage collector. */
911 ggc_add_tree_root (java_global_trees,
912 sizeof (java_global_trees) / sizeof (tree));
913 ggc_add_tree_root (throw_node,
914 sizeof (throw_node) / sizeof (tree));
915 ggc_add_tree_root (predef_filenames,
916 sizeof (predef_filenames) / sizeof (tree));
917 ggc_add_tree_root (&decl_map, 1);
918 ggc_add_tree_root (&pending_local_decls, 1);
922 /* Look up NAME in the current binding level and its superiors
923 in the namespace of variables, functions and typedefs.
924 Return a ..._DECL node of some kind representing its definition,
925 or return 0 if it is undefined. */
932 if (current_binding_level != global_binding_level
933 && IDENTIFIER_LOCAL_VALUE (name))
934 val = IDENTIFIER_LOCAL_VALUE (name);
936 val = IDENTIFIER_GLOBAL_VALUE (name);
940 /* Similar to `lookup_name' but look only at current binding level and
941 the previous one if its the parameter level. */
944 lookup_name_current_level (name)
949 if (current_binding_level == global_binding_level)
950 return IDENTIFIER_GLOBAL_VALUE (name);
952 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
955 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
956 if (DECL_NAME (t) == name)
962 /* Use a binding level to record a labeled block declaration */
965 push_labeled_block (lb)
968 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
969 register struct binding_level *b = current_binding_level;
970 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
972 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
973 TREE_CHAIN (lb) = b->names;
975 IDENTIFIER_LOCAL_VALUE (name) = lb;
978 /* Pop the current binding level, reinstalling values for the previous
984 struct binding_level *b = current_binding_level;
985 tree label = b->names;
986 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
989 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
990 TREE_VALUE (b->shadowed);
992 /* Pop the current level, and free the structure for reuse. */
993 current_binding_level = current_binding_level->level_chain;
994 b->level_chain = free_binding_level;
995 free_binding_level = b;
998 /* Record a decl-node X as belonging to the current lexical scope.
999 Check for errors (such as an incompatible declaration for the same
1000 name already seen in the same scope).
1002 Returns either X or an old decl for the same name.
1003 If an old decl is returned, it may have been smashed
1004 to agree with what X says. */
1011 register tree name = DECL_NAME (x);
1012 register struct binding_level *b = current_binding_level;
1014 if (TREE_CODE (x) != TYPE_DECL)
1015 DECL_CONTEXT (x) = current_function_decl;
1021 t = lookup_name_current_level (name);
1022 if (t != 0 && t == error_mark_node)
1023 /* error_mark_node is 0 for a while during initialization! */
1026 error_with_decl (x, "`%s' used prior to declaration");
1031 file = DECL_SOURCE_FILE (t);
1032 line = DECL_SOURCE_LINE (t);
1035 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1036 to point to the TYPE_DECL.
1037 Since Java does not have typedefs, a type can only have
1038 one (true) name, given by a class, interface, or builtin. */
1039 if (TREE_CODE (x) == TYPE_DECL
1040 && TYPE_NAME (TREE_TYPE (x)) == 0
1041 && TREE_TYPE (x) != error_mark_node)
1043 TYPE_NAME (TREE_TYPE (x)) = x;
1044 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1047 /* This name is new in its binding level.
1048 Install the new declaration and return it. */
1049 if (b == global_binding_level)
1051 /* Install a global value. */
1053 IDENTIFIER_GLOBAL_VALUE (name) = x;
1057 /* Here to install a non-global value. */
1058 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1059 IDENTIFIER_LOCAL_VALUE (name) = x;
1062 /* Warn if shadowing an argument at the top level of the body. */
1063 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1064 /* This warning doesn't apply to the parms of a nested fcn. */
1065 && ! current_binding_level->parm_flag
1066 /* Check that this is one level down from the parms. */
1067 && current_binding_level->level_chain->parm_flag
1068 /* Check that the decl being shadowed
1069 comes from the parm level, one level up. */
1070 && chain_member (oldlocal, current_binding_level->level_chain->names))
1072 if (TREE_CODE (oldlocal) == PARM_DECL)
1073 pedwarn ("declaration of `%s' shadows a parameter",
1074 IDENTIFIER_POINTER (name));
1076 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1077 IDENTIFIER_POINTER (name));
1080 /* Maybe warn if shadowing something else. */
1081 else if (warn_shadow && !DECL_EXTERNAL (x)
1082 /* No shadow warnings for internally generated vars. */
1083 && DECL_SOURCE_LINE (x) != 0
1084 /* No shadow warnings for vars made for inlining. */
1085 && ! DECL_FROM_INLINE (x))
1087 const char *warnstring = 0;
1089 if (TREE_CODE (x) == PARM_DECL
1090 && current_binding_level->level_chain->parm_flag)
1091 /* Don't warn about the parm names in function declarator
1092 within a function declarator.
1093 It would be nice to avoid warning in any function
1094 declarator in a declaration, as opposed to a definition,
1095 but there is no way to tell it's not a definition. */
1097 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1098 warnstring = "declaration of `%s' shadows a parameter";
1099 else if (oldlocal != 0)
1100 warnstring = "declaration of `%s' shadows previous local";
1101 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1102 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1103 warnstring = "declaration of `%s' shadows global declaration";
1106 warning (warnstring, IDENTIFIER_POINTER (name));
1110 /* If storing a local value, there may already be one (inherited).
1111 If so, record it for restoration when this binding level ends. */
1113 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1117 /* Put decls on list in reverse order.
1118 We will reverse them later if necessary. */
1119 TREE_CHAIN (x) = b->names;
1126 pushdecl_force_head (x)
1129 current_binding_level->names = x;
1132 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1135 pushdecl_top_level (x)
1139 register struct binding_level *b = current_binding_level;
1141 current_binding_level = global_binding_level;
1143 current_binding_level = b;
1147 /* Nonzero if we are currently in the global binding level. */
1150 global_bindings_p ()
1152 return current_binding_level == global_binding_level;
1155 /* Return the list of declarations of the current level.
1156 Note that this list is in reverse order unless/until
1157 you nreverse it; and when you do nreverse it, you must
1158 store the result back using `storedecls' or you will lose. */
1163 return current_binding_level->names;
1166 /* Create a new `struct binding_level'. */
1168 static struct binding_level *
1169 make_binding_level ()
1172 return (struct binding_level *) xmalloc (sizeof (struct binding_level));
1177 int unused ATTRIBUTE_UNUSED;
1179 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1182 /* If this is the top level of a function,
1183 just make sure that NAMED_LABELS is 0. */
1185 if (current_binding_level == global_binding_level)
1189 /* Reuse or create a struct for this binding level. */
1191 if (free_binding_level)
1193 newlevel = free_binding_level;
1194 free_binding_level = free_binding_level->level_chain;
1198 newlevel = make_binding_level ();
1201 /* Add this level to the front of the chain (stack) of levels that
1204 *newlevel = clear_binding_level;
1205 newlevel->level_chain = current_binding_level;
1206 current_binding_level = newlevel;
1207 newlevel->keep = keep_next_level_flag;
1208 keep_next_level_flag = 0;
1209 newlevel->keep_if_subblocks = keep_next_if_subblocks;
1210 keep_next_if_subblocks = 0;
1211 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1212 newlevel->binding_depth = binding_depth;
1214 fprintf (stderr, "push %s level 0x%08x pc %d\n",
1215 (is_class_level) ? "class" : "block", newlevel, current_pc);
1218 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1221 /* Exit a binding level.
1222 Pop the level off, and restore the state of the identifier-decl mappings
1223 that were in effect when this level was entered.
1225 If KEEP is nonzero, this level had explicit declarations, so
1226 and create a "block" (a BLOCK node) for the level
1227 to record its declarations and subblocks for symbol table output.
1229 If FUNCTIONBODY is nonzero, this level is the body of a function,
1230 so create a block as if KEEP were set and also clear out all
1233 If REVERSE is nonzero, reverse the order of decls before putting
1234 them into the BLOCK. */
1237 poplevel (keep, reverse, functionbody)
1243 /* The chain of decls was accumulated in reverse order.
1244 Put it into forward order, just for cleanliness. */
1246 tree subblocks = current_binding_level->blocks;
1249 int block_previously_created;
1251 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1254 if (current_binding_level->end_pc != LARGEST_PC)
1255 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1256 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1257 current_binding_level->end_pc);
1259 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1260 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1262 if (is_class_level != (current_binding_level == class_binding_level))
1265 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1269 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1271 keep |= current_binding_level->keep;
1273 /* Get the decls in the order they were written.
1274 Usually current_binding_level->names is in reverse order.
1275 But parameter decls were previously put in forward order. */
1278 current_binding_level->names
1279 = decls = nreverse (current_binding_level->names);
1281 decls = current_binding_level->names;
1283 /* Output any nested inline functions within this block
1284 if they weren't already output. */
1286 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1287 if (TREE_CODE (decl) == FUNCTION_DECL
1288 && ! TREE_ASM_WRITTEN (decl)
1289 && DECL_INITIAL (decl) != 0
1290 && TREE_ADDRESSABLE (decl))
1292 /* If this decl was copied from a file-scope decl
1293 on account of a block-scope extern decl,
1294 propagate TREE_ADDRESSABLE to the file-scope decl.
1296 DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1297 true, since then the decl goes through save_for_inline_copying. */
1298 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1299 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1300 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1303 push_function_context ();
1304 output_inline_function (decl);
1305 pop_function_context ();
1309 /* If there were any declarations in that level,
1310 or if this level is a function body,
1311 create a BLOCK to record them for the life of this function. */
1314 block_previously_created = (current_binding_level->this_block != 0);
1315 if (block_previously_created)
1316 block = current_binding_level->this_block;
1317 else if (keep || functionbody
1318 || (current_binding_level->keep_if_subblocks && subblocks != 0))
1319 block = make_node (BLOCK);
1322 BLOCK_VARS (block) = decls;
1323 BLOCK_SUBBLOCKS (block) = subblocks;
1326 /* In each subblock, record that this is its superior. */
1328 for (link = subblocks; link; link = TREE_CHAIN (link))
1329 BLOCK_SUPERCONTEXT (link) = block;
1331 /* Clear out the meanings of the local variables of this level. */
1333 for (link = decls; link; link = TREE_CHAIN (link))
1335 tree name = DECL_NAME (link);
1336 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1338 /* If the ident. was used or addressed via a local extern decl,
1339 don't forget that fact. */
1340 if (DECL_EXTERNAL (link))
1342 if (TREE_USED (link))
1343 TREE_USED (name) = 1;
1344 if (TREE_ADDRESSABLE (link))
1345 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1347 IDENTIFIER_LOCAL_VALUE (name) = 0;
1351 /* Restore all name-meanings of the outer levels
1352 that were shadowed by this level. */
1354 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1355 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1357 /* If the level being exited is the top level of a function,
1358 check over all the labels, and clear out the current
1359 (function local) meanings of their names. */
1363 /* If this is the top level block of a function,
1364 the vars are the function's parameters.
1365 Don't leave them in the BLOCK because they are
1366 found in the FUNCTION_DECL instead. */
1368 BLOCK_VARS (block) = 0;
1370 /* Clear out the definitions of all label names,
1371 since their scopes end here,
1372 and add them to BLOCK_VARS. */
1375 for (link = named_labels; link; link = TREE_CHAIN (link))
1377 register tree label = TREE_VALUE (link);
1379 if (DECL_INITIAL (label) == 0)
1381 error_with_decl (label, "label `%s' used but not defined");
1382 /* Avoid crashing later. */
1383 define_label (input_filename, lineno,
1386 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1387 warning_with_decl (label, "label `%s' defined but not used");
1388 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1390 /* Put the labels into the "variables" of the
1391 top-level block, so debugger can see them. */
1392 TREE_CHAIN (label) = BLOCK_VARS (block);
1393 BLOCK_VARS (block) = label;
1398 /* Pop the current level, and free the structure for reuse. */
1401 register struct binding_level *level = current_binding_level;
1402 current_binding_level = current_binding_level->level_chain;
1404 level->level_chain = free_binding_level;
1405 free_binding_level = level;
1408 /* Dispose of the block that we just made inside some higher level. */
1410 DECL_INITIAL (current_function_decl) = block;
1413 if (!block_previously_created)
1414 current_binding_level->blocks
1415 = chainon (current_binding_level->blocks, block);
1417 /* If we did not make a block for the level just exited,
1418 any blocks made for inner levels
1419 (since they cannot be recorded as subblocks in that level)
1420 must be carried forward so they will later become subblocks
1421 of something else. */
1423 current_binding_level->blocks
1424 = chainon (current_binding_level->blocks, subblocks);
1426 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1427 binding contour so that they point to the appropriate construct, i.e.
1428 either to the current FUNCTION_DECL node, or else to the BLOCK node
1429 we just constructed.
1431 Note that for tagged types whose scope is just the formal parameter
1432 list for some function type specification, we can't properly set
1433 their TYPE_CONTEXTs here, because we don't have a pointer to the
1434 appropriate FUNCTION_TYPE node readily available to us. For those
1435 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1436 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1437 node which will represent the "scope" for these "parameter list local"
1442 TREE_USED (block) = 1;
1447 maybe_pushlevels (pc)
1450 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1454 while (pending_local_decls != NULL_TREE &&
1455 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1457 tree *ptr = &pending_local_decls;
1459 int end_pc = DECL_LOCAL_END_PC (decl);
1461 while (*ptr != NULL_TREE
1462 && DECL_LOCAL_START_PC (*ptr) <= pc
1463 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1464 ptr = &TREE_CHAIN (*ptr);
1465 pending_local_decls = *ptr;
1468 /* Force non-nested range to be nested in current range. */
1469 if (end_pc > current_binding_level->end_pc)
1470 end_pc = current_binding_level->end_pc;
1472 maybe_start_try (pc, end_pc);
1475 expand_start_bindings (0);
1477 current_binding_level->end_pc = end_pc;
1478 current_binding_level->start_pc = pc;
1479 current_binding_level->names = decl;
1480 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1482 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1486 maybe_start_try (pc, 0);
1490 maybe_poplevels (pc)
1493 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1497 while (current_binding_level->end_pc <= pc)
1499 expand_end_bindings (getdecls (), 1, 0);
1500 maybe_end_try (current_binding_level->start_pc, pc);
1503 maybe_end_try (0, pc);
1506 /* Terminate any binding which began during the range beginning at
1507 start_pc. This tidies up improperly nested local variable ranges
1508 and exception handlers; a variable declared within an exception
1509 range is forcibly terminated when that exception ends. */
1512 force_poplevels (start_pc)
1515 while (current_binding_level->start_pc > start_pc)
1517 if (pedantic && current_binding_level->start_pc > start_pc)
1518 warning_with_decl (current_function_decl,
1519 "In %s: overlapped variable and exception ranges at %d",
1520 current_binding_level->start_pc);
1521 expand_end_bindings (getdecls (), 1, 0);
1526 /* Insert BLOCK at the end of the list of subblocks of the
1527 current binding level. This is used when a BIND_EXPR is expanded,
1528 to handle the BLOCK node inside the BIND_EXPR. */
1531 insert_block (block)
1534 TREE_USED (block) = 1;
1535 current_binding_level->blocks
1536 = chainon (current_binding_level->blocks, block);
1539 /* Set the BLOCK node for the innermost scope
1540 (the one we are currently in). */
1544 register tree block;
1546 current_binding_level->this_block = block;
1549 /* integrate_decl_tree calls this function. */
1552 copy_lang_decl (node)
1556 = TREE_CODE (node) == VAR_DECL ? sizeof (struct lang_decl_var)
1557 : sizeof (struct lang_decl);
1558 struct lang_decl *x = (struct lang_decl *) ggc_alloc (lang_decl_size);
1559 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1560 DECL_LANG_SPECIFIC (node) = x;
1563 /* If DECL has a cleanup, build and return that cleanup here.
1564 This is a callback called by expand_expr. */
1567 maybe_build_cleanup (decl)
1568 tree decl ATTRIBUTE_UNUSED;
1570 /* There are no cleanups in Java (I think). */
1575 give_name_to_locals (jcf)
1578 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1579 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1581 pending_local_decls = NULL_TREE;
1585 n = JCF_readu2 (jcf);
1586 for (i = 0; i < n; i++)
1588 int start_pc = JCF_readu2 (jcf);
1589 int length = JCF_readu2 (jcf);
1590 int name_index = JCF_readu2 (jcf);
1591 int signature_index = JCF_readu2 (jcf);
1592 int slot = JCF_readu2 (jcf);
1593 tree name = get_name_constant (jcf, name_index);
1594 tree type = parse_signature (jcf, signature_index);
1595 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1597 && length == DECL_CODE_LENGTH (current_function_decl))
1599 tree decl = TREE_VEC_ELT (decl_map, slot);
1600 DECL_NAME (decl) = name;
1601 DECL_ASSEMBLER_NAME (decl) = name;
1602 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1603 warning ("bad type in parameter debug info");
1608 int end_pc = start_pc + length;
1609 tree decl = build_decl (VAR_DECL, name, type);
1610 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1612 warning_with_decl (decl,
1613 "bad PC range for debug info for local `%s'");
1614 end_pc = DECL_CODE_LENGTH (current_function_decl);
1617 /* Adjust start_pc if necessary so that the local's first
1618 store operation will use the relevant DECL as a
1619 destination. Fore more information, read the leading
1620 comments for expr.c:maybe_adjust_start_pc. */
1621 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1623 DECL_LANG_SPECIFIC (decl)
1624 = (struct lang_decl *) ggc_alloc (sizeof (struct lang_decl_var));
1625 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1626 DECL_LOCAL_START_PC (decl) = start_pc;
1628 /* FIXME: The range used internally for exceptions and local
1629 variable ranges, is a half-open interval:
1630 start_pc <= pc < end_pc. However, the range used in the
1631 Java VM spec is inclusive at both ends:
1632 start_pc <= pc <= end_pc. */
1635 DECL_LOCAL_END_PC (decl) = end_pc;
1637 /* Now insert the new decl in the proper place in
1638 pending_local_decls. We are essentially doing an insertion sort,
1639 which works fine, since the list input will normally already
1641 ptr = &pending_local_decls;
1642 while (*ptr != NULL_TREE
1643 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1644 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1645 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1646 ptr = &TREE_CHAIN (*ptr);
1647 TREE_CHAIN (decl) = *ptr;
1652 pending_local_decls = nreverse (pending_local_decls);
1654 /* Fill in default names for the parameters. */
1655 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1656 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1658 if (DECL_NAME (parm) == NULL_TREE)
1660 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1662 DECL_NAME (parm) = get_identifier ("this");
1666 sprintf (buffer, "ARG_%d", arg_i);
1667 DECL_NAME (parm) = get_identifier (buffer);
1669 DECL_ASSEMBLER_NAME (parm) = DECL_NAME (parm);
1675 build_result_decl (fndecl)
1678 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1679 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1680 if (INTEGRAL_TYPE_P (restype)
1681 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1682 restype = integer_type_node;
1683 return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype));
1686 /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE in order
1687 to emit initialization code for each test flag. */
1690 emit_init_test_initialization (entry, key)
1691 struct hash_entry *entry;
1692 hash_table_key key ATTRIBUTE_UNUSED;
1694 struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry;
1695 tree klass = build_class_ref ((tree) entry->key);
1696 expand_decl (ite->init_test_decl);
1698 /* We initialize the class init check variable by looking at the
1699 `state' field of the class to see if it is already initialized.
1700 This makes things a bit faster if the class is already
1701 initialized, which should be the common case. */
1703 (build (MODIFY_EXPR, boolean_type_node,
1704 ite->init_test_decl,
1705 build (GE_EXPR, boolean_type_node,
1706 build (COMPONENT_REF, byte_type_node,
1707 build1 (INDIRECT_REF, class_type_node, klass),
1708 lookup_field (&class_type_node,
1709 get_identifier ("state"))),
1710 build_int_2 (JV_STATE_DONE, 0))));
1716 complete_start_java_method (fndecl)
1719 if (! flag_emit_class_files)
1721 /* Initialize the RTL code for the function. */
1722 init_function_start (fndecl, input_filename, lineno);
1724 /* Set up parameters and prepare for return, for the function. */
1725 expand_function_start (fndecl, 0);
1727 /* Emit initialization code for test flags. */
1728 if (! always_initialize_class_p)
1729 hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (fndecl),
1730 emit_init_test_initialization, 0);
1734 /* If this fcn was already referenced via a block-scope `extern' decl (or
1735 an implicit decl), propagate certain information about the usage. */
1736 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1737 TREE_ADDRESSABLE (current_function_decl) = 1;
1741 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1742 && ! flag_emit_class_files
1743 && ! DECL_CLINIT_P (fndecl)
1744 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1746 tree clas = DECL_CONTEXT (fndecl);
1747 tree init = build (CALL_EXPR, void_type_node,
1748 build_address_of (soft_initclass_node),
1749 build_tree_list (NULL_TREE, build_class_ref (clas)),
1751 TREE_SIDE_EFFECTS (init) = 1;
1752 expand_expr_stmt (init);
1755 /* Push local variables. Function compiled from source code are
1756 using a different local variables management, and for them,
1757 pushlevel shouldn't be called from here. */
1758 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1761 if (! flag_emit_class_files)
1762 expand_start_bindings (1);
1765 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1767 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1768 tree enter, exit, lock;
1769 if (METHOD_STATIC (fndecl))
1770 lock = build_class_ref (DECL_CONTEXT (fndecl));
1772 lock = DECL_ARGUMENTS (fndecl);
1773 BUILD_MONITOR_ENTER (enter, lock);
1774 BUILD_MONITOR_EXIT (exit, lock);
1775 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1777 expand_expr_stmt (enter);
1778 expand_decl_cleanup (NULL_TREE, exit);
1782 tree function_body = DECL_FUNCTION_BODY (fndecl);
1783 tree body = BLOCK_EXPR_BODY (function_body);
1784 lock = build (WITH_CLEANUP_EXPR, void_type_node,
1785 enter, NULL_TREE, exit);
1786 TREE_SIDE_EFFECTS (lock) = 1;
1787 lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
1788 TREE_SIDE_EFFECTS (lock) = 1;
1789 lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
1790 TREE_SIDE_EFFECTS (lock) = 1;
1791 BLOCK_EXPR_BODY (function_body) = lock;
1797 start_java_method (fndecl)
1803 current_function_decl = fndecl;
1804 announce_function (fndecl);
1806 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1807 decl_map = make_tree_vec (i);
1808 type_map = (tree *) xrealloc (type_map, i * sizeof (tree));
1810 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1811 fprintf (stderr, "%s:\n", (*decl_printable_name) (fndecl, 2));
1813 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1814 pushlevel (1); /* Push parameters. */
1816 ptr = &DECL_ARGUMENTS (fndecl);
1817 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1818 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1820 tree parm_name = NULL_TREE, parm_decl;
1821 tree parm_type = TREE_VALUE (tem);
1822 if (i >= DECL_MAX_LOCALS(fndecl))
1823 fatal ("function has more parameters than local slots");
1825 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1826 DECL_CONTEXT (parm_decl) = fndecl;
1827 if (PROMOTE_PROTOTYPES
1828 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1829 && INTEGRAL_TYPE_P (parm_type))
1830 parm_type = integer_type_node;
1831 DECL_ARG_TYPE (parm_decl) = parm_type;
1834 ptr = &TREE_CHAIN (parm_decl);
1836 /* Add parm_decl to the decl_map. */
1837 push_jvm_slot (i, parm_decl);
1839 type_map[i] = TREE_TYPE (parm_decl);
1840 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1843 type_map[i] = void_type_node;
1847 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1849 while (i < DECL_MAX_LOCALS(fndecl))
1850 type_map[i++] = NULL_TREE;
1852 build_result_decl (fndecl);
1853 complete_start_java_method (fndecl);
1859 tree fndecl = current_function_decl;
1860 int flag_asynchronous_exceptions = asynchronous_exceptions;
1862 expand_end_bindings (getdecls (), 1, 0);
1863 /* pop out of function */
1866 /* pop out of its parameters */
1869 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1873 /* Generate rtl for function exit. */
1874 expand_function_end (input_filename, lineno, 0);
1876 /* FIXME: If the current method contains any exception handlers,
1877 force asynchronous_exceptions: this is necessary because signal
1878 handlers in libjava may throw exceptions. This is far from being
1879 a perfect solution, but it's better than doing nothing at all.*/
1881 asynchronous_exceptions = 1;
1883 /* Run the optimizers and output assembler code for this function. */
1884 rest_of_compilation (fndecl);
1886 current_function_decl = NULL_TREE;
1887 asynchronous_exceptions = flag_asynchronous_exceptions;
1890 /* Mark language-specific parts of T for garbage-collection. */
1896 if (TREE_CODE (t) == IDENTIFIER_NODE)
1898 struct lang_identifier *li = (struct lang_identifier *) t;
1899 ggc_mark_tree (li->global_value);
1900 ggc_mark_tree (li->local_value);
1901 ggc_mark_tree (li->utf8_ref);
1903 else if (TREE_CODE (t) == VAR_DECL
1904 || TREE_CODE (t) == PARM_DECL)
1906 struct lang_decl_var *ldv =
1907 ((struct lang_decl_var *) DECL_LANG_SPECIFIC (t));
1911 ggc_mark_tree (ldv->slot_chain);
1914 else if (TREE_CODE (t) == FUNCTION_DECL)
1916 struct lang_decl *ld = DECL_LANG_SPECIFIC (t);
1921 ggc_mark_tree (ld->throws_list);
1922 ggc_mark_tree (ld->function_decl_body);
1923 ggc_mark_tree (ld->called_constructor);
1924 ggc_mark_tree (ld->inner_access);
1927 else if (TYPE_P (t))
1929 struct lang_type *lt = TYPE_LANG_SPECIFIC (t);
1934 ggc_mark_tree (lt->signature);
1935 ggc_mark_tree (lt->cpool_data_ref);
1936 ggc_mark_tree (lt->finit_stmt_list);
1937 ggc_mark_tree (lt->clinit_stmt_list);
1938 ggc_mark_tree (lt->ii_block);
1939 ggc_mark_tree (lt->dot_class);