1 /* Process declarations and variables for the GNU compiler for the
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007,
4 2005, 2006, 2007, 2008, 2009, 2010 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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
30 #include "coretypes.h"
32 #include "diagnostic-core.h"
35 #include "java-tree.h"
38 #include "java-except.h"
41 #include "tree-inline.h"
44 #include "tree-iterator.h"
45 #include "langhooks.h"
48 #if defined (DEBUG_JAVA_BINDING_LEVELS)
49 extern void indent (void);
52 static tree push_jvm_slot (int, tree);
53 static tree lookup_name_current_level (tree);
54 static tree push_promoted_type (const char *, tree);
55 static struct binding_level *make_binding_level (void);
56 static tree create_primitive_vtable (const char *);
57 static tree check_local_unnamed_variable (tree, tree, tree);
58 static void parse_version (void);
61 /* The following ABI flags are used in the high-order bits of the version
62 ID field. The version ID number itself should never be larger than
63 0xfffff, so it should be safe to use top 12 bits for these flags. */
65 #define FLAG_BINARYCOMPAT_ABI (1<<31) /* Class is built with the BC-ABI. */
67 #define FLAG_BOOTSTRAP_LOADER (1<<30) /* Used when defining a class that
68 should be loaded by the bootstrap
71 /* If an ABI change is made within a GCC release series, rendering current
72 binaries incompatible with the old runtimes, this number must be set to
73 enforce the compatibility rules. */
74 #define MINOR_BINARYCOMPAT_ABI_VERSION 1
76 /* The runtime may recognize a variety of BC ABIs (objects generated by
77 different version of gcj), but will probably always require strict
78 matching for the ordinary (C++) ABI. */
80 /* The version ID of the BC ABI that we generate. This must be kept in
81 sync with parse_version(), libgcj, and reality (if the BC format changes,
83 #define GCJ_CURRENT_BC_ABI_VERSION \
84 (4 * 100000 + 0 * 1000 + MINOR_BINARYCOMPAT_ABI_VERSION)
86 /* The ABI version number. */
89 /* Name of the Cloneable class. */
90 tree java_lang_cloneable_identifier_node;
92 /* Name of the Serializable class. */
93 tree java_io_serializable_identifier_node;
95 /* The DECL_MAP is a mapping from (index, type) to a decl node.
96 If index < max_locals, it is the index of a local variable.
97 if index >= max_locals, then index-max_locals is a stack slot.
98 The DECL_MAP mapping is represented as a TREE_VEC whose elements
99 are a list of decls (VAR_DECL or PARM_DECL) chained by
100 DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
101 we search the chain for a decl with a matching TREE_TYPE. */
103 static GTY(()) tree decl_map;
105 /* The base_decl_map is contains one variable of ptr_type: this is
106 used to contain every variable of reference type that is ever
107 stored in a local variable slot. */
109 static GTY(()) tree base_decl_map;
111 /* An index used to make temporary identifiers unique. */
114 /* A list of local variables VAR_DECLs for this method that we have seen
115 debug information, but we have not reached their starting (byte) PC yet. */
117 static GTY(()) tree pending_local_decls;
119 /* The decl for "_Jv_ResolvePoolEntry". */
120 tree soft_resolvepoolentry_node;
122 /* The decl for the .constants field of an instance of Class. */
123 tree constants_field_decl_node;
125 /* The decl for the .data field of an instance of Class. */
126 tree constants_data_field_decl_node;
128 #if defined(DEBUG_JAVA_BINDING_LEVELS)
129 int binding_depth = 0;
130 int is_class_level = 0;
138 for (i = 0; i < binding_depth*2; i++)
141 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
143 /* True if decl is a named local variable, i.e. if it is an alias
144 that's used only for debugging purposes. */
147 debug_variable_p (tree decl)
149 if (TREE_CODE (decl) == PARM_DECL)
152 if (LOCAL_SLOT_P (decl))
159 push_jvm_slot (int index, tree decl)
161 DECL_CONTEXT (decl) = current_function_decl;
162 layout_decl (decl, 0);
164 /* Now link the decl into the decl_map. */
165 if (DECL_LANG_SPECIFIC (decl) == NULL)
167 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
168 DECL_LOCAL_START_PC (decl) = 0;
169 DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
170 DECL_LOCAL_SLOT_NUMBER (decl) = index;
172 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
173 TREE_VEC_ELT (decl_map, index) = decl;
178 /* Find the best declaration based upon type. If 'decl' fits 'type' better
179 than 'best', return 'decl'. Otherwise return 'best'. */
182 check_local_unnamed_variable (tree best, tree decl, tree type)
184 tree decl_type = TREE_TYPE (decl);
186 gcc_assert (! LOCAL_VAR_OUT_OF_SCOPE_P (decl));
188 /* Use the same decl for all integer types <= 32 bits. This is
189 necessary because sometimes a value is stored as (for example)
190 boolean but loaded as int. */
191 if (decl_type == type
192 || (INTEGRAL_TYPE_P (decl_type)
193 && INTEGRAL_TYPE_P (type)
194 && TYPE_PRECISION (decl_type) <= 32
195 && TYPE_PRECISION (type) <= 32
196 && TYPE_PRECISION (decl_type) >= TYPE_PRECISION (type))
197 /* ptr_type_node is used for null pointers, which are
198 assignment compatible with everything. */
199 || (TREE_CODE (decl_type) == POINTER_TYPE
200 && type == ptr_type_node)
201 /* Whenever anyone wants to use a slot that is initially
202 occupied by a PARM_DECL of pointer type they must get that
203 decl, even if they asked for a pointer to a different type.
204 However, if someone wants a scalar variable in a slot that
205 initially held a pointer arg -- or vice versa -- we create a
208 ???: As long as verification is correct, this will be a
209 compatible type. But maybe we should create a dummy variable
210 and replace all references to it with the DECL and a
213 || (TREE_CODE (decl_type) == POINTER_TYPE
214 && TREE_CODE (decl) == PARM_DECL
215 && TREE_CODE (type) == POINTER_TYPE))
217 if (best == NULL_TREE
218 || (decl_type == type && TREE_TYPE (best) != type))
226 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
227 that is valid at PC (or -1 if any pc).
228 If there is no existing matching decl, allocate one. */
231 find_local_variable (int index, tree type, int pc ATTRIBUTE_UNUSED)
233 tree tmp = TREE_VEC_ELT (decl_map, index);
234 tree decl = NULL_TREE;
236 /* Scan through every declaration that has been created in this
237 slot. We're only looking for variables that correspond to local
238 index declarations and PARM_DECLs, not named variables: such
239 local variables are used only for debugging information. */
240 while (tmp != NULL_TREE)
242 if (! debug_variable_p (tmp))
243 decl = check_local_unnamed_variable (decl, tmp, type);
244 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
247 /* gcj has a function called promote_type(), which is used by both
248 the bytecode compiler and the source compiler. Unfortunately,
249 the type systems for the Java VM and the Java language are not
250 the same: a boolean in the VM promotes to an int, not to a wide
251 boolean. If our caller wants something to hold a boolean, that
252 had better be an int, because that slot might be re-used
253 later in integer context. */
254 if (TREE_CODE (type) == BOOLEAN_TYPE)
255 type = integer_type_node;
257 /* If we don't find a match, create one with the type passed in.
258 The name of the variable is #n#m, which n is the variable index
259 in the local variable area and m is a dummy identifier for
260 uniqueness -- multiple variables may share the same local
261 variable index. We don't call pushdecl() to push pointer types
262 into a binding expr because they'll all be replaced by a single
263 variable that is used for every reference in that local variable
269 sprintf (buf, "#slot#%d#%d", index, uniq++);
270 name = get_identifier (buf);
271 decl = build_decl (input_location, VAR_DECL, name, type);
272 DECL_IGNORED_P (decl) = 1;
273 DECL_ARTIFICIAL (decl) = 1;
274 decl = push_jvm_slot (index, decl);
275 LOCAL_SLOT_P (decl) = 1;
277 if (TREE_CODE (type) != POINTER_TYPE)
278 pushdecl_function_level (decl);
281 /* As well as creating a local variable that matches the type, we
282 also create a base variable (of ptr_type) that will hold all its
284 if (TREE_CODE (type) == POINTER_TYPE
285 && ! TREE_VEC_ELT (base_decl_map, index))
290 sprintf (buf, "#ref#%d#%d", index, uniq++);
291 name = get_identifier (buf);
293 = TREE_VEC_ELT (base_decl_map, index)
294 = build_decl (input_location, VAR_DECL, name, ptr_type_node);
295 pushdecl_function_level (base_decl);
296 DECL_IGNORED_P (base_decl) = 1;
297 DECL_ARTIFICIAL (base_decl) = 1;
303 /* Called during genericization for every variable. If the variable
304 is a temporary of pointer type, replace it with a common variable
305 thath is used to hold all pointer types that are ever stored in
306 that slot. Set WANT_LVALUE if you want a variable that is to be
310 java_replace_reference (tree var_decl, bool want_lvalue)
317 decl_type = TREE_TYPE (var_decl);
319 if (TREE_CODE (decl_type) == POINTER_TYPE)
321 if (DECL_LANG_SPECIFIC (var_decl)
322 && LOCAL_SLOT_P (var_decl))
324 int index = DECL_LOCAL_SLOT_NUMBER (var_decl);
325 tree base_decl = TREE_VEC_ELT (base_decl_map, index);
327 gcc_assert (base_decl);
329 base_decl = build1 (NOP_EXPR, decl_type, base_decl);
338 /* Helper for java_genericize. */
341 java_replace_references (tree *tp, int *walk_subtrees,
342 void *data ATTRIBUTE_UNUSED)
344 if (TREE_CODE (*tp) == MODIFY_EXPR)
346 source_location loc = EXPR_LOCATION (*tp);
347 tree lhs = TREE_OPERAND (*tp, 0);
348 /* This is specific to the bytecode compiler. If a variable has
349 LOCAL_SLOT_P set, replace an assignment to it with an assignment
350 to the corresponding variable that holds all its aliases. */
351 if (TREE_CODE (lhs) == VAR_DECL
352 && DECL_LANG_SPECIFIC (lhs)
353 && LOCAL_SLOT_P (lhs)
354 && TREE_CODE (TREE_TYPE (lhs)) == POINTER_TYPE)
356 tree new_lhs = java_replace_reference (lhs, /* want_lvalue */ true);
357 tree new_rhs = build1 (NOP_EXPR, TREE_TYPE (new_lhs),
358 TREE_OPERAND (*tp, 1));
359 tree tem = build2 (MODIFY_EXPR, TREE_TYPE (new_lhs),
361 *tp = build1 (NOP_EXPR, TREE_TYPE (lhs), tem);
362 SET_EXPR_LOCATION (tem, loc);
363 SET_EXPR_LOCATION (new_rhs, loc);
364 SET_EXPR_LOCATION (*tp, loc);
367 if (TREE_CODE (*tp) == VAR_DECL)
369 *tp = java_replace_reference (*tp, /* want_lvalue */ false);
376 /* Same as find_local_index, except that INDEX is a stack index. */
379 find_stack_slot (int index, tree type)
381 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
387 /* A chain of _DECL nodes for all variables, constants, functions,
388 * and typedef types. These are in the reverse of the order supplied.
392 /* For each level, a list of shadowed outer-level local definitions
393 to be restored when this level is popped.
394 Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
395 whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
398 /* For each level (except not the global one),
399 a chain of BLOCK nodes for all the levels
400 that were entered and exited one level down. */
403 /* The binding level which this one is contained in (inherits from). */
404 struct binding_level *level_chain;
406 /* The bytecode PC that marks the end of this level. */
408 /* The bytecode PC that marks the start of this level. */
411 /* The statements in this binding level. */
414 /* An exception range associated with this binding level. */
415 struct eh_range * GTY((skip (""))) exception_range;
417 /* Binding depth at which this level began. Used only for debugging. */
418 unsigned binding_depth;
420 /* The location at which this level began. */
424 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
426 /* The binding level currently in effect. */
428 static GTY(()) struct binding_level *current_binding_level;
430 /* A chain of binding_level structures awaiting reuse. */
432 static GTY(()) struct binding_level *free_binding_level;
434 /* The outermost binding level, for names of file scope.
435 This is created when the compiler is started and exists
436 through the entire run. */
438 static GTY(()) struct binding_level *global_binding_level;
440 /* The binding level that holds variables declared at the outermost
441 level within a function body. */
443 static struct binding_level *function_binding_level;
445 /* A PC value bigger than any PC value we may ever may encounter. */
447 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
449 /* Binding level structures are initialized by copying this one. */
451 static const struct binding_level clear_binding_level
453 NULL_TREE, /* names */
454 NULL_TREE, /* shadowed */
455 NULL_TREE, /* blocks */
456 NULL_BINDING_LEVEL, /* level_chain */
457 LARGEST_PC, /* end_pc */
460 NULL, /* exception_range */
461 0, /* binding_depth */
465 tree java_global_trees[JTI_MAX];
467 /* Build (and pushdecl) a "promoted type" for all standard
468 types shorter than int. */
471 push_promoted_type (const char *name, tree actual_type)
473 tree type = make_node (TREE_CODE (actual_type));
475 tree in_min = TYPE_MIN_VALUE (int_type_node);
476 tree in_max = TYPE_MAX_VALUE (int_type_node);
478 tree in_min = TYPE_MIN_VALUE (actual_type);
479 tree in_max = TYPE_MAX_VALUE (actual_type);
481 TYPE_MIN_VALUE (type) = copy_node (in_min);
482 TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
483 TYPE_MAX_VALUE (type) = copy_node (in_max);
484 TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
485 TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
486 TYPE_STRING_FLAG (type) = TYPE_STRING_FLAG (actual_type);
488 pushdecl (build_decl (input_location,
489 TYPE_DECL, get_identifier (name), type));
493 /* Return tree that represents a vtable for a primitive array. */
495 create_primitive_vtable (const char *name)
500 sprintf (buf, "_Jv_%sVTable", name);
501 r = build_decl (input_location,
502 VAR_DECL, get_identifier (buf), ptr_type_node);
503 DECL_EXTERNAL (r) = 1;
507 /* Parse the version string and compute the ABI version number. */
511 const char *p = version_string;
512 unsigned int major = 0, minor = 0;
513 unsigned int abi_version;
515 /* Skip leading junk. */
516 while (*p && !ISDIGIT (*p))
520 /* Extract major version. */
523 major = major * 10 + *p - '0';
527 gcc_assert (*p == '.' && ISDIGIT (p[1]));
530 /* Extract minor version. */
533 minor = minor * 10 + *p - '0';
537 if (flag_indirect_dispatch)
539 abi_version = GCJ_CURRENT_BC_ABI_VERSION;
540 abi_version |= FLAG_BINARYCOMPAT_ABI;
544 /* Implicit in this computation is the idea that we won't break the
545 old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
547 abi_version = 100000 * major + 1000 * minor;
549 if (flag_bootstrap_classes)
550 abi_version |= FLAG_BOOTSTRAP_LOADER;
552 gcj_abi_version = build_int_cstu (ptr_type_node, abi_version);
556 java_init_decl_processing (void)
559 tree field = NULL_TREE;
562 init_class_processing ();
564 current_function_decl = NULL;
565 current_binding_level = NULL_BINDING_LEVEL;
566 free_binding_level = NULL_BINDING_LEVEL;
567 pushlevel (0); /* make the binding_level structure for global names */
568 global_binding_level = current_binding_level;
570 /* The code here must be similar to build_common_tree_nodes{,_2} in
571 tree.c, especially as to the order of initializing common nodes. */
572 error_mark_node = make_node (ERROR_MARK);
573 TREE_TYPE (error_mark_node) = error_mark_node;
575 /* Create sizetype first - needed for other types. */
576 initialize_sizetypes ();
578 byte_type_node = make_signed_type (8);
579 pushdecl (build_decl (BUILTINS_LOCATION,
580 TYPE_DECL, get_identifier ("byte"), byte_type_node));
581 short_type_node = make_signed_type (16);
582 pushdecl (build_decl (BUILTINS_LOCATION,
583 TYPE_DECL, get_identifier ("short"), short_type_node));
584 int_type_node = make_signed_type (32);
585 pushdecl (build_decl (BUILTINS_LOCATION,
586 TYPE_DECL, get_identifier ("int"), int_type_node));
587 long_type_node = make_signed_type (64);
588 pushdecl (build_decl (BUILTINS_LOCATION,
589 TYPE_DECL, get_identifier ("long"), long_type_node));
591 unsigned_byte_type_node = make_unsigned_type (8);
592 pushdecl (build_decl (BUILTINS_LOCATION,
593 TYPE_DECL, get_identifier ("unsigned byte"),
594 unsigned_byte_type_node));
595 unsigned_short_type_node = make_unsigned_type (16);
596 pushdecl (build_decl (BUILTINS_LOCATION,
597 TYPE_DECL, get_identifier ("unsigned short"),
598 unsigned_short_type_node));
599 unsigned_int_type_node = make_unsigned_type (32);
600 pushdecl (build_decl (BUILTINS_LOCATION,
601 TYPE_DECL, get_identifier ("unsigned int"),
602 unsigned_int_type_node));
603 unsigned_long_type_node = make_unsigned_type (64);
604 pushdecl (build_decl (BUILTINS_LOCATION,
605 TYPE_DECL, get_identifier ("unsigned long"),
606 unsigned_long_type_node));
608 /* This is not a java type, however tree-dfa requires a definition for
610 size_type_node = make_unsigned_type (POINTER_SIZE);
611 set_sizetype (size_type_node);
613 /* Define these next since types below may used them. */
614 integer_type_node = java_type_for_size (INT_TYPE_SIZE, 0);
615 integer_zero_node = build_int_cst (NULL_TREE, 0);
616 integer_one_node = build_int_cst (NULL_TREE, 1);
617 integer_two_node = build_int_cst (NULL_TREE, 2);
618 integer_four_node = build_int_cst (NULL_TREE, 4);
619 integer_minus_one_node = build_int_cst (NULL_TREE, -1);
621 /* A few values used for range checking in the lexer. */
622 decimal_int_max = build_int_cstu (unsigned_int_type_node, 0x80000000);
624 = double_int_to_tree (unsigned_long_type_node,
625 double_int_setbit (double_int_zero, 64));
627 size_zero_node = size_int (0);
628 size_one_node = size_int (1);
629 bitsize_zero_node = bitsize_int (0);
630 bitsize_one_node = bitsize_int (1);
631 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
633 long_zero_node = build_int_cst (long_type_node, 0);
635 void_type_node = make_node (VOID_TYPE);
636 pushdecl (build_decl (BUILTINS_LOCATION,
637 TYPE_DECL, get_identifier ("void"), void_type_node));
638 layout_type (void_type_node); /* Uses size_zero_node */
640 ptr_type_node = build_pointer_type (void_type_node);
642 = build_pointer_type (build_type_variant (void_type_node, 1, 0));
644 t = make_node (VOID_TYPE);
645 layout_type (t); /* Uses size_zero_node */
646 return_address_type_node = build_pointer_type (t);
648 null_pointer_node = build_int_cst (ptr_type_node, 0);
650 char_type_node = make_node (INTEGER_TYPE);
651 TYPE_STRING_FLAG (char_type_node) = 1;
652 TYPE_PRECISION (char_type_node) = 16;
653 fixup_unsigned_type (char_type_node);
654 pushdecl (build_decl (BUILTINS_LOCATION,
655 TYPE_DECL, get_identifier ("char"), char_type_node));
657 boolean_type_node = make_node (BOOLEAN_TYPE);
658 TYPE_PRECISION (boolean_type_node) = 1;
659 fixup_unsigned_type (boolean_type_node);
660 pushdecl (build_decl (BUILTINS_LOCATION,
661 TYPE_DECL, get_identifier ("boolean"),
663 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
664 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
666 promoted_byte_type_node
667 = push_promoted_type ("promoted_byte", byte_type_node);
668 promoted_short_type_node
669 = push_promoted_type ("promoted_short", short_type_node);
670 promoted_char_type_node
671 = push_promoted_type ("promoted_char", char_type_node);
672 promoted_boolean_type_node
673 = push_promoted_type ("promoted_boolean", boolean_type_node);
675 float_type_node = make_node (REAL_TYPE);
676 TYPE_PRECISION (float_type_node) = 32;
677 pushdecl (build_decl (BUILTINS_LOCATION,
678 TYPE_DECL, get_identifier ("float"),
680 layout_type (float_type_node);
682 double_type_node = make_node (REAL_TYPE);
683 TYPE_PRECISION (double_type_node) = 64;
684 pushdecl (build_decl (BUILTINS_LOCATION,
685 TYPE_DECL, get_identifier ("double"),
687 layout_type (double_type_node);
689 float_zero_node = build_real (float_type_node, dconst0);
690 double_zero_node = build_real (double_type_node, dconst0);
692 /* These are the vtables for arrays of primitives. */
693 boolean_array_vtable = create_primitive_vtable ("boolean");
694 byte_array_vtable = create_primitive_vtable ("byte");
695 char_array_vtable = create_primitive_vtable ("char");
696 short_array_vtable = create_primitive_vtable ("short");
697 int_array_vtable = create_primitive_vtable ("int");
698 long_array_vtable = create_primitive_vtable ("long");
699 float_array_vtable = create_primitive_vtable ("float");
700 double_array_vtable = create_primitive_vtable ("double");
702 one_elt_array_domain_type = build_index_type (integer_one_node);
703 utf8const_type = make_node (RECORD_TYPE);
704 PUSH_FIELD (input_location,
705 utf8const_type, field, "hash", unsigned_short_type_node);
706 PUSH_FIELD (input_location,
707 utf8const_type, field, "length", unsigned_short_type_node);
708 FINISH_RECORD (utf8const_type);
709 utf8const_ptr_type = build_pointer_type (utf8const_type);
711 atable_type = build_array_type (ptr_type_node,
712 one_elt_array_domain_type);
713 TYPE_NONALIASED_COMPONENT (atable_type) = 1;
714 atable_ptr_type = build_pointer_type (atable_type);
716 itable_type = build_array_type (ptr_type_node,
717 one_elt_array_domain_type);
718 TYPE_NONALIASED_COMPONENT (itable_type) = 1;
719 itable_ptr_type = build_pointer_type (itable_type);
721 symbol_type = make_node (RECORD_TYPE);
722 PUSH_FIELD (input_location,
723 symbol_type, field, "clname", utf8const_ptr_type);
724 PUSH_FIELD (input_location, symbol_type, field, "name", utf8const_ptr_type);
725 PUSH_FIELD (input_location,
726 symbol_type, field, "signature", utf8const_ptr_type);
727 FINISH_RECORD (symbol_type);
729 symbols_array_type = build_array_type (symbol_type,
730 one_elt_array_domain_type);
731 symbols_array_ptr_type = build_pointer_type (symbols_array_type);
733 assertion_entry_type = make_node (RECORD_TYPE);
734 PUSH_FIELD (input_location,
735 assertion_entry_type, field, "assertion_code", integer_type_node);
736 PUSH_FIELD (input_location,
737 assertion_entry_type, field, "op1", utf8const_ptr_type);
738 PUSH_FIELD (input_location,
739 assertion_entry_type, field, "op2", utf8const_ptr_type);
740 FINISH_RECORD (assertion_entry_type);
742 assertion_table_type = build_array_type (assertion_entry_type,
743 one_elt_array_domain_type);
745 /* As you're adding items here, please update the code right after
746 this section, so that the filename containing the source code of
747 the pre-defined class gets registered correctly. */
748 unqualified_object_id_node = get_identifier ("Object");
749 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
750 object_ptr_type_node = promote_type (object_type_node);
751 string_type_node = lookup_class (get_identifier ("java.lang.String"));
752 string_ptr_type_node = promote_type (string_type_node);
753 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
754 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
755 exception_type_node = lookup_class (get_identifier ("java.lang.Exception"));
756 runtime_exception_type_node =
757 lookup_class (get_identifier ("java.lang.RuntimeException"));
758 error_exception_type_node =
759 lookup_class (get_identifier ("java.lang.Error"));
761 rawdata_ptr_type_node
762 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
764 add_predefined_file (get_identifier ("java/lang/Class.java"));
765 add_predefined_file (get_identifier ("java/lang/Error.java"));
766 add_predefined_file (get_identifier ("java/lang/Object.java"));
767 add_predefined_file (get_identifier ("java/lang/RuntimeException.java"));
768 add_predefined_file (get_identifier ("java/lang/String.java"));
769 add_predefined_file (get_identifier ("java/lang/Throwable.java"));
770 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
771 add_predefined_file (get_identifier ("java/lang/Exception.java"));
772 add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java"));
773 add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java"));
775 methodtable_type = make_node (RECORD_TYPE);
776 layout_type (methodtable_type);
777 build_decl (BUILTINS_LOCATION,
778 TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
779 methodtable_ptr_type = build_pointer_type (methodtable_type);
781 TYPE_identifier_node = get_identifier ("TYPE");
782 init_identifier_node = get_identifier ("<init>");
783 clinit_identifier_node = get_identifier ("<clinit>");
784 void_signature_node = get_identifier ("()V");
785 finalize_identifier_node = get_identifier ("finalize");
786 this_identifier_node = get_identifier ("this");
788 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
789 java_io_serializable_identifier_node =
790 get_identifier ("java.io.Serializable");
792 /* for lack of a better place to put this stub call */
793 init_expr_processing();
795 constants_type_node = make_node (RECORD_TYPE);
796 PUSH_FIELD (input_location,
797 constants_type_node, field, "size", unsigned_int_type_node);
798 PUSH_FIELD (input_location,
799 constants_type_node, field, "tags", ptr_type_node);
800 PUSH_FIELD (input_location,
801 constants_type_node, field, "data", ptr_type_node);
802 constants_data_field_decl_node = field;
803 FINISH_RECORD (constants_type_node);
804 build_decl (BUILTINS_LOCATION,
805 TYPE_DECL, get_identifier ("constants"), constants_type_node);
807 access_flags_type_node = unsigned_short_type_node;
809 dtable_type = make_node (RECORD_TYPE);
810 dtable_ptr_type = build_pointer_type (dtable_type);
812 otable_type = build_array_type (integer_type_node,
813 one_elt_array_domain_type);
814 TYPE_NONALIASED_COMPONENT (otable_type) = 1;
815 otable_ptr_type = build_pointer_type (otable_type);
817 PUSH_FIELD (input_location,
818 object_type_node, field, "vtable", dtable_ptr_type);
819 DECL_FCONTEXT (field) = object_type_node;
820 TYPE_VFIELD (object_type_node) = field;
822 /* This isn't exactly true, but it is what we have in the source.
823 There is an unresolved issue here, which is whether the vtable
824 should be marked by the GC. */
825 if (! flag_hash_synchronization)
826 PUSH_FIELD (input_location, object_type_node, field, "sync_info",
827 build_pointer_type (object_type_node));
828 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = DECL_CHAIN (t))
829 FIELD_PRIVATE (t) = 1;
830 FINISH_RECORD (object_type_node);
832 field_type_node = make_node (RECORD_TYPE);
833 field_ptr_type_node = build_pointer_type (field_type_node);
834 method_type_node = make_node (RECORD_TYPE);
835 method_ptr_type_node = build_pointer_type (method_type_node);
837 set_super_info (0, class_type_node, object_type_node, 0);
838 set_super_info (0, string_type_node, object_type_node, 0);
839 class_ptr_type = build_pointer_type (class_type_node);
841 PUSH_FIELD (input_location,
842 class_type_node, field, "next_or_version", class_ptr_type);
843 PUSH_FIELD (input_location,
844 class_type_node, field, "name", utf8const_ptr_type);
845 PUSH_FIELD (input_location,
846 class_type_node, field, "accflags", access_flags_type_node);
847 PUSH_FIELD (input_location,
848 class_type_node, field, "superclass", class_ptr_type);
849 PUSH_FIELD (input_location,
850 class_type_node, field, "constants", constants_type_node);
851 constants_field_decl_node = field;
852 PUSH_FIELD (input_location,
853 class_type_node, field, "methods", method_ptr_type_node);
854 PUSH_FIELD (input_location,
855 class_type_node, field, "method_count", short_type_node);
856 PUSH_FIELD (input_location,
857 class_type_node, field, "vtable_method_count", short_type_node);
858 PUSH_FIELD (input_location,
859 class_type_node, field, "fields", field_ptr_type_node);
860 PUSH_FIELD (input_location,
861 class_type_node, field, "size_in_bytes", int_type_node);
862 PUSH_FIELD (input_location,
863 class_type_node, field, "field_count", short_type_node);
864 PUSH_FIELD (input_location,
865 class_type_node, field, "static_field_count", short_type_node);
866 PUSH_FIELD (input_location,
867 class_type_node, field, "vtable", dtable_ptr_type);
868 PUSH_FIELD (input_location,
869 class_type_node, field, "otable", otable_ptr_type);
870 PUSH_FIELD (input_location,
871 class_type_node, field, "otable_syms",
872 symbols_array_ptr_type);
873 PUSH_FIELD (input_location,
874 class_type_node, field, "atable", atable_ptr_type);
875 PUSH_FIELD (input_location,
876 class_type_node, field, "atable_syms",
877 symbols_array_ptr_type);
878 PUSH_FIELD (input_location,
879 class_type_node, field, "itable", itable_ptr_type);
880 PUSH_FIELD (input_location, class_type_node, field, "itable_syms",
881 symbols_array_ptr_type);
882 PUSH_FIELD (input_location,
883 class_type_node, field, "catch_classes", ptr_type_node);
884 PUSH_FIELD (input_location, class_type_node, field, "interfaces",
885 build_pointer_type (class_ptr_type));
886 PUSH_FIELD (input_location, class_type_node, field, "loader", ptr_type_node);
887 PUSH_FIELD (input_location,
888 class_type_node, field, "interface_count", short_type_node);
889 PUSH_FIELD (input_location, class_type_node, field, "state", byte_type_node);
890 PUSH_FIELD (input_location, class_type_node, field, "thread", ptr_type_node);
891 PUSH_FIELD (input_location,
892 class_type_node, field, "depth", short_type_node);
893 PUSH_FIELD (input_location,
894 class_type_node, field, "ancestors", ptr_type_node);
895 PUSH_FIELD (input_location, class_type_node, field, "idt", ptr_type_node);
896 PUSH_FIELD (input_location,
897 class_type_node, field, "arrayclass", ptr_type_node);
898 PUSH_FIELD (input_location,
899 class_type_node, field, "protectionDomain", ptr_type_node);
900 PUSH_FIELD (input_location,
901 class_type_node, field, "assertion_table", ptr_type_node);
902 PUSH_FIELD (input_location,
903 class_type_node, field, "hack_signers", ptr_type_node);
904 PUSH_FIELD (input_location, class_type_node, field, "chain", ptr_type_node);
905 PUSH_FIELD (input_location,
906 class_type_node, field, "aux_info", ptr_type_node);
907 PUSH_FIELD (input_location, class_type_node, field, "engine", ptr_type_node);
908 PUSH_FIELD (input_location,
909 class_type_node, field, "reflection_data", ptr_type_node);
910 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = DECL_CHAIN (t))
911 FIELD_PRIVATE (t) = 1;
912 push_super_field (class_type_node, object_type_node);
914 FINISH_RECORD (class_type_node);
915 build_decl (BUILTINS_LOCATION,
916 TYPE_DECL, get_identifier ("Class"), class_type_node);
918 field_info_union_node = make_node (UNION_TYPE);
919 PUSH_FIELD (input_location,
920 field_info_union_node, field, "boffset", int_type_node);
921 PUSH_FIELD (input_location,
922 field_info_union_node, field, "addr", ptr_type_node);
923 layout_type (field_info_union_node);
925 PUSH_FIELD (input_location,
926 field_type_node, field, "name", utf8const_ptr_type);
927 PUSH_FIELD (input_location, field_type_node, field, "type", class_ptr_type);
928 PUSH_FIELD (input_location,
929 field_type_node, field, "accflags", access_flags_type_node);
930 PUSH_FIELD (input_location,
931 field_type_node, field, "bsize", unsigned_short_type_node);
932 PUSH_FIELD (input_location,
933 field_type_node, field, "info", field_info_union_node);
934 FINISH_RECORD (field_type_node);
935 build_decl (BUILTINS_LOCATION,
936 TYPE_DECL, get_identifier ("Field"), field_type_node);
938 nativecode_ptr_array_type_node
939 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
941 PUSH_FIELD (input_location,
942 dtable_type, field, "class", class_ptr_type);
943 PUSH_FIELD (input_location,
944 dtable_type, field, "methods", nativecode_ptr_array_type_node);
945 FINISH_RECORD (dtable_type);
946 build_decl (BUILTINS_LOCATION,
947 TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
949 jexception_type = make_node (RECORD_TYPE);
950 PUSH_FIELD (input_location,
951 jexception_type, field, "start_pc", ptr_type_node);
952 PUSH_FIELD (input_location, jexception_type, field, "end_pc", ptr_type_node);
953 PUSH_FIELD (input_location,
954 jexception_type, field, "handler_pc", ptr_type_node);
955 PUSH_FIELD (input_location,
956 jexception_type, field, "catch_type", class_ptr_type);
957 FINISH_RECORD (jexception_type);
958 build_decl (BUILTINS_LOCATION,
959 TYPE_DECL, get_identifier ("jexception"), field_type_node);
960 jexception_ptr_type = build_pointer_type (jexception_type);
962 lineNumberEntry_type = make_node (RECORD_TYPE);
963 PUSH_FIELD (input_location,
964 lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
965 PUSH_FIELD (input_location,
966 lineNumberEntry_type, field, "start_pc", ptr_type_node);
967 FINISH_RECORD (lineNumberEntry_type);
969 lineNumbers_type = make_node (RECORD_TYPE);
970 PUSH_FIELD (input_location,
971 lineNumbers_type, field, "length", unsigned_int_type_node);
972 FINISH_RECORD (lineNumbers_type);
974 PUSH_FIELD (input_location,
975 method_type_node, field, "name", utf8const_ptr_type);
976 PUSH_FIELD (input_location,
977 method_type_node, field, "signature", utf8const_ptr_type);
978 PUSH_FIELD (input_location,
979 method_type_node, field, "accflags", access_flags_type_node);
980 PUSH_FIELD (input_location,
981 method_type_node, field, "index", unsigned_short_type_node);
982 PUSH_FIELD (input_location,
983 method_type_node, field, "ncode", nativecode_ptr_type_node);
984 PUSH_FIELD (input_location,
985 method_type_node, field, "throws", ptr_type_node);
986 FINISH_RECORD (method_type_node);
987 build_decl (BUILTINS_LOCATION,
988 TYPE_DECL, get_identifier ("Method"), method_type_node);
990 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
992 t = tree_cons (NULL_TREE, class_ptr_type, endlink);
993 alloc_object_node = add_builtin_function ("_Jv_AllocObject",
994 build_function_type (ptr_type_node, t),
995 0, NOT_BUILT_IN, NULL, NULL_TREE);
996 DECL_IS_MALLOC (alloc_object_node) = 1;
997 alloc_no_finalizer_node =
998 add_builtin_function ("_Jv_AllocObjectNoFinalizer",
999 build_function_type (ptr_type_node, t),
1000 0, NOT_BUILT_IN, NULL, NULL_TREE);
1001 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
1003 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
1004 soft_initclass_node = add_builtin_function ("_Jv_InitClass",
1005 build_function_type (void_type_node,
1007 0, NOT_BUILT_IN, NULL, NULL_TREE);
1008 t = tree_cons (NULL_TREE, class_ptr_type,
1009 tree_cons (NULL_TREE, int_type_node, endlink));
1010 soft_resolvepoolentry_node
1011 = add_builtin_function ("_Jv_ResolvePoolEntry",
1012 build_function_type (ptr_type_node, t),
1013 0,NOT_BUILT_IN, NULL, NULL_TREE);
1014 DECL_PURE_P (soft_resolvepoolentry_node) = 1;
1015 throw_node = add_builtin_function ("_Jv_Throw",
1016 build_function_type (void_type_node, t),
1017 0, NOT_BUILT_IN, NULL, NULL_TREE);
1018 /* Mark throw_nodes as `noreturn' functions with side effects. */
1019 TREE_THIS_VOLATILE (throw_node) = 1;
1020 TREE_SIDE_EFFECTS (throw_node) = 1;
1022 t = build_function_type (void_type_node, tree_cons (NULL_TREE, ptr_type_node,
1024 soft_monitorenter_node
1025 = add_builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
1027 soft_monitorexit_node
1028 = add_builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
1031 t = tree_cons (NULL_TREE, ptr_type_node,
1032 tree_cons (NULL_TREE, int_type_node, endlink));
1034 = add_builtin_function ("_Jv_NewPrimArray",
1035 build_function_type (ptr_type_node, t),
1036 0, NOT_BUILT_IN, NULL, NULL_TREE);
1037 DECL_IS_MALLOC (soft_newarray_node) = 1;
1039 t = tree_cons (NULL_TREE, int_type_node,
1040 tree_cons (NULL_TREE, class_ptr_type,
1041 tree_cons (NULL_TREE, object_ptr_type_node,
1044 = add_builtin_function ("_Jv_NewObjectArray",
1045 build_function_type (ptr_type_node, t),
1046 0, NOT_BUILT_IN, NULL, NULL_TREE);
1047 DECL_IS_MALLOC (soft_anewarray_node) = 1;
1049 /* There is no endlink here because _Jv_NewMultiArray is a varargs
1051 t = tree_cons (NULL_TREE, ptr_type_node,
1052 tree_cons (NULL_TREE, int_type_node, NULL_TREE));
1053 soft_multianewarray_node
1054 = add_builtin_function ("_Jv_NewMultiArray",
1055 build_function_type (ptr_type_node, t),
1056 0, NOT_BUILT_IN, NULL, NULL_TREE);
1057 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
1059 t = build_function_type (void_type_node,
1060 tree_cons (NULL_TREE, int_type_node, endlink));
1061 soft_badarrayindex_node
1062 = add_builtin_function ("_Jv_ThrowBadArrayIndex", t,
1063 0, NOT_BUILT_IN, NULL, NULL_TREE);
1064 /* Mark soft_badarrayindex_node as a `noreturn' function with side
1066 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
1067 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
1069 soft_nullpointer_node
1070 = add_builtin_function ("_Jv_ThrowNullPointerException",
1071 build_function_type (void_type_node, endlink),
1072 0, NOT_BUILT_IN, NULL, NULL_TREE);
1073 /* Mark soft_nullpointer_node as a `noreturn' function with side
1075 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
1076 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
1078 soft_abstractmethod_node
1079 = add_builtin_function ("_Jv_ThrowAbstractMethodError",
1080 build_function_type (void_type_node, endlink),
1081 0, NOT_BUILT_IN, NULL, NULL_TREE);
1082 /* Mark soft_abstractmethod_node as a `noreturn' function with side
1084 TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1;
1085 TREE_SIDE_EFFECTS (soft_abstractmethod_node) = 1;
1087 soft_nosuchfield_node
1088 = add_builtin_function ("_Jv_ThrowNoSuchFieldError",
1089 build_function_type (void_type_node, endlink),
1090 0, NOT_BUILT_IN, NULL, NULL_TREE);
1091 /* Mark soft_nosuchfield_node as a `noreturn' function with side
1093 TREE_THIS_VOLATILE (soft_nosuchfield_node) = 1;
1094 TREE_SIDE_EFFECTS (soft_nosuchfield_node) = 1;
1096 t = tree_cons (NULL_TREE, class_ptr_type,
1097 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
1099 = add_builtin_function ("_Jv_CheckCast",
1100 build_function_type (ptr_type_node, t),
1101 0, NOT_BUILT_IN, NULL, NULL_TREE);
1102 t = tree_cons (NULL_TREE, object_ptr_type_node,
1103 tree_cons (NULL_TREE, class_ptr_type, endlink));
1104 soft_instanceof_node
1105 = add_builtin_function ("_Jv_IsInstanceOf",
1106 build_function_type (boolean_type_node, t),
1107 0, NOT_BUILT_IN, NULL, NULL_TREE);
1108 DECL_PURE_P (soft_instanceof_node) = 1;
1109 t = tree_cons (NULL_TREE, object_ptr_type_node,
1110 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
1111 soft_checkarraystore_node
1112 = add_builtin_function ("_Jv_CheckArrayStore",
1113 build_function_type (void_type_node, t),
1114 0, NOT_BUILT_IN, NULL, NULL_TREE);
1115 t = tree_cons (NULL_TREE, ptr_type_node,
1116 tree_cons (NULL_TREE, ptr_type_node,
1117 tree_cons (NULL_TREE, int_type_node, endlink)));
1118 soft_lookupinterfacemethod_node
1119 = add_builtin_function ("_Jv_LookupInterfaceMethodIdx",
1120 build_function_type (ptr_type_node, t),
1121 0, NOT_BUILT_IN, NULL, NULL_TREE);
1122 DECL_PURE_P (soft_lookupinterfacemethod_node) = 1;
1123 t = tree_cons (NULL_TREE, ptr_type_node,
1124 tree_cons (NULL_TREE, ptr_type_node,
1125 tree_cons (NULL_TREE, ptr_type_node, endlink)));
1126 soft_lookupinterfacemethodbyname_node
1127 = add_builtin_function ("_Jv_LookupInterfaceMethod",
1128 build_function_type (ptr_type_node, t),
1129 0, NOT_BUILT_IN, NULL, NULL_TREE);
1130 t = tree_cons (NULL_TREE, object_ptr_type_node,
1131 tree_cons (NULL_TREE, ptr_type_node,
1132 tree_cons (NULL_TREE, ptr_type_node,
1133 tree_cons (NULL_TREE, int_type_node,
1135 soft_lookupjnimethod_node
1136 = add_builtin_function ("_Jv_LookupJNIMethod",
1137 build_function_type (ptr_type_node, t),
1138 0, NOT_BUILT_IN, NULL, NULL_TREE);
1139 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
1140 soft_getjnienvnewframe_node
1141 = add_builtin_function ("_Jv_GetJNIEnvNewFrame",
1142 build_function_type (ptr_type_node, t),
1143 0, NOT_BUILT_IN, NULL, NULL_TREE);
1144 soft_jnipopsystemframe_node
1145 = add_builtin_function ("_Jv_JNI_PopSystemFrame",
1146 build_function_type (void_type_node, t),
1147 0, NOT_BUILT_IN, NULL, NULL_TREE);
1149 t = tree_cons (NULL_TREE, object_ptr_type_node, endlink);
1151 = add_builtin_function ("_Jv_UnwrapJNIweakReference",
1152 build_function_type (object_ptr_type_node, t),
1153 0, NOT_BUILT_IN, NULL, NULL_TREE);
1155 t = tree_cons (NULL_TREE, int_type_node,
1156 tree_cons (NULL_TREE, int_type_node, endlink));
1158 = add_builtin_function ("_Jv_divI",
1159 build_function_type (int_type_node, t),
1160 0, NOT_BUILT_IN, NULL, NULL_TREE);
1163 = add_builtin_function ("_Jv_remI",
1164 build_function_type (int_type_node, t),
1165 0, NOT_BUILT_IN, NULL, NULL_TREE);
1167 t = tree_cons (NULL_TREE, long_type_node,
1168 tree_cons (NULL_TREE, long_type_node, endlink));
1170 = add_builtin_function ("_Jv_divJ",
1171 build_function_type (long_type_node, t),
1172 0, NOT_BUILT_IN, NULL, NULL_TREE);
1175 = add_builtin_function ("_Jv_remJ",
1176 build_function_type (long_type_node, t),
1177 0, NOT_BUILT_IN, NULL, NULL_TREE);
1179 initialize_builtins ();
1181 soft_fmod_node = built_in_decls[BUILT_IN_FMOD];
1187 /* Look up NAME in the current binding level and its superiors
1188 in the namespace of variables, functions and typedefs.
1189 Return a ..._DECL node of some kind representing its definition,
1190 or return 0 if it is undefined. */
1193 lookup_name (tree name)
1196 if (current_binding_level != global_binding_level
1197 && IDENTIFIER_LOCAL_VALUE (name))
1198 val = IDENTIFIER_LOCAL_VALUE (name);
1200 val = IDENTIFIER_GLOBAL_VALUE (name);
1204 /* Similar to `lookup_name' but look only at current binding level and
1205 the previous one if it's the parameter level. */
1208 lookup_name_current_level (tree name)
1212 if (current_binding_level == global_binding_level)
1213 return IDENTIFIER_GLOBAL_VALUE (name);
1215 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
1218 for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
1219 if (DECL_NAME (t) == name)
1225 /* Record a decl-node X as belonging to the current lexical scope.
1226 Check for errors (such as an incompatible declaration for the same
1227 name already seen in the same scope).
1229 Returns either X or an old decl for the same name.
1230 If an old decl is returned, it may have been smashed
1231 to agree with what X says. */
1237 tree name = DECL_NAME (x);
1238 struct binding_level *b = current_binding_level;
1240 if (TREE_CODE (x) != TYPE_DECL)
1241 DECL_CONTEXT (x) = current_function_decl;
1244 t = lookup_name_current_level (name);
1245 if (t != 0 && t == error_mark_node)
1246 /* error_mark_node is 0 for a while during initialization! */
1249 error ("%q+D used prior to declaration", x);
1252 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1253 to point to the TYPE_DECL.
1254 Since Java does not have typedefs, a type can only have
1255 one (true) name, given by a class, interface, or builtin. */
1256 if (TREE_CODE (x) == TYPE_DECL
1257 && TYPE_NAME (TREE_TYPE (x)) == 0
1258 && TREE_TYPE (x) != error_mark_node)
1260 TYPE_NAME (TREE_TYPE (x)) = x;
1261 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1264 /* This name is new in its binding level.
1265 Install the new declaration and return it. */
1266 if (b == global_binding_level)
1268 /* Install a global value. */
1270 IDENTIFIER_GLOBAL_VALUE (name) = x;
1274 /* Here to install a non-global value. */
1275 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1276 IDENTIFIER_LOCAL_VALUE (name) = x;
1278 /* If storing a local value, there may already be one (inherited).
1279 If so, record it for restoration when this binding level ends. */
1281 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1285 /* Put decls on list in reverse order.
1286 We will reverse them later if necessary. */
1287 DECL_CHAIN (x) = b->names;
1294 pushdecl_force_head (tree x)
1296 current_binding_level->names = x;
1299 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1302 pushdecl_top_level (tree x)
1305 struct binding_level *b = current_binding_level;
1307 current_binding_level = global_binding_level;
1309 current_binding_level = b;
1313 /* Like pushdecl, only it places X in FUNCTION_BINDING_LEVEL, if appropriate. */
1316 pushdecl_function_level (tree x)
1319 struct binding_level *b = current_binding_level;
1321 current_binding_level = function_binding_level;
1323 current_binding_level = b;
1327 /* Nonzero if we are currently in the global binding level. */
1330 global_bindings_p (void)
1332 return current_binding_level == global_binding_level;
1335 /* Return the list of declarations of the current level.
1336 Note that this list is in reverse order unless/until
1337 you nreverse it; and when you do nreverse it, you must
1338 store the result back using `storedecls' or you will lose. */
1343 return current_binding_level->names;
1346 /* Create a new `struct binding_level'. */
1348 static struct binding_level *
1349 make_binding_level (void)
1352 return ggc_alloc_cleared_binding_level ();
1356 pushlevel (int unused ATTRIBUTE_UNUSED)
1358 struct binding_level *newlevel = NULL_BINDING_LEVEL;
1360 /* Reuse or create a struct for this binding level. */
1362 if (free_binding_level)
1364 newlevel = free_binding_level;
1365 free_binding_level = free_binding_level->level_chain;
1369 newlevel = make_binding_level ();
1372 /* Add this level to the front of the chain (stack) of levels that
1375 *newlevel = clear_binding_level;
1376 newlevel->level_chain = current_binding_level;
1377 newlevel->loc = input_location;
1378 current_binding_level = newlevel;
1379 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1380 newlevel->binding_depth = binding_depth;
1382 fprintf (stderr, "push %s level %p pc %d\n",
1383 (is_class_level) ? "class" : "block", newlevel, current_pc);
1386 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1389 /* Exit a binding level.
1390 Pop the level off, and restore the state of the identifier-decl mappings
1391 that were in effect when this level was entered.
1393 If KEEP is nonzero, this level had explicit declarations, so
1394 and create a "block" (a BLOCK node) for the level
1395 to record its declarations and subblocks for symbol table output.
1397 If FUNCTIONBODY is nonzero, this level is the body of a function,
1398 so create a block as if KEEP were set and also clear out all
1401 If REVERSE is nonzero, reverse the order of decls before putting
1402 them into the BLOCK. */
1405 poplevel (int keep, int reverse, int functionbody)
1408 /* The chain of decls was accumulated in reverse order.
1409 Put it into forward order, just for cleanliness. */
1411 tree subblocks = current_binding_level->blocks;
1416 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1419 if (current_binding_level->end_pc != LARGEST_PC)
1420 fprintf (stderr, "pop %s level %p pc %d (end pc %d)\n",
1421 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1422 current_binding_level->end_pc);
1424 fprintf (stderr, "pop %s level %p pc %d\n",
1425 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1426 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1428 /* Get the decls in the order they were written.
1429 Usually current_binding_level->names is in reverse order.
1430 But parameter decls were previously put in forward order. */
1433 current_binding_level->names
1434 = decls = nreverse (current_binding_level->names);
1436 decls = current_binding_level->names;
1438 for (decl = decls; decl; decl = DECL_CHAIN (decl))
1439 if (TREE_CODE (decl) == VAR_DECL
1440 && DECL_LANG_SPECIFIC (decl) != NULL
1441 && DECL_LOCAL_SLOT_NUMBER (decl))
1442 LOCAL_VAR_OUT_OF_SCOPE_P (decl) = 1;
1444 /* If there were any declarations in that level,
1445 or if this level is a function body,
1446 create a BLOCK to record them for the life of this function. */
1449 if (keep || functionbody)
1451 block = make_node (BLOCK);
1452 TREE_TYPE (block) = void_type_node;
1455 if (current_binding_level->exception_range)
1456 expand_end_java_handler (current_binding_level->exception_range);
1460 /* If any statements have been generated at this level, create a
1461 BIND_EXPR to hold them and copy the variables to it. This
1462 only applies to the bytecode compiler. */
1463 if (current_binding_level->stmts)
1466 tree *var = &BLOCK_VARS (block);
1468 /* Copy decls from names list, ignoring labels. */
1471 tree next = DECL_CHAIN (decl);
1472 if (TREE_CODE (decl) != LABEL_DECL)
1475 var = &DECL_CHAIN (decl);
1481 bind = build3 (BIND_EXPR, TREE_TYPE (block), BLOCK_VARS (block),
1482 BLOCK_EXPR_BODY (block), block);
1483 BIND_EXPR_BODY (bind) = current_binding_level->stmts;
1485 if (BIND_EXPR_BODY (bind)
1486 && TREE_SIDE_EFFECTS (BIND_EXPR_BODY (bind)))
1487 TREE_SIDE_EFFECTS (bind) = 1;
1489 /* FIXME: gimplifier brain damage. */
1490 if (BIND_EXPR_BODY (bind) == NULL)
1491 BIND_EXPR_BODY (bind) = build_java_empty_stmt ();
1493 SET_EXPR_LOCATION (bind, current_binding_level->loc);
1495 current_binding_level->stmts = NULL;
1499 BLOCK_VARS (block) = decls;
1501 BLOCK_SUBBLOCKS (block) = subblocks;
1504 /* In each subblock, record that this is its superior. */
1506 for (link = subblocks; link; link = TREE_CHAIN (link))
1507 BLOCK_SUPERCONTEXT (link) = block;
1509 /* Clear out the meanings of the local variables of this level. */
1511 for (link = decls; link; link = DECL_CHAIN (link))
1513 tree name = DECL_NAME (link);
1514 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1516 /* If the ident. was used or addressed via a local extern decl,
1517 don't forget that fact. */
1518 if (DECL_EXTERNAL (link))
1520 if (TREE_USED (link))
1521 TREE_USED (name) = 1;
1522 if (TREE_ADDRESSABLE (link))
1523 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1525 IDENTIFIER_LOCAL_VALUE (name) = 0;
1529 /* Restore all name-meanings of the outer levels
1530 that were shadowed by this level. */
1532 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1533 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1535 /* If the level being exited is the top level of a function,
1536 check over all the labels, and clear out the current
1537 (function local) meanings of their names. */
1541 /* If this is the top level block of a function,
1542 the vars are the function's parameters.
1543 Don't leave them in the BLOCK because they are
1544 found in the FUNCTION_DECL instead. */
1546 BLOCK_VARS (block) = 0;
1549 /* Pop the current level, and free the structure for reuse. */
1552 struct binding_level *level = current_binding_level;
1553 current_binding_level = current_binding_level->level_chain;
1555 level->level_chain = free_binding_level;
1556 free_binding_level = level;
1559 /* Dispose of the block that we just made inside some higher level. */
1562 DECL_INITIAL (current_function_decl) = block;
1563 DECL_SAVED_TREE (current_function_decl) = bind;
1569 current_binding_level->blocks
1570 = chainon (current_binding_level->blocks, block);
1572 /* If we did not make a block for the level just exited,
1573 any blocks made for inner levels
1574 (since they cannot be recorded as subblocks in that level)
1575 must be carried forward so they will later become subblocks
1576 of something else. */
1578 current_binding_level->blocks
1579 = chainon (current_binding_level->blocks, subblocks);
1582 java_add_stmt (bind);
1586 TREE_USED (block) = 1;
1591 maybe_pushlevels (int pc)
1593 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1597 while (pending_local_decls != NULL_TREE &&
1598 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1600 tree *ptr = &pending_local_decls;
1601 tree decl = *ptr, next;
1602 int end_pc = DECL_LOCAL_END_PC (decl);
1604 while (*ptr != NULL_TREE
1605 && DECL_LOCAL_START_PC (*ptr) <= pc
1606 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1607 ptr = &DECL_CHAIN (*ptr);
1608 pending_local_decls = *ptr;
1611 /* Force non-nested range to be nested in current range by
1612 truncating variable lifetimes. */
1613 if (end_pc > current_binding_level->end_pc)
1616 end_pc = current_binding_level->end_pc;
1617 for (t = decl; t != NULL_TREE; t = DECL_CHAIN (t))
1618 DECL_LOCAL_END_PC (t) = end_pc;
1621 maybe_start_try (pc, end_pc);
1625 current_binding_level->end_pc = end_pc;
1626 current_binding_level->start_pc = pc;
1627 current_binding_level->names = NULL;
1628 for ( ; decl != NULL_TREE; decl = next)
1630 int index = DECL_LOCAL_SLOT_NUMBER (decl);
1632 next = DECL_CHAIN (decl);
1633 push_jvm_slot (index, decl);
1636 = find_local_variable (index, TREE_TYPE (decl), pc);
1637 if (TREE_CODE (TREE_TYPE (base_decl)) == POINTER_TYPE)
1638 base_decl = TREE_VEC_ELT (base_decl_map, index);
1639 SET_DECL_VALUE_EXPR (decl, base_decl);
1640 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1644 maybe_start_try (pc, 0);
1648 maybe_poplevels (int pc)
1650 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1654 /* FIXME: I'm pretty sure that this is wrong. Variable scopes are
1655 inclusive, so a variable is live if pc == end_pc. Here, we
1656 terminate a range if the current pc is equal to the end of the
1657 range, and this is *before* we have generated code for the
1658 instruction at end_pc. We're closing a binding level one
1659 instruction too early.*/
1660 while (current_binding_level->end_pc <= pc)
1664 /* Terminate any binding which began during the range beginning at
1665 start_pc. This tidies up improperly nested local variable ranges
1666 and exception handlers; a variable declared within an exception
1667 range is forcibly terminated when that exception ends. */
1670 force_poplevels (int start_pc)
1672 while (current_binding_level->start_pc > start_pc)
1674 if (pedantic && current_binding_level->start_pc > start_pc)
1675 warning (0, "In %+D: overlapped variable and exception ranges at %d",
1676 current_function_decl,
1677 current_binding_level->start_pc);
1682 /* integrate_decl_tree calls this function. */
1685 java_dup_lang_specific_decl (tree node)
1688 struct lang_decl *x;
1690 if (!DECL_LANG_SPECIFIC (node))
1693 lang_decl_size = sizeof (struct lang_decl);
1694 x = ggc_alloc_lang_decl (lang_decl_size);
1695 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1696 DECL_LANG_SPECIFIC (node) = x;
1700 give_name_to_locals (JCF *jcf)
1702 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1703 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1705 pending_local_decls = NULL_TREE;
1709 n = JCF_readu2 (jcf);
1710 for (i = 0; i < n; i++)
1712 int start_pc = JCF_readu2 (jcf);
1713 int length = JCF_readu2 (jcf);
1714 int name_index = JCF_readu2 (jcf);
1715 int signature_index = JCF_readu2 (jcf);
1716 int slot = JCF_readu2 (jcf);
1717 tree name = get_name_constant (jcf, name_index);
1718 tree type = parse_signature (jcf, signature_index);
1719 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1721 && length == DECL_CODE_LENGTH (current_function_decl))
1723 tree decl = TREE_VEC_ELT (decl_map, slot);
1724 DECL_NAME (decl) = name;
1725 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1726 warning (0, "bad type in parameter debug info");
1731 int end_pc = start_pc + length;
1732 tree decl = build_decl (input_location, VAR_DECL, name, type);
1733 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1735 warning (0, "bad PC range for debug info for local %q+D",
1737 end_pc = DECL_CODE_LENGTH (current_function_decl);
1740 /* Adjust start_pc if necessary so that the local's first
1741 store operation will use the relevant DECL as a
1742 destination. Fore more information, read the leading
1743 comments for expr.c:maybe_adjust_start_pc. */
1744 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1746 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1747 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1748 DECL_LOCAL_START_PC (decl) = start_pc;
1749 DECL_LOCAL_END_PC (decl) = end_pc;
1751 /* Now insert the new decl in the proper place in
1752 pending_local_decls. We are essentially doing an insertion sort,
1753 which works fine, since the list input will normally already
1755 ptr = &pending_local_decls;
1756 while (*ptr != NULL_TREE
1757 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1758 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1759 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1760 ptr = &DECL_CHAIN (*ptr);
1761 DECL_CHAIN (decl) = *ptr;
1766 pending_local_decls = nreverse (pending_local_decls);
1768 /* Fill in default names for the parameters. */
1769 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1770 parm != NULL_TREE; parm = DECL_CHAIN (parm), i++)
1772 if (DECL_NAME (parm) == NULL_TREE)
1774 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1776 DECL_NAME (parm) = get_identifier ("this");
1780 sprintf (buffer, "ARG_%d", arg_i);
1781 DECL_NAME (parm) = get_identifier (buffer);
1788 build_result_decl (tree fndecl)
1790 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1791 tree result = DECL_RESULT (fndecl);
1794 result = build_decl (DECL_SOURCE_LOCATION (fndecl),
1795 RESULT_DECL, NULL_TREE, restype);
1796 DECL_ARTIFICIAL (result) = 1;
1797 DECL_IGNORED_P (result) = 1;
1798 DECL_CONTEXT (result) = fndecl;
1799 DECL_RESULT (fndecl) = result;
1805 start_java_method (tree fndecl)
1812 current_function_decl = fndecl;
1813 announce_function (fndecl);
1815 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1816 decl_map = make_tree_vec (i);
1817 base_decl_map = make_tree_vec (i);
1818 type_map = XRESIZEVEC (tree, type_map, i);
1820 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1821 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1823 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1824 pushlevel (1); /* Push parameters. */
1826 ptr = &DECL_ARGUMENTS (fndecl);
1827 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1828 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1830 tree parm_name = NULL_TREE, parm_decl;
1831 tree parm_type = TREE_VALUE (tem);
1832 gcc_assert (i < DECL_MAX_LOCALS (fndecl));
1834 parm_decl = build_decl (input_location, PARM_DECL, parm_name, parm_type);
1835 DECL_CONTEXT (parm_decl) = fndecl;
1836 if (targetm.calls.promote_prototypes (parm_type)
1837 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1838 && INTEGRAL_TYPE_P (parm_type))
1839 parm_type = integer_type_node;
1840 DECL_ARG_TYPE (parm_decl) = parm_type;
1843 ptr = &DECL_CHAIN (parm_decl);
1845 /* Add parm_decl to the decl_map. */
1846 push_jvm_slot (i, parm_decl);
1848 /* The this parameter of methods is artificial. */
1849 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE && i == 0)
1850 DECL_ARTIFICIAL (parm_decl) = 1;
1852 type_map[i] = TREE_TYPE (parm_decl);
1853 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1856 type_map[i] = void_type_node;
1860 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1862 while (i < DECL_MAX_LOCALS(fndecl))
1863 type_map[i++] = NULL_TREE;
1865 build_result_decl (fndecl);
1866 DECL_SOURCE_LOCATION (fndecl) = input_location;
1868 /* Push local variables. */
1871 function_binding_level = current_binding_level;
1875 end_java_method (void)
1877 tree fndecl = current_function_decl;
1879 /* pop out of function */
1882 /* pop out of its parameters */
1885 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1887 if (DECL_SAVED_TREE (fndecl))
1889 tree fbody, block_body;
1890 /* Before we check initialization, attached all class initialization
1891 variable to the block_body */
1892 fbody = DECL_SAVED_TREE (fndecl);
1893 block_body = BIND_EXPR_BODY (fbody);
1894 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (fndecl),
1895 attach_init_test_initialization_flags, block_body);
1898 finish_method (fndecl);
1900 current_function_decl = NULL_TREE;
1901 base_decl_map = NULL_TREE;
1904 /* Prepare a method for expansion. */
1907 finish_method (tree fndecl)
1909 tree *tp = &DECL_SAVED_TREE (fndecl);
1911 /* Wrap body of synchronized methods in a monitorenter,
1912 plus monitorexit cleanup. */
1913 if (METHOD_SYNCHRONIZED (fndecl))
1915 tree enter, exit, lock;
1916 if (METHOD_STATIC (fndecl))
1917 lock = build_class_ref (DECL_CONTEXT (fndecl));
1919 lock = DECL_ARGUMENTS (fndecl);
1920 BUILD_MONITOR_ENTER (enter, lock);
1921 BUILD_MONITOR_EXIT (exit, lock);
1922 *tp = build2 (COMPOUND_EXPR, void_type_node, enter,
1923 build2 (TRY_FINALLY_EXPR, void_type_node, *tp, exit));
1926 /* Convert function tree to GENERIC prior to inlining. */
1927 java_genericize (fndecl);
1929 /* Store the end of the function, so that we get good line number
1930 info for the epilogue. */
1931 if (DECL_STRUCT_FUNCTION (fndecl))
1932 set_cfun (DECL_STRUCT_FUNCTION (fndecl));
1934 allocate_struct_function (fndecl, false);
1935 cfun->function_end_locus = DECL_FUNCTION_LAST_LINE (fndecl);
1937 /* Defer inlining and expansion to the cgraph optimizers. */
1938 cgraph_finalize_function (fndecl, false);
1941 /* We pessimistically marked all methods and fields external until we
1942 knew what set of classes we were planning to compile. Now mark those
1943 associated with CLASS to be generated locally as not external. */
1946 java_mark_decl_local (tree decl)
1948 DECL_EXTERNAL (decl) = 0;
1950 #ifdef ENABLE_CHECKING
1951 /* Double check that we didn't pass the function to the callgraph early. */
1952 if (TREE_CODE (decl) == FUNCTION_DECL)
1953 gcc_assert (!cgraph_node (decl)->local.finalized);
1955 gcc_assert (!DECL_RTL_SET_P (decl));
1958 /* Given appropriate target support, G++ will emit hidden aliases for native
1959 methods. Using this hidden name is required for proper operation of
1960 _Jv_Method::ncode, but it doesn't hurt to use it everywhere. Look for
1961 proper target support, then mark the method for aliasing. */
1964 java_mark_cni_decl_local (tree decl)
1966 #if !defined(HAVE_GAS_HIDDEN) || !defined(ASM_OUTPUT_DEF)
1970 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
1971 DECL_LOCAL_CNI_METHOD_P (decl) = 1;
1973 /* Setting DECL_LOCAL_CNI_METHOD_P changes the behavior of the
1974 mangler. We might have already referenced this native method and
1975 therefore created its name, but even if we have it won't hurt.
1976 We'll just go via its externally visible name, rather than its
1977 hidden alias. However, we must force things so that the correct
1978 mangling is done. */
1980 if (DECL_ASSEMBLER_NAME_SET_P (decl))
1981 java_mangle_decl (decl);
1982 if (DECL_RTL_SET_P (decl))
1984 SET_DECL_RTL (decl, 0);
1985 make_decl_rtl (decl);
1989 /* Use the preceding two functions and mark all members of the class. */
1992 java_mark_class_local (tree klass)
1996 for (t = TYPE_FIELDS (klass); t ; t = DECL_CHAIN (t))
1997 if (FIELD_STATIC (t))
1999 if (DECL_EXTERNAL (t))
2000 VEC_safe_push (tree, gc, pending_static_fields, t);
2001 java_mark_decl_local (t);
2004 for (t = TYPE_METHODS (klass); t ; t = DECL_CHAIN (t))
2005 if (!METHOD_ABSTRACT (t))
2007 if (METHOD_NATIVE (t) && !flag_jni)
2008 java_mark_cni_decl_local (t);
2010 java_mark_decl_local (t);
2014 /* Add a statement to a compound_expr. */
2017 add_stmt_to_compound (tree existing, tree type, tree stmt)
2023 tree expr = build2 (COMPOUND_EXPR, type, existing, stmt);
2024 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (existing)
2025 | TREE_SIDE_EFFECTS (stmt);
2032 /* If this node is an expr, mark its input location. Called from
2036 set_input_location (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2037 void *data ATTRIBUTE_UNUSED)
2041 if (CAN_HAVE_LOCATION_P (t))
2043 if (EXPR_HAS_LOCATION(t))
2044 return t; /* Don't walk any further into this expr. */
2046 SET_EXPR_LOCATION (t, input_location);
2049 return NULL_TREE; /* Continue walking this expr. */
2052 /* Add a statement to the statement_list currently being constructed.
2053 If the statement_list is null, we don't create a singleton list.
2054 This is necessary because poplevel() assumes that adding a
2055 statement to a null statement_list returns the statement. */
2058 java_add_stmt (tree new_stmt)
2060 tree stmts = current_binding_level->stmts;
2061 tree_stmt_iterator i;
2064 walk_tree (&new_stmt, set_input_location, NULL, NULL);
2067 return current_binding_level->stmts = new_stmt;
2069 /* Force STMTS to be a statement_list. */
2070 if (TREE_CODE (stmts) != STATEMENT_LIST)
2072 tree t = make_node (STATEMENT_LIST);
2074 tsi_link_after (&i, stmts, TSI_CONTINUE_LINKING);
2078 i = tsi_last (stmts);
2079 tsi_link_after (&i, new_stmt, TSI_CONTINUE_LINKING);
2080 TREE_TYPE (stmts) = void_type_node;
2082 return current_binding_level->stmts = stmts;
2085 /* Add a variable to the current scope. */
2088 java_add_local_var (tree decl)
2090 tree *vars = ¤t_binding_level->names;
2092 DECL_CHAIN (decl) = next;
2094 DECL_CONTEXT (decl) = current_function_decl;
2095 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2099 /* Return a pointer to the compound_expr currently being
2105 return ¤t_binding_level->stmts;
2108 /* Register an exception range as belonging to the current binding
2109 level. There may only be one: if there are more, we'll create more
2110 binding levels. However, each range can have multiple handlers,
2111 and these are expanded when we call expand_end_java_handler(). */
2114 register_exception_range (struct eh_range *range, int pc, int end_pc)
2116 gcc_assert (! current_binding_level->exception_range);
2117 current_binding_level->exception_range = range;
2118 current_binding_level->end_pc = end_pc;
2119 current_binding_level->start_pc = pc;
2122 #include "gt-java-decl.h"