From 06f6c41679af4c2ae6af0abf6af316ff57c810dc Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 10 Oct 2020 07:08:30 -0700 Subject: [PATCH] Debug Break,SafeBreak,IsDebuggerPresent. [NoDebug] --- BeefLibs/corlib/BeefProj.toml | 5 +++++ BeefLibs/corlib/src/Attribute.bf | 6 ++++++ BeefLibs/corlib/src/Diagnostics/Debug.bf | 23 +++++++++++++++++++++++ IDEHelper/Backend/BeMCContext.cpp | 5 +++++ IDEHelper/Compiler/BfIRBuilder.h | 1 + IDEHelper/Compiler/BfIRCodeGen.cpp | 4 +++- 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/BeefLibs/corlib/BeefProj.toml b/BeefLibs/corlib/BeefProj.toml index 37759f6e..3fc278f7 100644 --- a/BeefLibs/corlib/BeefProj.toml +++ b/BeefLibs/corlib/BeefProj.toml @@ -27,6 +27,11 @@ EmitObjectAccessCheck = false Filter = "[System.UseLLVM]" BfOptimizationLevel = "O0" +[[Configs.Debug.Win64.DistinctOptions]] +Filter = "[System.NoDebug]" +BfOptimizationLevel = "O0" +EmitDebugInfo = "No" + [[Configs.Debug.Win32.DistinctOptions]] Filter = "[System.Optimize]" BfOptimizationLevel = "O2" diff --git a/BeefLibs/corlib/src/Attribute.bf b/BeefLibs/corlib/src/Attribute.bf index 782fe5db..c5d5f582 100644 --- a/BeefLibs/corlib/src/Attribute.bf +++ b/BeefLibs/corlib/src/Attribute.bf @@ -163,6 +163,12 @@ namespace System } + [AttributeUsage(.Method | .Class | .Struct | .Enum)] + public struct NoDebugAttribute : Attribute + { + + } + [AttributeUsage(.Method | .Class | .Struct | .Enum)] public struct UseLLVMAttribute : Attribute { diff --git a/BeefLibs/corlib/src/Diagnostics/Debug.bf b/BeefLibs/corlib/src/Diagnostics/Debug.bf index 713e3e8a..b88b55a8 100644 --- a/BeefLibs/corlib/src/Diagnostics/Debug.bf +++ b/BeefLibs/corlib/src/Diagnostics/Debug.bf @@ -76,5 +76,28 @@ namespace System.Diagnostics paramStr.Append('\n'); Write(paramStr.Ptr, paramStr.Length); } + + static bool gIsDebuggerPresent = IsDebuggerPresent; + [LinkName("IsDebuggerPresent"), CallingConvention(.Stdcall)] + static extern int32 Internal_IsDebuggerPresent(); + + public static bool IsDebuggerPresent + { +#if BF_PLATFORM_WINDOWS + get => gIsDebuggerPresent = Internal_IsDebuggerPresent() != 0; +#else + get => false; +#endif + } + + [Intrinsic("debugtrap")] + public static extern void Break(); + + [NoDebug] + public static void SafeBreak() + { + if (gIsDebuggerPresent) + Break(); + } } } diff --git a/IDEHelper/Backend/BeMCContext.cpp b/IDEHelper/Backend/BeMCContext.cpp index 74821ce2..687e08aa 100644 --- a/IDEHelper/Backend/BeMCContext.cpp +++ b/IDEHelper/Backend/BeMCContext.cpp @@ -17337,6 +17337,11 @@ void BeMCContext::Generate(BeFunction* function) vregInfo->mIsExpr = true; } break; + case BfIRIntrinsic_DebugTrap: + { + AllocInst(BeMCInstKind_DbgBreak); + } + break; case BfIRIntrinsic_MemSet: { if (auto constVal = BeValueDynCast(castedInst->mArgs[1].mValue)) diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index 6ca8cb8d..4802378b 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -413,6 +413,7 @@ enum BfIRIntrinsic : uint8 BfIRIntrinsic_BSwap, BfIRIntrinsic_Cast, BfIRIntrinsic_Cos, + BfIRIntrinsic_DebugTrap, BfIRIntrinsic_Div, BfIRIntrinsic_Eq, BfIRIntrinsic_Floor, diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 0e99f6a5..75404b4b 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -153,10 +153,11 @@ static const BuiltinEntry gIntrinEntries[] = {"atomic_umax"}, {"atomic_umin"}, {"atomic_xchg"}, - {"atomic_xor"}, + {"atomic_xor"}, {"bswap"}, {"cast"}, {"cos"}, + {"debugtrap"}, {"div"}, {"eq"}, {"floor"}, @@ -2422,6 +2423,7 @@ void BfIRCodeGen::HandleNextCmd() { llvm::Intrinsic::bswap, -1}, { (llvm::Intrinsic::ID)-2, -1}, // cast, { llvm::Intrinsic::cos, 0, -1}, + { llvm::Intrinsic::debugtrap, -1}, // debugtrap, { (llvm::Intrinsic::ID)-2, -1}, // div { (llvm::Intrinsic::ID)-2, -1}, // eq { llvm::Intrinsic::floor, 0, -1},