1 /* Process declarations and variables for the GNU compiler for the
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC 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 GCC 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 GCC; 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. */
31 #include "coretypes.h"
38 #include "java-tree.h"
44 #include "java-except.h"
47 #include "tree-inline.h"
49 #if defined (DEBUG_JAVA_BINDING_LEVELS)
50 extern void indent (void);
53 static tree push_jvm_slot (int, tree);
54 static tree lookup_name_current_level (tree);
55 static tree push_promoted_type (const char *, tree);
56 static struct binding_level *make_binding_level (void);
57 static tree create_primitive_vtable (const char *);
58 static tree check_local_named_variable (tree, tree, int, int *);
59 static tree check_local_unnamed_variable (tree, tree, tree);
60 static void dump_function (enum tree_dump_index, tree);
62 /* Name of the Cloneable class. */
63 tree java_lang_cloneable_identifier_node;
65 /* Name of the Serializable class. */
66 tree java_io_serializable_identifier_node;
68 /* Set to nonzero value in order to emit class initialization code
69 before static field references. */
70 extern int always_initialize_class_p;
72 /* The DECL_MAP is a mapping from (index, type) to a decl node.
73 If index < max_locals, it is the index of a local variable.
74 if index >= max_locals, then index-max_locals is a stack slot.
75 The DECL_MAP mapping is represented as a TREE_VEC whose elements
76 are a list of decls (VAR_DECL or PARM_DECL) chained by
77 DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
78 we search the chain for a decl with a matching TREE_TYPE. */
80 static GTY(()) tree decl_map;
82 /* A list of local variables VAR_DECLs for this method that we have seen
83 debug information, but we have not reached their starting (byte) PC yet. */
85 static GTY(()) tree pending_local_decls;
87 /* Push a local variable or stack slot into the decl_map,
88 and assign it an rtl. */
90 #if defined(DEBUG_JAVA_BINDING_LEVELS)
91 int binding_depth = 0;
92 int is_class_level = 0;
100 for (i = 0; i < binding_depth*2; i++)
103 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
106 push_jvm_slot (int index, tree decl)
108 struct rtx_def *rtl = NULL;
109 tree type = TREE_TYPE (decl);
112 DECL_CONTEXT (decl) = current_function_decl;
113 layout_decl (decl, 0);
115 /* See if we have an appropriate rtl (i.e. same mode) at this index.
116 If so, we must use it. */
117 tmp = TREE_VEC_ELT (decl_map, index);
118 while (tmp != NULL_TREE)
120 if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)))
121 rtl = DECL_RTL_IF_SET (tmp);
124 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
127 SET_DECL_RTL (decl, rtl);
130 if (index >= DECL_MAX_LOCALS (current_function_decl))
131 DECL_REGISTER (decl) = 1;
135 /* Now link the decl into the decl_map. */
136 if (DECL_LANG_SPECIFIC (decl) == NULL)
138 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
139 DECL_LOCAL_START_PC (decl) = 0;
140 DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
141 DECL_LOCAL_SLOT_NUMBER (decl) = index;
143 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
144 TREE_VEC_ELT (decl_map, index) = decl;
148 /* Find out if 'decl' passed in fits the defined PC location better than
149 'best'. Return decl if it does, return best if it doesn't. If decl
150 is returned, then updated is set to true. */
153 check_local_named_variable (tree best, tree decl, int pc, int *updated)
155 if (pc >= DECL_LOCAL_START_PC (decl)
156 && pc < DECL_LOCAL_END_PC (decl))
158 if (best == NULL_TREE
159 || (DECL_LOCAL_START_PC (decl) > DECL_LOCAL_START_PC (best)
160 && DECL_LOCAL_END_PC (decl) < DECL_LOCAL_END_PC (best)))
170 /* Find the best declaration based upon type. If 'decl' fits 'type' better
171 than 'best', return 'decl'. Otherwise return 'best'. */
174 check_local_unnamed_variable (tree best, tree decl, tree 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 (int index, tree type, int 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 (int index, tree type)
246 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
252 /* A chain of _DECL nodes for all variables, constants, functions,
253 * and typedef types. These are in the reverse of the order supplied.
257 /* For each level, a list of shadowed outer-level local definitions
258 to be restored when this level is popped.
259 Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
260 whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
263 /* For each level (except not the global one),
264 a chain of BLOCK nodes for all the levels
265 that were entered and exited one level down. */
268 /* The BLOCK node for this level, if one has been preallocated.
269 If 0, the BLOCK is allocated (if needed) when the level is popped. */
272 /* The binding level which this one is contained in (inherits from). */
273 struct binding_level *level_chain;
275 /* The bytecode PC that marks the end of this level. */
277 /* The bytecode PC that marks the start of this level. */
280 #if defined(DEBUG_JAVA_BINDING_LEVELS)
281 /* Binding depth at which this level began. */
282 unsigned binding_depth;
283 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
286 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
288 /* The binding level currently in effect. */
290 static struct binding_level *current_binding_level;
292 /* A chain of binding_level structures awaiting reuse. */
294 static struct binding_level *free_binding_level;
296 /* The outermost binding level, for names of file scope.
297 This is created when the compiler is started and exists
298 through the entire run. */
300 static struct binding_level *global_binding_level;
302 /* A PC value bigger than any PC value we may ever may encounter. */
304 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
306 /* Binding level structures are initialized by copying this one. */
308 static const struct binding_level clear_binding_level
309 = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
310 NULL_BINDING_LEVEL, LARGEST_PC, 0};
313 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
314 that have names. Here so we can clear out their names' definitions
315 at the end of the function. */
317 static tree named_labels;
319 /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
321 static tree shadowed_labels;
324 tree java_global_trees[JTI_MAX];
326 /* Build (and pushdecl) a "promoted type" for all standard
327 types shorter than int. */
330 push_promoted_type (const char *name, tree actual_type)
332 tree type = make_node (TREE_CODE (actual_type));
334 tree in_min = TYPE_MIN_VALUE (int_type_node);
335 tree in_max = TYPE_MAX_VALUE (int_type_node);
337 tree in_min = TYPE_MIN_VALUE (actual_type);
338 tree in_max = TYPE_MAX_VALUE (actual_type);
340 TYPE_MIN_VALUE (type) = copy_node (in_min);
341 TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
342 TYPE_MAX_VALUE (type) = copy_node (in_max);
343 TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
344 TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
346 pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
350 /* Return a definition for a builtin function named NAME and whose data type
351 is TYPE. TYPE should be a function type with argument types.
352 FUNCTION_CODE tells later passes how to compile calls to this function.
353 See tree.h for its possible values.
355 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
356 the name to be called if we can't opencode the function. If
357 ATTRS is nonzero, use that for the function's attribute list. */
360 builtin_function (const char *name,
363 enum built_in_class class,
364 const char *library_name,
365 tree attrs ATTRIBUTE_UNUSED)
367 tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
368 DECL_EXTERNAL (decl) = 1;
369 TREE_PUBLIC (decl) = 1;
371 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
372 make_decl_rtl (decl, NULL);
374 DECL_BUILT_IN_CLASS (decl) = class;
375 DECL_FUNCTION_CODE (decl) = function_code;
379 /* Return tree that represents a vtable for a primitive array. */
381 create_primitive_vtable (const char *name)
386 sprintf (buf, "_Jv_%sVTable", name);
387 r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
388 DECL_EXTERNAL (r) = 1;
393 java_init_decl_processing (void)
395 register tree endlink;
396 tree field = NULL_TREE;
399 init_class_processing ();
401 current_function_decl = NULL;
402 current_binding_level = NULL_BINDING_LEVEL;
403 free_binding_level = NULL_BINDING_LEVEL;
404 pushlevel (0); /* make the binding_level structure for global names */
405 global_binding_level = current_binding_level;
407 /* The code here must be similar to build_common_tree_nodes{,_2} in
408 tree.c, especially as to the order of initializing common nodes. */
409 error_mark_node = make_node (ERROR_MARK);
410 TREE_TYPE (error_mark_node) = error_mark_node;
412 /* Create sizetype first - needed for other types. */
413 initialize_sizetypes ();
415 byte_type_node = make_signed_type (8);
416 pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
417 short_type_node = make_signed_type (16);
418 pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
419 int_type_node = make_signed_type (32);
420 pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
421 long_type_node = make_signed_type (64);
422 pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
424 unsigned_byte_type_node = make_unsigned_type (8);
425 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
426 unsigned_byte_type_node));
427 unsigned_short_type_node = make_unsigned_type (16);
428 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
429 unsigned_short_type_node));
430 unsigned_int_type_node = make_unsigned_type (32);
431 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
432 unsigned_int_type_node));
433 unsigned_long_type_node = make_unsigned_type (64);
434 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
435 unsigned_long_type_node));
437 set_sizetype (make_unsigned_type (POINTER_SIZE));
439 /* Define these next since types below may used them. */
440 integer_type_node = java_type_for_size (INT_TYPE_SIZE, 0);
441 integer_zero_node = build_int_2 (0, 0);
442 integer_one_node = build_int_2 (1, 0);
443 integer_two_node = build_int_2 (2, 0);
444 integer_four_node = build_int_2 (4, 0);
445 integer_minus_one_node = build_int_2 (-1, -1);
447 /* A few values used for range checking in the lexer. */
448 decimal_int_max = build_int_2 (0x80000000, 0);
449 TREE_TYPE (decimal_int_max) = unsigned_int_type_node;
450 #if HOST_BITS_PER_WIDE_INT == 64
451 decimal_long_max = build_int_2 (0x8000000000000000LL, 0);
453 #if HOST_BITS_PER_WIDE_INT == 32
454 decimal_long_max = build_int_2 (0, 0x80000000);
456 #error "unsupported size"
459 TREE_TYPE (decimal_long_max) = unsigned_long_type_node;
461 size_zero_node = size_int (0);
462 size_one_node = size_int (1);
463 bitsize_zero_node = bitsize_int (0);
464 bitsize_one_node = bitsize_int (1);
465 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
467 long_zero_node = build_int_2 (0, 0);
468 TREE_TYPE (long_zero_node) = long_type_node;
470 void_type_node = make_node (VOID_TYPE);
471 pushdecl (build_decl (TYPE_DECL, get_identifier ("void"), void_type_node));
472 layout_type (void_type_node); /* Uses size_zero_node */
473 ptr_type_node = build_pointer_type (void_type_node);
474 t = make_node (VOID_TYPE);
475 layout_type (t); /* Uses size_zero_node */
476 return_address_type_node = build_pointer_type (t);
478 null_pointer_node = build_int_2 (0, 0);
479 TREE_TYPE (null_pointer_node) = ptr_type_node;
481 /* Used by the parser to represent empty statements and blocks. */
482 empty_stmt_node = build1 (NOP_EXPR, void_type_node, size_zero_node);
483 CAN_COMPLETE_NORMALLY (empty_stmt_node) = 1;
486 /* Make a type to be the domain of a few array types
487 whose domains don't really matter.
488 200 is small enough that it always fits in size_t
489 and large enough that it can hold most function names for the
490 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
491 short_array_type_node = build_prim_array_type (short_type_node, 200);
493 char_type_node = make_node (CHAR_TYPE);
494 TYPE_PRECISION (char_type_node) = 16;
495 fixup_unsigned_type (char_type_node);
496 pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
498 boolean_type_node = make_node (BOOLEAN_TYPE);
499 TYPE_PRECISION (boolean_type_node) = 1;
500 fixup_unsigned_type (boolean_type_node);
501 pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
503 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
504 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
506 promoted_byte_type_node
507 = push_promoted_type ("promoted_byte", byte_type_node);
508 promoted_short_type_node
509 = push_promoted_type ("promoted_short", short_type_node);
510 promoted_char_type_node
511 = push_promoted_type ("promoted_char", char_type_node);
512 promoted_boolean_type_node
513 = push_promoted_type ("promoted_boolean", boolean_type_node);
515 float_type_node = make_node (REAL_TYPE);
516 TYPE_PRECISION (float_type_node) = 32;
517 pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
519 layout_type (float_type_node);
521 double_type_node = make_node (REAL_TYPE);
522 TYPE_PRECISION (double_type_node) = 64;
523 pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
525 layout_type (double_type_node);
527 float_zero_node = build_real (float_type_node, dconst0);
528 double_zero_node = build_real (double_type_node, dconst0);
530 /* These are the vtables for arrays of primitives. */
531 boolean_array_vtable = create_primitive_vtable ("boolean");
532 byte_array_vtable = create_primitive_vtable ("byte");
533 char_array_vtable = create_primitive_vtable ("char");
534 short_array_vtable = create_primitive_vtable ("short");
535 int_array_vtable = create_primitive_vtable ("int");
536 long_array_vtable = create_primitive_vtable ("long");
537 float_array_vtable = create_primitive_vtable ("float");
538 double_array_vtable = create_primitive_vtable ("double");
540 /* As you're adding items here, please update the code right after
541 this section, so that the filename containing the source code of
542 the pre-defined class gets registered correctly. */
543 unqualified_object_id_node = get_identifier ("Object");
544 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
545 object_ptr_type_node = promote_type (object_type_node);
546 string_type_node = lookup_class (get_identifier ("java.lang.String"));
547 string_ptr_type_node = promote_type (string_type_node);
548 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
549 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
550 exception_type_node = lookup_class (get_identifier ("java.lang.Exception"));
551 runtime_exception_type_node =
552 lookup_class (get_identifier ("java.lang.RuntimeException"));
553 error_exception_type_node =
554 lookup_class (get_identifier ("java.lang.Error"));
555 class_not_found_type_node =
556 lookup_class (get_identifier ("java.lang.ClassNotFoundException"));
557 no_class_def_found_type_node =
558 lookup_class (get_identifier ("java.lang.NoClassDefFoundError"));
560 rawdata_ptr_type_node
561 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
563 add_predefined_file (get_identifier ("java/lang/Class.java"));
564 add_predefined_file (get_identifier ("java/lang/Error.java"));
565 add_predefined_file (get_identifier ("java/lang/Object.java"));
566 add_predefined_file (get_identifier ("java/lang/RuntimeException.java"));
567 add_predefined_file (get_identifier ("java/lang/String.java"));
568 add_predefined_file (get_identifier ("java/lang/Throwable.java"));
569 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
570 add_predefined_file (get_identifier ("java/lang/Exception.java"));
571 add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java"));
572 add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java"));
573 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
575 methodtable_type = make_node (RECORD_TYPE);
576 layout_type (methodtable_type);
577 build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
578 methodtable_ptr_type = build_pointer_type (methodtable_type);
580 TYPE_identifier_node = get_identifier ("TYPE");
581 init_identifier_node = get_identifier ("<init>");
582 clinit_identifier_node = get_identifier ("<clinit>");
583 finit_identifier_node = get_identifier ("finit$");
584 instinit_identifier_node = get_identifier ("instinit$");
585 void_signature_node = get_identifier ("()V");
586 length_identifier_node = get_identifier ("length");
587 finalize_identifier_node = get_identifier ("finalize");
588 this_identifier_node = get_identifier ("this");
589 super_identifier_node = get_identifier ("super");
590 continue_identifier_node = get_identifier ("continue");
591 access0_identifier_node = get_identifier ("access$0");
592 classdollar_identifier_node = get_identifier ("class$");
594 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
595 java_io_serializable_identifier_node =
596 get_identifier ("java.io.Serializable");
598 /* for lack of a better place to put this stub call */
599 init_expr_processing();
601 utf8const_type = make_node (RECORD_TYPE);
602 PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
603 PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
604 FINISH_RECORD (utf8const_type);
605 utf8const_ptr_type = build_pointer_type (utf8const_type);
607 constants_type_node = make_node (RECORD_TYPE);
608 PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
609 PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
610 PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
611 FINISH_RECORD (constants_type_node);
612 build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
614 access_flags_type_node = unsigned_short_type_node;
616 dtable_type = make_node (RECORD_TYPE);
617 dtable_ptr_type = build_pointer_type (dtable_type);
619 one_elt_array_domain_type = build_index_type (integer_one_node);
620 otable_type = build_array_type (integer_type_node,
621 one_elt_array_domain_type);
622 TYPE_NONALIASED_COMPONENT (otable_type) = 1;
623 otable_ptr_type = build_pointer_type (otable_type);
625 method_symbol_type = make_node (RECORD_TYPE);
626 PUSH_FIELD (method_symbol_type, field, "clname", utf8const_ptr_type);
627 PUSH_FIELD (method_symbol_type, field, "name", utf8const_ptr_type);
628 PUSH_FIELD (method_symbol_type, field, "signature", utf8const_ptr_type);
629 FINISH_RECORD (method_symbol_type);
631 method_symbols_array_type = build_array_type (method_symbol_type,
632 one_elt_array_domain_type);
633 method_symbols_array_ptr_type = build_pointer_type
634 (method_symbols_array_type);
636 otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), otable_type);
637 DECL_EXTERNAL (otable_decl) = 1;
638 TREE_STATIC (otable_decl) = 1;
639 TREE_READONLY (otable_decl) = 1;
640 pushdecl (otable_decl);
642 otable_syms_decl = build_decl (VAR_DECL, get_identifier ("otable_syms"),
643 method_symbols_array_type);
644 TREE_STATIC (otable_syms_decl) = 1;
645 TREE_CONSTANT (otable_syms_decl) = 1;
646 pushdecl (otable_syms_decl);
648 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
649 /* This isn't exactly true, but it is what we have in the source.
650 There is an unresolved issue here, which is whether the vtable
651 should be marked by the GC. */
652 if (! flag_hash_synchronization)
653 PUSH_FIELD (object_type_node, field, "sync_info",
654 build_pointer_type (object_type_node));
655 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
656 FIELD_PRIVATE (t) = 1;
657 FINISH_RECORD (object_type_node);
659 field_type_node = make_node (RECORD_TYPE);
660 field_ptr_type_node = build_pointer_type (field_type_node);
661 method_type_node = make_node (RECORD_TYPE);
662 method_ptr_type_node = build_pointer_type (method_type_node);
664 set_super_info (0, class_type_node, object_type_node, 0);
665 set_super_info (0, string_type_node, object_type_node, 0);
666 class_ptr_type = build_pointer_type (class_type_node);
668 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
669 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
670 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
671 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
672 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
673 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
674 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
675 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
676 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
677 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
678 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
679 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
680 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
681 PUSH_FIELD (class_type_node, field, "otable", otable_ptr_type);
682 PUSH_FIELD (class_type_node, field, "otable_syms",
683 method_symbols_array_ptr_type);
684 PUSH_FIELD (class_type_node, field, "interfaces",
685 build_pointer_type (class_ptr_type));
686 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
687 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
688 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
689 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
690 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
691 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
692 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
693 PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);
694 PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
695 PUSH_FIELD (class_type_node, field, "chain", ptr_type_node);
696 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
697 FIELD_PRIVATE (t) = 1;
698 push_super_field (class_type_node, object_type_node);
700 FINISH_RECORD (class_type_node);
701 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
703 field_info_union_node = make_node (UNION_TYPE);
704 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
705 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
707 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
709 layout_type (field_info_union_node);
711 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
712 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
713 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
714 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
715 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
716 FINISH_RECORD (field_type_node);
717 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
719 nativecode_ptr_array_type_node
720 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
722 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
723 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
724 FINISH_RECORD (dtable_type);
725 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
727 #define jint_type int_type_node
728 #define jint_ptr_type ptr_type_node
730 jexception_type = make_node (RECORD_TYPE);
731 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
732 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
733 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
734 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
735 FINISH_RECORD (jexception_type);
736 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
737 jexception_ptr_type = build_pointer_type (jexception_type);
739 lineNumberEntry_type = make_node (RECORD_TYPE);
740 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
741 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
742 FINISH_RECORD (lineNumberEntry_type);
744 lineNumbers_type = make_node (RECORD_TYPE);
745 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
746 FINISH_RECORD (lineNumbers_type);
748 #define instn_ptr_type_node ptr_type_node /* XXX JH */
750 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
752 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
753 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
754 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
755 PUSH_FIELD (method_type_node, field, "index", unsigned_short_type_node);
756 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
757 PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
758 FINISH_RECORD (method_type_node);
759 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
761 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
763 t = tree_cons (NULL_TREE, class_ptr_type,
764 tree_cons (NULL_TREE, int_type_node, endlink));
765 alloc_object_node = builtin_function ("_Jv_AllocObject",
766 build_function_type (ptr_type_node, t),
767 0, NOT_BUILT_IN, NULL, NULL_TREE);
768 DECL_IS_MALLOC (alloc_object_node) = 1;
769 alloc_no_finalizer_node =
770 builtin_function ("_Jv_AllocObjectNoFinalizer",
771 build_function_type (ptr_type_node, t),
772 0, NOT_BUILT_IN, NULL, NULL_TREE);
773 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
775 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
776 soft_initclass_node = builtin_function ("_Jv_InitClass",
777 build_function_type (void_type_node,
779 0, NOT_BUILT_IN, NULL, NULL_TREE);
781 throw_node = builtin_function ("_Jv_Throw",
782 build_function_type (ptr_type_node, t),
783 0, NOT_BUILT_IN, NULL, NULL_TREE);
784 /* Mark throw_nodes as `noreturn' functions with side effects. */
785 TREE_THIS_VOLATILE (throw_node) = 1;
786 TREE_SIDE_EFFECTS (throw_node) = 1;
788 t = build_function_type (int_type_node, endlink);
789 soft_monitorenter_node
790 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
792 soft_monitorexit_node
793 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
796 t = tree_cons (NULL_TREE, int_type_node,
797 tree_cons (NULL_TREE, int_type_node, endlink));
799 = builtin_function ("_Jv_NewPrimArray",
800 build_function_type(ptr_type_node, t),
801 0, NOT_BUILT_IN, NULL, NULL_TREE);
802 DECL_IS_MALLOC (soft_newarray_node) = 1;
804 t = tree_cons (NULL_TREE, int_type_node,
805 tree_cons (NULL_TREE, class_ptr_type,
806 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
808 = builtin_function ("_Jv_NewObjectArray",
809 build_function_type (ptr_type_node, t),
810 0, NOT_BUILT_IN, NULL, NULL_TREE);
811 DECL_IS_MALLOC (soft_anewarray_node) = 1;
813 /* There is no endlink here because _Jv_NewMultiArray is a varargs
815 t = tree_cons (NULL_TREE, ptr_type_node,
816 tree_cons (NULL_TREE, int_type_node, NULL_TREE));
817 soft_multianewarray_node
818 = builtin_function ("_Jv_NewMultiArray",
819 build_function_type (ptr_type_node, t),
820 0, NOT_BUILT_IN, NULL, NULL_TREE);
821 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
823 t = build_function_type (void_type_node,
824 tree_cons (NULL_TREE, int_type_node, endlink));
825 soft_badarrayindex_node
826 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
827 0, NOT_BUILT_IN, NULL, NULL_TREE);
828 /* Mark soft_badarrayindex_node as a `noreturn' function with side
830 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
831 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
833 soft_nullpointer_node
834 = builtin_function ("_Jv_ThrowNullPointerException",
835 build_function_type (void_type_node, endlink),
836 0, NOT_BUILT_IN, NULL, NULL_TREE);
837 /* Mark soft_nullpointer_node as a `noreturn' function with side
839 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
840 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
842 t = tree_cons (NULL_TREE, class_ptr_type,
843 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
845 = builtin_function ("_Jv_CheckCast",
846 build_function_type (ptr_type_node, t),
847 0, NOT_BUILT_IN, NULL, NULL_TREE);
848 t = tree_cons (NULL_TREE, object_ptr_type_node,
849 tree_cons (NULL_TREE, class_ptr_type, endlink));
851 = builtin_function ("_Jv_IsInstanceOf",
852 build_function_type (boolean_type_node, t),
853 0, NOT_BUILT_IN, NULL, NULL_TREE);
854 t = tree_cons (NULL_TREE, object_ptr_type_node,
855 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
856 soft_checkarraystore_node
857 = builtin_function ("_Jv_CheckArrayStore",
858 build_function_type (void_type_node, t),
859 0, NOT_BUILT_IN, NULL, NULL_TREE);
860 t = tree_cons (NULL_TREE, ptr_type_node,
861 tree_cons (NULL_TREE, ptr_type_node,
862 tree_cons (NULL_TREE, int_type_node, endlink)));
863 soft_lookupinterfacemethod_node
864 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
865 build_function_type (ptr_type_node, t),
866 0, NOT_BUILT_IN, NULL, NULL_TREE);
868 t = tree_cons (NULL_TREE, object_ptr_type_node,
869 tree_cons (NULL_TREE, ptr_type_node,
870 tree_cons (NULL_TREE, ptr_type_node, endlink)));
871 soft_lookupjnimethod_node
872 = builtin_function ("_Jv_LookupJNIMethod",
873 build_function_type (ptr_type_node, t),
874 0, NOT_BUILT_IN, NULL, NULL_TREE);
875 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
876 soft_getjnienvnewframe_node
877 = builtin_function ("_Jv_GetJNIEnvNewFrame",
878 build_function_type (ptr_type_node, t),
879 0, NOT_BUILT_IN, NULL, NULL_TREE);
880 soft_jnipopsystemframe_node
881 = builtin_function ("_Jv_JNI_PopSystemFrame",
882 build_function_type (ptr_type_node, t),
883 0, NOT_BUILT_IN, NULL, NULL_TREE);
885 t = tree_cons (NULL_TREE, double_type_node,
886 tree_cons (NULL_TREE, double_type_node, endlink));
888 = builtin_function ("__builtin_fmod",
889 build_function_type (double_type_node, t),
890 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmod", NULL_TREE);
893 t = tree_cons (NULL_TREE, float_type_node,
894 tree_cons (NULL_TREE, float_type_node, endlink));
896 = builtin_function ("__builtin_fmodf",
897 build_function_type (float_type_node, t),
898 BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmodf", NULL_TREE);
902 = builtin_function ("_Jv_divI",
903 build_function_type (int_type_node, t),
904 0, NOT_BUILT_IN, NULL, NULL_TREE);
907 = builtin_function ("_Jv_remI",
908 build_function_type (int_type_node, t),
909 0, NOT_BUILT_IN, NULL, NULL_TREE);
912 = builtin_function ("_Jv_divJ",
913 build_function_type (long_type_node, t),
914 0, NOT_BUILT_IN, NULL, NULL_TREE);
917 = builtin_function ("_Jv_remJ",
918 build_function_type (long_type_node, t),
919 0, NOT_BUILT_IN, NULL, NULL_TREE);
921 /* Initialize variables for except.c. */
922 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
923 ? "__gcj_personality_sj0"
924 : "__gcj_personality_v0");
925 lang_eh_runtime_type = prepare_eh_table_type;
929 initialize_builtins ();
933 /* Look up NAME in the current binding level and its superiors
934 in the namespace of variables, functions and typedefs.
935 Return a ..._DECL node of some kind representing its definition,
936 or return 0 if it is undefined. */
939 lookup_name (tree name)
942 if (current_binding_level != global_binding_level
943 && IDENTIFIER_LOCAL_VALUE (name))
944 val = IDENTIFIER_LOCAL_VALUE (name);
946 val = IDENTIFIER_GLOBAL_VALUE (name);
950 /* Similar to `lookup_name' but look only at current binding level and
951 the previous one if its the parameter level. */
954 lookup_name_current_level (tree name)
958 if (current_binding_level == global_binding_level)
959 return IDENTIFIER_GLOBAL_VALUE (name);
961 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
964 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
965 if (DECL_NAME (t) == name)
971 /* Use a binding level to record a labeled block declaration */
974 push_labeled_block (tree lb)
976 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
977 register struct binding_level *b = current_binding_level;
978 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
980 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
981 TREE_CHAIN (lb) = b->names;
983 IDENTIFIER_LOCAL_VALUE (name) = lb;
986 /* Pop the current binding level, reinstalling values for the previous
990 pop_labeled_block (void)
992 struct binding_level *b = current_binding_level;
993 tree label = b->names;
994 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
997 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
998 TREE_VALUE (b->shadowed);
1000 /* Pop the current level, and free the structure for reuse. */
1001 current_binding_level = current_binding_level->level_chain;
1002 b->level_chain = free_binding_level;
1003 free_binding_level = b;
1006 /* Record a decl-node X as belonging to the current lexical scope.
1007 Check for errors (such as an incompatible declaration for the same
1008 name already seen in the same scope).
1010 Returns either X or an old decl for the same name.
1011 If an old decl is returned, it may have been smashed
1012 to agree with what X says. */
1018 register tree name = DECL_NAME (x);
1019 register struct binding_level *b = current_binding_level;
1021 if (TREE_CODE (x) != TYPE_DECL)
1022 DECL_CONTEXT (x) = current_function_decl;
1028 t = lookup_name_current_level (name);
1029 if (t != 0 && t == error_mark_node)
1030 /* error_mark_node is 0 for a while during initialization! */
1033 error_with_decl (x, "`%s' used prior to declaration");
1038 file = DECL_SOURCE_FILE (t);
1039 line = DECL_SOURCE_LINE (t);
1042 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1043 to point to the TYPE_DECL.
1044 Since Java does not have typedefs, a type can only have
1045 one (true) name, given by a class, interface, or builtin. */
1046 if (TREE_CODE (x) == TYPE_DECL
1047 && TYPE_NAME (TREE_TYPE (x)) == 0
1048 && TREE_TYPE (x) != error_mark_node)
1050 TYPE_NAME (TREE_TYPE (x)) = x;
1051 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1054 /* This name is new in its binding level.
1055 Install the new declaration and return it. */
1056 if (b == global_binding_level)
1058 /* Install a global value. */
1060 IDENTIFIER_GLOBAL_VALUE (name) = x;
1064 /* Here to install a non-global value. */
1065 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1066 IDENTIFIER_LOCAL_VALUE (name) = x;
1069 /* Warn if shadowing an argument at the top level of the body. */
1070 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1071 /* This warning doesn't apply to the parms of a nested fcn. */
1072 && ! current_binding_level->parm_flag
1073 /* Check that this is one level down from the parms. */
1074 && current_binding_level->level_chain->parm_flag
1075 /* Check that the decl being shadowed
1076 comes from the parm level, one level up. */
1077 && chain_member (oldlocal, current_binding_level->level_chain->names))
1079 if (TREE_CODE (oldlocal) == PARM_DECL)
1080 pedwarn ("declaration of `%s' shadows a parameter",
1081 IDENTIFIER_POINTER (name));
1083 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1084 IDENTIFIER_POINTER (name));
1087 /* Maybe warn if shadowing something else. */
1088 else if (warn_shadow && !DECL_EXTERNAL (x)
1089 /* No shadow warnings for internally generated vars. */
1090 && DECL_SOURCE_LINE (x) != 0
1091 /* No shadow warnings for vars made for inlining. */
1092 && ! DECL_FROM_INLINE (x))
1094 const char *warnstring = 0;
1096 if (TREE_CODE (x) == PARM_DECL
1097 && current_binding_level->level_chain->parm_flag)
1098 /* Don't warn about the parm names in function declarator
1099 within a function declarator.
1100 It would be nice to avoid warning in any function
1101 declarator in a declaration, as opposed to a definition,
1102 but there is no way to tell it's not a definition. */
1104 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1105 warnstring = "declaration of `%s' shadows a parameter";
1106 else if (oldlocal != 0)
1107 warnstring = "declaration of `%s' shadows previous local";
1108 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1109 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1110 warnstring = "declaration of `%s' shadows global declaration";
1113 warning (warnstring, IDENTIFIER_POINTER (name));
1117 /* If storing a local value, there may already be one (inherited).
1118 If so, record it for restoration when this binding level ends. */
1120 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1124 /* Put decls on list in reverse order.
1125 We will reverse them later if necessary. */
1126 TREE_CHAIN (x) = b->names;
1133 pushdecl_force_head (tree x)
1135 current_binding_level->names = x;
1138 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1141 pushdecl_top_level (tree x)
1144 register struct binding_level *b = current_binding_level;
1146 current_binding_level = global_binding_level;
1148 current_binding_level = b;
1152 /* Nonzero if we are currently in the global binding level. */
1155 global_bindings_p (void)
1157 return current_binding_level == global_binding_level;
1160 /* Return the list of declarations of the current level.
1161 Note that this list is in reverse order unless/until
1162 you nreverse it; and when you do nreverse it, you must
1163 store the result back using `storedecls' or you will lose. */
1168 return current_binding_level->names;
1171 /* Create a new `struct binding_level'. */
1173 static struct binding_level *
1174 make_binding_level (void)
1177 return xmalloc (sizeof (struct binding_level));
1181 pushlevel (int unused ATTRIBUTE_UNUSED)
1183 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1186 /* If this is the top level of a function,
1187 just make sure that NAMED_LABELS is 0. */
1189 if (current_binding_level == global_binding_level)
1193 /* Reuse or create a struct for this binding level. */
1195 if (free_binding_level)
1197 newlevel = free_binding_level;
1198 free_binding_level = free_binding_level->level_chain;
1202 newlevel = make_binding_level ();
1205 /* Add this level to the front of the chain (stack) of levels that
1208 *newlevel = clear_binding_level;
1209 newlevel->level_chain = current_binding_level;
1210 current_binding_level = newlevel;
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 (int keep, int reverse, int functionbody)
1240 /* The chain of decls was accumulated in reverse order.
1241 Put it into forward order, just for cleanliness. */
1243 tree subblocks = current_binding_level->blocks;
1246 int block_previously_created;
1248 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1251 if (current_binding_level->end_pc != LARGEST_PC)
1252 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1253 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1254 current_binding_level->end_pc);
1256 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1257 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1259 if (is_class_level != (current_binding_level == class_binding_level))
1262 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1266 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1268 /* Get the decls in the order they were written.
1269 Usually current_binding_level->names is in reverse order.
1270 But parameter decls were previously put in forward order. */
1273 current_binding_level->names
1274 = decls = nreverse (current_binding_level->names);
1276 decls = current_binding_level->names;
1278 /* Output any nested inline functions within this block
1279 if they weren't already output. */
1281 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1282 if (TREE_CODE (decl) == FUNCTION_DECL
1283 && ! TREE_ASM_WRITTEN (decl)
1284 && DECL_INITIAL (decl) != 0
1285 && TREE_ADDRESSABLE (decl))
1287 /* If this decl was copied from a file-scope decl
1288 on account of a block-scope extern decl,
1289 propagate TREE_ADDRESSABLE to the file-scope decl.
1291 DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1292 true, since then the decl goes through save_for_inline_copying. */
1293 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1294 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1295 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1298 push_function_context ();
1299 output_inline_function (decl);
1300 pop_function_context ();
1304 /* If there were any declarations in that level,
1305 or if this level is a function body,
1306 create a BLOCK to record them for the life of this function. */
1309 block_previously_created = (current_binding_level->this_block != 0);
1310 if (block_previously_created)
1311 block = current_binding_level->this_block;
1312 else if (keep || functionbody)
1313 block = make_node (BLOCK);
1316 BLOCK_VARS (block) = decls;
1317 BLOCK_SUBBLOCKS (block) = subblocks;
1320 /* In each subblock, record that this is its superior. */
1322 for (link = subblocks; link; link = TREE_CHAIN (link))
1323 BLOCK_SUPERCONTEXT (link) = block;
1325 /* Clear out the meanings of the local variables of this level. */
1327 for (link = decls; link; link = TREE_CHAIN (link))
1329 tree name = DECL_NAME (link);
1330 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1332 /* If the ident. was used or addressed via a local extern decl,
1333 don't forget that fact. */
1334 if (DECL_EXTERNAL (link))
1336 if (TREE_USED (link))
1337 TREE_USED (name) = 1;
1338 if (TREE_ADDRESSABLE (link))
1339 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1341 IDENTIFIER_LOCAL_VALUE (name) = 0;
1345 /* Restore all name-meanings of the outer levels
1346 that were shadowed by this level. */
1348 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1349 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1351 /* If the level being exited is the top level of a function,
1352 check over all the labels, and clear out the current
1353 (function local) meanings of their names. */
1357 /* If this is the top level block of a function,
1358 the vars are the function's parameters.
1359 Don't leave them in the BLOCK because they are
1360 found in the FUNCTION_DECL instead. */
1362 BLOCK_VARS (block) = 0;
1364 /* Clear out the definitions of all label names,
1365 since their scopes end here,
1366 and add them to BLOCK_VARS. */
1369 for (link = named_labels; link; link = TREE_CHAIN (link))
1371 register tree label = TREE_VALUE (link);
1373 if (DECL_INITIAL (label) == 0)
1375 error_with_decl (label, "label `%s' used but not defined");
1376 /* Avoid crashing later. */
1377 define_label (input_filename, lineno,
1380 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1381 warning_with_decl (label, "label `%s' defined but not used");
1382 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1384 /* Put the labels into the "variables" of the
1385 top-level block, so debugger can see them. */
1386 TREE_CHAIN (label) = BLOCK_VARS (block);
1387 BLOCK_VARS (block) = label;
1392 /* Pop the current level, and free the structure for reuse. */
1395 register struct binding_level *level = current_binding_level;
1396 current_binding_level = current_binding_level->level_chain;
1398 level->level_chain = free_binding_level;
1399 free_binding_level = level;
1402 /* Dispose of the block that we just made inside some higher level. */
1404 DECL_INITIAL (current_function_decl) = block;
1407 if (!block_previously_created)
1408 current_binding_level->blocks
1409 = chainon (current_binding_level->blocks, block);
1411 /* If we did not make a block for the level just exited,
1412 any blocks made for inner levels
1413 (since they cannot be recorded as subblocks in that level)
1414 must be carried forward so they will later become subblocks
1415 of something else. */
1417 current_binding_level->blocks
1418 = chainon (current_binding_level->blocks, subblocks);
1420 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1421 binding contour so that they point to the appropriate construct, i.e.
1422 either to the current FUNCTION_DECL node, or else to the BLOCK node
1423 we just constructed.
1425 Note that for tagged types whose scope is just the formal parameter
1426 list for some function type specification, we can't properly set
1427 their TYPE_CONTEXTs here, because we don't have a pointer to the
1428 appropriate FUNCTION_TYPE node readily available to us. For those
1429 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1430 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1431 node which will represent the "scope" for these "parameter list local"
1436 TREE_USED (block) = 1;
1441 maybe_pushlevels (int pc)
1443 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1447 while (pending_local_decls != NULL_TREE &&
1448 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1450 tree *ptr = &pending_local_decls;
1452 int end_pc = DECL_LOCAL_END_PC (decl);
1454 while (*ptr != NULL_TREE
1455 && DECL_LOCAL_START_PC (*ptr) <= pc
1456 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1457 ptr = &TREE_CHAIN (*ptr);
1458 pending_local_decls = *ptr;
1461 /* Force non-nested range to be nested in current range. */
1462 if (end_pc > current_binding_level->end_pc)
1463 end_pc = current_binding_level->end_pc;
1465 maybe_start_try (pc, end_pc);
1468 expand_start_bindings (0);
1470 current_binding_level->end_pc = end_pc;
1471 current_binding_level->start_pc = pc;
1472 current_binding_level->names = decl;
1473 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1475 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1479 maybe_start_try (pc, 0);
1483 maybe_poplevels (int pc)
1485 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1489 while (current_binding_level->end_pc <= pc)
1491 expand_end_bindings (getdecls (), 1, 0);
1492 maybe_end_try (current_binding_level->start_pc, pc);
1495 maybe_end_try (0, pc);
1498 /* Terminate any binding which began during the range beginning at
1499 start_pc. This tidies up improperly nested local variable ranges
1500 and exception handlers; a variable declared within an exception
1501 range is forcibly terminated when that exception ends. */
1504 force_poplevels (int start_pc)
1506 while (current_binding_level->start_pc > start_pc)
1508 if (pedantic && current_binding_level->start_pc > start_pc)
1509 warning_with_decl (current_function_decl,
1510 "In %s: overlapped variable and exception ranges at %d",
1511 current_binding_level->start_pc);
1512 expand_end_bindings (getdecls (), 1, 0);
1517 /* Insert BLOCK at the end of the list of subblocks of the
1518 current binding level. This is used when a BIND_EXPR is expanded,
1519 to handle the BLOCK node inside the BIND_EXPR. */
1522 insert_block (tree block)
1524 TREE_USED (block) = 1;
1525 current_binding_level->blocks
1526 = chainon (current_binding_level->blocks, block);
1529 /* Set the BLOCK node for the innermost scope
1530 (the one we are currently in). */
1533 set_block (tree block)
1535 current_binding_level->this_block = block;
1536 current_binding_level->names = chainon (current_binding_level->names,
1537 BLOCK_VARS (block));
1538 current_binding_level->blocks = chainon (current_binding_level->blocks,
1539 BLOCK_SUBBLOCKS (block));
1542 /* integrate_decl_tree calls this function. */
1545 java_dup_lang_specific_decl (tree node)
1548 struct lang_decl *x;
1550 if (!DECL_LANG_SPECIFIC (node))
1553 lang_decl_size = sizeof (struct lang_decl);
1554 x = ggc_alloc (lang_decl_size);
1555 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1556 DECL_LANG_SPECIFIC (node) = x;
1560 give_name_to_locals (JCF *jcf)
1562 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1563 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1565 pending_local_decls = NULL_TREE;
1569 n = JCF_readu2 (jcf);
1570 for (i = 0; i < n; i++)
1572 int start_pc = JCF_readu2 (jcf);
1573 int length = JCF_readu2 (jcf);
1574 int name_index = JCF_readu2 (jcf);
1575 int signature_index = JCF_readu2 (jcf);
1576 int slot = JCF_readu2 (jcf);
1577 tree name = get_name_constant (jcf, name_index);
1578 tree type = parse_signature (jcf, signature_index);
1579 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1581 && length == DECL_CODE_LENGTH (current_function_decl))
1583 tree decl = TREE_VEC_ELT (decl_map, slot);
1584 DECL_NAME (decl) = name;
1585 SET_DECL_ASSEMBLER_NAME (decl, name);
1586 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1587 warning ("bad type in parameter debug info");
1592 int end_pc = start_pc + length;
1593 tree decl = build_decl (VAR_DECL, name, type);
1594 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1596 warning_with_decl (decl,
1597 "bad PC range for debug info for local `%s'");
1598 end_pc = DECL_CODE_LENGTH (current_function_decl);
1601 /* Adjust start_pc if necessary so that the local's first
1602 store operation will use the relevant DECL as a
1603 destination. Fore more information, read the leading
1604 comments for expr.c:maybe_adjust_start_pc. */
1605 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1607 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1608 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1609 DECL_LOCAL_START_PC (decl) = start_pc;
1611 /* FIXME: The range used internally for exceptions and local
1612 variable ranges, is a half-open interval:
1613 start_pc <= pc < end_pc. However, the range used in the
1614 Java VM spec is inclusive at both ends:
1615 start_pc <= pc <= end_pc. */
1618 DECL_LOCAL_END_PC (decl) = end_pc;
1620 /* Now insert the new decl in the proper place in
1621 pending_local_decls. We are essentially doing an insertion sort,
1622 which works fine, since the list input will normally already
1624 ptr = &pending_local_decls;
1625 while (*ptr != NULL_TREE
1626 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1627 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1628 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1629 ptr = &TREE_CHAIN (*ptr);
1630 TREE_CHAIN (decl) = *ptr;
1635 pending_local_decls = nreverse (pending_local_decls);
1637 /* Fill in default names for the parameters. */
1638 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1639 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1641 if (DECL_NAME (parm) == NULL_TREE)
1643 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1645 DECL_NAME (parm) = get_identifier ("this");
1649 sprintf (buffer, "ARG_%d", arg_i);
1650 DECL_NAME (parm) = get_identifier (buffer);
1652 SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1658 build_result_decl (tree fndecl)
1660 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1661 tree result = DECL_RESULT (fndecl);
1664 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1665 if (INTEGRAL_TYPE_P (restype)
1666 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1667 restype = integer_type_node;
1668 result = build_decl (RESULT_DECL, NULL_TREE, restype);
1669 DECL_CONTEXT (result) = fndecl;
1670 DECL_RESULT (fndecl) = result;
1676 complete_start_java_method (tree fndecl)
1678 if (! flag_emit_class_files)
1680 /* Initialize the RTL code for the function. */
1681 init_function_start (fndecl, input_filename, lineno);
1683 /* Set up parameters and prepare for return, for the function. */
1684 expand_function_start (fndecl, 0);
1688 /* If this fcn was already referenced via a block-scope `extern' decl (or
1689 an implicit decl), propagate certain information about the usage. */
1690 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1691 TREE_ADDRESSABLE (current_function_decl) = 1;
1695 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1696 && ! flag_emit_class_files
1697 && ! DECL_CLINIT_P (fndecl)
1698 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1700 tree clas = DECL_CONTEXT (fndecl);
1701 tree init = build (CALL_EXPR, void_type_node,
1702 build_address_of (soft_initclass_node),
1703 build_tree_list (NULL_TREE, build_class_ref (clas)),
1705 TREE_SIDE_EFFECTS (init) = 1;
1706 expand_expr_stmt (init);
1709 /* Push local variables. Function compiled from source code are
1710 using a different local variables management, and for them,
1711 pushlevel shouldn't be called from here. */
1712 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1715 if (! flag_emit_class_files)
1716 expand_start_bindings (1);
1719 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1721 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1722 tree enter, exit, lock;
1723 if (METHOD_STATIC (fndecl))
1724 lock = build_class_ref (DECL_CONTEXT (fndecl));
1726 lock = DECL_ARGUMENTS (fndecl);
1727 BUILD_MONITOR_ENTER (enter, lock);
1728 BUILD_MONITOR_EXIT (exit, lock);
1729 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1731 expand_expr_stmt (enter);
1732 expand_decl_cleanup (NULL_TREE, exit);
1736 tree function_body = DECL_FUNCTION_BODY (fndecl);
1737 tree body = BLOCK_EXPR_BODY (function_body);
1738 lock = build (COMPOUND_EXPR, void_type_node,
1740 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
1741 TREE_SIDE_EFFECTS (lock) = 1;
1742 BLOCK_EXPR_BODY (function_body) = lock;
1748 start_java_method (tree fndecl)
1753 current_function_decl = fndecl;
1754 announce_function (fndecl);
1756 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1757 decl_map = make_tree_vec (i);
1758 type_map = xrealloc (type_map, i * sizeof (tree));
1760 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1761 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1763 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1764 pushlevel (1); /* Push parameters. */
1766 ptr = &DECL_ARGUMENTS (fndecl);
1767 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1768 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1770 tree parm_name = NULL_TREE, parm_decl;
1771 tree parm_type = TREE_VALUE (tem);
1772 if (i >= DECL_MAX_LOCALS (fndecl))
1775 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1776 DECL_CONTEXT (parm_decl) = fndecl;
1777 if (PROMOTE_PROTOTYPES
1778 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1779 && INTEGRAL_TYPE_P (parm_type))
1780 parm_type = integer_type_node;
1781 DECL_ARG_TYPE (parm_decl) = parm_type;
1784 ptr = &TREE_CHAIN (parm_decl);
1786 /* Add parm_decl to the decl_map. */
1787 push_jvm_slot (i, parm_decl);
1789 type_map[i] = TREE_TYPE (parm_decl);
1790 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1793 type_map[i] = void_type_node;
1797 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1799 while (i < DECL_MAX_LOCALS(fndecl))
1800 type_map[i++] = NULL_TREE;
1802 build_result_decl (fndecl);
1803 complete_start_java_method (fndecl);
1807 end_java_method (void)
1809 tree fndecl = current_function_decl;
1811 expand_end_bindings (getdecls (), 1, 0);
1812 /* pop out of function */
1815 /* pop out of its parameters */
1818 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1820 /* Generate rtl for function exit. */
1821 expand_function_end (input_filename, lineno, 0);
1823 /* Run the optimizers and output assembler code for this function. */
1824 rest_of_compilation (fndecl);
1826 current_function_decl = NULL_TREE;
1829 /* Dump FUNCTION_DECL FN as tree dump PHASE. */
1832 dump_function (enum tree_dump_index phase, tree fn)
1837 stream = dump_begin (phase, &flags);
1840 dump_node (fn, TDF_SLIM | flags, stream);
1841 dump_end (phase, stream);
1845 void java_optimize_inline (tree fndecl)
1847 if (flag_inline_trees)
1849 timevar_push (TV_INTEGRATION);
1850 optimize_inline_calls (fndecl);
1851 timevar_pop (TV_INTEGRATION);
1852 dump_function (TDI_inlined, fndecl);
1856 #include "gt-java-decl.h"