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