This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[RFA] Remap variable table entries
- From: Keith Seitz <keiths at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Fri, 08 Jun 2007 17:43:30 -0700
- Subject: [RFA] Remap variable table entries
Hi,
For some time now I've been noticing a discrepancy between variables
that should be in scope and when Eclipse actually displays them in
scope. Very, very irritating.
Turns out that we were blindly using the bytecode offsets from the debug
info without ever taking into consideration that we were compiling the
methods. As a result, the variable tables never were quite right...
The attached patch fixes this by converting the variable table entries
when the method is compiled. I've also reworked _Jv_VarLineTableEntry to
be more like _Jv_LineTableEntry, with the union for the bytecode pc and
the direct-threaded pc.
QCC?
Keith
ChangeLog
2007-06-08 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.
Index: include/java-interp.h
===================================================================
--- include/java-interp.h (revision 125581)
+++ include/java-interp.h (working copy)
@@ -138,17 +138,27 @@
};
// 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;
};
Index: defineclass.cc
===================================================================
--- defineclass.cc (revision 125581)
+++ defineclass.cc (working copy)
@@ -1009,11 +1009,10 @@
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)
Index: interpret.cc
===================================================================
--- interpret.cc (revision 125581)
+++ interpret.cc (working copy)
@@ -947,6 +947,25 @@
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 @@
*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