motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit e2345f006ffcd17e41aa73b27890044a0e1f2218 (tree)
parent 9d500bda2d09fe67c39ee98067c1e53c58adbd5e
Author: antlilja <liljaanton2001@gmail.com>
Date:   Sat,  2 Mar 2024 15:19:09 +0100

LLVM: Add enableBrokenDebugInfoCheck and getBrokenDebugInfo

These functions allows the caller to find out wether the context
encounters broken debug info or not.

Diffstat:
Msrc/codegen/llvm/bindings.zig | 6++++++
Msrc/zig_llvm.cpp | 20++++++++++++++++++++
Msrc/zig_llvm.h | 3+++
3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig @@ -37,6 +37,12 @@ pub const Context = opaque { pub const setOptBisectLimit = ZigLLVMSetOptBisectLimit; extern fn ZigLLVMSetOptBisectLimit(C: *Context, limit: c_int) void; + + pub const enableBrokenDebugInfoCheck = ZigLLVMEnableBrokenDebugInfoCheck; + extern fn ZigLLVMEnableBrokenDebugInfoCheck(C: *Context) void; + + pub const getBrokenDebugInfo = ZigLLVMGetBrokenDebugInfo; + extern fn ZigLLVMGetBrokenDebugInfo(C: *Context) bool; }; pub const Module = opaque { diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp @@ -380,6 +380,26 @@ void ZigLLVMSetOptBisectLimit(LLVMContextRef context_ref, int limit) { unwrap(context_ref)->setOptPassGate(opt_bisect); } +struct ZigDiagnosticHandler : public DiagnosticHandler { + bool BrokenDebugInfo; + ZigDiagnosticHandler() : BrokenDebugInfo(false) {} + bool handleDiagnostics(const DiagnosticInfo &DI) override { + if (auto *Remark = dyn_cast<DiagnosticInfoDebugMetadataVersion>(&DI)) { + BrokenDebugInfo = true; + } + return false; + } +}; + +void ZigLLVMEnableBrokenDebugInfoCheck(LLVMContextRef context_ref) { + unwrap(context_ref)->setDiagnosticHandler(std::make_unique<ZigDiagnosticHandler>()); +} + +bool ZigLLVMGetBrokenDebugInfo(LLVMContextRef context_ref) { + return ((const ZigDiagnosticHandler*) + unwrap(context_ref)->getDiagHandlerPtr())->BrokenDebugInfo; +} + void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv) { cl::ParseCommandLineOptions(argc, argv); } diff --git a/src/zig_llvm.h b/src/zig_llvm.h @@ -44,6 +44,9 @@ ZIG_EXTERN_C LLVMTargetMachineRef ZigLLVMCreateTargetMachine(LLVMTargetRef T, co ZIG_EXTERN_C void ZigLLVMSetOptBisectLimit(LLVMContextRef context_ref, int limit); +ZIG_EXTERN_C void ZigLLVMEnableBrokenDebugInfoCheck(LLVMContextRef context_ref); +ZIG_EXTERN_C bool ZigLLVMGetBrokenDebugInfo(LLVMContextRef context_ref); + enum ZigLLVMTailCallKind { ZigLLVMTailCallKindNone, ZigLLVMTailCallKindTail,