diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 84f7145f..147acd3e 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -633,6 +633,14 @@ void BeIRCodeGen::Read(BeType*& beType) } int typeId = (int)ReadSLEB128(); + + if (typeKind == BfIRType::TypeKind::TypeKind_TypeCode) + { + bool isSigned = false; + beType = GetBeType((BfTypeCode)typeId, isSigned); + return; + } + auto& typeEntry = GetTypeEntry(typeId); if (typeKind == BfIRType::TypeKind::TypeKind_TypeId) beType = typeEntry.mBeType; diff --git a/IDEHelper/Compiler/BfAst.h b/IDEHelper/Compiler/BfAst.h index 6dc9b7d9..0592993b 100644 --- a/IDEHelper/Compiler/BfAst.h +++ b/IDEHelper/Compiler/BfAst.h @@ -2462,6 +2462,13 @@ public: BfTokenNode* mOpenBracket; BfSizedArray mParams; // Either commas or constant size expression BfTokenNode* mCloseBracket; + + bool IsInferredSize() + { + if (mParams.mSize > 0) + return BfNodeIsA(mParams[0]); + return false; + } }; BF_AST_DECL(BfArrayTypeRef, BfElementedTypeRef); class BfNullableTypeRef : public BfElementedTypeRef diff --git a/IDEHelper/Compiler/BfConstResolver.cpp b/IDEHelper/Compiler/BfConstResolver.cpp index 171fb94d..82a506d1 100644 --- a/IDEHelper/Compiler/BfConstResolver.cpp +++ b/IDEHelper/Compiler/BfConstResolver.cpp @@ -66,6 +66,11 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo if (memberRefExpr->mTarget == NULL) arraySize = (int)invocationExpr->mArguments.size(); } + else if (auto indexerExpr = BfNodeDynCast(invocationExpr->mTarget)) + { + // Sized array initializer + arraySize = (int)invocationExpr->mArguments.size(); + } } } @@ -75,7 +80,7 @@ BfTypedValue BfConstResolver::Resolve(BfExpression* expr, BfType* wantType, BfCo return mResult; } else - { + { mResult = BfTypedValue(mModule->mBfIRBuilder->GetUndefConstValue(mModule->mBfIRBuilder->GetPrimitiveType(BfTypeCode_IntPtr)), mModule->GetPrimitiveType(BfTypeCode_IntPtr)); return mResult; } diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index cd9e6df6..408566d6 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -1368,6 +1368,11 @@ String BfIRBuilder::ToString(BfIRType irType) { llvmType = mBfIRCodeGen->GetLLVMType(irType.mId); } + else if (irType.mKind == BfIRType::TypeKind::TypeKind_TypeCode) + { + bool isSigned = false; + llvmType = mBfIRCodeGen->GetLLVMType((BfTypeCode)irType.mId, isSigned); + } else { auto& typeEntry = mBfIRCodeGen->GetTypeEntry(irType.mId); @@ -1400,9 +1405,14 @@ String BfIRBuilder::ToString(BfIRType irType) { beType = mBeIRCodeGen->GetBeType(irType.mId); } + else if (irType.mKind == BfIRType::TypeKind::TypeKind_TypeCode) + { + bool isSigned = false; + beType = mBeIRCodeGen->GetBeType((BfTypeCode)irType.mId, isSigned); + } else { - auto& typeEntry = mBeIRCodeGen->GetTypeEntry(irType.mId); + auto& typeEntry = mBeIRCodeGen->GetTypeEntry(irType.mId); if (irType.mKind == BfIRType::TypeKind::TypeKind_TypeId) beType = typeEntry.mBeType; else if (irType.mKind == BfIRType::TypeKind::TypeKind_TypeInstId) @@ -3469,9 +3479,11 @@ BfIRFunction BfIRBuilder::GetFakeFunction() BfIRType BfIRBuilder::GetPrimitiveType(BfTypeCode typeCode) { FixTypeCode(typeCode); - BfIRType retType = WriteCmd(BfIRCmd_PrimitiveType, typeCode); - NEW_CMD_INSERTED_IRTYPE; - return retType; + + BfIRType irType; + irType.mKind = BfIRTypeData::TypeKind_TypeCode; + irType.mId = (int)typeCode; + return irType; } BfIRType BfIRBuilder::CreateStructType(const StringImpl& name) diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index a3a2e15f..406b9635 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -580,6 +580,7 @@ struct BfIRTypeData { TypeKind_None, TypeKind_TypeId, + TypeKind_TypeCode, TypeKind_TypeInstId, TypeKind_TypeInstPtrId, TypeKind_Stream, @@ -1102,7 +1103,7 @@ public: void Module_SetTargetTriple(const StringImpl& targetTriple); void Module_AddModuleFlag(const StringImpl& flag, int val); - BfIRType GetPrimitiveType(BfTypeCode typeCode); + BfIRType GetPrimitiveType(BfTypeCode typeCode); BfIRType CreateStructType(const StringImpl& name); BfIRType CreateStructType(const BfSizedArray& memberTypes); void StructSetBody(BfIRType type, const BfSizedArray& memberTypes, bool isPacked); diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 277e788e..9f1d8237 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -744,6 +744,14 @@ void BfIRCodeGen::Read(llvm::Type*& llvmType) } int typeId = (int)ReadSLEB128(); + + if (typeKind == BfIRType::TypeKind::TypeKind_TypeCode) + { + bool isSigned = false; + llvmType = GetLLVMType((BfTypeCode)typeId, isSigned); + return; + } + auto& typeEntry = GetTypeEntry(typeId); if (typeKind == BfIRType::TypeKind::TypeKind_TypeId) llvmType = typeEntry.mLLVMType; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5a1fc072..300f7d3e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1134,7 +1134,7 @@ void BfModule::EnsureIRBuilder(bool dbgVerifyCodeGen) // code as we walk the AST //mBfIRBuilder->mDbgVerifyCodeGen = true; if ( - (mModuleName == "System_StringView") + (mModuleName == "-") //|| (mModuleName == "BeefTest2_ClearColorValue") //|| (mModuleName == "Tests_FuncRefs") ) @@ -4078,12 +4078,19 @@ BfTypedValue BfModule::GetFieldInitializerValue(BfFieldInstance* fieldInstance, if (fieldInstance != NULL) MarkFieldInitialized(fieldInstance); - + if ((doStore) && (result)) { - result = LoadValue(result); - if (!result.mType->IsValuelessType()) - mBfIRBuilder->CreateStore(result.mValue, staticVarRef.mValue); + if (fieldInstance->mResolvedType->IsUnknownSizedArray()) + { + AssertErrorState(); + } + else + { + result = LoadValue(result); + if (!result.mType->IsValuelessType()) + mBfIRBuilder->CreateStore(result.mValue, staticVarRef.mValue); + } } return result; @@ -13613,14 +13620,14 @@ void BfModule::DoLocalVariableDebugInfo(BfLocalVariable* localVarDef, bool doAli mBfIRBuilder->PopulateType(localVarDef->mResolvedType); auto constMem = mBfIRBuilder->ConstToMemory(localVarDef->mConstValue); - if (IsTargetingBeefBackend()) - { - diValue = mBfIRBuilder->CreateAliasValue(constMem); - didConstToMem = true; - - diType = mBfIRBuilder->DbgCreateReferenceType(diType); - } - else +// if (IsTargetingBeefBackend()) +// { +// diValue = mBfIRBuilder->CreateAliasValue(constMem); +// didConstToMem = true; +// +// diType = mBfIRBuilder->DbgCreateReferenceType(diType); +// } + //else { isByAddr = true; mBfIRBuilder->SaveDebugLocation(); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 493ed27f..15c8b84d 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2901,7 +2901,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy continue; SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field); - + BfType* resolvedFieldType = NULL; if (field->IsEnumCaseEntry()) @@ -2938,7 +2938,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy // For 'let', make read-only } else - { + { resolvedFieldType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_NoResolveGenericParam); if (resolvedFieldType == NULL) { @@ -2948,6 +2948,29 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } } + if (resolvedFieldType->IsUndefSizedArray()) + { + if (auto arrayTypeRef = BfNodeDynCast(field->mTypeRef)) + { + if (arrayTypeRef->IsInferredSize()) + { + if (field->mInitializer != NULL) + { + DeferredResolveEntry resolveEntry; + resolveEntry.mFieldDef = field; + resolveEntry.mTypeArrayIdx = (int)llvmFieldTypes.size(); + deferredVarResolves.push_back(resolveEntry); + + fieldInstance->mIsInferredType = true; + } + else + { + AssertErrorState(); + } + } + } + } + if (resolvedFieldType->IsMethodRef()) { auto methodRefType = (BfMethodRefType*)resolvedFieldType;