authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-20 15:09:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-20 15:17:07-07:00
logceff2782029672714ac2e04a7b3e25af23eb9a9b
tree959bfcee9176e487dfcd4488ada99364658f9a37
parentd026202a26e56e7e2ea20ca49509fdcf8b937020

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.

8 files changed, 98 insertions(+), 35 deletions(-)

lib/std/Build/CompileStep.zig+6-7
...@@ -1450,13 +1450,12 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {...@@ -1450,13 +1450,12 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
14501450
1451 try addFlag(&zig_args, "strip", self.strip);1451 try addFlag(&zig_args, "strip", self.strip);
1452 try addFlag(&zig_args, "unwind-tables", self.unwind_tables);1452 try addFlag(&zig_args, "unwind-tables", self.unwind_tables);
1453 if (!self.producesPdbFile()) {1453
1454 if (self.dwarf_format) |dwarf_format| {1454 if (self.dwarf_format) |dwarf_format| {
1455 try zig_args.append(switch (dwarf_format) {1455 try zig_args.append(switch (dwarf_format) {
1456 .dwarf32 => "-gdwarf32",1456 .@"32" => "-gdwarf32",
1457 .dwarf64 => "-gdwarf64",1457 .@"64" => "-gdwarf64",
1458 });1458 });
1459 }
1460 }1459 }
14611460
1462 switch (self.compress_debug_sections) {1461 switch (self.compress_debug_sections) {
lib/std/dwarf.zig+1-4
...@@ -147,10 +147,7 @@ pub const CC = enum(u8) {...@@ -147,10 +147,7 @@ pub const CC = enum(u8) {
147 GNU_borland_fastcall_i386 = 0x41,147 GNU_borland_fastcall_i386 = 0x41,
148};148};
149149
150pub const Format = enum {150pub const Format = enum { @"32", @"64" };
151 dwarf32,
152 dwarf64,
153};
154151
155const PcRange = struct {152const PcRange = struct {
156 start: u64,153 start: u64,
src/Compilation.zig+8-1
...@@ -1112,6 +1112,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1112,6 +1112,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1112 cache.hash.add(link_libunwind);1112 cache.hash.add(link_libunwind);
1113 cache.hash.add(options.output_mode);1113 cache.hash.add(options.output_mode);
1114 cache.hash.add(options.machine_code_model);1114 cache.hash.add(options.machine_code_model);
1115 cache.hash.addOptional(options.dwarf_format);
1115 cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_bin);1116 cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_bin);
1116 cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_implib);1117 cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_implib);
1117 cache.hash.addBytes(options.root_name);1118 cache.hash.addBytes(options.root_name);
...@@ -4490,7 +4491,13 @@ pub fn addCCArgs(...@@ -4490,7 +4491,13 @@ pub fn addCCArgs(
4490 // generation, it only changes the type of information generated.4491 // generation, it only changes the type of information generated.
4491 try argv.appendSlice(&.{ "-g", "-gcodeview" });4492 try argv.appendSlice(&.{ "-g", "-gcodeview" });
4492 },4493 },
4493 .elf, .macho => try argv.append("-gdwarf-4"),4494 .elf, .macho => {
4495 try argv.append("-gdwarf-4");
4496 if (comp.bin_file.options.dwarf_format) |f| switch (f) {
4497 .@"32" => try argv.append("-gdwarf32"),
4498 .@"64" => try argv.append("-gdwarf64"),
4499 };
4500 },
4494 else => try argv.append("-g"),4501 else => try argv.append("-g"),
4495 }4502 }
4496 }4503 }
src/clang_options_data.zig+56-7
...@@ -3870,13 +3870,62 @@ flagpd1("gcodeview-command-line"),...@@ -3870,13 +3870,62 @@ flagpd1("gcodeview-command-line"),
3870flagpd1("gcodeview-ghash"),3870flagpd1("gcodeview-ghash"),
3871flagpd1("gcolumn-info"),3871flagpd1("gcolumn-info"),
3872flagpd1("gdbx"),3872flagpd1("gdbx"),
3873flagpd1("gdwarf"),3873.{
3874flagpd1("gdwarf32"),3874 .name = "gdwarf",
3875flagpd1("gdwarf64"),3875 .syntax = .flag,
3876flagpd1("gdwarf-2"),3876 .zig_equivalent = .debug,
3877flagpd1("gdwarf-3"),3877 .pd1 = true,
3878flagpd1("gdwarf-4"),3878 .pd2 = false,
3879flagpd1("gdwarf-5"),3879 .psl = false,
3880},
3881.{
3882 .name = "gdwarf32",
3883 .syntax = .flag,
3884 .zig_equivalent = .gdwarf32,
3885 .pd1 = true,
3886 .pd2 = false,
3887 .psl = false,
3888},
3889.{
3890 .name = "gdwarf64",
3891 .syntax = .flag,
3892 .zig_equivalent = .gdwarf64,
3893 .pd1 = true,
3894 .pd2 = false,
3895 .psl = false,
3896},
3897.{
3898 .name = "gdwarf-2",
3899 .syntax = .flag,
3900 .zig_equivalent = .debug,
3901 .pd1 = true,
3902 .pd2 = false,
3903 .psl = false,
3904},
3905.{
3906 .name = "gdwarf-3",
3907 .syntax = .flag,
3908 .zig_equivalent = .debug,
3909 .pd1 = true,
3910 .pd2 = false,
3911 .psl = false,
3912},
3913.{
3914 .name = "gdwarf-4",
3915 .syntax = .flag,
3916 .zig_equivalent = .debug,
3917 .pd1 = true,
3918 .pd2 = false,
3919 .psl = false,
3920},
3921.{
3922 .name = "gdwarf-5",
3923 .syntax = .flag,
3924 .zig_equivalent = .debug,
3925 .pd1 = true,
3926 .pd2 = false,
3927 .psl = false,
3928},
3880flagpd1("gdwarf-aranges"),3929flagpd1("gdwarf-aranges"),
3881flagpd1("gembed-source"),3930flagpd1("gembed-source"),
3882sepd1("gen-cdb-fragment-path"),3931sepd1("gen-cdb-fragment-path"),
src/codegen/llvm.zig+1-8
...@@ -433,14 +433,7 @@ pub const Object = struct {...@@ -433,14 +433,7 @@ pub const Object = struct {
433 if (!options.strip) {433 if (!options.strip) {
434 switch (options.target.ofmt) {434 switch (options.target.ofmt) {
435 .coff => llvm_module.addModuleCodeViewFlag(),435 .coff => llvm_module.addModuleCodeViewFlag(),
436 else => {436 else => llvm_module.addModuleDebugInfoFlag(options.dwarf_format == std.dwarf.Format.@"64"),
437 const dwarf_format = options.dwarf_format orelse .dwarf32;
438 const produce_dwarf64 = switch (dwarf_format) {
439 .dwarf32 => false,
440 .dwarf64 => true,
441 };
442 llvm_module.addModuleDebugInfoFlag(produce_dwarf64);
443 },
444 }437 }
445 const di_builder = llvm_module.createDIBuilder(true);438 const di_builder = llvm_module.createDIBuilder(true);
446 opt_di_builder = di_builder;439 opt_di_builder = di_builder;
src/link.zig+1-1
...@@ -200,7 +200,7 @@ pub const Options = struct {...@@ -200,7 +200,7 @@ pub const Options = struct {
200 compatibility_version: ?std.builtin.Version,200 compatibility_version: ?std.builtin.Version,
201 libc_installation: ?*const LibCInstallation,201 libc_installation: ?*const LibCInstallation,
202202
203 dwarf_format: ?std.dwarf.Format = null,203 dwarf_format: ?std.dwarf.Format,
204204
205 /// WASI-only. Type of WASI execution model ("command" or "reactor").205 /// WASI-only. Type of WASI execution model ("command" or "reactor").
206 wasi_exec_model: std.builtin.WasiExecModel = undefined,206 wasi_exec_model: std.builtin.WasiExecModel = undefined,
src/main.zig+12-2
...@@ -1357,9 +1357,9 @@ fn buildOutputType(...@@ -1357,9 +1357,9 @@ fn buildOutputType(
1357 } else if (mem.eql(u8, arg, "-fno-strip")) {1357 } else if (mem.eql(u8, arg, "-fno-strip")) {
1358 strip = false;1358 strip = false;
1359 } else if (mem.eql(u8, arg, "-gdwarf32")) {1359 } else if (mem.eql(u8, arg, "-gdwarf32")) {
1360 dwarf_format = .dwarf32;1360 dwarf_format = .@"32";
1361 } else if (mem.eql(u8, arg, "-gdwarf64")) {1361 } else if (mem.eql(u8, arg, "-gdwarf64")) {
1362 dwarf_format = .dwarf64;1362 dwarf_format = .@"64";
1363 } else if (mem.eql(u8, arg, "-fformatted-panics")) {1363 } else if (mem.eql(u8, arg, "-fformatted-panics")) {
1364 formatted_panics = true;1364 formatted_panics = true;
1365 } else if (mem.eql(u8, arg, "-fno-formatted-panics")) {1365 } else if (mem.eql(u8, arg, "-fno-formatted-panics")) {
...@@ -1767,6 +1767,14 @@ fn buildOutputType(...@@ -1767,6 +1767,14 @@ fn buildOutputType(
1767 try clang_argv.appendSlice(it.other_args);1767 try clang_argv.appendSlice(it.other_args);
1768 }1768 }
1769 },1769 },
1770 .gdwarf32 => {
1771 strip = false;
1772 dwarf_format = .@"32";
1773 },
1774 .gdwarf64 => {
1775 strip = false;
1776 dwarf_format = .@"64";
1777 },
1770 .sanitize => {1778 .sanitize => {
1771 if (mem.eql(u8, it.only_arg, "undefined")) {1779 if (mem.eql(u8, it.only_arg, "undefined")) {
1772 want_sanitize_c = true;1780 want_sanitize_c = true;
...@@ -5108,6 +5116,8 @@ pub const ClangArgIterator = struct {...@@ -5108,6 +5116,8 @@ pub const ClangArgIterator = struct {
5108 asm_only,5116 asm_only,
5109 optimize,5117 optimize,
5110 debug,5118 debug,
5119 gdwarf32,
5120 gdwarf64,
5111 sanitize,5121 sanitize,
5112 linker_script,5122 linker_script,
5113 dry_run,5123 dry_run,
tools/update_clang_options.zig+13-5
...@@ -241,23 +241,31 @@ const known_options = [_]KnownOpt{...@@ -241,23 +241,31 @@ const known_options = [_]KnownOpt{
241 .ident = "debug",241 .ident = "debug",
242 },242 },
243 .{243 .{
244 .name = "g-dwarf",244 .name = "gdwarf32",
245 .ident = "gdwarf32",
246 },
247 .{
248 .name = "gdwarf64",
249 .ident = "gdwarf64",
250 },
251 .{
252 .name = "gdwarf",
245 .ident = "debug",253 .ident = "debug",
246 },254 },
247 .{255 .{
248 .name = "g-dwarf-2",256 .name = "gdwarf-2",
249 .ident = "debug",257 .ident = "debug",
250 },258 },
251 .{259 .{
252 .name = "g-dwarf-3",260 .name = "gdwarf-3",
253 .ident = "debug",261 .ident = "debug",
254 },262 },
255 .{263 .{
256 .name = "g-dwarf-4",264 .name = "gdwarf-4",
257 .ident = "debug",265 .ident = "debug",
258 },266 },
259 .{267 .{
260 .name = "g-dwarf-5",268 .name = "gdwarf-5",
261 .ident = "debug",269 .ident = "debug",
262 },270 },
263 .{271 .{