expr.c (int highest_label_pc_this_method, [...]): New globals.
* expr.c (int highest_label_pc_this_method, start_label_pc_this_method): New globals. (lookup_label): Add start_label_pc_this_method to pc for label, and update highest_label_pc_this_method. This prevents conflicts between labels from different methods. * java-tree.h: Declare new globals. * jcf-parse.c (parse_class_file): If needed bump start_label_pc_this_method and reset highest_label_pc_this_method. From-SVN: r100896
This commit is contained in:
parent
a1b6a5910b
commit
885beb81ab
4 changed files with 41 additions and 1 deletions
|
@ -1,3 +1,14 @@
|
|||
2005-06-13 Per Bothner <per@bothner.com>
|
||||
|
||||
* expr.c (int highest_label_pc_this_method,
|
||||
start_label_pc_this_method): New globals.
|
||||
(lookup_label): Add start_label_pc_this_method to pc for label, and
|
||||
update highest_label_pc_this_method. This prevents conflicts between
|
||||
labels from different methods.
|
||||
* java-tree.h: Declare new globals.
|
||||
* jcf-parse.c (parse_class_file): If needed bump
|
||||
start_label_pc_this_method and reset highest_label_pc_this_method.
|
||||
|
||||
2005-06-13 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
PR java/21844:
|
||||
|
|
|
@ -138,6 +138,12 @@ int stack_pointer;
|
|||
const unsigned char *linenumber_table;
|
||||
int linenumber_count;
|
||||
|
||||
/* Largest pc so far in this method that has been passed to lookup_label. */
|
||||
int highest_label_pc_this_method = -1;
|
||||
|
||||
/* Base value for this method to add to pc to get generated label. */
|
||||
int start_label_pc_this_method = 0;
|
||||
|
||||
void
|
||||
init_expr_processing (void)
|
||||
{
|
||||
|
@ -1766,7 +1772,9 @@ lookup_label (int pc)
|
|||
{
|
||||
tree name;
|
||||
char buf[32];
|
||||
ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", pc);
|
||||
if (pc > highest_label_pc_this_method)
|
||||
highest_label_pc_this_method = pc;
|
||||
ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", start_label_pc_this_method + pc);
|
||||
name = get_identifier (buf);
|
||||
if (IDENTIFIER_LOCAL_VALUE (name))
|
||||
return IDENTIFIER_LOCAL_VALUE (name);
|
||||
|
|
|
@ -234,6 +234,12 @@ extern int always_initialize_class_p;
|
|||
|
||||
extern int flag_verify_invocations;
|
||||
|
||||
/* Largest pc so far in this method that has been passed to lookup_label. */
|
||||
extern int highest_label_pc_this_method;
|
||||
|
||||
/* Base value for this method to add to pc to get generated label. */
|
||||
extern int start_label_pc_this_method;
|
||||
|
||||
typedef struct CPool constant_pool;
|
||||
|
||||
#define CONSTANT_ResolvedFlag 16
|
||||
|
|
|
@ -929,6 +929,21 @@ parse_class_file (void)
|
|||
|
||||
give_name_to_locals (jcf);
|
||||
|
||||
/* Bump up start_label_pc_this_method so we get a unique label number
|
||||
and reset highest_label_pc_this_method. */
|
||||
if (highest_label_pc_this_method >= 0)
|
||||
{
|
||||
/* We adjust to the next multiple of 1000. This is just a frill
|
||||
so the last 3 digits of the label number match the bytecode
|
||||
offset, which might make debugging marginally more convenient. */
|
||||
start_label_pc_this_method
|
||||
= ((((start_label_pc_this_method + highest_label_pc_this_method)
|
||||
/ 1000)
|
||||
+ 1)
|
||||
* 1000);
|
||||
highest_label_pc_this_method = -1;
|
||||
}
|
||||
|
||||
/* Convert bytecode to trees. */
|
||||
expand_byte_code (jcf, method);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue