Commit 279e32c9 by Tom Tromey Committed by Tom Tromey

typeck.c (find_method_in_interfaces): Update.

	* typeck.c (find_method_in_interfaces): Update.
	* jcf-parse.c (load_class): Update.
	* java-gimplify.c (java_gimplify_component_ref): Removed.
	(java_gimplify_modify_expr): Update.  Removed pre_p and post_p
	arguments.
	(java_gimplify_expr): Update.
	* decl.c (java_init_decl_processing): Update.
	* class.c (set_constant_value): Update.
	(make_class_data): Update.
	(finish_class): Update.
	(build_static_field_ref): Update.
	(is_compiled_class): Update.
	(maybe_layout_super_class): Update.
	(layout_class): Update.
	(layout_class_method): Update.
	* java-tree.h (CAN_COMPLETE_NORMALLY): Removed.
	(lang_decl_var) <am, final_iud, cif>: Removed fields.
	(lang_decl_func) <init_calls_this>: Removed field.
	(lang_type) <dot_class, verify_method>: Removed fields.
	(FIELD_NESTED_ACCESS): Removed.
	(FIELD_NESTED_ACCESS_P): Removed.
	(DECL_FIELD_FINAL_IUD): Removed.
	(DECL_LOCAL_FINAL_IUD): Removed
	(LOCAL_FINAL_P): Removed.
	(FINAL_VARIABLE_P): Removed.
	(CLASS_FINAL_VARIABLE_P): Removed.
	(DECL_BIT_INDEX): Removed.
	(DECL_INIT_CALLS_THIS): Removed.
	(FIELD_LOCAL_ALIAS): Removed.
	(FIELD_LOCAL_ALIAS_USED): Removed.
	(FIELD_THISN): Removed.
	(DECL_FUNCTION_INIT_TEST_CLASS): Removed.
	(LOCAL_CLASS_INITIALIZATION_FLAG): Removed.
	(LOCAL_CLASS_INITIALIZATION_FLAG_P): Removed.
	(TYPE_DOT_CLASS): Removed.
	(TYPE_VERIFY_METHOD): Removed.
	(ID_CLASSDOLLAR_P): Removed.
	(enum java_tree_index) <JTI_CLASSDOLLAR_IDENTIFIER_NODE>:
	Removed.
	(classdollar_identifier_node): Removed.
	(TYPE_UNKNOWN): Removed.
	(CLASS_FROM_SOURCE_P): Removed.
	* expr.c (build_jni_stub): Update.
	(force_evaluation_order): Update.
	(build_java_empty_stmt): Update.
	(build_class_init): Update.
	(java_stack_swap): Update.
	(build_jni_stub): Update.

From-SVN: r127602
parent 44fd0e80
2007-08-17 Tom Tromey <tromey@redhat.com>
* typeck.c (find_method_in_interfaces): Update.
* jcf-parse.c (load_class): Update.
* java-gimplify.c (java_gimplify_component_ref): Removed.
(java_gimplify_modify_expr): Update. Removed pre_p and post_p
arguments.
(java_gimplify_expr): Update.
* decl.c (java_init_decl_processing): Update.
* class.c (set_constant_value): Update.
(make_class_data): Update.
(finish_class): Update.
(build_static_field_ref): Update.
(is_compiled_class): Update.
(maybe_layout_super_class): Update.
(layout_class): Update.
(layout_class_method): Update.
* java-tree.h (CAN_COMPLETE_NORMALLY): Removed.
(lang_decl_var) <am, final_iud, cif>: Removed fields.
(lang_decl_func) <init_calls_this>: Removed field.
(lang_type) <dot_class, verify_method>: Removed fields.
(FIELD_NESTED_ACCESS): Removed.
(FIELD_NESTED_ACCESS_P): Removed.
(DECL_FIELD_FINAL_IUD): Removed.
(DECL_LOCAL_FINAL_IUD): Removed
(LOCAL_FINAL_P): Removed.
(FINAL_VARIABLE_P): Removed.
(CLASS_FINAL_VARIABLE_P): Removed.
(DECL_BIT_INDEX): Removed.
(DECL_INIT_CALLS_THIS): Removed.
(FIELD_LOCAL_ALIAS): Removed.
(FIELD_LOCAL_ALIAS_USED): Removed.
(FIELD_THISN): Removed.
(DECL_FUNCTION_INIT_TEST_CLASS): Removed.
(LOCAL_CLASS_INITIALIZATION_FLAG): Removed.
(LOCAL_CLASS_INITIALIZATION_FLAG_P): Removed.
(TYPE_DOT_CLASS): Removed.
(TYPE_VERIFY_METHOD): Removed.
(ID_CLASSDOLLAR_P): Removed.
(enum java_tree_index) <JTI_CLASSDOLLAR_IDENTIFIER_NODE>:
Removed.
(classdollar_identifier_node): Removed.
(TYPE_UNKNOWN): Removed.
(CLASS_FROM_SOURCE_P): Removed.
* expr.c (build_jni_stub): Update.
(force_evaluation_order): Update.
(build_java_empty_stmt): Update.
(build_class_init): Update.
(java_stack_swap): Update.
(build_jni_stub): Update.
2007-08-17 Tom Tromey <tromey@redhat.com>
* java-tree.h (LABEL_TYPE_STATE): Removed.
(load_type_state): Removed.
(LABEL_PC): Removed.
......
......@@ -851,8 +851,6 @@ set_constant_value (tree field, tree constant)
&& TREE_TYPE (field) == string_ptr_type_node))
error ("ConstantValue attribute of field '%s' has wrong type",
IDENTIFIER_POINTER (DECL_NAME (field)));
if (FIELD_FINAL (field))
DECL_FIELD_FINAL_IUD (field) = 1;
}
}
......@@ -1163,13 +1161,12 @@ build_static_field_ref (tree fdecl)
{
tree fclass = DECL_CONTEXT (fdecl);
int is_compiled = is_compiled_class (fclass);
int from_class = ! CLASS_FROM_SOURCE_P (current_class);
/* Allow static final fields to fold to a constant. When using
-findirect-dispatch, we simply never do this folding if compiling
from .class; in the .class file constants will be referred to via
the constant pool. */
if ((!flag_indirect_dispatch || !from_class)
if (!flag_indirect_dispatch
&& (is_compiled
|| (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
&& (JSTRING_TYPE_P (TREE_TYPE (fdecl))
......@@ -1853,8 +1850,7 @@ make_class_data (tree type)
|| DECL_CLINIT_P (method)
|| DECL_NAME (type_decl) == id_class
|| DECL_NAME (method) == id_main
|| (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
|| TYPE_DOT_CLASS (type) == method)
|| (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
{
init = make_method_value (method);
method_count++;
......@@ -2173,17 +2169,6 @@ make_class_data (tree type)
void
finish_class (void)
{
if (TYPE_VERIFY_METHOD (output_class))
{
tree verify_method = TYPE_VERIFY_METHOD (output_class);
DECL_SAVED_TREE (verify_method)
= add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
build1 (RETURN_EXPR, void_type_node, NULL));
java_genericize (verify_method);
cgraph_finalize_function (verify_method, false);
TYPE_ASSERTIONS (current_class) = NULL;
}
java_expand_catch_classes (current_class);
current_function_decl = NULL_TREE;
......@@ -2228,9 +2213,7 @@ is_compiled_class (tree class)
{
if (!CLASS_LOADED_P (class))
{
if (CLASS_FROM_SOURCE_P (class))
safe_layout_class (class);
else if (class != current_class)
if (class != current_class)
load_class (class, 1);
}
return 1;
......@@ -2327,8 +2310,6 @@ maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
return NULL_TREE;
else if (TREE_CODE (super_class) == RECORD_TYPE)
{
if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
safe_layout_class (super_class);
if (!CLASS_LOADED_P (super_class))
load_class (super_class, 1);
}
......@@ -2366,6 +2347,7 @@ safe_layout_class (tree class)
void
layout_class (tree this_class)
{
int i;
tree super_class = CLASSTYPE_SUPER (this_class);
class_list = tree_cons (this_class, NULL_TREE, class_list);
......@@ -2416,28 +2398,22 @@ layout_class (tree this_class)
layout_type (this_class);
/* Also recursively load/layout any superinterfaces, but only if
class was loaded from bytecode. The source parser will take care
of this itself. */
if (!CLASS_FROM_SOURCE_P (this_class))
/* Also recursively load/layout any superinterfaces. */
if (TYPE_BINFO (this_class))
{
int i;
if (TYPE_BINFO (this_class))
for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
{
for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
tree super_interface = BINFO_TYPE (binfo);
tree maybe_super_interface
= maybe_layout_super_class (super_interface, NULL_TREE);
if (maybe_super_interface == NULL
|| TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
{
tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
tree super_interface = BINFO_TYPE (binfo);
tree maybe_super_interface
= maybe_layout_super_class (super_interface, NULL_TREE);
if (maybe_super_interface == NULL
|| TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
{
TYPE_SIZE (this_class) = error_mark_node;
CLASS_BEING_LAIDOUT (this_class) = 0;
class_list = TREE_CHAIN (class_list);
return;
}
TYPE_SIZE (this_class) = error_mark_node;
CLASS_BEING_LAIDOUT (this_class) = 0;
class_list = TREE_CHAIN (class_list);
return;
}
}
}
......@@ -2632,7 +2608,6 @@ layout_class_method (tree this_class, tree super_class,
set_method_index (method_decl, method_index);
if (method_index == NULL_TREE
&& ! flag_indirect_dispatch
&& !CLASS_FROM_SOURCE_P (this_class)
&& ! DECL_ARTIFICIAL (super_method))
error ("non-static method %q+D overrides static method",
method_decl);
......
......@@ -737,7 +737,6 @@ java_init_decl_processing (void)
void_signature_node = get_identifier ("()V");
finalize_identifier_node = get_identifier ("finalize");
this_identifier_node = get_identifier ("this");
classdollar_identifier_node = get_identifier ("class$");
java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
java_io_serializable_identifier_node =
......
......@@ -638,9 +638,8 @@ java_stack_swap (void)
tree decl1, decl2;
if (stack_pointer < 2
|| (type1 = stack_type_map[stack_pointer - 1]) == TYPE_UNKNOWN
|| (type2 = stack_type_map[stack_pointer - 2]) == TYPE_UNKNOWN
|| type1 == TYPE_SECOND || type2 == TYPE_SECOND
|| (type1 = stack_type_map[stack_pointer - 1]) == TYPE_SECOND
|| (type2 = stack_type_map[stack_pointer - 2]) == TYPE_SECOND
|| TYPE_IS_WIDE (type1) || TYPE_IS_WIDE (type2))
/* Bad stack swap. */
abort ();
......@@ -1998,13 +1997,7 @@ build_class_init (tree clas, tree expr)
decl = build_decl (VAR_DECL, NULL_TREE,
boolean_type_node);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1;
DECL_CONTEXT (decl) = current_function_decl;
DECL_FUNCTION_INIT_TEST_CLASS (decl) = clas;
/* Tell the check-init code to ignore this decl when not
optimizing class initialization. */
if (!STATIC_CLASS_INIT_OPT_P ())
DECL_BIT_INDEX (decl) = -1;
DECL_INITIAL (decl) = boolean_false_node;
/* Don't emit any symbolic debugging info for this decl. */
DECL_IGNORED_P (decl) = 1;
......@@ -2621,7 +2614,6 @@ build_jni_stub (tree method)
int args_size = 0;
tree klass = DECL_CONTEXT (method);
int from_class = ! CLASS_FROM_SOURCE_P (klass);
klass = build_class_ref (klass);
gcc_assert (METHOD_NATIVE (method) && flag_jni);
......@@ -2651,25 +2643,16 @@ build_jni_stub (tree method)
chainon (env_var, meth_var);
build_result_decl (method);
/* One strange way that the front ends are different is that they
store arguments differently. */
if (from_class)
method_args = DECL_ARGUMENTS (method);
else
method_args = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (method));
method_args = DECL_ARGUMENTS (method);
block = build_block (env_var, NULL_TREE, method_args, NULL_TREE);
TREE_SIDE_EFFECTS (block) = 1;
/* When compiling from source we don't set the type of the block,
because that will prevent patch_return from ever being run. */
if (from_class)
TREE_TYPE (block) = TREE_TYPE (TREE_TYPE (method));
TREE_TYPE (block) = TREE_TYPE (TREE_TYPE (method));
/* Compute the local `env' by calling _Jv_GetJNIEnvNewFrame. */
body = build2 (MODIFY_EXPR, ptr_type_node, env_var,
build_call_nary (ptr_type_node,
build_address_of (soft_getjnienvnewframe_node),
1, klass));
CAN_COMPLETE_NORMALLY (body) = 1;
/* All the arguments to this method become arguments to the
underlying JNI function. If we had to wrap object arguments in a
......@@ -2756,7 +2739,6 @@ build_jni_stub (tree method)
}
TREE_SIDE_EFFECTS (call) = 1;
CAN_COMPLETE_NORMALLY (call) = 1;
body = build2 (COMPOUND_EXPR, void_type_node, body, call);
TREE_SIDE_EFFECTS (body) = 1;
......@@ -2766,7 +2748,6 @@ build_jni_stub (tree method)
build_address_of (soft_jnipopsystemframe_node),
1, env_var);
TREE_SIDE_EFFECTS (call) = 1;
CAN_COMPLETE_NORMALLY (call) = 1;
body = build2 (COMPOUND_EXPR, void_type_node, body, call);
TREE_SIDE_EFFECTS (body) = 1;
......@@ -3750,7 +3731,6 @@ force_evaluation_order (tree node)
cmp = build2 (COMPOUND_EXPR, TREE_TYPE (node), cmp, node);
if (TREE_TYPE (cmp) != void_type_node)
cmp = save_expr (cmp);
CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);
TREE_SIDE_EFFECTS (cmp) = 1;
node = cmp;
}
......@@ -3764,7 +3744,6 @@ tree
build_java_empty_stmt (void)
{
tree t = build_empty_stmt ();
CAN_COMPLETE_NORMALLY (t) = 1;
return t;
}
......
......@@ -32,8 +32,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "toplev.h"
static tree java_gimplify_block (tree);
static enum gimplify_status java_gimplify_modify_expr (tree*, tree*, tree *);
static enum gimplify_status java_gimplify_component_ref (tree*, tree*, tree *);
static enum gimplify_status java_gimplify_modify_expr (tree *);
static enum gimplify_status java_gimplify_self_mod_expr (tree*, tree*, tree *);
static void dump_java_tree (enum tree_dump_index, tree);
......@@ -73,7 +72,7 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
semantics should only be generated by the front-end, and never
by anything after gimplification. */
case MODIFY_EXPR:
return java_gimplify_modify_expr (expr_p, pre_p, post_p);
return java_gimplify_modify_expr (expr_p);
case SAVE_EXPR:
/* Note that we can see <save_expr NULL> if the save_expr was
......@@ -98,9 +97,6 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
case COMPARE_G_EXPR:
gcc_unreachable ();
case COMPONENT_REF:
return java_gimplify_component_ref (expr_p, pre_p, post_p);
default:
/* Java insists on strict left-to-right evaluation of expressions.
A problem may arise if a variable used in the LHS of a binary
......@@ -129,96 +125,13 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
}
static enum gimplify_status
java_gimplify_component_ref (tree *expr_p, tree *pre_p, tree *post_p)
{
if (CLASS_FROM_SOURCE_P (output_class)
&& TREE_THIS_VOLATILE (TREE_OPERAND (*expr_p, 1))
&& ! TREE_THIS_VOLATILE (*expr_p))
{
enum gimplify_status stat;
tree sync_expr;
/* Special handling for volatile fields.
A load has "acquire" semantics, implying that you can't move up
later operations. A store has "release" semantics meaning that
earlier operations cannot be delayed past it.
This logic only handles loads: stores are handled in
java_gimplify_modify_expr().
We gimplify this COMPONENT_REF, put the result in a tmp_var, and then
return a COMPOUND_EXPR of the form {__sync_synchronize(); tmp_var}.
This forces __sync_synchronize() to be placed immediately after
loading from the volatile field.
*/
TREE_THIS_VOLATILE (*expr_p) = 1;
*expr_p = java_modify_addr_for_volatile (*expr_p);
stat = gimplify_expr (expr_p, pre_p, post_p,
is_gimple_formal_tmp_var, fb_rvalue);
if (stat == GS_ERROR)
return stat;
sync_expr = build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0);
TREE_SIDE_EFFECTS (sync_expr) = 1;
*expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
sync_expr, *expr_p);
TREE_SIDE_EFFECTS (*expr_p) = 1;
}
return GS_UNHANDLED;
}
static enum gimplify_status
java_gimplify_modify_expr (tree *modify_expr_p, tree *pre_p, tree *post_p)
java_gimplify_modify_expr (tree *modify_expr_p)
{
tree modify_expr = *modify_expr_p;
tree lhs = TREE_OPERAND (modify_expr, 0);
tree rhs = TREE_OPERAND (modify_expr, 1);
tree lhs_type = TREE_TYPE (lhs);
if (CLASS_FROM_SOURCE_P (output_class)
&& TREE_CODE (lhs) == COMPONENT_REF
&& TREE_THIS_VOLATILE (TREE_OPERAND (lhs, 1)))
{
/* Special handling for volatile fields.
A load has "acquire" semantics, implying that you can't move up
later operations. A store has "release" semantics meaning that
earlier operations cannot be delayed past it.
This logic only handles stores; loads are handled in
java_gimplify_component_ref().
We gimplify the rhs, put the result in a tmp_var, and then return
a MODIFY_EXPR with an rhs of the form {__sync_synchronize(); tmp_var}.
This forces __sync_synchronize() to be placed after evaluating
the rhs and immediately before storing to the volatile field.
*/
enum gimplify_status stat;
tree sync_expr =
build_call_expr (built_in_decls[BUILT_IN_SYNCHRONIZE], 0);
TREE_SIDE_EFFECTS (sync_expr) = 1;
stat = gimplify_expr (&rhs, pre_p, post_p,
is_gimple_formal_tmp_var, fb_rvalue);
if (stat == GS_ERROR)
return stat;
rhs = build2 (COMPOUND_EXPR, TREE_TYPE (rhs),
sync_expr, rhs);
TREE_SIDE_EFFECTS (rhs) = 1;
TREE_THIS_VOLATILE (lhs) = 1;
lhs = java_modify_addr_for_volatile (lhs);
TREE_OPERAND (modify_expr, 0) = lhs;
TREE_OPERAND (modify_expr, 1) = rhs;
}
/* This is specific to the bytecode compiler. If a variable has
LOCAL_SLOT_P set, replace an assignment to it with an assignment
to the corresponding variable that holds all its aliases. */
......
......@@ -1365,11 +1365,6 @@ load_class (tree class_or_name, int verbose)
|| CLASS_FROM_CURRENTLY_COMPILED_P (type));
}
/* If the class is from source code, then it must already be loaded. */
class_decl = IDENTIFIER_CLASS_VALUE (name);
if (class_decl && CLASS_FROM_SOURCE_P (TREE_TYPE (class_decl)))
return;
saved = name;
/* If flag_verify_invocations is unset, we don't try to load a class
......
......@@ -763,9 +763,7 @@ find_method_in_interfaces (tree searched_class, int flags, tree method_name,
tree method;
/* If the superinterface hasn't been loaded yet, do so now. */
if (CLASS_FROM_SOURCE_P (iclass))
safe_layout_class (iclass);
else if (!CLASS_LOADED_P (iclass))
if (!CLASS_LOADED_P (iclass))
load_class (iclass, 1);
/* First, we look in ICLASS. If that doesn't work we'll
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment