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:
parent
066a03440a
commit
7a1c3d48ab
4 changed files with 57 additions and 36 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue