From 237d9a105d5eec82aefc63da8e844c47d8990eea Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 25 Aug 2020 21:31:03 -0700 Subject: [PATCH] stage2: support debug dumping zir as a build option So that it's not needed to manually comment and uncomment the debug code. --- build.zig | 2 ++ src-self-hosted/link/Elf.zig | 14 +++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/build.zig b/build.zig index 9c50025375..869fb3f208 100644 --- a/build.zig +++ b/build.zig @@ -83,6 +83,7 @@ pub fn build(b: *Builder) !void { } const log_scopes = b.option([]const []const u8, "log", "Which log scopes to enable") orelse &[0][]const u8{}; + const zir_dumps = b.option([]const []const u8, "dump-zir", "Which functions to dump ZIR for before codegen") orelse &[0][]const u8{}; const opt_version_string = b.option([]const u8, "version-string", "Override Zig version string. Default is to find out with git."); const version = if (opt_version_string) |version| version else v: { @@ -103,6 +104,7 @@ pub fn build(b: *Builder) !void { exe.addBuildOption([]const u8, "version", version); exe.addBuildOption([]const []const u8, "log_scopes", log_scopes); + exe.addBuildOption([]const []const u8, "zir_dumps", zir_dumps); exe.addBuildOption(bool, "enable_tracy", tracy != null); if (tracy) |tracy_path| { const client_cpp = fs.path.join( diff --git a/src-self-hosted/link/Elf.zig b/src-self-hosted/link/Elf.zig index b67de55dd5..f2a3218118 100644 --- a/src-self-hosted/link/Elf.zig +++ b/src-self-hosted/link/Elf.zig @@ -17,6 +17,7 @@ const Type = @import("../type.zig").Type; const link = @import("../link.zig"); const File = link.File; const Elf = @This(); +const build_options = @import("build_options"); const default_entry_addr = 0x8000000; @@ -1640,11 +1641,14 @@ pub fn updateDecl(self: *Elf, module: *Module, decl: *Module.Decl) !void { else => false, }; if (is_fn) { - { - //if (mem.eql(u8, mem.spanZ(decl.name), "add")) { - //} - std.debug.print("\n{}\n", .{decl.name}); - typed_value.val.cast(Value.Payload.Function).?.func.dump(module.*); + const zir_dumps = if (std.builtin.is_test) &[0][]const u8{} else build_options.zir_dumps; + if (zir_dumps.len != 0) { + for (zir_dumps) |fn_name| { + if (mem.eql(u8, mem.spanZ(decl.name), fn_name)) { + std.debug.print("\n{}\n", .{decl.name}); + typed_value.val.cast(Value.Payload.Function).?.func.dump(module.*); + } + } } // For functions we need to add a prologue to the debug line program.