From ceff2782029672714ac2e04a7b3e25af23eb9a9b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 20 Apr 2023 15:09:33 -0700 Subject: [PATCH] fixes to the previous commit * CompileStep: Avoid calling producesPdbFile() to determine whether the option should be respected. If the user asks for it, put it on the command line and let the Zig CLI deal with it appropriately. * Make the namespace of `std.dwarf.Format.dwarf32` no longer have a redundant "dwarf" in it. * Add `zig cc` integration for `-gdwarf32` and `-gdwarf64`. * Toss in a bonus bug fix for `-gdwarf-2`, `-gdwarf-3`, etc. * Avoid using default init values for struct fields unnecessarily. * Add missing cache hash addition for the new option. --- lib/std/Build/CompileStep.zig | 13 ++++--- lib/std/dwarf.zig | 5 +-- src/Compilation.zig | 9 ++++- src/clang_options_data.zig | 63 ++++++++++++++++++++++++++++++---- src/codegen/llvm.zig | 9 +---- src/link.zig | 2 +- src/main.zig | 14 ++++++-- tools/update_clang_options.zig | 18 +++++++--- 8 files changed, 98 insertions(+), 35 deletions(-) diff --git a/lib/std/Build/CompileStep.zig b/lib/std/Build/CompileStep.zig index 2c51d58852..b71298ce6a 100644 --- a/lib/std/Build/CompileStep.zig +++ b/lib/std/Build/CompileStep.zig @@ -1450,13 +1450,12 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void { try addFlag(&zig_args, "strip", self.strip); try addFlag(&zig_args, "unwind-tables", self.unwind_tables); - if (!self.producesPdbFile()) { - if (self.dwarf_format) |dwarf_format| { - try zig_args.append(switch (dwarf_format) { - .dwarf32 => "-gdwarf32", - .dwarf64 => "-gdwarf64", - }); - } + + if (self.dwarf_format) |dwarf_format| { + try zig_args.append(switch (dwarf_format) { + .@"32" => "-gdwarf32", + .@"64" => "-gdwarf64", + }); } switch (self.compress_debug_sections) { diff --git a/lib/std/dwarf.zig b/lib/std/dwarf.zig index 505a5cb886..d7b4e29947 100644 --- a/lib/std/dwarf.zig +++ b/lib/std/dwarf.zig @@ -147,10 +147,7 @@ pub const CC = enum(u8) { GNU_borland_fastcall_i386 = 0x41, }; -pub const Format = enum { - dwarf32, - dwarf64, -}; +pub const Format = enum { @"32", @"64" }; const PcRange = struct { start: u64, diff --git a/src/Compilation.zig b/src/Compilation.zig index 848b1594fa..a07ac417e3 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1112,6 +1112,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { cache.hash.add(link_libunwind); cache.hash.add(options.output_mode); cache.hash.add(options.machine_code_model); + cache.hash.addOptional(options.dwarf_format); cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_bin); cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_implib); cache.hash.addBytes(options.root_name); @@ -4490,7 +4491,13 @@ pub fn addCCArgs( // generation, it only changes the type of information generated. try argv.appendSlice(&.{ "-g", "-gcodeview" }); }, - .elf, .macho => try argv.append("-gdwarf-4"), + .elf, .macho => { + try argv.append("-gdwarf-4"); + if (comp.bin_file.options.dwarf_format) |f| switch (f) { + .@"32" => try argv.append("-gdwarf32"), + .@"64" => try argv.append("-gdwarf64"), + }; + }, else => try argv.append("-g"), } } diff --git a/src/clang_options_data.zig b/src/clang_options_data.zig index fc23d86964..c342cf7777 100644 --- a/src/clang_options_data.zig +++ b/src/clang_options_data.zig @@ -3870,13 +3870,62 @@ flagpd1("gcodeview-command-line"), flagpd1("gcodeview-ghash"), flagpd1("gcolumn-info"), flagpd1("gdbx"), -flagpd1("gdwarf"), -flagpd1("gdwarf32"), -flagpd1("gdwarf64"), -flagpd1("gdwarf-2"), -flagpd1("gdwarf-3"), -flagpd1("gdwarf-4"), -flagpd1("gdwarf-5"), +.{ + .name = "gdwarf", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf32", + .syntax = .flag, + .zig_equivalent = .gdwarf32, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf64", + .syntax = .flag, + .zig_equivalent = .gdwarf64, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-2", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-3", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-4", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-5", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, flagpd1("gdwarf-aranges"), flagpd1("gembed-source"), sepd1("gen-cdb-fragment-path"), diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 23d9af39e0..a081448155 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -433,14 +433,7 @@ pub const Object = struct { if (!options.strip) { switch (options.target.ofmt) { .coff => llvm_module.addModuleCodeViewFlag(), - else => { - const dwarf_format = options.dwarf_format orelse .dwarf32; - const produce_dwarf64 = switch (dwarf_format) { - .dwarf32 => false, - .dwarf64 => true, - }; - llvm_module.addModuleDebugInfoFlag(produce_dwarf64); - }, + else => llvm_module.addModuleDebugInfoFlag(options.dwarf_format == std.dwarf.Format.@"64"), } const di_builder = llvm_module.createDIBuilder(true); opt_di_builder = di_builder; diff --git a/src/link.zig b/src/link.zig index a0a1bdad94..672a53999f 100644 --- a/src/link.zig +++ b/src/link.zig @@ -200,7 +200,7 @@ pub const Options = struct { compatibility_version: ?std.builtin.Version, libc_installation: ?*const LibCInstallation, - dwarf_format: ?std.dwarf.Format = null, + dwarf_format: ?std.dwarf.Format, /// WASI-only. Type of WASI execution model ("command" or "reactor"). wasi_exec_model: std.builtin.WasiExecModel = undefined, diff --git a/src/main.zig b/src/main.zig index 81a83d580d..6a83791ca3 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1357,9 +1357,9 @@ fn buildOutputType( } else if (mem.eql(u8, arg, "-fno-strip")) { strip = false; } else if (mem.eql(u8, arg, "-gdwarf32")) { - dwarf_format = .dwarf32; + dwarf_format = .@"32"; } else if (mem.eql(u8, arg, "-gdwarf64")) { - dwarf_format = .dwarf64; + dwarf_format = .@"64"; } else if (mem.eql(u8, arg, "-fformatted-panics")) { formatted_panics = true; } else if (mem.eql(u8, arg, "-fno-formatted-panics")) { @@ -1767,6 +1767,14 @@ fn buildOutputType( try clang_argv.appendSlice(it.other_args); } }, + .gdwarf32 => { + strip = false; + dwarf_format = .@"32"; + }, + .gdwarf64 => { + strip = false; + dwarf_format = .@"64"; + }, .sanitize => { if (mem.eql(u8, it.only_arg, "undefined")) { want_sanitize_c = true; @@ -5108,6 +5116,8 @@ pub const ClangArgIterator = struct { asm_only, optimize, debug, + gdwarf32, + gdwarf64, sanitize, linker_script, dry_run, diff --git a/tools/update_clang_options.zig b/tools/update_clang_options.zig index cf7d72595b..7639d08ce3 100644 --- a/tools/update_clang_options.zig +++ b/tools/update_clang_options.zig @@ -241,23 +241,31 @@ const known_options = [_]KnownOpt{ .ident = "debug", }, .{ - .name = "g-dwarf", + .name = "gdwarf32", + .ident = "gdwarf32", + }, + .{ + .name = "gdwarf64", + .ident = "gdwarf64", + }, + .{ + .name = "gdwarf", .ident = "debug", }, .{ - .name = "g-dwarf-2", + .name = "gdwarf-2", .ident = "debug", }, .{ - .name = "g-dwarf-3", + .name = "gdwarf-3", .ident = "debug", }, .{ - .name = "g-dwarf-4", + .name = "gdwarf-4", .ident = "debug", }, .{ - .name = "g-dwarf-5", + .name = "gdwarf-5", .ident = "debug", }, .{