1 /* Process declarations and variables for the GNU compiler for the
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
4 Free Software Foundation, Inc.
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
23 Java and all Java-based marks are trademarks or registered trademarks
24 of Sun Microsystems, Inc. in the United States and other countries.
25 The Free Software Foundation is independent of Sun Microsystems, Inc. */
27 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
35 #include "java-tree.h"
41 #include "java-except.h"
44 #if defined (DEBUG_JAVA_BINDING_LEVELS)
45 extern void indent
PROTO((void));
48 static tree push_jvm_slot
PARAMS ((int, tree
));
49 static tree lookup_name_current_level
PARAMS ((tree
));
50 static tree push_promoted_type
PARAMS ((const char *, tree
));
51 static struct binding_level
*make_binding_level
PARAMS ((void));
52 static bool emit_init_test_initialization
PARAMS ((struct hash_entry
*,
54 static tree create_primitive_vtable
PARAMS ((const char *));
55 static tree check_local_named_variable
PARAMS ((tree
, tree
, int, int *));
56 static tree check_local_unnamed_variable
PARAMS ((tree
, tree
, tree
));
58 /* Set to non-zero value in order to emit class initilization code
59 before static field references. */
60 extern int always_initialize_class_p
;
62 /* The DECL_MAP is a mapping from (index, type) to a decl node.
63 If index < max_locals, it is the index of a local variable.
64 if index >= max_locals, then index-max_locals is a stack slot.
65 The DECL_MAP mapping is represented as a TREE_VEC whose elements
66 are a list of decls (VAR_DECL or PARM_DECL) chained by
67 DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
68 we search the chain for a decl with a matching TREE_TYPE. */
72 /* A list of local variables VAR_DECLs for this method that we have seen
73 debug information, but we have not reached their starting (byte) PC yet. */
75 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_IF_SET (tmp
);
116 tmp
= DECL_LOCAL_SLOT_CHAIN (tmp
);
119 SET_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 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
131 DECL_LOCAL_START_PC (decl
) = 0;
132 DECL_LOCAL_END_PC (decl
) = DECL_CODE_LENGTH (current_function_decl
);
133 DECL_LOCAL_SLOT_NUMBER (decl
) = index
;
135 DECL_LOCAL_SLOT_CHAIN (decl
) = TREE_VEC_ELT (decl_map
, index
);
136 TREE_VEC_ELT (decl_map
, index
) = decl
;
140 /* Find out if 'decl' passed in fits the defined PC location better than
141 'best'. Return decl if it does, return best if it doesn't. If decl
142 is returned, then updated is set to true. */
145 check_local_named_variable (best
, decl
, pc
, updated
)
151 if (pc
>= DECL_LOCAL_START_PC (decl
)
152 && pc
< DECL_LOCAL_END_PC (decl
))
154 if (best
== NULL_TREE
155 || (DECL_LOCAL_START_PC (decl
) > DECL_LOCAL_START_PC (best
)
156 && DECL_LOCAL_END_PC (decl
) < DECL_LOCAL_END_PC (best
)))
166 /* Find the best declaration based upon type. If 'decl' fits 'type' better
167 than 'best', return 'decl'. Otherwise return 'best'. */
170 check_local_unnamed_variable (best
, decl
, type
)
175 if (TREE_TYPE (decl
) == type
176 || (TREE_CODE (TREE_TYPE (decl
)) == TREE_CODE (type
)
177 && TYPE_PRECISION (TREE_TYPE (decl
)) <= 32
178 && TYPE_PRECISION (type
) <= 32
179 && TREE_CODE (type
) != POINTER_TYPE
)
180 || (TREE_CODE (TREE_TYPE (decl
)) == POINTER_TYPE
181 && type
== ptr_type_node
))
183 if (best
== NULL_TREE
184 || (TREE_TYPE (decl
) == type
&& TREE_TYPE (best
) != type
))
192 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
193 that is valid at PC (or -1 if any pc).
194 If there is no existing matching decl, allocate one. */
197 find_local_variable (index
, type
, pc
)
202 tree decl
= TREE_VEC_ELT (decl_map
, index
);
203 tree best
= NULL_TREE
;
204 int found_scoped_var
= 0;
206 /* Scan through every declaration that has been created in this slot. */
207 while (decl
!= NULL_TREE
)
209 /* Variables created in give_name_to_locals() have a name and have
210 a specified scope, so we can handle them specifically. We want
211 to use the specific decls created for those so they are assigned
212 the right variables in the debugging information. */
213 if (DECL_NAME (decl
) != NULL_TREE
)
215 /* This is a variable we have a name for, so it has a scope
216 supplied in the class file. But it only matters when we
217 actually have a PC to use. If pc<0, then we are asking
218 for a stack slot and this decl won't be one of those. */
220 best
= check_local_named_variable (best
, decl
, pc
,
223 /* We scan for type information unless we found a variable in the
224 proper scope already. */
225 else if (!found_scoped_var
)
227 /* If we don't have scoping information for a variable, we use
228 a different method to look it up. */
229 best
= check_local_unnamed_variable (best
, decl
, type
);
232 decl
= DECL_LOCAL_SLOT_CHAIN (decl
);
235 if (best
!= NULL_TREE
)
238 /* If we don't find a match, create one with the type passed in. */
239 return push_jvm_slot (index
, build_decl (VAR_DECL
, NULL_TREE
, type
));
243 /* Same as find_local_index, except that INDEX is a stack index. */
246 find_stack_slot (index
, type
)
250 return find_local_variable (index
+ DECL_MAX_LOCALS (current_function_decl
),
256 /* A chain of _DECL nodes for all variables, constants, functions,
257 * and typedef types. These are in the reverse of the order supplied.
261 /* For each level, a list of shadowed outer-level local definitions
262 to be restored when this level is popped.
263 Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
264 whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
267 /* For each level (except not the global one),
268 a chain of BLOCK nodes for all the levels
269 that were entered and exited one level down. */
272 /* The BLOCK node for this level, if one has been preallocated.
273 If 0, the BLOCK is allocated (if needed) when the level is popped. */
276 /* The binding level which this one is contained in (inherits from). */
277 struct binding_level
*level_chain
;
279 /* The bytecode PC that marks the end of this level. */
281 /* The bytecode PC that marks the start of this level. */
284 #if defined(DEBUG_JAVA_BINDING_LEVELS)
285 /* Binding depth at which this level began. */
286 unsigned binding_depth
;
287 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
290 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
292 /* The binding level currently in effect. */
294 static struct binding_level
*current_binding_level
;
296 /* A chain of binding_level structures awaiting reuse. */
298 static struct binding_level
*free_binding_level
;
300 /* The outermost binding level, for names of file scope.
301 This is created when the compiler is started and exists
302 through the entire run. */
304 static struct binding_level
*global_binding_level
;
306 /* A PC value bigger than any PC value we may ever may encounter. */
308 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
310 /* Binding level structures are initialized by copying this one. */
312 static struct binding_level clear_binding_level
313 = {NULL_TREE
, NULL_TREE
, NULL_TREE
, NULL_TREE
,
314 NULL_BINDING_LEVEL
, LARGEST_PC
, 0};
317 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
318 that have names. Here so we can clear out their names' definitions
319 at the end of the function. */
321 static tree named_labels
;
323 /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
325 static tree shadowed_labels
;
328 int flag_traditional
;
330 tree java_global_trees
[JTI_MAX
];
332 tree predef_filenames
[PREDEF_FILENAMES_SIZE
];
334 /* Build (and pushdecl) a "promoted type" for all standard
335 types shorter than int. */
338 push_promoted_type (name
, actual_type
)
342 tree type
= make_node (TREE_CODE (actual_type
));
344 tree in_min
= TYPE_MIN_VALUE (int_type_node
);
345 tree in_max
= TYPE_MAX_VALUE (int_type_node
);
347 tree in_min
= TYPE_MIN_VALUE (actual_type
);
348 tree in_max
= TYPE_MAX_VALUE (actual_type
);
350 TYPE_MIN_VALUE (type
) = copy_node (in_min
);
351 TREE_TYPE (TYPE_MIN_VALUE (type
)) = type
;
352 TYPE_MAX_VALUE (type
) = copy_node (in_max
);
353 TREE_TYPE (TYPE_MAX_VALUE (type
)) = type
;
354 TYPE_PRECISION (type
) = TYPE_PRECISION (int_type_node
);
356 pushdecl (build_decl (TYPE_DECL
, get_identifier (name
), type
));
360 /* Return a definition for a builtin function named NAME and whose data type
361 is TYPE. TYPE should be a function type with argument types.
362 FUNCTION_CODE tells later passes how to compile calls to this function.
363 See tree.h for its possible values.
365 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
366 the name to be called if we can't opencode the function. */
369 builtin_function (name
, type
, function_code
, class, library_name
)
373 enum built_in_class
class;
374 const char *library_name
;
376 tree decl
= build_decl (FUNCTION_DECL
, get_identifier (name
), type
);
377 DECL_EXTERNAL (decl
) = 1;
378 TREE_PUBLIC (decl
) = 1;
380 SET_DECL_ASSEMBLER_NAME (decl
, get_identifier (library_name
));
381 make_decl_rtl (decl
, NULL_PTR
);
383 DECL_BUILT_IN_CLASS (decl
) = class;
384 DECL_FUNCTION_CODE (decl
) = function_code
;
388 /* Return tree that represents a vtable for a primitive array. */
390 create_primitive_vtable (name
)
396 sprintf (buf
, "_Jv_%sVTable", name
);
397 r
= build_decl (VAR_DECL
, get_identifier (buf
), ptr_type_node
);
398 DECL_EXTERNAL (r
) = 1;
399 make_decl_rtl (r
, buf
);
404 init_decl_processing ()
406 register tree endlink
;
407 tree field
= NULL_TREE
;
410 init_class_processing ();
412 current_function_decl
= NULL
;
413 current_binding_level
= NULL_BINDING_LEVEL
;
414 free_binding_level
= NULL_BINDING_LEVEL
;
415 pushlevel (0); /* make the binding_level structure for global names */
416 global_binding_level
= current_binding_level
;
418 /* The code here must be similar to build_common_tree_nodes{,_2} in
419 tree.c, especially as to the order of initializing common nodes. */
420 error_mark_node
= make_node (ERROR_MARK
);
421 TREE_TYPE (error_mark_node
) = error_mark_node
;
423 /* Create sizetype first - needed for other types. */
424 initialize_sizetypes ();
426 byte_type_node
= make_signed_type (8);
427 pushdecl (build_decl (TYPE_DECL
, get_identifier ("byte"), byte_type_node
));
428 short_type_node
= make_signed_type (16);
429 pushdecl (build_decl (TYPE_DECL
, get_identifier ("short"), short_type_node
));
430 int_type_node
= make_signed_type (32);
431 pushdecl (build_decl (TYPE_DECL
, get_identifier ("int"), int_type_node
));
432 long_type_node
= make_signed_type (64);
433 pushdecl (build_decl (TYPE_DECL
, get_identifier ("long"), long_type_node
));
435 unsigned_byte_type_node
= make_unsigned_type (8);
436 pushdecl (build_decl (TYPE_DECL
, get_identifier ("unsigned byte"),
437 unsigned_byte_type_node
));
438 unsigned_short_type_node
= make_unsigned_type (16);
439 pushdecl (build_decl (TYPE_DECL
, get_identifier ("unsigned short"),
440 unsigned_short_type_node
));
441 unsigned_int_type_node
= make_unsigned_type (32);
442 pushdecl (build_decl (TYPE_DECL
, get_identifier ("unsigned int"),
443 unsigned_int_type_node
));
444 unsigned_long_type_node
= make_unsigned_type (64);
445 pushdecl (build_decl (TYPE_DECL
, get_identifier ("unsigned long"),
446 unsigned_long_type_node
));
448 set_sizetype (make_unsigned_type (POINTER_SIZE
));
450 /* Define these next since types below may used them. */
451 integer_type_node
= type_for_size (INT_TYPE_SIZE
, 0);
452 integer_zero_node
= build_int_2 (0, 0);
453 integer_one_node
= build_int_2 (1, 0);
454 integer_two_node
= build_int_2 (2, 0);
455 integer_four_node
= build_int_2 (4, 0);
456 integer_minus_one_node
= build_int_2 (-1, -1);
458 size_zero_node
= size_int (0);
459 size_one_node
= size_int (1);
460 bitsize_zero_node
= bitsize_int (0);
461 bitsize_one_node
= bitsize_int (1);
462 bitsize_unit_node
= bitsize_int (BITS_PER_UNIT
);
464 long_zero_node
= build_int_2 (0, 0);
465 TREE_TYPE (long_zero_node
) = long_type_node
;
467 void_type_node
= make_node (VOID_TYPE
);
468 pushdecl (build_decl (TYPE_DECL
, get_identifier ("void"), void_type_node
));
469 layout_type (void_type_node
); /* Uses size_zero_node */
470 ptr_type_node
= build_pointer_type (void_type_node
);
471 t
= make_node (VOID_TYPE
);
472 layout_type (t
); /* Uses size_zero_node */
473 return_address_type_node
= build_pointer_type (t
);
475 null_pointer_node
= build_int_2 (0, 0);
476 TREE_TYPE (null_pointer_node
) = ptr_type_node
;
478 /* Used by the parser to represent empty statements and blocks. */
479 empty_stmt_node
= build1 (NOP_EXPR
, void_type_node
, size_zero_node
);
480 CAN_COMPLETE_NORMALLY (empty_stmt_node
) = 1;
483 /* Make a type to be the domain of a few array types
484 whose domains don't really matter.
485 200 is small enough that it always fits in size_t
486 and large enough that it can hold most function names for the
487 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
488 short_array_type_node
= build_prim_array_type (short_type_node
, 200);
490 char_type_node
= make_node (CHAR_TYPE
);
491 TYPE_PRECISION (char_type_node
) = 16;
492 fixup_unsigned_type (char_type_node
);
493 pushdecl (build_decl (TYPE_DECL
, get_identifier ("char"), char_type_node
));
495 boolean_type_node
= make_node (BOOLEAN_TYPE
);
496 TYPE_PRECISION (boolean_type_node
) = 1;
497 fixup_unsigned_type (boolean_type_node
);
498 pushdecl (build_decl (TYPE_DECL
, get_identifier ("boolean"),
500 boolean_false_node
= TYPE_MIN_VALUE (boolean_type_node
);
501 boolean_true_node
= TYPE_MAX_VALUE (boolean_type_node
);
503 promoted_byte_type_node
504 = push_promoted_type ("promoted_byte", byte_type_node
);
505 promoted_short_type_node
506 = push_promoted_type ("promoted_short", short_type_node
);
507 promoted_char_type_node
508 = push_promoted_type ("promoted_char", char_type_node
);
509 promoted_boolean_type_node
510 = push_promoted_type ("promoted_boolean", boolean_type_node
);
512 float_type_node
= make_node (REAL_TYPE
);
513 TYPE_PRECISION (float_type_node
) = 32;
514 pushdecl (build_decl (TYPE_DECL
, get_identifier ("float"),
516 layout_type (float_type_node
);
518 double_type_node
= make_node (REAL_TYPE
);
519 TYPE_PRECISION (double_type_node
) = 64;
520 pushdecl (build_decl (TYPE_DECL
, get_identifier ("double"),
522 layout_type (double_type_node
);
524 float_zero_node
= build_real (float_type_node
, dconst0
);
525 double_zero_node
= build_real (double_type_node
, dconst0
);
527 /* These are the vtables for arrays of primitives. */
528 boolean_array_vtable
= create_primitive_vtable ("boolean");
529 byte_array_vtable
= create_primitive_vtable ("byte");
530 char_array_vtable
= create_primitive_vtable ("char");
531 short_array_vtable
= create_primitive_vtable ("short");
532 int_array_vtable
= create_primitive_vtable ("int");
533 long_array_vtable
= create_primitive_vtable ("long");
534 float_array_vtable
= create_primitive_vtable ("float");
535 double_array_vtable
= create_primitive_vtable ("double");
537 /* As you're adding items here, please update the code right after
538 this section, so that the filename containing the source code of
539 the pre-defined class gets registered correctly. */
540 unqualified_object_id_node
= get_identifier ("Object");
541 object_type_node
= lookup_class (get_identifier ("java.lang.Object"));
542 object_ptr_type_node
= promote_type (object_type_node
);
543 string_type_node
= lookup_class (get_identifier ("java.lang.String"));
544 string_ptr_type_node
= promote_type (string_type_node
);
545 class_type_node
= lookup_class (get_identifier ("java.lang.Class"));
546 throwable_type_node
= lookup_class (get_identifier ("java.lang.Throwable"));
547 runtime_exception_type_node
=
548 lookup_class (get_identifier ("java.lang.RuntimeException"));
549 error_exception_type_node
=
550 lookup_class (get_identifier ("java.lang.Error"));
551 rawdata_ptr_type_node
552 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
554 /* If you add to this section, don't forget to increase
555 PREDEF_FILENAMES_SIZE. */
556 predef_filenames
[0] = get_identifier ("java/lang/Class.java");
557 predef_filenames
[1] = get_identifier ("java/lang/Error.java");
558 predef_filenames
[2] = get_identifier ("java/lang/Object.java");
559 predef_filenames
[3] = get_identifier ("java/lang/RuntimeException.java");
560 predef_filenames
[4] = get_identifier ("java/lang/String.java");
561 predef_filenames
[5] = get_identifier ("java/lang/Throwable.java");
562 predef_filenames
[6] = get_identifier ("gnu/gcj/RawData.java");
564 methodtable_type
= make_node (RECORD_TYPE
);
565 layout_type (methodtable_type
);
566 build_decl (TYPE_DECL
, get_identifier ("methodtable"), methodtable_type
);
567 methodtable_ptr_type
= build_pointer_type (methodtable_type
);
569 TYPE_identifier_node
= get_identifier ("TYPE");
570 init_identifier_node
= get_identifier ("<init>");
571 clinit_identifier_node
= get_identifier ("<clinit>");
572 /* Legacy `$finit$' special method identifier. This needs to be
573 recognized as equivalent to `finit$' but isn't generated anymore. */
574 finit_leg_identifier_node
= get_identifier ("$finit$");
575 /* The new `finit$' special method identifier. This one is now
576 generated in place of `$finit$'. */
577 finit_identifier_node
= get_identifier ("finit$");
578 void_signature_node
= get_identifier ("()V");
579 length_identifier_node
= get_identifier ("length");
580 this_identifier_node
= get_identifier ("this");
581 super_identifier_node
= get_identifier ("super");
582 continue_identifier_node
= get_identifier ("continue");
583 access0_identifier_node
= get_identifier ("access$0");
584 classdollar_identifier_node
= get_identifier ("class$");
586 /* for lack of a better place to put this stub call */
587 init_expr_processing();
589 utf8const_type
= make_node (RECORD_TYPE
);
590 PUSH_FIELD (utf8const_type
, field
, "hash", unsigned_short_type_node
);
591 PUSH_FIELD (utf8const_type
, field
, "length", unsigned_short_type_node
);
592 FINISH_RECORD (utf8const_type
);
593 utf8const_ptr_type
= build_pointer_type (utf8const_type
);
595 constants_type_node
= make_node (RECORD_TYPE
);
596 PUSH_FIELD (constants_type_node
, field
, "size", unsigned_int_type_node
);
597 PUSH_FIELD (constants_type_node
, field
, "tags", ptr_type_node
);
598 PUSH_FIELD (constants_type_node
, field
, "data", ptr_type_node
);
599 FINISH_RECORD (constants_type_node
);
600 build_decl (TYPE_DECL
, get_identifier ("constants"), constants_type_node
);
602 access_flags_type_node
= unsigned_short_type_node
;
604 dtable_type
= make_node (RECORD_TYPE
);
605 dtable_ptr_type
= build_pointer_type (dtable_type
);
607 PUSH_FIELD (object_type_node
, field
, "vtable", dtable_ptr_type
);
608 /* This isn't exactly true, but it is what we have in the source.
609 There is an unresolved issue here, which is whether the vtable
610 should be marked by the GC. */
611 if (! flag_hash_synchronization
)
612 PUSH_FIELD (object_type_node
, field
, "sync_info",
613 build_pointer_type (object_type_node
));
614 for (t
= TYPE_FIELDS (object_type_node
); t
!= NULL_TREE
; t
= TREE_CHAIN (t
))
615 FIELD_PRIVATE (t
) = 1;
616 FINISH_RECORD (object_type_node
);
618 field_type_node
= make_node (RECORD_TYPE
);
619 field_ptr_type_node
= build_pointer_type (field_type_node
);
620 method_type_node
= make_node (RECORD_TYPE
);
621 method_ptr_type_node
= build_pointer_type (method_type_node
);
623 set_super_info (0, class_type_node
, object_type_node
, 0);
624 set_super_info (0, string_type_node
, object_type_node
, 0);
625 class_ptr_type
= build_pointer_type (class_type_node
);
627 PUSH_FIELD (class_type_node
, field
, "next", class_ptr_type
);
628 PUSH_FIELD (class_type_node
, field
, "name", utf8const_ptr_type
);
629 PUSH_FIELD (class_type_node
, field
, "accflags", access_flags_type_node
);
630 PUSH_FIELD (class_type_node
, field
, "superclass", class_ptr_type
);
631 PUSH_FIELD (class_type_node
, field
, "constants", constants_type_node
);
632 PUSH_FIELD (class_type_node
, field
, "methods", method_ptr_type_node
);
633 PUSH_FIELD (class_type_node
, field
, "method_count", short_type_node
);
634 PUSH_FIELD (class_type_node
, field
, "vtable_method_count", short_type_node
);
635 PUSH_FIELD (class_type_node
, field
, "fields", field_ptr_type_node
);
636 PUSH_FIELD (class_type_node
, field
, "size_in_bytes", int_type_node
);
637 PUSH_FIELD (class_type_node
, field
, "field_count", short_type_node
);
638 PUSH_FIELD (class_type_node
, field
, "static_field_count", short_type_node
);
639 PUSH_FIELD (class_type_node
, field
, "vtable", dtable_ptr_type
);
640 PUSH_FIELD (class_type_node
, field
, "interfaces",
641 build_pointer_type (class_ptr_type
));
642 PUSH_FIELD (class_type_node
, field
, "loader", ptr_type_node
);
643 PUSH_FIELD (class_type_node
, field
, "interface_count", short_type_node
);
644 PUSH_FIELD (class_type_node
, field
, "state", byte_type_node
);
645 PUSH_FIELD (class_type_node
, field
, "thread", ptr_type_node
);
646 PUSH_FIELD (class_type_node
, field
, "depth", short_type_node
);
647 PUSH_FIELD (class_type_node
, field
, "ancestors", ptr_type_node
);
648 PUSH_FIELD (class_type_node
, field
, "idt", ptr_type_node
);
649 PUSH_FIELD (class_type_node
, field
, "arrayclass", ptr_type_node
);
650 for (t
= TYPE_FIELDS (class_type_node
); t
!= NULL_TREE
; t
= TREE_CHAIN (t
))
651 FIELD_PRIVATE (t
) = 1;
652 push_super_field (class_type_node
, object_type_node
);
653 FINISH_RECORD (class_type_node
);
654 build_decl (TYPE_DECL
, get_identifier ("Class"), class_type_node
);
656 field_info_union_node
= make_node (UNION_TYPE
);
657 PUSH_FIELD (field_info_union_node
, field
, "boffset", int_type_node
);
658 PUSH_FIELD (field_info_union_node
, field
, "addr", ptr_type_node
);
660 PUSH_FIELD (field_info_union_node
, field
, "idx", unsigned_short_type_node
);
662 layout_type (field_info_union_node
);
664 PUSH_FIELD (field_type_node
, field
, "name", utf8const_ptr_type
);
665 PUSH_FIELD (field_type_node
, field
, "type", class_ptr_type
);
666 PUSH_FIELD (field_type_node
, field
, "accflags", access_flags_type_node
);
667 PUSH_FIELD (field_type_node
, field
, "bsize", unsigned_short_type_node
);
668 PUSH_FIELD (field_type_node
, field
, "info", field_info_union_node
);
669 FINISH_RECORD (field_type_node
);
670 CLASS_LOADED_P (field_type_node
) = 1;
671 build_decl (TYPE_DECL
, get_identifier ("Field"), field_type_node
);
673 one_elt_array_domain_type
= build_index_type (integer_one_node
);
674 nativecode_ptr_array_type_node
675 = build_array_type (nativecode_ptr_type_node
, one_elt_array_domain_type
);
677 PUSH_FIELD (dtable_type
, field
, "class", class_ptr_type
);
678 PUSH_FIELD (dtable_type
, field
, "methods", nativecode_ptr_array_type_node
);
679 FINISH_RECORD (dtable_type
);
680 build_decl (TYPE_DECL
, get_identifier ("dispatchTable"), dtable_type
);
682 #define jint_type int_type_node
683 #define jint_ptr_type ptr_type_node
685 jexception_type
= make_node (RECORD_TYPE
);
686 PUSH_FIELD (jexception_type
, field
, "start_pc", ptr_type_node
);
687 PUSH_FIELD (jexception_type
, field
, "end_pc", ptr_type_node
);
688 PUSH_FIELD (jexception_type
, field
, "handler_pc", ptr_type_node
);
689 PUSH_FIELD (jexception_type
, field
, "catch_type", class_ptr_type
);
690 FINISH_RECORD (jexception_type
);
691 build_decl (TYPE_DECL
, get_identifier ("jexception"), field_type_node
);
692 jexception_ptr_type
= build_pointer_type (jexception_type
);
694 lineNumberEntry_type
= make_node (RECORD_TYPE
);
695 PUSH_FIELD (lineNumberEntry_type
, field
, "line_nr", unsigned_short_type_node
);
696 PUSH_FIELD (lineNumberEntry_type
, field
, "start_pc", ptr_type_node
);
697 FINISH_RECORD (lineNumberEntry_type
);
699 lineNumbers_type
= make_node (RECORD_TYPE
);
700 PUSH_FIELD (lineNumbers_type
, field
, "length", unsigned_int_type_node
);
701 FINISH_RECORD (lineNumbers_type
);
703 #define instn_ptr_type_node ptr_type_node /* XXX JH */
705 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
707 PUSH_FIELD (method_type_node
, field
, "name", utf8const_ptr_type
);
708 PUSH_FIELD (method_type_node
, field
, "signature", utf8const_ptr_type
);
709 PUSH_FIELD (method_type_node
, field
, "accflags", access_flags_type_node
);
710 PUSH_FIELD (method_type_node
, field
, "ncode", nativecode_ptr_type_node
);
711 FINISH_RECORD (method_type_node
);
712 CLASS_LOADED_P (method_type_node
) = 1;
713 build_decl (TYPE_DECL
, get_identifier ("Method"), method_type_node
);
715 endlink
= end_params_node
= tree_cons (NULL_TREE
, void_type_node
, NULL_TREE
);
717 t
= tree_cons (NULL_TREE
, class_ptr_type
,
718 tree_cons (NULL_TREE
, int_type_node
, endlink
));
719 alloc_object_node
= builtin_function ("_Jv_AllocObject",
720 build_function_type (ptr_type_node
, t
),
721 0, NOT_BUILT_IN
, NULL_PTR
);
722 DECL_IS_MALLOC (alloc_object_node
) = 1;
724 t
= tree_cons (NULL_TREE
, ptr_type_node
, endlink
);
725 soft_initclass_node
= builtin_function ("_Jv_InitClass",
726 build_function_type (void_type_node
,
731 throw_node
= builtin_function ("_Jv_Throw",
732 build_function_type (ptr_type_node
, t
),
733 0, NOT_BUILT_IN
, NULL_PTR
);
734 /* Mark throw_nodes as `noreturn' functions with side effects. */
735 TREE_THIS_VOLATILE (throw_node
) = 1;
736 TREE_SIDE_EFFECTS (throw_node
) = 1;
738 t
= build_function_type (int_type_node
, endlink
);
739 soft_monitorenter_node
740 = builtin_function ("_Jv_MonitorEnter", t
, 0, NOT_BUILT_IN
,
742 soft_monitorexit_node
743 = builtin_function ("_Jv_MonitorExit", t
, 0, NOT_BUILT_IN
,
746 t
= tree_cons (NULL_TREE
, int_type_node
,
747 tree_cons (NULL_TREE
, int_type_node
, endlink
));
749 = builtin_function ("_Jv_NewPrimArray",
750 build_function_type(ptr_type_node
, t
),
751 0, NOT_BUILT_IN
, NULL_PTR
);
752 DECL_IS_MALLOC (soft_newarray_node
) = 1;
754 t
= tree_cons (NULL_TREE
, int_type_node
,
755 tree_cons (NULL_TREE
, class_ptr_type
,
756 tree_cons (NULL_TREE
, object_ptr_type_node
, endlink
)));
758 = builtin_function ("_Jv_NewObjectArray",
759 build_function_type (ptr_type_node
, t
),
760 0, NOT_BUILT_IN
, NULL_PTR
);
761 DECL_IS_MALLOC (soft_anewarray_node
) = 1;
763 t
= tree_cons (NULL_TREE
, ptr_type_node
,
764 tree_cons (NULL_TREE
, int_type_node
, endlink
));
765 soft_multianewarray_node
766 = builtin_function ("_Jv_NewMultiArray",
767 build_function_type (ptr_type_node
, t
),
768 0, NOT_BUILT_IN
, NULL_PTR
);
769 DECL_IS_MALLOC (soft_multianewarray_node
) = 1;
771 t
= build_function_type (void_type_node
,
772 tree_cons (NULL_TREE
, int_type_node
, endlink
));
773 soft_badarrayindex_node
774 = builtin_function ("_Jv_ThrowBadArrayIndex", t
,
775 0, NOT_BUILT_IN
, NULL_PTR
);
776 /* Mark soft_badarrayindex_node as a `noreturn' function with side
778 TREE_THIS_VOLATILE (soft_badarrayindex_node
) = 1;
779 TREE_SIDE_EFFECTS (soft_badarrayindex_node
) = 1;
781 soft_nullpointer_node
782 = builtin_function ("_Jv_ThrowNullPointerException",
783 build_function_type (void_type_node
, endlink
),
784 0, NOT_BUILT_IN
, NULL_PTR
);
785 /* Mark soft_nullpointer_node as a `noreturn' function with side
787 TREE_THIS_VOLATILE (soft_nullpointer_node
) = 1;
788 TREE_SIDE_EFFECTS (soft_nullpointer_node
) = 1;
790 t
= tree_cons (NULL_TREE
, class_ptr_type
,
791 tree_cons (NULL_TREE
, object_ptr_type_node
, endlink
));
793 = builtin_function ("_Jv_CheckCast",
794 build_function_type (ptr_type_node
, t
),
795 0, NOT_BUILT_IN
, NULL_PTR
);
796 t
= tree_cons (NULL_TREE
, object_ptr_type_node
,
797 tree_cons (NULL_TREE
, class_ptr_type
, endlink
));
799 = builtin_function ("_Jv_IsInstanceOf",
800 build_function_type (boolean_type_node
, t
),
801 0, NOT_BUILT_IN
, NULL_PTR
);
802 t
= tree_cons (NULL_TREE
, object_ptr_type_node
,
803 tree_cons (NULL_TREE
, object_ptr_type_node
, endlink
));
804 soft_checkarraystore_node
805 = builtin_function ("_Jv_CheckArrayStore",
806 build_function_type (void_type_node
, t
),
807 0, NOT_BUILT_IN
, NULL_PTR
);
808 t
= tree_cons (NULL_TREE
, ptr_type_node
,
809 tree_cons (NULL_TREE
, ptr_type_node
,
810 tree_cons (NULL_TREE
, int_type_node
, endlink
)));
811 soft_lookupinterfacemethod_node
812 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
813 build_function_type (ptr_type_node
, t
),
814 0, NOT_BUILT_IN
, NULL_PTR
);
816 t
= tree_cons (NULL_TREE
, object_ptr_type_node
,
817 tree_cons (NULL_TREE
, ptr_type_node
,
818 tree_cons (NULL_TREE
, ptr_type_node
, endlink
)));
819 soft_lookupjnimethod_node
820 = builtin_function ("_Jv_LookupJNIMethod",
821 build_function_type (ptr_type_node
, t
),
822 0, NOT_BUILT_IN
, NULL_PTR
);
823 t
= tree_cons (NULL_TREE
, ptr_type_node
, endlink
);
824 soft_getjnienvnewframe_node
825 = builtin_function ("_Jv_GetJNIEnvNewFrame",
826 build_function_type (ptr_type_node
, t
),
827 0, NOT_BUILT_IN
, NULL_PTR
);
828 soft_jnipopsystemframe_node
829 = builtin_function ("_Jv_JNI_PopSystemFrame",
830 build_function_type (ptr_type_node
, t
),
831 0, NOT_BUILT_IN
, NULL_PTR
);
833 t
= tree_cons (NULL_TREE
, double_type_node
,
834 tree_cons (NULL_TREE
, double_type_node
, endlink
));
836 = builtin_function ("__builtin_fmod",
837 build_function_type (double_type_node
, t
),
838 BUILT_IN_FMOD
, BUILT_IN_NORMAL
, "fmod");
841 t
= tree_cons (NULL_TREE
, float_type_node
,
842 tree_cons (NULL_TREE
, float_type_node
, endlink
));
844 = builtin_function ("__builtin_fmodf",
845 build_function_type (float_type_node
, t
),
846 BUILT_IN_FMOD
, BUILT_IN_NORMAL
, "fmodf");
850 = builtin_function ("_Jv_divI",
851 build_function_type (int_type_node
, t
),
852 0, NOT_BUILT_IN
, NULL_PTR
);
855 = builtin_function ("_Jv_remI",
856 build_function_type (int_type_node
, t
),
857 0, NOT_BUILT_IN
, NULL_PTR
);
860 = builtin_function ("_Jv_divJ",
861 build_function_type (long_type_node
, t
),
862 0, NOT_BUILT_IN
, NULL_PTR
);
865 = builtin_function ("_Jv_remJ",
866 build_function_type (long_type_node
, t
),
867 0, NOT_BUILT_IN
, NULL_PTR
);
869 /* Initialize variables for except.c. */
870 eh_personality_libfunc
= init_one_libfunc (USING_SJLJ_EXCEPTIONS
871 ? "__gcj_personality_sj0"
872 : "__gcj_personality_v0");
873 lang_eh_runtime_type
= prepare_eh_table_type
;
877 /* Register nodes with the garbage collector. */
878 ggc_add_tree_root (java_global_trees
,
879 sizeof (java_global_trees
) / sizeof (tree
));
880 ggc_add_tree_root (predef_filenames
,
881 sizeof (predef_filenames
) / sizeof (tree
));
882 ggc_add_tree_root (&decl_map
, 1);
883 ggc_add_tree_root (&pending_local_decls
, 1);
887 /* Look up NAME in the current binding level and its superiors
888 in the namespace of variables, functions and typedefs.
889 Return a ..._DECL node of some kind representing its definition,
890 or return 0 if it is undefined. */
897 if (current_binding_level
!= global_binding_level
898 && IDENTIFIER_LOCAL_VALUE (name
))
899 val
= IDENTIFIER_LOCAL_VALUE (name
);
901 val
= IDENTIFIER_GLOBAL_VALUE (name
);
905 /* Similar to `lookup_name' but look only at current binding level and
906 the previous one if its the parameter level. */
909 lookup_name_current_level (name
)
914 if (current_binding_level
== global_binding_level
)
915 return IDENTIFIER_GLOBAL_VALUE (name
);
917 if (IDENTIFIER_LOCAL_VALUE (name
) == 0)
920 for (t
= current_binding_level
->names
; t
; t
= TREE_CHAIN (t
))
921 if (DECL_NAME (t
) == name
)
927 /* Use a binding level to record a labeled block declaration */
930 push_labeled_block (lb
)
933 register tree name
= DECL_NAME (LABELED_BLOCK_LABEL (lb
));
934 register struct binding_level
*b
= current_binding_level
;
935 tree oldlocal
= IDENTIFIER_LOCAL_VALUE (name
);
937 b
->shadowed
= tree_cons (name
, oldlocal
, b
->shadowed
);
938 TREE_CHAIN (lb
) = b
->names
;
940 IDENTIFIER_LOCAL_VALUE (name
) = lb
;
943 /* Pop the current binding level, reinstalling values for the previous
949 struct binding_level
*b
= current_binding_level
;
950 tree label
= b
->names
;
951 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label
))) =
954 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b
->shadowed
)) =
955 TREE_VALUE (b
->shadowed
);
957 /* Pop the current level, and free the structure for reuse. */
958 current_binding_level
= current_binding_level
->level_chain
;
959 b
->level_chain
= free_binding_level
;
960 free_binding_level
= b
;
963 /* Record a decl-node X as belonging to the current lexical scope.
964 Check for errors (such as an incompatible declaration for the same
965 name already seen in the same scope).
967 Returns either X or an old decl for the same name.
968 If an old decl is returned, it may have been smashed
969 to agree with what X says. */
976 register tree name
= DECL_NAME (x
);
977 register struct binding_level
*b
= current_binding_level
;
979 if (TREE_CODE (x
) != TYPE_DECL
)
980 DECL_CONTEXT (x
) = current_function_decl
;
986 t
= lookup_name_current_level (name
);
987 if (t
!= 0 && t
== error_mark_node
)
988 /* error_mark_node is 0 for a while during initialization! */
991 error_with_decl (x
, "`%s' used prior to declaration");
996 file
= DECL_SOURCE_FILE (t
);
997 line
= DECL_SOURCE_LINE (t
);
1000 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1001 to point to the TYPE_DECL.
1002 Since Java does not have typedefs, a type can only have
1003 one (true) name, given by a class, interface, or builtin. */
1004 if (TREE_CODE (x
) == TYPE_DECL
1005 && TYPE_NAME (TREE_TYPE (x
)) == 0
1006 && TREE_TYPE (x
) != error_mark_node
)
1008 TYPE_NAME (TREE_TYPE (x
)) = x
;
1009 TYPE_STUB_DECL (TREE_TYPE (x
)) = x
;
1012 /* This name is new in its binding level.
1013 Install the new declaration and return it. */
1014 if (b
== global_binding_level
)
1016 /* Install a global value. */
1018 IDENTIFIER_GLOBAL_VALUE (name
) = x
;
1022 /* Here to install a non-global value. */
1023 tree oldlocal
= IDENTIFIER_LOCAL_VALUE (name
);
1024 IDENTIFIER_LOCAL_VALUE (name
) = x
;
1027 /* Warn if shadowing an argument at the top level of the body. */
1028 if (oldlocal
!= 0 && !DECL_EXTERNAL (x
)
1029 /* This warning doesn't apply to the parms of a nested fcn. */
1030 && ! current_binding_level
->parm_flag
1031 /* Check that this is one level down from the parms. */
1032 && current_binding_level
->level_chain
->parm_flag
1033 /* Check that the decl being shadowed
1034 comes from the parm level, one level up. */
1035 && chain_member (oldlocal
, current_binding_level
->level_chain
->names
))
1037 if (TREE_CODE (oldlocal
) == PARM_DECL
)
1038 pedwarn ("declaration of `%s' shadows a parameter",
1039 IDENTIFIER_POINTER (name
));
1041 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1042 IDENTIFIER_POINTER (name
));
1045 /* Maybe warn if shadowing something else. */
1046 else if (warn_shadow
&& !DECL_EXTERNAL (x
)
1047 /* No shadow warnings for internally generated vars. */
1048 && DECL_SOURCE_LINE (x
) != 0
1049 /* No shadow warnings for vars made for inlining. */
1050 && ! DECL_FROM_INLINE (x
))
1052 const char *warnstring
= 0;
1054 if (TREE_CODE (x
) == PARM_DECL
1055 && current_binding_level
->level_chain
->parm_flag
)
1056 /* Don't warn about the parm names in function declarator
1057 within a function declarator.
1058 It would be nice to avoid warning in any function
1059 declarator in a declaration, as opposed to a definition,
1060 but there is no way to tell it's not a definition. */
1062 else if (oldlocal
!= 0 && TREE_CODE (oldlocal
) == PARM_DECL
)
1063 warnstring
= "declaration of `%s' shadows a parameter";
1064 else if (oldlocal
!= 0)
1065 warnstring
= "declaration of `%s' shadows previous local";
1066 else if (IDENTIFIER_GLOBAL_VALUE (name
) != 0
1067 && IDENTIFIER_GLOBAL_VALUE (name
) != error_mark_node
)
1068 warnstring
= "declaration of `%s' shadows global declaration";
1071 warning (warnstring
, IDENTIFIER_POINTER (name
));
1075 /* If storing a local value, there may already be one (inherited).
1076 If so, record it for restoration when this binding level ends. */
1078 b
->shadowed
= tree_cons (name
, oldlocal
, b
->shadowed
);
1082 /* Put decls on list in reverse order.
1083 We will reverse them later if necessary. */
1084 TREE_CHAIN (x
) = b
->names
;
1091 pushdecl_force_head (x
)
1094 current_binding_level
->names
= x
;
1097 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1100 pushdecl_top_level (x
)
1104 register struct binding_level
*b
= current_binding_level
;
1106 current_binding_level
= global_binding_level
;
1108 current_binding_level
= b
;
1112 /* Nonzero if we are currently in the global binding level. */
1115 global_bindings_p ()
1117 return current_binding_level
== global_binding_level
;
1120 /* Return the list of declarations of the current level.
1121 Note that this list is in reverse order unless/until
1122 you nreverse it; and when you do nreverse it, you must
1123 store the result back using `storedecls' or you will lose. */
1128 return current_binding_level
->names
;
1131 /* Create a new `struct binding_level'. */
1133 static struct binding_level
*
1134 make_binding_level ()
1137 return (struct binding_level
*) xmalloc (sizeof (struct binding_level
));
1142 int unused ATTRIBUTE_UNUSED
;
1144 register struct binding_level
*newlevel
= NULL_BINDING_LEVEL
;
1147 /* If this is the top level of a function,
1148 just make sure that NAMED_LABELS is 0. */
1150 if (current_binding_level
== global_binding_level
)
1154 /* Reuse or create a struct for this binding level. */
1156 if (free_binding_level
)
1158 newlevel
= free_binding_level
;
1159 free_binding_level
= free_binding_level
->level_chain
;
1163 newlevel
= make_binding_level ();
1166 /* Add this level to the front of the chain (stack) of levels that
1169 *newlevel
= clear_binding_level
;
1170 newlevel
->level_chain
= current_binding_level
;
1171 current_binding_level
= newlevel
;
1172 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1173 newlevel
->binding_depth
= binding_depth
;
1175 fprintf (stderr
, "push %s level 0x%08x pc %d\n",
1176 (is_class_level
) ? "class" : "block", newlevel
, current_pc
);
1179 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1182 /* Exit a binding level.
1183 Pop the level off, and restore the state of the identifier-decl mappings
1184 that were in effect when this level was entered.
1186 If KEEP is nonzero, this level had explicit declarations, so
1187 and create a "block" (a BLOCK node) for the level
1188 to record its declarations and subblocks for symbol table output.
1190 If FUNCTIONBODY is nonzero, this level is the body of a function,
1191 so create a block as if KEEP were set and also clear out all
1194 If REVERSE is nonzero, reverse the order of decls before putting
1195 them into the BLOCK. */
1198 poplevel (keep
, reverse
, functionbody
)
1204 /* The chain of decls was accumulated in reverse order.
1205 Put it into forward order, just for cleanliness. */
1207 tree subblocks
= current_binding_level
->blocks
;
1210 int block_previously_created
;
1212 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1215 if (current_binding_level
->end_pc
!= LARGEST_PC
)
1216 fprintf (stderr
, "pop %s level 0x%08x pc %d (end pc %d)\n",
1217 (is_class_level
) ? "class" : "block", current_binding_level
, current_pc
,
1218 current_binding_level
->end_pc
);
1220 fprintf (stderr
, "pop %s level 0x%08x pc %d\n",
1221 (is_class_level
) ? "class" : "block", current_binding_level
, current_pc
);
1223 if (is_class_level
!= (current_binding_level
== class_binding_level
))
1226 fprintf (stderr
, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1230 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1232 /* Get the decls in the order they were written.
1233 Usually current_binding_level->names is in reverse order.
1234 But parameter decls were previously put in forward order. */
1237 current_binding_level
->names
1238 = decls
= nreverse (current_binding_level
->names
);
1240 decls
= current_binding_level
->names
;
1242 /* Output any nested inline functions within this block
1243 if they weren't already output. */
1245 for (decl
= decls
; decl
; decl
= TREE_CHAIN (decl
))
1246 if (TREE_CODE (decl
) == FUNCTION_DECL
1247 && ! TREE_ASM_WRITTEN (decl
)
1248 && DECL_INITIAL (decl
) != 0
1249 && TREE_ADDRESSABLE (decl
))
1251 /* If this decl was copied from a file-scope decl
1252 on account of a block-scope extern decl,
1253 propagate TREE_ADDRESSABLE to the file-scope decl.
1255 DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is
1256 true, since then the decl goes through save_for_inline_copying. */
1257 if (DECL_ABSTRACT_ORIGIN (decl
) != 0
1258 && DECL_ABSTRACT_ORIGIN (decl
) != decl
)
1259 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl
)) = 1;
1262 push_function_context ();
1263 output_inline_function (decl
);
1264 pop_function_context ();
1268 /* If there were any declarations in that level,
1269 or if this level is a function body,
1270 create a BLOCK to record them for the life of this function. */
1273 block_previously_created
= (current_binding_level
->this_block
!= 0);
1274 if (block_previously_created
)
1275 block
= current_binding_level
->this_block
;
1276 else if (keep
|| functionbody
)
1277 block
= make_node (BLOCK
);
1280 BLOCK_VARS (block
) = decls
;
1281 BLOCK_SUBBLOCKS (block
) = subblocks
;
1284 /* In each subblock, record that this is its superior. */
1286 for (link
= subblocks
; link
; link
= TREE_CHAIN (link
))
1287 BLOCK_SUPERCONTEXT (link
) = block
;
1289 /* Clear out the meanings of the local variables of this level. */
1291 for (link
= decls
; link
; link
= TREE_CHAIN (link
))
1293 tree name
= DECL_NAME (link
);
1294 if (name
!= 0 && IDENTIFIER_LOCAL_VALUE (name
) == link
)
1296 /* If the ident. was used or addressed via a local extern decl,
1297 don't forget that fact. */
1298 if (DECL_EXTERNAL (link
))
1300 if (TREE_USED (link
))
1301 TREE_USED (name
) = 1;
1302 if (TREE_ADDRESSABLE (link
))
1303 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link
)) = 1;
1305 IDENTIFIER_LOCAL_VALUE (name
) = 0;
1309 /* Restore all name-meanings of the outer levels
1310 that were shadowed by this level. */
1312 for (link
= current_binding_level
->shadowed
; link
; link
= TREE_CHAIN (link
))
1313 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link
)) = TREE_VALUE (link
);
1315 /* If the level being exited is the top level of a function,
1316 check over all the labels, and clear out the current
1317 (function local) meanings of their names. */
1321 /* If this is the top level block of a function,
1322 the vars are the function's parameters.
1323 Don't leave them in the BLOCK because they are
1324 found in the FUNCTION_DECL instead. */
1326 BLOCK_VARS (block
) = 0;
1328 /* Clear out the definitions of all label names,
1329 since their scopes end here,
1330 and add them to BLOCK_VARS. */
1333 for (link
= named_labels
; link
; link
= TREE_CHAIN (link
))
1335 register tree label
= TREE_VALUE (link
);
1337 if (DECL_INITIAL (label
) == 0)
1339 error_with_decl (label
, "label `%s' used but not defined");
1340 /* Avoid crashing later. */
1341 define_label (input_filename
, lineno
,
1344 else if (warn_unused
[UNUSED_LABEL
] && !TREE_USED (label
))
1345 warning_with_decl (label
, "label `%s' defined but not used");
1346 IDENTIFIER_LABEL_VALUE (DECL_NAME (label
)) = 0;
1348 /* Put the labels into the "variables" of the
1349 top-level block, so debugger can see them. */
1350 TREE_CHAIN (label
) = BLOCK_VARS (block
);
1351 BLOCK_VARS (block
) = label
;
1356 /* Pop the current level, and free the structure for reuse. */
1359 register struct binding_level
*level
= current_binding_level
;
1360 current_binding_level
= current_binding_level
->level_chain
;
1362 level
->level_chain
= free_binding_level
;
1363 free_binding_level
= level
;
1366 /* Dispose of the block that we just made inside some higher level. */
1368 DECL_INITIAL (current_function_decl
) = block
;
1371 if (!block_previously_created
)
1372 current_binding_level
->blocks
1373 = chainon (current_binding_level
->blocks
, block
);
1375 /* If we did not make a block for the level just exited,
1376 any blocks made for inner levels
1377 (since they cannot be recorded as subblocks in that level)
1378 must be carried forward so they will later become subblocks
1379 of something else. */
1381 current_binding_level
->blocks
1382 = chainon (current_binding_level
->blocks
, subblocks
);
1384 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1385 binding contour so that they point to the appropriate construct, i.e.
1386 either to the current FUNCTION_DECL node, or else to the BLOCK node
1387 we just constructed.
1389 Note that for tagged types whose scope is just the formal parameter
1390 list for some function type specification, we can't properly set
1391 their TYPE_CONTEXTs here, because we don't have a pointer to the
1392 appropriate FUNCTION_TYPE node readily available to us. For those
1393 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1394 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1395 node which will represent the "scope" for these "parameter list local"
1400 TREE_USED (block
) = 1;
1405 maybe_pushlevels (pc
)
1408 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1412 while (pending_local_decls
!= NULL_TREE
&&
1413 DECL_LOCAL_START_PC (pending_local_decls
) <= pc
)
1415 tree
*ptr
= &pending_local_decls
;
1417 int end_pc
= DECL_LOCAL_END_PC (decl
);
1419 while (*ptr
!= NULL_TREE
1420 && DECL_LOCAL_START_PC (*ptr
) <= pc
1421 && DECL_LOCAL_END_PC (*ptr
) == end_pc
)
1422 ptr
= &TREE_CHAIN (*ptr
);
1423 pending_local_decls
= *ptr
;
1426 /* Force non-nested range to be nested in current range. */
1427 if (end_pc
> current_binding_level
->end_pc
)
1428 end_pc
= current_binding_level
->end_pc
;
1430 maybe_start_try (pc
, end_pc
);
1433 expand_start_bindings (0);
1435 current_binding_level
->end_pc
= end_pc
;
1436 current_binding_level
->start_pc
= pc
;
1437 current_binding_level
->names
= decl
;
1438 for ( ; decl
!= NULL_TREE
; decl
= TREE_CHAIN (decl
))
1440 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl
), decl
);
1444 maybe_start_try (pc
, 0);
1448 maybe_poplevels (pc
)
1451 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1455 while (current_binding_level
->end_pc
<= pc
)
1457 expand_end_bindings (getdecls (), 1, 0);
1458 maybe_end_try (current_binding_level
->start_pc
, pc
);
1461 maybe_end_try (0, pc
);
1464 /* Terminate any binding which began during the range beginning at
1465 start_pc. This tidies up improperly nested local variable ranges
1466 and exception handlers; a variable declared within an exception
1467 range is forcibly terminated when that exception ends. */
1470 force_poplevels (start_pc
)
1473 while (current_binding_level
->start_pc
> start_pc
)
1475 if (pedantic
&& current_binding_level
->start_pc
> start_pc
)
1476 warning_with_decl (current_function_decl
,
1477 "In %s: overlapped variable and exception ranges at %d",
1478 current_binding_level
->start_pc
);
1479 expand_end_bindings (getdecls (), 1, 0);
1484 /* Insert BLOCK at the end of the list of subblocks of the
1485 current binding level. This is used when a BIND_EXPR is expanded,
1486 to handle the BLOCK node inside the BIND_EXPR. */
1489 insert_block (block
)
1492 TREE_USED (block
) = 1;
1493 current_binding_level
->blocks
1494 = chainon (current_binding_level
->blocks
, block
);
1497 /* Set the BLOCK node for the innermost scope
1498 (the one we are currently in). */
1502 register tree block
;
1504 current_binding_level
->this_block
= block
;
1505 current_binding_level
->names
= chainon (current_binding_level
->names
,
1506 BLOCK_VARS (block
));
1507 current_binding_level
->blocks
= chainon (current_binding_level
->blocks
,
1508 BLOCK_SUBBLOCKS (block
));
1511 /* integrate_decl_tree calls this function. */
1514 copy_lang_decl (node
)
1518 = TREE_CODE (node
) == VAR_DECL
? sizeof (struct lang_decl_var
)
1519 : sizeof (struct lang_decl
);
1520 struct lang_decl
*x
= (struct lang_decl
*) ggc_alloc (lang_decl_size
);
1521 memcpy (x
, DECL_LANG_SPECIFIC (node
), lang_decl_size
);
1522 DECL_LANG_SPECIFIC (node
) = x
;
1525 /* If DECL has a cleanup, build and return that cleanup here.
1526 This is a callback called by expand_expr. */
1529 maybe_build_cleanup (decl
)
1530 tree decl ATTRIBUTE_UNUSED
;
1532 /* There are no cleanups in Java (I think). */
1537 give_name_to_locals (jcf
)
1540 int i
, n
= DECL_LOCALVARIABLES_OFFSET (current_function_decl
);
1541 int code_offset
= DECL_CODE_OFFSET (current_function_decl
);
1543 pending_local_decls
= NULL_TREE
;
1547 n
= JCF_readu2 (jcf
);
1548 for (i
= 0; i
< n
; i
++)
1550 int start_pc
= JCF_readu2 (jcf
);
1551 int length
= JCF_readu2 (jcf
);
1552 int name_index
= JCF_readu2 (jcf
);
1553 int signature_index
= JCF_readu2 (jcf
);
1554 int slot
= JCF_readu2 (jcf
);
1555 tree name
= get_name_constant (jcf
, name_index
);
1556 tree type
= parse_signature (jcf
, signature_index
);
1557 if (slot
< DECL_ARG_SLOT_COUNT (current_function_decl
)
1559 && length
== DECL_CODE_LENGTH (current_function_decl
))
1561 tree decl
= TREE_VEC_ELT (decl_map
, slot
);
1562 DECL_NAME (decl
) = name
;
1563 SET_DECL_ASSEMBLER_NAME (decl
, name
);
1564 if (TREE_CODE (decl
) != PARM_DECL
|| TREE_TYPE (decl
) != type
)
1565 warning ("bad type in parameter debug info");
1570 int end_pc
= start_pc
+ length
;
1571 tree decl
= build_decl (VAR_DECL
, name
, type
);
1572 if (end_pc
> DECL_CODE_LENGTH (current_function_decl
))
1574 warning_with_decl (decl
,
1575 "bad PC range for debug info for local `%s'");
1576 end_pc
= DECL_CODE_LENGTH (current_function_decl
);
1579 /* Adjust start_pc if necessary so that the local's first
1580 store operation will use the relevant DECL as a
1581 destination. Fore more information, read the leading
1582 comments for expr.c:maybe_adjust_start_pc. */
1583 start_pc
= maybe_adjust_start_pc (jcf
, code_offset
, start_pc
, slot
);
1585 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
1586 DECL_LOCAL_SLOT_NUMBER (decl
) = slot
;
1587 DECL_LOCAL_START_PC (decl
) = start_pc
;
1589 /* FIXME: The range used internally for exceptions and local
1590 variable ranges, is a half-open interval:
1591 start_pc <= pc < end_pc. However, the range used in the
1592 Java VM spec is inclusive at both ends:
1593 start_pc <= pc <= end_pc. */
1596 DECL_LOCAL_END_PC (decl
) = end_pc
;
1598 /* Now insert the new decl in the proper place in
1599 pending_local_decls. We are essentially doing an insertion sort,
1600 which works fine, since the list input will normally already
1602 ptr
= &pending_local_decls
;
1603 while (*ptr
!= NULL_TREE
1604 && (DECL_LOCAL_START_PC (*ptr
) > start_pc
1605 || (DECL_LOCAL_START_PC (*ptr
) == start_pc
1606 && DECL_LOCAL_END_PC (*ptr
) < end_pc
)))
1607 ptr
= &TREE_CHAIN (*ptr
);
1608 TREE_CHAIN (decl
) = *ptr
;
1613 pending_local_decls
= nreverse (pending_local_decls
);
1615 /* Fill in default names for the parameters. */
1616 for (parm
= DECL_ARGUMENTS (current_function_decl
), i
= 0;
1617 parm
!= NULL_TREE
; parm
= TREE_CHAIN (parm
), i
++)
1619 if (DECL_NAME (parm
) == NULL_TREE
)
1621 int arg_i
= METHOD_STATIC (current_function_decl
) ? i
+1 : i
;
1623 DECL_NAME (parm
) = get_identifier ("this");
1627 sprintf (buffer
, "ARG_%d", arg_i
);
1628 DECL_NAME (parm
) = get_identifier (buffer
);
1630 SET_DECL_ASSEMBLER_NAME (parm
, DECL_NAME (parm
));
1636 build_result_decl (fndecl
)
1639 tree restype
= TREE_TYPE (TREE_TYPE (fndecl
));
1640 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1641 if (INTEGRAL_TYPE_P (restype
)
1642 && TYPE_PRECISION (restype
) < TYPE_PRECISION (integer_type_node
))
1643 restype
= integer_type_node
;
1644 return (DECL_RESULT (fndecl
) = build_decl (RESULT_DECL
, NULL_TREE
, restype
));
1647 /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE in order
1648 to emit initialization code for each test flag. */
1651 emit_init_test_initialization (entry
, key
)
1652 struct hash_entry
*entry
;
1653 hash_table_key key ATTRIBUTE_UNUSED
;
1655 struct init_test_hash_entry
*ite
= (struct init_test_hash_entry
*) entry
;
1656 tree klass
= build_class_ref ((tree
) entry
->key
);
1657 expand_decl (ite
->init_test_decl
);
1659 /* We initialize the class init check variable by looking at the
1660 `state' field of the class to see if it is already initialized.
1661 This makes things a bit faster if the class is already
1662 initialized, which should be the common case. */
1664 (build (MODIFY_EXPR
, boolean_type_node
,
1665 ite
->init_test_decl
,
1666 build (GE_EXPR
, boolean_type_node
,
1667 build (COMPONENT_REF
, byte_type_node
,
1668 build1 (INDIRECT_REF
, class_type_node
, klass
),
1669 lookup_field (&class_type_node
,
1670 get_identifier ("state"))),
1671 build_int_2 (JV_STATE_DONE
, 0))));
1677 complete_start_java_method (fndecl
)
1680 if (! flag_emit_class_files
)
1682 /* Initialize the RTL code for the function. */
1683 init_function_start (fndecl
, input_filename
, lineno
);
1685 /* Set up parameters and prepare for return, for the function. */
1686 expand_function_start (fndecl
, 0);
1688 /* Emit initialization code for test flags. */
1689 if (! always_initialize_class_p
)
1690 hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (fndecl
),
1691 emit_init_test_initialization
, 0);
1695 /* If this fcn was already referenced via a block-scope `extern' decl (or
1696 an implicit decl), propagate certain information about the usage. */
1697 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl
)))
1698 TREE_ADDRESSABLE (current_function_decl
) = 1;
1702 if (METHOD_STATIC (fndecl
) && ! METHOD_PRIVATE (fndecl
)
1703 && ! flag_emit_class_files
1704 && ! DECL_CLINIT_P (fndecl
)
1705 && ! CLASS_INTERFACE (TYPE_NAME (current_class
)))
1707 tree clas
= DECL_CONTEXT (fndecl
);
1708 tree init
= build (CALL_EXPR
, void_type_node
,
1709 build_address_of (soft_initclass_node
),
1710 build_tree_list (NULL_TREE
, build_class_ref (clas
)),
1712 TREE_SIDE_EFFECTS (init
) = 1;
1713 expand_expr_stmt (init
);
1716 /* Push local variables. Function compiled from source code are
1717 using a different local variables management, and for them,
1718 pushlevel shouldn't be called from here. */
1719 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl
)))
1722 if (! flag_emit_class_files
)
1723 expand_start_bindings (1);
1726 if (METHOD_SYNCHRONIZED (fndecl
) && ! flag_emit_class_files
)
1728 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1729 tree enter
, exit
, lock
;
1730 if (METHOD_STATIC (fndecl
))
1731 lock
= build_class_ref (DECL_CONTEXT (fndecl
));
1733 lock
= DECL_ARGUMENTS (fndecl
);
1734 BUILD_MONITOR_ENTER (enter
, lock
);
1735 BUILD_MONITOR_EXIT (exit
, lock
);
1736 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl
)))
1738 expand_expr_stmt (enter
);
1739 expand_decl_cleanup (NULL_TREE
, exit
);
1743 tree function_body
= DECL_FUNCTION_BODY (fndecl
);
1744 tree body
= BLOCK_EXPR_BODY (function_body
);
1745 lock
= build (WITH_CLEANUP_EXPR
, void_type_node
,
1746 enter
, NULL_TREE
, exit
);
1747 TREE_SIDE_EFFECTS (lock
) = 1;
1748 lock
= build (COMPOUND_EXPR
, TREE_TYPE (body
), lock
, body
);
1749 TREE_SIDE_EFFECTS (lock
) = 1;
1750 lock
= build1 (CLEANUP_POINT_EXPR
, TREE_TYPE (body
), lock
);
1751 TREE_SIDE_EFFECTS (lock
) = 1;
1752 BLOCK_EXPR_BODY (function_body
) = lock
;
1758 start_java_method (fndecl
)
1764 current_function_decl
= fndecl
;
1765 announce_function (fndecl
);
1767 i
= DECL_MAX_LOCALS(fndecl
) + DECL_MAX_STACK(fndecl
);
1768 decl_map
= make_tree_vec (i
);
1769 type_map
= (tree
*) xrealloc (type_map
, i
* sizeof (tree
));
1771 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1772 fprintf (stderr
, "%s:\n", (*decl_printable_name
) (fndecl
, 2));
1774 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1775 pushlevel (1); /* Push parameters. */
1777 ptr
= &DECL_ARGUMENTS (fndecl
);
1778 for (tem
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
)), i
= 0;
1779 tem
!= end_params_node
; tem
= TREE_CHAIN (tem
), i
++)
1781 tree parm_name
= NULL_TREE
, parm_decl
;
1782 tree parm_type
= TREE_VALUE (tem
);
1783 if (i
>= DECL_MAX_LOCALS (fndecl
))
1786 parm_decl
= build_decl (PARM_DECL
, parm_name
, parm_type
);
1787 DECL_CONTEXT (parm_decl
) = fndecl
;
1788 if (PROMOTE_PROTOTYPES
1789 && TYPE_PRECISION (parm_type
) < TYPE_PRECISION (integer_type_node
)
1790 && INTEGRAL_TYPE_P (parm_type
))
1791 parm_type
= integer_type_node
;
1792 DECL_ARG_TYPE (parm_decl
) = parm_type
;
1795 ptr
= &TREE_CHAIN (parm_decl
);
1797 /* Add parm_decl to the decl_map. */
1798 push_jvm_slot (i
, parm_decl
);
1800 type_map
[i
] = TREE_TYPE (parm_decl
);
1801 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl
)))
1804 type_map
[i
] = void_type_node
;
1808 DECL_ARG_SLOT_COUNT (current_function_decl
) = i
;
1810 while (i
< DECL_MAX_LOCALS(fndecl
))
1811 type_map
[i
++] = NULL_TREE
;
1813 build_result_decl (fndecl
);
1814 complete_start_java_method (fndecl
);
1820 tree fndecl
= current_function_decl
;
1822 expand_end_bindings (getdecls (), 1, 0);
1823 /* pop out of function */
1826 /* pop out of its parameters */
1829 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl
)) = fndecl
;
1831 /* Generate rtl for function exit. */
1832 expand_function_end (input_filename
, lineno
, 0);
1834 /* Run the optimizers and output assembler code for this function. */
1835 rest_of_compilation (fndecl
);
1837 current_function_decl
= NULL_TREE
;
1840 /* Mark language-specific parts of T for garbage-collection. */
1846 if (TREE_CODE (t
) == IDENTIFIER_NODE
)
1848 struct lang_identifier
*li
= (struct lang_identifier
*) t
;
1849 ggc_mark_tree (li
->global_value
);
1850 ggc_mark_tree (li
->local_value
);
1851 ggc_mark_tree (li
->utf8_ref
);
1853 else if (TREE_CODE (t
) == VAR_DECL
1854 || TREE_CODE (t
) == PARM_DECL
1855 || TREE_CODE (t
) == FIELD_DECL
)
1857 struct lang_decl_var
*ldv
=
1858 ((struct lang_decl_var
*) DECL_LANG_SPECIFIC (t
));
1862 ggc_mark_tree (ldv
->slot_chain
);
1863 ggc_mark_tree (ldv
->am
);
1864 ggc_mark_tree (ldv
->wfl
);
1867 else if (TREE_CODE (t
) == FUNCTION_DECL
)
1869 struct lang_decl
*ld
= DECL_LANG_SPECIFIC (t
);
1874 ggc_mark_tree (ld
->wfl
);
1875 ggc_mark_tree (ld
->throws_list
);
1876 ggc_mark_tree (ld
->function_decl_body
);
1877 ggc_mark_tree (ld
->called_constructor
);
1878 ggc_mark_tree (ld
->inner_access
);
1881 else if (TYPE_P (t
))
1883 struct lang_type
*lt
= TYPE_LANG_SPECIFIC (t
);
1888 ggc_mark_tree (lt
->signature
);
1889 ggc_mark_tree (lt
->cpool_data_ref
);
1890 ggc_mark_tree (lt
->finit_stmt_list
);
1891 ggc_mark_tree (lt
->clinit_stmt_list
);
1892 ggc_mark_tree (lt
->ii_block
);
1893 ggc_mark_tree (lt
->dot_class
);
1894 ggc_mark_tree (lt
->package_list
);