From 0dc45cb712b8d3103b44c1fbb240d81485343533 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 16 Sep 2021 07:56:55 -0700 Subject: [PATCH] ByVal fixes --- IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 6 ++++-- IDEHelper/Compiler/BfResolvedTypeUtils.h | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index ea4de760..c9ee2f15 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5846,7 +5846,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance* mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_NoCapture); addDeref = paramType->mSize; } - else if ((methodInstance->WantsStructsAttribByVal()) && (!paramType->IsSizedArray())) + else if (methodInstance->WantsStructsAttribByVal(paramType)) { mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_ByVal, mModule->mSystem->mPtrSize); } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index c473c155..8d16f171 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -16320,7 +16320,7 @@ void BfModule::SetupIRMethod(BfMethodInstance* methodInstance, BfIRFunction func PopulateType(resolvedTypeRef, BfPopulateType_Data); addDeref = resolvedTypeRef->mSize; } - else if ((methodInstance->WantsStructsAttribByVal()) && (!resolvedTypeRef->IsSizedArray())) + else if (methodInstance->WantsStructsAttribByVal(resolvedTypeRef)) { mBfIRBuilder->PopulateType(resolvedTypeRef, BfIRPopulateType_Full); BF_ASSERT(resolvedTypeRef->mAlign > 0); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 6720e18e..0326655c 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -820,13 +820,15 @@ bool BfMethodInstance::GetLoweredReturnType(BfTypeCode* loweredTypeCode, BfTypeC return mReturnType->GetLoweredType((mMethodDef->mIsStatic || forceStatic) ? BfTypeUsage_Return_Static : BfTypeUsage_Return_NonStatic, loweredTypeCode, loweredTypeCode2); } -bool BfMethodInstance::WantsStructsAttribByVal() +bool BfMethodInstance::WantsStructsAttribByVal(BfType* paramType) { auto owner = GetOwner(); if ((owner->mModule->mCompiler->mOptions.mPlatformType == BfPlatformType_Windows) && (owner->mModule->mCompiler->mOptions.mMachineType == BfMachineType_x64)) return false; - return true; + + auto typeInst = paramType->ToTypeInstance(); + return (typeInst != NULL) && (typeInst->mIsCRepr); } bool BfMethodInstance::IsSkipCall(bool bypassVirtual) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 77e6cf5f..0d799f89 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -933,7 +933,7 @@ public: int GetStructRetIdx(bool forceStatic = false); bool HasSelf(); bool GetLoweredReturnType(BfTypeCode* loweredTypeCode = NULL, BfTypeCode* loweredTypeCode2 = NULL, bool forceStatic = false); - bool WantsStructsAttribByVal(); + bool WantsStructsAttribByVal(BfType* paramType); bool IsAutocompleteMethod() { /*return mIdHash == -1;*/ return mIsAutocompleteMethod; } bool IsSkipCall(bool bypassVirtual = false); bool IsVarArgs();