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 |