1 /* Process expressions for the GNU compiler for the Java(TM) language.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
30 #include "coretypes.h"
37 #include "java-tree.h"
39 #include "java-opcodes.h"
41 #include "java-except.h"
47 static void flush_quick_stack (void);
48 static void push_value (tree);
49 static tree pop_value (tree);
50 static void java_stack_swap (void);
51 static void java_stack_dup (int, int);
52 static void build_java_athrow (tree);
53 static void build_java_jsr (int, int);
54 static void build_java_ret (tree);
55 static void expand_java_multianewarray (tree, int);
56 static void expand_java_arraystore (tree);
57 static void expand_java_arrayload (tree);
58 static void expand_java_array_length (void);
59 static tree build_java_monitor (tree, tree);
60 static void expand_java_pushc (int, tree);
61 static void expand_java_return (tree);
62 static void expand_load_internal (int, tree, int);
63 static void expand_java_NEW (tree);
64 static void expand_java_INSTANCEOF (tree);
65 static void expand_java_CHECKCAST (tree);
66 static void expand_iinc (unsigned int, int, int);
67 static void expand_java_binop (tree, enum tree_code);
68 static void note_label (int, int);
69 static void expand_compare (enum tree_code, tree, tree, int);
70 static void expand_test (enum tree_code, tree, int);
71 static void expand_cond (enum tree_code, tree, int);
72 static void expand_java_goto (int);
74 static void expand_java_call (int, int);
75 static void expand_java_ret (tree);
77 static tree pop_arguments (tree);
78 static void expand_invoke (int, int, int);
79 static void expand_java_field_op (int, int, int);
80 static void java_push_constant_from_pool (struct JCF *, int);
81 static void java_stack_pop (int);
82 static tree build_java_throw_out_of_bounds_exception (tree);
83 static tree build_java_check_indexed_type (tree, tree);
84 static tree case_identity (tree, tree);
85 static unsigned char peek_opcode_at_pc (struct JCF *, int, int);
86 static int emit_init_test_initialization (void **entry, void * ptr);
88 static GTY(()) tree operand_type[59];
90 static GTY(()) tree methods_ident;
91 static GTY(()) tree ncode_ident;
92 tree dtable_ident = NULL_TREE;
94 /* Set to nonzero value in order to emit class initialization code
95 before static field references. */
96 int always_initialize_class_p;
98 /* We store the stack state in two places:
99 Within a basic block, we use the quick_stack, which is a
100 pushdown list (TREE_LISTs) of expression nodes.
101 This is the top part of the stack; below that we use find_stack_slot.
102 At the end of a basic block, the quick_stack must be flushed
103 to the stack slot array (as handled by find_stack_slot).
104 Using quick_stack generates better code (especially when
105 compiled without optimization), because we do not have to
106 explicitly store and load trees to temporary variables.
108 If a variable is on the quick stack, it means the value of variable
109 when the quick stack was last flushed. Conceptually, flush_quick_stack
110 saves all the the quick_stack elements in parallel. However, that is
111 complicated, so it actually saves them (i.e. copies each stack value
112 to is home virtual register) from low indexes. This allows a quick_stack
113 element at index i (counting from the bottom of stack the) to references
114 slot virtuals for register that are >= i, but not those that are deeper.
115 This convention makes most operations easier. For example iadd works
116 even when the stack contains (reg[0], reg[1]): It results in the
117 stack containing (reg[0]+reg[1]), which is OK. However, some stack
118 operations are more complicated. For example dup given a stack
119 containing (reg[0]) would yield (reg[0], reg[0]), which would violate
120 the convention, since stack value 1 would refer to a register with
121 lower index (reg[0]), which flush_quick_stack does not safely handle.
122 So dup cannot just add an extra element to the quick_stack, but iadd can.
125 static GTY(()) tree quick_stack;
127 /* A free-list of unused permanent TREE_LIST nodes. */
128 static GTY((deletable (""))) tree tree_list_free_list;
130 /* The stack pointer of the Java virtual machine.
131 This does include the size of the quick_stack. */
135 const unsigned char *linenumber_table;
136 int linenumber_count;
139 init_expr_processing (void)
141 operand_type[21] = operand_type[54] = int_type_node;
142 operand_type[22] = operand_type[55] = long_type_node;
143 operand_type[23] = operand_type[56] = float_type_node;
144 operand_type[24] = operand_type[57] = double_type_node;
145 operand_type[25] = operand_type[58] = ptr_type_node;
149 java_truthvalue_conversion (tree expr)
151 /* It is simpler and generates better code to have only TRUTH_*_EXPR
152 or comparison expressions as truth values at this level.
154 This function should normally be identity for Java. */
156 switch (TREE_CODE (expr))
159 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
160 case TRUTH_ANDIF_EXPR:
161 case TRUTH_ORIF_EXPR:
168 return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
171 return real_zerop (expr) ? boolean_false_node : boolean_true_node;
173 /* are these legal? XXX JH */
177 /* These don't change whether an object is nonzero or zero. */
178 return java_truthvalue_conversion (TREE_OPERAND (expr, 0));
181 /* Distribute the conversion into the arms of a COND_EXPR. */
182 return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
183 java_truthvalue_conversion (TREE_OPERAND (expr, 1)),
184 java_truthvalue_conversion (TREE_OPERAND (expr, 2))));
187 /* If this is widening the argument, we can ignore it. */
188 if (TYPE_PRECISION (TREE_TYPE (expr))
189 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
190 return java_truthvalue_conversion (TREE_OPERAND (expr, 0));
191 /* fall through to default */
194 return fold (build (NE_EXPR, boolean_type_node, expr, boolean_false_node));
198 /* Save any stack slots that happen to be in the quick_stack into their
199 home virtual register slots.
201 The copy order is from low stack index to high, to support the invariant
202 that the expression for a slot may contain decls for stack slots with
203 higher (or the same) index, but not lower. */
206 flush_quick_stack (void)
208 int stack_index = stack_pointer;
209 tree prev, cur, next;
211 /* First reverse the quick_stack, and count the number of slots it has. */
212 for (cur = quick_stack, prev = NULL_TREE; cur != NULL_TREE; cur = next)
214 next = TREE_CHAIN (cur);
215 TREE_CHAIN (cur) = prev;
217 stack_index -= 1 + TYPE_IS_WIDE (TREE_TYPE (TREE_VALUE (cur)));
221 while (quick_stack != NULL_TREE)
224 tree node = quick_stack, type;
225 quick_stack = TREE_CHAIN (node);
226 TREE_CHAIN (node) = tree_list_free_list;
227 tree_list_free_list = node;
228 node = TREE_VALUE (node);
229 type = TREE_TYPE (node);
231 decl = find_stack_slot (stack_index, type);
233 expand_assignment (decl, node, 0);
234 stack_index += 1 + TYPE_IS_WIDE (type);
238 /* Push TYPE on the type stack.
239 Return true on success, 0 on overflow. */
242 push_type_0 (tree type)
245 type = promote_type (type);
246 n_words = 1 + TYPE_IS_WIDE (type);
247 if (stack_pointer + n_words > DECL_MAX_STACK (current_function_decl))
249 stack_type_map[stack_pointer++] = type;
251 while (--n_words >= 0)
252 stack_type_map[stack_pointer++] = TYPE_SECOND;
257 push_type (tree type)
259 if (! push_type_0 (type))
264 push_value (tree value)
266 tree type = TREE_TYPE (value);
267 if (TYPE_PRECISION (type) < 32 && INTEGRAL_TYPE_P (type))
269 type = promote_type (type);
270 value = convert (type, value);
273 if (tree_list_free_list == NULL_TREE)
274 quick_stack = tree_cons (NULL_TREE, value, quick_stack);
277 tree node = tree_list_free_list;
278 tree_list_free_list = TREE_CHAIN (tree_list_free_list);
279 TREE_VALUE (node) = value;
280 TREE_CHAIN (node) = quick_stack;
285 /* Pop a type from the type stack.
286 TYPE is the expected type. Return the actual type, which must be
288 On an error, *MESSAGEP is set to a freshly malloc'd error message. */
291 pop_type_0 (tree type, char **messagep)
296 if (TREE_CODE (type) == RECORD_TYPE)
297 type = promote_type (type);
298 n_words = 1 + TYPE_IS_WIDE (type);
299 if (stack_pointer < n_words)
301 *messagep = xstrdup ("stack underflow");
304 while (--n_words > 0)
306 if (stack_type_map[--stack_pointer] != void_type_node)
308 *messagep = xstrdup ("Invalid multi-word value on type stack");
312 t = stack_type_map[--stack_pointer];
313 if (type == NULL_TREE || t == type)
315 if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (t)
316 && TYPE_PRECISION (type) <= 32 && TYPE_PRECISION (t) <= 32)
318 if (TREE_CODE (type) == POINTER_TYPE && TREE_CODE (t) == POINTER_TYPE)
320 if (type == ptr_type_node || type == object_ptr_type_node)
322 else if (t == ptr_type_node) /* Special case for null reference. */
324 else if (can_widen_reference_to (t, type))
326 /* This is a kludge, but matches what Sun's verifier does.
327 It can be tricked, but is safe as long as type errors
328 (i.e. interface method calls) are caught at run-time. */
329 else if (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (type))))
330 return object_ptr_type_node;
333 /* lang_printable_name uses a static buffer, so we must save the result
334 from calling it the first time. */
336 char *temp = xstrdup (lang_printable_name (type, 0));
337 *messagep = concat ("expected type '", temp,
338 "' but stack contains '", lang_printable_name (t, 0),
345 /* Pop a type from the type stack.
346 TYPE is the expected type. Return the actual type, which must be
347 convertible to TYPE, otherwise call error. */
352 char *message = NULL;
353 type = pop_type_0 (type, &message);
356 error ("%s", message);
362 /* Return 1f if SOURCE_TYPE can be safely widened to TARGET_TYPE.
363 Handles array types and interfaces. */
366 can_widen_reference_to (tree source_type, tree target_type)
368 if (source_type == ptr_type_node || target_type == object_ptr_type_node)
371 /* Get rid of pointers */
372 if (TREE_CODE (source_type) == POINTER_TYPE)
373 source_type = TREE_TYPE (source_type);
374 if (TREE_CODE (target_type) == POINTER_TYPE)
375 target_type = TREE_TYPE (target_type);
377 if (source_type == target_type)
381 if (TYPE_ARRAY_P (source_type) || TYPE_ARRAY_P (target_type))
383 HOST_WIDE_INT source_length, target_length;
384 if (TYPE_ARRAY_P (source_type) != TYPE_ARRAY_P (target_type))
386 /* An array implements Cloneable and Serializable. */
387 tree name = DECL_NAME (TYPE_NAME (target_type));
388 return (name == java_lang_cloneable_identifier_node
389 || name == java_io_serializable_identifier_node);
391 target_length = java_array_type_length (target_type);
392 if (target_length >= 0)
394 source_length = java_array_type_length (source_type);
395 if (source_length != target_length)
398 source_type = TYPE_ARRAY_ELEMENT (source_type);
399 target_type = TYPE_ARRAY_ELEMENT (target_type);
400 if (source_type == target_type)
402 if (TREE_CODE (source_type) != POINTER_TYPE
403 || TREE_CODE (target_type) != POINTER_TYPE)
405 return can_widen_reference_to (source_type, target_type);
409 int source_depth = class_depth (source_type);
410 int target_depth = class_depth (target_type);
412 /* class_depth can return a negative depth if an error occurred */
413 if (source_depth < 0 || target_depth < 0)
416 if (CLASS_INTERFACE (TYPE_NAME (target_type)))
418 /* target_type is OK if source_type or source_type ancestors
419 implement target_type. We handle multiple sub-interfaces */
421 tree basetype_vec = TYPE_BINFO_BASETYPES (source_type);
422 int n = TREE_VEC_LENGTH (basetype_vec), i;
423 for (i=0 ; i < n; i++)
424 if (can_widen_reference_to
425 (TREE_TYPE (TREE_VEC_ELT (basetype_vec, i)),
432 for ( ; source_depth > target_depth; source_depth--)
434 source_type = TYPE_BINFO_BASETYPE (source_type, 0);
436 return source_type == target_type;
442 pop_value (tree type)
444 type = pop_type (type);
447 tree node = quick_stack;
448 quick_stack = TREE_CHAIN (quick_stack);
449 TREE_CHAIN (node) = tree_list_free_list;
450 tree_list_free_list = node;
451 node = TREE_VALUE (node);
455 return find_stack_slot (stack_pointer, promote_type (type));
459 /* Pop and discard the top COUNT stack slots. */
462 java_stack_pop (int count)
468 if (stack_pointer == 0)
471 type = stack_type_map[stack_pointer - 1];
472 if (type == TYPE_SECOND)
475 if (stack_pointer == 1 || count <= 0)
478 type = stack_type_map[stack_pointer - 2];
480 val = pop_value (type);
485 /* Implement the 'swap' operator (to swap two top stack slots). */
488 java_stack_swap (void)
494 if (stack_pointer < 2
495 || (type1 = stack_type_map[stack_pointer - 1]) == TYPE_UNKNOWN
496 || (type2 = stack_type_map[stack_pointer - 2]) == TYPE_UNKNOWN
497 || type1 == TYPE_SECOND || type2 == TYPE_SECOND
498 || TYPE_IS_WIDE (type1) || TYPE_IS_WIDE (type2))
499 /* Bad stack swap. */
502 flush_quick_stack ();
503 decl1 = find_stack_slot (stack_pointer - 1, type1);
504 decl2 = find_stack_slot (stack_pointer - 2, type2);
505 temp = copy_to_reg (DECL_RTL (decl1));
506 emit_move_insn (DECL_RTL (find_stack_slot (stack_pointer - 1, type2)),
508 emit_move_insn (DECL_RTL (find_stack_slot (stack_pointer - 2, type1)), temp);
509 stack_type_map[stack_pointer - 1] = type2;
510 stack_type_map[stack_pointer - 2] = type1;
514 java_stack_dup (int size, int offset)
516 int low_index = stack_pointer - size - offset;
519 error ("stack underflow - dup* operation");
521 flush_quick_stack ();
523 stack_pointer += size;
524 dst_index = stack_pointer;
526 for (dst_index = stack_pointer; --dst_index >= low_index; )
529 int src_index = dst_index - size;
530 if (src_index < low_index)
531 src_index = dst_index + size + offset;
532 type = stack_type_map [src_index];
533 if (type == TYPE_SECOND)
535 if (src_index <= low_index)
536 /* Dup operation splits 64-bit number. */
539 stack_type_map[dst_index] = type;
540 src_index--; dst_index--;
541 type = stack_type_map[src_index];
542 if (! TYPE_IS_WIDE (type))
545 else if (TYPE_IS_WIDE (type))
548 if (src_index != dst_index)
550 tree src_decl = find_stack_slot (src_index, type);
551 tree dst_decl = find_stack_slot (dst_index, type);
552 emit_move_insn (DECL_RTL (dst_decl), DECL_RTL (src_decl));
553 stack_type_map[dst_index] = type;
558 /* Calls _Jv_Throw or _Jv_Sjlj_Throw. Discard the contents of the
562 build_java_athrow (tree node)
566 call = build (CALL_EXPR,
568 build_address_of (throw_node),
569 build_tree_list (NULL_TREE, node),
571 TREE_SIDE_EFFECTS (call) = 1;
572 expand_expr_stmt (call);
573 java_stack_pop (stack_pointer);
576 /* Implementation for jsr/ret */
579 build_java_jsr (int target_pc, int return_pc)
581 tree where = lookup_label (target_pc);
582 tree ret = lookup_label (return_pc);
583 tree ret_label = fold (build1 (ADDR_EXPR, return_address_type_node, ret));
584 push_value (ret_label);
585 flush_quick_stack ();
586 emit_jump (label_rtx (where));
588 if (instruction_bits [return_pc] & BCODE_VERIFIED)
589 load_type_state (ret);
593 build_java_ret (tree location)
595 expand_computed_goto (location);
598 /* Implementation of operations on array: new, load, store, length */
601 decode_newarray_type (int atype)
605 case 4: return boolean_type_node;
606 case 5: return char_type_node;
607 case 6: return float_type_node;
608 case 7: return double_type_node;
609 case 8: return byte_type_node;
610 case 9: return short_type_node;
611 case 10: return int_type_node;
612 case 11: return long_type_node;
613 default: return NULL_TREE;
617 /* Map primitive type to the code used by OPCODE_newarray. */
620 encode_newarray_type (tree type)
622 if (type == boolean_type_node)
624 else if (type == char_type_node)
626 else if (type == float_type_node)
628 else if (type == double_type_node)
630 else if (type == byte_type_node)
632 else if (type == short_type_node)
634 else if (type == int_type_node)
636 else if (type == long_type_node)
642 /* Build a call to _Jv_ThrowBadArrayIndex(), the
643 ArrayIndexOfBoundsException exception handler. */
646 build_java_throw_out_of_bounds_exception (tree index)
648 tree node = build (CALL_EXPR, int_type_node,
649 build_address_of (soft_badarrayindex_node),
650 build_tree_list (NULL_TREE, index), NULL_TREE);
651 TREE_SIDE_EFFECTS (node) = 1; /* Allows expansion within ANDIF */
655 /* Return the length of an array. Doesn't perform any checking on the nature
656 or value of the array NODE. May be used to implement some bytecodes. */
659 build_java_array_length_access (tree node)
661 tree type = TREE_TYPE (node);
662 tree array_type = TREE_TYPE (type);
663 HOST_WIDE_INT length;
665 /* JVM spec: If the arrayref is null, the arraylength instruction
666 throws a NullPointerException. The only way we could get a node
667 of type ptr_type_node at this point is `aconst_null; arraylength'
668 or something equivalent. */
669 if (type == ptr_type_node)
670 return build (CALL_EXPR, int_type_node,
671 build_address_of (soft_nullpointer_node),
672 NULL_TREE, NULL_TREE);
674 if (!is_array_type_p (type))
677 length = java_array_type_length (type);
679 return build_int_2 (length, 0);
681 node = build (COMPONENT_REF, int_type_node,
682 build_java_indirect_ref (array_type, node,
683 flag_check_references),
684 lookup_field (&array_type, get_identifier ("length")));
685 IS_ARRAY_LENGTH_ACCESS (node) = 1;
689 /* Optionally checks a reference against the NULL pointer. ARG1: the
690 expr, ARG2: we should check the reference. Don't generate extra
691 checks if we're not generating code. */
694 java_check_reference (tree expr, int check)
696 if (!flag_syntax_only && check)
698 expr = save_expr (expr);
699 expr = build (COND_EXPR, TREE_TYPE (expr),
700 build (EQ_EXPR, boolean_type_node, expr, null_pointer_node),
701 build (CALL_EXPR, void_type_node,
702 build_address_of (soft_nullpointer_node),
703 NULL_TREE, NULL_TREE),
710 /* Reference an object: just like an INDIRECT_REF, but with checking. */
713 build_java_indirect_ref (tree type, tree expr, int check)
715 return build1 (INDIRECT_REF, type, java_check_reference (expr, check));
718 /* Implement array indexing (either as l-value or r-value).
719 Returns a tree for ARRAY[INDEX], assume TYPE is the element type.
720 Optionally performs bounds checking and/or test to NULL.
721 At this point, ARRAY should have been verified as an array. */
724 build_java_arrayaccess (tree array, tree type, tree index)
726 tree node, throw = NULL_TREE;
729 tree array_type = TREE_TYPE (TREE_TYPE (array));
731 if (flag_bounds_check)
734 * (unsigned jint) INDEX >= (unsigned jint) LEN
735 * && throw ArrayIndexOutOfBoundsException.
736 * Note this is equivalent to and more efficient than:
737 * INDEX < 0 || INDEX >= LEN && throw ... */
739 tree len = build_java_array_length_access (array);
740 TREE_TYPE (len) = unsigned_int_type_node;
741 test = fold (build (GE_EXPR, boolean_type_node,
742 convert (unsigned_int_type_node, index),
744 if (! integer_zerop (test))
746 throw = build (TRUTH_ANDIF_EXPR, int_type_node, test,
747 build_java_throw_out_of_bounds_exception (index));
748 /* allows expansion within COMPOUND */
749 TREE_SIDE_EFFECTS( throw ) = 1;
753 /* If checking bounds, wrap the index expr with a COMPOUND_EXPR in order
754 to have the bounds check evaluated first. */
755 if (throw != NULL_TREE)
756 index = build (COMPOUND_EXPR, int_type_node, throw, index);
758 data_field = lookup_field (&array_type, get_identifier ("data"));
760 ref = build (COMPONENT_REF, TREE_TYPE (data_field),
761 build_java_indirect_ref (array_type, array,
762 flag_check_references),
765 node = build (ARRAY_REF, type, ref, index);
769 /* Generate code to throw an ArrayStoreException if OBJECT is not assignable
770 (at runtime) to an element of ARRAY. A NOP_EXPR is returned if it can
771 determine that no check is required. */
774 build_java_arraystore_check (tree array, tree object)
776 tree check, element_type, source;
777 tree array_type_p = TREE_TYPE (array);
778 tree object_type = TYPE_NAME (TREE_TYPE (TREE_TYPE (object)));
780 if (! is_array_type_p (array_type_p))
783 /* Get the TYPE_DECL for ARRAY's element type. */
784 element_type = TYPE_NAME (TREE_TYPE (TREE_TYPE (TREE_TYPE (array_type_p))));
786 if (TREE_CODE (element_type) != TYPE_DECL
787 || TREE_CODE (object_type) != TYPE_DECL)
790 if (!flag_store_check)
791 return build1 (NOP_EXPR, array_type_p, array);
793 /* No check is needed if the element type is final or is itself an array.
794 Also check that element_type matches object_type, since in the bytecode
795 compilation case element_type may be the actual element type of the array
796 rather than its declared type. */
797 if (element_type == object_type
798 && (TYPE_ARRAY_P (TREE_TYPE (element_type))
799 || CLASS_FINAL (element_type)))
800 return build1 (NOP_EXPR, array_type_p, array);
802 /* OBJECT might be wrapped by a SAVE_EXPR. */
803 if (TREE_CODE (object) == SAVE_EXPR)
804 source = TREE_OPERAND (object, 0);
808 /* Avoid the check if OBJECT was just loaded from the same array. */
809 if (TREE_CODE (source) == ARRAY_REF)
812 source = TREE_OPERAND (source, 0); /* COMPONENT_REF. */
813 source = TREE_OPERAND (source, 0); /* INDIRECT_REF. */
814 source = TREE_OPERAND (source, 0); /* Source array's DECL or SAVE_EXPR. */
815 if (TREE_CODE (source) == SAVE_EXPR)
816 source = TREE_OPERAND (source, 0);
819 if (TREE_CODE (target) == SAVE_EXPR)
820 target = TREE_OPERAND (target, 0);
822 if (source == target)
823 return build1 (NOP_EXPR, array_type_p, array);
826 /* Build an invocation of _Jv_CheckArrayStore */
827 check = build (CALL_EXPR, void_type_node,
828 build_address_of (soft_checkarraystore_node),
829 tree_cons (NULL_TREE, array,
830 build_tree_list (NULL_TREE, object)),
832 TREE_SIDE_EFFECTS (check) = 1;
837 /* Makes sure that INDEXED_TYPE is appropriate. If not, make it from
838 ARRAY_NODE. This function is used to retrieve something less vague than
839 a pointer type when indexing the first dimension of something like [[<t>.
840 May return a corrected type, if necessary, otherwise INDEXED_TYPE is
842 As a side effect, it also makes sure that ARRAY_NODE is an array. */
845 build_java_check_indexed_type (tree array_node, tree indexed_type)
849 if (!is_array_type_p (TREE_TYPE (array_node)))
852 elt_type = (TYPE_ARRAY_ELEMENT (TREE_TYPE (TREE_TYPE (array_node))));
854 if (indexed_type == ptr_type_node )
855 return promote_type (elt_type);
857 /* BYTE/BOOLEAN store and load are used for both type */
858 if (indexed_type == byte_type_node && elt_type == boolean_type_node )
859 return boolean_type_node;
861 if (indexed_type != elt_type )
867 /* newarray triggers a call to _Jv_NewPrimArray. This function should be
868 called with an integer code (the type of array to create), and the length
869 of the array to create. */
872 build_newarray (int atype_value, tree length)
876 tree prim_type = decode_newarray_type (atype_value);
878 = build_java_array_type (prim_type,
879 host_integerp (length, 0) == INTEGER_CST
880 ? tree_low_cst (length, 0) : -1);
882 /* If compiling to native, pass a reference to the primitive type class
883 and save the runtime some work. However, the bytecode generator
884 expects to find the type_code int here. */
885 if (flag_emit_class_files)
886 type_arg = build_int_2 (atype_value, 0);
888 type_arg = build_class_ref (prim_type);
890 return build (CALL_EXPR, promote_type (type),
891 build_address_of (soft_newarray_node),
892 tree_cons (NULL_TREE,
894 build_tree_list (NULL_TREE, length)),
898 /* Generates anewarray from a given CLASS_TYPE. Gets from the stack the size
902 build_anewarray (tree class_type, tree length)
905 = build_java_array_type (class_type,
906 host_integerp (length, 0)
907 ? tree_low_cst (length, 0) : -1);
909 return build (CALL_EXPR, promote_type (type),
910 build_address_of (soft_anewarray_node),
911 tree_cons (NULL_TREE, length,
912 tree_cons (NULL_TREE, build_class_ref (class_type),
913 build_tree_list (NULL_TREE,
914 null_pointer_node))),
918 /* Return a node the evaluates 'new TYPE[LENGTH]'. */
921 build_new_array (tree type, tree length)
923 if (JPRIMITIVE_TYPE_P (type))
924 return build_newarray (encode_newarray_type (type), length);
926 return build_anewarray (TREE_TYPE (type), length);
929 /* Generates a call to _Jv_NewMultiArray. multianewarray expects a
930 class pointer, a number of dimensions and the matching number of
931 dimensions. The argument list is NULL terminated. */
934 expand_java_multianewarray (tree class_type, int ndim)
937 tree args = build_tree_list( NULL_TREE, null_pointer_node );
939 for( i = 0; i < ndim; i++ )
940 args = tree_cons (NULL_TREE, pop_value (int_type_node), args);
942 push_value (build (CALL_EXPR,
943 promote_type (class_type),
944 build_address_of (soft_multianewarray_node),
945 tree_cons (NULL_TREE, build_class_ref (class_type),
946 tree_cons (NULL_TREE,
947 build_int_2 (ndim, 0), args )),
951 /* ARRAY[INDEX] <- RHS. build_java_check_indexed_type makes sure that
952 ARRAY is an array type. May expand some bound checking and NULL
953 pointer checking. RHS_TYPE_NODE we are going to store. In the case
954 of the CHAR/BYTE/BOOLEAN SHORT, the type popped of the stack is an
955 INT. In those cases, we make the conversion.
957 if ARRAy is a reference type, the assignment is checked at run-time
958 to make sure that the RHS can be assigned to the array element
959 type. It is not necessary to generate this code if ARRAY is final. */
962 expand_java_arraystore (tree rhs_type_node)
964 tree rhs_node = pop_value ((INTEGRAL_TYPE_P (rhs_type_node)
965 && TYPE_PRECISION (rhs_type_node) <= 32) ?
966 int_type_node : rhs_type_node);
967 tree index = pop_value (int_type_node);
968 tree array = pop_value (ptr_type_node);
970 rhs_type_node = build_java_check_indexed_type (array, rhs_type_node);
972 flush_quick_stack ();
974 index = save_expr (index);
975 array = save_expr (array);
977 if (TREE_CODE (rhs_type_node) == POINTER_TYPE)
979 tree check = build_java_arraystore_check (array, rhs_node);
980 expand_expr_stmt (check);
983 expand_assignment (build_java_arrayaccess (array,
989 /* Expand the evaluation of ARRAY[INDEX]. build_java_check_indexed_type makes
990 sure that LHS is an array type. May expand some bound checking and NULL
992 LHS_TYPE_NODE is the type of ARRAY[INDEX]. But in the case of CHAR/BYTE/
993 BOOLEAN/SHORT, we push a promoted type back to the stack.
997 expand_java_arrayload (tree lhs_type_node )
1000 tree index_node = pop_value (int_type_node);
1001 tree array_node = pop_value (ptr_type_node);
1003 index_node = save_expr (index_node);
1004 array_node = save_expr (array_node);
1006 if (TREE_TYPE (array_node) == ptr_type_node)
1007 /* The only way we could get a node of type ptr_type_node at this
1008 point is `aconst_null; arraylength' or something equivalent, so
1009 unconditionally throw NullPointerException. */
1010 load_node = build (CALL_EXPR, lhs_type_node,
1011 build_address_of (soft_nullpointer_node),
1012 NULL_TREE, NULL_TREE);
1015 lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
1016 load_node = build_java_arrayaccess (array_node,
1020 if (INTEGRAL_TYPE_P (lhs_type_node) && TYPE_PRECISION (lhs_type_node) <= 32)
1021 load_node = fold (build1 (NOP_EXPR, int_type_node, load_node));
1022 push_value (load_node);
1025 /* Expands .length. Makes sure that we deal with and array and may expand
1026 a NULL check on the array object. */
1029 expand_java_array_length (void)
1031 tree array = pop_value (ptr_type_node);
1032 tree length = build_java_array_length_access (array);
1034 push_value (length);
1037 /* Emit code for the call to _Jv_Monitor{Enter,Exit}. CALL can be
1038 either soft_monitorenter_node or soft_monitorexit_node. */
1041 build_java_monitor (tree call, tree object)
1043 return (build (CALL_EXPR,
1045 build_address_of (call),
1046 build_tree_list (NULL_TREE, object),
1050 /* Emit code for one of the PUSHC instructions. */
1053 expand_java_pushc (int ival, tree type)
1056 if (type == ptr_type_node && ival == 0)
1057 value = null_pointer_node;
1058 else if (type == int_type_node || type == long_type_node)
1060 value = build_int_2 (ival, ival < 0 ? -1 : 0);
1061 TREE_TYPE (value) = type;
1063 else if (type == float_type_node || type == double_type_node)
1066 REAL_VALUE_FROM_INT (x, ival, 0, TYPE_MODE (type));
1067 value = build_real (type, x);
1076 expand_java_return (tree type)
1078 if (type == void_type_node)
1079 expand_null_return ();
1082 tree retval = pop_value (type);
1083 tree res = DECL_RESULT (current_function_decl);
1084 retval = build (MODIFY_EXPR, TREE_TYPE (res), res, retval);
1086 /* Handle the situation where the native integer type is smaller
1087 than the JVM integer. It can happen for many cross compilers.
1088 The whole if expression just goes away if INT_TYPE_SIZE < 32
1090 if (INT_TYPE_SIZE < 32
1091 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (res)))
1092 < GET_MODE_SIZE (TYPE_MODE (type))))
1093 retval = build1(NOP_EXPR, TREE_TYPE(res), retval);
1095 TREE_SIDE_EFFECTS (retval) = 1;
1096 expand_return (retval);
1101 expand_load_internal (int index, tree type, int pc)
1104 tree var = find_local_variable (index, type, pc);
1106 /* Now VAR is the VAR_DECL (or PARM_DECL) that we are going to push
1107 on the stack. If there is an assignment to this VAR_DECL between
1108 the stack push and the use, then the wrong code could be
1109 generated. To avoid this we create a new local and copy our
1110 value into it. Then we push this new local on the stack.
1111 Hopefully this all gets optimized out. */
1112 copy = build_decl (VAR_DECL, NULL_TREE, type);
1113 DECL_CONTEXT (copy) = current_function_decl;
1114 layout_decl (copy, 0);
1115 DECL_REGISTER (copy) = 1;
1117 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (copy);
1118 DECL_INITIAL (copy) = var;
1119 expand_decl_init (copy);
1124 build_address_of (tree value)
1126 return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (value)), value);
1129 bool class_has_finalize_method (tree type)
1131 tree super = CLASSTYPE_SUPER (type);
1133 if (super == NULL_TREE)
1134 return false; /* Every class with a real finalizer inherits */
1135 /* from java.lang.Object. */
1137 return HAS_FINALIZER_P (type) || class_has_finalize_method (super);
1141 expand_java_NEW (tree type)
1145 alloc_node = (class_has_finalize_method (type) ? alloc_object_node
1146 : alloc_no_finalizer_node);
1147 if (! CLASS_LOADED_P (type))
1148 load_class (type, 1);
1149 safe_layout_class (type);
1150 push_value (build (CALL_EXPR, promote_type (type),
1151 build_address_of (alloc_node),
1152 tree_cons (NULL_TREE, build_class_ref (type),
1153 build_tree_list (NULL_TREE,
1154 size_in_bytes (type))),
1158 /* This returns an expression which will extract the class of an
1162 build_get_class (tree value)
1164 tree class_field = lookup_field (&dtable_type, get_identifier ("class"));
1165 tree vtable_field = lookup_field (&object_type_node,
1166 get_identifier ("vtable"));
1167 return build (COMPONENT_REF, class_ptr_type,
1168 build1 (INDIRECT_REF, dtable_type,
1169 build (COMPONENT_REF, dtable_ptr_type,
1170 build_java_indirect_ref (object_type_node, value,
1171 flag_check_references),
1176 /* This builds the tree representation of the `instanceof' operator.
1177 It tries various tricks to optimize this in cases where types are
1181 build_instanceof (tree value, tree type)
1184 tree itype = TREE_TYPE (TREE_TYPE (soft_instanceof_node));
1185 tree valtype = TREE_TYPE (TREE_TYPE (value));
1186 tree valclass = TYPE_NAME (valtype);
1189 /* When compiling from bytecode, we need to ensure that TYPE has
1191 if (CLASS_P (type) && ! CLASS_LOADED_P (type))
1193 load_class (type, 1);
1194 safe_layout_class (type);
1195 if (! TYPE_SIZE (type) || TREE_CODE (TYPE_SIZE (type)) == ERROR_MARK)
1196 return error_mark_node;
1198 klass = TYPE_NAME (type);
1200 if (type == object_type_node || inherits_from_p (valtype, type))
1202 /* Anything except `null' is an instance of Object. Likewise,
1203 if the object is known to be an instance of the class, then
1204 we only need to check for `null'. */
1205 expr = build (NE_EXPR, itype, value, null_pointer_node);
1207 else if (! TYPE_ARRAY_P (type)
1208 && ! TYPE_ARRAY_P (valtype)
1209 && DECL_P (klass) && DECL_P (valclass)
1210 && ! CLASS_INTERFACE (valclass)
1211 && ! CLASS_INTERFACE (klass)
1212 && ! inherits_from_p (type, valtype)
1213 && (CLASS_FINAL (klass)
1214 || ! inherits_from_p (valtype, type)))
1216 /* The classes are from different branches of the derivation
1217 tree, so we immediately know the answer. */
1218 expr = boolean_false_node;
1220 else if (DECL_P (klass) && CLASS_FINAL (klass))
1222 tree save = save_expr (value);
1223 expr = build (COND_EXPR, itype,
1225 build (EQ_EXPR, itype,
1226 build_get_class (save),
1227 build_class_ref (type)),
1228 boolean_false_node);
1232 expr = build (CALL_EXPR, itype,
1233 build_address_of (soft_instanceof_node),
1234 tree_cons (NULL_TREE, value,
1235 build_tree_list (NULL_TREE,
1236 build_class_ref (type))),
1239 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (value);
1244 expand_java_INSTANCEOF (tree type)
1246 tree value = pop_value (object_ptr_type_node);
1247 value = build_instanceof (value, type);
1252 expand_java_CHECKCAST (tree type)
1254 tree value = pop_value (ptr_type_node);
1255 value = build (CALL_EXPR, promote_type (type),
1256 build_address_of (soft_checkcast_node),
1257 tree_cons (NULL_TREE, build_class_ref (type),
1258 build_tree_list (NULL_TREE, value)),
1264 expand_iinc (unsigned int local_var_index, int ival, int pc)
1266 tree local_var, res;
1267 tree constant_value;
1269 flush_quick_stack ();
1270 local_var = find_local_variable (local_var_index, int_type_node, pc);
1271 constant_value = build_int_2 (ival, ival < 0 ? -1 : 0);
1272 res = fold (build (PLUS_EXPR, int_type_node, local_var, constant_value));
1273 expand_assignment (local_var, res, 0);
1278 build_java_soft_divmod (enum tree_code op, tree type, tree op1, tree op2)
1281 tree arg1 = convert (type, op1);
1282 tree arg2 = convert (type, op2);
1284 if (type == int_type_node)
1288 case TRUNC_DIV_EXPR:
1289 call = soft_idiv_node;
1291 case TRUNC_MOD_EXPR:
1292 call = soft_irem_node;
1298 else if (type == long_type_node)
1302 case TRUNC_DIV_EXPR:
1303 call = soft_ldiv_node;
1305 case TRUNC_MOD_EXPR:
1306 call = soft_lrem_node;
1316 call = build (CALL_EXPR, type,
1317 build_address_of (call),
1318 tree_cons (NULL_TREE, arg1,
1319 build_tree_list (NULL_TREE, arg2)),
1326 build_java_binop (enum tree_code op, tree type, tree arg1, tree arg2)
1333 tree u_type = java_unsigned_type (type);
1334 arg1 = convert (u_type, arg1);
1335 arg1 = build_java_binop (RSHIFT_EXPR, u_type, arg1, arg2);
1336 return convert (type, arg1);
1340 mask = build_int_2 (TYPE_PRECISION (TREE_TYPE (arg1)) - 1, 0);
1341 arg2 = fold (build (BIT_AND_EXPR, int_type_node, arg2, mask));
1344 case COMPARE_L_EXPR: /* arg1 > arg2 ? 1 : arg1 == arg2 ? 0 : -1 */
1345 case COMPARE_G_EXPR: /* arg1 < arg2 ? -1 : arg1 == arg2 ? 0 : 1 */
1346 arg1 = save_expr (arg1); arg2 = save_expr (arg2);
1348 tree ifexp1 = fold ( build (op == COMPARE_L_EXPR ? GT_EXPR : LT_EXPR,
1349 boolean_type_node, arg1, arg2));
1350 tree ifexp2 = fold ( build (EQ_EXPR, boolean_type_node, arg1, arg2));
1351 tree second_compare = fold (build (COND_EXPR, int_type_node,
1352 ifexp2, integer_zero_node,
1353 op == COMPARE_L_EXPR
1354 ? integer_minus_one_node
1355 : integer_one_node));
1356 return fold (build (COND_EXPR, int_type_node, ifexp1,
1357 op == COMPARE_L_EXPR ? integer_one_node
1358 : integer_minus_one_node,
1362 arg1 = save_expr (arg1); arg2 = save_expr (arg2);
1364 tree ifexp1 = fold ( build (LT_EXPR, boolean_type_node, arg1, arg2));
1365 tree ifexp2 = fold ( build (GT_EXPR, boolean_type_node, arg1, arg2));
1366 tree second_compare = fold ( build (COND_EXPR, int_type_node,
1367 ifexp2, integer_one_node,
1368 integer_zero_node));
1369 return fold (build (COND_EXPR, int_type_node,
1370 ifexp1, integer_minus_one_node, second_compare));
1372 case TRUNC_DIV_EXPR:
1373 case TRUNC_MOD_EXPR:
1374 if (TREE_CODE (type) == REAL_TYPE
1375 && op == TRUNC_MOD_EXPR)
1378 if (type != double_type_node)
1380 arg1 = convert (double_type_node, arg1);
1381 arg2 = convert (double_type_node, arg2);
1383 call = build (CALL_EXPR, double_type_node,
1384 build_address_of (soft_fmod_node),
1385 tree_cons (NULL_TREE, arg1,
1386 build_tree_list (NULL_TREE, arg2)),
1388 if (type != double_type_node)
1389 call = convert (type, call);
1393 if (TREE_CODE (type) == INTEGER_TYPE
1394 && flag_use_divide_subroutine
1395 && ! flag_syntax_only)
1396 return build_java_soft_divmod (op, type, arg1, arg2);
1401 return fold (build (op, type, arg1, arg2));
1405 expand_java_binop (tree type, enum tree_code op)
1415 rtype = int_type_node;
1416 rarg = pop_value (rtype);
1419 rarg = pop_value (rtype);
1421 larg = pop_value (ltype);
1422 push_value (build_java_binop (op, type, larg, rarg));
1425 /* Lookup the field named NAME in *TYPEP or its super classes.
1426 If not found, return NULL_TREE.
1427 (If the *TYPEP is not found, or if the field reference is
1428 ambiguous, return error_mark_node.)
1429 If found, return the FIELD_DECL, and set *TYPEP to the
1430 class containing the field. */
1433 lookup_field (tree *typep, tree name)
1435 if (CLASS_P (*typep) && !CLASS_LOADED_P (*typep))
1437 load_class (*typep, 1);
1438 safe_layout_class (*typep);
1439 if (!TYPE_SIZE (*typep) || TREE_CODE (TYPE_SIZE (*typep)) == ERROR_MARK)
1440 return error_mark_node;
1444 tree field, basetype_vec;
1448 for (field = TYPE_FIELDS (*typep); field; field = TREE_CHAIN (field))
1449 if (DECL_NAME (field) == name)
1452 /* Process implemented interfaces. */
1453 basetype_vec = TYPE_BINFO_BASETYPES (*typep);
1454 n = TREE_VEC_LENGTH (basetype_vec);
1455 save_field = NULL_TREE;
1456 for (i = 0; i < n; i++)
1458 tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
1459 if ((field = lookup_field (&t, name)))
1461 if (save_field == field)
1463 if (save_field == NULL_TREE)
1467 tree i1 = DECL_CONTEXT (save_field);
1468 tree i2 = DECL_CONTEXT (field);
1469 error ("reference `%s' is ambiguous: appears in interface `%s' and interface `%s'",
1470 IDENTIFIER_POINTER (name),
1471 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (i1))),
1472 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (i2))));
1473 return error_mark_node;
1478 if (save_field != NULL_TREE)
1481 *typep = CLASSTYPE_SUPER (*typep);
1486 /* Look up the field named NAME in object SELF_VALUE,
1487 which has class SELF_CLASS (a non-handle RECORD_TYPE).
1488 SELF_VALUE is NULL_TREE if looking for a static field. */
1491 build_field_ref (tree self_value, tree self_class, tree name)
1493 tree base_class = self_class;
1494 tree field_decl = lookup_field (&base_class, name);
1495 if (field_decl == NULL_TREE)
1497 error ("field `%s' not found", IDENTIFIER_POINTER (name));
1498 return error_mark_node;
1500 if (self_value == NULL_TREE)
1502 return build_static_field_ref (field_decl);
1506 int check = (flag_check_references
1507 && ! (DECL_P (self_value)
1508 && DECL_NAME (self_value) == this_identifier_node));
1510 tree base_type = promote_type (base_class);
1511 if (base_type != TREE_TYPE (self_value))
1512 self_value = fold (build1 (NOP_EXPR, base_type, self_value));
1513 if (flag_indirect_dispatch
1514 && output_class != self_class)
1515 /* FIXME: output_class != self_class is not exactly the right
1516 test. What we really want to know is whether self_class is
1517 in the same translation unit as output_class. If it is,
1518 we can make a direct reference. */
1521 build_int_2 (get_symbol_table_index
1522 (field_decl, &TYPE_OTABLE_METHODS (output_class)), 0);
1524 build (ARRAY_REF, integer_type_node, TYPE_OTABLE_DECL (output_class),
1527 field_offset = fold (convert (sizetype, field_offset));
1529 = fold (build (PLUS_EXPR,
1530 build_pointer_type (TREE_TYPE (field_decl)),
1531 self_value, field_offset));
1532 return fold (build1 (INDIRECT_REF, TREE_TYPE (field_decl), address));
1535 self_value = build_java_indirect_ref (TREE_TYPE (TREE_TYPE (self_value)),
1537 return fold (build (COMPONENT_REF, TREE_TYPE (field_decl),
1538 self_value, field_decl));
1543 lookup_label (int pc)
1547 ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", pc);
1548 name = get_identifier (buf);
1549 if (IDENTIFIER_LOCAL_VALUE (name))
1550 return IDENTIFIER_LOCAL_VALUE (name);
1553 /* The type of the address of a label is return_address_type_node. */
1554 tree decl = create_label_decl (name);
1555 LABEL_PC (decl) = pc;
1557 return pushdecl (decl);
1561 /* Generate a unique name for the purpose of loops and switches
1562 labels, and try-catch-finally blocks label or temporary variables. */
1565 generate_name (void)
1567 static int l_number = 0;
1569 ASM_GENERATE_INTERNAL_LABEL(buff, "LJv", l_number);
1571 return get_identifier (buff);
1575 create_label_decl (tree name)
1578 decl = build_decl (LABEL_DECL, name,
1579 TREE_TYPE (return_address_type_node));
1580 DECL_CONTEXT (decl) = current_function_decl;
1581 DECL_IGNORED_P (decl) = 1;
1585 /* This maps a bytecode offset (PC) to various flags. */
1586 char *instruction_bits;
1589 note_label (int current_pc ATTRIBUTE_UNUSED, int target_pc)
1591 lookup_label (target_pc);
1592 instruction_bits [target_pc] |= BCODE_JUMP_TARGET;
1595 /* Emit code to jump to TARGET_PC if VALUE1 CONDITION VALUE2,
1596 where CONDITION is one of one the compare operators. */
1599 expand_compare (enum tree_code condition, tree value1, tree value2,
1602 tree target = lookup_label (target_pc);
1603 tree cond = fold (build (condition, boolean_type_node, value1, value2));
1604 expand_start_cond (java_truthvalue_conversion (cond), 0);
1605 expand_goto (target);
1609 /* Emit code for a TEST-type opcode. */
1612 expand_test (enum tree_code condition, tree type, int target_pc)
1614 tree value1, value2;
1615 flush_quick_stack ();
1616 value1 = pop_value (type);
1617 value2 = (type == ptr_type_node) ? null_pointer_node : integer_zero_node;
1618 expand_compare (condition, value1, value2, target_pc);
1621 /* Emit code for a COND-type opcode. */
1624 expand_cond (enum tree_code condition, tree type, int target_pc)
1626 tree value1, value2;
1627 flush_quick_stack ();
1628 /* note: pop values in opposite order */
1629 value2 = pop_value (type);
1630 value1 = pop_value (type);
1631 /* Maybe should check value1 and value2 for type compatibility ??? */
1632 expand_compare (condition, value1, value2, target_pc);
1636 expand_java_goto (int target_pc)
1638 tree target_label = lookup_label (target_pc);
1639 flush_quick_stack ();
1640 expand_goto (target_label);
1645 expand_java_call (int target_pc, int return_address)
1646 int target_pc, return_address;
1648 tree target_label = lookup_label (target_pc);
1649 tree value = build_int_2 (return_address, return_address < 0 ? -1 : 0);
1651 flush_quick_stack ();
1652 expand_goto (target_label);
1656 expand_java_ret (tree return_address ATTRIBUTE_UNUSED)
1658 warning ("ret instruction not implemented");
1660 tree target_label = lookup_label (target_pc);
1661 flush_quick_stack ();
1662 expand_goto (target_label);
1668 pop_arguments (tree arg_types)
1670 if (arg_types == end_params_node)
1672 if (TREE_CODE (arg_types) == TREE_LIST)
1674 tree tail = pop_arguments (TREE_CHAIN (arg_types));
1675 tree type = TREE_VALUE (arg_types);
1676 tree arg = pop_value (type);
1677 if (PROMOTE_PROTOTYPES
1678 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
1679 && INTEGRAL_TYPE_P (type))
1680 arg = convert (integer_type_node, arg);
1681 return tree_cons (NULL_TREE, arg, tail);
1686 /* Build an expression to initialize the class CLAS.
1687 if EXPR is non-NULL, returns an expression to first call the initializer
1688 (if it is needed) and then calls EXPR. */
1691 build_class_init (tree clas, tree expr)
1695 /* An optimization: if CLAS is a superclass of the class we're
1696 compiling, we don't need to initialize it. However, if CLAS is
1697 an interface, it won't necessarily be initialized, even if we
1699 if ((! CLASS_INTERFACE (TYPE_NAME (clas))
1700 && inherits_from_p (current_class, clas))
1701 || current_class == clas)
1704 if (always_initialize_class_p)
1706 init = build (CALL_EXPR, void_type_node,
1707 build_address_of (soft_initclass_node),
1708 build_tree_list (NULL_TREE, build_class_ref (clas)),
1710 TREE_SIDE_EFFECTS (init) = 1;
1714 tree *init_test_decl;
1715 init_test_decl = java_treetreehash_new
1716 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), clas);
1718 if (*init_test_decl == NULL)
1720 /* Build a declaration and mark it as a flag used to track
1721 static class initializations. */
1722 *init_test_decl = build_decl (VAR_DECL, NULL_TREE,
1724 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (*init_test_decl);
1725 LOCAL_CLASS_INITIALIZATION_FLAG (*init_test_decl) = 1;
1726 DECL_CONTEXT (*init_test_decl) = current_function_decl;
1727 DECL_FUNCTION_INIT_TEST_CLASS (*init_test_decl) = clas;
1728 /* Tell the check-init code to ignore this decl when not
1729 optimizing class initialization. */
1730 if (!STATIC_CLASS_INIT_OPT_P ())
1731 DECL_BIT_INDEX(*init_test_decl) = -1;
1732 /* Don't emit any symbolic debugging info for this decl. */
1733 DECL_IGNORED_P (*init_test_decl) = 1;
1736 init = build (CALL_EXPR, void_type_node,
1737 build_address_of (soft_initclass_node),
1738 build_tree_list (NULL_TREE, build_class_ref (clas)),
1740 TREE_SIDE_EFFECTS (init) = 1;
1741 init = build (COND_EXPR, void_type_node,
1742 build (EQ_EXPR, boolean_type_node,
1743 *init_test_decl, boolean_false_node),
1744 init, integer_zero_node);
1745 TREE_SIDE_EFFECTS (init) = 1;
1746 init = build (COMPOUND_EXPR, TREE_TYPE (expr), init,
1747 build (MODIFY_EXPR, boolean_type_node,
1748 *init_test_decl, boolean_true_node));
1749 TREE_SIDE_EFFECTS (init) = 1;
1752 if (expr != NULL_TREE)
1754 expr = build (COMPOUND_EXPR, TREE_TYPE (expr), init, expr);
1755 TREE_SIDE_EFFECTS (expr) = 1;
1762 build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
1763 tree self_type, tree method_signature ATTRIBUTE_UNUSED,
1764 tree arg_list ATTRIBUTE_UNUSED)
1767 if (is_compiled_class (self_type))
1769 if (!flag_indirect_dispatch
1770 || (!TREE_PUBLIC (method) && DECL_CONTEXT (method)))
1772 make_decl_rtl (method, NULL);
1773 func = build1 (ADDR_EXPR, method_ptr_type_node, method);
1778 build_int_2 (get_symbol_table_index
1779 (method, &TYPE_ATABLE_METHODS (output_class)), 0);
1781 build (ARRAY_REF, method_ptr_type_node,
1782 TYPE_ATABLE_DECL (output_class), table_index);
1787 /* We don't know whether the method has been (statically) compiled.
1788 Compile this code to get a reference to the method's code:
1790 SELF_TYPE->methods[METHOD_INDEX].ncode
1794 int method_index = 0;
1797 /* The method might actually be declared in some superclass, so
1798 we have to use its class context, not the caller's notion of
1799 where the method is. */
1800 self_type = DECL_CONTEXT (method);
1801 ref = build_class_ref (self_type);
1802 ref = build1 (INDIRECT_REF, class_type_node, ref);
1803 if (ncode_ident == NULL_TREE)
1804 ncode_ident = get_identifier ("ncode");
1805 if (methods_ident == NULL_TREE)
1806 methods_ident = get_identifier ("methods");
1807 ref = build (COMPONENT_REF, method_ptr_type_node, ref,
1808 lookup_field (&class_type_node, methods_ident));
1809 for (meth = TYPE_METHODS (self_type);
1810 ; meth = TREE_CHAIN (meth))
1814 if (meth == NULL_TREE)
1815 fatal_error ("method '%s' not found in class",
1816 IDENTIFIER_POINTER (DECL_NAME (method)));
1819 method_index *= int_size_in_bytes (method_type_node);
1820 ref = fold (build (PLUS_EXPR, method_ptr_type_node,
1821 ref, build_int_2 (method_index, 0)));
1822 ref = build1 (INDIRECT_REF, method_type_node, ref);
1823 func = build (COMPONENT_REF, nativecode_ptr_type_node,
1825 lookup_field (&method_type_node, ncode_ident));
1831 invoke_build_dtable (int is_invoke_interface, tree arg_list)
1833 tree dtable, objectref;
1835 TREE_VALUE (arg_list) = save_expr (TREE_VALUE (arg_list));
1837 /* If we're dealing with interfaces and if the objectref
1838 argument is an array then get the dispatch table of the class
1839 Object rather than the one from the objectref. */
1840 objectref = (is_invoke_interface
1841 && is_array_type_p (TREE_TYPE (TREE_VALUE (arg_list))) ?
1842 object_type_node : TREE_VALUE (arg_list));
1844 if (dtable_ident == NULL_TREE)
1845 dtable_ident = get_identifier ("vtable");
1846 dtable = build_java_indirect_ref (object_type_node, objectref,
1847 flag_check_references);
1848 dtable = build (COMPONENT_REF, dtable_ptr_type, dtable,
1849 lookup_field (&object_type_node, dtable_ident));
1854 /* Determine the index in SYMBOL_TABLE for a reference to the decl
1855 T. If this decl has not been seen before, it will be added to the
1856 otable_methods. If it has, the existing table slot will be
1860 get_symbol_table_index (tree t, tree *symbol_table)
1865 if (*symbol_table == NULL_TREE)
1867 *symbol_table = build_tree_list (t, t);
1871 method_list = *symbol_table;
1875 tree value = TREE_VALUE (method_list);
1879 if (TREE_CHAIN (method_list) == NULL_TREE)
1882 method_list = TREE_CHAIN (method_list);
1885 TREE_CHAIN (method_list) = build_tree_list (t, t);
1890 build_invokevirtual (tree dtable, tree method)
1893 tree nativecode_ptr_ptr_type_node
1894 = build_pointer_type (nativecode_ptr_type_node);
1898 if (flag_indirect_dispatch)
1901 = build_int_2 (get_symbol_table_index
1902 (method, &TYPE_OTABLE_METHODS (output_class)), 0);
1903 method_index = build (ARRAY_REF, integer_type_node,
1904 TYPE_OTABLE_DECL (output_class),
1909 method_index = convert (sizetype, DECL_VINDEX (method));
1911 if (TARGET_VTABLE_USES_DESCRIPTORS)
1912 /* Add one to skip bogus descriptor for class and GC descriptor. */
1913 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1915 /* Add 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1916 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1918 method_index = size_binop (MULT_EXPR, method_index,
1919 TYPE_SIZE_UNIT (nativecode_ptr_ptr_type_node));
1921 if (TARGET_VTABLE_USES_DESCRIPTORS)
1922 method_index = size_binop (MULT_EXPR, method_index,
1923 size_int (TARGET_VTABLE_USES_DESCRIPTORS));
1926 func = fold (build (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable,
1927 convert (nativecode_ptr_ptr_type_node, method_index)));
1929 if (TARGET_VTABLE_USES_DESCRIPTORS)
1930 func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
1932 func = build1 (INDIRECT_REF, nativecode_ptr_type_node, func);
1937 static GTY(()) tree class_ident;
1939 build_invokeinterface (tree dtable, tree method)
1948 /* We expand invokeinterface here. _Jv_LookupInterfaceMethod() will
1949 ensure that the selected method exists, is public and not
1950 abstract nor static. */
1952 if (class_ident == NULL_TREE)
1953 class_ident = get_identifier ("class");
1955 dtable = build_java_indirect_ref (dtable_type, dtable,
1956 flag_check_references);
1957 dtable = build (COMPONENT_REF, class_ptr_type, dtable,
1958 lookup_field (&dtable_type, class_ident));
1960 interface = DECL_CONTEXT (method);
1961 if (! CLASS_INTERFACE (TYPE_NAME (interface)))
1963 layout_class_methods (interface);
1965 if (flag_indirect_dispatch)
1968 build_int_2 (get_symbol_table_index
1969 (method, &TYPE_OTABLE_METHODS (output_class)), 0);
1971 build (ARRAY_REF, integer_type_node, TYPE_OTABLE_DECL (output_class),
1977 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++)
1981 idx = build_int_2 (i, 0);
1984 if (meth == NULL_TREE)
1989 lookup_arg = tree_cons (NULL_TREE, dtable,
1990 tree_cons (NULL_TREE, build_class_ref (interface),
1991 build_tree_list (NULL_TREE, idx)));
1993 return build (CALL_EXPR, ptr_type_node,
1994 build_address_of (soft_lookupinterfacemethod_node),
1995 lookup_arg, NULL_TREE);
1998 /* Expand one of the invoke_* opcodes.
1999 OCPODE is the specific opcode.
2000 METHOD_REF_INDEX is an index into the constant pool.
2001 NARGS is the number of arguments, or -1 if not specified. */
2004 expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED)
2006 tree method_signature = COMPONENT_REF_SIGNATURE(¤t_jcf->cpool, method_ref_index);
2007 tree method_name = COMPONENT_REF_NAME (¤t_jcf->cpool, method_ref_index);
2008 tree self_type = get_class_constant
2009 (current_jcf, COMPONENT_REF_CLASS_INDEX(¤t_jcf->cpool, method_ref_index));
2010 const char *const self_name
2011 = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (self_type)));
2012 tree call, func, method, arg_list, method_type;
2013 tree check = NULL_TREE;
2015 if (! CLASS_LOADED_P (self_type))
2017 load_class (self_type, 1);
2018 safe_layout_class (self_type);
2019 if (TREE_CODE (TYPE_SIZE (self_type)) == ERROR_MARK)
2020 fatal_error ("failed to find class '%s'", self_name);
2022 layout_class_methods (self_type);
2024 if (ID_INIT_P (method_name))
2025 method = lookup_java_constructor (self_type, method_signature);
2027 method = lookup_java_method (self_type, method_name, method_signature);
2028 if (method == NULL_TREE)
2030 error ("class '%s' has no method named '%s' matching signature '%s'",
2032 IDENTIFIER_POINTER (method_name),
2033 IDENTIFIER_POINTER (method_signature));
2035 /* Invoke static can't invoke static/abstract method */
2036 else if (opcode == OPCODE_invokestatic)
2038 if (!METHOD_STATIC (method))
2040 error ("invokestatic on non static method");
2043 else if (METHOD_ABSTRACT (method))
2045 error ("invokestatic on abstract method");
2051 if (METHOD_STATIC (method))
2053 error ("invoke[non-static] on static method");
2058 if (method == NULL_TREE)
2060 method_type = get_type_from_signature (method_signature);
2061 pop_arguments (TYPE_ARG_TYPES (method_type));
2062 if (opcode != OPCODE_invokestatic)
2063 pop_type (self_type);
2064 method_type = promote_type (TREE_TYPE (method_type));
2065 push_value (convert (method_type, integer_zero_node));
2069 method_type = TREE_TYPE (method);
2070 arg_list = pop_arguments (TYPE_ARG_TYPES (method_type));
2071 flush_quick_stack ();
2074 if (opcode == OPCODE_invokestatic)
2075 func = build_known_method_ref (method, method_type, self_type,
2076 method_signature, arg_list);
2077 else if (opcode == OPCODE_invokespecial
2078 || (opcode == OPCODE_invokevirtual
2079 && (METHOD_PRIVATE (method)
2080 || METHOD_FINAL (method)
2081 || CLASS_FINAL (TYPE_NAME (self_type)))))
2083 /* If the object for the method call is null, we throw an
2084 exception. We don't do this if the object is the current
2085 method's `this'. In other cases we just rely on an
2086 optimization pass to eliminate redundant checks. FIXME:
2087 Unfortunately there doesn't seem to be a way to determine
2088 what the current method is right now.
2089 We do omit the check if we're calling <init>. */
2090 /* We use a SAVE_EXPR here to make sure we only evaluate
2091 the new `self' expression once. */
2092 tree save_arg = save_expr (TREE_VALUE (arg_list));
2093 TREE_VALUE (arg_list) = save_arg;
2094 check = java_check_reference (save_arg, ! DECL_INIT_P (method));
2095 func = build_known_method_ref (method, method_type, self_type,
2096 method_signature, arg_list);
2100 tree dtable = invoke_build_dtable (opcode == OPCODE_invokeinterface,
2102 if (opcode == OPCODE_invokevirtual)
2103 func = build_invokevirtual (dtable, method);
2105 func = build_invokeinterface (dtable, method);
2107 func = build1 (NOP_EXPR, build_pointer_type (method_type), func);
2109 call = build (CALL_EXPR, TREE_TYPE (method_type), func, arg_list, NULL_TREE);
2110 TREE_SIDE_EFFECTS (call) = 1;
2111 call = check_for_builtin (method, call);
2113 if (check != NULL_TREE)
2115 call = build (COMPOUND_EXPR, TREE_TYPE (call), check, call);
2116 TREE_SIDE_EFFECTS (call) = 1;
2119 if (TREE_CODE (TREE_TYPE (method_type)) == VOID_TYPE)
2120 expand_expr_stmt (call);
2124 flush_quick_stack ();
2128 /* Create a stub which will be put into the vtable but which will call
2132 build_jni_stub (tree method)
2134 tree jnifunc, call, args, body, lookup_arg, method_sig, arg_types;
2135 tree jni_func_type, tem;
2136 tree env_var, res_var = NULL_TREE, block;
2137 tree method_args, res_type;
2142 tree klass = DECL_CONTEXT (method);
2143 int from_class = ! CLASS_FROM_SOURCE_P (klass);
2144 klass = build_class_ref (klass);
2146 if (! METHOD_NATIVE (method) || ! flag_jni)
2149 DECL_ARTIFICIAL (method) = 1;
2150 DECL_EXTERNAL (method) = 0;
2152 env_var = build_decl (VAR_DECL, get_identifier ("env"), ptr_type_node);
2153 DECL_CONTEXT (env_var) = method;
2155 if (TREE_TYPE (TREE_TYPE (method)) != void_type_node)
2157 res_var = build_decl (VAR_DECL, get_identifier ("res"),
2158 TREE_TYPE (TREE_TYPE (method)));
2159 DECL_CONTEXT (res_var) = method;
2160 TREE_CHAIN (env_var) = res_var;
2163 meth_var = build_decl (VAR_DECL, get_identifier ("meth"), ptr_type_node);
2164 TREE_STATIC (meth_var) = 1;
2165 TREE_PUBLIC (meth_var) = 0;
2166 DECL_EXTERNAL (meth_var) = 0;
2167 DECL_CONTEXT (meth_var) = method;
2168 DECL_ARTIFICIAL (meth_var) = 1;
2169 DECL_INITIAL (meth_var) = null_pointer_node;
2170 TREE_USED (meth_var) = 1;
2171 chainon (env_var, meth_var);
2172 layout_decl (meth_var, 0);
2173 make_decl_rtl (meth_var, NULL);
2174 rest_of_decl_compilation (meth_var, NULL, 0, 0);
2176 /* One strange way that the front ends are different is that they
2177 store arguments differently. */
2179 method_args = DECL_ARGUMENTS (method);
2181 method_args = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (method));
2182 block = build_block (env_var, NULL_TREE, NULL_TREE,
2183 method_args, NULL_TREE);
2184 TREE_SIDE_EFFECTS (block) = 1;
2185 /* When compiling from source we don't set the type of the block,
2186 because that will prevent patch_return from ever being run. */
2188 TREE_TYPE (block) = TREE_TYPE (TREE_TYPE (method));
2190 /* Compute the local `env' by calling _Jv_GetJNIEnvNewFrame. */
2191 body = build (MODIFY_EXPR, ptr_type_node, env_var,
2192 build (CALL_EXPR, ptr_type_node,
2193 build_address_of (soft_getjnienvnewframe_node),
2194 build_tree_list (NULL_TREE, klass),
2196 CAN_COMPLETE_NORMALLY (body) = 1;
2198 /* All the arguments to this method become arguments to the
2199 underlying JNI function. If we had to wrap object arguments in a
2200 special way, we would do that here. */
2202 for (tem = method_args; tem != NULL_TREE; tem = TREE_CHAIN (tem))
2204 int arg_bits = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (tem)));
2205 #ifdef PARM_BOUNDARY
2206 arg_bits = (((arg_bits + PARM_BOUNDARY - 1) / PARM_BOUNDARY)
2209 args_size += (arg_bits / BITS_PER_UNIT);
2211 args = tree_cons (NULL_TREE, tem, args);
2213 args = nreverse (args);
2214 arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
2216 /* For a static method the second argument is the class. For a
2217 non-static method the second argument is `this'; that is already
2218 available in the argument list. */
2219 if (METHOD_STATIC (method))
2221 args_size += int_size_in_bytes (TREE_TYPE (klass));
2222 args = tree_cons (NULL_TREE, klass, args);
2223 arg_types = tree_cons (NULL_TREE, object_ptr_type_node, arg_types);
2226 /* The JNIEnv structure is the first argument to the JNI function. */
2227 args_size += int_size_in_bytes (TREE_TYPE (env_var));
2228 args = tree_cons (NULL_TREE, env_var, args);
2229 arg_types = tree_cons (NULL_TREE, ptr_type_node, arg_types);
2231 /* We call _Jv_LookupJNIMethod to find the actual underlying
2232 function pointer. _Jv_LookupJNIMethod will throw the appropriate
2233 exception if this function is not found at runtime. */
2234 tem = build_tree_list (NULL_TREE, build_int_2 (args_size, 0));
2235 method_sig = build_java_signature (TREE_TYPE (method));
2236 lookup_arg = tree_cons (NULL_TREE,
2237 build_utf8_ref (unmangle_classname
2238 (IDENTIFIER_POINTER (method_sig),
2239 IDENTIFIER_LENGTH (method_sig))),
2241 tem = DECL_NAME (method);
2243 = tree_cons (NULL_TREE, klass,
2244 tree_cons (NULL_TREE, build_utf8_ref (tem), lookup_arg));
2246 tem = build_function_type (TREE_TYPE (TREE_TYPE (method)), arg_types);
2248 #ifdef MODIFY_JNI_METHOD_CALL
2249 tem = MODIFY_JNI_METHOD_CALL (tem);
2252 jni_func_type = build_pointer_type (tem);
2254 jnifunc = build (COND_EXPR, ptr_type_node,
2256 build (MODIFY_EXPR, ptr_type_node,
2258 build (CALL_EXPR, ptr_type_node,
2259 build_address_of (soft_lookupjnimethod_node),
2260 lookup_arg, NULL_TREE)));
2262 /* Now we make the actual JNI call via the resulting function
2264 call = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)),
2265 build1 (NOP_EXPR, jni_func_type, jnifunc),
2268 /* If the JNI call returned a result, capture it here. If we had to
2269 unwrap JNI object results, we would do that here. */
2270 if (res_var != NULL_TREE)
2271 call = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
2274 TREE_SIDE_EFFECTS (call) = 1;
2275 CAN_COMPLETE_NORMALLY (call) = 1;
2277 body = build (COMPOUND_EXPR, void_type_node, body, call);
2278 TREE_SIDE_EFFECTS (body) = 1;
2280 /* Now free the environment we allocated. */
2281 call = build (CALL_EXPR, ptr_type_node,
2282 build_address_of (soft_jnipopsystemframe_node),
2283 build_tree_list (NULL_TREE, env_var),
2285 TREE_SIDE_EFFECTS (call) = 1;
2286 CAN_COMPLETE_NORMALLY (call) = 1;
2287 body = build (COMPOUND_EXPR, void_type_node, body, call);
2288 TREE_SIDE_EFFECTS (body) = 1;
2290 /* Finally, do the return. When compiling from source we rely on
2291 patch_return to patch the return value -- because DECL_RESULT is
2292 not set at the time this function is called. */
2295 res_type = void_type_node;
2296 if (res_var != NULL_TREE)
2299 if (! DECL_RESULT (method))
2301 /* Make sure we copy the result variable to the actual
2302 result. We use the type of the DECL_RESULT because it
2303 might be different from the return type of the function:
2304 it might be promoted. */
2305 drt = TREE_TYPE (DECL_RESULT (method));
2306 if (drt != TREE_TYPE (res_var))
2307 res_var = build1 (CONVERT_EXPR, drt, res_var);
2308 res_var = build (MODIFY_EXPR, drt, DECL_RESULT (method), res_var);
2309 TREE_SIDE_EFFECTS (res_var) = 1;
2314 /* This is necessary to get patch_return to run. */
2315 res_type = NULL_TREE;
2317 body = build (COMPOUND_EXPR, void_type_node, body,
2318 build1 (RETURN_EXPR, res_type, res_var));
2319 TREE_SIDE_EFFECTS (body) = 1;
2321 BLOCK_EXPR_BODY (block) = body;
2325 /* Expand an operation to extract from or store into a field.
2326 IS_STATIC is 1 iff the field is static.
2327 IS_PUTTING is 1 for putting into a field; 0 for getting from the field.
2328 FIELD_REF_INDEX is an index into the constant pool. */
2331 expand_java_field_op (int is_static, int is_putting, int field_ref_index)
2334 get_class_constant (current_jcf,
2335 COMPONENT_REF_CLASS_INDEX (¤t_jcf->cpool,
2337 const char *self_name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (self_type)));
2338 tree field_name = COMPONENT_REF_NAME (¤t_jcf->cpool, field_ref_index);
2339 tree field_signature = COMPONENT_REF_SIGNATURE (¤t_jcf->cpool,
2341 tree field_type = get_type_from_signature (field_signature);
2342 tree new_value = is_putting ? pop_value (field_type) : NULL_TREE;
2345 tree field_decl = lookup_field (&self_type, field_name);
2346 if (field_decl == error_mark_node)
2350 else if (field_decl == NULL_TREE)
2352 error ("missing field '%s' in '%s'",
2353 IDENTIFIER_POINTER (field_name), self_name);
2356 else if (build_java_signature (TREE_TYPE (field_decl)) != field_signature)
2358 error ("mismatching signature for field '%s' in '%s'",
2359 IDENTIFIER_POINTER (field_name), self_name);
2362 field_ref = is_static ? NULL_TREE : pop_value (self_type);
2366 push_value (convert (field_type, integer_zero_node));
2367 flush_quick_stack ();
2371 field_ref = build_field_ref (field_ref, self_type, field_name);
2373 field_ref = build_class_init (self_type, field_ref);
2376 flush_quick_stack ();
2377 if (FIELD_FINAL (field_decl))
2379 if (DECL_CONTEXT (field_decl) != current_class)
2380 error ("%Jassignment to final field '%D' not in field's class",
2381 field_decl, field_decl);
2382 else if (FIELD_STATIC (field_decl))
2384 if (!DECL_CLINIT_P (current_function_decl))
2385 warning ("%Jassignment to final static field `%D' not in "
2386 "class initializer", field_decl, field_decl);
2390 tree cfndecl_name = DECL_NAME (current_function_decl);
2391 if (! DECL_CONSTRUCTOR_P (current_function_decl)
2392 && !ID_FINIT_P (cfndecl_name))
2393 warning ("%Jassignment to final field '%D' not in constructor",
2394 field_decl, field_decl);
2397 expand_assignment (field_ref, new_value, 0);
2400 push_value (field_ref);
2404 load_type_state (tree label)
2407 tree vec = LABEL_TYPE_STATE (label);
2408 int cur_length = TREE_VEC_LENGTH (vec);
2409 stack_pointer = cur_length - DECL_MAX_LOCALS(current_function_decl);
2410 for (i = 0; i < cur_length; i++)
2411 type_map [i] = TREE_VEC_ELT (vec, i);
2414 /* Do the expansion of a Java switch. With Gcc, switches are front-end
2415 dependent things, but they rely on gcc routines. This function is
2416 placed here because it uses things defined locally in parse.y. */
2419 case_identity (tree t __attribute__ ((__unused__)), tree v)
2424 /* Return the name of the vtable for an array of a given primitive
2427 get_primitive_array_vtable (tree elt)
2430 if (elt == boolean_type_node)
2431 r = boolean_array_vtable;
2432 else if (elt == byte_type_node)
2433 r = byte_array_vtable;
2434 else if (elt == char_type_node)
2435 r = char_array_vtable;
2436 else if (elt == short_type_node)
2437 r = short_array_vtable;
2438 else if (elt == int_type_node)
2439 r = int_array_vtable;
2440 else if (elt == long_type_node)
2441 r = long_array_vtable;
2442 else if (elt == float_type_node)
2443 r = float_array_vtable;
2444 else if (elt == double_type_node)
2445 r = double_array_vtable;
2448 return build_address_of (r);
2452 java_expand_expr (tree exp, rtx target, enum machine_mode tmode,
2453 int modifier /* Actually an enum expand_modifier. */,
2454 rtx *alt_rtl ATTRIBUTE_UNUSED)
2458 switch (TREE_CODE (exp))
2460 case NEW_ARRAY_INIT:
2463 tree array_type = TREE_TYPE (TREE_TYPE (exp));
2464 tree element_type = TYPE_ARRAY_ELEMENT (array_type);
2465 tree data_fld = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (array_type)));
2466 HOST_WIDE_INT ilength = java_array_type_length (array_type);
2467 tree length = build_int_2 (ilength, 0);
2468 tree init = TREE_OPERAND (exp, 0);
2471 /* See if we can generate the array statically. */
2472 if (TREE_CONSTANT (init) && TREE_STATIC (exp)
2473 && JPRIMITIVE_TYPE_P (element_type))
2475 tree temp, value, init_decl;
2477 START_RECORD_CONSTRUCTOR (temp, object_type_node);
2478 PUSH_FIELD_VALUE (temp, "vtable",
2479 get_primitive_array_vtable (element_type));
2480 if (! flag_hash_synchronization)
2481 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
2482 FINISH_RECORD_CONSTRUCTOR (temp);
2483 START_RECORD_CONSTRUCTOR (value, array_type);
2484 PUSH_SUPER_VALUE (value, temp);
2485 PUSH_FIELD_VALUE (value, "length", length);
2486 PUSH_FIELD_VALUE (value, "data", init);
2487 FINISH_RECORD_CONSTRUCTOR (value);
2489 init_decl = build_decl (VAR_DECL, generate_name (), array_type);
2490 pushdecl_top_level (init_decl);
2491 TREE_STATIC (init_decl) = 1;
2492 DECL_INITIAL (init_decl) = value;
2493 DECL_IGNORED_P (init_decl) = 1;
2494 TREE_READONLY (init_decl) = 1;
2495 /* Hash synchronization requires at least 64-bit alignment. */
2496 if (flag_hash_synchronization && POINTER_SIZE < 64)
2497 DECL_ALIGN (init_decl) = 64;
2498 rest_of_decl_compilation (init_decl, NULL, 1, 0);
2499 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (init_decl)) = 1;
2500 init = build1 (ADDR_EXPR, TREE_TYPE (exp), init_decl);
2501 r = expand_expr (init, target, tmode, modifier);
2505 array_decl = build_decl (VAR_DECL, NULL_TREE, TREE_TYPE (exp));
2506 expand_decl (array_decl);
2507 tmp = expand_assignment (array_decl,
2508 build_new_array (element_type, length),
2510 if (TREE_CONSTANT (init)
2511 && ilength >= 10 && JPRIMITIVE_TYPE_P (element_type))
2514 init_decl = build_decl (VAR_DECL, generate_name (),
2516 pushdecl_top_level (init_decl);
2517 TREE_STATIC (init_decl) = 1;
2518 DECL_INITIAL (init_decl) = init;
2519 DECL_IGNORED_P (init_decl) = 1;
2520 TREE_READONLY (init_decl) = 1;
2521 rest_of_decl_compilation (init_decl, NULL, 1, 0);
2522 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (init_decl)) = 1;
2525 expand_assignment (build (COMPONENT_REF, TREE_TYPE (data_fld),
2526 build_java_indirect_ref (array_type,
2527 array_decl, flag_check_references),
2528 data_fld), init, 0);
2532 if (BLOCK_EXPR_BODY (exp))
2536 tree body = BLOCK_EXPR_BODY (exp);
2537 /* Set to 1 or more when we found a static class
2538 initialization flag. */
2539 int found_class_initialization_flag = 0;
2541 pushlevel (2); /* 2 and above */
2542 expand_start_bindings (0);
2543 local = BLOCK_EXPR_DECLS (exp);
2546 tree next = TREE_CHAIN (local);
2547 found_class_initialization_flag +=
2548 LOCAL_CLASS_INITIALIZATION_FLAG_P (local);
2549 layout_decl (local, 0);
2550 expand_decl (pushdecl (local));
2554 /* Emit initialization code for test flags if we saw one. */
2555 if (! always_initialize_class_p
2556 && current_function_decl
2557 && found_class_initialization_flag)
2559 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl),
2560 emit_init_test_initialization, NULL);
2562 /* Avoid deep recursion for long block. */
2563 while (TREE_CODE (body) == COMPOUND_EXPR)
2565 expand_expr (TREE_OPERAND (body, 0), const0_rtx, VOIDmode, 0);
2567 body = TREE_OPERAND (body, 1);
2569 last = expand_expr (body, NULL_RTX, VOIDmode, 0);
2571 expand_end_bindings (getdecls (), 1, 0);
2580 if (pushcase (TREE_OPERAND (exp, 0), case_identity,
2581 build_decl (LABEL_DECL, NULL_TREE, NULL_TREE),
2584 EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (exp);
2586 (wfl_operator, "Duplicate case label: `%s'",
2587 print_int_node (TREE_OPERAND (exp, 0)));
2593 pushcase (NULL_TREE, 0,
2594 build_decl (LABEL_DECL, NULL_TREE, NULL_TREE), NULL);
2598 expand_start_case (0, TREE_OPERAND (exp, 0), int_type_node, "switch");
2599 expand_expr_stmt (TREE_OPERAND (exp, 1));
2600 expand_end_case (TREE_OPERAND (exp, 0));
2604 /* We expand a try[-catch] block */
2606 /* Expand the try block */
2607 expand_eh_region_start ();
2608 expand_expr_stmt (TREE_OPERAND (exp, 0));
2609 expand_start_all_catch ();
2611 /* Expand all catch clauses (EH handlers) */
2612 for (current = TREE_OPERAND (exp, 1); current;
2613 current = TREE_CHAIN (current))
2615 tree catch = TREE_OPERAND (current, 0);
2616 tree decl = BLOCK_EXPR_DECLS (catch);
2617 tree type = (decl ? TREE_TYPE (TREE_TYPE (decl)) : NULL_TREE);
2619 expand_start_catch (prepare_eh_table_type (type));
2620 expand_expr_stmt (TREE_OPERAND (current, 0));
2621 expand_end_catch ();
2623 expand_end_all_catch ();
2626 case JAVA_EXC_OBJ_EXPR:
2627 return expand_expr (build_exception_object_ref (TREE_TYPE (exp)),
2628 target, tmode, modifier);
2631 /* Used only by expanded inline functions. */
2632 expand_label (TREE_OPERAND (exp, 0));
2636 internal_error ("can't expand %s", tree_code_name [TREE_CODE (exp)]);
2640 /* Go over METHOD's bytecode and note instruction starts in
2641 instruction_bits[]. */
2644 note_instructions (JCF *jcf, tree method)
2647 unsigned char* byte_ops;
2648 long length = DECL_CODE_LENGTH (method);
2653 #undef RET /* Defined by config/i386/i386.h */
2655 #define BCODE byte_ops
2656 #define BYTE_type_node byte_type_node
2657 #define SHORT_type_node short_type_node
2658 #define INT_type_node int_type_node
2659 #define LONG_type_node long_type_node
2660 #define CHAR_type_node char_type_node
2661 #define PTR_type_node ptr_type_node
2662 #define FLOAT_type_node float_type_node
2663 #define DOUBLE_type_node double_type_node
2664 #define VOID_type_node void_type_node
2665 #define CONST_INDEX_1 (saw_index = 1, IMMEDIATE_u1)
2666 #define CONST_INDEX_2 (saw_index = 1, IMMEDIATE_u2)
2667 #define VAR_INDEX_1 (saw_index = 1, IMMEDIATE_u1)
2668 #define VAR_INDEX_2 (saw_index = 1, IMMEDIATE_u2)
2670 #define CHECK_PC_IN_RANGE(PC) ((void)1) /* Already handled by verifier. */
2672 JCF_SEEK (jcf, DECL_CODE_OFFSET (method));
2673 byte_ops = jcf->read_ptr;
2674 instruction_bits = xrealloc (instruction_bits, length + 1);
2675 memset (instruction_bits, 0, length + 1);
2677 /* This pass figures out which PC can be the targets of jumps. */
2678 for (PC = 0; PC < length;)
2680 int oldpc = PC; /* PC at instruction start. */
2681 instruction_bits [PC] |= BCODE_INSTRUCTION_START;
2682 switch (byte_ops[PC++])
2684 #define JAVAOP(OPNAME, OPCODE, OPKIND, OPERAND_TYPE, OPERAND_VALUE) \
2686 PRE_##OPKIND(OPERAND_TYPE, OPERAND_VALUE); \
2689 #define NOTE_LABEL(PC) note_label(oldpc, PC)
2691 #define PRE_PUSHC(OPERAND_TYPE, OPERAND_VALUE) (void)(OPERAND_VALUE);
2692 #define PRE_LOAD(OPERAND_TYPE, OPERAND_VALUE) (void)(OPERAND_VALUE);
2693 #define PRE_STORE(OPERAND_TYPE, OPERAND_VALUE) (void)(OPERAND_VALUE);
2694 #define PRE_STACK(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2695 #define PRE_UNOP(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2696 #define PRE_BINOP(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2697 #define PRE_CONVERT(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2698 #define PRE_CONVERT2(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2700 #define PRE_SPECIAL(OPERAND_TYPE, INSTRUCTION) \
2701 PRE_SPECIAL_##INSTRUCTION(OPERAND_TYPE)
2702 #define PRE_SPECIAL_IINC(OPERAND_TYPE) \
2703 ((void) IMMEDIATE_u1, (void) IMMEDIATE_s1)
2704 #define PRE_SPECIAL_ENTER(IGNORE) /* nothing */
2705 #define PRE_SPECIAL_EXIT(IGNORE) /* nothing */
2706 #define PRE_SPECIAL_THROW(IGNORE) /* nothing */
2707 #define PRE_SPECIAL_BREAK(IGNORE) /* nothing */
2709 /* two forms of wide instructions */
2710 #define PRE_SPECIAL_WIDE(IGNORE) \
2712 int modified_opcode = IMMEDIATE_u1; \
2713 if (modified_opcode == OPCODE_iinc) \
2715 (void) IMMEDIATE_u2; /* indexbyte1 and indexbyte2 */ \
2716 (void) IMMEDIATE_s2; /* constbyte1 and constbyte2 */ \
2720 (void) IMMEDIATE_u2; /* indexbyte1 and indexbyte2 */ \
2724 #define PRE_IMPL(IGNORE1, IGNORE2) /* nothing */
2726 #define PRE_MONITOR(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2728 #define PRE_RETURN(OPERAND_TYPE, OPERAND_VALUE) /* nothing */
2729 #define PRE_ARRAY(OPERAND_TYPE, SUBOP) \
2730 PRE_ARRAY_##SUBOP(OPERAND_TYPE)
2731 #define PRE_ARRAY_LOAD(TYPE) /* nothing */
2732 #define PRE_ARRAY_STORE(TYPE) /* nothing */
2733 #define PRE_ARRAY_LENGTH(TYPE) /* nothing */
2734 #define PRE_ARRAY_NEW(TYPE) PRE_ARRAY_NEW_##TYPE
2735 #define PRE_ARRAY_NEW_NUM ((void) IMMEDIATE_u1)
2736 #define PRE_ARRAY_NEW_PTR ((void) IMMEDIATE_u2)
2737 #define PRE_ARRAY_NEW_MULTI ((void) IMMEDIATE_u2, (void) IMMEDIATE_u1)
2739 #define PRE_TEST(OPERAND_TYPE, OPERAND_VALUE) NOTE_LABEL (oldpc+IMMEDIATE_s2)
2740 #define PRE_COND(OPERAND_TYPE, OPERAND_VALUE) NOTE_LABEL (oldpc+IMMEDIATE_s2)
2741 #define PRE_BRANCH(OPERAND_TYPE, OPERAND_VALUE) \
2742 saw_index = 0; INT_temp = (OPERAND_VALUE); \
2743 if (!saw_index) NOTE_LABEL(oldpc + INT_temp);
2744 #define PRE_JSR(OPERAND_TYPE, OPERAND_VALUE) \
2745 saw_index = 0; INT_temp = (OPERAND_VALUE); \
2747 if (!saw_index) NOTE_LABEL(oldpc + INT_temp);
2749 #define PRE_RET(OPERAND_TYPE, OPERAND_VALUE) (void)(OPERAND_VALUE)
2751 #define PRE_SWITCH(OPERAND_TYPE, TABLE_OR_LOOKUP) \
2752 PC = (PC + 3) / 4 * 4; PRE_##TABLE_OR_LOOKUP##_SWITCH
2754 #define PRE_LOOKUP_SWITCH \
2755 { jint default_offset = IMMEDIATE_s4; jint npairs = IMMEDIATE_s4; \
2756 NOTE_LABEL (default_offset+oldpc); \
2758 while (--npairs >= 0) { \
2759 jint match ATTRIBUTE_UNUSED = IMMEDIATE_s4; \
2760 jint offset = IMMEDIATE_s4; \
2761 NOTE_LABEL (offset+oldpc); } \
2764 #define PRE_TABLE_SWITCH \
2765 { jint default_offset = IMMEDIATE_s4; \
2766 jint low = IMMEDIATE_s4; jint high = IMMEDIATE_s4; \
2767 NOTE_LABEL (default_offset+oldpc); \
2769 while (low++ <= high) { \
2770 jint offset = IMMEDIATE_s4; \
2771 NOTE_LABEL (offset+oldpc); } \
2774 #define PRE_FIELD(MAYBE_STATIC, PUT_OR_GET) (void)(IMMEDIATE_u2);
2775 #define PRE_OBJECT(MAYBE_STATIC, PUT_OR_GET) (void)(IMMEDIATE_u2);
2776 #define PRE_INVOKE(MAYBE_STATIC, IS_INTERFACE) \
2777 (void)(IMMEDIATE_u2); \
2778 PC += 2 * IS_INTERFACE /* for invokeinterface */;
2780 #include "javaop.def"
2787 expand_byte_code (JCF *jcf, tree method)
2791 const unsigned char *linenumber_pointer;
2792 int dead_code_index = -1;
2793 unsigned char* byte_ops;
2794 long length = DECL_CODE_LENGTH (method);
2797 JCF_SEEK (jcf, DECL_CODE_OFFSET (method));
2798 byte_ops = jcf->read_ptr;
2800 /* We make an initial pass of the line number table, to note
2801 which instructions have associated line number entries. */
2802 linenumber_pointer = linenumber_table;
2803 for (i = 0; i < linenumber_count; i++)
2805 int pc = GET_u2 (linenumber_pointer);
2806 linenumber_pointer += 4;
2808 warning ("invalid PC in line number table");
2811 if ((instruction_bits[pc] & BCODE_HAS_LINENUMBER) != 0)
2812 instruction_bits[pc] |= BCODE_HAS_MULTI_LINENUMBERS;
2813 instruction_bits[pc] |= BCODE_HAS_LINENUMBER;
2817 if (! verify_jvm_instructions (jcf, byte_ops, length))
2820 /* Translate bytecodes to rtl instructions. */
2821 linenumber_pointer = linenumber_table;
2822 for (PC = 0; PC < length;)
2824 if ((instruction_bits [PC] & BCODE_TARGET) != 0 || PC == 0)
2826 tree label = lookup_label (PC);
2827 flush_quick_stack ();
2828 if ((instruction_bits [PC] & BCODE_TARGET) != 0)
2829 expand_label (label);
2830 if (LABEL_VERIFIED (label) || PC == 0)
2831 load_type_state (label);
2834 if (! (instruction_bits [PC] & BCODE_VERIFIED))
2836 if (dead_code_index == -1)
2838 /* This is the start of a region of unreachable bytecodes.
2839 They still need to be processed in order for EH ranges
2840 to get handled correctly. However, we can simply
2841 replace these bytecodes with nops. */
2842 dead_code_index = PC;
2845 /* Turn this bytecode into a nop. */
2850 if (dead_code_index != -1)
2852 /* We've just reached the end of a region of dead code. */
2854 warning ("unreachable bytecode from %d to before %d",
2855 dead_code_index, PC);
2856 dead_code_index = -1;
2860 /* Handle possible line number entry for this PC.
2862 This code handles out-of-order and multiple linenumbers per PC,
2863 but is optimized for the case of line numbers increasing
2864 monotonically with PC. */
2865 if ((instruction_bits[PC] & BCODE_HAS_LINENUMBER) != 0)
2867 if ((instruction_bits[PC] & BCODE_HAS_MULTI_LINENUMBERS) != 0
2868 || GET_u2 (linenumber_pointer) != PC)
2869 linenumber_pointer = linenumber_table;
2870 while (linenumber_pointer < linenumber_table + linenumber_count * 4)
2872 int pc = GET_u2 (linenumber_pointer);
2873 linenumber_pointer += 4;
2876 input_line = GET_u2 (linenumber_pointer - 2);
2877 emit_line_note (input_location);
2878 if (!(instruction_bits[PC] & BCODE_HAS_MULTI_LINENUMBERS))
2883 maybe_pushlevels (PC);
2884 PC = process_jvm_instruction (PC, byte_ops, length);
2885 maybe_poplevels (PC);
2888 if (dead_code_index != -1)
2890 /* We've just reached the end of a region of dead code. */
2892 warning ("unreachable bytecode from %d to the end of the method",
2898 java_push_constant_from_pool (JCF *jcf, int index)
2901 if (JPOOL_TAG (jcf, index) == CONSTANT_String)
2904 name = get_name_constant (jcf, JPOOL_USHORT1 (jcf, index));
2905 index = alloc_name_constant (CONSTANT_String, name);
2906 c = build_ref_from_constant_pool (index);
2907 TREE_TYPE (c) = promote_type (string_type_node);
2910 c = get_constant (jcf, index);
2915 process_jvm_instruction (int PC, const unsigned char* byte_ops,
2916 long length ATTRIBUTE_UNUSED)
2918 const char *opname; /* Temporary ??? */
2919 int oldpc = PC; /* PC at instruction start. */
2921 /* If the instruction is at the beginning of a exception handler,
2922 replace the top of the stack with the thrown object reference */
2923 if (instruction_bits [PC] & BCODE_EXCEPTION_TARGET)
2925 tree type = pop_type (ptr_type_node);
2926 push_value (build (JAVA_EXC_OBJ_EXPR, type));
2929 switch (byte_ops[PC++])
2931 #define JAVAOP(OPNAME, OPCODE, OPKIND, OPERAND_TYPE, OPERAND_VALUE) \
2934 OPKIND(OPERAND_TYPE, OPERAND_VALUE); \
2937 #define RET(OPERAND_TYPE, OPERAND_VALUE) \
2939 int saw_index = 0; \
2940 int index = OPERAND_VALUE; \
2941 build_java_ret (find_local_variable (index, ptr_type_node, oldpc)); \
2944 #define JSR(OPERAND_TYPE, OPERAND_VALUE) \
2946 /* OPERAND_VALUE may have side-effects on PC */ \
2947 int opvalue = OPERAND_VALUE; \
2948 build_java_jsr (oldpc + opvalue, PC); \
2951 /* Push a constant onto the stack. */
2952 #define PUSHC(OPERAND_TYPE, OPERAND_VALUE) \
2953 { int saw_index = 0; int ival = (OPERAND_VALUE); \
2954 if (saw_index) java_push_constant_from_pool (current_jcf, ival); \
2955 else expand_java_pushc (ival, OPERAND_TYPE##_type_node); }
2957 /* internal macro added for use by the WIDE case */
2958 #define LOAD_INTERNAL(OPTYPE, OPVALUE) \
2959 expand_load_internal (OPVALUE, type_map[OPVALUE], oldpc);
2961 /* Push local variable onto the opcode stack. */
2962 #define LOAD(OPERAND_TYPE, OPERAND_VALUE) \
2964 /* have to do this since OPERAND_VALUE may have side-effects */ \
2965 int opvalue = OPERAND_VALUE; \
2966 LOAD_INTERNAL(OPERAND_TYPE##_type_node, opvalue); \
2969 #define RETURN(OPERAND_TYPE, OPERAND_VALUE) \
2970 expand_java_return (OPERAND_TYPE##_type_node)
2972 #define REM_EXPR TRUNC_MOD_EXPR
2973 #define BINOP(OPERAND_TYPE, OPERAND_VALUE) \
2974 expand_java_binop (OPERAND_TYPE##_type_node, OPERAND_VALUE##_EXPR)
2976 #define FIELD(IS_STATIC, IS_PUT) \
2977 expand_java_field_op (IS_STATIC, IS_PUT, IMMEDIATE_u2)
2979 #define TEST(OPERAND_TYPE, CONDITION) \
2980 expand_test (CONDITION##_EXPR, OPERAND_TYPE##_type_node, oldpc+IMMEDIATE_s2)
2982 #define COND(OPERAND_TYPE, CONDITION) \
2983 expand_cond (CONDITION##_EXPR, OPERAND_TYPE##_type_node, oldpc+IMMEDIATE_s2)
2985 #define BRANCH(OPERAND_TYPE, OPERAND_VALUE) \
2986 BRANCH_##OPERAND_TYPE (OPERAND_VALUE)
2988 #define BRANCH_GOTO(OPERAND_VALUE) \
2989 expand_java_goto (oldpc + OPERAND_VALUE)
2991 #define BRANCH_CALL(OPERAND_VALUE) \
2992 expand_java_call (oldpc + OPERAND_VALUE, oldpc)
2995 #define BRANCH_RETURN(OPERAND_VALUE) \
2997 tree type = OPERAND_TYPE##_type_node; \
2998 tree value = find_local_variable (OPERAND_VALUE, type, oldpc); \
2999 expand_java_ret (value); \
3003 #define NOT_IMPL(OPERAND_TYPE, OPERAND_VALUE) \
3004 fprintf (stderr, "%3d: %s ", oldpc, opname); \
3005 fprintf (stderr, "(not implemented)\n")
3006 #define NOT_IMPL1(OPERAND_VALUE) \
3007 fprintf (stderr, "%3d: %s ", oldpc, opname); \
3008 fprintf (stderr, "(not implemented)\n")
3010 #define BRANCH_RETURN(OPERAND_VALUE) NOT_IMPL1(OPERAND_VALUE)
3012 #define STACK(SUBOP, COUNT) STACK_##SUBOP (COUNT)
3014 #define STACK_POP(COUNT) java_stack_pop (COUNT)
3016 #define STACK_SWAP(COUNT) java_stack_swap()
3018 #define STACK_DUP(COUNT) java_stack_dup (COUNT, 0)
3019 #define STACK_DUPx1(COUNT) java_stack_dup (COUNT, 1)
3020 #define STACK_DUPx2(COUNT) java_stack_dup (COUNT, 2)
3022 #define SWITCH(OPERAND_TYPE, TABLE_OR_LOOKUP) \
3023 PC = (PC + 3) / 4 * 4; TABLE_OR_LOOKUP##_SWITCH
3025 #define LOOKUP_SWITCH \
3026 { jint default_offset = IMMEDIATE_s4; jint npairs = IMMEDIATE_s4; \
3027 tree selector = pop_value (INT_type_node); \
3028 tree duplicate, label; \
3029 tree type = TREE_TYPE (selector); \
3030 flush_quick_stack (); \
3031 expand_start_case (0, selector, type, "switch statement");\
3032 while (--npairs >= 0) \
3034 jint match = IMMEDIATE_s4; jint offset = IMMEDIATE_s4; \
3035 tree value = build_int_2 (match, match < 0 ? -1 : 0); \
3036 TREE_TYPE (value) = type; \
3037 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); \
3038 pushcase (value, convert, label, &duplicate); \
3039 expand_java_goto (oldpc + offset); \
3041 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); \
3042 pushcase (NULL_TREE, 0, label, &duplicate); \
3043 expand_java_goto (oldpc + default_offset); \
3044 expand_end_case (selector); \
3047 #define TABLE_SWITCH \
3048 { jint default_offset = IMMEDIATE_s4; \
3049 jint low = IMMEDIATE_s4; jint high = IMMEDIATE_s4; \
3050 tree selector = pop_value (INT_type_node); \
3051 tree duplicate, label; \
3052 tree type = TREE_TYPE (selector); \
3053 flush_quick_stack (); \
3054 expand_start_case (0, selector, type, "switch statement");\
3055 for (; low <= high; low++) \
3057 jint offset = IMMEDIATE_s4; \
3058 tree value = build_int_2 (low, low < 0 ? -1 : 0); \
3059 TREE_TYPE (value) = type; \
3060 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); \
3061 pushcase (value, convert, label, &duplicate); \
3062 expand_java_goto (oldpc + offset); \
3064 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); \
3065 pushcase (NULL_TREE, 0, label, &duplicate); \
3066 expand_java_goto (oldpc + default_offset); \
3067 expand_end_case (selector); \
3070 #define INVOKE(MAYBE_STATIC, IS_INTERFACE) \
3071 { int opcode = byte_ops[PC-1]; \
3072 int method_ref_index = IMMEDIATE_u2; \
3074 if (IS_INTERFACE) { nargs = IMMEDIATE_u1; (void) IMMEDIATE_u1; } \
3076 expand_invoke (opcode, method_ref_index, nargs); \
3079 /* Handle new, checkcast, instanceof */
3080 #define OBJECT(TYPE, OP) \
3081 expand_java_##OP (get_class_constant (current_jcf, IMMEDIATE_u2))
3083 #define ARRAY(OPERAND_TYPE, SUBOP) ARRAY_##SUBOP(OPERAND_TYPE)
3085 #define ARRAY_LOAD(OPERAND_TYPE) \
3087 expand_java_arrayload( OPERAND_TYPE##_type_node ); \
3090 #define ARRAY_STORE(OPERAND_TYPE) \
3092 expand_java_arraystore( OPERAND_TYPE##_type_node ); \
3095 #define ARRAY_LENGTH(OPERAND_TYPE) expand_java_array_length();
3096 #define ARRAY_NEW(OPERAND_TYPE) ARRAY_NEW_##OPERAND_TYPE()
3097 #define ARRAY_NEW_PTR() \
3098 push_value (build_anewarray (get_class_constant (current_jcf, \
3100 pop_value (int_type_node)));
3101 #define ARRAY_NEW_NUM() \
3103 int atype = IMMEDIATE_u1; \
3104 push_value (build_newarray (atype, pop_value (int_type_node)));\
3106 #define ARRAY_NEW_MULTI() \
3108 tree class = get_class_constant (current_jcf, IMMEDIATE_u2 ); \
3109 int ndims = IMMEDIATE_u1; \
3110 expand_java_multianewarray( class, ndims ); \
3113 #define UNOP(OPERAND_TYPE, OPERAND_VALUE) \
3114 push_value (fold (build1 (NEGATE_EXPR, OPERAND_TYPE##_type_node, \
3115 pop_value (OPERAND_TYPE##_type_node))));
3117 #define CONVERT2(FROM_TYPE, TO_TYPE) \
3119 push_value (build1 (NOP_EXPR, int_type_node, \
3120 (convert (TO_TYPE##_type_node, \
3121 pop_value (FROM_TYPE##_type_node))))); \
3124 #define CONVERT(FROM_TYPE, TO_TYPE) \
3126 push_value (convert (TO_TYPE##_type_node, \
3127 pop_value (FROM_TYPE##_type_node))); \
3130 /* internal macro added for use by the WIDE case
3131 Added TREE_TYPE (decl) assignment, apbianco */
3132 #define STORE_INTERNAL(OPTYPE, OPVALUE) \
3135 int var = OPVALUE; \
3136 tree type = OPTYPE; \
3137 value = pop_value (type); \
3138 type = TREE_TYPE (value); \
3139 decl = find_local_variable (var, type, oldpc); \
3140 set_local_type (var, type ); \
3141 expand_assignment (decl, value, 0); \
3144 #define STORE(OPERAND_TYPE, OPERAND_VALUE) \
3146 /* have to do this since OPERAND_VALUE may have side-effects */ \
3147 int opvalue = OPERAND_VALUE; \
3148 STORE_INTERNAL(OPERAND_TYPE##_type_node, opvalue); \
3151 #define SPECIAL(OPERAND_TYPE, INSTRUCTION) \
3152 SPECIAL_##INSTRUCTION(OPERAND_TYPE)
3154 #define SPECIAL_ENTER(IGNORED) MONITOR_OPERATION (soft_monitorenter_node)
3155 #define SPECIAL_EXIT(IGNORED) MONITOR_OPERATION (soft_monitorexit_node)
3157 #define MONITOR_OPERATION(call) \
3159 tree o = pop_value (ptr_type_node); \
3161 flush_quick_stack (); \
3162 c = build_java_monitor (call, o); \
3163 TREE_SIDE_EFFECTS (c) = 1; \
3164 expand_expr_stmt (c); \
3167 #define SPECIAL_IINC(IGNORED) \
3169 unsigned int local_var_index = IMMEDIATE_u1; \
3170 int ival = IMMEDIATE_s1; \
3171 expand_iinc(local_var_index, ival, oldpc); \
3174 #define SPECIAL_WIDE(IGNORED) \
3176 int modified_opcode = IMMEDIATE_u1; \
3177 unsigned int local_var_index = IMMEDIATE_u2; \
3178 switch (modified_opcode) \
3182 int ival = IMMEDIATE_s2; \
3183 expand_iinc (local_var_index, ival, oldpc); \
3186 case OPCODE_iload: \
3187 case OPCODE_lload: \
3188 case OPCODE_fload: \
3189 case OPCODE_dload: \
3190 case OPCODE_aload: \
3192 /* duplicate code from LOAD macro */ \
3193 LOAD_INTERNAL(operand_type[modified_opcode], local_var_index); \
3196 case OPCODE_istore: \
3197 case OPCODE_lstore: \
3198 case OPCODE_fstore: \
3199 case OPCODE_dstore: \
3200 case OPCODE_astore: \
3202 STORE_INTERNAL(operand_type[modified_opcode], local_var_index); \
3206 error ("unrecogized wide sub-instruction"); \
3210 #define SPECIAL_THROW(IGNORED) \
3211 build_java_athrow (pop_value (throwable_type_node))
3213 #define SPECIAL_BREAK NOT_IMPL1
3214 #define IMPL NOT_IMPL
3216 #include "javaop.def"
3219 fprintf (stderr, "%3d: unknown(%3d)\n", oldpc, byte_ops[PC]);
3224 /* Return the opcode at PC in the code section pointed to by
3227 static unsigned char
3228 peek_opcode_at_pc (JCF *jcf, int code_offset, int pc)
3230 unsigned char opcode;
3231 long absolute_offset = (long)JCF_TELL (jcf);
3233 JCF_SEEK (jcf, code_offset);
3234 opcode = jcf->read_ptr [pc];
3235 JCF_SEEK (jcf, absolute_offset);
3239 /* Some bytecode compilers are emitting accurate LocalVariableTable
3240 attributes. Here's an example:
3245 Attribute "LocalVariableTable"
3246 slot #<n>: ... (PC: PC+1 length: L)
3248 This is accurate because the local in slot <n> really exists after
3249 the opcode at PC is executed, hence from PC+1 to PC+1+L.
3251 This procedure recognizes this situation and extends the live range
3252 of the local in SLOT to START_PC-1 or START_PC-2 (depending on the
3253 length of the store instruction.)
3255 This function is used by `give_name_to_locals' so that a local's
3256 DECL features a DECL_LOCAL_START_PC such that the first related
3257 store operation will use DECL as a destination, not a unrelated
3258 temporary created for the occasion.
3260 This function uses a global (instruction_bits) `note_instructions' should
3261 have allocated and filled properly. */
3264 maybe_adjust_start_pc (struct JCF *jcf, int code_offset,
3265 int start_pc, int slot)
3267 int first, index, opcode;
3276 /* Find last previous instruction and remember it */
3277 for (pc = start_pc-1; pc; pc--)
3278 if (instruction_bits [pc] & BCODE_INSTRUCTION_START)
3282 /* Retrieve the instruction, handle `wide'. */
3283 opcode = (int) peek_opcode_at_pc (jcf, code_offset, pc++);
3284 if (opcode == OPCODE_wide)
3287 opcode = (int) peek_opcode_at_pc (jcf, code_offset, pc++);
3292 case OPCODE_astore_0:
3293 case OPCODE_astore_1:
3294 case OPCODE_astore_2:
3295 case OPCODE_astore_3:
3296 first = OPCODE_astore_0;
3299 case OPCODE_istore_0:
3300 case OPCODE_istore_1:
3301 case OPCODE_istore_2:
3302 case OPCODE_istore_3:
3303 first = OPCODE_istore_0;
3306 case OPCODE_lstore_0:
3307 case OPCODE_lstore_1:
3308 case OPCODE_lstore_2:
3309 case OPCODE_lstore_3:
3310 first = OPCODE_lstore_0;
3313 case OPCODE_fstore_0:
3314 case OPCODE_fstore_1:
3315 case OPCODE_fstore_2:
3316 case OPCODE_fstore_3:
3317 first = OPCODE_fstore_0;
3320 case OPCODE_dstore_0:
3321 case OPCODE_dstore_1:
3322 case OPCODE_dstore_2:
3323 case OPCODE_dstore_3:
3324 first = OPCODE_dstore_0;
3332 index = peek_opcode_at_pc (jcf, code_offset, pc);
3335 int other = peek_opcode_at_pc (jcf, code_offset, ++pc);
3336 index = (other << 8) + index;
3341 /* Now we decide: first >0 means we have a <t>store_<n>, index >0
3342 means we have a <t>store. */
3343 if ((first > 0 && opcode - first == slot) || (index > 0 && index == slot))
3349 /* Force the (direct) sub-operands of NODE to be evaluated in left-to-right
3350 order, as specified by Java Language Specification.
3352 The problem is that while expand_expr will evaluate its sub-operands in
3353 left-to-right order, for variables it will just return an rtx (i.e.
3354 an lvalue) for the variable (rather than an rvalue). So it is possible
3355 that a later sub-operand will change the register, and when the
3356 actual operation is done, it will use the new value, when it should
3357 have used the original value.
3359 We fix this by using save_expr. This forces the sub-operand to be
3360 copied into a fresh virtual register,
3362 For method invocation, we modify the arguments so that a
3363 left-to-right order evaluation is performed. Saved expressions
3364 will, in CALL_EXPR order, be reused when the call will be expanded.
3368 force_evaluation_order (tree node)
3370 if (flag_syntax_only)
3372 if (TREE_CODE (node) == CALL_EXPR
3373 || TREE_CODE (node) == NEW_CLASS_EXPR
3374 || (TREE_CODE (node) == COMPOUND_EXPR
3375 && TREE_CODE (TREE_OPERAND (node, 0)) == CALL_EXPR
3376 && TREE_CODE (TREE_OPERAND (node, 1)) == SAVE_EXPR))
3380 if (!TREE_OPERAND (node, 1))
3385 /* Position arg properly, account for wrapped around ctors. */
3386 if (TREE_CODE (node) == COMPOUND_EXPR)
3387 arg = TREE_OPERAND (node, 0);
3389 arg = TREE_OPERAND (arg, 1);
3391 /* Not having a list of argument here is an error. */
3392 if (TREE_CODE (arg) != TREE_LIST)
3395 /* This reverses the evaluation order. This is a desired effect. */
3396 for (cmp = NULL_TREE; arg; arg = TREE_CHAIN (arg))
3398 tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg)));
3399 cmp = (cmp == NULL_TREE ? saved :
3400 build (COMPOUND_EXPR, void_type_node, cmp, saved));
3401 TREE_VALUE (arg) = saved;
3404 if (cmp && TREE_CODE (cmp) == COMPOUND_EXPR)
3405 TREE_SIDE_EFFECTS (cmp) = 1;
3409 cmp = save_expr (build (COMPOUND_EXPR, TREE_TYPE (node), cmp, node));
3410 CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);
3411 TREE_SIDE_EFFECTS (cmp) = 1;
3418 /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE of a
3419 method in order to emit initialization code for each test flag. */
3422 emit_init_test_initialization (void **entry, void *x ATTRIBUTE_UNUSED)
3424 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
3425 tree klass = build_class_ref (ite->key);
3428 /* If the DECL_INITIAL of the test flag is set to true, it
3429 means that the class is already initialized the time it
3431 if (DECL_INITIAL (ite->value) == boolean_true_node)
3432 rhs = boolean_true_node;
3433 /* Otherwise, we initialize the class init check variable by looking
3434 at the `state' field of the class to see if it is already
3435 initialized. This makes things a bit faster if the class is
3436 already initialized, which should be the common case. */
3438 rhs = build (GE_EXPR, boolean_type_node,
3439 build (COMPONENT_REF, byte_type_node,
3440 build1 (INDIRECT_REF, class_type_node, klass),
3441 lookup_field (&class_type_node,
3442 get_identifier ("state"))),
3443 build_int_2 (JV_STATE_DONE, 0));
3445 expand_expr_stmt (build (MODIFY_EXPR, boolean_type_node,
3450 #include "gt-java-expr.h"