diff --git a/IDEHelper/Beef/BfCommon.h b/IDEHelper/Beef/BfCommon.h index 4d040964..319b815d 100644 --- a/IDEHelper/Beef/BfCommon.h +++ b/IDEHelper/Beef/BfCommon.h @@ -208,7 +208,7 @@ public: int mPtrSize; bool mIsOptimized; bool mFailed; - String mErrorMsg; + String mErrorMsg; public: BfIRCodeGenBase() diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index cea7ffb6..c0727353 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -804,6 +804,9 @@ void BfIRCodeGen::Read(llvm::Metadata*& llvmMD) void BfIRCodeGen::AddNop() { + if ((mTargetTriple.GetMachineType() != BfMachineType_x86) && (mTargetTriple.GetMachineType() != BfMachineType_x64)) + return; + if (mNopInlineAsm == NULL) { llvm::SmallVector paramTypes; @@ -945,6 +948,7 @@ void BfIRCodeGen::HandleNextCmd() case BfIRCmd_Module_SetTargetTriple: { CMD_PARAM(String, targetTriple); + mTargetTriple.Set(targetTriple); if (targetTriple.IsEmpty()) mLLVMModule->setTargetTriple(llvm::sys::getDefaultTargetTriple()); else @@ -2089,13 +2093,20 @@ void BfIRCodeGen::HandleNextCmd() { if (args.size() == 0) { - // Compiler barrier + if ((mTargetTriple.GetMachineType() != BfMachineType_x86) && (mTargetTriple.GetMachineType() != BfMachineType_x64)) + { + Fail("Unable to create compiler barrier on this platform"); + } + else + { + // Compiler barrier - llvm::SmallVector paramTypes; - llvm::FunctionType* funcType = llvm::FunctionType::get(llvm::Type::getVoidTy(*mLLVMContext), paramTypes, false); - auto fenceFunc = llvm::InlineAsm::get(funcType, - "", "~{memory},~{dirflag},~{fpsr},~{flags}", true, false, llvm::InlineAsm::AD_ATT); - mIRBuilder->CreateCall(fenceFunc); + llvm::SmallVector paramTypes; + llvm::FunctionType* funcType = llvm::FunctionType::get(llvm::Type::getVoidTy(*mLLVMContext), paramTypes, false); + auto fenceFunc = llvm::InlineAsm::get(funcType, + "", "~{memory},~{dirflag},~{fpsr},~{flags}", true, false, llvm::InlineAsm::AD_ATT); + mIRBuilder->CreateCall(fenceFunc); + } break; } @@ -2611,6 +2622,10 @@ void BfIRCodeGen::HandleNextCmd() CMD_PARAM(bool, useAsm); auto curLLVMFunc = mActiveFunction; auto irBuilder = mIRBuilder; + + if ((mTargetTriple.GetMachineType() != BfMachineType_x86) && (mTargetTriple.GetMachineType() != BfMachineType_x64)) + useAsm = false; + if (!useAsm) { // This is generates slower code than the inline asm in debug mode, but can optimize well in release @@ -4098,9 +4113,9 @@ bool BfIRCodeGen::WriteIR(const StringImpl& outFileName, StringImpl& error) int BfIRCodeGen::GetIntrinsicId(const StringImpl& name) { - llvm::Intrinsic::ID intrin = llvm::Intrinsic::getIntrinsicForGCCBuiltin("x86", name.c_str()); - if (intrin != llvm::Intrinsic::not_intrinsic) - return (int)intrin; +// llvm::Intrinsic::ID intrin = llvm::Intrinsic::getIntrinsicForGCCBuiltin("x86", name.c_str()); +// if (intrin != llvm::Intrinsic::not_intrinsic) +// return (int)intrin; auto itr = std::lower_bound(std::begin(gIntrinEntries), std::end(gIntrinEntries), name); if (itr != std::end(gIntrinEntries) && strcmp(itr->mName, name.c_str()) == 0) @@ -4163,8 +4178,14 @@ void BfIRCodeGen::StaticInit() LLVMInitializeX86TargetInfo(); LLVMInitializeX86Target(); LLVMInitializeX86TargetMC(); + LLVMInitializeX86AsmPrinter(); + LLVMInitializeX86AsmParser(); + LLVMInitializeX86Disassembler(); LLVMInitializeAArch64TargetInfo(); LLVMInitializeAArch64Target(); LLVMInitializeAArch64TargetMC(); + LLVMInitializeAArch64AsmPrinter(); + //LLVMInitializeAArch64Parser(); + //LLVMInitializeX86Disassembler(); } \ No newline at end of file diff --git a/IDEHelper/Compiler/BfIRCodeGen.h b/IDEHelper/Compiler/BfIRCodeGen.h index 272110a5..526f20c2 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.h +++ b/IDEHelper/Compiler/BfIRCodeGen.h @@ -2,6 +2,7 @@ #include "BfIRBuilder.h" #include "BfSystem.h" +#include "BfTargetTriple.h" NS_BF_BEGIN @@ -53,6 +54,7 @@ class BfIRCodeGen : public BfIRCodeGenBase public: BfIRBuilder* mBfIRBuilder; + BfTargetTriple mTargetTriple; String mModuleName; llvm::LLVMContext* mLLVMContext; llvm::Module* mLLVMModule; diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index 83b86220..2676aa3f 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -206,8 +206,10 @@ enum BfCustomAttributeFlags enum BfMachineType { + BfMachineType_Unknown, BfMachineType_x86, - BfMachineType_x64 + BfMachineType_x64, + BfMachineType_AArch64 }; enum BfToolsetType diff --git a/IDEHelper/Compiler/BfTargetTriple.cpp b/IDEHelper/Compiler/BfTargetTriple.cpp new file mode 100644 index 00000000..37fb863d --- /dev/null +++ b/IDEHelper/Compiler/BfTargetTriple.cpp @@ -0,0 +1,42 @@ +#include "BfTargetTriple.h" + +USING_NS_BF; + +BfTargetTriple::BfTargetTriple() +{ + mParsed = true; + mMachineType = BfMachineType_Unknown; +} + +BfTargetTriple::BfTargetTriple(const StringImpl& targetTriple) +{ + mParsed = false; + mMachineType = BfMachineType_Unknown; + mTargetTriple = targetTriple; +} + +void BfTargetTriple::Parse() +{ + if (mTargetTriple.StartsWith("x86_64")) + mMachineType = BfMachineType_x64; + else if ((mTargetTriple.StartsWith("i686")) || (mTargetTriple.StartsWith("x86"))) + mMachineType = BfMachineType_x64; + else if ((mTargetTriple.StartsWith("aarch64")) || (mTargetTriple.StartsWith("arm64"))) + mMachineType = BfMachineType_AArch64; + else + mMachineType = BfMachineType_Unknown; + mParsed = true; +} + +void BfTargetTriple::Set(const StringImpl& targetTriple) +{ + mTargetTriple = targetTriple; + mParsed = false; +} + +BfMachineType BfTargetTriple::GetMachineType() +{ + if (!mParsed) + Parse(); + return mMachineType; +} diff --git a/IDEHelper/Compiler/BfTargetTriple.h b/IDEHelper/Compiler/BfTargetTriple.h new file mode 100644 index 00000000..e010c677 --- /dev/null +++ b/IDEHelper/Compiler/BfTargetTriple.h @@ -0,0 +1,24 @@ +#pragma once + +#include "BfSystem.h" + +NS_BF_BEGIN + +class BfTargetTriple +{ +public: + String mTargetTriple; + bool mParsed; + BfMachineType mMachineType; + +public: + void Parse(); + +public: + BfTargetTriple(); + BfTargetTriple(const StringImpl& targetTriple); + void Set(const StringImpl& targetTriple); + BfMachineType GetMachineType(); +}; + +NS_BF_END \ No newline at end of file diff --git a/IDEHelper/IDEHelper.vcxproj b/IDEHelper/IDEHelper.vcxproj index 4204ff0a..3b317e71 100644 --- a/IDEHelper/IDEHelper.vcxproj +++ b/IDEHelper/IDEHelper.vcxproj @@ -327,6 +327,7 @@ + @@ -390,6 +391,7 @@ + diff --git a/IDEHelper/IDEHelper.vcxproj.filters b/IDEHelper/IDEHelper.vcxproj.filters index 4f167d03..984f6941 100644 --- a/IDEHelper/IDEHelper.vcxproj.filters +++ b/IDEHelper/IDEHelper.vcxproj.filters @@ -202,6 +202,9 @@ Debugger + + Debugger + @@ -383,5 +386,8 @@ + + Compiler + \ No newline at end of file