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