zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 951c5b3f67e086c50ba8d0cd9318cb770fd3f724 (tree)
parent b8a8fb927b791b369234012a3d4ff5e2c4c466c9
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 26 Dec 2023 17:09:40 -0700

frontend: fix "any" default resolution ambiguity

In Compilation.create, update the resolved config to account for the
default resolution of the root module. This makes it so that, for
example, reading comp.config.any_non_single_threaded is valid in order
to determine whether any module has single_threaded=false.

Diffstat:
Msrc/Compilation.zig | 13++++++++++++-
Msrc/Compilation/Config.zig | 28+++++++++++++++++++++++-----
2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/Compilation.zig b/src/Compilation.zig @@ -1198,7 +1198,12 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { const use_llvm = options.config.use_llvm; - const any_unwind_tables = options.config.any_unwind_tables; + // The "any" values provided by resolved config only account for + // explicitly-provided settings. We now make them additionally account + // for default setting resolution. + const any_unwind_tables = options.config.any_unwind_tables or options.root_mod.unwind_tables; + const any_non_single_threaded = options.config.any_non_single_threaded or !options.root_mod.single_threaded; + const any_sanitize_thread = options.config.any_sanitize_thread or options.root_mod.sanitize_thread; const link_eh_frame_hdr = options.link_eh_frame_hdr or any_unwind_tables; const build_id = options.build_id orelse .none; @@ -1503,6 +1508,12 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { .native_system_include_paths = options.native_system_include_paths, }; + // Prevent some footguns by making the "any" fields of config reflect + // the default Module settings. + comp.config.any_unwind_tables = any_unwind_tables; + comp.config.any_non_single_threaded = any_non_single_threaded; + comp.config.any_sanitize_thread = any_sanitize_thread; + const lf_open_opts: link.File.OpenOptions = .{ .linker_script = options.linker_script, .z_nodelete = options.linker_z_nodelete, diff --git a/src/Compilation/Config.zig b/src/Compilation/Config.zig @@ -1,4 +1,7 @@ -//! User-specified settings that have all the defaults resolved into concrete values. +//! User-specified settings that have all the defaults resolved into concrete +//! values. These values are observable before calling Compilation.create for +//! the benefit of Module creation API, which needs access to these details in +//! order to resolve per-Module defaults. have_zcu: bool, output_mode: std.builtin.OutputMode, @@ -6,12 +9,27 @@ link_mode: std.builtin.LinkMode, link_libc: bool, link_libcpp: bool, link_libunwind: bool, -any_unwind_tables: bool, +/// True if and only if the c_source_files field will have nonzero length when +/// calling Compilation.create. any_c_source_files: bool, +/// This is true if any Module has unwind_tables set explicitly to true. Until +/// Compilation.create is called, it is possible for this to be false while in +/// fact all Module instances have unwind_tables=true due to the default +/// being unwind_tables=true. After Compilation.create is called this will +/// also take into account the default setting, making this value true if and +/// only if any Module has unwind_tables set to true. +any_unwind_tables: bool, +/// This is true if any Module has single_threaded set explicitly to false. Until +/// Compilation.create is called, it is possible for this to be false while in +/// fact all Module instances have single_threaded=false due to the default +/// being non-single-threaded. After Compilation.create is called this will +/// also take into account the default setting, making this value true if and +/// only if any Module has single_threaded set to false. any_non_single_threaded: bool, -/// This is true if any Module has error_tracing set to true. Function types -/// and function calling convention depend on this global value, however, other -/// kinds of error tracing are omitted depending on the per-Module setting. +/// This is true if and only if any Module has error_tracing set to true. +/// Function types and function calling convention depend on this global value, +/// however, other kinds of error tracing are omitted depending on the +/// per-Module setting. any_error_tracing: bool, any_sanitize_thread: bool, pie: bool,