aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2007-06-15 03:53:52 +0000
committerKeith Seitz <kseitz@gcc.gnu.org>2007-06-15 03:53:52 +0000
commit7dace0ca518e0561b71691938e5402acf58f641c (patch)
tree16c0ed1aafda743e1a3cf2417a076930ebfb39d5 /libjava
parente89993b3f2085c19cda293fc0476ba2c7da3107d (diff)
downloadgcc-7dace0ca518e0561b71691938e5402acf58f641c.zip
gcc-7dace0ca518e0561b71691938e5402acf58f641c.tar.gz
gcc-7dace0ca518e0561b71691938e5402acf58f641c.tar.bz2
java-interp.h (_Jv_LocalVarTableEntry): Add union for bytecode_pc and direct-threaded pc.
* include/java-interp.h (_Jv_LocalVarTableEntry): Add union for bytecode_pc and direct-threaded pc. Add field descriptions inline. * defineclass.cc (read_one_code_attribute): Change from bytecode_start_pc to bytecode_pc. Remove unused variable "len". * interpret.cc (compile): Remap the variable table, too. (get_local_var_table) [DIRECT_THREADED]: Use insn_index on the start location to map from pc_t to code index. From-SVN: r125734
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog12
-rw-r--r--libjava/defineclass.cc7
-rw-r--r--libjava/include/java-interp.h22
-rw-r--r--libjava/interpret.cc28
4 files changed, 56 insertions, 13 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index f9efe62..2be24b9 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,15 @@
+2007-06-14 Keith Seitz <keiths@redhat.com>
+
+ * include/java-interp.h (_Jv_LocalVarTableEntry): Add union
+ for bytecode_pc and direct-threaded pc.
+ Add field descriptions inline.
+ * defineclass.cc (read_one_code_attribute): Change from
+ bytecode_start_pc to bytecode_pc.
+ Remove unused variable "len".
+ * interpret.cc (compile): Remap the variable table, too.
+ (get_local_var_table) [DIRECT_THREADED]: Use insn_index on the
+ start location to map from pc_t to code index.
+
2007-06-09 Keith Seitz <keiths@redhat.com>
* testsuite/libjava.jvmti/dummyagent.c (Agent_OnLoad):
diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc
index 0f0da77..2024fb6 100644
--- a/libjava/defineclass.cc
+++ b/libjava/defineclass.cc
@@ -1009,11 +1009,10 @@ void _Jv_ClassReader::read_one_code_attribute (int method_index)
for (int i = 0; i < table_len; i++)
{
- table[i].bytecode_start_pc = read2u ();
+ table[i].bytecode_pc = read2u ();
table[i].length = read2u ();
- int len;
- len = pool_Utf8_to_char_arr (read2u (), &table[i].name);
- len = pool_Utf8_to_char_arr (read2u (), &table[i].descriptor);
+ pool_Utf8_to_char_arr (read2u (), &table[i].name);
+ pool_Utf8_to_char_arr (read2u (), &table[i].descriptor);
table[i].slot = read2u ();
if (table[i].slot > method->max_locals || table[i].slot < 0)
diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h
index 204a49f..f0b77f9 100644
--- a/libjava/include/java-interp.h
+++ b/libjava/include/java-interp.h
@@ -138,17 +138,27 @@ struct _Jv_LineTableEntry
};
// This structure holds local variable information.
-// The pc value is the first pc where the variable must have a value and it
-// must continue to have a value until (start_pc + length).
-// The name is the variable name, and the descriptor contains type information.
-// The slot is the index in the local variable array of this method, long and
-// double occupy slot and slot+1.
+// Like _Jv_LineTableEntry above, it is remapped when the method is
+// compiled for direct threading.
struct _Jv_LocalVarTableEntry
{
- int bytecode_start_pc;
+ // First PC value at which variable is live
+ union
+ {
+ pc_t pc;
+ int bytecode_pc;
+ };
+
+ // length of visibility of variable
int length;
+
+ // variable name
char *name;
+
+ // type description
char *descriptor;
+
+ // stack slot number (long and double occupy slot and slot + 1)
int slot;
};
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index 18b4ae0..01a9c38 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -947,6 +947,25 @@ _Jv_InterpMethod::compile (const void * const *insn_targets)
prepared = insns;
+ // Now remap the variable table for this method.
+ for (int i = 0; i < local_var_table_len; ++i)
+ {
+ int start_byte = local_var_table[i].bytecode_pc;
+ if (start_byte < 0 || start_byte >= code_length)
+ start_byte = 0;
+ jlocation start = pc_mapping[start_byte];
+
+ int end_byte = start_byte + local_var_table[i].length;
+ if (end_byte < 0)
+ end_byte = 0;
+ jlocation end = ((end_byte >= code_length)
+ ? number_insn_slots
+ : pc_mapping[end_byte]);
+
+ local_var_table[i].pc = &insns[start];
+ local_var_table[i].length = end - start + 1;
+ }
+
if (breakpoint_insn == NULL)
{
bp_insn_slot.insn = const_cast<void *> (insn_targets[op_breakpoint]);
@@ -1526,12 +1545,15 @@ _Jv_InterpMethod::get_local_var_table (char **name, char **sig,
*sig = local_var_table[table_slot].descriptor;
*generic_sig = local_var_table[table_slot].descriptor;
- *startloc = static_cast<jlong>
- (local_var_table[table_slot].bytecode_start_pc);
+#ifdef DIRECT_THREADED
+ *startloc = insn_index (local_var_table[table_slot].pc);
+#else
+ *startloc = static_cast<jlong> (local_var_table[table_slot].bytecode_pc);
+#endif
*length = static_cast<jint> (local_var_table[table_slot].length);
*slot = static_cast<jint> (local_var_table[table_slot].slot);
}
- return local_var_table_len - table_slot -1;
+ return local_var_table_len - table_slot - 1;
}
pc_t