From 5c3d0021b1650d3912663b02d304cb93aa4be3d7 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 10 Jun 2020 09:39:16 -0700 Subject: [PATCH] Fixed win x64 lowering issue --- IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 9 +++++++++ IDEHelper/Compiler/BfResolvedTypeUtils.h | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index c22ce4de..63245e35 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4859,7 +4859,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_NoCapture); addDeref = paramType->mSize; } - else + else if (methodInstance->WantsIRStructsByVal()) { 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 c7659705..350ee4eb 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -14469,7 +14469,7 @@ void BfModule::SetupIRMethod(BfMethodInstance* methodInstance, BfIRFunction func PopulateType(resolvedTypeRef, BfPopulateType_Data); addDeref = resolvedTypeRef->mSize; } - else + else if (methodInstance->WantsIRStructsByVal()) { mBfIRBuilder->PopulateType(resolvedTypeRef); mBfIRBuilder->Func_AddAttribute(func, argIdx + 1, BfIRAttribute_ByVal, mSystem->mPtrSize); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 888f5026..83b95f13 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -646,6 +646,15 @@ bool BfMethodInstance::GetLoweredReturnType(BfTypeCode* loweredTypeCode, BfTypeC return mReturnType->GetLoweredType(mMethodDef->mIsStatic ? BfTypeUsage_Return_Static : BfTypeUsage_Return_NonStatic, loweredTypeCode, loweredTypeCode2); } +bool BfMethodInstance::WantsIRStructsByVal() +{ + auto owner = GetOwner(); + if ((owner->mModule->mCompiler->mOptions.mPlatformType == BfPlatformType_Windows) && + (owner->mModule->mCompiler->mOptions.mMachineType == BfMachineType_x64)) + return false; + return true; +} + bool BfMethodInstance::IsSkipCall(bool bypassVirtual) { if ((mMethodDef->mIsSkipCall) && diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 8c9890fc..b66e4170 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -863,6 +863,7 @@ public: int GetStructRetIdx(); bool HasSelf(); bool GetLoweredReturnType(BfTypeCode* loweredTypeCode = NULL, BfTypeCode* loweredTypeCode2 = NULL); + bool WantsIRStructsByVal(); bool IsAutocompleteMethod() { /*return mIdHash == -1;*/ return mIsAutocompleteMethod; } bool IsSkipCall(bool bypassVirtual = false); bool IsVarArgs();