re PR libgcj/15713 (compile interpret.cc with -fno-strict-aliasing)

2004-07-12  Bryce McKinlay  <mckinlay@redhat.com>

	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
This commit is contained in:
Bryce McKinlay 2004-07-13 01:04:47 +00:00 committed by Bryce McKinlay
parent 066a03440a
commit 7a1c3d48ab
4 changed files with 57 additions and 36 deletions

View File

@ -1,3 +1,11 @@
2004-07-12 Bryce McKinlay <mckinlay@redhat.com>
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 <scottg@mantatest.com>
* gnu/awt/xlib/XCanvasPeer.java (createImage): Implement.

View File

@ -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

View File

@ -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.

View File

@ -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);
}