diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index e7c3362d..d35140bc 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -420,6 +420,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly) mEnumTypeDef = NULL; mFriendAttributeTypeDef = NULL; mComptimeAttributeTypeDef = NULL; + mIntrinsicAttributeTypeDef = NULL; mConstEvalAttributeTypeDef = NULL; mNoExtensionAttributeTypeDef = NULL; mCheckedAttributeTypeDef = NULL; @@ -7275,6 +7276,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute"); mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute"); mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute"); + mIntrinsicAttributeTypeDef = _GetRequiredType("System.IntrinsicAttribute"); mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute"); mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute"); mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute"); diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index c4288e96..4a0974fd 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -448,6 +448,7 @@ public: BfTypeDef* mFriendAttributeTypeDef; BfTypeDef* mNoStaticCtorAttributeTypeDef; BfTypeDef* mComptimeAttributeTypeDef; + BfTypeDef* mIntrinsicAttributeTypeDef; BfTypeDef* mConstEvalAttributeTypeDef; BfTypeDef* mNoExtensionAttributeTypeDef; BfTypeDef* mCheckedAttributeTypeDef; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5606b46a..e5eef52e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -8248,6 +8248,9 @@ void BfModule::CheckStaticAccess(BfTypeInstance* typeInstance) BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure) { + if (!methodInstance->mIsIntrinsic) + return BfIRFunction(); + auto methodOwner = methodInstance->GetOwner(); auto methodDef = methodInstance->mMethodDef; auto methodDeclaration = methodDef->GetMethodDeclaration(); @@ -8258,61 +8261,43 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor if (methodInstance->GetCustomAttributes() == NULL) return BfIRFunction(); - for (auto& customAttribute : methodInstance->GetCustomAttributes()->mAttributes) + auto customAttribute = methodInstance->GetCustomAttributes()->Get(mCompiler->mIntrinsicAttributeTypeDef); + auto constant = methodOwner->mConstHolder->GetConstant(customAttribute->mCtorArgs[0]); + String error; + + if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId)) { - String typeName = TypeToString(customAttribute.mType); - if ((typeName == "System.IntrinsicAttribute") && (customAttribute.mCtorArgs.size() > 0)) + int stringId = constant->mInt32; + auto entry = mContext->mStringObjectIdMap[stringId]; + String intrinName = entry.mString; + + int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName); + if (intrinId != -1) { - methodInstance->mIsIntrinsic = true; - - auto constant = methodOwner->mConstHolder->GetConstant(customAttribute.mCtorArgs[0]); - String error; - - if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId)) + if (intrinId == BfIRIntrinsic_Malloc) { - int stringId = constant->mInt32; - auto entry = mContext->mStringObjectIdMap[stringId]; - String intrinName = entry.mString; - -// if (intrinName.StartsWith(":")) -// { -// SizedArray paramTypes; -// for (auto& param : methodInstance->mParams) -// paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType)); -// return mBfIRBuilder->GetIntrinsic(intrinName.Substring(1), mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes); -// } -// else - { - int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName); - if (intrinId != -1) - { - if (intrinId == BfIRIntrinsic_Malloc) - { - return GetBuiltInFunc(BfBuiltInFuncType_Malloc); - } - else if (intrinId == BfIRIntrinsic_Free) - { - return GetBuiltInFunc(BfBuiltInFuncType_Free); - } - - SizedArray paramTypes; - for (auto& param : methodInstance->mParams) - paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType)); - return mBfIRBuilder->GetIntrinsic(intrinName, intrinId, mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes); - } - else if (reportFailure) - error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str()); - } + return GetBuiltInFunc(BfBuiltInFuncType_Malloc); } - else if (reportFailure) - error = "Intrinsic name must be a constant string"; - - if (reportFailure) + else if (intrinId == BfIRIntrinsic_Free) { - Fail(error, customAttribute.mRef); + return GetBuiltInFunc(BfBuiltInFuncType_Free); } + + SizedArray paramTypes; + for (auto& param : methodInstance->mParams) + paramTypes.push_back(mBfIRBuilder->MapType(param.mResolvedType)); + return mBfIRBuilder->GetIntrinsic(intrinName, intrinId, mBfIRBuilder->MapType(methodInstance->mReturnType), paramTypes); } + else if (reportFailure) + error = StrFormat("Unable to find intrinsic '%s'", entry.mString.c_str()); } + else if (reportFailure) + error = "Intrinsic name must be a constant string"; + + if (reportFailure) + { + Fail(error, customAttribute->mRef); + } return BfIRFunction(); } @@ -24228,6 +24213,9 @@ void BfModule::GetMethodCustomAttributes(BfMethodInstance* methodInstance) if (customAttributes != NULL) { + if (customAttributes->Contains(mCompiler->mIntrinsicAttributeTypeDef)) + methodInstance->mIsIntrinsic = true; + auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef); if (linkNameAttr != NULL) {