diff --git a/src/Compilation.zig b/src/Compilation.zig index e9a8aa777471..fe5d7382f197 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -94,6 +94,8 @@ native_system_include_paths: []const []const u8, /// Corresponds to `-u ` for ELF/MachO and `/include:` for COFF/PE. force_undefined_symbols: std.StringArrayHashMapUnmanaged(void), +warn_nondeterminism: bool, + c_object_table: std.AutoArrayHashMapUnmanaged(*CObject, void) = .{}, win32_resource_table: if (dev.env.supports(.win32_resource)) std.AutoArrayHashMapUnmanaged(*Win32Resource, void) else struct { pub fn keys(_: @This()) [0]void { @@ -1175,6 +1177,7 @@ pub const CreateOptions = struct { hash_style: link.File.Elf.HashStyle = .both, entry: Entry = .default, force_undefined_symbols: std.StringArrayHashMapUnmanaged(void) = .{}, + warn_nondeterminism: bool = false, stack_size: ?u64 = null, image_base: ?u64 = null, version: ?std.SemanticVersion = null, @@ -1572,6 +1575,7 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil .native_system_include_paths = options.native_system_include_paths, .wasi_emulated_libs = options.wasi_emulated_libs, .force_undefined_symbols = options.force_undefined_symbols, + .warn_nondeterminism = options.warn_nondeterminism, .link_eh_frame_hdr = link_eh_frame_hdr, .global_cc_argv = options.global_cc_argv, .file_system_inputs = options.file_system_inputs, @@ -2625,6 +2629,7 @@ fn addNonIncrementalStuffToCacheManifest( man.hash.add(comp.include_compiler_rt); man.hash.add(comp.rc_includes); man.hash.addListOfBytes(comp.force_undefined_symbols.keys()); + man.hash.add(comp.warn_nondeterminism); man.hash.addListOfBytes(comp.framework_dirs); try link.hashAddSystemLibs(man, comp.system_libs); @@ -5731,6 +5736,10 @@ pub fn addCCArgs( }, } + if (comp.warn_nondeterminism) { + try argv.append("-Wdate-time"); + } + if (target_util.supports_fpic(target) and mod.pic) { try argv.append("-fPIC"); } diff --git a/src/main.zig b/src/main.zig index dabd5d894f1e..2d3778270986 100644 --- a/src/main.zig +++ b/src/main.zig @@ -895,6 +895,7 @@ fn buildOutputType( var test_no_exec = false; var entry: Compilation.CreateOptions.Entry = .default; var force_undefined_symbols: std.StringArrayHashMapUnmanaged(void) = .{}; + var warn_nondeterminism: bool = false; var stack_size: ?u64 = null; var image_base: ?u64 = null; var link_eh_frame_hdr = false; @@ -1150,8 +1151,6 @@ fn buildOutputType( n_jobs = num; } else if (mem.eql(u8, arg, "--subsystem")) { subsystem = try parseSubSystem(args_iter.nextOrFatal()); - } else if (mem.eql(u8, arg, "-O")) { - mod_opts.optimize_mode = parseOptimizeMode(args_iter.nextOrFatal()); } else if (mem.startsWith(u8, arg, "-fentry=")) { entry = .{ .named = arg["-fentry=".len..] }; } else if (mem.eql(u8, arg, "--force_undefined")) { @@ -1299,6 +1298,10 @@ fn buildOutputType( target_mcpu = arg["-mcpu=".len..]; } else if (mem.startsWith(u8, arg, "-O")) { mod_opts.optimize_mode = parseOptimizeMode(arg["-O".len..]); + warn_nondeterminism = mod_opts.optimize_mode != .Debug; + } else if (mem.eql(u8, arg, "-O")) { + mod_opts.optimize_mode = parseOptimizeMode(args_iter.nextOrFatal()); + warn_nondeterminism = mod_opts.optimize_mode != .Debug; } else if (mem.eql(u8, arg, "--dynamic-linker")) { create_module.dynamic_linker = args_iter.nextOrFatal(); } else if (mem.eql(u8, arg, "--sysroot")) { @@ -3348,6 +3351,7 @@ fn buildOutputType( .link_emit_relocs = link_emit_relocs, .entry = entry, .force_undefined_symbols = force_undefined_symbols, + .warn_nondeterminism = warn_nondeterminism, .stack_size = stack_size, .image_base = image_base, .formatted_panics = formatted_panics,