Bläddra i källkod

Fixed win x64 lowering issue

Brian Fiete 5 år sedan
förälder
incheckning
5c3d0021b1

+ 1 - 1
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -4859,7 +4859,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
 							mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_NoCapture);
 							mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_NoCapture);
 							addDeref = paramType->mSize;
 							addDeref = paramType->mSize;
 						}
 						}
-						else
+						else if (methodInstance->WantsIRStructsByVal())
 						{
 						{
 							mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_ByVal, mModule->mSystem->mPtrSize);
 							mModule->mBfIRBuilder->Call_AddAttribute(callInst, argIdx + 1, BfIRAttribute_ByVal, mModule->mSystem->mPtrSize);
 						}
 						}

+ 1 - 1
IDEHelper/Compiler/BfModule.cpp

@@ -14469,7 +14469,7 @@ void BfModule::SetupIRMethod(BfMethodInstance* methodInstance, BfIRFunction func
 					PopulateType(resolvedTypeRef, BfPopulateType_Data);
 					PopulateType(resolvedTypeRef, BfPopulateType_Data);
 					addDeref = resolvedTypeRef->mSize;
 					addDeref = resolvedTypeRef->mSize;
 				}
 				}
-				else
+				else if (methodInstance->WantsIRStructsByVal())
 				{
 				{
 					mBfIRBuilder->PopulateType(resolvedTypeRef);
 					mBfIRBuilder->PopulateType(resolvedTypeRef);
 					mBfIRBuilder->Func_AddAttribute(func, argIdx + 1, BfIRAttribute_ByVal, mSystem->mPtrSize);
 					mBfIRBuilder->Func_AddAttribute(func, argIdx + 1, BfIRAttribute_ByVal, mSystem->mPtrSize);

+ 9 - 0
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);	
 	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)
 bool BfMethodInstance::IsSkipCall(bool bypassVirtual)
 {	
 {	
 	if ((mMethodDef->mIsSkipCall) && 
 	if ((mMethodDef->mIsSkipCall) && 

+ 1 - 0
IDEHelper/Compiler/BfResolvedTypeUtils.h

@@ -863,6 +863,7 @@ public:
 	int GetStructRetIdx();
 	int GetStructRetIdx();
 	bool HasSelf();
 	bool HasSelf();
 	bool GetLoweredReturnType(BfTypeCode* loweredTypeCode = NULL, BfTypeCode* loweredTypeCode2 = NULL);
 	bool GetLoweredReturnType(BfTypeCode* loweredTypeCode = NULL, BfTypeCode* loweredTypeCode2 = NULL);
+	bool WantsIRStructsByVal();
 	bool IsAutocompleteMethod() { /*return mIdHash == -1;*/ return mIsAutocompleteMethod; }
 	bool IsAutocompleteMethod() { /*return mIdHash == -1;*/ return mIsAutocompleteMethod; }
 	bool IsSkipCall(bool bypassVirtual = false);	
 	bool IsSkipCall(bool bypassVirtual = false);	
 	bool IsVarArgs();
 	bool IsVarArgs();