aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-12-20 19:25:46 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-12-20 19:25:46 +0000
commit913746e3284267294197f2b41df8d5f67f9398a6 (patch)
tree23a89e7e13bcdbb47d1e0de82323c72cafc4dd24 /gcc/java
parent8056c5f22194f598f64b465121aa5906cf61fef9 (diff)
downloadgcc-913746e3284267294197f2b41df8d5f67f9398a6.zip
gcc-913746e3284267294197f2b41df8d5f67f9398a6.tar.gz
gcc-913746e3284267294197f2b41df8d5f67f9398a6.tar.bz2
re PR java/8955 (switch case statement causes gcj to throw segmentation fault)
* jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case where minimum case value is Integer.MIN_VALUE. Fixes PR java/8955. From-SVN: r60372
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog6
-rw-r--r--gcc/java/jcf-write.c8
2 files changed, 12 insertions, 2 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 3b6cf6c..7567830 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,9 @@
+2002-12-20 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.
+
2002-12-18 Andrew Haley <aph@redhat.com>
* parse.y (patch_invoke): Force evaluation order when `check' is
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index bfb1bd2..866ba7d 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -1746,6 +1746,7 @@ generate_bytecode_insns (exp, target, state)
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 @@ generate_bytecode_insns (exp, target, state)
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));