Patch: PR java/8955
Tom Tromey
tromey@redhat.com
Wed Dec 18 19:40:00 GMT 2002
This patch fixes PR java/8955.
In this PR the lowest value in a switch statement was
Integer.MIN_VALUE. This caused overflow in the comparison to see
whether we should generate a tableswitch.
The fix is to use an unsigned result. Then overflow is interpreted as
a "no".
Ok to commit?
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 03:27:30 -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-patches
mailing list