java/8955: switch case statement causes gcj to throw segmentation fault
Tom Tromey
tromey@redhat.com
Wed Dec 18 17:36:00 GMT 2002
The following reply was made to PR java/8955; it has been noted by GNATS.
From: Tom Tromey <tromey@redhat.com>
To: bhun@chello.nl
Cc: gcc-gnats@gcc.gnu.org, Gary Benson <gbenson@redhat.com>
Subject: Re: java/8955: switch case statement causes gcj to throw segmentation fault
Date: 18 Dec 2002 18:34:49 -0700
>>>>> ">" == Dhek Bhun Kho <bhun@chello.nl> writes:
>> Number: 8955
>> Synopsis: switch case statement causes gcj to throw segmentation fault
Could you try the appended patch?
gcj 3.3 crashed on Gary's reduced test case. The appended patch fixes
that.
Tom
Index: ChangeLog
from Tom Tromey <tromey@redhat.com>
* jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case
where minimum case value is Integer.MIN_VALUE.
Fixes PR java/8955.
Index: jcf-write.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-write.c,v
retrieving revision 1.111
diff -u -r1.111 jcf-write.c
--- jcf-write.c 16 Dec 2002 18:22:35 -0000 1.111
+++ jcf-write.c 19 Dec 2002 01:29:59 -0000
@@ -1746,6 +1746,7 @@
else
{
HOST_WIDE_INT i;
+ unsigned HOST_WIDE_INT delta;
/* Copy the chain of relocs into a sorted array. */
struct jcf_relocation **relocs = (struct jcf_relocation **)
xmalloc (sw_state.num_cases * sizeof (struct jcf_relocation *));
@@ -1778,8 +1779,11 @@
handled by the parser. */
}
- if (2 * sw_state.num_cases
- >= sw_state.max_case - sw_state.min_case)
+ /* We could have DELTA < 0 if sw_state.min_case is
+ something like Integer.MIN_VALUE. That is why delta is
+ unsigned. */
+ delta = sw_state.max_case - sw_state.min_case;
+ if (2 * sw_state.num_cases >= delta)
{ /* Use tableswitch. */
int index = 0;
RESERVE (13 + 4 * (sw_state.max_case - sw_state.min_case + 1));
More information about the Gcc-prs
mailing list