1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Improvements to method instance mIsIntrinsic handling

This commit is contained in:
Brian Fiete 2025-02-25 12:57:37 -08:00
parent 1805316b70
commit cfd2bab9fb
3 changed files with 38 additions and 47 deletions

View file

@ -420,6 +420,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
mEnumTypeDef = NULL; mEnumTypeDef = NULL;
mFriendAttributeTypeDef = NULL; mFriendAttributeTypeDef = NULL;
mComptimeAttributeTypeDef = NULL; mComptimeAttributeTypeDef = NULL;
mIntrinsicAttributeTypeDef = NULL;
mConstEvalAttributeTypeDef = NULL; mConstEvalAttributeTypeDef = NULL;
mNoExtensionAttributeTypeDef = NULL; mNoExtensionAttributeTypeDef = NULL;
mCheckedAttributeTypeDef = NULL; mCheckedAttributeTypeDef = NULL;
@ -7275,6 +7276,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute"); mFriendAttributeTypeDef = _GetRequiredType("System.FriendAttribute");
mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute"); mNoStaticCtorAttributeTypeDef = _GetRequiredType("System.NoStaticCtorAttribute");
mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute"); mComptimeAttributeTypeDef = _GetRequiredType("System.ComptimeAttribute");
mIntrinsicAttributeTypeDef = _GetRequiredType("System.IntrinsicAttribute");
mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute"); mConstEvalAttributeTypeDef = _GetRequiredType("System.ConstEvalAttribute");
mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute"); mNoExtensionAttributeTypeDef = _GetRequiredType("System.NoExtensionAttribute");
mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute"); mCheckedAttributeTypeDef = _GetRequiredType("System.CheckedAttribute");

View file

@ -448,6 +448,7 @@ public:
BfTypeDef* mFriendAttributeTypeDef; BfTypeDef* mFriendAttributeTypeDef;
BfTypeDef* mNoStaticCtorAttributeTypeDef; BfTypeDef* mNoStaticCtorAttributeTypeDef;
BfTypeDef* mComptimeAttributeTypeDef; BfTypeDef* mComptimeAttributeTypeDef;
BfTypeDef* mIntrinsicAttributeTypeDef;
BfTypeDef* mConstEvalAttributeTypeDef; BfTypeDef* mConstEvalAttributeTypeDef;
BfTypeDef* mNoExtensionAttributeTypeDef; BfTypeDef* mNoExtensionAttributeTypeDef;
BfTypeDef* mCheckedAttributeTypeDef; BfTypeDef* mCheckedAttributeTypeDef;

View file

@ -8248,6 +8248,9 @@ void BfModule::CheckStaticAccess(BfTypeInstance* typeInstance)
BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure) BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool reportFailure)
{ {
if (!methodInstance->mIsIntrinsic)
return BfIRFunction();
auto methodOwner = methodInstance->GetOwner(); auto methodOwner = methodInstance->GetOwner();
auto methodDef = methodInstance->mMethodDef; auto methodDef = methodInstance->mMethodDef;
auto methodDeclaration = methodDef->GetMethodDeclaration(); auto methodDeclaration = methodDef->GetMethodDeclaration();
@ -8258,61 +8261,43 @@ BfIRFunction BfModule::GetIntrinsic(BfMethodInstance* methodInstance, bool repor
if (methodInstance->GetCustomAttributes() == NULL) if (methodInstance->GetCustomAttributes() == NULL)
return BfIRFunction(); 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); int stringId = constant->mInt32;
if ((typeName == "System.IntrinsicAttribute") && (customAttribute.mCtorArgs.size() > 0)) auto entry = mContext->mStringObjectIdMap[stringId];
String intrinName = entry.mString;
int intrinId = BfIRCodeGen::GetIntrinsicId(intrinName);
if (intrinId != -1)
{ {
methodInstance->mIsIntrinsic = true; if (intrinId == BfIRIntrinsic_Malloc)
auto constant = methodOwner->mConstHolder->GetConstant(customAttribute.mCtorArgs[0]);
String error;
if ((constant != NULL) && (constant->mTypeCode == BfTypeCode_StringId))
{ {
int stringId = constant->mInt32; return GetBuiltInFunc(BfBuiltInFuncType_Malloc);
auto entry = mContext->mStringObjectIdMap[stringId];
String intrinName = entry.mString;
// if (intrinName.StartsWith(":"))
// {
// SizedArray<BfIRType, 2> 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<BfIRType, 2> 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) else if (intrinId == BfIRIntrinsic_Free)
error = "Intrinsic name must be a constant string";
if (reportFailure)
{ {
Fail(error, customAttribute.mRef); return GetBuiltInFunc(BfBuiltInFuncType_Free);
} }
SizedArray<BfIRType, 2> 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(); return BfIRFunction();
} }
@ -24228,6 +24213,9 @@ void BfModule::GetMethodCustomAttributes(BfMethodInstance* methodInstance)
if (customAttributes != NULL) if (customAttributes != NULL)
{ {
if (customAttributes->Contains(mCompiler->mIntrinsicAttributeTypeDef))
methodInstance->mIsIntrinsic = true;
auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef); auto linkNameAttr = customAttributes->Get(mCompiler->mCallingConventionAttributeTypeDef);
if (linkNameAttr != NULL) if (linkNameAttr != NULL)
{ {