From 638e4b601d7a084f2a2b51c2aa8f50341e8dc0f7 Mon Sep 17 00:00:00 2001 From: tromey Date: Fri, 17 Aug 2007 15:19:39 +0000 Subject: [PATCH] gcc: * tree.h (struct tree_label_decl): Removed old "java" fields. gcc/java: * java-tree.h (LABEL_TYPE_STATE): Removed. (load_type_state): Removed. (LABEL_PC): Removed. (LABEL_VERIFIED): Removed. (type_states): Declare. * expr.c (type_states): New global. (load_type_state): Now static. Use type_states. Changed argument. (lookup_label): Don't set LABEL_PC. (expand_byte_code): Don't use LABEL_VERIFIED. (note_instructions): Initialize type_states. * verify-glue.c (vfy_note_stack_depth): Rewrote. (vfy_note_stack_type): Use type_states. (vfy_note_local_type): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127587 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/java/ChangeLog | 17 +++++++++++++++++ gcc/java/expr.c | 21 ++++++++++++++------- gcc/java/java-tree.h | 14 +++----------- gcc/java/verify-glue.c | 20 ++++++++++++-------- gcc/tree.h | 8 -------- 6 files changed, 50 insertions(+), 34 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00894c94cca..4d21bd43537 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2007-08-17 Tom Tromey + + * tree.h (struct tree_label_decl): Removed old "java" fields. + 2007-08-17 Richard Sandiford Nigel Stephens diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 93428ad317c..c72525dc94f 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,20 @@ +2007-08-17 Tom Tromey + + * java-tree.h (LABEL_TYPE_STATE): Removed. + (load_type_state): Removed. + (LABEL_PC): Removed. + (LABEL_VERIFIED): Removed. + (type_states): Declare. + * expr.c (type_states): New global. + (load_type_state): Now static. Use type_states. Changed + argument. + (lookup_label): Don't set LABEL_PC. + (expand_byte_code): Don't use LABEL_VERIFIED. + (note_instructions): Initialize type_states. + * verify-glue.c (vfy_note_stack_depth): Rewrote. + (vfy_note_stack_type): Use type_states. + (vfy_note_local_type): Likewise. + 2007-08-10 Kaveh R. Ghazi * jcf-parse.c (read_class, java_parse_file): Use CONST_CAST. diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 8772b69b50e..c222a6550e6 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1772,7 +1772,6 @@ lookup_label (int pc) { /* The type of the address of a label is return_address_type_node. */ tree decl = create_label_decl (name); - LABEL_PC (decl) = pc; return pushdecl (decl); } } @@ -1801,9 +1800,15 @@ create_label_decl (tree name) return decl; } -/* This maps a bytecode offset (PC) to various flags. */ +/* This maps a bytecode offset (PC) to various flags. */ char *instruction_bits; +/* This is a vector of type states for the current method. It is + indexed by PC. Each element is a tree vector holding the type + state at that PC. We only note type states at basic block + boundaries. */ +VEC(tree, gc) *type_states; + static void note_label (int current_pc ATTRIBUTE_UNUSED, int target_pc) { @@ -2953,11 +2958,11 @@ expand_java_field_op (int is_static, int is_putting, int field_ref_index) TREE_THIS_VOLATILE (field_ref) = TREE_THIS_VOLATILE (field_decl); } -void -load_type_state (tree label) +static void +load_type_state (int pc) { int i; - tree vec = LABEL_TYPE_STATE (label); + tree vec = VEC_index (tree, type_states, pc); int cur_length = TREE_VEC_LENGTH (vec); stack_pointer = cur_length - DECL_MAX_LOCALS(current_function_decl); for (i = 0; i < cur_length; i++) @@ -3000,6 +3005,8 @@ note_instructions (JCF *jcf, tree method) byte_ops = jcf->read_ptr; instruction_bits = xrealloc (instruction_bits, length + 1); memset (instruction_bits, 0, length + 1); + type_states = VEC_alloc (tree, gc, length + 1); + VEC_safe_grow_cleared (tree, gc, type_states, length + 1); /* This pass figures out which PC can be the targets of jumps. */ for (PC = 0; PC < length;) @@ -3158,8 +3165,8 @@ expand_byte_code (JCF *jcf, tree method) flush_quick_stack (); if ((instruction_bits [PC] & BCODE_TARGET) != 0) java_add_stmt (build1 (LABEL_EXPR, void_type_node, label)); - if (LABEL_VERIFIED (label) || PC == 0) - load_type_state (label); + if ((instruction_bits[PC] & BCODE_VERIFIED) != 0) + load_type_state (PC); } if (! (instruction_bits [PC] & BCODE_VERIFIED)) diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 34fe5c05a0d..29902de9138 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -771,16 +771,6 @@ union lang_tree_node FIELD_LOCAL_ALIAS. */ #define FIELD_THISN(DECL) DECL_LANG_FLAG_7 (VAR_OR_FIELD_CHECK (DECL)) -/* In a LABEL_DECL, a TREE_VEC that saves the type_map at that point. */ -#define LABEL_TYPE_STATE(NODE) (LABEL_DECL_CHECK (NODE)->label_decl.java_field_1) - -/* In a LABEL_DECL, the corresponding bytecode program counter. */ -#define LABEL_PC(NODE) (LABEL_DECL_CHECK (NODE)->label_decl.java_field_4) - -/* In a LABEL_DECL, true if we have verified instructions starting here. */ -#define LABEL_VERIFIED(NODE) \ - (instruction_bits[LABEL_PC (NODE)] & BCODE_VERIFIED) - /* The slot number for this local variable. */ #define DECL_LOCAL_SLOT_NUMBER(NODE) \ (DECL_LANG_SPECIFIC (NODE)->u.v.slot_number) @@ -1248,7 +1238,6 @@ extern void set_local_type (int, tree); extern int merge_type_state (tree); extern int push_type_0 (tree); extern void push_type (tree); -extern void load_type_state (tree); extern void add_interface (tree, tree); extern tree force_evaluation_order (tree); extern tree java_create_object (tree); @@ -1418,6 +1407,9 @@ extern void rewrite_reflection_indexes (void *); /* Use CLASS_LOADED_P? FIXME */ #define CLASS_COMPLETE_P(DECL) DECL_LANG_FLAG_2 (DECL) +/* A vector used to track type states for the current method. */ +extern VEC(tree, gc) *type_states; + /* This maps a bytecode offset (PC) to various flags, listed below (starting with BCODE_). */ extern char *instruction_bits; diff --git a/gcc/java/verify-glue.c b/gcc/java/verify-glue.c index 7b16e16473a..3dfe608808c 100644 --- a/gcc/java/verify-glue.c +++ b/gcc/java/verify-glue.c @@ -393,37 +393,41 @@ vfy_get_primitive_type (int type) void vfy_note_stack_depth (vfy_method *method, int pc, int depth) { - tree label = lookup_label (pc); - LABEL_TYPE_STATE (label) = make_tree_vec (method->max_locals + depth); + tree val = make_tree_vec (method->max_locals + depth); + VEC_replace (tree, type_states, pc, val); + /* Called for side effects. */ + lookup_label (pc); } void vfy_note_stack_type (vfy_method *method, int pc, int slot, vfy_jclass type) { - tree label, vec; + tree vec; slot += method->max_locals; if (type == object_type_node) type = object_ptr_type_node; - label = lookup_label (pc); - vec = LABEL_TYPE_STATE (label); + vec = VEC_index (tree, type_states, pc); TREE_VEC_ELT (vec, slot) = type; + /* Called for side effects. */ + lookup_label (pc); } void vfy_note_local_type (vfy_method *method ATTRIBUTE_UNUSED, int pc, int slot, vfy_jclass type) { - tree label, vec; + tree vec; if (type == object_type_node) type = object_ptr_type_node; - label = lookup_label (pc); - vec = LABEL_TYPE_STATE (label); + vec = VEC_index (tree, type_states, pc); TREE_VEC_ELT (vec, slot) = type; + /* Called for side effects. */ + lookup_label (pc); } void diff --git a/gcc/tree.h b/gcc/tree.h index b5ff51f6071..7b62a161bbf 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2914,14 +2914,6 @@ struct tree_field_decl GTY(()) struct tree_label_decl GTY(()) { struct tree_decl_with_rtl common; - /* Java's verifier has some need to store information about labels, - and was using fields that no longer exist on labels. - Once the verifier doesn't need these anymore, they should be removed. */ - tree java_field_1; - tree java_field_2; - tree java_field_3; - unsigned int java_field_4; - }; struct tree_result_decl GTY(()) -- 2.11.0