1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-07-04 23:36:00 +02:00

Fixed non-composites 'in' parameters

This commit is contained in:
Brian Fiete 2022-06-14 06:57:24 -07:00
parent 309e3cb02a
commit 0cf9135b8a
5 changed files with 51 additions and 8 deletions

View file

@ -578,6 +578,7 @@ public:
enum BfTypedValueKind
{
BfTypedValueKind_Addr,
BfTypedValueKind_VolatileAddr,
BfTypedValueKind_CopyOnMutateAddr,
BfTypedValueKind_CopyOnMutateAddr_Derived,
BfTypedValueKind_ReadOnlyAddr,
@ -586,7 +587,7 @@ enum BfTypedValueKind
BfTypedValueKind_ReadOnlyTempAddr,
BfTypedValueKind_ThisAddr,
BfTypedValueKind_BaseAddr,
BfTypedValueKind_ReadOnlyThisAddr,
BfTypedValueKind_ReadOnlyThisAddr,
BfTypedValueKind_ReadOnlyBaseAddr,
BfTypedValueKind_Value,
@ -750,6 +751,11 @@ public:
mKind = (BfTypedValueKind)((int)mKind - 1);
}
bool IsVolatile() const
{
return mKind == BfTypedValueKind_VolatileAddr;
}
bool IsSplat() const
{
return (mKind >= BfTypedValueKind_SplatHead) && (mKind <= BfTypedValueKind_ParamsSplat);

View file

@ -5093,6 +5093,9 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
}
}
if ((fieldDef->mIsVolatile) && (retVal.IsAddr()))
retVal.mKind = BfTypedValueKind_VolatileAddr;
if (wantsLoadValue)
retVal = mModule->LoadValue(retVal, NULL, mIsVolatileReference);
else
@ -5902,8 +5905,8 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
resolvedArg.mResolvedType = argValue.mType;
if (resolvedArg.mResolvedType->IsRef())
argValue.mKind = BfTypedValueKind_Value;
else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType()))
argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference);
if (exprEvaluator.mIsVolatileReference)
resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_Volatile);
}
resolvedArg.mUncastedTypedValue = argValue;
resolvedArg.mTypedValue = argValue;

View file

@ -21,7 +21,8 @@ enum BfArgFlags
BfArgFlag_UninitializedExpr = 0x400,
BfArgFlag_StringInterpolateFormat = 0x800,
BfArgFlag_StringInterpolateArg = 0x1000,
BfArgFlag_Cascade = 0x2000
BfArgFlag_Cascade = 0x2000,
BfArgFlag_Volatile = 0x8000
};
enum BfResolveArgsFlags

View file

@ -12583,11 +12583,9 @@ BfTypedValue BfModule::LoadValue(BfTypedValue typedValue, BfAstNode* refNode, bo
{
return BfTypedValue(loadedVal, typedValue.mType, false);
}
/*if (isVolatile)
mBfIRBuilder->CreateFence(BfIRFenceType_AcquireRelease);*/
PopulateType(typedValue.mType, BfPopulateType_Data);
loadedVal = mBfIRBuilder->CreateAlignedLoad(loadedVal, std::max(1, (int)typedValue.mType->mAlign), isVolatile);
loadedVal = mBfIRBuilder->CreateAlignedLoad(loadedVal, std::max(1, (int)typedValue.mType->mAlign), isVolatile || typedValue.IsVolatile());
}
return BfTypedValue(loadedVal, typedValue.mType, false);
}
@ -14739,6 +14737,8 @@ BfTypedValue BfModule::ReferenceStaticField(BfFieldInstance* fieldInstance)
if (type->IsValuelessType())
return BfTypedValue(globalValue, type);
if (fieldDef->mIsVolatile)
return BfTypedValue(globalValue, type, BfTypedValueKind_VolatileAddr);
return BfTypedValue(globalValue, type, !fieldDef->mIsConst);
}