PR fortran/38718
[official-gcc.git] / gcc / java / decl.c
blob1e1db76dc3b6c7b0d15335bb94212902fa1cc542
1 /* Process declarations and variables for the GNU compiler for the
2 Java(TM) language.
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)
11 any later version.
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. */
28 #include "config.h"
29 #include "system.h"
30 #include "coretypes.h"
31 #include "tree.h"
32 #include "diagnostic-core.h"
33 #include "toplev.h"
34 #include "flags.h"
35 #include "java-tree.h"
36 #include "jcf.h"
37 #include "libfuncs.h"
38 #include "java-except.h"
39 #include "ggc.h"
40 #include "cgraph.h"
41 #include "tree-inline.h"
42 #include "target.h"
43 #include "version.h"
44 #include "tree-iterator.h"
45 #include "langhooks.h"
46 #include "cgraph.h"
48 #if defined (DEBUG_JAVA_BINDING_LEVELS)
49 extern void indent (void);
50 #endif
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
69 loader. */
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,
82 this must change). */
83 #define GCJ_CURRENT_BC_ABI_VERSION \
84 (4 * 100000 + 0 * 1000 + MINOR_BINARYCOMPAT_ABI_VERSION)
86 /* The ABI version number. */
87 tree gcj_abi_version;
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. */
112 static int uniq;
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;
131 int current_pc;
133 void
134 indent (void)
136 int i;
138 for (i = 0; i < binding_depth*2; i++)
139 putc (' ', stderr);
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. */
146 static bool
147 debug_variable_p (tree decl)
149 if (TREE_CODE (decl) == PARM_DECL)
150 return false;
152 if (LOCAL_SLOT_P (decl))
153 return false;
155 return true;
158 static tree
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;
175 return decl;
178 /* Find the best declaration based upon type. If 'decl' fits 'type' better
179 than 'best', return 'decl'. Otherwise return 'best'. */
181 static tree
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
206 new VAR_DECL.
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
211 NOP_EXPR.
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))
219 return decl;
222 return best;
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. */
230 tree
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
264 slot. */
265 if (! decl)
267 char buf[64];
268 tree name;
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
283 aliases. */
284 if (TREE_CODE (type) == POINTER_TYPE
285 && ! TREE_VEC_ELT (base_decl_map, index))
287 char buf[64];
288 tree name;
289 tree base_decl;
290 sprintf (buf, "#ref#%d#%d", index, uniq++);
291 name = get_identifier (buf);
292 base_decl
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;
300 return decl;
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
307 written to. */
309 static tree
310 java_replace_reference (tree var_decl, bool want_lvalue)
312 tree decl_type;
314 if (! base_decl_map)
315 return var_decl;
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);
328 if (! want_lvalue)
329 base_decl = build1 (NOP_EXPR, decl_type, base_decl);
331 return base_decl;
335 return var_decl;
338 /* Helper for java_genericize. */
340 tree
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),
360 new_lhs, new_rhs);
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);
370 *walk_subtrees = 0;
373 return NULL_TREE;
376 /* Same as find_local_index, except that INDEX is a stack index. */
378 tree
379 find_stack_slot (int index, tree type)
381 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
382 type, -1);
385 struct GTY(())
386 binding_level {
387 /* A chain of _DECL nodes for all variables, constants, functions,
388 * and typedef types. These are in the reverse of the order supplied.
390 tree names;
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). */
396 tree shadowed;
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. */
401 tree blocks;
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. */
407 int end_pc;
408 /* The bytecode PC that marks the start of this level. */
409 int start_pc;
411 /* The statements in this binding level. */
412 tree stmts;
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. */
421 source_location loc;
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 */
458 0, /* start_pc */
459 NULL, /* stmts */
460 NULL, /* exception_range */
461 0, /* binding_depth */
462 0, /* loc */
465 tree java_global_trees[JTI_MAX];
467 /* Build (and pushdecl) a "promoted type" for all standard
468 types shorter than int. */
470 static tree
471 push_promoted_type (const char *name, tree actual_type)
473 tree type = make_node (TREE_CODE (actual_type));
474 #if 1
475 tree in_min = TYPE_MIN_VALUE (int_type_node);
476 tree in_max = TYPE_MAX_VALUE (int_type_node);
477 #else
478 tree in_min = TYPE_MIN_VALUE (actual_type);
479 tree in_max = TYPE_MAX_VALUE (actual_type);
480 #endif
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);
487 layout_type (type);
488 pushdecl (build_decl (input_location,
489 TYPE_DECL, get_identifier (name), type));
490 return type;
493 /* Return tree that represents a vtable for a primitive array. */
494 static tree
495 create_primitive_vtable (const char *name)
497 tree r;
498 char buf[50];
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;
504 return r;
507 /* Parse the version string and compute the ABI version number. */
508 static void
509 parse_version (void)
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))
517 ++p;
518 gcc_assert (*p);
520 /* Extract major version. */
521 while (ISDIGIT (*p))
523 major = major * 10 + *p - '0';
524 ++p;
527 gcc_assert (*p == '.' && ISDIGIT (p[1]));
528 ++p;
530 /* Extract minor version. */
531 while (ISDIGIT (*p))
533 minor = minor * 10 + *p - '0';
534 ++p;
537 if (flag_indirect_dispatch)
539 abi_version = GCJ_CURRENT_BC_ABI_VERSION;
540 abi_version |= FLAG_BINARYCOMPAT_ABI;
542 else /* C++ 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
546 4.0.1). */
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);
555 void
556 java_init_decl_processing (void)
558 tree field = NULL_TREE;
559 tree t;
561 init_class_processing ();
563 current_function_decl = NULL;
564 current_binding_level = NULL_BINDING_LEVEL;
565 free_binding_level = NULL_BINDING_LEVEL;
566 pushlevel (0); /* make the binding_level structure for global names */
567 global_binding_level = current_binding_level;
569 /* Build common tree nodes, Java has an unsigned char. */
570 build_common_tree_nodes (false, false);
572 /* ??? Now we continue and override some of the built types again
573 with Java specific types. As the above generated types are
574 supposed to match the targets C ABI this isn't really the way
575 to go and any Java specifics should _not_ use those global types
576 if the Java ABI does not match the C one. */
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 /* Define these next since types below may used them. */
609 integer_type_node = java_type_for_size (INT_TYPE_SIZE, 0);
610 integer_zero_node = build_int_cst (NULL_TREE, 0);
611 integer_one_node = build_int_cst (NULL_TREE, 1);
612 integer_two_node = build_int_cst (NULL_TREE, 2);
613 integer_three_node = build_int_cst (NULL_TREE, 3);
614 integer_four_node = build_int_cst (NULL_TREE, 4);
615 integer_minus_one_node = build_int_cst (NULL_TREE, -1);
617 /* A few values used for range checking in the lexer. */
618 decimal_int_max = build_int_cstu (unsigned_int_type_node, 0x80000000);
619 decimal_long_max
620 = double_int_to_tree (unsigned_long_type_node,
621 double_int_setbit (double_int_zero, 64));
623 long_zero_node = build_int_cst (long_type_node, 0);
625 pushdecl (build_decl (BUILTINS_LOCATION,
626 TYPE_DECL, get_identifier ("void"), void_type_node));
628 t = make_node (VOID_TYPE);
629 layout_type (t); /* Uses size_zero_node */
630 return_address_type_node = build_pointer_type (t);
632 char_type_node = make_unsigned_type (16);
633 TYPE_STRING_FLAG (char_type_node) = 1;
634 pushdecl (build_decl (BUILTINS_LOCATION,
635 TYPE_DECL, get_identifier ("char"), char_type_node));
637 boolean_type_node = make_unsigned_type (1);
638 TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
639 pushdecl (build_decl (BUILTINS_LOCATION,
640 TYPE_DECL, get_identifier ("boolean"),
641 boolean_type_node));
642 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
643 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
645 promoted_byte_type_node
646 = push_promoted_type ("promoted_byte", byte_type_node);
647 promoted_short_type_node
648 = push_promoted_type ("promoted_short", short_type_node);
649 promoted_char_type_node
650 = push_promoted_type ("promoted_char", char_type_node);
651 promoted_boolean_type_node
652 = push_promoted_type ("promoted_boolean", boolean_type_node);
654 float_type_node = make_node (REAL_TYPE);
655 TYPE_PRECISION (float_type_node) = 32;
656 pushdecl (build_decl (BUILTINS_LOCATION,
657 TYPE_DECL, get_identifier ("float"),
658 float_type_node));
659 layout_type (float_type_node);
661 double_type_node = make_node (REAL_TYPE);
662 TYPE_PRECISION (double_type_node) = 64;
663 pushdecl (build_decl (BUILTINS_LOCATION,
664 TYPE_DECL, get_identifier ("double"),
665 double_type_node));
666 layout_type (double_type_node);
668 float_zero_node = build_real (float_type_node, dconst0);
669 double_zero_node = build_real (double_type_node, dconst0);
671 /* These are the vtables for arrays of primitives. */
672 boolean_array_vtable = create_primitive_vtable ("boolean");
673 byte_array_vtable = create_primitive_vtable ("byte");
674 char_array_vtable = create_primitive_vtable ("char");
675 short_array_vtable = create_primitive_vtable ("short");
676 int_array_vtable = create_primitive_vtable ("int");
677 long_array_vtable = create_primitive_vtable ("long");
678 float_array_vtable = create_primitive_vtable ("float");
679 double_array_vtable = create_primitive_vtable ("double");
681 one_elt_array_domain_type = build_index_type (integer_one_node);
682 utf8const_type = make_node (RECORD_TYPE);
683 PUSH_FIELD (input_location,
684 utf8const_type, field, "hash", unsigned_short_type_node);
685 PUSH_FIELD (input_location,
686 utf8const_type, field, "length", unsigned_short_type_node);
687 FINISH_RECORD (utf8const_type);
688 utf8const_ptr_type = build_pointer_type (utf8const_type);
690 atable_type = build_array_type (ptr_type_node,
691 one_elt_array_domain_type);
692 TYPE_NONALIASED_COMPONENT (atable_type) = 1;
693 atable_ptr_type = build_pointer_type (atable_type);
695 itable_type = build_array_type (ptr_type_node,
696 one_elt_array_domain_type);
697 TYPE_NONALIASED_COMPONENT (itable_type) = 1;
698 itable_ptr_type = build_pointer_type (itable_type);
700 symbol_type = make_node (RECORD_TYPE);
701 PUSH_FIELD (input_location,
702 symbol_type, field, "clname", utf8const_ptr_type);
703 PUSH_FIELD (input_location, symbol_type, field, "name", utf8const_ptr_type);
704 PUSH_FIELD (input_location,
705 symbol_type, field, "signature", utf8const_ptr_type);
706 FINISH_RECORD (symbol_type);
708 symbols_array_type = build_array_type (symbol_type,
709 one_elt_array_domain_type);
710 symbols_array_ptr_type = build_pointer_type (symbols_array_type);
712 assertion_entry_type = make_node (RECORD_TYPE);
713 PUSH_FIELD (input_location,
714 assertion_entry_type, field, "assertion_code", integer_type_node);
715 PUSH_FIELD (input_location,
716 assertion_entry_type, field, "op1", utf8const_ptr_type);
717 PUSH_FIELD (input_location,
718 assertion_entry_type, field, "op2", utf8const_ptr_type);
719 FINISH_RECORD (assertion_entry_type);
721 assertion_table_type = build_array_type (assertion_entry_type,
722 one_elt_array_domain_type);
724 /* As you're adding items here, please update the code right after
725 this section, so that the filename containing the source code of
726 the pre-defined class gets registered correctly. */
727 unqualified_object_id_node = get_identifier ("Object");
728 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
729 object_ptr_type_node = promote_type (object_type_node);
730 string_type_node = lookup_class (get_identifier ("java.lang.String"));
731 string_ptr_type_node = promote_type (string_type_node);
732 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
733 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
734 exception_type_node = lookup_class (get_identifier ("java.lang.Exception"));
735 runtime_exception_type_node =
736 lookup_class (get_identifier ("java.lang.RuntimeException"));
737 error_exception_type_node =
738 lookup_class (get_identifier ("java.lang.Error"));
740 rawdata_ptr_type_node
741 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
743 add_predefined_file (get_identifier ("java/lang/Class.java"));
744 add_predefined_file (get_identifier ("java/lang/Error.java"));
745 add_predefined_file (get_identifier ("java/lang/Object.java"));
746 add_predefined_file (get_identifier ("java/lang/RuntimeException.java"));
747 add_predefined_file (get_identifier ("java/lang/String.java"));
748 add_predefined_file (get_identifier ("java/lang/Throwable.java"));
749 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
750 add_predefined_file (get_identifier ("java/lang/Exception.java"));
751 add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java"));
752 add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java"));
754 methodtable_type = make_node (RECORD_TYPE);
755 layout_type (methodtable_type);
756 build_decl (BUILTINS_LOCATION,
757 TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
758 methodtable_ptr_type = build_pointer_type (methodtable_type);
760 TYPE_identifier_node = get_identifier ("TYPE");
761 init_identifier_node = get_identifier ("<init>");
762 clinit_identifier_node = get_identifier ("<clinit>");
763 void_signature_node = get_identifier ("()V");
764 finalize_identifier_node = get_identifier ("finalize");
765 this_identifier_node = get_identifier ("this");
767 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
768 java_io_serializable_identifier_node =
769 get_identifier ("java.io.Serializable");
771 /* for lack of a better place to put this stub call */
772 init_expr_processing();
774 constants_type_node = make_node (RECORD_TYPE);
775 PUSH_FIELD (input_location,
776 constants_type_node, field, "size", unsigned_int_type_node);
777 PUSH_FIELD (input_location,
778 constants_type_node, field, "tags", ptr_type_node);
779 PUSH_FIELD (input_location,
780 constants_type_node, field, "data", ptr_type_node);
781 constants_data_field_decl_node = field;
782 FINISH_RECORD (constants_type_node);
783 build_decl (BUILTINS_LOCATION,
784 TYPE_DECL, get_identifier ("constants"), constants_type_node);
786 access_flags_type_node = unsigned_short_type_node;
788 dtable_type = make_node (RECORD_TYPE);
789 dtable_ptr_type = build_pointer_type (dtable_type);
791 otable_type = build_array_type (integer_type_node,
792 one_elt_array_domain_type);
793 TYPE_NONALIASED_COMPONENT (otable_type) = 1;
794 otable_ptr_type = build_pointer_type (otable_type);
796 PUSH_FIELD (input_location,
797 object_type_node, field, "vtable", dtable_ptr_type);
798 DECL_FCONTEXT (field) = object_type_node;
799 TYPE_VFIELD (object_type_node) = field;
801 /* This isn't exactly true, but it is what we have in the source.
802 There is an unresolved issue here, which is whether the vtable
803 should be marked by the GC. */
804 if (! flag_hash_synchronization)
805 PUSH_FIELD (input_location, object_type_node, field, "sync_info",
806 build_pointer_type (object_type_node));
807 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = DECL_CHAIN (t))
808 FIELD_PRIVATE (t) = 1;
809 FINISH_RECORD (object_type_node);
811 field_type_node = make_node (RECORD_TYPE);
812 field_ptr_type_node = build_pointer_type (field_type_node);
813 method_type_node = make_node (RECORD_TYPE);
814 method_ptr_type_node = build_pointer_type (method_type_node);
816 set_super_info (0, class_type_node, object_type_node, 0);
817 set_super_info (0, string_type_node, object_type_node, 0);
818 class_ptr_type = build_pointer_type (class_type_node);
820 PUSH_FIELD (input_location,
821 class_type_node, field, "next_or_version", class_ptr_type);
822 PUSH_FIELD (input_location,
823 class_type_node, field, "name", utf8const_ptr_type);
824 PUSH_FIELD (input_location,
825 class_type_node, field, "accflags", access_flags_type_node);
826 PUSH_FIELD (input_location,
827 class_type_node, field, "superclass", class_ptr_type);
828 PUSH_FIELD (input_location,
829 class_type_node, field, "constants", constants_type_node);
830 constants_field_decl_node = field;
831 PUSH_FIELD (input_location,
832 class_type_node, field, "methods", method_ptr_type_node);
833 PUSH_FIELD (input_location,
834 class_type_node, field, "method_count", short_type_node);
835 PUSH_FIELD (input_location,
836 class_type_node, field, "vtable_method_count", short_type_node);
837 PUSH_FIELD (input_location,
838 class_type_node, field, "fields", field_ptr_type_node);
839 PUSH_FIELD (input_location,
840 class_type_node, field, "size_in_bytes", int_type_node);
841 PUSH_FIELD (input_location,
842 class_type_node, field, "field_count", short_type_node);
843 PUSH_FIELD (input_location,
844 class_type_node, field, "static_field_count", short_type_node);
845 PUSH_FIELD (input_location,
846 class_type_node, field, "vtable", dtable_ptr_type);
847 PUSH_FIELD (input_location,
848 class_type_node, field, "otable", otable_ptr_type);
849 PUSH_FIELD (input_location,
850 class_type_node, field, "otable_syms",
851 symbols_array_ptr_type);
852 PUSH_FIELD (input_location,
853 class_type_node, field, "atable", atable_ptr_type);
854 PUSH_FIELD (input_location,
855 class_type_node, field, "atable_syms",
856 symbols_array_ptr_type);
857 PUSH_FIELD (input_location,
858 class_type_node, field, "itable", itable_ptr_type);
859 PUSH_FIELD (input_location, class_type_node, field, "itable_syms",
860 symbols_array_ptr_type);
861 PUSH_FIELD (input_location,
862 class_type_node, field, "catch_classes", ptr_type_node);
863 PUSH_FIELD (input_location, class_type_node, field, "interfaces",
864 build_pointer_type (class_ptr_type));
865 PUSH_FIELD (input_location, class_type_node, field, "loader", ptr_type_node);
866 PUSH_FIELD (input_location,
867 class_type_node, field, "interface_count", short_type_node);
868 PUSH_FIELD (input_location, class_type_node, field, "state", byte_type_node);
869 PUSH_FIELD (input_location, class_type_node, field, "thread", ptr_type_node);
870 PUSH_FIELD (input_location,
871 class_type_node, field, "depth", short_type_node);
872 PUSH_FIELD (input_location,
873 class_type_node, field, "ancestors", ptr_type_node);
874 PUSH_FIELD (input_location, class_type_node, field, "idt", ptr_type_node);
875 PUSH_FIELD (input_location,
876 class_type_node, field, "arrayclass", ptr_type_node);
877 PUSH_FIELD (input_location,
878 class_type_node, field, "protectionDomain", ptr_type_node);
879 PUSH_FIELD (input_location,
880 class_type_node, field, "assertion_table", ptr_type_node);
881 PUSH_FIELD (input_location,
882 class_type_node, field, "hack_signers", ptr_type_node);
883 PUSH_FIELD (input_location, class_type_node, field, "chain", ptr_type_node);
884 PUSH_FIELD (input_location,
885 class_type_node, field, "aux_info", ptr_type_node);
886 PUSH_FIELD (input_location, class_type_node, field, "engine", ptr_type_node);
887 PUSH_FIELD (input_location,
888 class_type_node, field, "reflection_data", ptr_type_node);
889 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = DECL_CHAIN (t))
890 FIELD_PRIVATE (t) = 1;
891 push_super_field (class_type_node, object_type_node);
893 FINISH_RECORD (class_type_node);
894 build_decl (BUILTINS_LOCATION,
895 TYPE_DECL, get_identifier ("Class"), class_type_node);
897 field_info_union_node = make_node (UNION_TYPE);
898 PUSH_FIELD (input_location,
899 field_info_union_node, field, "boffset", int_type_node);
900 PUSH_FIELD (input_location,
901 field_info_union_node, field, "addr", ptr_type_node);
902 layout_type (field_info_union_node);
904 PUSH_FIELD (input_location,
905 field_type_node, field, "name", utf8const_ptr_type);
906 PUSH_FIELD (input_location, field_type_node, field, "type", class_ptr_type);
907 PUSH_FIELD (input_location,
908 field_type_node, field, "accflags", access_flags_type_node);
909 PUSH_FIELD (input_location,
910 field_type_node, field, "bsize", unsigned_short_type_node);
911 PUSH_FIELD (input_location,
912 field_type_node, field, "info", field_info_union_node);
913 FINISH_RECORD (field_type_node);
914 build_decl (BUILTINS_LOCATION,
915 TYPE_DECL, get_identifier ("Field"), field_type_node);
917 nativecode_ptr_array_type_node
918 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
920 PUSH_FIELD (input_location,
921 dtable_type, field, "class", class_ptr_type);
922 PUSH_FIELD (input_location,
923 dtable_type, field, "methods", nativecode_ptr_array_type_node);
924 FINISH_RECORD (dtable_type);
925 build_decl (BUILTINS_LOCATION,
926 TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
928 jexception_type = make_node (RECORD_TYPE);
929 PUSH_FIELD (input_location,
930 jexception_type, field, "start_pc", ptr_type_node);
931 PUSH_FIELD (input_location, jexception_type, field, "end_pc", ptr_type_node);
932 PUSH_FIELD (input_location,
933 jexception_type, field, "handler_pc", ptr_type_node);
934 PUSH_FIELD (input_location,
935 jexception_type, field, "catch_type", class_ptr_type);
936 FINISH_RECORD (jexception_type);
937 build_decl (BUILTINS_LOCATION,
938 TYPE_DECL, get_identifier ("jexception"), field_type_node);
939 jexception_ptr_type = build_pointer_type (jexception_type);
941 lineNumberEntry_type = make_node (RECORD_TYPE);
942 PUSH_FIELD (input_location,
943 lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
944 PUSH_FIELD (input_location,
945 lineNumberEntry_type, field, "start_pc", ptr_type_node);
946 FINISH_RECORD (lineNumberEntry_type);
948 lineNumbers_type = make_node (RECORD_TYPE);
949 PUSH_FIELD (input_location,
950 lineNumbers_type, field, "length", unsigned_int_type_node);
951 FINISH_RECORD (lineNumbers_type);
953 PUSH_FIELD (input_location,
954 method_type_node, field, "name", utf8const_ptr_type);
955 PUSH_FIELD (input_location,
956 method_type_node, field, "signature", utf8const_ptr_type);
957 PUSH_FIELD (input_location,
958 method_type_node, field, "accflags", access_flags_type_node);
959 PUSH_FIELD (input_location,
960 method_type_node, field, "index", unsigned_short_type_node);
961 PUSH_FIELD (input_location,
962 method_type_node, field, "ncode", nativecode_ptr_type_node);
963 PUSH_FIELD (input_location,
964 method_type_node, field, "throws", ptr_type_node);
965 FINISH_RECORD (method_type_node);
966 build_decl (BUILTINS_LOCATION,
967 TYPE_DECL, get_identifier ("Method"), method_type_node);
969 end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
971 t = build_function_type_list (ptr_type_node, class_ptr_type, NULL_TREE);
972 alloc_object_node = add_builtin_function ("_Jv_AllocObject", t,
973 0, NOT_BUILT_IN, NULL, NULL_TREE);
974 DECL_IS_MALLOC (alloc_object_node) = 1;
975 alloc_no_finalizer_node =
976 add_builtin_function ("_Jv_AllocObjectNoFinalizer", t,
977 0, NOT_BUILT_IN, NULL, NULL_TREE);
978 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
980 t = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
981 soft_initclass_node = add_builtin_function ("_Jv_InitClass", t,
982 0, NOT_BUILT_IN, NULL, NULL_TREE);
983 t = build_function_type_list (ptr_type_node,
984 class_ptr_type, int_type_node, NULL_TREE);
985 soft_resolvepoolentry_node
986 = add_builtin_function ("_Jv_ResolvePoolEntry", t,
987 0,NOT_BUILT_IN, NULL, NULL_TREE);
988 DECL_PURE_P (soft_resolvepoolentry_node) = 1;
989 t = build_function_type_list (void_type_node,
990 class_ptr_type, int_type_node, NULL_TREE);
991 throw_node = add_builtin_function ("_Jv_Throw", t,
992 0, NOT_BUILT_IN, NULL, NULL_TREE);
993 /* Mark throw_nodes as `noreturn' functions with side effects. */
994 TREE_THIS_VOLATILE (throw_node) = 1;
995 TREE_SIDE_EFFECTS (throw_node) = 1;
997 t = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
998 soft_monitorenter_node
999 = add_builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
1000 NULL, NULL_TREE);
1001 soft_monitorexit_node
1002 = add_builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
1003 NULL, NULL_TREE);
1005 t = build_function_type_list (ptr_type_node,
1006 ptr_type_node, int_type_node, NULL_TREE);
1007 soft_newarray_node
1008 = add_builtin_function ("_Jv_NewPrimArray", t,
1009 0, NOT_BUILT_IN, NULL, NULL_TREE);
1010 DECL_IS_MALLOC (soft_newarray_node) = 1;
1012 t = build_function_type_list (ptr_type_node,
1013 int_type_node, class_ptr_type,
1014 object_ptr_type_node, NULL_TREE);
1015 soft_anewarray_node
1016 = add_builtin_function ("_Jv_NewObjectArray", t,
1017 0, NOT_BUILT_IN, NULL, NULL_TREE);
1018 DECL_IS_MALLOC (soft_anewarray_node) = 1;
1020 t = build_varargs_function_type_list (ptr_type_node,
1021 ptr_type_node, int_type_node,
1022 NULL_TREE);
1023 soft_multianewarray_node
1024 = add_builtin_function ("_Jv_NewMultiArray", t,
1025 0, NOT_BUILT_IN, NULL, NULL_TREE);
1026 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
1028 t = build_function_type_list (void_type_node, int_type_node, NULL_TREE);
1029 soft_badarrayindex_node
1030 = add_builtin_function ("_Jv_ThrowBadArrayIndex", t,
1031 0, NOT_BUILT_IN, NULL, NULL_TREE);
1032 /* Mark soft_badarrayindex_node as a `noreturn' function with side
1033 effects. */
1034 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
1035 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
1037 t = build_function_type_list (void_type_node, NULL_TREE);
1038 soft_nullpointer_node
1039 = add_builtin_function ("_Jv_ThrowNullPointerException", t,
1040 0, NOT_BUILT_IN, NULL, NULL_TREE);
1041 /* Mark soft_nullpointer_node as a `noreturn' function with side
1042 effects. */
1043 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
1044 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
1046 soft_abstractmethod_node
1047 = add_builtin_function ("_Jv_ThrowAbstractMethodError", t,
1048 0, NOT_BUILT_IN, NULL, NULL_TREE);
1049 /* Mark soft_abstractmethod_node as a `noreturn' function with side
1050 effects. */
1051 TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1;
1052 TREE_SIDE_EFFECTS (soft_abstractmethod_node) = 1;
1054 soft_nosuchfield_node
1055 = add_builtin_function ("_Jv_ThrowNoSuchFieldError", t,
1056 0, NOT_BUILT_IN, NULL, NULL_TREE);
1057 /* Mark soft_nosuchfield_node as a `noreturn' function with side
1058 effects. */
1059 TREE_THIS_VOLATILE (soft_nosuchfield_node) = 1;
1060 TREE_SIDE_EFFECTS (soft_nosuchfield_node) = 1;
1062 t = build_function_type_list (ptr_type_node,
1063 class_ptr_type, object_ptr_type_node,
1064 NULL_TREE);
1065 soft_checkcast_node
1066 = add_builtin_function ("_Jv_CheckCast", t,
1067 0, NOT_BUILT_IN, NULL, NULL_TREE);
1068 t = build_function_type_list (boolean_type_node,
1069 object_ptr_type_node, class_ptr_type,
1070 NULL_TREE);
1071 soft_instanceof_node
1072 = add_builtin_function ("_Jv_IsInstanceOf", t,
1073 0, NOT_BUILT_IN, NULL, NULL_TREE);
1074 DECL_PURE_P (soft_instanceof_node) = 1;
1075 t = build_function_type_list (void_type_node,
1076 object_ptr_type_node, object_ptr_type_node,
1077 NULL_TREE);
1078 soft_checkarraystore_node
1079 = add_builtin_function ("_Jv_CheckArrayStore", t,
1080 0, NOT_BUILT_IN, NULL, NULL_TREE);
1081 t = build_function_type_list (ptr_type_node,
1082 ptr_type_node, ptr_type_node, int_type_node,
1083 NULL_TREE);
1084 soft_lookupinterfacemethod_node
1085 = add_builtin_function ("_Jv_LookupInterfaceMethodIdx", t,
1086 0, NOT_BUILT_IN, NULL, NULL_TREE);
1087 DECL_PURE_P (soft_lookupinterfacemethod_node) = 1;
1089 t = build_function_type_list (ptr_type_node,
1090 ptr_type_node, ptr_type_node, ptr_type_node,
1091 NULL_TREE);
1092 soft_lookupinterfacemethodbyname_node
1093 = add_builtin_function ("_Jv_LookupInterfaceMethod", t,
1094 0, NOT_BUILT_IN, NULL, NULL_TREE);
1095 t = build_function_type_list (ptr_type_node,
1096 object_ptr_type_node, ptr_type_node,
1097 ptr_type_node, int_type_node, NULL_TREE);
1098 soft_lookupjnimethod_node
1099 = add_builtin_function ("_Jv_LookupJNIMethod", t,
1100 0, NOT_BUILT_IN, NULL, NULL_TREE);
1101 t = build_function_type_list (ptr_type_node, ptr_type_node, NULL_TREE);
1102 soft_getjnienvnewframe_node
1103 = add_builtin_function ("_Jv_GetJNIEnvNewFrame", t,
1104 0, NOT_BUILT_IN, NULL, NULL_TREE);
1105 t = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
1106 soft_jnipopsystemframe_node
1107 = add_builtin_function ("_Jv_JNI_PopSystemFrame", t,
1108 0, NOT_BUILT_IN, NULL, NULL_TREE);
1110 t = build_function_type_list (object_ptr_type_node,
1111 object_ptr_type_node, NULL_TREE);
1112 soft_unwrapjni_node
1113 = add_builtin_function ("_Jv_UnwrapJNIweakReference", t,
1114 0, NOT_BUILT_IN, NULL, NULL_TREE);
1116 t = build_function_type_list (int_type_node,
1117 int_type_node, int_type_node, NULL_TREE);
1118 soft_idiv_node
1119 = add_builtin_function ("_Jv_divI", t,
1120 0, NOT_BUILT_IN, NULL, NULL_TREE);
1122 soft_irem_node
1123 = add_builtin_function ("_Jv_remI", t,
1124 0, NOT_BUILT_IN, NULL, NULL_TREE);
1126 t = build_function_type_list (long_type_node,
1127 long_type_node, long_type_node, NULL_TREE);
1128 soft_ldiv_node
1129 = add_builtin_function ("_Jv_divJ", t,
1130 0, NOT_BUILT_IN, NULL, NULL_TREE);
1132 soft_lrem_node
1133 = add_builtin_function ("_Jv_remJ", t,
1134 0, NOT_BUILT_IN, NULL, NULL_TREE);
1136 initialize_builtins ();
1138 soft_fmod_node = builtin_decl_explicit (BUILT_IN_FMOD);
1140 parse_version ();
1144 /* Look up NAME in the current binding level and its superiors
1145 in the namespace of variables, functions and typedefs.
1146 Return a ..._DECL node of some kind representing its definition,
1147 or return 0 if it is undefined. */
1149 tree
1150 lookup_name (tree name)
1152 tree val;
1153 if (current_binding_level != global_binding_level
1154 && IDENTIFIER_LOCAL_VALUE (name))
1155 val = IDENTIFIER_LOCAL_VALUE (name);
1156 else
1157 val = IDENTIFIER_GLOBAL_VALUE (name);
1158 return val;
1161 /* Similar to `lookup_name' but look only at current binding level and
1162 the previous one if it's the parameter level. */
1164 static tree
1165 lookup_name_current_level (tree name)
1167 tree t;
1169 if (current_binding_level == global_binding_level)
1170 return IDENTIFIER_GLOBAL_VALUE (name);
1172 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
1173 return 0;
1175 for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
1176 if (DECL_NAME (t) == name)
1177 break;
1179 return t;
1182 /* Record a decl-node X as belonging to the current lexical scope.
1183 Check for errors (such as an incompatible declaration for the same
1184 name already seen in the same scope).
1186 Returns either X or an old decl for the same name.
1187 If an old decl is returned, it may have been smashed
1188 to agree with what X says. */
1190 tree
1191 pushdecl (tree x)
1193 tree t;
1194 tree name = DECL_NAME (x);
1195 struct binding_level *b = current_binding_level;
1197 if (TREE_CODE (x) != TYPE_DECL)
1198 DECL_CONTEXT (x) = current_function_decl;
1199 if (name)
1201 t = lookup_name_current_level (name);
1202 if (t != 0 && t == error_mark_node)
1203 /* error_mark_node is 0 for a while during initialization! */
1205 t = 0;
1206 error ("%q+D used prior to declaration", x);
1209 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1210 to point to the TYPE_DECL.
1211 Since Java does not have typedefs, a type can only have
1212 one (true) name, given by a class, interface, or builtin. */
1213 if (TREE_CODE (x) == TYPE_DECL
1214 && TYPE_NAME (TREE_TYPE (x)) == 0
1215 && TREE_TYPE (x) != error_mark_node)
1217 TYPE_NAME (TREE_TYPE (x)) = x;
1218 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1221 /* This name is new in its binding level.
1222 Install the new declaration and return it. */
1223 if (b == global_binding_level)
1225 /* Install a global value. */
1227 IDENTIFIER_GLOBAL_VALUE (name) = x;
1229 else
1231 /* Here to install a non-global value. */
1232 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1233 IDENTIFIER_LOCAL_VALUE (name) = x;
1235 /* If storing a local value, there may already be one (inherited).
1236 If so, record it for restoration when this binding level ends. */
1237 if (oldlocal != 0)
1238 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1242 /* Put decls on list in reverse order.
1243 We will reverse them later if necessary. */
1244 DECL_CHAIN (x) = b->names;
1245 b->names = x;
1247 return x;
1250 void
1251 pushdecl_force_head (tree x)
1253 current_binding_level->names = x;
1256 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1258 tree
1259 pushdecl_top_level (tree x)
1261 tree t;
1262 struct binding_level *b = current_binding_level;
1264 current_binding_level = global_binding_level;
1265 t = pushdecl (x);
1266 current_binding_level = b;
1267 return t;
1270 /* Like pushdecl, only it places X in FUNCTION_BINDING_LEVEL, if appropriate. */
1272 tree
1273 pushdecl_function_level (tree x)
1275 tree t;
1276 struct binding_level *b = current_binding_level;
1278 current_binding_level = function_binding_level;
1279 t = pushdecl (x);
1280 current_binding_level = b;
1281 return t;
1284 /* Return true if we are in the global binding level. */
1286 bool
1287 global_bindings_p (void)
1289 return current_binding_level == global_binding_level;
1292 /* Return the list of declarations of the current level.
1293 Note that this list is in reverse order unless/until
1294 you nreverse it; and when you do nreverse it, you must
1295 store the result back using `storedecls' or you will lose. */
1297 tree
1298 getdecls (void)
1300 return current_binding_level->names;
1303 /* Create a new `struct binding_level'. */
1305 static struct binding_level *
1306 make_binding_level (void)
1308 /* NOSTRICT */
1309 return ggc_alloc_cleared_binding_level ();
1312 void
1313 pushlevel (int unused ATTRIBUTE_UNUSED)
1315 struct binding_level *newlevel = NULL_BINDING_LEVEL;
1317 /* Reuse or create a struct for this binding level. */
1319 if (free_binding_level)
1321 newlevel = free_binding_level;
1322 free_binding_level = free_binding_level->level_chain;
1324 else
1326 newlevel = make_binding_level ();
1329 /* Add this level to the front of the chain (stack) of levels that
1330 are active. */
1332 *newlevel = clear_binding_level;
1333 newlevel->level_chain = current_binding_level;
1334 newlevel->loc = input_location;
1335 current_binding_level = newlevel;
1336 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1337 newlevel->binding_depth = binding_depth;
1338 indent ();
1339 fprintf (stderr, "push %s level %p pc %d\n",
1340 (is_class_level) ? "class" : "block", newlevel, current_pc);
1341 is_class_level = 0;
1342 binding_depth++;
1343 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1346 /* Exit a binding level.
1347 Pop the level off, and restore the state of the identifier-decl mappings
1348 that were in effect when this level was entered.
1350 If KEEP is nonzero, this level had explicit declarations, so
1351 and create a "block" (a BLOCK node) for the level
1352 to record its declarations and subblocks for symbol table output.
1354 If FUNCTIONBODY is nonzero, this level is the body of a function,
1355 so create a block as if KEEP were set and also clear out all
1356 label names.
1358 If REVERSE is nonzero, reverse the order of decls before putting
1359 them into the BLOCK. */
1361 tree
1362 poplevel (int keep, int reverse, int functionbody)
1364 tree link;
1365 /* The chain of decls was accumulated in reverse order.
1366 Put it into forward order, just for cleanliness. */
1367 tree decls;
1368 tree subblocks = current_binding_level->blocks;
1369 tree block = 0;
1370 tree decl;
1371 tree bind = 0;
1373 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1374 binding_depth--;
1375 indent ();
1376 if (current_binding_level->end_pc != LARGEST_PC)
1377 fprintf (stderr, "pop %s level %p pc %d (end pc %d)\n",
1378 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1379 current_binding_level->end_pc);
1380 else
1381 fprintf (stderr, "pop %s level %p pc %d\n",
1382 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1383 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1385 /* Get the decls in the order they were written.
1386 Usually current_binding_level->names is in reverse order.
1387 But parameter decls were previously put in forward order. */
1389 if (reverse)
1390 current_binding_level->names
1391 = decls = nreverse (current_binding_level->names);
1392 else
1393 decls = current_binding_level->names;
1395 for (decl = decls; decl; decl = DECL_CHAIN (decl))
1396 if (TREE_CODE (decl) == VAR_DECL
1397 && DECL_LANG_SPECIFIC (decl) != NULL
1398 && DECL_LOCAL_SLOT_NUMBER (decl))
1399 LOCAL_VAR_OUT_OF_SCOPE_P (decl) = 1;
1401 /* If there were any declarations in that level,
1402 or if this level is a function body,
1403 create a BLOCK to record them for the life of this function. */
1405 block = 0;
1406 if (keep || functionbody)
1407 block = make_node (BLOCK);
1409 if (current_binding_level->exception_range)
1410 expand_end_java_handler (current_binding_level->exception_range);
1412 if (block != 0)
1414 /* If any statements have been generated at this level, create a
1415 BIND_EXPR to hold them and copy the variables to it. This
1416 only applies to the bytecode compiler. */
1417 if (current_binding_level->stmts)
1419 tree decl = decls;
1420 tree *var = &BLOCK_VARS (block);
1422 /* Copy decls from names list, ignoring labels. */
1423 while (decl)
1425 tree next = DECL_CHAIN (decl);
1426 if (TREE_CODE (decl) != LABEL_DECL)
1428 *var = decl;
1429 var = &DECL_CHAIN (decl);
1431 decl = next;
1433 *var = NULL;
1435 bind = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (block),
1436 BLOCK_EXPR_BODY (block), block);
1437 BIND_EXPR_BODY (bind) = current_binding_level->stmts;
1439 if (BIND_EXPR_BODY (bind)
1440 && TREE_SIDE_EFFECTS (BIND_EXPR_BODY (bind)))
1441 TREE_SIDE_EFFECTS (bind) = 1;
1443 /* FIXME: gimplifier brain damage. */
1444 if (BIND_EXPR_BODY (bind) == NULL)
1445 BIND_EXPR_BODY (bind) = build_java_empty_stmt ();
1447 SET_EXPR_LOCATION (bind, current_binding_level->loc);
1449 current_binding_level->stmts = NULL;
1451 else
1453 BLOCK_VARS (block) = decls;
1455 BLOCK_SUBBLOCKS (block) = subblocks;
1458 /* In each subblock, record that this is its superior. */
1460 for (link = subblocks; link; link = BLOCK_CHAIN (link))
1461 BLOCK_SUPERCONTEXT (link) = block;
1463 /* Clear out the meanings of the local variables of this level. */
1465 for (link = decls; link; link = DECL_CHAIN (link))
1467 tree name = DECL_NAME (link);
1468 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1470 /* If the ident. was used or addressed via a local extern decl,
1471 don't forget that fact. */
1472 if (DECL_EXTERNAL (link))
1474 if (TREE_USED (link))
1475 TREE_USED (name) = 1;
1476 if (TREE_ADDRESSABLE (link))
1477 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1479 IDENTIFIER_LOCAL_VALUE (name) = 0;
1483 /* Restore all name-meanings of the outer levels
1484 that were shadowed by this level. */
1486 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1487 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1489 /* If the level being exited is the top level of a function,
1490 check over all the labels, and clear out the current
1491 (function local) meanings of their names. */
1493 if (functionbody)
1495 /* If this is the top level block of a function,
1496 the vars are the function's parameters.
1497 Don't leave them in the BLOCK because they are
1498 found in the FUNCTION_DECL instead. */
1500 BLOCK_VARS (block) = 0;
1503 /* Pop the current level, and free the structure for reuse. */
1506 struct binding_level *level = current_binding_level;
1507 current_binding_level = current_binding_level->level_chain;
1509 level->level_chain = free_binding_level;
1510 free_binding_level = level;
1513 /* Dispose of the block that we just made inside some higher level. */
1514 if (functionbody)
1516 DECL_INITIAL (current_function_decl) = block;
1517 DECL_SAVED_TREE (current_function_decl) = bind;
1519 else
1521 if (block)
1523 current_binding_level->blocks
1524 = block_chainon (current_binding_level->blocks, block);
1526 /* If we did not make a block for the level just exited,
1527 any blocks made for inner levels
1528 (since they cannot be recorded as subblocks in that level)
1529 must be carried forward so they will later become subblocks
1530 of something else. */
1531 else if (subblocks)
1532 current_binding_level->blocks
1533 = block_chainon (current_binding_level->blocks, subblocks);
1535 if (bind)
1536 java_add_stmt (bind);
1539 if (block)
1540 TREE_USED (block) = 1;
1541 return block;
1544 void
1545 maybe_pushlevels (int pc)
1547 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1548 current_pc = pc;
1549 #endif
1551 while (pending_local_decls != NULL_TREE &&
1552 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1554 tree *ptr = &pending_local_decls;
1555 tree decl = *ptr, next;
1556 int end_pc = DECL_LOCAL_END_PC (decl);
1558 while (*ptr != NULL_TREE
1559 && DECL_LOCAL_START_PC (*ptr) <= pc
1560 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1561 ptr = &DECL_CHAIN (*ptr);
1562 pending_local_decls = *ptr;
1563 *ptr = NULL_TREE;
1565 /* Force non-nested range to be nested in current range by
1566 truncating variable lifetimes. */
1567 if (end_pc > current_binding_level->end_pc)
1569 tree t;
1570 end_pc = current_binding_level->end_pc;
1571 for (t = decl; t != NULL_TREE; t = DECL_CHAIN (t))
1572 DECL_LOCAL_END_PC (t) = end_pc;
1575 maybe_start_try (pc, end_pc);
1577 pushlevel (1);
1579 current_binding_level->end_pc = end_pc;
1580 current_binding_level->start_pc = pc;
1581 current_binding_level->names = NULL;
1582 for ( ; decl != NULL_TREE; decl = next)
1584 int index = DECL_LOCAL_SLOT_NUMBER (decl);
1585 tree base_decl;
1586 next = DECL_CHAIN (decl);
1587 push_jvm_slot (index, decl);
1588 pushdecl (decl);
1589 base_decl
1590 = find_local_variable (index, TREE_TYPE (decl), pc);
1591 if (TREE_CODE (TREE_TYPE (base_decl)) == POINTER_TYPE)
1592 base_decl = TREE_VEC_ELT (base_decl_map, index);
1593 SET_DECL_VALUE_EXPR (decl, base_decl);
1594 DECL_HAS_VALUE_EXPR_P (decl) = 1;
1598 maybe_start_try (pc, 0);
1601 void
1602 maybe_poplevels (int pc)
1604 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1605 current_pc = pc;
1606 #endif
1608 /* FIXME: I'm pretty sure that this is wrong. Variable scopes are
1609 inclusive, so a variable is live if pc == end_pc. Here, we
1610 terminate a range if the current pc is equal to the end of the
1611 range, and this is *before* we have generated code for the
1612 instruction at end_pc. We're closing a binding level one
1613 instruction too early.*/
1614 while (current_binding_level->end_pc <= pc)
1615 poplevel (1, 0, 0);
1618 /* Terminate any binding which began during the range beginning at
1619 start_pc. This tidies up improperly nested local variable ranges
1620 and exception handlers; a variable declared within an exception
1621 range is forcibly terminated when that exception ends. */
1623 void
1624 force_poplevels (int start_pc)
1626 while (current_binding_level->start_pc > start_pc)
1628 if (pedantic && current_binding_level->start_pc > start_pc)
1629 warning (0, "In %+D: overlapped variable and exception ranges at %d",
1630 current_function_decl,
1631 current_binding_level->start_pc);
1632 poplevel (1, 0, 0);
1636 /* integrate_decl_tree calls this function. */
1638 void
1639 java_dup_lang_specific_decl (tree node)
1641 int lang_decl_size;
1642 struct lang_decl *x;
1644 if (!DECL_LANG_SPECIFIC (node))
1645 return;
1647 lang_decl_size = sizeof (struct lang_decl);
1648 x = ggc_alloc_lang_decl (lang_decl_size);
1649 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1650 DECL_LANG_SPECIFIC (node) = x;
1653 void
1654 give_name_to_locals (JCF *jcf)
1656 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1657 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1658 tree parm;
1659 pending_local_decls = NULL_TREE;
1660 if (n == 0)
1661 return;
1662 JCF_SEEK (jcf, n);
1663 n = JCF_readu2 (jcf);
1664 for (i = 0; i < n; i++)
1666 int start_pc = JCF_readu2 (jcf);
1667 int length = JCF_readu2 (jcf);
1668 int name_index = JCF_readu2 (jcf);
1669 int signature_index = JCF_readu2 (jcf);
1670 int slot = JCF_readu2 (jcf);
1671 tree name = get_name_constant (jcf, name_index);
1672 tree type = parse_signature (jcf, signature_index);
1673 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1674 && start_pc == 0
1675 && length == DECL_CODE_LENGTH (current_function_decl))
1677 tree decl = TREE_VEC_ELT (decl_map, slot);
1678 DECL_NAME (decl) = name;
1679 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1680 warning (0, "bad type in parameter debug info");
1682 else
1684 tree *ptr;
1685 int end_pc = start_pc + length;
1686 tree decl = build_decl (input_location, VAR_DECL, name, type);
1687 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1689 warning (0, "bad PC range for debug info for local %q+D",
1690 decl);
1691 end_pc = DECL_CODE_LENGTH (current_function_decl);
1694 /* Adjust start_pc if necessary so that the local's first
1695 store operation will use the relevant DECL as a
1696 destination. Fore more information, read the leading
1697 comments for expr.c:maybe_adjust_start_pc. */
1698 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1700 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1701 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1702 DECL_LOCAL_START_PC (decl) = start_pc;
1703 DECL_LOCAL_END_PC (decl) = end_pc;
1705 /* Now insert the new decl in the proper place in
1706 pending_local_decls. We are essentially doing an insertion sort,
1707 which works fine, since the list input will normally already
1708 be sorted. */
1709 ptr = &pending_local_decls;
1710 while (*ptr != NULL_TREE
1711 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1712 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1713 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1714 ptr = &DECL_CHAIN (*ptr);
1715 DECL_CHAIN (decl) = *ptr;
1716 *ptr = decl;
1720 pending_local_decls = nreverse (pending_local_decls);
1722 /* Fill in default names for the parameters. */
1723 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1724 parm != NULL_TREE; parm = DECL_CHAIN (parm), i++)
1726 if (DECL_NAME (parm) == NULL_TREE)
1728 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1729 if (arg_i == 0)
1730 DECL_NAME (parm) = get_identifier ("this");
1731 else
1733 char buffer[12];
1734 sprintf (buffer, "ARG_%d", arg_i);
1735 DECL_NAME (parm) = get_identifier (buffer);
1741 tree
1742 build_result_decl (tree fndecl)
1744 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1745 tree result = DECL_RESULT (fndecl);
1746 if (! result)
1748 result = build_decl (DECL_SOURCE_LOCATION (fndecl),
1749 RESULT_DECL, NULL_TREE, restype);
1750 DECL_ARTIFICIAL (result) = 1;
1751 DECL_IGNORED_P (result) = 1;
1752 DECL_CONTEXT (result) = fndecl;
1753 DECL_RESULT (fndecl) = result;
1755 return result;
1758 void
1759 start_java_method (tree fndecl)
1761 tree tem, *ptr;
1762 int i;
1764 uniq = 0;
1766 current_function_decl = fndecl;
1767 announce_function (fndecl);
1769 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1770 decl_map = make_tree_vec (i);
1771 base_decl_map = make_tree_vec (i);
1772 type_map = XRESIZEVEC (tree, type_map, i);
1774 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1775 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1776 current_pc = 0;
1777 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1778 pushlevel (1); /* Push parameters. */
1780 ptr = &DECL_ARGUMENTS (fndecl);
1781 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1782 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1784 tree parm_name = NULL_TREE, parm_decl;
1785 tree parm_type = TREE_VALUE (tem);
1786 gcc_assert (i < DECL_MAX_LOCALS (fndecl));
1788 parm_decl = build_decl (input_location, PARM_DECL, parm_name, parm_type);
1789 DECL_CONTEXT (parm_decl) = fndecl;
1790 if (targetm.calls.promote_prototypes (parm_type)
1791 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1792 && INTEGRAL_TYPE_P (parm_type))
1793 parm_type = integer_type_node;
1794 DECL_ARG_TYPE (parm_decl) = parm_type;
1796 *ptr = parm_decl;
1797 ptr = &DECL_CHAIN (parm_decl);
1799 /* Add parm_decl to the decl_map. */
1800 push_jvm_slot (i, parm_decl);
1802 /* The this parameter of methods is artificial. */
1803 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE && i == 0)
1804 DECL_ARTIFICIAL (parm_decl) = 1;
1806 type_map[i] = TREE_TYPE (parm_decl);
1807 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1809 i++;
1810 type_map[i] = void_type_node;
1813 *ptr = NULL_TREE;
1814 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1816 while (i < DECL_MAX_LOCALS(fndecl))
1817 type_map[i++] = NULL_TREE;
1819 build_result_decl (fndecl);
1820 DECL_SOURCE_LOCATION (fndecl) = input_location;
1822 /* Push local variables. */
1823 pushlevel (2);
1825 function_binding_level = current_binding_level;
1828 void
1829 end_java_method (void)
1831 tree fndecl = current_function_decl;
1833 /* pop out of function */
1834 poplevel (1, 1, 0);
1836 /* pop out of its parameters */
1837 poplevel (1, 0, 1);
1839 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1841 if (DECL_SAVED_TREE (fndecl))
1843 tree fbody, block_body;
1844 /* Before we check initialization, attached all class initialization
1845 variable to the block_body */
1846 fbody = DECL_SAVED_TREE (fndecl);
1847 block_body = BIND_EXPR_BODY (fbody);
1848 htab_traverse (DECL_FUNCTION_INIT_TEST_TABLE (fndecl),
1849 attach_init_test_initialization_flags, block_body);
1852 finish_method (fndecl);
1854 current_function_decl = NULL_TREE;
1855 base_decl_map = NULL_TREE;
1858 /* Prepare a method for expansion. */
1860 void
1861 finish_method (tree fndecl)
1863 tree *tp = &DECL_SAVED_TREE (fndecl);
1865 /* Wrap body of synchronized methods in a monitorenter,
1866 plus monitorexit cleanup. */
1867 if (METHOD_SYNCHRONIZED (fndecl))
1869 tree enter, exit, lock;
1870 if (METHOD_STATIC (fndecl))
1871 lock = build_class_ref (DECL_CONTEXT (fndecl));
1872 else
1873 lock = DECL_ARGUMENTS (fndecl);
1874 BUILD_MONITOR_ENTER (enter, lock);
1875 BUILD_MONITOR_EXIT (exit, lock);
1876 *tp = build2 (COMPOUND_EXPR, void_type_node, enter,
1877 build2 (TRY_FINALLY_EXPR, void_type_node, *tp, exit));
1880 /* Convert function tree to GENERIC prior to inlining. */
1881 java_genericize (fndecl);
1883 /* Store the end of the function, so that we get good line number
1884 info for the epilogue. */
1885 if (DECL_STRUCT_FUNCTION (fndecl))
1886 set_cfun (DECL_STRUCT_FUNCTION (fndecl));
1887 else
1888 allocate_struct_function (fndecl, false);
1889 cfun->function_end_locus = DECL_FUNCTION_LAST_LINE (fndecl);
1891 /* Defer inlining and expansion to the cgraph optimizers. */
1892 cgraph_finalize_function (fndecl, false);
1895 /* We pessimistically marked all methods and fields external until we
1896 knew what set of classes we were planning to compile. Now mark those
1897 associated with CLASS to be generated locally as not external. */
1899 static void
1900 java_mark_decl_local (tree decl)
1902 DECL_EXTERNAL (decl) = 0;
1904 #ifdef ENABLE_CHECKING
1905 /* Double check that we didn't pass the function to the callgraph early. */
1906 if (TREE_CODE (decl) == FUNCTION_DECL)
1908 struct cgraph_node *node = cgraph_get_node (decl);
1909 gcc_assert (!node || !node->local.finalized);
1911 #endif
1912 gcc_assert (!DECL_RTL_SET_P (decl));
1915 /* Given appropriate target support, G++ will emit hidden aliases for native
1916 methods. Using this hidden name is required for proper operation of
1917 _Jv_Method::ncode, but it doesn't hurt to use it everywhere. Look for
1918 proper target support, then mark the method for aliasing. */
1920 static void
1921 java_mark_cni_decl_local (tree decl)
1923 #if !defined(HAVE_GAS_HIDDEN) || !defined(ASM_OUTPUT_DEF)
1924 return;
1925 #endif
1927 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
1928 DECL_LOCAL_CNI_METHOD_P (decl) = 1;
1930 /* Setting DECL_LOCAL_CNI_METHOD_P changes the behavior of the
1931 mangler. We might have already referenced this native method and
1932 therefore created its name, but even if we have it won't hurt.
1933 We'll just go via its externally visible name, rather than its
1934 hidden alias. However, we must force things so that the correct
1935 mangling is done. */
1937 if (DECL_ASSEMBLER_NAME_SET_P (decl))
1938 java_mangle_decl (decl);
1939 if (DECL_RTL_SET_P (decl))
1941 SET_DECL_RTL (decl, 0);
1942 make_decl_rtl (decl);
1946 /* Use the preceding two functions and mark all members of the class. */
1948 void
1949 java_mark_class_local (tree klass)
1951 tree t;
1953 for (t = TYPE_FIELDS (klass); t ; t = DECL_CHAIN (t))
1954 if (FIELD_STATIC (t))
1956 if (DECL_EXTERNAL (t))
1957 VEC_safe_push (tree, gc, pending_static_fields, t);
1958 java_mark_decl_local (t);
1961 for (t = TYPE_METHODS (klass); t ; t = DECL_CHAIN (t))
1962 if (!METHOD_ABSTRACT (t))
1964 if (METHOD_NATIVE (t) && !flag_jni)
1965 java_mark_cni_decl_local (t);
1966 else
1967 java_mark_decl_local (t);
1971 /* Add a statement to a compound_expr. */
1973 tree
1974 add_stmt_to_compound (tree existing, tree type, tree stmt)
1976 if (!stmt)
1977 return existing;
1978 else if (existing)
1980 tree expr = build2 (COMPOUND_EXPR, type, existing, stmt);
1981 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (existing)
1982 | TREE_SIDE_EFFECTS (stmt);
1983 return expr;
1985 else
1986 return stmt;
1989 /* If this node is an expr, mark its input location. Called from
1990 walk_tree(). */
1992 static tree
1993 set_input_location (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
1994 void *data ATTRIBUTE_UNUSED)
1996 tree t = *tp;
1998 if (CAN_HAVE_LOCATION_P (t))
2000 if (EXPR_HAS_LOCATION(t))
2001 return t; /* Don't walk any further into this expr. */
2002 else
2003 SET_EXPR_LOCATION (t, input_location);
2006 return NULL_TREE; /* Continue walking this expr. */
2009 /* Add a statement to the statement_list currently being constructed.
2010 If the statement_list is null, we don't create a singleton list.
2011 This is necessary because poplevel() assumes that adding a
2012 statement to a null statement_list returns the statement. */
2014 tree
2015 java_add_stmt (tree new_stmt)
2017 tree stmts = current_binding_level->stmts;
2018 tree_stmt_iterator i;
2020 if (input_filename)
2021 walk_tree (&new_stmt, set_input_location, NULL, NULL);
2023 if (stmts == NULL)
2024 return current_binding_level->stmts = new_stmt;
2026 /* Force STMTS to be a statement_list. */
2027 if (TREE_CODE (stmts) != STATEMENT_LIST)
2029 tree t = make_node (STATEMENT_LIST);
2030 i = tsi_last (t);
2031 tsi_link_after (&i, stmts, TSI_CONTINUE_LINKING);
2032 stmts = t;
2035 i = tsi_last (stmts);
2036 tsi_link_after (&i, new_stmt, TSI_CONTINUE_LINKING);
2037 TREE_TYPE (stmts) = void_type_node;
2039 return current_binding_level->stmts = stmts;
2042 /* Add a variable to the current scope. */
2044 tree
2045 java_add_local_var (tree decl)
2047 tree *vars = &current_binding_level->names;
2048 tree next = *vars;
2049 DECL_CHAIN (decl) = next;
2050 *vars = decl;
2051 DECL_CONTEXT (decl) = current_function_decl;
2052 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2053 return decl;
2056 /* Return a pointer to the compound_expr currently being
2057 constructed. */
2059 tree *
2060 get_stmts (void)
2062 return &current_binding_level->stmts;
2065 /* Register an exception range as belonging to the current binding
2066 level. There may only be one: if there are more, we'll create more
2067 binding levels. However, each range can have multiple handlers,
2068 and these are expanded when we call expand_end_java_handler(). */
2070 void
2071 register_exception_range (struct eh_range *range, int pc, int end_pc)
2073 gcc_assert (! current_binding_level->exception_range);
2074 current_binding_level->exception_range = range;
2075 current_binding_level->end_pc = end_pc;
2076 current_binding_level->start_pc = pc;
2079 #include "gt-java-decl.h"