diff options
author | Tom Tromey <tromey@redhat.com> | 2002-12-20 19:25:46 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-12-20 19:25:46 +0000 |
commit | 913746e3284267294197f2b41df8d5f67f9398a6 (patch) | |
tree | 23a89e7e13bcdbb47d1e0de82323c72cafc4dd24 /gcc/java | |
parent | 8056c5f22194f598f64b465121aa5906cf61fef9 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/java/jcf-write.c | 8 |
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)); |