java-tree.h (LOCAL_VAR_OUT_OF_SCOPE_P): New.
[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
4 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 2, 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 COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.
22
23 Java and all Java-based marks are trademarks or registered trademarks
24 of Sun Microsystems, Inc. in the United States and other countries.
25 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26
27 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
28
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include "tree.h"
34 #include "rtl.h"
35 #include "real.h"
36 #include "toplev.h"
37 #include "flags.h"
38 #include "java-tree.h"
39 #include "jcf.h"
40 #include "function.h"
41 #include "expr.h"
42 #include "libfuncs.h"
43 #include "except.h"
44 #include "java-except.h"
45 #include "ggc.h"
46 #include "timevar.h"
47 #include "tree-inline.h"
48
49 #if defined (DEBUG_JAVA_BINDING_LEVELS)
50 extern void indent (void);
51 #endif
52
53 static tree push_jvm_slot (int, tree);
54 static tree lookup_name_current_level (tree);
55 static tree push_promoted_type (const char *, tree);
56 static struct binding_level *make_binding_level (void);
57 static tree create_primitive_vtable (const char *);
58 static tree check_local_named_variable (tree, tree, int, int *);
59 static tree check_local_unnamed_variable (tree, tree, tree);
60
61 /* Name of the Cloneable class. */
62 tree java_lang_cloneable_identifier_node;
63
64 /* Name of the Serializable class. */
65 tree java_io_serializable_identifier_node;
66
67 /* Set to nonzero value in order to emit class initialization code
68 before static field references. */
69 extern int always_initialize_class_p;
70
71 /* The DECL_MAP is a mapping from (index, type) to a decl node.
72 If index < max_locals, it is the index of a local variable.
73 if index >= max_locals, then index-max_locals is a stack slot.
74 The DECL_MAP mapping is represented as a TREE_VEC whose elements
75 are a list of decls (VAR_DECL or PARM_DECL) chained by
76 DECL_LOCAL_SLOT_CHAIN; the index finds the TREE_VEC element, and then
77 we search the chain for a decl with a matching TREE_TYPE. */
78
79 static GTY(()) tree decl_map;
80
81 /* A list of local variables VAR_DECLs for this method that we have seen
82 debug information, but we have not reached their starting (byte) PC yet. */
83
84 static GTY(()) tree pending_local_decls;
85
86 /* Push a local variable or stack slot into the decl_map,
87 and assign it an rtl. */
88
89 #if defined(DEBUG_JAVA_BINDING_LEVELS)
90 int binding_depth = 0;
91 int is_class_level = 0;
92 int current_pc;
93
94 void
95 indent (void)
96 {
97 register unsigned i;
98
99 for (i = 0; i < binding_depth*2; i++)
100 putc (' ', stderr);
101 }
102 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
103
104 static tree
105 push_jvm_slot (int index, tree decl)
106 {
107 struct rtx_def *rtl = NULL;
108 tree type = TREE_TYPE (decl);
109 tree tmp;
110
111 DECL_CONTEXT (decl) = current_function_decl;
112 layout_decl (decl, 0);
113
114 /* See if we have an appropriate rtl (i.e. same mode) at this index.
115 If so, we must use it. */
116 tmp = TREE_VEC_ELT (decl_map, index);
117 while (tmp != NULL_TREE)
118 {
119 if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp))
120 && ! LOCAL_VAR_OUT_OF_SCOPE_P (tmp))
121 rtl = DECL_RTL_IF_SET (tmp);
122 if (rtl != NULL)
123 break;
124 tmp = DECL_LOCAL_SLOT_CHAIN (tmp);
125 }
126 if (rtl != NULL)
127 SET_DECL_RTL (decl, rtl);
128 else
129 {
130 if (index >= DECL_MAX_LOCALS (current_function_decl))
131 DECL_REGISTER (decl) = 1;
132 expand_decl (decl);
133 }
134
135 /* Now link the decl into the decl_map. */
136 if (DECL_LANG_SPECIFIC (decl) == NULL)
137 {
138 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
139 DECL_LOCAL_START_PC (decl) = 0;
140 DECL_LOCAL_END_PC (decl) = DECL_CODE_LENGTH (current_function_decl);
141 DECL_LOCAL_SLOT_NUMBER (decl) = index;
142 }
143 DECL_LOCAL_SLOT_CHAIN (decl) = TREE_VEC_ELT (decl_map, index);
144 TREE_VEC_ELT (decl_map, index) = decl;
145 return decl;
146 }
147
148 /* Find out if 'decl' passed in fits the defined PC location better than
149 'best'. Return decl if it does, return best if it doesn't. If decl
150 is returned, then updated is set to true. */
151
152 static tree
153 check_local_named_variable (tree best, tree decl, int pc, int *updated)
154 {
155 if (pc >= DECL_LOCAL_START_PC (decl)
156 && pc < DECL_LOCAL_END_PC (decl))
157 {
158 if (best == NULL_TREE
159 || (DECL_LOCAL_START_PC (decl) > DECL_LOCAL_START_PC (best)
160 && DECL_LOCAL_END_PC (decl) < DECL_LOCAL_END_PC (best)))
161 {
162 *updated = 1;
163 return decl;
164 }
165 }
166
167 return best;
168 }
169
170 /* Find the best declaration based upon type. If 'decl' fits 'type' better
171 than 'best', return 'decl'. Otherwise return 'best'. */
172
173 static tree
174 check_local_unnamed_variable (tree best, tree decl, tree type)
175 {
176 if (TREE_TYPE (decl) == type
177 || (TREE_CODE (TREE_TYPE (decl)) == TREE_CODE (type)
178 && TYPE_PRECISION (TREE_TYPE (decl)) <= 32
179 && TYPE_PRECISION (type) <= 32
180 && TREE_CODE (type) != POINTER_TYPE)
181 || (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
182 && type == ptr_type_node))
183 {
184 if (best == NULL_TREE
185 || (TREE_TYPE (decl) == type && TREE_TYPE (best) != type))
186 return decl;
187 }
188
189 return best;
190 }
191
192
193 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
194 that is valid at PC (or -1 if any pc).
195 If there is no existing matching decl, allocate one. */
196
197 tree
198 find_local_variable (int index, tree type, int pc)
199 {
200 tree decl = TREE_VEC_ELT (decl_map, index);
201 tree best = NULL_TREE;
202 int found_scoped_var = 0;
203
204 /* Scan through every declaration that has been created in this slot. */
205 while (decl != NULL_TREE)
206 {
207 /* Variables created in give_name_to_locals() have a name and have
208 a specified scope, so we can handle them specifically. We want
209 to use the specific decls created for those so they are assigned
210 the right variables in the debugging information. */
211 if (DECL_NAME (decl) != NULL_TREE)
212 {
213 /* This is a variable we have a name for, so it has a scope
214 supplied in the class file. But it only matters when we
215 actually have a PC to use. If pc<0, then we are asking
216 for a stack slot and this decl won't be one of those. */
217 if (pc >= 0)
218 best = check_local_named_variable (best, decl, pc,
219 &found_scoped_var);
220 }
221 /* We scan for type information unless we found a variable in the
222 proper scope already. */
223 else if (!found_scoped_var)
224 {
225 /* If we don't have scoping information for a variable, we use
226 a different method to look it up. */
227 best = check_local_unnamed_variable (best, decl, type);
228 }
229
230 decl = DECL_LOCAL_SLOT_CHAIN (decl);
231 }
232
233 if (best != NULL_TREE)
234 return best;
235
236 /* If we don't find a match, create one with the type passed in. */
237 return push_jvm_slot (index, build_decl (VAR_DECL, NULL_TREE, type));
238 }
239
240
241 /* Same as find_local_index, except that INDEX is a stack index. */
242
243 tree
244 find_stack_slot (int index, tree type)
245 {
246 return find_local_variable (index + DECL_MAX_LOCALS (current_function_decl),
247 type, -1);
248 }
249
250 struct binding_level
251 {
252 /* A chain of _DECL nodes for all variables, constants, functions,
253 * and typedef types. These are in the reverse of the order supplied.
254 */
255 tree names;
256
257 /* For each level, a list of shadowed outer-level local definitions
258 to be restored when this level is popped.
259 Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
260 whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
261 tree shadowed;
262
263 /* For each level (except not the global one),
264 a chain of BLOCK nodes for all the levels
265 that were entered and exited one level down. */
266 tree blocks;
267
268 /* The BLOCK node for this level, if one has been preallocated.
269 If 0, the BLOCK is allocated (if needed) when the level is popped. */
270 tree this_block;
271
272 /* The binding level which this one is contained in (inherits from). */
273 struct binding_level *level_chain;
274
275 /* The bytecode PC that marks the end of this level. */
276 int end_pc;
277 /* The bytecode PC that marks the start of this level. */
278 int start_pc;
279
280 #if defined(DEBUG_JAVA_BINDING_LEVELS)
281 /* Binding depth at which this level began. */
282 unsigned binding_depth;
283 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
284 };
285
286 #define NULL_BINDING_LEVEL (struct binding_level *) NULL
287
288 /* The binding level currently in effect. */
289
290 static struct binding_level *current_binding_level;
291
292 /* A chain of binding_level structures awaiting reuse. */
293
294 static struct binding_level *free_binding_level;
295
296 /* The outermost binding level, for names of file scope.
297 This is created when the compiler is started and exists
298 through the entire run. */
299
300 static struct binding_level *global_binding_level;
301
302 /* A PC value bigger than any PC value we may ever may encounter. */
303
304 #define LARGEST_PC (( (unsigned int)1 << (HOST_BITS_PER_INT - 1)) - 1)
305
306 /* Binding level structures are initialized by copying this one. */
307
308 static const struct binding_level clear_binding_level
309 = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
310 NULL_BINDING_LEVEL, LARGEST_PC, 0};
311
312 #if 0
313 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
314 that have names. Here so we can clear out their names' definitions
315 at the end of the function. */
316
317 static tree named_labels;
318
319 /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
320
321 static tree shadowed_labels;
322 #endif
323
324 tree java_global_trees[JTI_MAX];
325
326 /* Build (and pushdecl) a "promoted type" for all standard
327 types shorter than int. */
328
329 static tree
330 push_promoted_type (const char *name, tree actual_type)
331 {
332 tree type = make_node (TREE_CODE (actual_type));
333 #if 1
334 tree in_min = TYPE_MIN_VALUE (int_type_node);
335 tree in_max = TYPE_MAX_VALUE (int_type_node);
336 #else
337 tree in_min = TYPE_MIN_VALUE (actual_type);
338 tree in_max = TYPE_MAX_VALUE (actual_type);
339 #endif
340 TYPE_MIN_VALUE (type) = copy_node (in_min);
341 TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
342 TYPE_MAX_VALUE (type) = copy_node (in_max);
343 TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
344 TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
345 layout_type (type);
346 pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
347 return type;
348 }
349
350 /* Return a definition for a builtin function named NAME and whose data type
351 is TYPE. TYPE should be a function type with argument types.
352 FUNCTION_CODE tells later passes how to compile calls to this function.
353 See tree.h for its possible values.
354
355 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
356 the name to be called if we can't opencode the function. If
357 ATTRS is nonzero, use that for the function's attribute list. */
358
359 tree
360 builtin_function (const char *name,
361 tree type,
362 int function_code,
363 enum built_in_class class,
364 const char *library_name,
365 tree attrs ATTRIBUTE_UNUSED)
366 {
367 tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
368 DECL_EXTERNAL (decl) = 1;
369 TREE_PUBLIC (decl) = 1;
370 if (library_name)
371 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
372 make_decl_rtl (decl, NULL);
373 pushdecl (decl);
374 DECL_BUILT_IN_CLASS (decl) = class;
375 DECL_FUNCTION_CODE (decl) = function_code;
376 return decl;
377 }
378
379 /* Return tree that represents a vtable for a primitive array. */
380 static tree
381 create_primitive_vtable (const char *name)
382 {
383 tree r;
384 char buf[50];
385
386 sprintf (buf, "_Jv_%sVTable", name);
387 r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
388 DECL_EXTERNAL (r) = 1;
389 return r;
390 }
391
392 void
393 java_init_decl_processing (void)
394 {
395 register tree endlink;
396 tree field = NULL_TREE;
397 tree t;
398
399 init_class_processing ();
400 init_resource_processing ();
401
402 current_function_decl = NULL;
403 current_binding_level = NULL_BINDING_LEVEL;
404 free_binding_level = NULL_BINDING_LEVEL;
405 pushlevel (0); /* make the binding_level structure for global names */
406 global_binding_level = current_binding_level;
407
408 /* The code here must be similar to build_common_tree_nodes{,_2} in
409 tree.c, especially as to the order of initializing common nodes. */
410 error_mark_node = make_node (ERROR_MARK);
411 TREE_TYPE (error_mark_node) = error_mark_node;
412
413 /* Create sizetype first - needed for other types. */
414 initialize_sizetypes ();
415
416 byte_type_node = make_signed_type (8);
417 pushdecl (build_decl (TYPE_DECL, get_identifier ("byte"), byte_type_node));
418 short_type_node = make_signed_type (16);
419 pushdecl (build_decl (TYPE_DECL, get_identifier ("short"), short_type_node));
420 int_type_node = make_signed_type (32);
421 pushdecl (build_decl (TYPE_DECL, get_identifier ("int"), int_type_node));
422 long_type_node = make_signed_type (64);
423 pushdecl (build_decl (TYPE_DECL, get_identifier ("long"), long_type_node));
424
425 unsigned_byte_type_node = make_unsigned_type (8);
426 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned byte"),
427 unsigned_byte_type_node));
428 unsigned_short_type_node = make_unsigned_type (16);
429 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned short"),
430 unsigned_short_type_node));
431 unsigned_int_type_node = make_unsigned_type (32);
432 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
433 unsigned_int_type_node));
434 unsigned_long_type_node = make_unsigned_type (64);
435 pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned long"),
436 unsigned_long_type_node));
437
438 set_sizetype (make_unsigned_type (POINTER_SIZE));
439
440 /* Define these next since types below may used them. */
441 integer_type_node = java_type_for_size (INT_TYPE_SIZE, 0);
442 integer_zero_node = build_int_2 (0, 0);
443 integer_one_node = build_int_2 (1, 0);
444 integer_two_node = build_int_2 (2, 0);
445 integer_four_node = build_int_2 (4, 0);
446 integer_minus_one_node = build_int_2 (-1, -1);
447
448 /* A few values used for range checking in the lexer. */
449 decimal_int_max = build_int_2 (0x80000000, 0);
450 TREE_TYPE (decimal_int_max) = unsigned_int_type_node;
451 #if HOST_BITS_PER_WIDE_INT == 64
452 decimal_long_max = build_int_2 (0x8000000000000000LL, 0);
453 #else
454 #if HOST_BITS_PER_WIDE_INT == 32
455 decimal_long_max = build_int_2 (0, 0x80000000);
456 #else
457 #error "unsupported size"
458 #endif
459 #endif
460 TREE_TYPE (decimal_long_max) = unsigned_long_type_node;
461
462 size_zero_node = size_int (0);
463 size_one_node = size_int (1);
464 bitsize_zero_node = bitsize_int (0);
465 bitsize_one_node = bitsize_int (1);
466 bitsize_unit_node = bitsize_int (BITS_PER_UNIT);
467
468 long_zero_node = build_int_2 (0, 0);
469 TREE_TYPE (long_zero_node) = long_type_node;
470
471 void_type_node = make_node (VOID_TYPE);
472 pushdecl (build_decl (TYPE_DECL, get_identifier ("void"), void_type_node));
473 layout_type (void_type_node); /* Uses size_zero_node */
474 ptr_type_node = build_pointer_type (void_type_node);
475 t = make_node (VOID_TYPE);
476 layout_type (t); /* Uses size_zero_node */
477 return_address_type_node = build_pointer_type (t);
478
479 null_pointer_node = build_int_2 (0, 0);
480 TREE_TYPE (null_pointer_node) = ptr_type_node;
481
482 /* Used by the parser to represent empty statements and blocks. */
483 empty_stmt_node = build1 (NOP_EXPR, void_type_node, size_zero_node);
484 CAN_COMPLETE_NORMALLY (empty_stmt_node) = 1;
485
486 #if 0
487 /* Make a type to be the domain of a few array types
488 whose domains don't really matter.
489 200 is small enough that it always fits in size_t
490 and large enough that it can hold most function names for the
491 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
492 short_array_type_node = build_prim_array_type (short_type_node, 200);
493 #endif
494 char_type_node = make_node (CHAR_TYPE);
495 TYPE_PRECISION (char_type_node) = 16;
496 fixup_unsigned_type (char_type_node);
497 pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
498
499 boolean_type_node = make_node (BOOLEAN_TYPE);
500 TYPE_PRECISION (boolean_type_node) = 1;
501 fixup_unsigned_type (boolean_type_node);
502 pushdecl (build_decl (TYPE_DECL, get_identifier ("boolean"),
503 boolean_type_node));
504 boolean_false_node = TYPE_MIN_VALUE (boolean_type_node);
505 boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
506
507 promoted_byte_type_node
508 = push_promoted_type ("promoted_byte", byte_type_node);
509 promoted_short_type_node
510 = push_promoted_type ("promoted_short", short_type_node);
511 promoted_char_type_node
512 = push_promoted_type ("promoted_char", char_type_node);
513 promoted_boolean_type_node
514 = push_promoted_type ("promoted_boolean", boolean_type_node);
515
516 float_type_node = make_node (REAL_TYPE);
517 TYPE_PRECISION (float_type_node) = 32;
518 pushdecl (build_decl (TYPE_DECL, get_identifier ("float"),
519 float_type_node));
520 layout_type (float_type_node);
521
522 double_type_node = make_node (REAL_TYPE);
523 TYPE_PRECISION (double_type_node) = 64;
524 pushdecl (build_decl (TYPE_DECL, get_identifier ("double"),
525 double_type_node));
526 layout_type (double_type_node);
527
528 float_zero_node = build_real (float_type_node, dconst0);
529 double_zero_node = build_real (double_type_node, dconst0);
530
531 /* These are the vtables for arrays of primitives. */
532 boolean_array_vtable = create_primitive_vtable ("boolean");
533 byte_array_vtable = create_primitive_vtable ("byte");
534 char_array_vtable = create_primitive_vtable ("char");
535 short_array_vtable = create_primitive_vtable ("short");
536 int_array_vtable = create_primitive_vtable ("int");
537 long_array_vtable = create_primitive_vtable ("long");
538 float_array_vtable = create_primitive_vtable ("float");
539 double_array_vtable = create_primitive_vtable ("double");
540
541 /* As you're adding items here, please update the code right after
542 this section, so that the filename containing the source code of
543 the pre-defined class gets registered correctly. */
544 unqualified_object_id_node = get_identifier ("Object");
545 object_type_node = lookup_class (get_identifier ("java.lang.Object"));
546 object_ptr_type_node = promote_type (object_type_node);
547 string_type_node = lookup_class (get_identifier ("java.lang.String"));
548 string_ptr_type_node = promote_type (string_type_node);
549 class_type_node = lookup_class (get_identifier ("java.lang.Class"));
550 throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable"));
551 exception_type_node = lookup_class (get_identifier ("java.lang.Exception"));
552 runtime_exception_type_node =
553 lookup_class (get_identifier ("java.lang.RuntimeException"));
554 error_exception_type_node =
555 lookup_class (get_identifier ("java.lang.Error"));
556 class_not_found_type_node =
557 lookup_class (get_identifier ("java.lang.ClassNotFoundException"));
558 no_class_def_found_type_node =
559 lookup_class (get_identifier ("java.lang.NoClassDefFoundError"));
560
561 rawdata_ptr_type_node
562 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
563
564 add_predefined_file (get_identifier ("java/lang/Class.java"));
565 add_predefined_file (get_identifier ("java/lang/Error.java"));
566 add_predefined_file (get_identifier ("java/lang/Object.java"));
567 add_predefined_file (get_identifier ("java/lang/RuntimeException.java"));
568 add_predefined_file (get_identifier ("java/lang/String.java"));
569 add_predefined_file (get_identifier ("java/lang/Throwable.java"));
570 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
571 add_predefined_file (get_identifier ("java/lang/Exception.java"));
572 add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java"));
573 add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java"));
574 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
575
576 methodtable_type = make_node (RECORD_TYPE);
577 layout_type (methodtable_type);
578 build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
579 methodtable_ptr_type = build_pointer_type (methodtable_type);
580
581 TYPE_identifier_node = get_identifier ("TYPE");
582 init_identifier_node = get_identifier ("<init>");
583 clinit_identifier_node = get_identifier ("<clinit>");
584 finit_identifier_node = get_identifier ("finit$");
585 instinit_identifier_node = get_identifier ("instinit$");
586 void_signature_node = get_identifier ("()V");
587 length_identifier_node = get_identifier ("length");
588 finalize_identifier_node = get_identifier ("finalize");
589 this_identifier_node = get_identifier ("this");
590 super_identifier_node = get_identifier ("super");
591 continue_identifier_node = get_identifier ("continue");
592 access0_identifier_node = get_identifier ("access$0");
593 classdollar_identifier_node = get_identifier ("class$");
594
595 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
596 java_io_serializable_identifier_node =
597 get_identifier ("java.io.Serializable");
598
599 /* for lack of a better place to put this stub call */
600 init_expr_processing();
601
602 utf8const_type = make_node (RECORD_TYPE);
603 PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
604 PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
605 FINISH_RECORD (utf8const_type);
606 utf8const_ptr_type = build_pointer_type (utf8const_type);
607
608 constants_type_node = make_node (RECORD_TYPE);
609 PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
610 PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
611 PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
612 FINISH_RECORD (constants_type_node);
613 build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
614
615 access_flags_type_node = unsigned_short_type_node;
616
617 dtable_type = make_node (RECORD_TYPE);
618 dtable_ptr_type = build_pointer_type (dtable_type);
619
620 one_elt_array_domain_type = build_index_type (integer_one_node);
621 otable_type = build_array_type (integer_type_node,
622 one_elt_array_domain_type);
623 TYPE_NONALIASED_COMPONENT (otable_type) = 1;
624 otable_ptr_type = build_pointer_type (otable_type);
625 atable_type = build_array_type (ptr_type_node,
626 one_elt_array_domain_type);
627 TYPE_NONALIASED_COMPONENT (atable_type) = 1;
628 atable_ptr_type = build_pointer_type (atable_type);
629
630 symbol_type = make_node (RECORD_TYPE);
631 PUSH_FIELD (symbol_type, field, "clname", utf8const_ptr_type);
632 PUSH_FIELD (symbol_type, field, "name", utf8const_ptr_type);
633 PUSH_FIELD (symbol_type, field, "signature", utf8const_ptr_type);
634 FINISH_RECORD (symbol_type);
635
636 symbols_array_type = build_array_type (symbol_type,
637 one_elt_array_domain_type);
638 symbols_array_ptr_type = build_pointer_type (symbols_array_type);
639
640 if (flag_indirect_dispatch)
641 {
642 otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), otable_type);
643 DECL_EXTERNAL (otable_decl) = 1;
644 TREE_STATIC (otable_decl) = 1;
645 TREE_READONLY (otable_decl) = 1;
646 TREE_CONSTANT (otable_decl) = 1;
647 pushdecl (otable_decl);
648 otable_syms_decl = build_decl (VAR_DECL, get_identifier ("otable_syms"),
649 symbols_array_type);
650 TREE_STATIC (otable_syms_decl) = 1;
651 TREE_CONSTANT (otable_syms_decl) = 1;
652 pushdecl (otable_syms_decl);
653
654 atable_decl = build_decl (VAR_DECL, get_identifier ("atable"), atable_type);
655 DECL_EXTERNAL (atable_decl) = 1;
656 TREE_STATIC (atable_decl) = 1;
657 TREE_READONLY (atable_decl) = 1;
658 TREE_CONSTANT (atable_decl) = 1;
659 pushdecl (atable_decl);
660 atable_syms_decl = build_decl (VAR_DECL, get_identifier ("atable_syms"),
661 symbols_array_type);
662 TREE_STATIC (atable_syms_decl) = 1;
663 TREE_CONSTANT (atable_syms_decl) = 1;
664 pushdecl (atable_syms_decl);
665 }
666
667 {
668 tree catch_class_type = make_node (RECORD_TYPE);
669 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
670 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
671 FINISH_RECORD (catch_class_type);
672
673 ctable_decl
674 = build_decl (VAR_DECL, get_identifier ("catch_classes"),
675 build_array_type
676 (catch_class_type, 0));
677 DECL_EXTERNAL (ctable_decl) = 1;
678 TREE_STATIC (ctable_decl) = 1;
679 TREE_READONLY (ctable_decl) = 1;
680 TREE_CONSTANT (ctable_decl) = 1;
681 pushdecl (ctable_decl);
682 }
683
684 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
685 /* This isn't exactly true, but it is what we have in the source.
686 There is an unresolved issue here, which is whether the vtable
687 should be marked by the GC. */
688 if (! flag_hash_synchronization)
689 PUSH_FIELD (object_type_node, field, "sync_info",
690 build_pointer_type (object_type_node));
691 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
692 FIELD_PRIVATE (t) = 1;
693 FINISH_RECORD (object_type_node);
694
695 field_type_node = make_node (RECORD_TYPE);
696 field_ptr_type_node = build_pointer_type (field_type_node);
697 method_type_node = make_node (RECORD_TYPE);
698 method_ptr_type_node = build_pointer_type (method_type_node);
699
700 set_super_info (0, class_type_node, object_type_node, 0);
701 set_super_info (0, string_type_node, object_type_node, 0);
702 class_ptr_type = build_pointer_type (class_type_node);
703
704 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
705 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
706 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
707 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
708 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
709 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
710 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
711 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
712 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
713 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
714 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
715 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
716 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
717 PUSH_FIELD (class_type_node, field, "otable", otable_ptr_type);
718 PUSH_FIELD (class_type_node, field, "otable_syms",
719 symbols_array_ptr_type);
720 PUSH_FIELD (class_type_node, field, "atable", atable_ptr_type);
721 PUSH_FIELD (class_type_node, field, "atable_syms",
722 symbols_array_ptr_type);
723 PUSH_FIELD (class_type_node, field, "catch_classes", ptr_type_node);
724 PUSH_FIELD (class_type_node, field, "interfaces",
725 build_pointer_type (class_ptr_type));
726 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
727 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
728 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
729 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
730 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
731 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
732 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
733 PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);
734 PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
735 PUSH_FIELD (class_type_node, field, "signers", ptr_type_node);
736 PUSH_FIELD (class_type_node, field, "chain", ptr_type_node);
737 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
738 FIELD_PRIVATE (t) = 1;
739 push_super_field (class_type_node, object_type_node);
740
741 FINISH_RECORD (class_type_node);
742 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
743
744 field_info_union_node = make_node (UNION_TYPE);
745 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
746 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
747 #if 0
748 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
749 #endif
750 layout_type (field_info_union_node);
751
752 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
753 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
754 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
755 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
756 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
757 FINISH_RECORD (field_type_node);
758 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
759
760 nativecode_ptr_array_type_node
761 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
762
763 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
764 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
765 FINISH_RECORD (dtable_type);
766 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
767
768 #define jint_type int_type_node
769 #define jint_ptr_type ptr_type_node
770
771 jexception_type = make_node (RECORD_TYPE);
772 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
773 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
774 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
775 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
776 FINISH_RECORD (jexception_type);
777 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
778 jexception_ptr_type = build_pointer_type (jexception_type);
779
780 lineNumberEntry_type = make_node (RECORD_TYPE);
781 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
782 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
783 FINISH_RECORD (lineNumberEntry_type);
784
785 lineNumbers_type = make_node (RECORD_TYPE);
786 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
787 FINISH_RECORD (lineNumbers_type);
788
789 #define instn_ptr_type_node ptr_type_node /* XXX JH */
790
791 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
792
793 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
794 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
795 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
796 PUSH_FIELD (method_type_node, field, "index", unsigned_short_type_node);
797 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
798 PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
799 FINISH_RECORD (method_type_node);
800 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
801
802 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
803
804 t = tree_cons (NULL_TREE, class_ptr_type,
805 tree_cons (NULL_TREE, int_type_node, endlink));
806 alloc_object_node = builtin_function ("_Jv_AllocObject",
807 build_function_type (ptr_type_node, t),
808 0, NOT_BUILT_IN, NULL, NULL_TREE);
809 DECL_IS_MALLOC (alloc_object_node) = 1;
810 alloc_no_finalizer_node =
811 builtin_function ("_Jv_AllocObjectNoFinalizer",
812 build_function_type (ptr_type_node, t),
813 0, NOT_BUILT_IN, NULL, NULL_TREE);
814 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
815
816 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
817 soft_initclass_node = builtin_function ("_Jv_InitClass",
818 build_function_type (void_type_node,
819 t),
820 0, NOT_BUILT_IN, NULL, NULL_TREE);
821
822 throw_node = builtin_function ("_Jv_Throw",
823 build_function_type (ptr_type_node, t),
824 0, NOT_BUILT_IN, NULL, NULL_TREE);
825 /* Mark throw_nodes as `noreturn' functions with side effects. */
826 TREE_THIS_VOLATILE (throw_node) = 1;
827 TREE_SIDE_EFFECTS (throw_node) = 1;
828
829 t = build_function_type (int_type_node, endlink);
830 soft_monitorenter_node
831 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
832 NULL, NULL_TREE);
833 soft_monitorexit_node
834 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
835 NULL, NULL_TREE);
836
837 t = tree_cons (NULL_TREE, int_type_node,
838 tree_cons (NULL_TREE, int_type_node, endlink));
839 soft_newarray_node
840 = builtin_function ("_Jv_NewPrimArray",
841 build_function_type(ptr_type_node, t),
842 0, NOT_BUILT_IN, NULL, NULL_TREE);
843 DECL_IS_MALLOC (soft_newarray_node) = 1;
844
845 t = tree_cons (NULL_TREE, int_type_node,
846 tree_cons (NULL_TREE, class_ptr_type,
847 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
848 soft_anewarray_node
849 = builtin_function ("_Jv_NewObjectArray",
850 build_function_type (ptr_type_node, t),
851 0, NOT_BUILT_IN, NULL, NULL_TREE);
852 DECL_IS_MALLOC (soft_anewarray_node) = 1;
853
854 /* There is no endlink here because _Jv_NewMultiArray is a varargs
855 function. */
856 t = tree_cons (NULL_TREE, ptr_type_node,
857 tree_cons (NULL_TREE, int_type_node, NULL_TREE));
858 soft_multianewarray_node
859 = builtin_function ("_Jv_NewMultiArray",
860 build_function_type (ptr_type_node, t),
861 0, NOT_BUILT_IN, NULL, NULL_TREE);
862 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
863
864 t = build_function_type (void_type_node,
865 tree_cons (NULL_TREE, int_type_node, endlink));
866 soft_badarrayindex_node
867 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
868 0, NOT_BUILT_IN, NULL, NULL_TREE);
869 /* Mark soft_badarrayindex_node as a `noreturn' function with side
870 effects. */
871 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
872 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
873
874 soft_nullpointer_node
875 = builtin_function ("_Jv_ThrowNullPointerException",
876 build_function_type (void_type_node, endlink),
877 0, NOT_BUILT_IN, NULL, NULL_TREE);
878 /* Mark soft_nullpointer_node as a `noreturn' function with side
879 effects. */
880 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
881 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
882
883 t = tree_cons (NULL_TREE, class_ptr_type,
884 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
885 soft_checkcast_node
886 = builtin_function ("_Jv_CheckCast",
887 build_function_type (ptr_type_node, t),
888 0, NOT_BUILT_IN, NULL, NULL_TREE);
889 t = tree_cons (NULL_TREE, object_ptr_type_node,
890 tree_cons (NULL_TREE, class_ptr_type, endlink));
891 soft_instanceof_node
892 = builtin_function ("_Jv_IsInstanceOf",
893 build_function_type (boolean_type_node, t),
894 0, NOT_BUILT_IN, NULL, NULL_TREE);
895 t = tree_cons (NULL_TREE, object_ptr_type_node,
896 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
897 soft_checkarraystore_node
898 = builtin_function ("_Jv_CheckArrayStore",
899 build_function_type (void_type_node, t),
900 0, NOT_BUILT_IN, NULL, NULL_TREE);
901 t = tree_cons (NULL_TREE, ptr_type_node,
902 tree_cons (NULL_TREE, ptr_type_node,
903 tree_cons (NULL_TREE, int_type_node, endlink)));
904 soft_lookupinterfacemethod_node
905 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
906 build_function_type (ptr_type_node, t),
907 0, NOT_BUILT_IN, NULL, NULL_TREE);
908
909 t = tree_cons (NULL_TREE, object_ptr_type_node,
910 tree_cons (NULL_TREE, ptr_type_node,
911 tree_cons (NULL_TREE, ptr_type_node,
912 tree_cons (NULL_TREE, int_type_node,
913 endlink))));
914 soft_lookupjnimethod_node
915 = builtin_function ("_Jv_LookupJNIMethod",
916 build_function_type (ptr_type_node, t),
917 0, NOT_BUILT_IN, NULL, NULL_TREE);
918 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
919 soft_getjnienvnewframe_node
920 = builtin_function ("_Jv_GetJNIEnvNewFrame",
921 build_function_type (ptr_type_node, t),
922 0, NOT_BUILT_IN, NULL, NULL_TREE);
923 soft_jnipopsystemframe_node
924 = builtin_function ("_Jv_JNI_PopSystemFrame",
925 build_function_type (ptr_type_node, t),
926 0, NOT_BUILT_IN, NULL, NULL_TREE);
927
928 soft_idiv_node
929 = builtin_function ("_Jv_divI",
930 build_function_type (int_type_node, t),
931 0, NOT_BUILT_IN, NULL, NULL_TREE);
932
933 soft_irem_node
934 = builtin_function ("_Jv_remI",
935 build_function_type (int_type_node, t),
936 0, NOT_BUILT_IN, NULL, NULL_TREE);
937
938 soft_ldiv_node
939 = builtin_function ("_Jv_divJ",
940 build_function_type (long_type_node, t),
941 0, NOT_BUILT_IN, NULL, NULL_TREE);
942
943 soft_lrem_node
944 = builtin_function ("_Jv_remJ",
945 build_function_type (long_type_node, t),
946 0, NOT_BUILT_IN, NULL, NULL_TREE);
947
948 /* Initialize variables for except.c. */
949 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
950 ? "__gcj_personality_sj0"
951 : "__gcj_personality_v0");
952 lang_eh_runtime_type = prepare_eh_table_type;
953
954 init_jcf_parse ();
955
956 initialize_builtins ();
957
958 soft_fmod_node = built_in_decls[BUILT_IN_FMOD];
959 #if 0
960 soft_fmodf_node = built_in_decls[BUILT_IN_FMODF];
961 #endif
962 }
963
964
965 /* Look up NAME in the current binding level and its superiors
966 in the namespace of variables, functions and typedefs.
967 Return a ..._DECL node of some kind representing its definition,
968 or return 0 if it is undefined. */
969
970 tree
971 lookup_name (tree name)
972 {
973 register tree val;
974 if (current_binding_level != global_binding_level
975 && IDENTIFIER_LOCAL_VALUE (name))
976 val = IDENTIFIER_LOCAL_VALUE (name);
977 else
978 val = IDENTIFIER_GLOBAL_VALUE (name);
979 return val;
980 }
981
982 /* Similar to `lookup_name' but look only at current binding level and
983 the previous one if its the parameter level. */
984
985 static tree
986 lookup_name_current_level (tree name)
987 {
988 register tree t;
989
990 if (current_binding_level == global_binding_level)
991 return IDENTIFIER_GLOBAL_VALUE (name);
992
993 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
994 return 0;
995
996 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
997 if (DECL_NAME (t) == name)
998 break;
999
1000 return t;
1001 }
1002
1003 /* Use a binding level to record a labeled block declaration */
1004
1005 void
1006 push_labeled_block (tree lb)
1007 {
1008 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
1009 register struct binding_level *b = current_binding_level;
1010 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1011 if (oldlocal != 0)
1012 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1013 TREE_CHAIN (lb) = b->names;
1014 b->names = lb;
1015 IDENTIFIER_LOCAL_VALUE (name) = lb;
1016 }
1017
1018 /* Pop the current binding level, reinstalling values for the previous
1019 labeled block */
1020
1021 void
1022 pop_labeled_block (void)
1023 {
1024 struct binding_level *b = current_binding_level;
1025 tree label = b->names;
1026 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
1027 NULL_TREE;
1028 if (b->shadowed)
1029 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
1030 TREE_VALUE (b->shadowed);
1031
1032 /* Pop the current level, and free the structure for reuse. */
1033 current_binding_level = current_binding_level->level_chain;
1034 b->level_chain = free_binding_level;
1035 free_binding_level = b;
1036 }
1037
1038 /* Record a decl-node X as belonging to the current lexical scope.
1039 Check for errors (such as an incompatible declaration for the same
1040 name already seen in the same scope).
1041
1042 Returns either X or an old decl for the same name.
1043 If an old decl is returned, it may have been smashed
1044 to agree with what X says. */
1045
1046 tree
1047 pushdecl (tree x)
1048 {
1049 register tree t;
1050 register tree name = DECL_NAME (x);
1051 register struct binding_level *b = current_binding_level;
1052
1053 if (TREE_CODE (x) != TYPE_DECL)
1054 DECL_CONTEXT (x) = current_function_decl;
1055 if (name)
1056 {
1057 t = lookup_name_current_level (name);
1058 if (t != 0 && t == error_mark_node)
1059 /* error_mark_node is 0 for a while during initialization! */
1060 {
1061 t = 0;
1062 error ("%J'%D' used prior to declaration", x, x);
1063 }
1064
1065 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1066 to point to the TYPE_DECL.
1067 Since Java does not have typedefs, a type can only have
1068 one (true) name, given by a class, interface, or builtin. */
1069 if (TREE_CODE (x) == TYPE_DECL
1070 && TYPE_NAME (TREE_TYPE (x)) == 0
1071 && TREE_TYPE (x) != error_mark_node)
1072 {
1073 TYPE_NAME (TREE_TYPE (x)) = x;
1074 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1075 }
1076
1077 /* This name is new in its binding level.
1078 Install the new declaration and return it. */
1079 if (b == global_binding_level)
1080 {
1081 /* Install a global value. */
1082
1083 IDENTIFIER_GLOBAL_VALUE (name) = x;
1084 }
1085 else
1086 {
1087 /* Here to install a non-global value. */
1088 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1089 IDENTIFIER_LOCAL_VALUE (name) = x;
1090
1091 #if 0
1092 /* Warn if shadowing an argument at the top level of the body. */
1093 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1094 /* This warning doesn't apply to the parms of a nested fcn. */
1095 && ! current_binding_level->parm_flag
1096 /* Check that this is one level down from the parms. */
1097 && current_binding_level->level_chain->parm_flag
1098 /* Check that the decl being shadowed
1099 comes from the parm level, one level up. */
1100 && chain_member (oldlocal, current_binding_level->level_chain->names))
1101 {
1102 if (TREE_CODE (oldlocal) == PARM_DECL)
1103 pedwarn ("declaration of `%s' shadows a parameter",
1104 IDENTIFIER_POINTER (name));
1105 else
1106 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1107 IDENTIFIER_POINTER (name));
1108 }
1109
1110 /* Maybe warn if shadowing something else. */
1111 else if (warn_shadow && !DECL_EXTERNAL (x)
1112 /* No shadow warnings for internally generated vars. */
1113 && DECL_SOURCE_LINE (x) != 0
1114 /* No shadow warnings for vars made for inlining. */
1115 && ! DECL_FROM_INLINE (x))
1116 {
1117 const char *warnstring = 0;
1118
1119 if (TREE_CODE (x) == PARM_DECL
1120 && current_binding_level->level_chain->parm_flag)
1121 /* Don't warn about the parm names in function declarator
1122 within a function declarator.
1123 It would be nice to avoid warning in any function
1124 declarator in a declaration, as opposed to a definition,
1125 but there is no way to tell it's not a definition. */
1126 ;
1127 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1128 warnstring = "declaration of `%s' shadows a parameter";
1129 else if (oldlocal != 0)
1130 warnstring = "declaration of `%s' shadows previous local";
1131 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1132 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1133 warnstring = "declaration of `%s' shadows global declaration";
1134
1135 if (warnstring)
1136 warning (warnstring, IDENTIFIER_POINTER (name));
1137 }
1138 #endif
1139
1140 /* If storing a local value, there may already be one (inherited).
1141 If so, record it for restoration when this binding level ends. */
1142 if (oldlocal != 0)
1143 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1144 }
1145 }
1146
1147 /* Put decls on list in reverse order.
1148 We will reverse them later if necessary. */
1149 TREE_CHAIN (x) = b->names;
1150 b->names = x;
1151
1152 return x;
1153 }
1154
1155 void
1156 pushdecl_force_head (tree x)
1157 {
1158 current_binding_level->names = x;
1159 }
1160
1161 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1162
1163 tree
1164 pushdecl_top_level (tree x)
1165 {
1166 register tree t;
1167 register struct binding_level *b = current_binding_level;
1168
1169 current_binding_level = global_binding_level;
1170 t = pushdecl (x);
1171 current_binding_level = b;
1172 return t;
1173 }
1174
1175 /* Nonzero if we are currently in the global binding level. */
1176
1177 int
1178 global_bindings_p (void)
1179 {
1180 return current_binding_level == global_binding_level;
1181 }
1182
1183 /* Return the list of declarations of the current level.
1184 Note that this list is in reverse order unless/until
1185 you nreverse it; and when you do nreverse it, you must
1186 store the result back using `storedecls' or you will lose. */
1187
1188 tree
1189 getdecls (void)
1190 {
1191 return current_binding_level->names;
1192 }
1193
1194 /* Create a new `struct binding_level'. */
1195
1196 static struct binding_level *
1197 make_binding_level (void)
1198 {
1199 /* NOSTRICT */
1200 return xmalloc (sizeof (struct binding_level));
1201 }
1202
1203 void
1204 pushlevel (int unused ATTRIBUTE_UNUSED)
1205 {
1206 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1207
1208 #if 0
1209 /* If this is the top level of a function,
1210 just make sure that NAMED_LABELS is 0. */
1211
1212 if (current_binding_level == global_binding_level)
1213 named_labels = 0;
1214 #endif
1215
1216 /* Reuse or create a struct for this binding level. */
1217
1218 if (free_binding_level)
1219 {
1220 newlevel = free_binding_level;
1221 free_binding_level = free_binding_level->level_chain;
1222 }
1223 else
1224 {
1225 newlevel = make_binding_level ();
1226 }
1227
1228 /* Add this level to the front of the chain (stack) of levels that
1229 are active. */
1230
1231 *newlevel = clear_binding_level;
1232 newlevel->level_chain = current_binding_level;
1233 current_binding_level = newlevel;
1234 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1235 newlevel->binding_depth = binding_depth;
1236 indent ();
1237 fprintf (stderr, "push %s level 0x%08x pc %d\n",
1238 (is_class_level) ? "class" : "block", newlevel, current_pc);
1239 is_class_level = 0;
1240 binding_depth++;
1241 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1242 }
1243
1244 /* Exit a binding level.
1245 Pop the level off, and restore the state of the identifier-decl mappings
1246 that were in effect when this level was entered.
1247
1248 If KEEP is nonzero, this level had explicit declarations, so
1249 and create a "block" (a BLOCK node) for the level
1250 to record its declarations and subblocks for symbol table output.
1251
1252 If FUNCTIONBODY is nonzero, this level is the body of a function,
1253 so create a block as if KEEP were set and also clear out all
1254 label names.
1255
1256 If REVERSE is nonzero, reverse the order of decls before putting
1257 them into the BLOCK. */
1258
1259 tree
1260 poplevel (int keep, int reverse, int functionbody)
1261 {
1262 register tree link;
1263 /* The chain of decls was accumulated in reverse order.
1264 Put it into forward order, just for cleanliness. */
1265 tree decls;
1266 tree subblocks = current_binding_level->blocks;
1267 tree block = 0;
1268 tree decl;
1269 int block_previously_created;
1270 {
1271
1272 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1273 binding_depth--;
1274 indent ();
1275 if (current_binding_level->end_pc != LARGEST_PC)
1276 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1277 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1278 current_binding_level->end_pc);
1279 else
1280 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1281 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1282 #if 0
1283 if (is_class_level != (current_binding_level == class_binding_level))
1284 {
1285 indent ();
1286 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1287 }
1288 is_class_level = 0;
1289 #endif
1290 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1291
1292 /* Get the decls in the order they were written.
1293 Usually current_binding_level->names is in reverse order.
1294 But parameter decls were previously put in forward order. */
1295
1296 if (reverse)
1297 current_binding_level->names
1298 = decls = nreverse (current_binding_level->names);
1299 else
1300 decls = current_binding_level->names;
1301
1302 /* Output any nested inline functions within this block
1303 if they weren't already output. */
1304
1305 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1306 if (TREE_CODE (decl) == FUNCTION_DECL
1307 && ! TREE_ASM_WRITTEN (decl)
1308 && DECL_INITIAL (decl) != 0
1309 && TREE_ADDRESSABLE (decl))
1310 {
1311 /* If this decl was copied from a file-scope decl on account
1312 of a block-scope extern decl, propagate TREE_ADDRESSABLE
1313 to the file-scope decl.
1314
1315 DECL_ABSTRACT_ORIGIN can be set to itself if
1316 warn_return_type is true, since then the decl goes
1317 through save_for_inline_copying. */
1318 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1319 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1320 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1321 else
1322 {
1323 push_function_context ();
1324 output_inline_function (decl);
1325 pop_function_context ();
1326 }
1327 }
1328 else if (TREE_CODE (decl) == VAR_DECL
1329 && DECL_LANG_SPECIFIC (decl) != NULL
1330 && DECL_LOCAL_SLOT_NUMBER (decl))
1331 LOCAL_VAR_OUT_OF_SCOPE_P (decl) = 1;
1332 }
1333
1334 /* If there were any declarations in that level,
1335 or if this level is a function body,
1336 create a BLOCK to record them for the life of this function. */
1337
1338 block = 0;
1339 block_previously_created = (current_binding_level->this_block != 0);
1340 if (block_previously_created)
1341 block = current_binding_level->this_block;
1342 else if (keep || functionbody)
1343 block = make_node (BLOCK);
1344 if (block != 0)
1345 {
1346 BLOCK_VARS (block) = decls;
1347 BLOCK_SUBBLOCKS (block) = subblocks;
1348 }
1349
1350 /* In each subblock, record that this is its superior. */
1351
1352 for (link = subblocks; link; link = TREE_CHAIN (link))
1353 BLOCK_SUPERCONTEXT (link) = block;
1354
1355 /* Clear out the meanings of the local variables of this level. */
1356
1357 for (link = decls; link; link = TREE_CHAIN (link))
1358 {
1359 tree name = DECL_NAME (link);
1360 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1361 {
1362 /* If the ident. was used or addressed via a local extern decl,
1363 don't forget that fact. */
1364 if (DECL_EXTERNAL (link))
1365 {
1366 if (TREE_USED (link))
1367 TREE_USED (name) = 1;
1368 if (TREE_ADDRESSABLE (link))
1369 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1370 }
1371 IDENTIFIER_LOCAL_VALUE (name) = 0;
1372 }
1373 }
1374
1375 /* Restore all name-meanings of the outer levels
1376 that were shadowed by this level. */
1377
1378 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1379 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1380
1381 /* If the level being exited is the top level of a function,
1382 check over all the labels, and clear out the current
1383 (function local) meanings of their names. */
1384
1385 if (functionbody)
1386 {
1387 /* If this is the top level block of a function,
1388 the vars are the function's parameters.
1389 Don't leave them in the BLOCK because they are
1390 found in the FUNCTION_DECL instead. */
1391
1392 BLOCK_VARS (block) = 0;
1393
1394 /* Clear out the definitions of all label names,
1395 since their scopes end here,
1396 and add them to BLOCK_VARS. */
1397
1398 #if 0
1399 for (link = named_labels; link; link = TREE_CHAIN (link))
1400 {
1401 register tree label = TREE_VALUE (link);
1402
1403 if (DECL_INITIAL (label) == 0)
1404 {
1405 error ("%Jlabel '%D' used but not defined", label, label);
1406 /* Avoid crashing later. */
1407 define_label (input_location, DECL_NAME (label));
1408 }
1409 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1410 warning ("%Jlabel '%D' defined but not used", label, label);
1411 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1412
1413 /* Put the labels into the "variables" of the
1414 top-level block, so debugger can see them. */
1415 TREE_CHAIN (label) = BLOCK_VARS (block);
1416 BLOCK_VARS (block) = label;
1417 }
1418 #endif
1419 }
1420
1421 /* Pop the current level, and free the structure for reuse. */
1422
1423 {
1424 register struct binding_level *level = current_binding_level;
1425 current_binding_level = current_binding_level->level_chain;
1426
1427 level->level_chain = free_binding_level;
1428 free_binding_level = level;
1429 }
1430
1431 /* Dispose of the block that we just made inside some higher level. */
1432 if (functionbody)
1433 DECL_INITIAL (current_function_decl) = block;
1434 else if (block)
1435 {
1436 if (!block_previously_created)
1437 current_binding_level->blocks
1438 = chainon (current_binding_level->blocks, block);
1439 }
1440 /* If we did not make a block for the level just exited,
1441 any blocks made for inner levels
1442 (since they cannot be recorded as subblocks in that level)
1443 must be carried forward so they will later become subblocks
1444 of something else. */
1445 else if (subblocks)
1446 current_binding_level->blocks
1447 = chainon (current_binding_level->blocks, subblocks);
1448
1449 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1450 binding contour so that they point to the appropriate construct, i.e.
1451 either to the current FUNCTION_DECL node, or else to the BLOCK node
1452 we just constructed.
1453
1454 Note that for tagged types whose scope is just the formal parameter
1455 list for some function type specification, we can't properly set
1456 their TYPE_CONTEXTs here, because we don't have a pointer to the
1457 appropriate FUNCTION_TYPE node readily available to us. For those
1458 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1459 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1460 node which will represent the "scope" for these "parameter list local"
1461 tagged types.
1462 */
1463
1464 if (block)
1465 TREE_USED (block) = 1;
1466 return block;
1467 }
1468
1469 void
1470 maybe_pushlevels (int pc)
1471 {
1472 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1473 current_pc = pc;
1474 #endif
1475
1476 while (pending_local_decls != NULL_TREE &&
1477 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1478 {
1479 tree *ptr = &pending_local_decls;
1480 tree decl = *ptr;
1481 int end_pc = DECL_LOCAL_END_PC (decl);
1482
1483 while (*ptr != NULL_TREE
1484 && DECL_LOCAL_START_PC (*ptr) <= pc
1485 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1486 ptr = &TREE_CHAIN (*ptr);
1487 pending_local_decls = *ptr;
1488 *ptr = NULL_TREE;
1489
1490 /* Force non-nested range to be nested in current range. */
1491 if (end_pc > current_binding_level->end_pc)
1492 end_pc = current_binding_level->end_pc;
1493
1494 maybe_start_try (pc, end_pc);
1495
1496 pushlevel (1);
1497 expand_start_bindings (0);
1498
1499 current_binding_level->end_pc = end_pc;
1500 current_binding_level->start_pc = pc;
1501 current_binding_level->names = decl;
1502 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1503 {
1504 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1505 }
1506 }
1507
1508 maybe_start_try (pc, 0);
1509 }
1510
1511 void
1512 maybe_poplevels (int pc)
1513 {
1514 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1515 current_pc = pc;
1516 #endif
1517
1518 while (current_binding_level->end_pc <= pc)
1519 {
1520 expand_end_bindings (getdecls (), 1, 0);
1521 maybe_end_try (current_binding_level->start_pc, pc);
1522 poplevel (1, 0, 0);
1523 }
1524 maybe_end_try (0, pc);
1525 }
1526
1527 /* Terminate any binding which began during the range beginning at
1528 start_pc. This tidies up improperly nested local variable ranges
1529 and exception handlers; a variable declared within an exception
1530 range is forcibly terminated when that exception ends. */
1531
1532 void
1533 force_poplevels (int start_pc)
1534 {
1535 while (current_binding_level->start_pc > start_pc)
1536 {
1537 if (pedantic && current_binding_level->start_pc > start_pc)
1538 warning ("%JIn %D: overlapped variable and exception ranges at %d",
1539 current_function_decl, current_function_decl,
1540 current_binding_level->start_pc);
1541 expand_end_bindings (getdecls (), 1, 0);
1542 poplevel (1, 0, 0);
1543 }
1544 }
1545
1546 /* Insert BLOCK at the end of the list of subblocks of the
1547 current binding level. This is used when a BIND_EXPR is expanded,
1548 to handle the BLOCK node inside the BIND_EXPR. */
1549
1550 void
1551 insert_block (tree block)
1552 {
1553 TREE_USED (block) = 1;
1554 current_binding_level->blocks
1555 = chainon (current_binding_level->blocks, block);
1556 }
1557
1558 /* Set the BLOCK node for the innermost scope
1559 (the one we are currently in). */
1560
1561 void
1562 set_block (tree block)
1563 {
1564 current_binding_level->this_block = block;
1565 current_binding_level->names = chainon (current_binding_level->names,
1566 BLOCK_VARS (block));
1567 current_binding_level->blocks = chainon (current_binding_level->blocks,
1568 BLOCK_SUBBLOCKS (block));
1569 }
1570
1571 /* integrate_decl_tree calls this function. */
1572
1573 void
1574 java_dup_lang_specific_decl (tree node)
1575 {
1576 int lang_decl_size;
1577 struct lang_decl *x;
1578
1579 if (!DECL_LANG_SPECIFIC (node))
1580 return;
1581
1582 lang_decl_size = sizeof (struct lang_decl);
1583 x = ggc_alloc (lang_decl_size);
1584 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1585 DECL_LANG_SPECIFIC (node) = x;
1586 }
1587
1588 void
1589 give_name_to_locals (JCF *jcf)
1590 {
1591 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1592 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1593 tree parm;
1594 pending_local_decls = NULL_TREE;
1595 if (n == 0)
1596 return;
1597 JCF_SEEK (jcf, n);
1598 n = JCF_readu2 (jcf);
1599 for (i = 0; i < n; i++)
1600 {
1601 int start_pc = JCF_readu2 (jcf);
1602 int length = JCF_readu2 (jcf);
1603 int name_index = JCF_readu2 (jcf);
1604 int signature_index = JCF_readu2 (jcf);
1605 int slot = JCF_readu2 (jcf);
1606 tree name = get_name_constant (jcf, name_index);
1607 tree type = parse_signature (jcf, signature_index);
1608 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1609 && start_pc == 0
1610 && length == DECL_CODE_LENGTH (current_function_decl))
1611 {
1612 tree decl = TREE_VEC_ELT (decl_map, slot);
1613 DECL_NAME (decl) = name;
1614 SET_DECL_ASSEMBLER_NAME (decl, name);
1615 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1616 warning ("bad type in parameter debug info");
1617 }
1618 else
1619 {
1620 tree *ptr;
1621 int end_pc = start_pc + length;
1622 tree decl = build_decl (VAR_DECL, name, type);
1623 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1624 {
1625 warning ("%Jbad PC range for debug info for local '%D'",
1626 decl, decl);
1627 end_pc = DECL_CODE_LENGTH (current_function_decl);
1628 }
1629
1630 /* Adjust start_pc if necessary so that the local's first
1631 store operation will use the relevant DECL as a
1632 destination. Fore more information, read the leading
1633 comments for expr.c:maybe_adjust_start_pc. */
1634 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1635
1636 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1637 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1638 DECL_LOCAL_START_PC (decl) = start_pc;
1639 #if 0
1640 /* FIXME: The range used internally for exceptions and local
1641 variable ranges, is a half-open interval:
1642 start_pc <= pc < end_pc. However, the range used in the
1643 Java VM spec is inclusive at both ends:
1644 start_pc <= pc <= end_pc. */
1645 end_pc++;
1646 #endif
1647 DECL_LOCAL_END_PC (decl) = end_pc;
1648
1649 /* Now insert the new decl in the proper place in
1650 pending_local_decls. We are essentially doing an insertion sort,
1651 which works fine, since the list input will normally already
1652 be sorted. */
1653 ptr = &pending_local_decls;
1654 while (*ptr != NULL_TREE
1655 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1656 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1657 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1658 ptr = &TREE_CHAIN (*ptr);
1659 TREE_CHAIN (decl) = *ptr;
1660 *ptr = decl;
1661 }
1662 }
1663
1664 pending_local_decls = nreverse (pending_local_decls);
1665
1666 /* Fill in default names for the parameters. */
1667 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1668 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1669 {
1670 if (DECL_NAME (parm) == NULL_TREE)
1671 {
1672 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1673 if (arg_i == 0)
1674 DECL_NAME (parm) = get_identifier ("this");
1675 else
1676 {
1677 char buffer[12];
1678 sprintf (buffer, "ARG_%d", arg_i);
1679 DECL_NAME (parm) = get_identifier (buffer);
1680 }
1681 SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1682 }
1683 }
1684 }
1685
1686 tree
1687 build_result_decl (tree fndecl)
1688 {
1689 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1690 tree result = DECL_RESULT (fndecl);
1691 if (! result)
1692 {
1693 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1694 if (INTEGRAL_TYPE_P (restype)
1695 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1696 restype = integer_type_node;
1697 result = build_decl (RESULT_DECL, NULL_TREE, restype);
1698 DECL_CONTEXT (result) = fndecl;
1699 DECL_RESULT (fndecl) = result;
1700 }
1701 return result;
1702 }
1703
1704 void
1705 complete_start_java_method (tree fndecl)
1706 {
1707 if (! flag_emit_class_files)
1708 {
1709 /* Initialize the RTL code for the function. */
1710 init_function_start (fndecl);
1711
1712 /* Set up parameters and prepare for return, for the function. */
1713 expand_function_start (fndecl, 0);
1714 }
1715
1716 #if 0
1717 /* If this fcn was already referenced via a block-scope `extern' decl (or
1718 an implicit decl), propagate certain information about the usage. */
1719 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1720 TREE_ADDRESSABLE (current_function_decl) = 1;
1721
1722 #endif
1723
1724 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1725 && ! flag_emit_class_files
1726 && ! DECL_CLINIT_P (fndecl)
1727 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1728 {
1729 tree clas = DECL_CONTEXT (fndecl);
1730 tree init = build (CALL_EXPR, void_type_node,
1731 build_address_of (soft_initclass_node),
1732 build_tree_list (NULL_TREE, build_class_ref (clas)),
1733 NULL_TREE);
1734 TREE_SIDE_EFFECTS (init) = 1;
1735 expand_expr_stmt (init);
1736 }
1737
1738 /* Push local variables. Function compiled from source code are
1739 using a different local variables management, and for them,
1740 pushlevel shouldn't be called from here. */
1741 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1742 {
1743 pushlevel (2);
1744 if (! flag_emit_class_files)
1745 expand_start_bindings (1);
1746 }
1747
1748 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1749 {
1750 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1751 tree enter, exit, lock;
1752 if (METHOD_STATIC (fndecl))
1753 lock = build_class_ref (DECL_CONTEXT (fndecl));
1754 else
1755 lock = DECL_ARGUMENTS (fndecl);
1756 BUILD_MONITOR_ENTER (enter, lock);
1757 BUILD_MONITOR_EXIT (exit, lock);
1758 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1759 {
1760 expand_expr_stmt (enter);
1761 expand_decl_cleanup (NULL_TREE, exit);
1762 }
1763 else
1764 {
1765 tree function_body = DECL_FUNCTION_BODY (fndecl);
1766 tree body = BLOCK_EXPR_BODY (function_body);
1767 lock = build (COMPOUND_EXPR, void_type_node,
1768 enter,
1769 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
1770 TREE_SIDE_EFFECTS (lock) = 1;
1771 BLOCK_EXPR_BODY (function_body) = lock;
1772 }
1773 }
1774 }
1775
1776 void
1777 start_java_method (tree fndecl)
1778 {
1779 tree tem, *ptr;
1780 int i;
1781
1782 current_function_decl = fndecl;
1783 announce_function (fndecl);
1784
1785 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1786 decl_map = make_tree_vec (i);
1787 type_map = xrealloc (type_map, i * sizeof (tree));
1788
1789 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1790 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1791 current_pc = 0;
1792 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1793 pushlevel (1); /* Push parameters. */
1794
1795 ptr = &DECL_ARGUMENTS (fndecl);
1796 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1797 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1798 {
1799 tree parm_name = NULL_TREE, parm_decl;
1800 tree parm_type = TREE_VALUE (tem);
1801 if (i >= DECL_MAX_LOCALS (fndecl))
1802 abort ();
1803
1804 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1805 DECL_CONTEXT (parm_decl) = fndecl;
1806 if (PROMOTE_PROTOTYPES
1807 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1808 && INTEGRAL_TYPE_P (parm_type))
1809 parm_type = integer_type_node;
1810 DECL_ARG_TYPE (parm_decl) = parm_type;
1811
1812 *ptr = parm_decl;
1813 ptr = &TREE_CHAIN (parm_decl);
1814
1815 /* Add parm_decl to the decl_map. */
1816 push_jvm_slot (i, parm_decl);
1817
1818 type_map[i] = TREE_TYPE (parm_decl);
1819 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1820 {
1821 i++;
1822 type_map[i] = void_type_node;
1823 }
1824 }
1825 *ptr = NULL_TREE;
1826 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1827
1828 while (i < DECL_MAX_LOCALS(fndecl))
1829 type_map[i++] = NULL_TREE;
1830
1831 build_result_decl (fndecl);
1832 complete_start_java_method (fndecl);
1833 }
1834
1835 void
1836 end_java_method (void)
1837 {
1838 tree fndecl = current_function_decl;
1839
1840 expand_end_bindings (getdecls (), 1, 0);
1841 /* pop out of function */
1842 poplevel (1, 1, 0);
1843
1844 /* pop out of its parameters */
1845 poplevel (1, 0, 1);
1846
1847 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1848
1849 /* Generate rtl for function exit. */
1850 expand_function_end ();
1851
1852 /* Run the optimizers and output assembler code for this function. */
1853 rest_of_compilation (fndecl);
1854
1855 current_function_decl = NULL_TREE;
1856 }
1857
1858 /* Expand a function's body. */
1859
1860 void
1861 java_expand_body (tree fndecl)
1862 {
1863 location_t saved_location = input_location;
1864
1865 current_function_decl = fndecl;
1866 input_location = DECL_SOURCE_LOCATION (fndecl);
1867
1868 timevar_push (TV_EXPAND);
1869
1870 /* Prepare the function for tree completion. */
1871 start_complete_expand_method (fndecl);
1872
1873 if (! flag_emit_class_files && ! flag_emit_xref)
1874 {
1875 /* Initialize the RTL code for the function. */
1876 init_function_start (fndecl);
1877
1878 /* Set up parameters and prepare for return, for the function. */
1879 expand_function_start (fndecl, 0);
1880
1881 /* Generate the RTL for this function. */
1882 expand_expr_stmt_value (DECL_SAVED_TREE (fndecl), 0, 1);
1883 }
1884
1885 /* Pop out of its parameters. */
1886 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
1887 poplevel (1, 0, 1);
1888 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1889
1890 if (! flag_emit_class_files && ! flag_emit_xref)
1891 {
1892 /* Generate RTL for function exit. */
1893 input_line = DECL_FUNCTION_LAST_LINE (fndecl);
1894 expand_function_end ();
1895
1896 /* Run the optimizers and output the assembler code
1897 for this function. */
1898 rest_of_compilation (fndecl);
1899 }
1900
1901 timevar_pop (TV_EXPAND);
1902
1903 input_location = saved_location;
1904
1905 current_function_decl = NULL_TREE;
1906 }
1907
1908 /* We pessimistically marked all methods and fields external until we
1909 knew what set of classes we were planning to compile. Now mark those
1910 associated with CLASS to be generated locally as not external. */
1911
1912 static void
1913 java_mark_decl_local (tree decl)
1914 {
1915 DECL_EXTERNAL (decl) = 0;
1916
1917 /* If we've already constructed DECL_RTL, give encode_section_info
1918 a second chance, now that we've changed the flags. */
1919 if (DECL_RTL_SET_P (decl))
1920 make_decl_rtl (decl, NULL);
1921 }
1922
1923 void
1924 java_mark_class_local (tree class)
1925 {
1926 tree t;
1927
1928 for (t = TYPE_FIELDS (class); t ; t = TREE_CHAIN (t))
1929 if (FIELD_STATIC (t))
1930 java_mark_decl_local (t);
1931
1932 for (t = TYPE_METHODS (class); t ; t = TREE_CHAIN (t))
1933 if (!METHOD_ABSTRACT (t) && (!METHOD_NATIVE (t) || flag_jni))
1934 java_mark_decl_local (t);
1935 }
1936
1937 #include "gt-java-decl.h"