aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2005-06-13 12:30:47 -0700
committerPer Bothner <bothner@gcc.gnu.org>2005-06-13 12:30:47 -0700
commit885beb81abe41d740e709e42f1d288910bfd1c73 (patch)
tree381fbfa6314b752218f977d1bb3a01148c26892e /gcc
parenta1b6a5910bb7a4db753e0cbc28e4c9496e40fc13 (diff)
downloadgcc-885beb81abe41d740e709e42f1d288910bfd1c73.zip
gcc-885beb81abe41d740e709e42f1d288910bfd1c73.tar.gz
gcc-885beb81abe41d740e709e42f1d288910bfd1c73.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog11
-rw-r--r--gcc/java/expr.c10
-rw-r--r--gcc/java/java-tree.h6
-rw-r--r--gcc/java/jcf-parse.c15
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 52196e4..320be47 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -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:
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index b488471..90f8ff4 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 826d4cb..5651dc3 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 ccf6d34d..29c257f 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);