From 885beb81abe41d740e709e42f1d288910bfd1c73 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Mon, 13 Jun 2005 12:30:47 -0700 Subject: [PATCH] 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 --- gcc/java/ChangeLog | 11 +++++++++++ gcc/java/expr.c | 10 +++++++++- gcc/java/java-tree.h | 6 ++++++ gcc/java/jcf-parse.c | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 52196e49a36..320be475713 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,14 @@ +2005-06-13 Per Bothner + + * 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 PR java/21844: diff --git a/gcc/java/expr.c b/gcc/java/expr.c index b48847126b8..90f8ff40460 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -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); diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 826d4cba19e..5651dc3f643 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -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 diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index ccf6d34d357..29c257fe951 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -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); -- 2.30.2