From b3fe79522e2e0ce6ef639fff4b501973182a8c40 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 14 Sep 2020 06:52:19 -0700 Subject: [PATCH] Fixed datalayout initialization --- IDEHelper/Compiler/BfCodeGen.cpp | 3 +- IDEHelper/Compiler/BfCodeGen.h | 1 + IDEHelper/Compiler/BfIRBuilder.h | 25 +--- IDEHelper/Compiler/BfIRCodeGen.cpp | 216 +++++++++++++++-------------- IDEHelper/Compiler/BfIRCodeGen.h | 25 +++- 5 files changed, 142 insertions(+), 128 deletions(-) diff --git a/IDEHelper/Compiler/BfCodeGen.cpp b/IDEHelper/Compiler/BfCodeGen.cpp index 8a59f463..ce473282 100644 --- a/IDEHelper/Compiler/BfCodeGen.cpp +++ b/IDEHelper/Compiler/BfCodeGen.cpp @@ -469,6 +469,7 @@ void BfCodeGenThread::RunLoop() BP_ZONE_F("BfCodeGen::RunLoop.LLVM %s", request->mOutFileName.c_str()); BfIRCodeGen* llvmIRCodeGen = new BfIRCodeGen(); + llvmIRCodeGen->SetCodeGenOptions(request->mOptions); llvmIRCodeGen->SetConfigConst(BfIRConfigConst_VirtualMethodOfs, request->mOptions.mVirtualMethodOfs); llvmIRCodeGen->SetConfigConst(BfIRConfigConst_DynSlotOfs, request->mOptions.mDynSlotOfs); llvmIRCodeGen->ProcessBfIRData(request->mData); @@ -501,7 +502,7 @@ void BfCodeGenThread::RunLoop() outFileName = request->mOutFileName + ".s"; else outFileName = request->mOutFileName + BF_OBJ_EXT; - if (!llvmIRCodeGen->WriteObjectFile(outFileName, request->mOptions)) + if (!llvmIRCodeGen->WriteObjectFile(outFileName)) { result.mType = BfCodeGenResult_Failed; dirCache->FileFailed(); diff --git a/IDEHelper/Compiler/BfCodeGen.h b/IDEHelper/Compiler/BfCodeGen.h index 6a9d89ec..e8edec6b 100644 --- a/IDEHelper/Compiler/BfCodeGen.h +++ b/IDEHelper/Compiler/BfCodeGen.h @@ -11,6 +11,7 @@ namespace llvm { class Module; class LLVMContext; + class TargetMachine; } NS_BF_BEGIN diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index d01a5006..6114606f 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -26,24 +26,6 @@ #pragma warning(pop) -namespace llvm -{ - class Constant; - class Value; - class Type; - class BasicBlock; - class Function; - class FunctionType; - class MDNode; - class InlineAsm; - class DIType; - class DIBuilder; - class DICompileUnit; - class AttributeList; - class Module; - class LLVMContext; -}; - NS_BF_BEGIN class BfModule; @@ -707,12 +689,7 @@ public: { mId = val.mId; } - - BfIRMDNode(llvm::MDNode* mdNode) - { - mId = -1; - } - + operator bool() const { return mId != -1; diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index b0453376..ff761d3c 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -320,6 +320,7 @@ BfIRCodeGen::BfIRCodeGen() { mStream = NULL; mBfIRBuilder = NULL; + mLLVMTargetMachine = NULL; mNopInlineAsm = NULL; mAsmObjectCheckAsm = NULL; @@ -356,6 +357,7 @@ BfIRCodeGen::~BfIRCodeGen() delete mStream; delete mIRBuilder; delete mDIBuilder; + delete mLLVMTargetMachine; delete mLLVMModule; delete mLLVMContext; } @@ -1359,6 +1361,100 @@ void BfIRCodeGen::CreateMemSet(llvm::Value* addr, llvm::Value* val, llvm::Value* mIRBuilder->CreateMemSet(addr, val, size, alignment, isVolatile); } +void BfIRCodeGen::InitTarget() +{ + llvm::SMDiagnostic Err; + llvm::Triple theTriple = llvm::Triple(mLLVMModule->getTargetTriple()); + llvm::CodeGenOpt::Level optLvl = llvm::CodeGenOpt::None; + + String cpuName = ""; + String arch = ""; + + // Get the target specific parser. + std::string Error; + const llvm::Target *theTarget = llvm::TargetRegistry::lookupTarget(arch.c_str(), theTriple, Error); + if (!theTarget) + { + Fail(StrFormat("Failed to create LLVM Target: %s", Error.c_str())); + return; + } + + llvm::TargetOptions Options = llvm::TargetOptions(); // InitTargetOptionsFromCodeGenFlags(); + + String featuresStr; + + if (mCodeGenOptions.mOptLevel == BfOptLevel_O1) + { + //optLvl = CodeGenOpt::Less; + } + else if (mCodeGenOptions.mOptLevel == BfOptLevel_O2) + optLvl = llvm::CodeGenOpt::Default; + else if (mCodeGenOptions.mOptLevel == BfOptLevel_O3) + optLvl = llvm::CodeGenOpt::Aggressive; + + if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_SSE) + featuresStr = "+sse"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_SSE2) + featuresStr = "+sse2"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_SSE3) + featuresStr = "+sse3"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_SSE4) + featuresStr = "+sse4"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_SSE41) + featuresStr = "+sse4.1"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_AVX) + featuresStr = "+avx"; + else if (mCodeGenOptions.mSIMDSetting == BfSIMDSetting_AVX2) + featuresStr = "+avx2"; + + llvm::Optional relocModel; + llvm::CodeModel::Model cmModel = llvm::CodeModel::Small; + + switch (mCodeGenOptions.mRelocType) + { + case BfRelocType_Static: + relocModel = llvm::Reloc::Model::DynamicNoPIC; + break; + case BfRelocType_PIC: + relocModel = llvm::Reloc::Model::PIC_; + break; + case BfRelocType_DynamicNoPIC: + relocModel = llvm::Reloc::Model::DynamicNoPIC; + break; + case BfRelocType_ROPI: + relocModel = llvm::Reloc::Model::ROPI; + break; + case BfRelocType_RWPI: + relocModel = llvm::Reloc::Model::RWPI; + break; + case BfRelocType_ROPI_RWPI: + relocModel = llvm::Reloc::Model::ROPI_RWPI; + break; + default: break; + } + + switch (mCodeGenOptions.mPICLevel) + { + case BfPICLevel_Not: + mLLVMModule->setPICLevel(llvm::PICLevel::Level::NotPIC); + break; + case BfPICLevel_Small: + mLLVMModule->setPICLevel(llvm::PICLevel::Level::SmallPIC); + break; + case BfPICLevel_Big: + mLLVMModule->setPICLevel(llvm::PICLevel::Level::BigPIC); + break; + default: break; + } + + mLLVMTargetMachine = + theTarget->createTargetMachine(theTriple.getTriple(), cpuName.c_str(), featuresStr.c_str(), + Options, relocModel, cmModel, optLvl); + + mLLVMModule->setDataLayout(mLLVMTargetMachine->createDataLayout()); + +} + void BfIRCodeGen::HandleNextCmd() { int curId = mCmdCount; @@ -1392,6 +1488,8 @@ void BfIRCodeGen::HandleNextCmd() mLLVMModule->setTargetTriple(llvm::sys::getDefaultTargetTriple()); else mLLVMModule->setTargetTriple(targetTriple.c_str()); + + InitTarget(); } break; case BfIRCmd_Module_AddModuleFlag: @@ -4219,6 +4317,11 @@ void BfIRCodeGen::HandleNextCmd() } } +void BfIRCodeGen::SetCodeGenOptions(BfCodeGenOptions codeGenOptions) +{ + mCodeGenOptions = codeGenOptions; +} + void BfIRCodeGen::SetConfigConst(int idx, int value) { auto constVal = llvm::ConstantInt::get(llvm::Type::getInt32Ty(*mLLVMContext), value); @@ -4819,7 +4922,7 @@ llvm::Expected FindThinLTOModule(llvm::MemoryBufferRef MBRe llvm::inconvertibleErrorCode()); } -bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGenOptions& codeGenOptions) +bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName) { // { // PassManagerBuilderWrapper pmBuilder; @@ -4829,7 +4932,7 @@ bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGen mHasDebugLoc = false; // So fails don't show a line number - bool enableLTO = codeGenOptions.mLTOType != BfLTOType_None; + bool enableLTO = mCodeGenOptions.mLTOType != BfLTOType_None; if (enableLTO) { @@ -4839,98 +4942,7 @@ bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGen enableLTO = false; } } - - llvm::CodeGenOpt::Level optLvl = llvm::CodeGenOpt::None; - - llvm::SMDiagnostic Err; - llvm::Triple theTriple; - - theTriple = llvm::Triple(mLLVMModule->getTargetTriple()); - - String cpuName = ""; - String arch = ""; - - // Get the target specific parser. - std::string Error; - const llvm::Target *theTarget = llvm::TargetRegistry::lookupTarget(arch.c_str(), theTriple, Error); - if (!theTarget) - { - Fail(StrFormat("Failed to create LLVM Target: %s", Error.c_str())); - return false; - } - - llvm::TargetOptions Options = llvm::TargetOptions(); // InitTargetOptionsFromCodeGenFlags(); - - String featuresStr; - - if (codeGenOptions.mOptLevel == BfOptLevel_O1) - { - //optLvl = CodeGenOpt::Less; - } - else if (codeGenOptions.mOptLevel == BfOptLevel_O2) - optLvl = llvm::CodeGenOpt::Default; - else if (codeGenOptions.mOptLevel == BfOptLevel_O3) - optLvl = llvm::CodeGenOpt::Aggressive; - - if (codeGenOptions.mSIMDSetting == BfSIMDSetting_SSE) - featuresStr = "+sse"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_SSE2) - featuresStr = "+sse2"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_SSE3) - featuresStr = "+sse3"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_SSE4) - featuresStr = "+sse4"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_SSE41) - featuresStr = "+sse4.1"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_AVX) - featuresStr = "+avx"; - else if (codeGenOptions.mSIMDSetting == BfSIMDSetting_AVX2) - featuresStr = "+avx2"; - - llvm::Optional relocModel; - llvm::CodeModel::Model cmModel = llvm::CodeModel::Small; - - switch (codeGenOptions.mRelocType) - { - case BfRelocType_Static: - relocModel = llvm::Reloc::Model::DynamicNoPIC; - break; - case BfRelocType_PIC: - relocModel = llvm::Reloc::Model::PIC_; - break; - case BfRelocType_DynamicNoPIC: - relocModel = llvm::Reloc::Model::DynamicNoPIC; - break; - case BfRelocType_ROPI: - relocModel = llvm::Reloc::Model::ROPI; - break; - case BfRelocType_RWPI: - relocModel = llvm::Reloc::Model::RWPI; - break; - case BfRelocType_ROPI_RWPI: - relocModel = llvm::Reloc::Model::ROPI_RWPI; - break; - default: break; - } - - switch (codeGenOptions.mPICLevel) - { - case BfPICLevel_Not: - mLLVMModule->setPICLevel(llvm::PICLevel::Level::NotPIC); - break; - case BfPICLevel_Small: - mLLVMModule->setPICLevel(llvm::PICLevel::Level::SmallPIC); - break; - case BfPICLevel_Big: - mLLVMModule->setPICLevel(llvm::PICLevel::Level::BigPIC); - break; - default: break; - } - - std::unique_ptr target( - theTarget->createTargetMachine(theTriple.getTriple(), cpuName.c_str(), featuresStr.c_str(), - Options, relocModel, cmModel, optLvl)); - + std::error_code EC; llvm::sys::fs::OpenFlags OpenFlags = llvm::sys::fs::F_None; @@ -4941,20 +4953,20 @@ bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGen // Build up all of the passes that we want to do to the module. llvm::legacy::PassManager PM; + llvm::Triple theTriple = llvm::Triple(mLLVMModule->getTargetTriple()); // Add an appropriate TargetLibraryInfo pass for the module's triple. llvm::TargetLibraryInfoImpl TLII(theTriple); PM.add(new llvm::TargetLibraryInfoWrapperPass(TLII)); - // Add the target data from the target machine, if it exists, or the module. - mLLVMModule->setDataLayout(target->createDataLayout()); + // Add the target data from the target machine, if it exists, or the module. //PM.add(new DataLayoutPass()); - PopulateModulePassManager(PM, codeGenOptions); + PopulateModulePassManager(PM, mCodeGenOptions); llvm::raw_fd_ostream* outStream = NULL; defer ( delete outStream; ); - if ((enableLTO) || (codeGenOptions.mWriteBitcode)) + if ((enableLTO) || (mCodeGenOptions.mWriteBitcode)) { std::error_code ec; outStream = new llvm::raw_fd_ostream(outFileName.c_str(), ec, llvm::sys::fs::F_None); @@ -4990,11 +5002,11 @@ bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGen //WriteBitcode bool noVerify = false; // Option - if ((!enableLTO) && (!codeGenOptions.mWriteBitcode)) + if ((!enableLTO) && (!mCodeGenOptions.mWriteBitcode)) { // Ask the target to add backend passes as necessary. - if (target->addPassesToEmitFile(PM, out, NULL, - (codeGenOptions.mAsmKind != BfAsmKind_None) ? llvm::TargetMachine::CGFT_AssemblyFile : llvm::TargetMachine::CGFT_ObjectFile, + if (mLLVMTargetMachine->addPassesToEmitFile(PM, out, NULL, + (mCodeGenOptions.mAsmKind != BfAsmKind_None) ? llvm::TargetMachine::CGFT_AssemblyFile : llvm::TargetMachine::CGFT_ObjectFile, //TargetMachine::CGFT_AssemblyFile, noVerify /*, StartAfterID, StopAfterID*/)) { @@ -5007,7 +5019,7 @@ bool BfIRCodeGen::WriteObjectFile(const StringImpl& outFileName, const BfCodeGen bool success = PM.run(*mLLVMModule); - if ((codeGenOptions.mOptLevel > BfOptLevel_O0) && (codeGenOptions.mWriteLLVMIR)) + if ((mCodeGenOptions.mOptLevel > BfOptLevel_O0) && (mCodeGenOptions.mWriteLLVMIR)) { BP_ZONE("BfCodeGen::RunLoop.LLVM.IR"); String fileName = outFileName; diff --git a/IDEHelper/Compiler/BfIRCodeGen.h b/IDEHelper/Compiler/BfIRCodeGen.h index 7af44599..3803066b 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.h +++ b/IDEHelper/Compiler/BfIRCodeGen.h @@ -4,6 +4,25 @@ #include "BfSystem.h" #include "BfTargetTriple.h" +namespace llvm +{ + class Constant; + class Value; + class Type; + class BasicBlock; + class Function; + class FunctionType; + class MDNode; + class InlineAsm; + class DIType; + class DIBuilder; + class DICompileUnit; + class AttributeList; + class Module; + class LLVMContext; + class TargetMachine; +}; + NS_BF_BEGIN enum BfIRCodeGenEntryKind @@ -72,10 +91,12 @@ public: llvm::AttributeList* mAttrSet; llvm::DIBuilder* mDIBuilder; llvm::DICompileUnit* mDICompileUnit; + llvm::TargetMachine* mLLVMTargetMachine; Array mSavedDebugLocs; llvm::InlineAsm* mNopInlineAsm; llvm::InlineAsm* mAsmObjectCheckAsm; llvm::DebugLoc mDebugLoc; + BfCodeGenOptions mCodeGenOptions; bool mHasDebugLoc; bool mIsCodeView; int mConstValIdx; @@ -89,6 +110,7 @@ public: Array mConfigConsts64; public: + void InitTarget(); void FixValues(llvm::StructType* structType, llvm::SmallVector& values); BfTypeCode GetTypeCode(llvm::Type* type, bool isSigned); llvm::Type* GetLLVMType(BfTypeCode typeCode, bool& isSigned); @@ -145,6 +167,7 @@ public: } void HandleNextCmd() override; + void SetCodeGenOptions(BfCodeGenOptions codeGenOptions); void SetConfigConst(int idx, int value) override; llvm::Value* GetLLVMValue(int streamId); @@ -156,7 +179,7 @@ public: /// - bool WriteObjectFile(const StringImpl& outFileName, const BfCodeGenOptions& codeGenOptions); + bool WriteObjectFile(const StringImpl& outFileName); bool WriteIR(const StringImpl& outFileName, StringImpl& error); static int GetIntrinsicId(const StringImpl& name);