class.c (make_class_data): Push field value to 'hack_signers' instead of 'signers'.
[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
557 rawdata_ptr_type_node
558 = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData")));
559
560 add_predefined_file (get_identifier ("java/lang/Class.java"));
561 add_predefined_file (get_identifier ("java/lang/Error.java"));
562 add_predefined_file (get_identifier ("java/lang/Object.java"));
563 add_predefined_file (get_identifier ("java/lang/RuntimeException.java"));
564 add_predefined_file (get_identifier ("java/lang/String.java"));
565 add_predefined_file (get_identifier ("java/lang/Throwable.java"));
566 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
567 add_predefined_file (get_identifier ("java/lang/Exception.java"));
568 add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java"));
569 add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java"));
570 add_predefined_file (get_identifier ("gnu/gcj/RawData.java"));
571
572 methodtable_type = make_node (RECORD_TYPE);
573 layout_type (methodtable_type);
574 build_decl (TYPE_DECL, get_identifier ("methodtable"), methodtable_type);
575 methodtable_ptr_type = build_pointer_type (methodtable_type);
576
577 TYPE_identifier_node = get_identifier ("TYPE");
578 init_identifier_node = get_identifier ("<init>");
579 clinit_identifier_node = get_identifier ("<clinit>");
580 finit_identifier_node = get_identifier ("finit$");
581 instinit_identifier_node = get_identifier ("instinit$");
582 void_signature_node = get_identifier ("()V");
583 length_identifier_node = get_identifier ("length");
584 finalize_identifier_node = get_identifier ("finalize");
585 this_identifier_node = get_identifier ("this");
586 super_identifier_node = get_identifier ("super");
587 continue_identifier_node = get_identifier ("continue");
588 access0_identifier_node = get_identifier ("access$0");
589 classdollar_identifier_node = get_identifier ("class$");
590
591 java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
592 java_io_serializable_identifier_node =
593 get_identifier ("java.io.Serializable");
594
595 /* for lack of a better place to put this stub call */
596 init_expr_processing();
597
598 utf8const_type = make_node (RECORD_TYPE);
599 PUSH_FIELD (utf8const_type, field, "hash", unsigned_short_type_node);
600 PUSH_FIELD (utf8const_type, field, "length", unsigned_short_type_node);
601 FINISH_RECORD (utf8const_type);
602 utf8const_ptr_type = build_pointer_type (utf8const_type);
603
604 constants_type_node = make_node (RECORD_TYPE);
605 PUSH_FIELD (constants_type_node, field, "size", unsigned_int_type_node);
606 PUSH_FIELD (constants_type_node, field, "tags", ptr_type_node);
607 PUSH_FIELD (constants_type_node, field, "data", ptr_type_node);
608 FINISH_RECORD (constants_type_node);
609 build_decl (TYPE_DECL, get_identifier ("constants"), constants_type_node);
610
611 access_flags_type_node = unsigned_short_type_node;
612
613 dtable_type = make_node (RECORD_TYPE);
614 dtable_ptr_type = build_pointer_type (dtable_type);
615
616 one_elt_array_domain_type = build_index_type (integer_one_node);
617 otable_type = build_array_type (integer_type_node,
618 one_elt_array_domain_type);
619 TYPE_NONALIASED_COMPONENT (otable_type) = 1;
620 otable_ptr_type = build_pointer_type (otable_type);
621 atable_type = build_array_type (ptr_type_node,
622 one_elt_array_domain_type);
623 TYPE_NONALIASED_COMPONENT (atable_type) = 1;
624 atable_ptr_type = build_pointer_type (atable_type);
625
626 symbol_type = make_node (RECORD_TYPE);
627 PUSH_FIELD (symbol_type, field, "clname", utf8const_ptr_type);
628 PUSH_FIELD (symbol_type, field, "name", utf8const_ptr_type);
629 PUSH_FIELD (symbol_type, field, "signature", utf8const_ptr_type);
630 FINISH_RECORD (symbol_type);
631
632 symbols_array_type = build_array_type (symbol_type,
633 one_elt_array_domain_type);
634 symbols_array_ptr_type = build_pointer_type (symbols_array_type);
635
636 if (flag_indirect_dispatch)
637 {
638 otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), otable_type);
639 DECL_EXTERNAL (otable_decl) = 1;
640 TREE_STATIC (otable_decl) = 1;
641 TREE_READONLY (otable_decl) = 1;
642 TREE_CONSTANT (otable_decl) = 1;
643 pushdecl (otable_decl);
644 otable_syms_decl = build_decl (VAR_DECL, get_identifier ("otable_syms"),
645 symbols_array_type);
646 TREE_STATIC (otable_syms_decl) = 1;
647 TREE_CONSTANT (otable_syms_decl) = 1;
648 pushdecl (otable_syms_decl);
649
650 atable_decl = build_decl (VAR_DECL, get_identifier ("atable"), atable_type);
651 DECL_EXTERNAL (atable_decl) = 1;
652 TREE_STATIC (atable_decl) = 1;
653 TREE_READONLY (atable_decl) = 1;
654 TREE_CONSTANT (atable_decl) = 1;
655 pushdecl (atable_decl);
656 atable_syms_decl = build_decl (VAR_DECL, get_identifier ("atable_syms"),
657 symbols_array_type);
658 TREE_STATIC (atable_syms_decl) = 1;
659 TREE_CONSTANT (atable_syms_decl) = 1;
660 pushdecl (atable_syms_decl);
661 }
662
663 {
664 tree catch_class_type = make_node (RECORD_TYPE);
665 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
666 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
667 FINISH_RECORD (catch_class_type);
668
669 ctable_decl
670 = build_decl (VAR_DECL, get_identifier ("catch_classes"),
671 build_array_type
672 (catch_class_type, 0));
673 DECL_EXTERNAL (ctable_decl) = 1;
674 TREE_STATIC (ctable_decl) = 1;
675 TREE_READONLY (ctable_decl) = 1;
676 TREE_CONSTANT (ctable_decl) = 1;
677 pushdecl (ctable_decl);
678 }
679
680 PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type);
681 /* This isn't exactly true, but it is what we have in the source.
682 There is an unresolved issue here, which is whether the vtable
683 should be marked by the GC. */
684 if (! flag_hash_synchronization)
685 PUSH_FIELD (object_type_node, field, "sync_info",
686 build_pointer_type (object_type_node));
687 for (t = TYPE_FIELDS (object_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
688 FIELD_PRIVATE (t) = 1;
689 FINISH_RECORD (object_type_node);
690
691 field_type_node = make_node (RECORD_TYPE);
692 field_ptr_type_node = build_pointer_type (field_type_node);
693 method_type_node = make_node (RECORD_TYPE);
694 method_ptr_type_node = build_pointer_type (method_type_node);
695
696 set_super_info (0, class_type_node, object_type_node, 0);
697 set_super_info (0, string_type_node, object_type_node, 0);
698 class_ptr_type = build_pointer_type (class_type_node);
699
700 PUSH_FIELD (class_type_node, field, "next", class_ptr_type);
701 PUSH_FIELD (class_type_node, field, "name", utf8const_ptr_type);
702 PUSH_FIELD (class_type_node, field, "accflags", access_flags_type_node);
703 PUSH_FIELD (class_type_node, field, "superclass", class_ptr_type);
704 PUSH_FIELD (class_type_node, field, "constants", constants_type_node);
705 PUSH_FIELD (class_type_node, field, "methods", method_ptr_type_node);
706 PUSH_FIELD (class_type_node, field, "method_count", short_type_node);
707 PUSH_FIELD (class_type_node, field, "vtable_method_count", short_type_node);
708 PUSH_FIELD (class_type_node, field, "fields", field_ptr_type_node);
709 PUSH_FIELD (class_type_node, field, "size_in_bytes", int_type_node);
710 PUSH_FIELD (class_type_node, field, "field_count", short_type_node);
711 PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node);
712 PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type);
713 PUSH_FIELD (class_type_node, field, "otable", otable_ptr_type);
714 PUSH_FIELD (class_type_node, field, "otable_syms",
715 symbols_array_ptr_type);
716 PUSH_FIELD (class_type_node, field, "atable", atable_ptr_type);
717 PUSH_FIELD (class_type_node, field, "atable_syms",
718 symbols_array_ptr_type);
719 PUSH_FIELD (class_type_node, field, "catch_classes", ptr_type_node);
720 PUSH_FIELD (class_type_node, field, "interfaces",
721 build_pointer_type (class_ptr_type));
722 PUSH_FIELD (class_type_node, field, "loader", ptr_type_node);
723 PUSH_FIELD (class_type_node, field, "interface_count", short_type_node);
724 PUSH_FIELD (class_type_node, field, "state", byte_type_node);
725 PUSH_FIELD (class_type_node, field, "thread", ptr_type_node);
726 PUSH_FIELD (class_type_node, field, "depth", short_type_node);
727 PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node);
728 PUSH_FIELD (class_type_node, field, "idt", ptr_type_node);
729 PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node);
730 PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node);
731 PUSH_FIELD (class_type_node, field, "hack_signers", ptr_type_node);
732 PUSH_FIELD (class_type_node, field, "chain", ptr_type_node);
733 for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t))
734 FIELD_PRIVATE (t) = 1;
735 push_super_field (class_type_node, object_type_node);
736
737 FINISH_RECORD (class_type_node);
738 build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node);
739
740 field_info_union_node = make_node (UNION_TYPE);
741 PUSH_FIELD (field_info_union_node, field, "boffset", int_type_node);
742 PUSH_FIELD (field_info_union_node, field, "addr", ptr_type_node);
743 #if 0
744 PUSH_FIELD (field_info_union_node, field, "idx", unsigned_short_type_node);
745 #endif
746 layout_type (field_info_union_node);
747
748 PUSH_FIELD (field_type_node, field, "name", utf8const_ptr_type);
749 PUSH_FIELD (field_type_node, field, "type", class_ptr_type);
750 PUSH_FIELD (field_type_node, field, "accflags", access_flags_type_node);
751 PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node);
752 PUSH_FIELD (field_type_node, field, "info", field_info_union_node);
753 FINISH_RECORD (field_type_node);
754 build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node);
755
756 nativecode_ptr_array_type_node
757 = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type);
758
759 PUSH_FIELD (dtable_type, field, "class", class_ptr_type);
760 PUSH_FIELD (dtable_type, field, "methods", nativecode_ptr_array_type_node);
761 FINISH_RECORD (dtable_type);
762 build_decl (TYPE_DECL, get_identifier ("dispatchTable"), dtable_type);
763
764 #define jint_type int_type_node
765 #define jint_ptr_type ptr_type_node
766
767 jexception_type = make_node (RECORD_TYPE);
768 PUSH_FIELD (jexception_type, field, "start_pc", ptr_type_node);
769 PUSH_FIELD (jexception_type, field, "end_pc", ptr_type_node);
770 PUSH_FIELD (jexception_type, field, "handler_pc", ptr_type_node);
771 PUSH_FIELD (jexception_type, field, "catch_type", class_ptr_type);
772 FINISH_RECORD (jexception_type);
773 build_decl (TYPE_DECL, get_identifier ("jexception"), field_type_node);
774 jexception_ptr_type = build_pointer_type (jexception_type);
775
776 lineNumberEntry_type = make_node (RECORD_TYPE);
777 PUSH_FIELD (lineNumberEntry_type, field, "line_nr", unsigned_short_type_node);
778 PUSH_FIELD (lineNumberEntry_type, field, "start_pc", ptr_type_node);
779 FINISH_RECORD (lineNumberEntry_type);
780
781 lineNumbers_type = make_node (RECORD_TYPE);
782 PUSH_FIELD (lineNumbers_type, field, "length", unsigned_int_type_node);
783 FINISH_RECORD (lineNumbers_type);
784
785 #define instn_ptr_type_node ptr_type_node /* XXX JH */
786
787 #define lineNumbers_ptr_type_node build_pointer_type(lineNumbers_type)
788
789 PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type);
790 PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
791 PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
792 PUSH_FIELD (method_type_node, field, "index", unsigned_short_type_node);
793 PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
794 PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
795 FINISH_RECORD (method_type_node);
796 build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);
797
798 endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
799
800 t = tree_cons (NULL_TREE, class_ptr_type,
801 tree_cons (NULL_TREE, int_type_node, endlink));
802 alloc_object_node = builtin_function ("_Jv_AllocObject",
803 build_function_type (ptr_type_node, t),
804 0, NOT_BUILT_IN, NULL, NULL_TREE);
805 DECL_IS_MALLOC (alloc_object_node) = 1;
806 alloc_no_finalizer_node =
807 builtin_function ("_Jv_AllocObjectNoFinalizer",
808 build_function_type (ptr_type_node, t),
809 0, NOT_BUILT_IN, NULL, NULL_TREE);
810 DECL_IS_MALLOC (alloc_no_finalizer_node) = 1;
811
812 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
813 soft_initclass_node = builtin_function ("_Jv_InitClass",
814 build_function_type (void_type_node,
815 t),
816 0, NOT_BUILT_IN, NULL, NULL_TREE);
817
818 throw_node = builtin_function ("_Jv_Throw",
819 build_function_type (ptr_type_node, t),
820 0, NOT_BUILT_IN, NULL, NULL_TREE);
821 /* Mark throw_nodes as `noreturn' functions with side effects. */
822 TREE_THIS_VOLATILE (throw_node) = 1;
823 TREE_SIDE_EFFECTS (throw_node) = 1;
824
825 t = build_function_type (int_type_node, endlink);
826 soft_monitorenter_node
827 = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN,
828 NULL, NULL_TREE);
829 soft_monitorexit_node
830 = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN,
831 NULL, NULL_TREE);
832
833 t = tree_cons (NULL_TREE, int_type_node,
834 tree_cons (NULL_TREE, int_type_node, endlink));
835 soft_newarray_node
836 = builtin_function ("_Jv_NewPrimArray",
837 build_function_type(ptr_type_node, t),
838 0, NOT_BUILT_IN, NULL, NULL_TREE);
839 DECL_IS_MALLOC (soft_newarray_node) = 1;
840
841 t = tree_cons (NULL_TREE, int_type_node,
842 tree_cons (NULL_TREE, class_ptr_type,
843 tree_cons (NULL_TREE, object_ptr_type_node, endlink)));
844 soft_anewarray_node
845 = builtin_function ("_Jv_NewObjectArray",
846 build_function_type (ptr_type_node, t),
847 0, NOT_BUILT_IN, NULL, NULL_TREE);
848 DECL_IS_MALLOC (soft_anewarray_node) = 1;
849
850 /* There is no endlink here because _Jv_NewMultiArray is a varargs
851 function. */
852 t = tree_cons (NULL_TREE, ptr_type_node,
853 tree_cons (NULL_TREE, int_type_node, NULL_TREE));
854 soft_multianewarray_node
855 = builtin_function ("_Jv_NewMultiArray",
856 build_function_type (ptr_type_node, t),
857 0, NOT_BUILT_IN, NULL, NULL_TREE);
858 DECL_IS_MALLOC (soft_multianewarray_node) = 1;
859
860 t = build_function_type (void_type_node,
861 tree_cons (NULL_TREE, int_type_node, endlink));
862 soft_badarrayindex_node
863 = builtin_function ("_Jv_ThrowBadArrayIndex", t,
864 0, NOT_BUILT_IN, NULL, NULL_TREE);
865 /* Mark soft_badarrayindex_node as a `noreturn' function with side
866 effects. */
867 TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1;
868 TREE_SIDE_EFFECTS (soft_badarrayindex_node) = 1;
869
870 soft_nullpointer_node
871 = builtin_function ("_Jv_ThrowNullPointerException",
872 build_function_type (void_type_node, endlink),
873 0, NOT_BUILT_IN, NULL, NULL_TREE);
874 /* Mark soft_nullpointer_node as a `noreturn' function with side
875 effects. */
876 TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
877 TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
878
879 t = tree_cons (NULL_TREE, class_ptr_type,
880 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
881 soft_checkcast_node
882 = builtin_function ("_Jv_CheckCast",
883 build_function_type (ptr_type_node, t),
884 0, NOT_BUILT_IN, NULL, NULL_TREE);
885 t = tree_cons (NULL_TREE, object_ptr_type_node,
886 tree_cons (NULL_TREE, class_ptr_type, endlink));
887 soft_instanceof_node
888 = builtin_function ("_Jv_IsInstanceOf",
889 build_function_type (boolean_type_node, t),
890 0, NOT_BUILT_IN, NULL, NULL_TREE);
891 t = tree_cons (NULL_TREE, object_ptr_type_node,
892 tree_cons (NULL_TREE, object_ptr_type_node, endlink));
893 soft_checkarraystore_node
894 = builtin_function ("_Jv_CheckArrayStore",
895 build_function_type (void_type_node, t),
896 0, NOT_BUILT_IN, NULL, NULL_TREE);
897 t = tree_cons (NULL_TREE, ptr_type_node,
898 tree_cons (NULL_TREE, ptr_type_node,
899 tree_cons (NULL_TREE, int_type_node, endlink)));
900 soft_lookupinterfacemethod_node
901 = builtin_function ("_Jv_LookupInterfaceMethodIdx",
902 build_function_type (ptr_type_node, t),
903 0, NOT_BUILT_IN, NULL, NULL_TREE);
904
905 t = tree_cons (NULL_TREE, object_ptr_type_node,
906 tree_cons (NULL_TREE, ptr_type_node,
907 tree_cons (NULL_TREE, ptr_type_node,
908 tree_cons (NULL_TREE, int_type_node,
909 endlink))));
910 soft_lookupjnimethod_node
911 = builtin_function ("_Jv_LookupJNIMethod",
912 build_function_type (ptr_type_node, t),
913 0, NOT_BUILT_IN, NULL, NULL_TREE);
914 t = tree_cons (NULL_TREE, ptr_type_node, endlink);
915 soft_getjnienvnewframe_node
916 = builtin_function ("_Jv_GetJNIEnvNewFrame",
917 build_function_type (ptr_type_node, t),
918 0, NOT_BUILT_IN, NULL, NULL_TREE);
919 soft_jnipopsystemframe_node
920 = builtin_function ("_Jv_JNI_PopSystemFrame",
921 build_function_type (ptr_type_node, t),
922 0, NOT_BUILT_IN, NULL, NULL_TREE);
923
924 soft_idiv_node
925 = builtin_function ("_Jv_divI",
926 build_function_type (int_type_node, t),
927 0, NOT_BUILT_IN, NULL, NULL_TREE);
928
929 soft_irem_node
930 = builtin_function ("_Jv_remI",
931 build_function_type (int_type_node, t),
932 0, NOT_BUILT_IN, NULL, NULL_TREE);
933
934 soft_ldiv_node
935 = builtin_function ("_Jv_divJ",
936 build_function_type (long_type_node, t),
937 0, NOT_BUILT_IN, NULL, NULL_TREE);
938
939 soft_lrem_node
940 = builtin_function ("_Jv_remJ",
941 build_function_type (long_type_node, t),
942 0, NOT_BUILT_IN, NULL, NULL_TREE);
943
944 /* Initialize variables for except.c. */
945 eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
946 ? "__gcj_personality_sj0"
947 : "__gcj_personality_v0");
948 lang_eh_runtime_type = prepare_eh_table_type;
949
950 init_jcf_parse ();
951
952 initialize_builtins ();
953
954 soft_fmod_node = built_in_decls[BUILT_IN_FMOD];
955 #if 0
956 soft_fmodf_node = built_in_decls[BUILT_IN_FMODF];
957 #endif
958 }
959
960
961 /* Look up NAME in the current binding level and its superiors
962 in the namespace of variables, functions and typedefs.
963 Return a ..._DECL node of some kind representing its definition,
964 or return 0 if it is undefined. */
965
966 tree
967 lookup_name (tree name)
968 {
969 register tree val;
970 if (current_binding_level != global_binding_level
971 && IDENTIFIER_LOCAL_VALUE (name))
972 val = IDENTIFIER_LOCAL_VALUE (name);
973 else
974 val = IDENTIFIER_GLOBAL_VALUE (name);
975 return val;
976 }
977
978 /* Similar to `lookup_name' but look only at current binding level and
979 the previous one if its the parameter level. */
980
981 static tree
982 lookup_name_current_level (tree name)
983 {
984 register tree t;
985
986 if (current_binding_level == global_binding_level)
987 return IDENTIFIER_GLOBAL_VALUE (name);
988
989 if (IDENTIFIER_LOCAL_VALUE (name) == 0)
990 return 0;
991
992 for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
993 if (DECL_NAME (t) == name)
994 break;
995
996 return t;
997 }
998
999 /* Use a binding level to record a labeled block declaration */
1000
1001 void
1002 push_labeled_block (tree lb)
1003 {
1004 register tree name = DECL_NAME (LABELED_BLOCK_LABEL (lb));
1005 register struct binding_level *b = current_binding_level;
1006 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1007 if (oldlocal != 0)
1008 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1009 TREE_CHAIN (lb) = b->names;
1010 b->names = lb;
1011 IDENTIFIER_LOCAL_VALUE (name) = lb;
1012 }
1013
1014 /* Pop the current binding level, reinstalling values for the previous
1015 labeled block */
1016
1017 void
1018 pop_labeled_block (void)
1019 {
1020 struct binding_level *b = current_binding_level;
1021 tree label = b->names;
1022 IDENTIFIER_LOCAL_VALUE (DECL_NAME (LABELED_BLOCK_LABEL (label))) =
1023 NULL_TREE;
1024 if (b->shadowed)
1025 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (b->shadowed)) =
1026 TREE_VALUE (b->shadowed);
1027
1028 /* Pop the current level, and free the structure for reuse. */
1029 current_binding_level = current_binding_level->level_chain;
1030 b->level_chain = free_binding_level;
1031 free_binding_level = b;
1032 }
1033
1034 /* Record a decl-node X as belonging to the current lexical scope.
1035 Check for errors (such as an incompatible declaration for the same
1036 name already seen in the same scope).
1037
1038 Returns either X or an old decl for the same name.
1039 If an old decl is returned, it may have been smashed
1040 to agree with what X says. */
1041
1042 tree
1043 pushdecl (tree x)
1044 {
1045 register tree t;
1046 register tree name = DECL_NAME (x);
1047 register struct binding_level *b = current_binding_level;
1048
1049 if (TREE_CODE (x) != TYPE_DECL)
1050 DECL_CONTEXT (x) = current_function_decl;
1051 if (name)
1052 {
1053 t = lookup_name_current_level (name);
1054 if (t != 0 && t == error_mark_node)
1055 /* error_mark_node is 0 for a while during initialization! */
1056 {
1057 t = 0;
1058 error ("%J'%D' used prior to declaration", x, x);
1059 }
1060
1061 /* If we're naming a hitherto-unnamed type, set its TYPE_NAME
1062 to point to the TYPE_DECL.
1063 Since Java does not have typedefs, a type can only have
1064 one (true) name, given by a class, interface, or builtin. */
1065 if (TREE_CODE (x) == TYPE_DECL
1066 && TYPE_NAME (TREE_TYPE (x)) == 0
1067 && TREE_TYPE (x) != error_mark_node)
1068 {
1069 TYPE_NAME (TREE_TYPE (x)) = x;
1070 TYPE_STUB_DECL (TREE_TYPE (x)) = x;
1071 }
1072
1073 /* This name is new in its binding level.
1074 Install the new declaration and return it. */
1075 if (b == global_binding_level)
1076 {
1077 /* Install a global value. */
1078
1079 IDENTIFIER_GLOBAL_VALUE (name) = x;
1080 }
1081 else
1082 {
1083 /* Here to install a non-global value. */
1084 tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
1085 IDENTIFIER_LOCAL_VALUE (name) = x;
1086
1087 #if 0
1088 /* Warn if shadowing an argument at the top level of the body. */
1089 if (oldlocal != 0 && !DECL_EXTERNAL (x)
1090 /* This warning doesn't apply to the parms of a nested fcn. */
1091 && ! current_binding_level->parm_flag
1092 /* Check that this is one level down from the parms. */
1093 && current_binding_level->level_chain->parm_flag
1094 /* Check that the decl being shadowed
1095 comes from the parm level, one level up. */
1096 && chain_member (oldlocal, current_binding_level->level_chain->names))
1097 {
1098 if (TREE_CODE (oldlocal) == PARM_DECL)
1099 pedwarn ("declaration of `%s' shadows a parameter",
1100 IDENTIFIER_POINTER (name));
1101 else
1102 pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
1103 IDENTIFIER_POINTER (name));
1104 }
1105
1106 /* Maybe warn if shadowing something else. */
1107 else if (warn_shadow && !DECL_EXTERNAL (x)
1108 /* No shadow warnings for internally generated vars. */
1109 && DECL_SOURCE_LINE (x) != 0
1110 /* No shadow warnings for vars made for inlining. */
1111 && ! DECL_FROM_INLINE (x))
1112 {
1113 const char *warnstring = 0;
1114
1115 if (TREE_CODE (x) == PARM_DECL
1116 && current_binding_level->level_chain->parm_flag)
1117 /* Don't warn about the parm names in function declarator
1118 within a function declarator.
1119 It would be nice to avoid warning in any function
1120 declarator in a declaration, as opposed to a definition,
1121 but there is no way to tell it's not a definition. */
1122 ;
1123 else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
1124 warnstring = "declaration of `%s' shadows a parameter";
1125 else if (oldlocal != 0)
1126 warnstring = "declaration of `%s' shadows previous local";
1127 else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1128 && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
1129 warnstring = "declaration of `%s' shadows global declaration";
1130
1131 if (warnstring)
1132 warning (warnstring, IDENTIFIER_POINTER (name));
1133 }
1134 #endif
1135
1136 /* If storing a local value, there may already be one (inherited).
1137 If so, record it for restoration when this binding level ends. */
1138 if (oldlocal != 0)
1139 b->shadowed = tree_cons (name, oldlocal, b->shadowed);
1140 }
1141 }
1142
1143 /* Put decls on list in reverse order.
1144 We will reverse them later if necessary. */
1145 TREE_CHAIN (x) = b->names;
1146 b->names = x;
1147
1148 return x;
1149 }
1150
1151 void
1152 pushdecl_force_head (tree x)
1153 {
1154 current_binding_level->names = x;
1155 }
1156
1157 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
1158
1159 tree
1160 pushdecl_top_level (tree x)
1161 {
1162 register tree t;
1163 register struct binding_level *b = current_binding_level;
1164
1165 current_binding_level = global_binding_level;
1166 t = pushdecl (x);
1167 current_binding_level = b;
1168 return t;
1169 }
1170
1171 /* Nonzero if we are currently in the global binding level. */
1172
1173 int
1174 global_bindings_p (void)
1175 {
1176 return current_binding_level == global_binding_level;
1177 }
1178
1179 /* Return the list of declarations of the current level.
1180 Note that this list is in reverse order unless/until
1181 you nreverse it; and when you do nreverse it, you must
1182 store the result back using `storedecls' or you will lose. */
1183
1184 tree
1185 getdecls (void)
1186 {
1187 return current_binding_level->names;
1188 }
1189
1190 /* Create a new `struct binding_level'. */
1191
1192 static struct binding_level *
1193 make_binding_level (void)
1194 {
1195 /* NOSTRICT */
1196 return xmalloc (sizeof (struct binding_level));
1197 }
1198
1199 void
1200 pushlevel (int unused ATTRIBUTE_UNUSED)
1201 {
1202 register struct binding_level *newlevel = NULL_BINDING_LEVEL;
1203
1204 #if 0
1205 /* If this is the top level of a function,
1206 just make sure that NAMED_LABELS is 0. */
1207
1208 if (current_binding_level == global_binding_level)
1209 named_labels = 0;
1210 #endif
1211
1212 /* Reuse or create a struct for this binding level. */
1213
1214 if (free_binding_level)
1215 {
1216 newlevel = free_binding_level;
1217 free_binding_level = free_binding_level->level_chain;
1218 }
1219 else
1220 {
1221 newlevel = make_binding_level ();
1222 }
1223
1224 /* Add this level to the front of the chain (stack) of levels that
1225 are active. */
1226
1227 *newlevel = clear_binding_level;
1228 newlevel->level_chain = current_binding_level;
1229 current_binding_level = newlevel;
1230 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1231 newlevel->binding_depth = binding_depth;
1232 indent ();
1233 fprintf (stderr, "push %s level 0x%08x pc %d\n",
1234 (is_class_level) ? "class" : "block", newlevel, current_pc);
1235 is_class_level = 0;
1236 binding_depth++;
1237 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1238 }
1239
1240 /* Exit a binding level.
1241 Pop the level off, and restore the state of the identifier-decl mappings
1242 that were in effect when this level was entered.
1243
1244 If KEEP is nonzero, this level had explicit declarations, so
1245 and create a "block" (a BLOCK node) for the level
1246 to record its declarations and subblocks for symbol table output.
1247
1248 If FUNCTIONBODY is nonzero, this level is the body of a function,
1249 so create a block as if KEEP were set and also clear out all
1250 label names.
1251
1252 If REVERSE is nonzero, reverse the order of decls before putting
1253 them into the BLOCK. */
1254
1255 tree
1256 poplevel (int keep, int reverse, int functionbody)
1257 {
1258 register tree link;
1259 /* The chain of decls was accumulated in reverse order.
1260 Put it into forward order, just for cleanliness. */
1261 tree decls;
1262 tree subblocks = current_binding_level->blocks;
1263 tree block = 0;
1264 tree decl;
1265 int block_previously_created;
1266 {
1267
1268 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1269 binding_depth--;
1270 indent ();
1271 if (current_binding_level->end_pc != LARGEST_PC)
1272 fprintf (stderr, "pop %s level 0x%08x pc %d (end pc %d)\n",
1273 (is_class_level) ? "class" : "block", current_binding_level, current_pc,
1274 current_binding_level->end_pc);
1275 else
1276 fprintf (stderr, "pop %s level 0x%08x pc %d\n",
1277 (is_class_level) ? "class" : "block", current_binding_level, current_pc);
1278 #if 0
1279 if (is_class_level != (current_binding_level == class_binding_level))
1280 {
1281 indent ();
1282 fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
1283 }
1284 is_class_level = 0;
1285 #endif
1286 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1287
1288 /* Get the decls in the order they were written.
1289 Usually current_binding_level->names is in reverse order.
1290 But parameter decls were previously put in forward order. */
1291
1292 if (reverse)
1293 current_binding_level->names
1294 = decls = nreverse (current_binding_level->names);
1295 else
1296 decls = current_binding_level->names;
1297
1298 /* Output any nested inline functions within this block
1299 if they weren't already output. */
1300
1301 for (decl = decls; decl; decl = TREE_CHAIN (decl))
1302 if (TREE_CODE (decl) == FUNCTION_DECL
1303 && ! TREE_ASM_WRITTEN (decl)
1304 && DECL_INITIAL (decl) != 0
1305 && TREE_ADDRESSABLE (decl))
1306 {
1307 /* If this decl was copied from a file-scope decl on account
1308 of a block-scope extern decl, propagate TREE_ADDRESSABLE
1309 to the file-scope decl.
1310
1311 DECL_ABSTRACT_ORIGIN can be set to itself if
1312 warn_return_type is true, since then the decl goes
1313 through save_for_inline_copying. */
1314 if (DECL_ABSTRACT_ORIGIN (decl) != 0
1315 && DECL_ABSTRACT_ORIGIN (decl) != decl)
1316 TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1317 else
1318 {
1319 push_function_context ();
1320 output_inline_function (decl);
1321 pop_function_context ();
1322 }
1323 }
1324 else if (TREE_CODE (decl) == VAR_DECL
1325 && DECL_LANG_SPECIFIC (decl) != NULL
1326 && DECL_LOCAL_SLOT_NUMBER (decl))
1327 LOCAL_VAR_OUT_OF_SCOPE_P (decl) = 1;
1328 }
1329
1330 /* If there were any declarations in that level,
1331 or if this level is a function body,
1332 create a BLOCK to record them for the life of this function. */
1333
1334 block = 0;
1335 block_previously_created = (current_binding_level->this_block != 0);
1336 if (block_previously_created)
1337 block = current_binding_level->this_block;
1338 else if (keep || functionbody)
1339 block = make_node (BLOCK);
1340 if (block != 0)
1341 {
1342 BLOCK_VARS (block) = decls;
1343 BLOCK_SUBBLOCKS (block) = subblocks;
1344 }
1345
1346 /* In each subblock, record that this is its superior. */
1347
1348 for (link = subblocks; link; link = TREE_CHAIN (link))
1349 BLOCK_SUPERCONTEXT (link) = block;
1350
1351 /* Clear out the meanings of the local variables of this level. */
1352
1353 for (link = decls; link; link = TREE_CHAIN (link))
1354 {
1355 tree name = DECL_NAME (link);
1356 if (name != 0 && IDENTIFIER_LOCAL_VALUE (name) == link)
1357 {
1358 /* If the ident. was used or addressed via a local extern decl,
1359 don't forget that fact. */
1360 if (DECL_EXTERNAL (link))
1361 {
1362 if (TREE_USED (link))
1363 TREE_USED (name) = 1;
1364 if (TREE_ADDRESSABLE (link))
1365 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1366 }
1367 IDENTIFIER_LOCAL_VALUE (name) = 0;
1368 }
1369 }
1370
1371 /* Restore all name-meanings of the outer levels
1372 that were shadowed by this level. */
1373
1374 for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1375 IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1376
1377 /* If the level being exited is the top level of a function,
1378 check over all the labels, and clear out the current
1379 (function local) meanings of their names. */
1380
1381 if (functionbody)
1382 {
1383 /* If this is the top level block of a function,
1384 the vars are the function's parameters.
1385 Don't leave them in the BLOCK because they are
1386 found in the FUNCTION_DECL instead. */
1387
1388 BLOCK_VARS (block) = 0;
1389
1390 /* Clear out the definitions of all label names,
1391 since their scopes end here,
1392 and add them to BLOCK_VARS. */
1393
1394 #if 0
1395 for (link = named_labels; link; link = TREE_CHAIN (link))
1396 {
1397 register tree label = TREE_VALUE (link);
1398
1399 if (DECL_INITIAL (label) == 0)
1400 {
1401 error ("%Jlabel '%D' used but not defined", label, label);
1402 /* Avoid crashing later. */
1403 define_label (input_location, DECL_NAME (label));
1404 }
1405 else if (warn_unused[UNUSED_LABEL] && !TREE_USED (label))
1406 warning ("%Jlabel '%D' defined but not used", label, label);
1407 IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1408
1409 /* Put the labels into the "variables" of the
1410 top-level block, so debugger can see them. */
1411 TREE_CHAIN (label) = BLOCK_VARS (block);
1412 BLOCK_VARS (block) = label;
1413 }
1414 #endif
1415 }
1416
1417 /* Pop the current level, and free the structure for reuse. */
1418
1419 {
1420 register struct binding_level *level = current_binding_level;
1421 current_binding_level = current_binding_level->level_chain;
1422
1423 level->level_chain = free_binding_level;
1424 free_binding_level = level;
1425 }
1426
1427 /* Dispose of the block that we just made inside some higher level. */
1428 if (functionbody)
1429 DECL_INITIAL (current_function_decl) = block;
1430 else if (block)
1431 {
1432 if (!block_previously_created)
1433 current_binding_level->blocks
1434 = chainon (current_binding_level->blocks, block);
1435 }
1436 /* If we did not make a block for the level just exited,
1437 any blocks made for inner levels
1438 (since they cannot be recorded as subblocks in that level)
1439 must be carried forward so they will later become subblocks
1440 of something else. */
1441 else if (subblocks)
1442 current_binding_level->blocks
1443 = chainon (current_binding_level->blocks, subblocks);
1444
1445 /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1446 binding contour so that they point to the appropriate construct, i.e.
1447 either to the current FUNCTION_DECL node, or else to the BLOCK node
1448 we just constructed.
1449
1450 Note that for tagged types whose scope is just the formal parameter
1451 list for some function type specification, we can't properly set
1452 their TYPE_CONTEXTs here, because we don't have a pointer to the
1453 appropriate FUNCTION_TYPE node readily available to us. For those
1454 cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1455 in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1456 node which will represent the "scope" for these "parameter list local"
1457 tagged types.
1458 */
1459
1460 if (block)
1461 TREE_USED (block) = 1;
1462 return block;
1463 }
1464
1465 void
1466 maybe_pushlevels (int pc)
1467 {
1468 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1469 current_pc = pc;
1470 #endif
1471
1472 while (pending_local_decls != NULL_TREE &&
1473 DECL_LOCAL_START_PC (pending_local_decls) <= pc)
1474 {
1475 tree *ptr = &pending_local_decls;
1476 tree decl = *ptr;
1477 int end_pc = DECL_LOCAL_END_PC (decl);
1478
1479 while (*ptr != NULL_TREE
1480 && DECL_LOCAL_START_PC (*ptr) <= pc
1481 && DECL_LOCAL_END_PC (*ptr) == end_pc)
1482 ptr = &TREE_CHAIN (*ptr);
1483 pending_local_decls = *ptr;
1484 *ptr = NULL_TREE;
1485
1486 /* Force non-nested range to be nested in current range. */
1487 if (end_pc > current_binding_level->end_pc)
1488 end_pc = current_binding_level->end_pc;
1489
1490 maybe_start_try (pc, end_pc);
1491
1492 pushlevel (1);
1493 expand_start_bindings (0);
1494
1495 current_binding_level->end_pc = end_pc;
1496 current_binding_level->start_pc = pc;
1497 current_binding_level->names = decl;
1498 for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
1499 {
1500 push_jvm_slot (DECL_LOCAL_SLOT_NUMBER (decl), decl);
1501 }
1502 }
1503
1504 maybe_start_try (pc, 0);
1505 }
1506
1507 void
1508 maybe_poplevels (int pc)
1509 {
1510 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1511 current_pc = pc;
1512 #endif
1513
1514 while (current_binding_level->end_pc <= pc)
1515 {
1516 expand_end_bindings (getdecls (), 1, 0);
1517 maybe_end_try (current_binding_level->start_pc, pc);
1518 poplevel (1, 0, 0);
1519 }
1520 maybe_end_try (0, pc);
1521 }
1522
1523 /* Terminate any binding which began during the range beginning at
1524 start_pc. This tidies up improperly nested local variable ranges
1525 and exception handlers; a variable declared within an exception
1526 range is forcibly terminated when that exception ends. */
1527
1528 void
1529 force_poplevels (int start_pc)
1530 {
1531 while (current_binding_level->start_pc > start_pc)
1532 {
1533 if (pedantic && current_binding_level->start_pc > start_pc)
1534 warning ("%JIn %D: overlapped variable and exception ranges at %d",
1535 current_function_decl, current_function_decl,
1536 current_binding_level->start_pc);
1537 expand_end_bindings (getdecls (), 1, 0);
1538 poplevel (1, 0, 0);
1539 }
1540 }
1541
1542 /* Insert BLOCK at the end of the list of subblocks of the
1543 current binding level. This is used when a BIND_EXPR is expanded,
1544 to handle the BLOCK node inside the BIND_EXPR. */
1545
1546 void
1547 insert_block (tree block)
1548 {
1549 TREE_USED (block) = 1;
1550 current_binding_level->blocks
1551 = chainon (current_binding_level->blocks, block);
1552 }
1553
1554 /* Set the BLOCK node for the innermost scope
1555 (the one we are currently in). */
1556
1557 void
1558 set_block (tree block)
1559 {
1560 current_binding_level->this_block = block;
1561 current_binding_level->names = chainon (current_binding_level->names,
1562 BLOCK_VARS (block));
1563 current_binding_level->blocks = chainon (current_binding_level->blocks,
1564 BLOCK_SUBBLOCKS (block));
1565 }
1566
1567 /* integrate_decl_tree calls this function. */
1568
1569 void
1570 java_dup_lang_specific_decl (tree node)
1571 {
1572 int lang_decl_size;
1573 struct lang_decl *x;
1574
1575 if (!DECL_LANG_SPECIFIC (node))
1576 return;
1577
1578 lang_decl_size = sizeof (struct lang_decl);
1579 x = ggc_alloc (lang_decl_size);
1580 memcpy (x, DECL_LANG_SPECIFIC (node), lang_decl_size);
1581 DECL_LANG_SPECIFIC (node) = x;
1582 }
1583
1584 void
1585 give_name_to_locals (JCF *jcf)
1586 {
1587 int i, n = DECL_LOCALVARIABLES_OFFSET (current_function_decl);
1588 int code_offset = DECL_CODE_OFFSET (current_function_decl);
1589 tree parm;
1590 pending_local_decls = NULL_TREE;
1591 if (n == 0)
1592 return;
1593 JCF_SEEK (jcf, n);
1594 n = JCF_readu2 (jcf);
1595 for (i = 0; i < n; i++)
1596 {
1597 int start_pc = JCF_readu2 (jcf);
1598 int length = JCF_readu2 (jcf);
1599 int name_index = JCF_readu2 (jcf);
1600 int signature_index = JCF_readu2 (jcf);
1601 int slot = JCF_readu2 (jcf);
1602 tree name = get_name_constant (jcf, name_index);
1603 tree type = parse_signature (jcf, signature_index);
1604 if (slot < DECL_ARG_SLOT_COUNT (current_function_decl)
1605 && start_pc == 0
1606 && length == DECL_CODE_LENGTH (current_function_decl))
1607 {
1608 tree decl = TREE_VEC_ELT (decl_map, slot);
1609 DECL_NAME (decl) = name;
1610 SET_DECL_ASSEMBLER_NAME (decl, name);
1611 if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
1612 warning ("bad type in parameter debug info");
1613 }
1614 else
1615 {
1616 tree *ptr;
1617 int end_pc = start_pc + length;
1618 tree decl = build_decl (VAR_DECL, name, type);
1619 if (end_pc > DECL_CODE_LENGTH (current_function_decl))
1620 {
1621 warning ("%Jbad PC range for debug info for local '%D'",
1622 decl, decl);
1623 end_pc = DECL_CODE_LENGTH (current_function_decl);
1624 }
1625
1626 /* Adjust start_pc if necessary so that the local's first
1627 store operation will use the relevant DECL as a
1628 destination. Fore more information, read the leading
1629 comments for expr.c:maybe_adjust_start_pc. */
1630 start_pc = maybe_adjust_start_pc (jcf, code_offset, start_pc, slot);
1631
1632 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1633 DECL_LOCAL_SLOT_NUMBER (decl) = slot;
1634 DECL_LOCAL_START_PC (decl) = start_pc;
1635 #if 0
1636 /* FIXME: The range used internally for exceptions and local
1637 variable ranges, is a half-open interval:
1638 start_pc <= pc < end_pc. However, the range used in the
1639 Java VM spec is inclusive at both ends:
1640 start_pc <= pc <= end_pc. */
1641 end_pc++;
1642 #endif
1643 DECL_LOCAL_END_PC (decl) = end_pc;
1644
1645 /* Now insert the new decl in the proper place in
1646 pending_local_decls. We are essentially doing an insertion sort,
1647 which works fine, since the list input will normally already
1648 be sorted. */
1649 ptr = &pending_local_decls;
1650 while (*ptr != NULL_TREE
1651 && (DECL_LOCAL_START_PC (*ptr) > start_pc
1652 || (DECL_LOCAL_START_PC (*ptr) == start_pc
1653 && DECL_LOCAL_END_PC (*ptr) < end_pc)))
1654 ptr = &TREE_CHAIN (*ptr);
1655 TREE_CHAIN (decl) = *ptr;
1656 *ptr = decl;
1657 }
1658 }
1659
1660 pending_local_decls = nreverse (pending_local_decls);
1661
1662 /* Fill in default names for the parameters. */
1663 for (parm = DECL_ARGUMENTS (current_function_decl), i = 0;
1664 parm != NULL_TREE; parm = TREE_CHAIN (parm), i++)
1665 {
1666 if (DECL_NAME (parm) == NULL_TREE)
1667 {
1668 int arg_i = METHOD_STATIC (current_function_decl) ? i+1 : i;
1669 if (arg_i == 0)
1670 DECL_NAME (parm) = get_identifier ("this");
1671 else
1672 {
1673 char buffer[12];
1674 sprintf (buffer, "ARG_%d", arg_i);
1675 DECL_NAME (parm) = get_identifier (buffer);
1676 }
1677 SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
1678 }
1679 }
1680 }
1681
1682 tree
1683 build_result_decl (tree fndecl)
1684 {
1685 tree restype = TREE_TYPE (TREE_TYPE (fndecl));
1686 tree result = DECL_RESULT (fndecl);
1687 if (! result)
1688 {
1689 /* To be compatible with C_PROMOTING_INTEGER_TYPE_P in cc1/cc1plus. */
1690 if (INTEGRAL_TYPE_P (restype)
1691 && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node))
1692 restype = integer_type_node;
1693 result = build_decl (RESULT_DECL, NULL_TREE, restype);
1694 DECL_CONTEXT (result) = fndecl;
1695 DECL_RESULT (fndecl) = result;
1696 }
1697 return result;
1698 }
1699
1700 void
1701 complete_start_java_method (tree fndecl)
1702 {
1703 if (! flag_emit_class_files)
1704 {
1705 /* Initialize the RTL code for the function. */
1706 init_function_start (fndecl);
1707
1708 /* Set up parameters and prepare for return, for the function. */
1709 expand_function_start (fndecl, 0);
1710 }
1711
1712 #if 0
1713 /* If this fcn was already referenced via a block-scope `extern' decl (or
1714 an implicit decl), propagate certain information about the usage. */
1715 if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
1716 TREE_ADDRESSABLE (current_function_decl) = 1;
1717
1718 #endif
1719
1720 if (METHOD_STATIC (fndecl) && ! METHOD_PRIVATE (fndecl)
1721 && ! flag_emit_class_files
1722 && ! DECL_CLINIT_P (fndecl)
1723 && ! CLASS_INTERFACE (TYPE_NAME (current_class)))
1724 {
1725 tree clas = DECL_CONTEXT (fndecl);
1726 tree init = build (CALL_EXPR, void_type_node,
1727 build_address_of (soft_initclass_node),
1728 build_tree_list (NULL_TREE, build_class_ref (clas)),
1729 NULL_TREE);
1730 TREE_SIDE_EFFECTS (init) = 1;
1731 expand_expr_stmt (init);
1732 }
1733
1734 /* Push local variables. Function compiled from source code are
1735 using a different local variables management, and for them,
1736 pushlevel shouldn't be called from here. */
1737 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1738 {
1739 pushlevel (2);
1740 if (! flag_emit_class_files)
1741 expand_start_bindings (1);
1742 }
1743
1744 if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
1745 {
1746 /* Wrap function body with a monitorenter plus monitorexit cleanup. */
1747 tree enter, exit, lock;
1748 if (METHOD_STATIC (fndecl))
1749 lock = build_class_ref (DECL_CONTEXT (fndecl));
1750 else
1751 lock = DECL_ARGUMENTS (fndecl);
1752 BUILD_MONITOR_ENTER (enter, lock);
1753 BUILD_MONITOR_EXIT (exit, lock);
1754 if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
1755 {
1756 expand_expr_stmt (enter);
1757 expand_decl_cleanup (NULL_TREE, exit);
1758 }
1759 else
1760 {
1761 tree function_body = DECL_FUNCTION_BODY (fndecl);
1762 tree body = BLOCK_EXPR_BODY (function_body);
1763 lock = build (COMPOUND_EXPR, void_type_node,
1764 enter,
1765 build (TRY_FINALLY_EXPR, void_type_node, body, exit));
1766 TREE_SIDE_EFFECTS (lock) = 1;
1767 BLOCK_EXPR_BODY (function_body) = lock;
1768 }
1769 }
1770 }
1771
1772 void
1773 start_java_method (tree fndecl)
1774 {
1775 tree tem, *ptr;
1776 int i;
1777
1778 current_function_decl = fndecl;
1779 announce_function (fndecl);
1780
1781 i = DECL_MAX_LOCALS(fndecl) + DECL_MAX_STACK(fndecl);
1782 decl_map = make_tree_vec (i);
1783 type_map = xrealloc (type_map, i * sizeof (tree));
1784
1785 #if defined(DEBUG_JAVA_BINDING_LEVELS)
1786 fprintf (stderr, "%s:\n", lang_printable_name (fndecl, 2));
1787 current_pc = 0;
1788 #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
1789 pushlevel (1); /* Push parameters. */
1790
1791 ptr = &DECL_ARGUMENTS (fndecl);
1792 for (tem = TYPE_ARG_TYPES (TREE_TYPE (fndecl)), i = 0;
1793 tem != end_params_node; tem = TREE_CHAIN (tem), i++)
1794 {
1795 tree parm_name = NULL_TREE, parm_decl;
1796 tree parm_type = TREE_VALUE (tem);
1797 if (i >= DECL_MAX_LOCALS (fndecl))
1798 abort ();
1799
1800 parm_decl = build_decl (PARM_DECL, parm_name, parm_type);
1801 DECL_CONTEXT (parm_decl) = fndecl;
1802 if (PROMOTE_PROTOTYPES
1803 && TYPE_PRECISION (parm_type) < TYPE_PRECISION (integer_type_node)
1804 && INTEGRAL_TYPE_P (parm_type))
1805 parm_type = integer_type_node;
1806 DECL_ARG_TYPE (parm_decl) = parm_type;
1807
1808 *ptr = parm_decl;
1809 ptr = &TREE_CHAIN (parm_decl);
1810
1811 /* Add parm_decl to the decl_map. */
1812 push_jvm_slot (i, parm_decl);
1813
1814 type_map[i] = TREE_TYPE (parm_decl);
1815 if (TYPE_IS_WIDE (TREE_TYPE (parm_decl)))
1816 {
1817 i++;
1818 type_map[i] = void_type_node;
1819 }
1820 }
1821 *ptr = NULL_TREE;
1822 DECL_ARG_SLOT_COUNT (current_function_decl) = i;
1823
1824 while (i < DECL_MAX_LOCALS(fndecl))
1825 type_map[i++] = NULL_TREE;
1826
1827 build_result_decl (fndecl);
1828 complete_start_java_method (fndecl);
1829 }
1830
1831 void
1832 end_java_method (void)
1833 {
1834 tree fndecl = current_function_decl;
1835
1836 expand_end_bindings (getdecls (), 1, 0);
1837 /* pop out of function */
1838 poplevel (1, 1, 0);
1839
1840 /* pop out of its parameters */
1841 poplevel (1, 0, 1);
1842
1843 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1844
1845 /* Generate rtl for function exit. */
1846 expand_function_end ();
1847
1848 /* Run the optimizers and output assembler code for this function. */
1849 rest_of_compilation (fndecl);
1850
1851 current_function_decl = NULL_TREE;
1852 }
1853
1854 /* Expand a function's body. */
1855
1856 void
1857 java_expand_body (tree fndecl)
1858 {
1859 location_t saved_location = input_location;
1860
1861 current_function_decl = fndecl;
1862 input_location = DECL_SOURCE_LOCATION (fndecl);
1863 current_class = DECL_CONTEXT (fndecl);
1864
1865 timevar_push (TV_EXPAND);
1866
1867 /* Prepare the function for tree completion. */
1868 start_complete_expand_method (fndecl);
1869
1870 if (! flag_emit_class_files && ! flag_emit_xref)
1871 {
1872 /* Initialize the RTL code for the function. */
1873 init_function_start (fndecl);
1874
1875 /* Set up parameters and prepare for return, for the function. */
1876 expand_function_start (fndecl, 0);
1877
1878 /* Generate the RTL for this function. */
1879 expand_expr_stmt_value (DECL_SAVED_TREE (fndecl), 0, 1);
1880 }
1881
1882 /* Pop out of its parameters. */
1883 pushdecl_force_head (DECL_ARGUMENTS (fndecl));
1884 poplevel (1, 0, 1);
1885 BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1886
1887 if (! flag_emit_class_files && ! flag_emit_xref)
1888 {
1889 /* Generate RTL for function exit. */
1890 input_line = DECL_FUNCTION_LAST_LINE (fndecl);
1891 expand_function_end ();
1892
1893 /* Run the optimizers and output the assembler code
1894 for this function. */
1895 rest_of_compilation (fndecl);
1896 }
1897
1898 timevar_pop (TV_EXPAND);
1899
1900 input_location = saved_location;
1901
1902 current_function_decl = NULL_TREE;
1903 }
1904
1905 /* We pessimistically marked all methods and fields external until we
1906 knew what set of classes we were planning to compile. Now mark those
1907 associated with CLASS to be generated locally as not external. */
1908
1909 static void
1910 java_mark_decl_local (tree decl)
1911 {
1912 DECL_EXTERNAL (decl) = 0;
1913
1914 /* If we've already constructed DECL_RTL, give encode_section_info
1915 a second chance, now that we've changed the flags. */
1916 if (DECL_RTL_SET_P (decl))
1917 make_decl_rtl (decl, NULL);
1918 }
1919
1920 void
1921 java_mark_class_local (tree class)
1922 {
1923 tree t;
1924
1925 for (t = TYPE_FIELDS (class); t ; t = TREE_CHAIN (t))
1926 if (FIELD_STATIC (t))
1927 java_mark_decl_local (t);
1928
1929 for (t = TYPE_METHODS (class); t ; t = TREE_CHAIN (t))
1930 if (!METHOD_ABSTRACT (t) && (!METHOD_NATIVE (t) || flag_jni))
1931 java_mark_decl_local (t);
1932 }
1933
1934 #include "gt-java-decl.h"