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

572 lines
16 KiB
C
Raw Normal View History

2019-08-23 11:56:54 -07:00
#pragma once
#pragma warning(push)
#pragma warning(disable:4141)
#pragma warning(disable:4146)
#pragma warning(disable:4291)
#pragma warning(disable:4244)
#pragma warning(disable:4267)
#pragma warning(disable:4624)
#pragma warning(disable:4800)
#include "BeefySysLib/Common.h"
#include "BeefySysLib/util/CritSect.h"
#include "BeefySysLib/util/PerfTimer.h"
#include "BeefySysLib/util/String.h"
#include "BfAst.h"
#include "BfSystem.h"
2024-05-01 06:26:14 -04:00
/*#include "llvm/Support/Compiler.h"
2019-08-23 11:56:54 -07:00
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/Argument.h"
2024-05-01 06:26:14 -04:00
#include "llvm/IR/Constants.h"*/
2019-08-23 11:56:54 -07:00
#include "BfResolvedTypeUtils.h"
#include <unordered_set>
#include "BfContext.h"
#include "BfCodeGen.h"
#include "BfMangler.h"
#pragma warning(pop)
NS_BF_BEGIN
class BfType;
class BfResolvedType;
class BfTypeInstance;
class BfModule;
class BfFileInstance;
class BfAutoComplete;
class BfMethodInstance;
class BfSourceClassifier;
class BfResolvePassData;
class CeMachine;
2019-08-23 11:56:54 -07:00
enum BfCompileOnDemandKind
{
BfCompileOnDemandKind_AlwaysInclude,
BfCompileOnDemandKind_ResolveUnused,
BfCompileOnDemandKind_SkipUnused
};
2022-07-26 13:27:03 -04:00
class BfCompiler
2019-08-23 11:56:54 -07:00
{
public:
enum CompileState
{
CompileState_None,
CompileState_Normal,
CompileState_Unreified,
CompileState_VData,
CompileState_Cleanup
2019-08-23 11:56:54 -07:00
};
struct Stats
2022-07-26 13:27:03 -04:00
{
2019-08-23 11:56:54 -07:00
int mTotalTypes;
int mMethodDeclarations;
int mTypesPopulated;
int mMethodsProcessed;
2022-07-26 13:27:03 -04:00
int mUnreifiedMethodsProcessed;
2019-08-23 11:56:54 -07:00
int mQueuedTypesProcessed;
int mTypesQueued;
int mTypesDeleted;
int mTypesDeleted_LastUpdateAfterDeletingTypes;
2022-07-26 13:27:03 -04:00
int mMethodsQueued;
2019-08-23 11:56:54 -07:00
int mModulesStarted;
int mModulesFinished;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
int mModulesReified;
int mModulesUnreified;
int mReifiedModuleCount;
int mIRBytes;
int mConstBytes;
int mMidCompileRebuilds;
2019-08-23 11:56:54 -07:00
};
Stats mStats;
struct Options
{
BfProject* mHotProject;
int mHotCompileIdx;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
int32 mForceRebuildIdx;
2022-07-26 13:27:03 -04:00
BfCompileOnDemandKind mCompileOnDemandKind;
String mTargetTriple;
2022-01-25 07:04:54 -05:00
String mTargetCPU;
BfPlatformType mPlatformType;
2019-08-23 11:56:54 -07:00
BfMachineType mMachineType;
int mCLongSize;
2019-08-23 11:56:54 -07:00
BfToolsetType mToolsetType;
2022-07-26 13:27:03 -04:00
BfSIMDSetting mSIMDSetting;
2019-08-23 11:56:54 -07:00
String mMallocLinkName;
String mFreeLinkName;
2022-07-26 13:27:03 -04:00
bool mIncrementalBuild;
2019-08-23 11:56:54 -07:00
bool mEmitDebugInfo;
bool mEmitLineInfo;
bool mNoFramePointerElim;
bool mInitLocalVariables;
bool mRuntimeChecks;
bool mAllowStructByVal;
bool mEmitDynamicCastCheck;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
bool mAllowHotSwapping;
2022-07-26 13:27:03 -04:00
bool mObjectHasDebugFlags;
2019-08-23 11:56:54 -07:00
bool mEnableRealtimeLeakCheck;
2022-01-11 08:17:09 -05:00
bool mEmitObjectAccessCheck; // Only valid with mObjectHasDebugFlags
bool mArithmeticChecks;
2019-08-23 11:56:54 -07:00
bool mEnableCustodian;
bool mEnableSideStack;
2022-07-26 13:27:03 -04:00
bool mHasVDataExtender;
2019-08-23 11:56:54 -07:00
bool mDebugAlloc;
bool mOmitDebugHelpers;
2019-08-23 11:56:54 -07:00
bool mUseDebugBackingParams;
2019-08-23 11:56:54 -07:00
bool mWriteIR;
bool mGenerateObj;
bool mGenerateBitcode;
2019-08-23 11:56:54 -07:00
int mAllocStackCount;
bool mExtraResolveChecks;
int mMaxSplatRegs;
String mErrorString;
Options()
{
mMallocLinkName = "malloc";
mFreeLinkName = "free";
mHotCompileIdx = 0;
mForceRebuildIdx = 0;
mCompileOnDemandKind = BfCompileOnDemandKind_AlwaysInclude;
mPlatformType = BfPlatformType_Unknown;
2019-08-23 11:56:54 -07:00
mMachineType = BfMachineType_x86;
mCLongSize = 4;
2019-08-23 11:56:54 -07:00
mToolsetType = BfToolsetType_Microsoft;
mSIMDSetting = BfSIMDSetting_None;
mHotProject = NULL;
mDebugAlloc = false;
mOmitDebugHelpers = false;
2019-08-23 11:56:54 -07:00
mIncrementalBuild = true;
mEmitDebugInfo = false;
mEmitLineInfo = false;
mNoFramePointerElim = true;
mInitLocalVariables = false;
mRuntimeChecks = true;
mAllowStructByVal = false;
mEmitDynamicCastCheck = true;
mAllowHotSwapping = false;
mEmitObjectAccessCheck = false;
2022-01-11 08:17:09 -05:00
mArithmeticChecks = false;
2022-07-26 13:27:03 -04:00
mObjectHasDebugFlags = false;
2019-08-23 11:56:54 -07:00
mEnableRealtimeLeakCheck = false;
mWriteIR = false;
mGenerateObj = true;
mGenerateBitcode = false;
2019-08-23 11:56:54 -07:00
mEnableCustodian = false;
mEnableSideStack = false;
mHasVDataExtender = false;
mUseDebugBackingParams = true;
mAllocStackCount = 1;
mExtraResolveChecks = false;
2019-08-23 11:56:54 -07:00
#ifdef _DEBUG
mExtraResolveChecks = false;
2019-08-23 11:56:54 -07:00
#endif
mMaxSplatRegs = 4;
}
bool IsCodeView()
{
#ifdef BF_PLATFORM_WINDOWS
return mToolsetType != BfToolsetType_GNU;
#else
return false;
#endif
}
};
Options mOptions;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
enum HotTypeFlags
{
HotTypeFlag_None = 0,
HotTypeFlag_UserNotUsed = 1,
2022-07-26 13:27:03 -04:00
HotTypeFlag_UserUsed = 2,
2019-08-23 11:56:54 -07:00
HotTypeFlag_Heap = 4,
HotTypeFlag_ActiveFunction = 8, // Only set for a type version mismatch
HotTypeFlag_Delegate = 0x10, // Only set for a type version mismatch
HotTypeFlag_FuncPtr = 0x20, // Only set for a type version mismatch
HotTypeFlag_CanAllocate = 0x40
2022-07-26 13:27:03 -04:00
};
2019-08-23 11:56:54 -07:00
enum HotResolveFlags
{
HotResolveFlag_None = 0,
HotResolveFlag_HadDataChanges = 1
};
struct HotReachableData
{
HotTypeFlags mTypeFlags;
bool mHadNonDevirtualizedCall;
HotReachableData()
{
mTypeFlags = HotTypeFlag_None;
mHadNonDevirtualizedCall = false;
}
};
class HotResolveData
{
public:
HotResolveFlags mFlags;
Dictionary<BfHotMethod*, HotReachableData> mReachableMethods;
HashSet<BfHotMethod*> mActiveMethods;
Dictionary<BfHotTypeVersion*, HotTypeFlags> mHotTypeFlags;
Array<HotTypeFlags> mHotTypeIdFlags;
Array<BfHotDepData*> mReasons;
HashSet<BfHotMethod*> mDeferredThisCheckMethods;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
~HotResolveData();
};
class HotData
{
public:
BfCompiler* mCompiler;
Dictionary<String, BfHotMethod*> mMethodMap;
Dictionary<BfHotMethod*, String*> mMethodNameMap;
2019-08-23 11:56:54 -07:00
Dictionary<BfHotTypeVersion*, BfHotThisType*> mThisType;
Dictionary<BfHotTypeVersion*, BfHotAllocation*> mAllocation;
Dictionary<BfHotMethod*, BfHotDevirtualizedMethod*> mDevirtualizedMethods;
Dictionary<BfHotMethod*, BfHotFunctionReference*> mFuncPtrs;
Dictionary<BfHotMethod*, BfHotVirtualDeclaration*> mVirtualDecls;
Dictionary<BfHotMethod*, BfHotInnerMethod*> mInnerMethods;
public:
~HotData();
void ClearUnused(bool isHotCompile);
BfHotThisType* GetThisType(BfHotTypeVersion* hotVersion);
BfHotAllocation* GetAllocation(BfHotTypeVersion* hotVersion);
BfHotDevirtualizedMethod* GetDevirtualizedMethod(BfHotMethod* hotMethod);
2022-07-26 13:27:03 -04:00
BfHotFunctionReference* GetFunctionReference(BfHotMethod* hotMethod);
2019-08-23 11:56:54 -07:00
BfHotVirtualDeclaration* GetVirtualDeclaration(BfHotMethod* hotMethod);
BfHotInnerMethod* GetInnerMethod(BfHotMethod* hotMethod);
};
class HotState
{
public:
BfProject* mHotProject;
2022-07-26 13:27:03 -04:00
int mLastStringId;
2019-08-23 11:56:54 -07:00
int mCommittedHotCompileIdx;
bool mHasNewTypes;
2022-07-26 13:27:03 -04:00
bool mHasNewInterfaceTypes;
2019-08-23 11:56:54 -07:00
Array<BfCodeGenFileEntry> mQueuedOutFiles; // Queues up when we have failed hot compiles
HashSet<int> mSlotDefineTypeIds;
HashSet<int> mNewlySlottedTypeIds;
HashSet<int> mPendingDataChanges;
HashSet<int> mPendingFailedSlottings;
Dictionary<String, int> mDeletedTypeNameMap;
Val128 mVDataHashEx;
public:
HotState()
2022-07-26 13:27:03 -04:00
{
2019-08-23 11:56:54 -07:00
mHotProject = NULL;
mLastStringId = -1;
mCommittedHotCompileIdx = 0;
mHasNewTypes = false;
mHasNewInterfaceTypes = false;
}
~HotState();
bool HasPendingChanges(BfTypeInstance* type);
void RemovePendingChanges(BfTypeInstance* type);
};
HotData* mHotData;
2022-07-26 13:27:03 -04:00
HotState* mHotState;
2019-08-23 11:56:54 -07:00
HotResolveData* mHotResolveData;
struct StringValueEntry
{
int mId;
BfIRValue mStringVal;
2022-07-26 13:27:03 -04:00
};
2019-08-23 11:56:54 -07:00
struct TestMethod
{
String mName;
BfMethodInstance* mMethodInstance;
2022-07-26 13:27:03 -04:00
};
2022-07-26 13:27:03 -04:00
public:
BfPassInstance* mPassInstance;
2019-08-23 11:56:54 -07:00
FILE* mCompileLogFP;
2022-03-15 16:33:30 -07:00
CeMachine* mCeMachine;
2022-01-13 11:40:14 -05:00
int mCurCEExecuteId;
2022-07-26 13:27:03 -04:00
BfSystem* mSystem;
2019-08-23 11:56:54 -07:00
bool mIsResolveOnly;
BfResolvePassData* mResolvePassData;
Dictionary<String, Array<int>> mAttributeTypeOptionMap;
int mRevision;
int64 mUniqueId;
2019-08-23 11:56:54 -07:00
bool mLastRevisionAborted;
BfContext* mContext;
BfCodeGen mCodeGen;
String mOutputDirectory;
int mLastMidCompileRefreshRevision;
2019-08-23 11:56:54 -07:00
bool mCanceling;
2021-02-25 10:14:22 -08:00
bool mHasRequiredTypes;
2021-02-01 05:21:41 -08:00
bool mNeedsFullRefresh;
bool mFastFinish;
bool mExtraCompileRequested;
bool mHasQueuedTypeRebuilds; // Infers we had a fast finish that requires a type rebuild
2019-08-23 11:56:54 -07:00
bool mHadCancel;
2021-12-20 09:52:29 -05:00
bool mWantsDeferMethodDecls;
bool mLastHadComptimeRebuilds;
bool mHasComptimeRebuilds;
2019-08-23 11:56:54 -07:00
bool mInInvalidState;
bool mDepsMayHaveDeletedTypes;
2019-08-23 11:56:54 -07:00
float mCompletionPct;
int mHSPreserveIdx;
2022-07-26 13:27:03 -04:00
BfModule* mLastAutocompleteModule;
2019-08-23 11:56:54 -07:00
CompileState mCompileState;
HashSet<String> mRebuildFileSet;
HashSet<String> mRebuildChangedFileSet; // Files we had actual changes from
2019-08-23 11:56:54 -07:00
2022-07-26 13:27:03 -04:00
Array<BfVDataModule*> mVDataModules;
2020-12-19 14:19:33 -08:00
BfTypeDef* mBfObjectTypeDef;
2021-01-26 06:33:23 -08:00
BfTypeDef* mChar32TypeDef;
2022-02-13 10:41:34 -05:00
BfTypeDef* mFloatTypeDef;
2021-01-26 06:33:23 -08:00
BfTypeDef* mDoubleTypeDef;
BfTypeDef* mMathTypeDef;
2020-12-19 14:19:33 -08:00
2019-08-23 11:56:54 -07:00
BfTypeDef* mArray1TypeDef;
BfTypeDef* mArray2TypeDef;
BfTypeDef* mArray3TypeDef;
BfTypeDef* mArray4TypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mSpanTypeDef;
BfTypeDef* mRangeTypeDef;
BfTypeDef* mClosedRangeTypeDef;
2021-10-24 08:12:18 -07:00
BfTypeDef* mIndexTypeDef;
BfTypeDef* mIndexRangeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mClassVDataTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mDbgRawAllocDataTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mDeferredCallTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mDelegateTypeDef;
2021-02-25 10:14:22 -08:00
BfTypeDef* mFunctionTypeDef;
BfTypeDef* mActionTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mEnumTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mStringTypeDef;
BfTypeDef* mStringViewTypeDef;
BfTypeDef* mTypeTypeDeclDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mTypeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mValueTypeTypeDef;
BfTypeDef* mTupleTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mResultTypeDef;
BfTypeDef* mGCTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mGenericIEnumerableTypeDef;
BfTypeDef* mGenericIEnumeratorTypeDef;
BfTypeDef* mGenericIRefEnumeratorTypeDef;
2022-07-26 13:27:03 -04:00
2020-12-23 08:53:38 -08:00
BfTypeDef* mThreadTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mInternalTypeDef;
2021-01-26 06:33:23 -08:00
BfTypeDef* mPlatformTypeDef;
BfTypeDef* mCompilerTypeDef;
2021-12-11 09:08:42 -08:00
BfTypeDef* mCompilerGeneratorTypeDef;
2020-12-17 04:51:05 -08:00
BfTypeDef* mDiagnosticsDebugTypeDef;
BfTypeDef* mIDisposableTypeDef;
BfTypeDef* mIIntegerTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mIPrintableTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mIHashableTypeDef;
BfTypeDef* mIComptimeTypeApply;
2022-07-26 13:27:03 -04:00
BfTypeDef* mIComptimeMethodApply;
BfTypeDef* mIOnTypeInitTypeDef;
BfTypeDef* mIOnTypeDoneTypeDef;
BfTypeDef* mIOnFieldInitTypeDef;
BfTypeDef* mIOnMethodInitTypeDef;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
BfTypeDef* mMethodRefTypeDef;
BfTypeDef* mNullableTypeDef;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
BfTypeDef* mPointerTTypeDef;
BfTypeDef* mPointerTypeDef;
2021-01-16 12:35:51 -08:00
BfTypeDef* mReflectTypeIdTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mReflectArrayType;
BfTypeDef* mReflectGenericParamType;
2019-08-23 11:56:54 -07:00
BfTypeDef* mReflectFieldDataDef;
BfTypeDef* mReflectFieldSplatDataDef;
BfTypeDef* mReflectMethodDataDef;
BfTypeDef* mReflectParamDataDef;
BfTypeDef* mReflectInterfaceDataDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mReflectPointerType;
BfTypeDef* mReflectRefType;
2019-08-23 11:56:54 -07:00
BfTypeDef* mReflectSizedArrayType;
2021-12-30 08:38:37 -05:00
BfTypeDef* mReflectConstExprType;
2019-08-23 11:56:54 -07:00
BfTypeDef* mReflectSpecializedGenericType;
BfTypeDef* mReflectTypeInstanceTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mReflectUnspecializedGenericType;
BfTypeDef* mReflectFieldInfoTypeDef;
BfTypeDef* mReflectMethodInfoTypeDef;
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
BfTypeDef* mSizedArrayTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mAttributeTypeDef;
BfTypeDef* mAttributeUsageAttributeTypeDef;
BfTypeDef* mLinkNameAttributeTypeDef;
BfTypeDef* mCallingConventionAttributeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mOrderedAttributeTypeDef;
BfTypeDef* mInlineAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mCLinkAttributeTypeDef;
BfTypeDef* mImportAttributeTypeDef;
2020-09-21 23:38:50 -07:00
BfTypeDef* mExportAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mCReprAttributeTypeDef;
2020-08-23 05:42:42 -07:00
BfTypeDef* mUnderlyingArrayAttributeTypeDef;
BfTypeDef* mAlignAttributeTypeDef;
2019-12-25 16:38:17 -08:00
BfTypeDef* mAllowDuplicatesAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mNoDiscardAttributeTypeDef;
BfTypeDef* mDisableChecksAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mDisableObjectAccessChecksAttributeTypeDef;
BfTypeDef* mFriendAttributeTypeDef;
BfTypeDef* mNoStaticCtorAttributeTypeDef;
BfTypeDef* mComptimeAttributeTypeDef;
BfTypeDef* mIntrinsicAttributeTypeDef;
2020-12-23 08:53:38 -08:00
BfTypeDef* mConstEvalAttributeTypeDef;
BfTypeDef* mNoExtensionAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mCheckedAttributeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mUncheckedAttributeTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mStaticInitAfterAttributeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mStaticInitPriorityAttributeTypeDef;
2019-08-23 11:56:54 -07:00
BfTypeDef* mTestAttributeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mThreadStaticAttributeTypeDef;
2019-10-09 16:16:01 -07:00
BfTypeDef* mUnboundAttributeTypeDef;
BfTypeDef* mObsoleteAttributeTypeDef;
BfTypeDef* mErrorAttributeTypeDef;
BfTypeDef* mWarnAttributeTypeDef;
BfTypeDef* mConstSkipAttributeTypeDef;
2020-08-16 08:33:51 -07:00
BfTypeDef* mIgnoreErrorsAttributeTypeDef;
2022-07-26 13:27:03 -04:00
BfTypeDef* mReflectAttributeTypeDef;
BfTypeDef* mOnCompileAttributeTypeDef;
2019-08-23 11:56:54 -07:00
2022-07-26 13:27:03 -04:00
int mCurTypeId;
2019-08-23 11:56:54 -07:00
int mTypeInitCount;
2020-12-24 07:45:58 -08:00
String mOutputPath;
2022-07-26 13:27:03 -04:00
Array<BfType*> mGenericInstancePurgatory;
2019-08-23 11:56:54 -07:00
Array<int> mTypeIdFreeList;
int mMaxInterfaceSlots;
bool mInterfaceSlotCountChanged;
2022-07-26 13:27:03 -04:00
public:
2019-08-23 11:56:54 -07:00
bool IsTypeAccessible(BfType* checkType, BfProject* curProject);
bool IsTypeUsed(BfType* checkType, BfProject* curProject);
bool IsModuleAccessible(BfModule* module, BfProject* curProject);
void FixVDataHash(BfModule* bfModule);
void CheckModuleStringRefs(BfModule* module, BfVDataModule* vdataModule, int lastModuleRevision, HashSet<int>& foundStringIds, HashSet<int>& dllNameSet, Array<BfMethodInstance*>& dllMethods, Array<BfCompiler::StringValueEntry>& stringValueEntries);
void HashModuleVData(BfModule* module, HashContext& hash);
BfIRFunction CreateLoadSharedLibraries(BfVDataModule* bfModule, Array<BfMethodInstance*>& dllMethods);
void GetTestMethods(BfVDataModule* bfModule, Array<TestMethod>& testMethods, HashContext& vdataHashCtx);
void EmitTestMethod(BfVDataModule* bfModule, Array<TestMethod>& testMethods, BfIRValue& retValue);
2022-07-26 13:27:03 -04:00
void CreateVData(BfVDataModule* bfModule);
2019-08-23 11:56:54 -07:00
void UpdateDependencyMap(bool deleteUnusued, bool& didWork);
void SanitizeDependencyMap();
bool ProcessPurgatory(bool reifiedOnly);
2019-08-23 11:56:54 -07:00
bool VerifySlotNums();
bool QuickGenerateSlotNums();
bool SlowGenerateSlotNums();
2022-07-26 13:27:03 -04:00
void GenerateSlotNums();
2019-08-23 11:56:54 -07:00
void GenerateDynCastData();
void UpdateRevisedTypes();
2022-07-26 13:27:03 -04:00
void VisitAutocompleteExteriorIdentifiers();
2019-08-23 11:56:54 -07:00
void VisitSourceExteriorNodes();
void UpdateCompletion();
bool DoWorkLoop(bool onlyReifiedTypes = false, bool onlyReifiedMethods = false);
BfMangler::MangleKind GetMangleKind();
2022-07-26 13:27:03 -04:00
2019-08-23 11:56:54 -07:00
BfTypeDef* GetArrayTypeDef(int dimensions);
void GenerateAutocompleteInfo();
void MarkStringPool(BfModule* module);
void MarkStringPool(BfIRConstHolder* constHolder, BfIRValue irValue);
2019-08-23 11:56:54 -07:00
void ClearUnusedStringPoolEntries();
void ClearBuildCache();
int GetVDataPrefixDataCount();
2019-08-23 11:56:54 -07:00
int GetDynCastVDataCount();
bool IsAutocomplete();
bool IsDataResolvePass();
2022-01-06 11:56:12 -05:00
bool WantsClassifyNode(BfAstNode* node);
2019-08-23 11:56:54 -07:00
BfAutoComplete* GetAutoComplete();
bool IsHotCompile();
bool IsSkippingExtraResolveChecks();
int GetVTableMethodOffset();
BfType* CheckSymbolReferenceTypeRef(BfModule* module, BfTypeReference* typeRef);
void AddToRebuildTypeList(BfTypeInstance* typeInst, HashSet<BfTypeInstance*>& rebuildTypeInstList);
2019-08-23 11:56:54 -07:00
void AddDepsToRebuildTypeList(BfTypeInstance* typeInst, HashSet<BfTypeInstance*>& rebuildTypeInstList);
void CompileReified();
void PopulateReified();
2022-03-15 16:33:30 -07:00
bool IsCePaused();
bool EnsureCeUnpaused(BfType* refType);
2019-08-23 11:56:54 -07:00
2022-07-26 13:27:03 -04:00
void HotCommit();
2019-08-23 11:56:54 -07:00
void HotResolve_Start(HotResolveFlags flags);
void HotResolve_PopulateMethodNameMap();
2019-08-23 11:56:54 -07:00
bool HotResolve_AddReachableMethod(BfHotMethod* hotMethod, HotTypeFlags flags, bool devirtualized, bool forceProcess = false);
void HotResolve_AddReachableMethod(const StringImpl& methodName);
void HotResolve_AddActiveMethod(BfHotMethod* hotMethod);
void HotResolve_AddActiveMethod(const StringImpl& methodName);
void HotResolve_AddDelegateMethod(const StringImpl& methodName);
void HotResolve_ReportType(BfHotTypeVersion* hotTypeVersion, HotTypeFlags flags, BfHotDepData* reason);
void HotResolve_ReportType(int typeId, HotTypeFlags flags);
String HotResolve_Finish();
void ClearOldHotData();
public:
BfCompiler(BfSystem* bfSystem, bool isResolveOnly);
2022-07-26 13:27:03 -04:00
~BfCompiler();
2019-08-23 11:56:54 -07:00
2022-07-26 13:27:03 -04:00
bool Compile(const StringImpl& outputPath);
2019-08-23 11:56:54 -07:00
bool DoCompile(const StringImpl& outputPath);
void ClearResults();
2022-07-26 13:27:03 -04:00
void ProcessAutocompleteTempType();
void GetSymbolReferences();
2019-08-23 11:56:54 -07:00
void Cancel();
2022-07-26 13:27:03 -04:00
void RequestFastFinish();
void RequestExtraCompile();
String GetTypeDefList(bool includeLocation);
2021-12-11 09:08:42 -08:00
String GetGeneratorString(BfTypeDef* typeDef, BfTypeInstance* typeInst, const StringImpl& generatorMethodName, const StringImpl* args);
void HandleGeneratorErrors(StringImpl& result);
String GetGeneratorTypeDefList();
String GetGeneratorInitData(const StringImpl& typeName, const StringImpl& args);
String GetGeneratorGenData(const StringImpl& typeName, const StringImpl& args);
String GetTypeDefMatches(const StringImpl& searchSrc, bool includeLocation);
2021-12-11 09:08:42 -08:00
void GetTypeDefs(const StringImpl& typeName, Array<BfTypeDef*>& typeDefs);
2022-07-26 13:27:03 -04:00
String GetTypeDefInfo(const StringImpl& typeName);
int GetTypeId(const StringImpl& typeName);
BfType* GetType(const StringImpl& typeName);
int GetEmitSource(const StringImpl& fileName, StringImpl* outBuffer);
String GetEmitLocation(const StringImpl& typeName, int line, int& outEmbedLine, int& outEmbedLineChar, uint64& outHash);
bool WriteEmitData(const StringImpl& filePath, BfProject* project);
2019-08-23 11:56:54 -07:00
void CompileLog(const char* fmt ...);
void ReportMemory(MemReporter* memReporter);
};
NS_BF_END