From 44fadf1e3a92c5fcade1c2c65d349e2e9b08f6e6 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 13 Jul 2000 18:25:37 +0000 Subject: [PATCH] * lang-specs.h: Added %{I*}. From-SVN: r35018 --- gcc/java/ChangeLog | 4 ++++ gcc/java/jcf-write.c | 24 ++++++++++++++++++++++-- gcc/java/lang-specs.h | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 0edfafbceff..4857d018219 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,7 @@ +2000-07-13 Tom Tromey + + * lang-specs.h: Added %{I*}. + 2000-07-13 Zack Weinberg * lang-specs.h: Use the new named specs. Remove unnecessary braces. diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 538c1a24f54..0ef29cab20b 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -290,6 +290,7 @@ static struct jcf_block * get_jcf_label_here PARAMS ((struct jcf_partial *)); static void put_linenumber PARAMS ((int, struct jcf_partial *)); static void localvar_alloc PARAMS ((tree, struct jcf_partial *)); static void localvar_free PARAMS ((tree, struct jcf_partial *)); +static void localvar_finish PARAMS ((tree, struct jcf_partial *)); static int get_access_flags PARAMS ((tree)); static void write_chunks PARAMS ((FILE *, struct chunk *)); static int adjust_typed_op PARAMS ((tree, int)); @@ -644,6 +645,25 @@ localvar_free (decl, state) } } +/* Like localvar_free, but leaves the variable allocated. This lets + us avoid problems with inappropriate variable reuse in some + situations. */ +static void +localvar_finish (decl, state) + tree decl; + struct jcf_partial *state; +{ + struct jcf_block *end_label = get_jcf_label_here (state); + int index = DECL_LOCAL_INDEX (decl); + register struct localvar_info **ptr = &localvar_buffer [index]; + register struct localvar_info *info = *ptr; + + info->end_label = end_label; + + if (info->decl != decl) + abort (); +} + #define STACK_TARGET 1 #define IGNORE_TARGET 2 @@ -2379,7 +2399,7 @@ generate_bytecode_insns (exp, target, state) RESERVE (1); OP1 (OPCODE_athrow); NOTE_POP (1); - localvar_free (exception_decl, state); + localvar_finish (exception_decl, state); /* The finally block. First save return PC into return_link. */ define_jcf_label (finally_label, state); @@ -2388,7 +2408,7 @@ generate_bytecode_insns (exp, target, state) generate_bytecode_insns (finally, IGNORE_TARGET, state); maybe_wide (OPCODE_ret, DECL_LOCAL_INDEX (return_link), state); - localvar_free (return_link, state); + localvar_finish (return_link, state); define_jcf_label (finished_label, state); } break; diff --git a/gcc/java/lang-specs.h b/gcc/java/lang-specs.h index c03301852dc..d912724dc30 100644 --- a/gcc/java/lang-specs.h +++ b/gcc/java/lang-specs.h @@ -31,6 +31,6 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ {".jar", "@java" }, {"@java", "%{fjni:%{femit-class-file:%e-fjni and -femit-class-file are incompatible}}\ - %{!E:jc1 %i %(cc1_options) %{+e*} %{MD} %{MMD} %{M} %{MM}\ + %{!E:jc1 %i %(cc1_options) %{+e*} %{I*} %{MD} %{MMD} %{M} %{MM}\ %{!S:-o %{|!pipe:%g.s} |\n\ as %(asm_options) %{!pipe:%g.s} %A }}"},