From 125d5c0c8c99f4272891b4fba0e1cc9db1351324 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 25 Jan 2022 07:04:54 -0500 Subject: [PATCH] Added Target CPU workspace override --- IDE/src/Compiler/BfCompiler.bf | 10 +++++----- IDE/src/Workspace.bf | 5 +++++ IDE/src/ui/WorkspaceProperties.bf | 1 + IDEHelper/Backend/BeIRCodeGen.cpp | 4 +++- IDEHelper/Backend/BeMCContext.cpp | 5 ++++- IDEHelper/Backend/BeModule.cpp | 3 +++ IDEHelper/Backend/BeModule.h | 1 + IDEHelper/Compiler/BfCompiler.cpp | 3 ++- IDEHelper/Compiler/BfCompiler.h | 1 + IDEHelper/Compiler/BfIRBuilder.cpp | 4 ++-- IDEHelper/Compiler/BfIRBuilder.h | 2 +- IDEHelper/Compiler/BfIRCodeGen.cpp | 5 ++++- IDEHelper/Compiler/BfIRCodeGen.h | 1 + IDEHelper/Compiler/BfModule.cpp | 2 +- 14 files changed, 34 insertions(+), 13 deletions(-) diff --git a/IDE/src/Compiler/BfCompiler.bf b/IDE/src/Compiler/BfCompiler.bf index 67dba204..cc8c95b0 100644 --- a/IDE/src/Compiler/BfCompiler.bf +++ b/IDE/src/Compiler/BfCompiler.bf @@ -127,7 +127,7 @@ namespace IDE.Compiler [CallingConvention(.Stdcall), CLink] static extern void BfCompiler_SetOptions(void* bfCompiler, - void* hotProject, int32 hotIdx, char8* targetTriple, int32 toolsetType, int32 simdSetting, int32 allocStackCount, int32 maxWorkerThreads, + void* hotProject, int32 hotIdx, char8* targetTriple, char8* targetCPU, int32 toolsetType, int32 simdSetting, int32 allocStackCount, int32 maxWorkerThreads, OptionFlags optionsFlags, char8* mallocName, char8* freeName); [CallingConvention(.Stdcall), CLink] @@ -302,12 +302,12 @@ namespace IDE.Compiler } public void SetOptions(BfProject hotProject, int32 hotIdx, - String targetTriple, int32 toolsetType, int32 simdSetting, int32 allocStackCount, int32 maxWorkerThreads, + String targetTriple, String targetCPU, int32 toolsetType, int32 simdSetting, int32 allocStackCount, int32 maxWorkerThreads, OptionFlags optionFlags, String mallocFuncName, String freeFuncName) { BfCompiler_SetOptions(mNativeBfCompiler, (hotProject != null) ? hotProject.mNativeBfProject : null, hotIdx, - targetTriple, toolsetType, simdSetting, allocStackCount, maxWorkerThreads, optionFlags, mallocFuncName, freeFuncName); + targetTriple, targetCPU, toolsetType, simdSetting, allocStackCount, maxWorkerThreads, optionFlags, mallocFuncName, freeFuncName); } public void ForceRebuild() @@ -699,8 +699,8 @@ namespace IDE.Compiler //Debug.WriteLine("HandleOptions SetOptions:{0:X}", (int)optionFlags); SetOptions(hotBfProject, hotIdx, - targetTriple, (int32)options.mToolsetType, (int32)options.mBfSIMDSetting, (int32)options.mAllocStackTraceDepth, (int32)gApp.mSettings.mCompilerSettings.mWorkerThreads, - optionFlags, mallocLinkName, freeLinkName); + targetTriple, options.mTargetCPU, (int32)options.mToolsetType, (int32)options.mBfSIMDSetting, (int32)options.mAllocStackTraceDepth, + (int32)gApp.mSettings.mCompilerSettings.mWorkerThreads, optionFlags, mallocLinkName, freeLinkName); if (!mIsResolveOnly) { diff --git a/IDE/src/Workspace.bf b/IDE/src/Workspace.bf index 3dd958a6..cf213b14 100644 --- a/IDE/src/Workspace.bf +++ b/IDE/src/Workspace.bf @@ -240,6 +240,8 @@ namespace IDE [Reflect] public IntermediateType mIntermediateType; [Reflect] + public String mTargetCPU = new String() ~ delete _; + [Reflect] public BuildOptions.SIMDSetting mBfSIMDSetting = .SSE2; [Reflect] public BuildOptions.BfOptimizationLevel mBfOptimizationLevel; @@ -317,6 +319,7 @@ namespace IDE mIncrementalBuild = prev.mIncrementalBuild; mIntermediateType = prev.mIntermediateType; + mTargetCPU.Set(prev.mTargetCPU); mBfSIMDSetting = prev.mBfSIMDSetting; mBfOptimizationLevel = prev.mBfOptimizationLevel; mCSIMDSetting = prev.mCSIMDSetting; @@ -738,6 +741,7 @@ namespace IDE data.ConditionalAdd("Toolset", options.mToolsetType, ToolsetType.GetDefaultFor(platformType, isRelease)); data.ConditionalAdd("BuildKind", options.mBuildKind, isTest ? .Test : .Normal); + data.ConditionalAdd("TargetCPU", options.mTargetCPU); data.ConditionalAdd("BfSIMDSetting", options.mBfSIMDSetting, .SSE2); if (platformType == .Windows) data.ConditionalAdd("BfOptimizationLevel", options.mBfOptimizationLevel, isRelease ? .O2 : (platformName == "Win64") ? .OgPlus : .O0); @@ -1041,6 +1045,7 @@ namespace IDE options.mToolsetType = data.GetEnum("Toolset", ToolsetType.GetDefaultFor(platformType, isRelease)); options.mBuildKind = data.GetEnum("BuildKind", isTest ? .Test : .Normal); + data.GetString("TargetCPU", options.mTargetCPU); options.mBfSIMDSetting = data.GetEnum("BfSIMDSetting", .SSE2); if (platformType == .Windows) options.mBfOptimizationLevel = data.GetEnum("BfOptimizationLevel", isRelease ? .O2 : (platformName == "Win64") ? .OgPlus : .O0); diff --git a/IDE/src/ui/WorkspaceProperties.bf b/IDE/src/ui/WorkspaceProperties.bf index ce878d46..c53d667b 100644 --- a/IDE/src/ui/WorkspaceProperties.bf +++ b/IDE/src/ui/WorkspaceProperties.bf @@ -775,6 +775,7 @@ namespace IDE.ui return false; }); allocPropEntry.mOnUpdate(); + AddPropertiesItem(category, "Target CPU", "mTargetCPU"); AddPropertiesItem(category, "SIMD Instructions", "mBfSIMDSetting"); AddPropertiesItem(category, "Optimization Level", "mBfOptimizationLevel", scope String[] ( "O0", "O1", "O2", "O3", "Og", "Og+")); diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 39f519a5..858cb985 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1117,7 +1117,9 @@ void BeIRCodeGen::HandleNextCmd() case BfIRCmd_Module_SetTargetTriple: { CMD_PARAM(String, targetTriple); - mBeModule->mTargetTriple = targetTriple; + CMD_PARAM(String, targetCPU); + mBeModule->mTargetTriple = targetTriple; + mBeModule->mTargetCPU = targetCPU; } break; case BfIRCmd_Module_AddModuleFlag: diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index d6e2e1ea..f99ee96e 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -16040,13 +16040,16 @@ BeMCOperand BeMCContext::AllocBinaryOp(BeMCInstKind instKind, const BeMCOperand& } void BeMCContext::Generate(BeFunction* function) -{ +{ BP_ZONE_F("BeMCContext::Generate %s", function->mName.c_str()); mBeFunction = function; mDbgFunction = mBeFunction->mDbgFunction; mModule = function->mModule; + if (!mModule->mTargetCPU.IsEmpty()) + mModule->mBeIRCodeGen->Fail(StrFormat("Cannot set Target CPU '%s' for +Og optimization. Considering compiling under a different optimization setting.", mModule->mTargetCPU.c_str())); + //mDbgPreferredRegs[15] = X64Reg_RCX; //mDbgPreferredRegs[7] = X64Reg_RCX; /*mDbgPreferredRegs[14] = X64Reg_RAX; diff --git a/IDEHelper/Backend/BeModule.cpp b/IDEHelper/Backend/BeModule.cpp index a91f7b32..fe1464c3 100644 --- a/IDEHelper/Backend/BeModule.cpp +++ b/IDEHelper/Backend/BeModule.cpp @@ -1769,6 +1769,9 @@ BeModule::BeModule(const StringImpl& moduleName, BeContext* context) void BeModule::Hash(BeHashContext& hashCtx) { + hashCtx.MixinStr(mTargetTriple); + hashCtx.MixinStr(mTargetCPU); + hashCtx.Mixin(mConfigConsts64.size()); for (auto configConst : mConfigConsts64) configConst->HashContent(hashCtx); diff --git a/IDEHelper/Backend/BeModule.h b/IDEHelper/Backend/BeModule.h index 6398cf36..b76f3e3c 100644 --- a/IDEHelper/Backend/BeModule.h +++ b/IDEHelper/Backend/BeModule.h @@ -2271,6 +2271,7 @@ public: BeContext* mContext; String mModuleName; String mTargetTriple; + String mTargetCPU; BeBlock* mActiveBlock; int mInsertPos; BeDbgLoc* mCurDbgLoc; diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 987f5bf4..f9eba414 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -9651,7 +9651,7 @@ static BfPlatformType GetPlatform(StringView str) } BF_EXPORT void BF_CALLTYPE BfCompiler_SetOptions(BfCompiler* bfCompiler, BfProject* hotProject, int hotIdx, - const char* targetTriple, int toolsetType, int simdSetting, int allocStackCount, int maxWorkerThreads, + const char* targetTriple, const char* targetCPU, int toolsetType, int simdSetting, int allocStackCount, int maxWorkerThreads, BfCompilerOptionFlags optionFlags, char* mallocLinkName, char* freeLinkName) { BfLogSys(bfCompiler->mSystem, "BfCompiler_SetOptions\n"); @@ -9664,6 +9664,7 @@ BF_EXPORT void BF_CALLTYPE BfCompiler_SetOptions(BfCompiler* bfCompiler, BfProje options->mHotProject = hotProject; options->mHotCompileIdx = hotIdx; options->mTargetTriple = targetTriple; + options->mTargetCPU = targetCPU; if (options->mTargetTriple.StartsWith("x86_64-")) options->mMachineType = BfMachineType_x64; diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index d0fb9988..aa0defd3 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -96,6 +96,7 @@ public: int32 mForceRebuildIdx; BfCompileOnDemandKind mCompileOnDemandKind; String mTargetTriple; + String mTargetCPU; BfPlatformType mPlatformType; BfMachineType mMachineType; int mCLongSize; diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 6ba9a95a..6235b13d 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -2020,9 +2020,9 @@ void BfIRBuilder::WriteIR(const StringImpl& fileName) NEW_CMD_INSERTED; } -void BfIRBuilder::Module_SetTargetTriple(const StringImpl& targetTriple) +void BfIRBuilder::Module_SetTargetTriple(const StringImpl& targetTriple, const StringImpl& targetCPU) { - WriteCmd(BfIRCmd_Module_SetTargetTriple, targetTriple); + WriteCmd(BfIRCmd_Module_SetTargetTriple, targetTriple, targetCPU); NEW_CMD_INSERTED; } diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index 96a55a86..418606fb 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -1167,7 +1167,7 @@ public: void RemoveIRCodeGen(); void WriteIR(const StringImpl& fileName); - void Module_SetTargetTriple(const StringImpl& targetTriple); + void Module_SetTargetTriple(const StringImpl& targetTriple, const StringImpl& targetCPU); void Module_AddModuleFlag(const StringImpl& flag, int val); BfIRType GetPrimitiveType(BfTypeCode typeCode); diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index b9841eb5..0853ceda 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -1645,7 +1645,7 @@ void BfIRCodeGen::InitTarget() llvm::Triple theTriple = llvm::Triple(mLLVMModule->getTargetTriple()); llvm::CodeGenOpt::Level optLvl = llvm::CodeGenOpt::None; - String cpuName = ""; + String cpuName = mTargetCPU; String arch = ""; // Get the target specific parser. @@ -1761,7 +1761,10 @@ void BfIRCodeGen::HandleNextCmd() case BfIRCmd_Module_SetTargetTriple: { CMD_PARAM(String, targetTriple); + CMD_PARAM(String, targetCPU); + mTargetTriple.Set(targetTriple); + mTargetCPU = targetCPU; if (targetTriple.IsEmpty()) mLLVMModule->setTargetTriple(llvm::sys::getDefaultTargetTriple()); else diff --git a/IDEHelper/Compiler/BfIRCodeGen.h b/IDEHelper/Compiler/BfIRCodeGen.h index ad474f4d..2fcda96f 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.h +++ b/IDEHelper/Compiler/BfIRCodeGen.h @@ -89,6 +89,7 @@ public: BumpAllocator mAlloc; BfTargetTriple mTargetTriple; + String mTargetCPU; String mModuleName; llvm::LLVMContext* mLLVMContext; llvm::Module* mLLVMModule; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8b4280be..fec98dac 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1012,7 +1012,7 @@ void BfModule::FinishInit() mBfIRBuilder->Start(mModuleName, mCompiler->mSystem->mPtrSize, IsOptimized()); - mBfIRBuilder->Module_SetTargetTriple(mCompiler->mOptions.mTargetTriple); + mBfIRBuilder->Module_SetTargetTriple(mCompiler->mOptions.mTargetTriple, mCompiler->mOptions.mTargetCPU); mBfIRBuilder->SetBackend(IsTargetingBeefBackend());