src/share/vm/shark/sharkBlock.cpp
Print this page
rev 3864 : imported patch fixatomicloadstore.patch
*** 1042,1062 ****
object = builder()->CreateInlineOop(field->holder()->java_mirror());
}
BasicType basic_type = field->type()->basic_type();
Type *stack_type = SharkType::to_stackType(basic_type);
Type *field_type = SharkType::to_arrayType(basic_type);
!
Value *addr = builder()->CreateAddressOfStructEntry(
object, in_ByteSize(field->offset_in_bytes()),
! PointerType::getUnqual(field_type),
"addr");
// Do the access
if (is_get) {
Value* field_value;
if (field->is_volatile()) {
field_value = builder()->CreateAtomicLoad(addr);
} else {
field_value = builder()->CreateLoad(addr);
}
if (field_type != stack_type) {
field_value = builder()->CreateIntCast(
--- 1042,1070 ----
object = builder()->CreateInlineOop(field->holder()->java_mirror());
}
BasicType basic_type = field->type()->basic_type();
Type *stack_type = SharkType::to_stackType(basic_type);
Type *field_type = SharkType::to_arrayType(basic_type);
! Type *type = field_type;
! if (field->is_volatile()) {
! if (field_type == SharkType::jfloat_type()) {
! type = SharkType::jint_type();
! } else if (field_type == SharkType::jdouble_type()) {
! type = SharkType::jlong_type();
! }
! }
Value *addr = builder()->CreateAddressOfStructEntry(
object, in_ByteSize(field->offset_in_bytes()),
! PointerType::getUnqual(type),
"addr");
// Do the access
if (is_get) {
Value* field_value;
if (field->is_volatile()) {
field_value = builder()->CreateAtomicLoad(addr);
+ field_value = builder()->CreateBitCast(field_value, field_type);
} else {
field_value = builder()->CreateLoad(addr);
}
if (field_type != stack_type) {
field_value = builder()->CreateIntCast(
*** 1072,1081 ****
--- 1080,1090 ----
field_value = builder()->CreateIntCast(
field_value, field_type, basic_type != T_CHAR);
}
if (field->is_volatile()) {
+ field_value = builder()->CreateBitCast(field_value, type);
builder()->CreateAtomicStore(field_value, addr);
} else {
builder()->CreateStore(field_value, addr);
}