From Martin Thuresson <martint@google.com>
[gcc.git] / gcc / java / decl.c
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.
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.
21
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. */
25
26 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
27
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"
47
48 #if defined (DEBUG_JAVA_BINDING_LEVELS)
49 extern void indent (void);
50 #endif
51
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);
59
60
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. */
64
65 #define FLAG_BINARYCOMPAT_ABI (1<<31) /* Class is built with the BC-ABI. */
66
67 #define FLAG_BOOTSTRAP_LOADER (1<<30) /* Used when defining a class that
68 should be loaded by the bootstrap
69 loader. */
70
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
75
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. */
79
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)
85
86 /* The ABI version number. */
87 tree gcj_abi_version;
88
89 /* Name of the Cloneable class. */
90 tree java_lang_cloneable_identifier_node;
91
92 /* Name of the Serializable class. */
93 tree java_io_serializable_identifier_node;
94
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. */
102
103 static GTY(()) tree decl_map;
104
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. */
108
109 static GTY(()) tree base_decl_map;
110
111 /* An index used to make temporary identifiers unique. */
112 static int uniq;
113
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. */
116
117 static GTY(()) tree pending_local_decls;
118
119 /* The decl for "_Jv_ResolvePoolEntry". */
120 tree soft_resolvepoolentry_node;
121
122 /* The decl for the .constants field of an instance of Class. */
123 tree constants_field_decl_node;
124
125 /* The decl for the .data field of an instance of Class. */
126 tree constants_data_field_decl_node;
127
128 #if defined(DEBUG_JAVA_BINDING_LEVELS)
129 int binding_depth = 0;
130 int is_class_level = 0;
131 int current_pc;
132
133 void
134 indent (void)
135 {
136 int i;
137
138 for (i = 0; i < binding_depth*2; i++)
139 putc (' ', stderr);
140 }
141 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
142
143 /* True if decl is a named local variable, i.e. if it is an alias
144 that's used only for debugging purposes. */
145
146 static bool
147 debug_variable_p (tree decl)
148 {
149 if (TREE_CODE (decl) == PARM_DECL)
150 return false;
151
152 if (LOCAL_SLOT_P (decl))
153 return false;
154
155 return true;
156 }
157
158 static tree
159 push_jvm_slot (int index, tree decl)
160 {
161 DECL_CONTEXT (decl) = current_function_decl;
162 layout_decl (decl, 0);
163
164 /* Now link the decl into the decl_map. */
165 if (DECL_LANG_SPECIFIC (decl) == NULL)
166 {
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;
171 }
172 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
173 TREE_VEC_ELT (decl_map, index) = decl;
174
175 return decl;
176 }
177
178 /* Find the best declaration based upon type. If 'decl' fits 'type' better
179 than 'best', return 'decl'. Otherwise return 'best'. */
180
181 static tree
182 check_local_unnamed_variable (tree best, tree decl, tree type)
183 {
184 tree decl_type = TREE_TYPE (decl);
185
186 gcc_assert (! LOCAL_VAR_OUT_OF_SCOPE_P (decl));
187
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.
207
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.
212 */
213 || (TREE_CODE (decl_type) == POINTER_TYPE
214 && TREE_CODE (decl) == PARM_DECL
215 && TREE_CODE (type) == POINTER_TYPE))
216 {
217 if (best == NULL_TREE
218 || (decl_type == type && TREE_TYPE (best) != type))
219 return decl;
220 }
221
222 return best;
223 }
224
225
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. */
229
230 tree
231 find_local_variable (int index, tree type, int pc ATTRIBUTE_UNUSED)
232 {
233 tree tmp = TREE_VEC_ELT (decl_map, index);
234 tree decl = NULL_TREE;
235
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)
241 {
242 if (! debug_variable_p (tmp))
243 decl = check_local_unnamed_variable (decl, tmp, type);
244 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
245 }
246
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;
256
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)
266 {
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;
276
277 if (TREE_CODE (type) != POINTER_TYPE)
278 pushdecl_function_level (decl);
279 }
280
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))
286 {
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;
298 }
299
300 return decl;
301 }
302
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. */
308
309 static tree
310 java_replace_reference (tree var_decl, bool want_lvalue)
311 {
312 tree decl_type;
313
314 if (! base_decl_map)
315 return var_decl;
316
317 decl_type = TREE_TYPE (var_decl);
318
319 if (TREE_CODE (decl_type) == POINTER_TYPE)
320 {
321 if (DECL_LANG_SPECIFIC (var_decl)
322 && LOCAL_SLOT_P (var_decl))
323 {
324 int index = DECL_LOCAL_SLOT_NUMBER (var_decl);
325 tree base_decl = TREE_VEC_ELT (base_decl_map, index);
326
327 gcc_assert (base_decl);
328 if (! want_lvalue)
329 base_decl = build1 (NOP_EXPR, decl_type, base_decl);
330
331 return base_decl;
332 }
333 }
334
335 return var_decl;
336 }
337
338 /* Helper for java_genericize. */
339
340 tree
341 java_replace_references (tree *tp, int *walk_subtrees,
342 void *data ATTRIBUTE_UNUSED)
343 {
344 if (TREE_CODE (*tp) == MODIFY_EXPR)
345 {
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)
355 {
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);
365 }
366 }
367 if (TREE_CODE (*tp) == VAR_DECL)
368 {
369 *tp = java_replace_reference (*tp, /* want_lvalue */ false);
370 *walk_subtrees = 0;
371 }
372
373 return NULL_TREE;
374 }
375
376 /* Same as find_local_index, except that INDEX is a stack index. */
377
378 tree
379 find_stack_slot (int index, tree type)
380 {
381 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
382 type, -1);
383 }
384
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.
389 */
390 tree names;
391
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;
397
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;
402
403 /* The binding level which this one is contained in (inherits from). */
404 struct binding_level *level_chain;
405
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;
410
411 /* The statements in this binding level. */
412 tree stmts;
413
414 /* An exception range associated with this binding level. */
415 struct eh_range * GTY((skip (""))) exception_range;
416
417 /* Binding depth at which this level began. Used only for debugging. */
418 unsigned binding_depth;
419
420 /* The location at which this level began. */
421 source_location loc;
422 };
423
424 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
425
426 /* The binding level currently in effect. */
427
428 static GTY(()) struct binding_level *current_binding_level;
429
430 /* A chain of binding_level structures awaiting reuse. */
431
432 static GTY(()) struct binding_level *free_binding_level;
433
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. */
437
438 static GTY(()) struct binding_level *global_binding_level;
439
440 /* The binding level that holds variables declared at the outermost
441 level within a function body. */
442
443 static struct binding_level *function_binding_level;
444
445 /* A PC value bigger than any PC value we may ever may encounter. */
446
447 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
448
449 /* Binding level structures are initialized by copying this one. */
450
451 static const struct binding_level clear_binding_level
452 = {
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 */
463 };
464
465 tree java_global_trees[JTI_MAX];
466
467 /* Build (and pushdecl) a "promoted type" for all standard
468 types shorter than int. */
469
470 static tree
471 push_promoted_type (const char *name, tree actual_type)
472 {
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;
491 }
492
493 /* Return tree that represents a vtable for a primitive array. */
494 static tree
495 create_primitive_vtable (const char *name)
496 {
497 tree r;
498 char buf[50];
499
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;
505 }
506
507 /* Parse the version string and compute the ABI version number. */
508 static void
509 parse_version (void)
510 {
511 const char *p = version_string;
512 unsigned int major = 0, minor = 0;
513 unsigned int abi_version;
514
515 /* Skip leading junk. */
516 while (*p && !ISDIGIT (*p))
517 ++p;
518 gcc_assert (*p);
519
520 /* Extract major version. */
521 while (ISDIGIT (*p))
522 {
523 major = major * 10 + *p - '0';
524 ++p;
525 }
526
527 gcc_assert (*p == '.' && ISDIGIT (p[1]));
528 ++p;
529
530 /* Extract minor version. */
531 while (ISDIGIT (*p))
532 {
533 minor = minor * 10 + *p - '0';
534 ++p;
535 }
536
537 if (flag_indirect_dispatch)
538 {
539 abi_version = GCJ_CURRENT_BC_ABI_VERSION;
540 abi_version |= FLAG_BINARYCOMPAT_ABI;
541 }
542 else /* C++ ABI */
543 {
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;
548 }
549 if (flag_bootstrap_classes)
550 abi_version |= FLAG_BOOTSTRAP_LOADER;
551
552 gcj_abi_version = build_int_cstu (ptr_type_node, abi_version);
553 }
554
555 void
556 java_init_decl_processing (void)
557 {
558 tree endlink;
559 tree field = NULL_TREE;
560 tree t;
561
562 init_class_processing ();
563
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;
569
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;
574
575 /* Create sizetype first - needed for other types. */
576 initialize_sizetypes ();
577
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));
590
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));
607
608 /* This is not a java type, however tree-dfa requires a definition for
609 size_type_node. */
610 size_type_node = make_unsigned_type (POINTER_SIZE);
611 set_sizetype (size_type_node);
612
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);
620
621 /* A few values used for range checking in the lexer. */
622 decimal_int_max = build_int_cstu (unsigned_int_type_node, 0x80000000);
623 decimal_long_max
624 = double_int_to_tree (unsigned_long_type_node,
625 double_int_setbit (double_int_zero, 64));
626
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);
632
633 long_zero_node = build_int_cst (long_type_node, 0);
634
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 */
639
640 ptr_type_node = build_pointer_type (void_type_node);
641 const_ptr_type_node
642 = build_pointer_type (build_type_variant (void_type_node, 1, 0));
643
644 t = make_node (VOID_TYPE);
645 layout_type (t); /* Uses size_zero_node */
646 return_address_type_node = build_pointer_type (t);
647
648 null_pointer_node = build_int_cst (ptr_type_node, 0);
649
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));
656
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"),
662 boolean_type_node));
663 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
664 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
665
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);
674
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"),
679 float_type_node));
680 layout_type (float_type_node);
681
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"),
686 double_type_node));
687 layout_type (double_type_node);
688
689 float_zero_node = build_real (float_type_node, dconst0);
690 double_zero_node = build_real (double_type_node, dconst0);
691
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");
701
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);
710
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);
715
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);
720
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);
728
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);
732
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);
741
742 assertion_table_type = build_array_type (assertion_entry_type,
743 one_elt_array_domain_type);
744
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"));
760
761 rawdata_ptr_type_node
762 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
763
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"));
774
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);
780
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");
787
788 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
789 java_io_serializable_identifier_node =
790 get_identifier ("java.io.Serializable");
791
792 /* for lack of a better place to put this stub call */
793 init_expr_processing();
794
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);
806
807 access_flags_type_node = unsigned_short_type_node;
808
809 dtable_type = make_node (RECORD_TYPE);
810 dtable_ptr_type = build_pointer_type (dtable_type);
811
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);
816
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;
821
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);
831
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);
836
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);
840
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);
913
914 FINISH_RECORD (class_type_node);
915 build_decl (BUILTINS_LOCATION,
916 TYPE_DECL, get_identifier ("Class"), class_type_node);
917
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);
924
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);
937
938 nativecode_ptr_array_type_node
939 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
940
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);
948
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);
961
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);
968
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);
973
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);
989
990 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
991
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;
1002
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,
1006 t),
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;
1021
1022 t = build_function_type (void_type_node, tree_cons (NULL_TREE, ptr_type_node,
1023 endlink));
1024 soft_monitorenter_node
1025 = add_builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
1026 NULL, NULL_TREE);
1027 soft_monitorexit_node
1028 = add_builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
1029 NULL, NULL_TREE);
1030
1031 t = tree_cons (NULL_TREE, ptr_type_node,
1032 tree_cons (NULL_TREE, int_type_node, endlink));
1033 soft_newarray_node
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;
1038
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,
1042 endlink)));
1043 soft_anewarray_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;
1048
1049 /* There is no endlink here because _Jv_NewMultiArray is a varargs
1050 function. */
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;
1058
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
1065 effects. */
1066 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
1067 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
1068
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
1074 effects. */
1075 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
1076 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
1077
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
1083 effects. */
1084 TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1;
1085 TREE_SIDE_EFFECTS (soft_abstractmethod_node) = 1;
1086
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
1092 effects. */
1093 TREE_THIS_VOLATILE (soft_nosuchfield_node) = 1;
1094 TREE_SIDE_EFFECTS (soft_nosuchfield_node) = 1;
1095
1096 t = tree_cons (NULL_TREE, class_ptr_type,
1097 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
1098 soft_checkcast_node
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,
1134 endlink))));
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);
1148
1149 t = tree_cons (NULL_TREE, object_ptr_type_node, endlink);
1150 soft_unwrapjni_node
1151 = add_builtin_function ("_Jv_UnwrapJNIweakReference",
1152 build_function_type (object_ptr_type_node, t),
1153 0, NOT_BUILT_IN, NULL, NULL_TREE);
1154
1155 t = tree_cons (NULL_TREE, int_type_node,
1156 tree_cons (NULL_TREE, int_type_node, endlink));
1157 soft_idiv_node
1158 = add_builtin_function ("_Jv_divI",
1159 build_function_type (int_type_node, t),
1160 0, NOT_BUILT_IN, NULL, NULL_TREE);
1161
1162 soft_irem_node
1163 = add_builtin_function ("_Jv_remI",
1164 build_function_type (int_type_node, t),
1165 0, NOT_BUILT_IN, NULL, NULL_TREE);
1166
1167 t = tree_cons (NULL_TREE, long_type_node,
1168 tree_cons (NULL_TREE, long_type_node, endlink));
1169 soft_ldiv_node
1170 = add_builtin_function ("_Jv_divJ",
1171 build_function_type (long_type_node, t),
1172 0, NOT_BUILT_IN, NULL, NULL_TREE);
1173
1174 soft_lrem_node
1175 = add_builtin_function ("_Jv_remJ",
1176 build_function_type (long_type_node, t),
1177 0, NOT_BUILT_IN, NULL, NULL_TREE);
1178
1179 initialize_builtins ();
1180
1181 soft_fmod_node = built_in_decls[BUILT_IN_FMOD];
1182
1183 parse_version ();
1184 }
1185
1186
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. */
1191
1192 tree
1193 lookup_name (tree name)
1194 {
1195 tree val;
1196 if (current_binding_level != global_binding_level
1197 && IDENTIFIER_LOCAL_VALUE (name))
1198 val = IDENTIFIER_LOCAL_VALUE (name);
1199 else
1200 val = IDENTIFIER_GLOBAL_VALUE (name);
1201 return val;
1202 }
1203
1204 /* Similar to `lookup_name' but look only at current binding level and
1205 the previous one if it's the parameter level. */
1206
1207 static tree
1208 lookup_name_current_level (tree name)
1209 {
1210 tree t;
1211
1212 if (current_binding_level == global_binding_level)
1213 return IDENTIFIER_GLOBAL_VALUE (name);
1214
1215 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
1216 return 0;
1217
1218 for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
1219 if (DECL_NAME (t) == name)
1220 break;
1221
1222 return t;
1223 }
1224
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).
1228
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. */
1232
1233 tree
1234 pushdecl (tree x)
1235 {
1236 tree t;
1237 tree name = DECL_NAME (x);
1238 struct binding_level *b = current_binding_level;
1239
1240 if (TREE_CODE (x) != TYPE_DECL)
1241 DECL_CONTEXT (x) = current_function_decl;
1242 if (name)
1243 {
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! */
1247 {
1248 t = 0;
1249 error ("%q+D used prior to declaration", x);
1250 }
1251
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)
1259 {
1260 TYPE_NAME (TREE_TYPE (x)) = x;
1261 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1262 }
1263
1264 /* This name is new in its binding level.
1265 Install the new declaration and return it. */
1266 if (b == global_binding_level)
1267 {
1268 /* Install a global value. */
1269
1270 IDENTIFIER_GLOBAL_VALUE (name) = x;
1271 }
1272 else
1273 {
1274 /* Here to install a non-global value. */
1275 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1276 IDENTIFIER_LOCAL_VALUE (name) = x;
1277
1278 /* If storing a local value, there may already be one (inherited).
1279 If so, record it for restoration when this binding level ends. */
1280 if (oldlocal != 0)
1281 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1282 }
1283 }
1284
1285 /* Put decls on list in reverse order.
1286 We will reverse them later if necessary. */
1287 DECL_CHAIN (x) = b->names;
1288 b->names = x;
1289
1290 return x;
1291 }
1292
1293 void
1294 pushdecl_force_head (tree x)
1295 {
1296 current_binding_level->names = x;
1297 }
1298
1299 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1300
1301 tree
1302 pushdecl_top_level (tree x)
1303 {
1304 tree t;
1305 struct binding_level *b = current_binding_level;
1306
1307 current_binding_level = global_binding_level;
1308 t = pushdecl (x);
1309 current_binding_level = b;
1310 return t;
1311 }
1312
1313 /* Like pushdecl, only it places X in FUNCTION_BINDING_LEVEL, if appropriate. */
1314
1315 tree
1316 pushdecl_function_level (tree x)
1317 {
1318 tree t;
1319 struct binding_level *b = current_binding_level;
1320
1321 current_binding_level = function_binding_level;
1322 t = pushdecl (x);
1323 current_binding_level = b;
1324 return t;
1325 }
1326
1327 /* Nonzero if we are currently in the global binding level. */
1328
1329 int
1330 global_bindings_p (void)
1331 {
1332 return current_binding_level == global_binding_level;
1333 }
1334
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. */
1339
1340 tree
1341 getdecls (void)
1342 {
1343 return current_binding_level->names;
1344 }
1345
1346 /* Create a new `struct binding_level'. */
1347
1348 static struct binding_level *
1349 make_binding_level (void)
1350 {
1351 /* NOSTRICT */
1352 return ggc_alloc_cleared_binding_level ();
1353 }
1354
1355 void
1356 pushlevel (int unused ATTRIBUTE_UNUSED)
1357 {
1358 struct binding_level *newlevel = NULL_BINDING_LEVEL;
1359
1360 /* Reuse or create a struct for this binding level. */
1361
1362 if (free_binding_level)
1363 {
1364 newlevel = free_binding_level;
1365 free_binding_level = free_binding_level->level_chain;
1366 }
1367 else
1368 {
1369 newlevel = make_binding_level ();
1370 }
1371
1372 /* Add this level to the front of the chain (stack) of levels that
1373 are active. */
1374
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;
1381 indent ();
1382 fprintf (stderr, "push %s level %p pc %d\n",
1383 (is_class_level) ? "class" : "block", newlevel, current_pc);
1384 is_class_level = 0;
1385 binding_depth++;
1386 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1387 }
1388
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.
1392
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.
1396
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
1399 label names.
1400
1401 If REVERSE is nonzero, reverse the order of decls before putting
1402 them into the BLOCK. */
1403
1404 tree
1405 poplevel (int keep, int reverse, int functionbody)
1406 {
1407 tree link;
1408 /* The chain of decls was accumulated in reverse order.
1409 Put it into forward order, just for cleanliness. */
1410 tree decls;
1411 tree subblocks = current_binding_level->blocks;
1412 tree block = 0;
1413 tree decl;
1414 tree bind = 0;
1415
1416 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1417 binding_depth--;
1418 indent ();
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);
1423 else
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) */
1427
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. */
1431
1432 if (reverse)
1433 current_binding_level->names
1434 = decls = nreverse (current_binding_level->names);
1435 else
1436 decls = current_binding_level->names;
1437
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;
1443
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. */
1447
1448 block = 0;
1449 if (keep || functionbody)
1450 {
1451 block = make_node (BLOCK);
1452 TREE_TYPE (block) = void_type_node;
1453 }
1454
1455 if (current_binding_level->exception_range)
1456 expand_end_java_handler (current_binding_level->exception_range);
1457
1458 if (block != 0)
1459 {
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)
1464 {
1465 tree decl = decls;
1466 tree *var = &BLOCK_VARS (block);
1467
1468 /* Copy decls from names list, ignoring labels. */
1469 while (decl)
1470 {
1471 tree next = DECL_CHAIN (decl);
1472 if (TREE_CODE (decl) != LABEL_DECL)
1473 {
1474 *var = decl;
1475 var = &DECL_CHAIN (decl);
1476 }
1477 decl = next;
1478 }
1479 *var = NULL;
1480
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;
1484
1485 if (BIND_EXPR_BODY (bind)
1486 && TREE_SIDE_EFFECTS (BIND_EXPR_BODY (bind)))
1487 TREE_SIDE_EFFECTS (bind) = 1;
1488
1489 /* FIXME: gimplifier brain damage. */
1490 if (BIND_EXPR_BODY (bind) == NULL)
1491 BIND_EXPR_BODY (bind) = build_java_empty_stmt ();
1492
1493 SET_EXPR_LOCATION (bind, current_binding_level->loc);
1494
1495 current_binding_level->stmts = NULL;
1496 }
1497 else
1498 {
1499 BLOCK_VARS (block) = decls;
1500 }
1501 BLOCK_SUBBLOCKS (block) = subblocks;
1502 }
1503
1504 /* In each subblock, record that this is its superior. */
1505
1506 for (link = subblocks; link; link = TREE_CHAIN (link))
1507 BLOCK_SUPERCONTEXT (link) = block;
1508
1509 /* Clear out the meanings of the local variables of this level. */
1510
1511 for (link = decls; link; link = DECL_CHAIN (link))
1512 {
1513 tree name = DECL_NAME (link);
1514 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1515 {
1516 /* If the ident. was used or addressed via a local extern decl,
1517 don't forget that fact. */
1518 if (DECL_EXTERNAL (link))
1519 {
1520 if (TREE_USED (link))
1521 TREE_USED (name) = 1;
1522 if (TREE_ADDRESSABLE (link))
1523 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1524 }
1525 IDENTIFIER_LOCAL_VALUE (name) = 0;
1526 }
1527 }
1528
1529 /* Restore all name-meanings of the outer levels
1530 that were shadowed by this level. */
1531
1532 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1533 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1534
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. */
1538
1539 if (functionbody)
1540 {
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. */
1545
1546 BLOCK_VARS (block) = 0;
1547 }
1548
1549 /* Pop the current level, and free the structure for reuse. */
1550
1551 {
1552 struct binding_level *level = current_binding_level;
1553 current_binding_level = current_binding_level->level_chain;
1554
1555 level->level_chain = free_binding_level;
1556 free_binding_level = level;
1557 }
1558
1559 /* Dispose of the block that we just made inside some higher level. */
1560 if (functionbody)
1561 {
1562 DECL_INITIAL (current_function_decl) = block;
1563 DECL_SAVED_TREE (current_function_decl) = bind;
1564 }
1565 else
1566 {
1567 if (block)
1568 {
1569 current_binding_level->blocks
1570 = chainon (current_binding_level->blocks, block);
1571 }
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. */
1577 else if (subblocks)
1578 current_binding_level->blocks
1579 = chainon (current_binding_level->blocks, subblocks);
1580
1581 if (bind)
1582 java_add_stmt (bind);
1583 }
1584
1585 if (block)
1586 TREE_USED (block) = 1;
1587 return block;
1588 }
1589
1590 void
1591 maybe_pushlevels (int pc)
1592 {
1593 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1594 current_pc = pc;
1595 #endif
1596
1597 while (pending_local_decls != NULL_TREE &&
1598 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1599 {
1600 tree *ptr = &pending_local_decls;
1601 tree decl = *ptr, next;
1602 int end_pc = DECL_LOCAL_END_PC (decl);
1603
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;
1609 *ptr = NULL_TREE;
1610
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)
1614 {
1615 tree t;
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;
1619 }
1620
1621 maybe_start_try (pc, end_pc);
1622
1623 pushlevel (1);
1624
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)
1629 {
1630 int index = DECL_LOCAL_SLOT_NUMBER (decl);
1631 tree base_decl;
1632 next = DECL_CHAIN (decl);
1633 push_jvm_slot (index, decl);
1634 pushdecl (decl);
1635 base_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;
1641 }
1642 }
1643
1644 maybe_start_try (pc, 0);
1645 }
1646
1647 void
1648 maybe_poplevels (int pc)
1649 {
1650 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1651 current_pc = pc;
1652 #endif
1653
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)
1661 poplevel (1, 0, 0);
1662 }
1663
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. */
1668
1669 void
1670 force_poplevels (int start_pc)
1671 {
1672 while (current_binding_level->start_pc > start_pc)
1673 {
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);
1678 poplevel (1, 0, 0);
1679 }
1680 }
1681
1682 /* integrate_decl_tree calls this function. */
1683
1684 void
1685 java_dup_lang_specific_decl (tree node)
1686 {
1687 int lang_decl_size;
1688 struct lang_decl *x;
1689
1690 if (!DECL_LANG_SPECIFIC (node))
1691 return;
1692
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;
1697 }
1698
1699 void
1700 give_name_to_locals (JCF *jcf)
1701 {
1702 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1703 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1704 tree parm;
1705 pending_local_decls = NULL_TREE;
1706 if (n == 0)
1707 return;
1708 JCF_SEEK (jcf, n);
1709 n = JCF_readu2 (jcf);
1710 for (i = 0; i < n; i++)
1711 {
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)
1720 && start_pc == 0
1721 && length == DECL_CODE_LENGTH (current_function_decl))
1722 {
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");
1727 }
1728 else
1729 {
1730 tree *ptr;
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))
1734 {
1735 warning (0, "bad PC range for debug info for local %q+D",
1736 decl);
1737 end_pc = DECL_CODE_LENGTH (current_function_decl);
1738 }
1739
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);
1745
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;
1750
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
1754 be sorted. */
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;
1762 *ptr = decl;
1763 }
1764 }
1765
1766 pending_local_decls = nreverse (pending_local_decls);
1767
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++)
1771 {
1772 if (DECL_NAME (parm) == NULL_TREE)
1773 {
1774 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1775 if (arg_i == 0)
1776 DECL_NAME (parm) = get_identifier ("this");
1777 else
1778 {
1779 char buffer[12];
1780 sprintf (buffer, "ARG_%d", arg_i);
1781 DECL_NAME (parm) = get_identifier (buffer);
1782 }
1783 }
1784 }
1785 }
1786
1787 tree
1788 build_result_decl (tree fndecl)
1789 {
1790 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1791 tree result = DECL_RESULT (fndecl);
1792 if (! result)
1793 {
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;
1800 }
1801 return result;
1802 }
1803
1804 void
1805 start_java_method (tree fndecl)
1806 {
1807 tree tem, *ptr;
1808 int i;
1809
1810 uniq = 0;
1811
1812 current_function_decl = fndecl;
1813 announce_function (fndecl);
1814
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);
1819
1820 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1821 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1822 current_pc = 0;
1823 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1824 pushlevel (1); /* Push parameters. */
1825
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++)
1829 {
1830 tree parm_name = NULL_TREE, parm_decl;
1831 tree parm_type = TREE_VALUE (tem);
1832 gcc_assert (i < DECL_MAX_LOCALS (fndecl));
1833
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;
1841
1842 *ptr = parm_decl;
1843 ptr = &DECL_CHAIN (parm_decl);
1844
1845 /* Add parm_decl to the decl_map. */
1846 push_jvm_slot (i, parm_decl);
1847
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;
1851
1852 type_map[i] = TREE_TYPE (parm_decl);
1853 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1854 {
1855 i++;
1856 type_map[i] = void_type_node;
1857 }
1858 }
1859 *ptr = NULL_TREE;
1860 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1861
1862 while (i < DECL_MAX_LOCALS(fndecl))
1863 type_map[i++] = NULL_TREE;
1864
1865 build_result_decl (fndecl);
1866 DECL_SOURCE_LOCATION (fndecl) = input_location;
1867
1868 /* Push local variables. */
1869 pushlevel (2);
1870
1871 function_binding_level = current_binding_level;
1872 }
1873
1874 void
1875 end_java_method (void)
1876 {
1877 tree fndecl = current_function_decl;
1878
1879 /* pop out of function */
1880 poplevel (1, 1, 0);
1881
1882 /* pop out of its parameters */
1883 poplevel (1, 0, 1);
1884
1885 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1886
1887 if (DECL_SAVED_TREE (fndecl))
1888 {
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);
1896 }
1897
1898 finish_method (fndecl);
1899
1900 current_function_decl = NULL_TREE;
1901 base_decl_map = NULL_TREE;
1902 }
1903
1904 /* Prepare a method for expansion. */
1905
1906 void
1907 finish_method (tree fndecl)
1908 {
1909 tree *tp = &DECL_SAVED_TREE (fndecl);
1910
1911 /* Wrap body of synchronized methods in a monitorenter,
1912 plus monitorexit cleanup. */
1913 if (METHOD_SYNCHRONIZED (fndecl))
1914 {
1915 tree enter, exit, lock;
1916 if (METHOD_STATIC (fndecl))
1917 lock = build_class_ref (DECL_CONTEXT (fndecl));
1918 else
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));
1924 }
1925
1926 /* Convert function tree to GENERIC prior to inlining. */
1927 java_genericize (fndecl);
1928
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));
1933 else
1934 allocate_struct_function (fndecl, false);
1935 cfun->function_end_locus = DECL_FUNCTION_LAST_LINE (fndecl);
1936
1937 /* Defer inlining and expansion to the cgraph optimizers. */
1938 cgraph_finalize_function (fndecl, false);
1939 }
1940
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. */
1944
1945 static void
1946 java_mark_decl_local (tree decl)
1947 {
1948 DECL_EXTERNAL (decl) = 0;
1949
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);
1954 #endif
1955 gcc_assert (!DECL_RTL_SET_P (decl));
1956 }
1957
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. */
1962
1963 static void
1964 java_mark_cni_decl_local (tree decl)
1965 {
1966 #if !defined(HAVE_GAS_HIDDEN) || !defined(ASM_OUTPUT_DEF)
1967 return;
1968 #endif
1969
1970 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
1971 DECL_LOCAL_CNI_METHOD_P (decl) = 1;
1972
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. */
1979
1980 if (DECL_ASSEMBLER_NAME_SET_P (decl))
1981 java_mangle_decl (decl);
1982 if (DECL_RTL_SET_P (decl))
1983 {
1984 SET_DECL_RTL (decl, 0);
1985 make_decl_rtl (decl);
1986 }
1987 }
1988
1989 /* Use the preceding two functions and mark all members of the class. */
1990
1991 void
1992 java_mark_class_local (tree klass)
1993 {
1994 tree t;
1995
1996 for (t = TYPE_FIELDS (klass); t ; t = DECL_CHAIN (t))
1997 if (FIELD_STATIC (t))
1998 {
1999 if (DECL_EXTERNAL (t))
2000 VEC_safe_push (tree, gc, pending_static_fields, t);
2001 java_mark_decl_local (t);
2002 }
2003
2004 for (t = TYPE_METHODS (klass); t ; t = DECL_CHAIN (t))
2005 if (!METHOD_ABSTRACT (t))
2006 {
2007 if (METHOD_NATIVE (t) && !flag_jni)
2008 java_mark_cni_decl_local (t);
2009 else
2010 java_mark_decl_local (t);
2011 }
2012 }
2013
2014 /* Add a statement to a compound_expr. */
2015
2016 tree
2017 add_stmt_to_compound (tree existing, tree type, tree stmt)
2018 {
2019 if (!stmt)
2020 return existing;
2021 else if (existing)
2022 {
2023 tree expr = build2 (COMPOUND_EXPR, type, existing, stmt);
2024 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (existing)
2025 | TREE_SIDE_EFFECTS (stmt);
2026 return expr;
2027 }
2028 else
2029 return stmt;
2030 }
2031
2032 /* If this node is an expr, mark its input location. Called from
2033 walk_tree(). */
2034
2035 static tree
2036 set_input_location (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2037 void *data ATTRIBUTE_UNUSED)
2038 {
2039 tree t = *tp;
2040
2041 if (CAN_HAVE_LOCATION_P (t))
2042 {
2043 if (EXPR_HAS_LOCATION(t))
2044 return t; /* Don't walk any further into this expr. */
2045 else
2046 SET_EXPR_LOCATION (t, input_location);
2047 }
2048
2049 return NULL_TREE; /* Continue walking this expr. */
2050 }
2051
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. */
2056
2057 tree
2058 java_add_stmt (tree new_stmt)
2059 {
2060 tree stmts = current_binding_level->stmts;
2061 tree_stmt_iterator i;
2062
2063 if (input_filename)
2064 walk_tree (&new_stmt, set_input_location, NULL, NULL);
2065
2066 if (stmts == NULL)
2067 return current_binding_level->stmts = new_stmt;
2068
2069 /* Force STMTS to be a statement_list. */
2070 if (TREE_CODE (stmts) != STATEMENT_LIST)
2071 {
2072 tree t = make_node (STATEMENT_LIST);
2073 i = tsi_last (t);
2074 tsi_link_after (&i, stmts, TSI_CONTINUE_LINKING);
2075 stmts = t;
2076 }
2077
2078 i = tsi_last (stmts);
2079 tsi_link_after (&i, new_stmt, TSI_CONTINUE_LINKING);
2080 TREE_TYPE (stmts) = void_type_node;
2081
2082 return current_binding_level->stmts = stmts;
2083 }
2084
2085 /* Add a variable to the current scope. */
2086
2087 tree
2088 java_add_local_var (tree decl)
2089 {
2090 tree *vars = &current_binding_level->names;
2091 tree next = *vars;
2092 DECL_CHAIN (decl) = next;
2093 *vars = decl;
2094 DECL_CONTEXT (decl) = current_function_decl;
2095 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2096 return decl;
2097 }
2098
2099 /* Return a pointer to the compound_expr currently being
2100 constructed. */
2101
2102 tree *
2103 get_stmts (void)
2104 {
2105 return &current_binding_level->stmts;
2106 }
2107
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(). */
2112
2113 void
2114 register_exception_range (struct eh_range *range, int pc, int end_pc)
2115 {
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;
2120 }
2121
2122 #include "gt-java-decl.h"