| 13427 | } |
| 13428 | |
| 13429 | BfTypedValue BfModule::RemoveRef(BfTypedValue typedValue, bool makeInReadOnly) |
| 13430 | { |
| 13431 | if ((typedValue.mType != NULL) && (typedValue.mType->IsRef())) |
| 13432 | { |
| 13433 | auto refType = (BfRefType*)typedValue.mType; |
| 13434 | |
| 13435 | auto elementType = typedValue.mType->GetUnderlyingType(); |
| 13436 | if (typedValue.IsAddr()) |
| 13437 | { |
| 13438 | if (elementType->IsValuelessType()) |
| 13439 | { |
| 13440 | BF_ASSERT(!typedValue.mValue); |
| 13441 | typedValue = BfTypedValue(typedValue.mValue, elementType, true); |
| 13442 | } |
| 13443 | else |
| 13444 | typedValue = BfTypedValue(mBfIRBuilder->CreateAlignedLoad(typedValue.mValue, elementType->mAlign), elementType, true); |
| 13445 | } |
| 13446 | else |
| 13447 | typedValue = BfTypedValue(typedValue.mValue, elementType, true); |
| 13448 | |
| 13449 | if (typedValue.mType->IsValuelessType()) |
| 13450 | { |
| 13451 | BF_ASSERT(typedValue.mValue.IsFake()); |
| 13452 | } |
| 13453 | |
| 13454 | if ((refType->mRefKind == BfRefType::RefKind_In) && (makeInReadOnly)) |
| 13455 | { |
| 13456 | if (typedValue.mKind == BfTypedValueKind_Addr) |
| 13457 | typedValue.mKind = BfTypedValueKind_ReadOnlyAddr; |
| 13458 | } |
| 13459 | } |
| 13460 | return typedValue; |
| 13461 | } |
| 13462 | |
| 13463 | BfTypedValue BfModule::SanitizeAddr(BfTypedValue typedValue) |
| 13464 | { |
no test coverage detected