1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +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 enum BfTypedValueKind
{ {
BfTypedValueKind_Addr, BfTypedValueKind_Addr,
BfTypedValueKind_VolatileAddr,
BfTypedValueKind_CopyOnMutateAddr, BfTypedValueKind_CopyOnMutateAddr,
BfTypedValueKind_CopyOnMutateAddr_Derived, BfTypedValueKind_CopyOnMutateAddr_Derived,
BfTypedValueKind_ReadOnlyAddr, BfTypedValueKind_ReadOnlyAddr,
@ -586,7 +587,7 @@ enum BfTypedValueKind
BfTypedValueKind_ReadOnlyTempAddr, BfTypedValueKind_ReadOnlyTempAddr,
BfTypedValueKind_ThisAddr, BfTypedValueKind_ThisAddr,
BfTypedValueKind_BaseAddr, BfTypedValueKind_BaseAddr,
BfTypedValueKind_ReadOnlyThisAddr, BfTypedValueKind_ReadOnlyThisAddr,
BfTypedValueKind_ReadOnlyBaseAddr, BfTypedValueKind_ReadOnlyBaseAddr,
BfTypedValueKind_Value, BfTypedValueKind_Value,
@ -750,6 +751,11 @@ public:
mKind = (BfTypedValueKind)((int)mKind - 1); mKind = (BfTypedValueKind)((int)mKind - 1);
} }
bool IsVolatile() const
{
return mKind == BfTypedValueKind_VolatileAddr;
}
bool IsSplat() const bool IsSplat() const
{ {
return (mKind >= BfTypedValueKind_SplatHead) && (mKind <= BfTypedValueKind_ParamsSplat); 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) if (wantsLoadValue)
retVal = mModule->LoadValue(retVal, NULL, mIsVolatileReference); retVal = mModule->LoadValue(retVal, NULL, mIsVolatileReference);
else else
@ -5902,8 +5905,8 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
resolvedArg.mResolvedType = argValue.mType; resolvedArg.mResolvedType = argValue.mType;
if (resolvedArg.mResolvedType->IsRef()) if (resolvedArg.mResolvedType->IsRef())
argValue.mKind = BfTypedValueKind_Value; argValue.mKind = BfTypedValueKind_Value;
else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType())) if (exprEvaluator.mIsVolatileReference)
argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference); resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_Volatile);
} }
resolvedArg.mUncastedTypedValue = argValue; resolvedArg.mUncastedTypedValue = argValue;
resolvedArg.mTypedValue = argValue; resolvedArg.mTypedValue = argValue;

View file

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

View file

@ -12583,11 +12583,9 @@ BfTypedValue BfModule::LoadValue(BfTypedValue typedValue, BfAstNode* refNode, bo
{ {
return BfTypedValue(loadedVal, typedValue.mType, false); return BfTypedValue(loadedVal, typedValue.mType, false);
} }
/*if (isVolatile)
mBfIRBuilder->CreateFence(BfIRFenceType_AcquireRelease);*/
PopulateType(typedValue.mType, BfPopulateType_Data); 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); return BfTypedValue(loadedVal, typedValue.mType, false);
} }
@ -14739,6 +14737,8 @@ BfTypedValue BfModule::ReferenceStaticField(BfFieldInstance* fieldInstance)
if (type->IsValuelessType()) if (type->IsValuelessType())
return BfTypedValue(globalValue, type); return BfTypedValue(globalValue, type);
if (fieldDef->mIsVolatile)
return BfTypedValue(globalValue, type, BfTypedValueKind_VolatileAddr);
return BfTypedValue(globalValue, type, !fieldDef->mIsConst); return BfTypedValue(globalValue, type, !fieldDef->mIsConst);
} }

View file

@ -159,6 +159,29 @@ namespace Tests
} }
static void InInt(in int a)
{
Test.Assert(a == 123);
#unwarn
int* aPtr = &a;
*aPtr = 234;
}
static void CopyStructA(StructA sa)
{
#unwarn
StructA* saPtr = &sa;
saPtr.mA += 1000;
}
static void InStructA(in StructA sa)
{
#unwarn
StructA* saPtr = &sa;
saPtr.mA += 1000;
}
[Test] [Test]
public static void TestBasics() public static void TestBasics()
{ {
@ -206,6 +229,16 @@ namespace Tests
var v = ObjMethod(.. scope String()); var v = ObjMethod(.. scope String());
Test.Assert(v.GetType() == typeof(String)); Test.Assert(v.GetType() == typeof(String));
int b = 123;
InInt(b);
Test.Assert(b == 234);
StructA sa4 = .(400, 401);
CopyStructA(sa4);
Test.Assert(sa4.mA == 400);
InStructA(sa4);
Test.Assert(sa4.mA == 1400);
} }
} }
} }