From 9b91cbb841c9998d0a802c1080efa610466b8253 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sun, 26 Feb 2023 23:37:19 +0100 Subject: [PATCH] compiler: get source-level debugging to work on darwin I found that with `-lto=thin` and by setting the llvm.ident metadata, source level debugging finally works on MacOS! The downside is of course that it requires `-lto=thin`, which is barely supported. --- builder/build.go | 2 +- compiler/compiler.go | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/builder/build.go b/builder/build.go index 54899f3fe..034e335c5 100644 --- a/builder/build.go +++ b/builder/build.go @@ -169,6 +169,7 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe CodeModel: config.CodeModel(), RelocationModel: config.RelocationModel(), SizeLevel: sizeLevel, + TinyGoVersion: goenv.Version, Scheduler: config.Scheduler(), AutomaticStackSize: config.AutomaticStackSize(), @@ -305,7 +306,6 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe actionID := packageAction{ ImportPath: pkg.ImportPath, CompilerBuildID: string(compilerBuildID), - TinyGoVersion: goenv.Version, LLVMVersion: llvm.Version, Config: compilerConfig, CFlags: pkg.CFlags, diff --git a/compiler/compiler.go b/compiler/compiler.go index 458be2cb5..8b540d351 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -47,6 +47,7 @@ type Config struct { CodeModel string RelocationModel string SizeLevel int + TinyGoVersion string // for llvm.ident // Various compiler options that determine how code is generated. Scheduler string @@ -321,6 +322,14 @@ func CompilePackage(moduleName string, pkg *loader.Package, ssaPkg *ssa.Package, llvm.ConstInt(c.ctx.Int32Type(), 4, false).ConstantAsMetadata(), }), ) + if c.TinyGoVersion != "" { + // It is necessary to set llvm.ident, otherwise debugging on MacOS + // won't work. + c.mod.AddNamedMetadataOperand("llvm.ident", + c.ctx.MDNode(([]llvm.Metadata{ + c.ctx.MDString("TinyGo version " + c.TinyGoVersion), + }))) + } c.dibuilder.Finalize() c.dibuilder.Destroy() }