diff options
author | Pekka Nikander <pekka.nikander@hut.fi> | 2000-02-18 20:17:37 +0200 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-02-18 10:17:37 -0800 |
commit | a0f4cca64282e20ad9736528dc5d1b20ce4536e0 (patch) | |
tree | 514d2fe3a7cfa69627198630a7687b4e7d0fd84c /gcc/java/expr.c | |
parent | 8b97e23b7601eec320ef0600448a9ee686fde12b (diff) | |
download | gcc-a0f4cca64282e20ad9736528dc5d1b20ce4536e0.zip gcc-a0f4cca64282e20ad9736528dc5d1b20ce4536e0.tar.gz gcc-a0f4cca64282e20ad9736528dc5d1b20ce4536e0.tar.bz2 |
re GNATS gcj/82 (code generation for jvm IRETURN fails on boolean/byte/short methods if INT_TYPE_SIZE < 32)
Wed Nov 03 02:16:00 PST 1999 Pekka Nikander <pekka.nikander@hut.fi>
* decl.c (INT_TYPE_SIZE): Define if necessary.
(expand_java_return): Handle the case of a native integer smaller
than a JVM integer.
(Fix to the Java PR #82:
http://sourceware.cygnus.com/ml/java-prs/1999-q4/msg00078.html)
From-SVN: r32051
Diffstat (limited to 'gcc/java/expr.c')
-rw-r--r-- | gcc/java/expr.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 3c1c0ff..f25b194 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -981,6 +981,10 @@ expand_java_pushc (ival, type) push_value (value); } +#ifndef INT_TYPE_SIZE +#define INT_TYPE_SIZE BITS_PER_WORD +#endif + static void expand_java_return (type) tree type; @@ -992,6 +996,16 @@ expand_java_return (type) tree retval = pop_value (type); tree res = DECL_RESULT (current_function_decl); retval = build (MODIFY_EXPR, TREE_TYPE (res), res, retval); + + /* Handle the situation where the native integer type is smaller + than the JVM integer. It can happen for many cross compilers. + The whole if expression just goes away if INT_TYPE_SIZE < 32 + is false. */ + if (INT_TYPE_SIZE < 32 + && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (res))) + < GET_MODE_SIZE (TYPE_MODE (type)))) + retval = build1(NOP_EXPR, TREE_TYPE(res), retval); + TREE_SIDE_EFFECTS (retval) = 1; expand_return (retval); } |