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:
Per Bothner 2005-06-13 12:30:47 -07:00 committed by Per Bothner
parent a1b6a5910b
commit 885beb81ab
4 changed files with 41 additions and 1 deletions

View file

@ -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:

View file

@ -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);

View file

@ -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

View file

@ -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);