| 18505 | } |
| 18506 | |
| 18507 | void BfModule::SetupIRMethod(BfMethodInstance* methodInstance, BfIRFunction func, bool isInlined) |
| 18508 | { |
| 18509 | BfMethodDef* methodDef = NULL; |
| 18510 | if (methodInstance != NULL) |
| 18511 | methodDef = methodInstance->mMethodDef; |
| 18512 | |
| 18513 | if (!func) |
| 18514 | return; |
| 18515 | |
| 18516 | if (mCompiler->mOptions.mNoFramePointerElim) |
| 18517 | mBfIRBuilder->Func_AddAttribute(func, -1, BFIRAttribute_NoFramePointerElim); |
| 18518 | mBfIRBuilder->Func_AddAttribute(func, -1, BFIRAttribute_NoUnwind); |
| 18519 | if (mSystem->mPtrSize == 8) // We need unwind info for debugging |
| 18520 | mBfIRBuilder->Func_AddAttribute(func, -1, BFIRAttribute_UWTable); |
| 18521 | |
| 18522 | if (methodInstance == NULL) |
| 18523 | return; |
| 18524 | |
| 18525 | if (methodInstance->mReturnType->IsVar()) |
| 18526 | mBfIRBuilder->Func_AddAttribute(func, -1, BfIRAttribute_VarRet); |
| 18527 | if (methodDef->mImportKind == BfImportKind_Export) |
| 18528 | { |
| 18529 | if (methodDef->mDeclaringType->mProject->mTargetType != BfTargetType_BeefLib_StaticLib) |
| 18530 | mBfIRBuilder->Func_AddAttribute(func, -1, BFIRAttribute_DllExport); |
| 18531 | } |
| 18532 | if (methodDef->mIsNoReturn) |
| 18533 | mBfIRBuilder->Func_AddAttribute(func, -1, BfIRAttribute_NoReturn); |
| 18534 | auto callingConv = GetIRCallingConvention(methodInstance); |
| 18535 | if (callingConv != BfIRCallingConv_CDecl) |
| 18536 | mBfIRBuilder->SetFuncCallingConv(func, callingConv); |
| 18537 | |
| 18538 | if (isInlined) |
| 18539 | { |
| 18540 | mBfIRBuilder->Func_AddAttribute(func, -1, BFIRAttribute_AlwaysInline); |
| 18541 | } |
| 18542 | |
| 18543 | int argIdx = 0; |
| 18544 | int paramIdx = 0; |
| 18545 | |
| 18546 | if ((methodInstance->HasThis()) && (!methodDef->mHasExplicitThis)) |
| 18547 | paramIdx = -1; |
| 18548 | |
| 18549 | int argCount = methodInstance->GetIRFunctionParamCount(this); |
| 18550 | |
| 18551 | while (argIdx < argCount) |
| 18552 | { |
| 18553 | if ((!mIsComptimeModule) && (argIdx == methodInstance->GetStructRetIdx())) |
| 18554 | { |
| 18555 | mBfIRBuilder->Func_AddAttribute(func, argIdx + 1, BfIRAttribute_NoAlias); |
| 18556 | mBfIRBuilder->Func_AddAttribute(func, argIdx + 1, BfIRAttribute_StructRet); |
| 18557 | argIdx++; |
| 18558 | continue; |
| 18559 | } |
| 18560 | |
| 18561 | bool isThis = (paramIdx == -1) || ((methodDef->mHasExplicitThis) && (paramIdx == 0)); |
| 18562 | while ((!isThis) && (methodInstance->IsParamSkipped(paramIdx))) |
| 18563 | paramIdx++; |
| 18564 |
no test coverage detected