diff options
Diffstat (limited to 'gcc/java/decl.c')
-rw-r--r-- | gcc/java/decl.c | 107 |
1 files changed, 28 insertions, 79 deletions
diff --git a/gcc/java/decl.c b/gcc/java/decl.c index f59605906a3..8a862d09f8a 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -29,12 +29,14 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #include "config.h" #include "system.h" #include "tree.h" +#include "rtl.h" #include "toplev.h" #include "flags.h" #include "java-tree.h" #include "jcf.h" #include "toplev.h" #include "function.h" +#include "expr.h" #include "except.h" #include "java-except.h" #include "ggc.h" @@ -47,7 +49,7 @@ static tree push_jvm_slot PARAMS ((int, tree)); static tree lookup_name_current_level PARAMS ((tree)); static tree push_promoted_type PARAMS ((const char *, tree)); static struct binding_level *make_binding_level PARAMS ((void)); -static boolean emit_init_test_initialization PARAMS ((struct hash_entry *, +static bool emit_init_test_initialization PARAMS ((struct hash_entry *, hash_table_key)); static tree create_primitive_vtable PARAMS ((const char *)); static tree check_local_named_variable PARAMS ((tree, tree, int, int *)); @@ -72,8 +74,6 @@ tree decl_map; static tree pending_local_decls = NULL_TREE; -tree throw_node [2]; - /* Push a local variable or stack slot into the decl_map, and assign it an rtl. */ @@ -116,7 +116,7 @@ push_jvm_slot (index, decl) tmp = DECL_LOCAL_SLOT_CHAIN (tmp); } if (rtl != NULL) - DECL_RTL (decl) = rtl; + SET_DECL_RTL (decl, rtl); else { if (index >= DECL_MAX_LOCALS (current_function_decl)) @@ -276,18 +276,6 @@ struct binding_level /* The binding level which this one is contained in (inherits from). */ struct binding_level *level_chain; - /* 1 means make a BLOCK for this level regardless of all else. - 2 for temporary binding contours created by the compiler. */ - char keep; - - /* Nonzero means make a BLOCK if this level has any subblocks. */ - char keep_if_subblocks; - - /* Nonzero if this level can safely have additional - cleanup-needing variables added to it. */ - char more_cleanups_ok; - char have_cleanups; - /* The bytecode PC that marks the end of this level. */ int end_pc; /* The bytecode PC that marks the start of this level. */ @@ -323,7 +311,7 @@ static struct binding_level *global_binding_level; static struct binding_level clear_binding_level = {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, - NULL_BINDING_LEVEL, 0, 0, 0, 0, LARGEST_PC, 0}; + NULL_BINDING_LEVEL, LARGEST_PC, 0}; #if 0 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function @@ -339,15 +327,6 @@ static tree shadowed_labels; int flag_traditional; -/* Nonzero means unconditionally make a BLOCK for the next level pushed. */ - -static int keep_next_level_flag; - -/* Nonzero means make a BLOCK for the next level pushed - if it has subblocks. */ - -static int keep_next_if_subblocks; - tree java_global_trees[JTI_MAX]; tree predef_filenames[PREDEF_FILENAMES_SIZE]; @@ -398,7 +377,7 @@ builtin_function (name, type, function_code, class, library_name) DECL_EXTERNAL (decl) = 1; TREE_PUBLIC (decl) = 1; if (library_name) - DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name); + SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name)); make_decl_rtl (decl, NULL_PTR); pushdecl (decl); DECL_BUILT_IN_CLASS (decl) = class; @@ -602,6 +581,7 @@ init_decl_processing () super_identifier_node = get_identifier ("super"); continue_identifier_node = get_identifier ("continue"); access0_identifier_node = get_identifier ("access$0"); + classdollar_identifier_node = get_identifier ("class$"); /* for lack of a better place to put this stub call */ init_expr_processing(); @@ -635,12 +615,6 @@ init_decl_processing () FIELD_PRIVATE (t) = 1; FINISH_RECORD (object_type_node); - class_dtable_decl = build_dtable_decl (class_type_node); - TREE_STATIC (class_dtable_decl) = 1; - DECL_ARTIFICIAL (class_dtable_decl) = 1; - DECL_IGNORED_P (class_dtable_decl) = 1; - rest_of_decl_compilation (class_dtable_decl, (char*) 0, 1, 0); - field_type_node = make_node (RECORD_TYPE); field_ptr_type_node = build_pointer_type (field_type_node); method_type_node = make_node (RECORD_TYPE); @@ -693,7 +667,6 @@ init_decl_processing () PUSH_FIELD (field_type_node, field, "bsize", unsigned_short_type_node); PUSH_FIELD (field_type_node, field, "info", field_info_union_node); FINISH_RECORD (field_type_node); - CLASS_LOADED_P (field_type_node) = 1; build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node); one_elt_array_domain_type = build_index_type (integer_one_node); @@ -735,7 +708,6 @@ init_decl_processing () PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node); PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node); FINISH_RECORD (method_type_node); - CLASS_LOADED_P (method_type_node) = 1; build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node); endlink = end_params_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE); @@ -753,18 +725,14 @@ init_decl_processing () t), 0, NOT_BUILT_IN, NULL_PTR); - throw_node[0] = builtin_function ("_Jv_Throw", - build_function_type (ptr_type_node, t), - 0, NOT_BUILT_IN, NULL_PTR); + + throw_node = builtin_function ("_Jv_Throw", + build_function_type (ptr_type_node, t), + 0, NOT_BUILT_IN, NULL_PTR); /* Mark throw_nodes as `noreturn' functions with side effects. */ - TREE_THIS_VOLATILE (throw_node[0]) = 1; - TREE_SIDE_EFFECTS (throw_node[0]) = 1; - t = tree_cons (NULL_TREE, ptr_type_node, endlink); - throw_node[1] = builtin_function ("_Jv_Sjlj_Throw", - build_function_type (ptr_type_node, t), - 0, NOT_BUILT_IN, NULL_PTR); - TREE_THIS_VOLATILE (throw_node[1]) = 1; - TREE_SIDE_EFFECTS (throw_node[1]) = 1; + TREE_THIS_VOLATILE (throw_node) = 1; + TREE_SIDE_EFFECTS (throw_node) = 1; + t = build_function_type (int_type_node, endlink); soft_monitorenter_node = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, @@ -867,15 +835,6 @@ init_decl_processing () build_function_type (double_type_node, t), BUILT_IN_FMOD, BUILT_IN_NORMAL, "fmod"); - soft_exceptioninfo_call_node - = build (CALL_EXPR, - ptr_type_node, - build_address_of - (builtin_function ("_Jv_exception_info", - build_function_type (ptr_type_node, endlink), - 0, NOT_BUILT_IN, NULL_PTR)), - NULL_TREE, NULL_TREE); - TREE_SIDE_EFFECTS (soft_exceptioninfo_call_node) = 1; #if 0 t = tree_cons (NULL_TREE, float_type_node, tree_cons (NULL_TREE, float_type_node, endlink)); @@ -905,13 +864,17 @@ init_decl_processing () build_function_type (long_type_node, t), 0, NOT_BUILT_IN, NULL_PTR); + /* Initialize variables for except.c. */ + eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS + ? "__gcj_personality_sj0" + : "__gcj_personality_v0"); + lang_eh_runtime_type = prepare_eh_table_type; + init_jcf_parse (); /* Register nodes with the garbage collector. */ ggc_add_tree_root (java_global_trees, sizeof (java_global_trees) / sizeof (tree)); - ggc_add_tree_root (throw_node, - sizeof (throw_node) / sizeof (tree)); ggc_add_tree_root (predef_filenames, sizeof (predef_filenames) / sizeof (tree)); ggc_add_tree_root (&decl_map, 1); @@ -1204,10 +1167,6 @@ pushlevel (unused) *newlevel = clear_binding_level; newlevel->level_chain = current_binding_level; current_binding_level = newlevel; - newlevel->keep = keep_next_level_flag; - keep_next_level_flag = 0; - newlevel->keep_if_subblocks = keep_next_if_subblocks; - keep_next_if_subblocks = 0; #if defined(DEBUG_JAVA_BINDING_LEVELS) newlevel->binding_depth = binding_depth; indent (); @@ -1268,8 +1227,6 @@ poplevel (keep, reverse, functionbody) #endif #endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */ - keep |= current_binding_level->keep; - /* Get the decls in the order they were written. Usually current_binding_level->names is in reverse order. But parameter decls were previously put in forward order. */ @@ -1314,8 +1271,7 @@ poplevel (keep, reverse, functionbody) block_previously_created = (current_binding_level->this_block != 0); if (block_previously_created) block = current_binding_level->this_block; - else if (keep || functionbody - || (current_binding_level->keep_if_subblocks && subblocks != 0)) + else if (keep || functionbody) block = make_node (BLOCK); if (block != 0) { @@ -1544,6 +1500,10 @@ set_block (block) register tree block; { current_binding_level->this_block = block; + current_binding_level->names = chainon (current_binding_level->names, + BLOCK_VARS (block)); + current_binding_level->blocks = chainon (current_binding_level->blocks, + BLOCK_SUBBLOCKS (block)); } /* integrate_decl_tree calls this function. */ @@ -1598,7 +1558,7 @@ give_name_to_locals (jcf) { tree decl = TREE_VEC_ELT (decl_map, slot); DECL_NAME (decl) = name; - DECL_ASSEMBLER_NAME (decl) = name; + SET_DECL_ASSEMBLER_NAME (decl, name); if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type) warning ("bad type in parameter debug info"); } @@ -1665,7 +1625,7 @@ give_name_to_locals (jcf) sprintf (buffer, "ARG_%d", arg_i); DECL_NAME (parm) = get_identifier (buffer); } - DECL_ASSEMBLER_NAME (parm) = DECL_NAME (parm); + SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm)); } } } @@ -1685,7 +1645,7 @@ build_result_decl (fndecl) /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE in order to emit initialization code for each test flag. */ -static boolean +static bool emit_init_test_initialization (entry, key) struct hash_entry *entry; hash_table_key key ATTRIBUTE_UNUSED; @@ -1856,7 +1816,6 @@ void end_java_method () { tree fndecl = current_function_decl; - int flag_asynchronous_exceptions = asynchronous_exceptions; expand_end_bindings (getdecls (), 1, 0); /* pop out of function */ @@ -1867,23 +1826,13 @@ end_java_method () BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; - emit_handlers (); - /* Generate rtl for function exit. */ expand_function_end (input_filename, lineno, 0); - /* FIXME: If the current method contains any exception handlers, - force asynchronous_exceptions: this is necessary because signal - handlers in libjava may throw exceptions. This is far from being - a perfect solution, but it's better than doing nothing at all.*/ - if (catch_clauses) - asynchronous_exceptions = 1; - /* Run the optimizers and output assembler code for this function. */ rest_of_compilation (fndecl); current_function_decl = NULL_TREE; - asynchronous_exceptions = flag_asynchronous_exceptions; } /* Mark language-specific parts of T for garbage-collection. */ |