1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Better union field loading

This commit is contained in:
Brian Fiete 2022-09-05 08:36:57 -07:00
parent d2356a0582
commit 03c56b42c9

View file

@ -5319,11 +5319,8 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
return mModule->GetDefaultTypedValue(resolvedFieldType); return mModule->GetDefaultTypedValue(resolvedFieldType);
} }
if ((target.mType->IsUnion()) && (!target.mType->IsValuelessType()))
target = mModule->MakeAddressable(target);
BfTypedValue retVal; BfTypedValue retVal;
if (target.IsSplat()) if (targetValue.IsSplat())
{ {
retVal = mModule->ExtractValue(targetValue, fieldInstance, fieldInstance->mDataIdx); retVal = mModule->ExtractValue(targetValue, fieldInstance, fieldInstance->mDataIdx);
} }
@ -5351,15 +5348,18 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
resolvedFieldType, target.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr); resolvedFieldType, target.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
} }
} }
if (!retVal.IsSplat()) if (typeInstance->mIsUnion)
{ {
if (typeInstance->mIsUnion) auto unionInnerType = typeInstance->GetUnionInnerType();
if (unionInnerType != resolvedFieldType)
{ {
if (!retVal.IsAddr())
retVal = mModule->MakeAddressable(retVal);
BfIRType llvmPtrType = mModule->mBfIRBuilder->GetPointerTo(mModule->mBfIRBuilder->MapType(resolvedFieldType)); BfIRType llvmPtrType = mModule->mBfIRBuilder->GetPointerTo(mModule->mBfIRBuilder->MapType(resolvedFieldType));
retVal.mValue = mModule->mBfIRBuilder->CreateBitCast(retVal.mValue, llvmPtrType); retVal.mValue = mModule->mBfIRBuilder->CreateBitCast(retVal.mValue, llvmPtrType);
} }
} }
if ((fieldDef->mIsVolatile) && (retVal.IsAddr())) if ((fieldDef->mIsVolatile) && (retVal.IsAddr()))
retVal.mKind = BfTypedValueKind_VolatileAddr; retVal.mKind = BfTypedValueKind_VolatileAddr;