diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 566a96bb..b1eb70b1 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -6368,7 +6368,7 @@ void BfExprEvaluator::SplatArgs(BfTypedValue value, SizedArrayImpl& i checkTypeLambda(value); } -void BfExprEvaluator::PushArg(BfTypedValue argVal, SizedArrayImpl& irArgs, bool disableSplat, bool disableLowering, bool isIntrinsic) +void BfExprEvaluator::PushArg(BfTypedValue argVal, SizedArrayImpl& irArgs, bool disableSplat, bool disableLowering, bool isIntrinsic, bool createCompositeCopy) { MakeBaseConcrete(argVal); @@ -6441,7 +6441,15 @@ void BfExprEvaluator::PushArg(BfTypedValue argVal, SizedArrayImpl& ir return; } - } + } + + if ((createCompositeCopy) && (!argVal.IsTempAddr())) + { + // Non-Beef calling conventions require copies of composites + auto copyAddr = mModule->CreateAlloca(argVal.mType); + mModule->mBfIRBuilder->CreateStore(mModule->LoadValue(argVal).mValue, copyAddr); + argVal = BfTypedValue(copyAddr, argVal.mType, BfTypedValueKind_TempAddr); + } } else argVal = mModule->LoadValue(argVal); @@ -7488,13 +7496,13 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu } if (argValue) - { + { if (isThis) PushThis(targetSrc, argValue, methodInstance, irArgs); else if (wantsSplat) - SplatArgs(argValue, irArgs); + SplatArgs(argValue, irArgs); else - PushArg(argValue, irArgs, true, false, methodInstance->mIsIntrinsic); + PushArg(argValue, irArgs, true, false, methodInstance->mIsIntrinsic, methodInstance->mCallingConvention != BfCallingConvention_Unspecified); } paramIdx++; } diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index 50620b48..50a8dbce 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -456,7 +456,7 @@ public: BfTypedValue CreateCall(BfMethodMatcher* methodMatcher, BfTypedValue target); void MakeBaseConcrete(BfTypedValue& typedValue); void SplatArgs(BfTypedValue value, SizedArrayImpl& irArgs); - void PushArg(BfTypedValue argVal, SizedArrayImpl& irArgs, bool disableSplat = false, bool disableLowering = false, bool isIntrinsic = false); + void PushArg(BfTypedValue argVal, SizedArrayImpl& irArgs, bool disableSplat = false, bool disableLowering = false, bool isIntrinsic = false, bool createCompositeCopy = false); void PushThis(BfAstNode* targetSrc, BfTypedValue callTarget, BfMethodInstance* methodInstance, SizedArrayImpl& irArgs, bool skipMutCheck = false); BfTypedValue MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType, BfResolvedArgs& argValues, bool callCtorBodyOnly, bool allowAppendAlloc, BfTypedValue* appendIndexValue = NULL); diff --git a/IDEHelper/Compiler/BfMangler.cpp b/IDEHelper/Compiler/BfMangler.cpp index 3dc75548..c3330d71 100644 --- a/IDEHelper/Compiler/BfMangler.cpp +++ b/IDEHelper/Compiler/BfMangler.cpp @@ -314,6 +314,12 @@ void BfGNUMangler::MangleTypeInst(MangleContext& mangleContext, StringImpl& name typeVec.push_back(BfNodeDynCast(methodDef->mReturnTypeRef)->mType); if (methodDef->mIsMutating) name += "_mut_"; + if (delegateInfo->mCallingConvention == BfCallingConvention_Cdecl) + name += "_cdecl_"; + else if (delegateInfo->mCallingConvention == BfCallingConvention_Stdcall) + name += "_stdcall_"; + else if (delegateInfo->mCallingConvention == BfCallingConvention_Fastcall) + name += "_fastcall_"; for (int paramIdx = 0; paramIdx < (int)methodDef->mParams.size(); paramIdx++) { name += "_"; @@ -1227,7 +1233,7 @@ bool BfMSMangler::FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& BF_ASSERT(newNameSub.mTypeInst->mTypeDef->mMethods[0]->mName == "Invoke"); auto delegateInfo = newNameSub.mTypeInst->GetDelegateInfo(); - + auto methodDef = newNameSub.mTypeInst->mTypeDef->mMethods[0]; if (newNameSub.mTypeInst->IsDelegate()) name += "?$delegate"; @@ -1235,6 +1241,13 @@ bool BfMSMangler::FindOrCreateNameSub(MangleContext& mangleContext, StringImpl& name += "?$function"; if (methodDef->mIsMutating) name += "_mut_"; + if (delegateInfo->mCallingConvention == BfCallingConvention_Cdecl) + name += "_cdecl_"; + else if (delegateInfo->mCallingConvention == BfCallingConvention_Stdcall) + name += "_stdcall_"; + else if (delegateInfo->mCallingConvention == BfCallingConvention_Fastcall) + name += "_fastcall_"; + SizedArray typeVec; typeVec.push_back(BfNodeDynCast(methodDef->mReturnTypeRef)->mType);