comparison src/share/vm/shark/sharkBlock.cpp @ 7598:f9bda35f4226

8005816: Shark: fix volatile float field access Reviewed-by: twisti Contributed-by: Roman Kennke <rkennke@redhat.com>
author twisti
date Fri, 11 Jan 2013 16:47:23 -0800
parents 2cd5e15048e6
children 606eada1bf86
comparison
equal deleted inserted replaced
7597:a3f92e6c0274 7598:f9bda35f4226
1042 object = builder()->CreateInlineOop(field->holder()->java_mirror()); 1042 object = builder()->CreateInlineOop(field->holder()->java_mirror());
1043 } 1043 }
1044 BasicType basic_type = field->type()->basic_type(); 1044 BasicType basic_type = field->type()->basic_type();
1045 Type *stack_type = SharkType::to_stackType(basic_type); 1045 Type *stack_type = SharkType::to_stackType(basic_type);
1046 Type *field_type = SharkType::to_arrayType(basic_type); 1046 Type *field_type = SharkType::to_arrayType(basic_type);
1047 1047 Type *type = field_type;
1048 if (field->is_volatile()) {
1049 if (field_type == SharkType::jfloat_type()) {
1050 type = SharkType::jint_type();
1051 } else if (field_type == SharkType::jdouble_type()) {
1052 type = SharkType::jlong_type();
1053 }
1054 }
1048 Value *addr = builder()->CreateAddressOfStructEntry( 1055 Value *addr = builder()->CreateAddressOfStructEntry(
1049 object, in_ByteSize(field->offset_in_bytes()), 1056 object, in_ByteSize(field->offset_in_bytes()),
1050 PointerType::getUnqual(field_type), 1057 PointerType::getUnqual(type),
1051 "addr"); 1058 "addr");
1052 1059
1053 // Do the access 1060 // Do the access
1054 if (is_get) { 1061 if (is_get) {
1055 Value* field_value; 1062 Value* field_value;
1056 if (field->is_volatile()) { 1063 if (field->is_volatile()) {
1057 field_value = builder()->CreateAtomicLoad(addr); 1064 field_value = builder()->CreateAtomicLoad(addr);
1065 field_value = builder()->CreateBitCast(field_value, field_type);
1058 } else { 1066 } else {
1059 field_value = builder()->CreateLoad(addr); 1067 field_value = builder()->CreateLoad(addr);
1060 } 1068 }
1061 if (field_type != stack_type) { 1069 if (field_type != stack_type) {
1062 field_value = builder()->CreateIntCast( 1070 field_value = builder()->CreateIntCast(
1072 field_value = builder()->CreateIntCast( 1080 field_value = builder()->CreateIntCast(
1073 field_value, field_type, basic_type != T_CHAR); 1081 field_value, field_type, basic_type != T_CHAR);
1074 } 1082 }
1075 1083
1076 if (field->is_volatile()) { 1084 if (field->is_volatile()) {
1085 field_value = builder()->CreateBitCast(field_value, type);
1077 builder()->CreateAtomicStore(field_value, addr); 1086 builder()->CreateAtomicStore(field_value, addr);
1078 } else { 1087 } else {
1079 builder()->CreateStore(field_value, addr); 1088 builder()->CreateStore(field_value, addr);
1080 } 1089 }
1081 1090