From: Bryce McKinlay Date: Tue, 13 Jul 2004 01:04:47 +0000 (+0000) Subject: re PR libgcj/15713 (compile interpret.cc with -fno-strict-aliasing) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7a1c3d48ab726eba42466131a41ba02615f306ad;p=gcc.git re PR libgcj/15713 (compile interpret.cc with -fno-strict-aliasing) 2004-07-12 Bryce McKinlay PR libgcj/15713 * include/jvm.h (_Jv_value): New union type. * gcj/field.h (_Jv_Field): Add new _addr union field variants * interperet.cc (run): Use _Jv_value union type and *_addr _Jv_Field union members. From-SVN: r84596 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index e8b80b6ce24..3c0b041b0ec 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2004-07-12 Bryce McKinlay + + PR libgcj/15713 + * include/jvm.h (_Jv_value): New union type. + * gcj/field.h (_Jv_Field): Add new _addr union field variants + * interperet.cc (run): Use _Jv_value union type and *_addr _Jv_Field + union members. + 2004-07-12 Scott Gilbertson * gnu/awt/xlib/XCanvasPeer.java (createImage): Implement. diff --git a/libjava/gcj/field.h b/libjava/gcj/field.h index 9279c832964..70c5901417b 100644 --- a/libjava/gcj/field.h +++ b/libjava/gcj/field.h @@ -39,7 +39,16 @@ struct _Jv_Field union { jint boffset; /* offset in bytes for instance field */ - void* addr; /* address of static field */ + char* addr; /* address of static field */ + + jobject* object_addr; /* address of static object field... etc */ + jbyte* byte_addr; + jshort* short_addr; + jchar* char_addr; + jint* int_addr; + jlong* long_addr; + jfloat* float_addr; + jdouble* double_addr; } u; #ifdef __cplusplus diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h index 9cc59160dda..7b5e9842c27 100644 --- a/libjava/include/jvm.h +++ b/libjava/include/jvm.h @@ -114,6 +114,18 @@ union _Jv_word2 jdouble d; }; +union _Jv_value +{ + jbyte byte_value; + jshort short_value; + jchar char_value; + jint int_value; + jlong long_value; + jfloat float_value; + jdouble double_value; + jobject object_value; +}; + // An instance of this type is used to represent a single frame in a // backtrace. If the interpreter has been built, we also include // information about the interpreted method. diff --git a/libjava/interpret.cc b/libjava/interpret.cc index 331424f0834..7ec83a23c44 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -1156,7 +1156,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) ffi_cif *cif = &rmeth->cif; ffi_raw *raw = (ffi_raw*) sp; - jdouble rvalue; + _Jv_value rvalue; #if FFI_NATIVE_RAW_API /* We assume that this is only implemented if it's correct */ @@ -1172,11 +1172,11 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) * so those are checked before the switch */ if (rtype == FFI_TYPE_POINTER) { - PUSHA (*(jobject*)&rvalue); + PUSHA (rvalue.object_value); } else if (rtype == FFI_TYPE_SINT32) { - PUSHI (*(jint*)&rvalue); + PUSHI (rvalue.int_value); } else if (rtype == FFI_TYPE_VOID) { @@ -1187,36 +1187,27 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) switch (rtype) { case FFI_TYPE_SINT8: - { - jbyte value = (*(jint*)&rvalue) & 0xff; - PUSHI (value); - } + PUSHI (rvalue.byte_value); break; case FFI_TYPE_SINT16: - { - jshort value = (*(jint*)&rvalue) & 0xffff; - PUSHI (value); - } + PUSHI (rvalue.short_value); break; case FFI_TYPE_UINT16: - { - jint value = (*(jint*)&rvalue) & 0xffff; - PUSHI (value); - } + PUSHI (rvalue.char_value); break; case FFI_TYPE_FLOAT: - PUSHF (*(jfloat*)&rvalue); + PUSHF (rvalue.float_value); break; case FFI_TYPE_DOUBLE: - PUSHD (rvalue); + PUSHD (rvalue.double_value); break; case FFI_TYPE_SINT64: - PUSHL (*(jlong*)&rvalue); + PUSHL (rvalue.long_value); break; default: @@ -2408,37 +2399,37 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) switch (type->size_in_bytes) { case 1: - PUSHI (*(jbyte*) (field->u.addr)); + PUSHI (*field->u.byte_addr); newinsn = AMPAMP (getstatic_resolved_1); break; case 2: if (type == JvPrimClass (char)) { - PUSHI(*(jchar*) (field->u.addr)); + PUSHI (*field->u.char_addr); newinsn = AMPAMP (getstatic_resolved_char); } else { - PUSHI(*(jshort*) (field->u.addr)); + PUSHI (*field->u.short_addr); newinsn = AMPAMP (getstatic_resolved_short); } break; case 4: - PUSHI(*(jint*) (field->u.addr)); + PUSHI(*field->u.int_addr); newinsn = AMPAMP (getstatic_resolved_4); break; case 8: - PUSHL(*(jlong*) (field->u.addr)); + PUSHL(*field->u.long_addr); newinsn = AMPAMP (getstatic_resolved_8); break; } } else { - PUSHA(*(jobject*) (field->u.addr)); + PUSHA(*field->u.object_addr); newinsn = AMPAMP (getstatic_resolved_obj); } @@ -2494,42 +2485,43 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) NULLCHECK(obj); void *newinsn = NULL; + _Jv_value *val = (_Jv_value *) ((char *)obj + field_offset); if (type->isPrimitive ()) { switch (type->size_in_bytes) { case 1: - PUSHI (*(jbyte*) ((char*)obj + field_offset)); + PUSHI (val->byte_value); newinsn = AMPAMP (getfield_resolved_1); break; case 2: if (type == JvPrimClass (char)) { - PUSHI (*(jchar*) ((char*)obj + field_offset)); + PUSHI (val->char_value); newinsn = AMPAMP (getfield_resolved_char); } else { - PUSHI (*(jshort*) ((char*)obj + field_offset)); + PUSHI (val->short_value); newinsn = AMPAMP (getfield_resolved_short); } break; case 4: - PUSHI (*(jint*) ((char*)obj + field_offset)); + PUSHI (val->int_value); newinsn = AMPAMP (getfield_resolved_4); break; case 8: - PUSHL(*(jlong*) ((char*)obj + field_offset)); + PUSHL (val->long_value); newinsn = AMPAMP (getfield_resolved_8); break; } } else { - PUSHA(*(jobject*) ((char*)obj + field_offset)); + PUSHA (val->object_value); newinsn = AMPAMP (getfield_resolved_obj); } @@ -2611,7 +2603,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) case 1: { jint value = POPI(); - *(jbyte*) (field->u.addr) = value; + *field->u.byte_addr = value; newinsn = AMPAMP (putstatic_resolved_1); break; } @@ -2619,7 +2611,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) case 2: { jint value = POPI(); - *(jchar*) (field->u.addr) = value; + *field->u.char_addr = value; newinsn = AMPAMP (putstatic_resolved_2); break; } @@ -2627,7 +2619,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) case 4: { jint value = POPI(); - *(jint*) (field->u.addr) = value; + *field->u.int_addr = value; newinsn = AMPAMP (putstatic_resolved_4); break; } @@ -2635,7 +2627,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) case 8: { jlong value = POPL(); - *(jlong*) (field->u.addr) = value; + *field->u.long_addr = value; newinsn = AMPAMP (putstatic_resolved_8); break; } @@ -2644,7 +2636,7 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) else { jobject value = POPA(); - *(jobject*) (field->u.addr) = value; + *field->u.object_addr = value; newinsn = AMPAMP (putstatic_resolved_obj); }