aboutsummaryrefslogtreecommitdiff
path: root/src/link.zig
diff options
context:
space:
mode:
authorIsaac Freund <mail@isaacfreund.com>2025-01-29 14:25:13 +0100
committerIsaac Freund <mail@isaacfreund.com>2025-02-10 23:24:32 +0100
commit0499c731eabd2c88928ef740b488706c51a8a6a7 (patch)
treee27ec6ec25921988425fe9a1ecbad19fae6cfdc2 /src/link.zig
parent819716b59f941253ae98405bb4b30049aea5f8de (diff)
downloadzig-0499c731eabd2c88928ef740b488706c51a8a6a7.tar.gz
zig-0499c731eabd2c88928ef740b488706c51a8a6a7.zip
link: simplify control flow
This refactor was left out of the previous commit to make the diff less noisy and easier to review. There should be no change in behavior.
Diffstat (limited to 'src/link.zig')
-rw-r--r--src/link.zig219
1 files changed, 110 insertions, 109 deletions
diff --git a/src/link.zig b/src/link.zig
index 6518daea7b..e3885bdbac 100644
--- a/src/link.zig
+++ b/src/link.zig
@@ -1889,8 +1889,116 @@ pub fn resolveInputs(
mem.reverse(UnresolvedInput, unresolved_inputs.items);
syslib: while (unresolved_inputs.pop()) |unresolved_input| {
- const name_query: UnresolvedInput.NameQuery = switch (unresolved_input) {
- .name_query => |nq| nq,
+ switch (unresolved_input) {
+ .name_query => |name_query| {
+ const query = name_query.query;
+
+ // Checked in the first pass above while looking for libc libraries.
+ assert(!fs.path.isAbsolute(name_query.name));
+
+ checked_paths.clearRetainingCapacity();
+
+ switch (query.search_strategy) {
+ .mode_first, .no_fallback => {
+ // check for preferred mode
+ for (lib_directories) |lib_directory| switch (try resolveLibInput(
+ gpa,
+ arena,
+ unresolved_inputs,
+ resolved_inputs,
+ &checked_paths,
+ &ld_script_bytes,
+ lib_directory,
+ name_query,
+ target,
+ query.preferred_mode,
+ color,
+ )) {
+ .ok => continue :syslib,
+ .no_match => {},
+ };
+ // check for fallback mode
+ if (query.search_strategy == .no_fallback) {
+ try failed_libs.append(arena, .{
+ .name = name_query.name,
+ .strategy = query.search_strategy,
+ .checked_paths = try arena.dupe(u8, checked_paths.items),
+ .preferred_mode = query.preferred_mode,
+ });
+ continue :syslib;
+ }
+ for (lib_directories) |lib_directory| switch (try resolveLibInput(
+ gpa,
+ arena,
+ unresolved_inputs,
+ resolved_inputs,
+ &checked_paths,
+ &ld_script_bytes,
+ lib_directory,
+ name_query,
+ target,
+ query.fallbackMode(),
+ color,
+ )) {
+ .ok => continue :syslib,
+ .no_match => {},
+ };
+ try failed_libs.append(arena, .{
+ .name = name_query.name,
+ .strategy = query.search_strategy,
+ .checked_paths = try arena.dupe(u8, checked_paths.items),
+ .preferred_mode = query.preferred_mode,
+ });
+ continue :syslib;
+ },
+ .paths_first => {
+ for (lib_directories) |lib_directory| {
+ // check for preferred mode
+ switch (try resolveLibInput(
+ gpa,
+ arena,
+ unresolved_inputs,
+ resolved_inputs,
+ &checked_paths,
+ &ld_script_bytes,
+ lib_directory,
+ name_query,
+ target,
+ query.preferred_mode,
+ color,
+ )) {
+ .ok => continue :syslib,
+ .no_match => {},
+ }
+
+ // check for fallback mode
+ switch (try resolveLibInput(
+ gpa,
+ arena,
+ unresolved_inputs,
+ resolved_inputs,
+ &checked_paths,
+ &ld_script_bytes,
+ lib_directory,
+ name_query,
+ target,
+ query.fallbackMode(),
+ color,
+ )) {
+ .ok => continue :syslib,
+ .no_match => {},
+ }
+ }
+ try failed_libs.append(arena, .{
+ .name = name_query.name,
+ .strategy = query.search_strategy,
+ .checked_paths = try arena.dupe(u8, checked_paths.items),
+ .preferred_mode = query.preferred_mode,
+ });
+ continue :syslib;
+ },
+ }
+ },
.ambiguous_name => |an| {
// First check the path relative to the current working directory.
// If the file is a library and is not found there, check the library search paths as well.
@@ -1960,113 +2068,6 @@ pub fn resolveInputs(
try resolved_inputs.append(gpa, .{ .dso_exact = dso_exact });
continue;
},
- };
- const query = name_query.query;
-
- // Checked in the first pass above while looking for libc libraries.
- assert(!fs.path.isAbsolute(name_query.name));
-
- checked_paths.clearRetainingCapacity();
-
- switch (query.search_strategy) {
- .mode_first, .no_fallback => {
- // check for preferred mode
- for (lib_directories) |lib_directory| switch (try resolveLibInput(
- gpa,
- arena,
- unresolved_inputs,
- resolved_inputs,
- &checked_paths,
- &ld_script_bytes,
- lib_directory,
- name_query,
- target,
- query.preferred_mode,
- color,
- )) {
- .ok => continue :syslib,
- .no_match => {},
- };
- // check for fallback mode
- if (query.search_strategy == .no_fallback) {
- try failed_libs.append(arena, .{
- .name = name_query.name,
- .strategy = query.search_strategy,
- .checked_paths = try arena.dupe(u8, checked_paths.items),
- .preferred_mode = query.preferred_mode,
- });
- continue :syslib;
- }
- for (lib_directories) |lib_directory| switch (try resolveLibInput(
- gpa,
- arena,
- unresolved_inputs,
- resolved_inputs,
- &checked_paths,
- &ld_script_bytes,
- lib_directory,
- name_query,
- target,
- query.fallbackMode(),
- color,
- )) {
- .ok => continue :syslib,
- .no_match => {},
- };
- try failed_libs.append(arena, .{
- .name = name_query.name,
- .strategy = query.search_strategy,
- .checked_paths = try arena.dupe(u8, checked_paths.items),
- .preferred_mode = query.preferred_mode,
- });
- continue :syslib;
- },
- .paths_first => {
- for (lib_directories) |lib_directory| {
- // check for preferred mode
- switch (try resolveLibInput(
- gpa,
- arena,
- unresolved_inputs,
- resolved_inputs,
- &checked_paths,
- &ld_script_bytes,
- lib_directory,
- name_query,
- target,
- query.preferred_mode,
- color,
- )) {
- .ok => continue :syslib,
- .no_match => {},
- }
-
- // check for fallback mode
- switch (try resolveLibInput(
- gpa,
- arena,
- unresolved_inputs,
- resolved_inputs,
- &checked_paths,
- &ld_script_bytes,
- lib_directory,
- name_query,
- target,
- query.fallbackMode(),
- color,
- )) {
- .ok => continue :syslib,
- .no_match => {},
- }
- }
- try failed_libs.append(arena, .{
- .name = name_query.name,
- .strategy = query.search_strategy,
- .checked_paths = try arena.dupe(u8, checked_paths.items),
- .preferred_mode = query.preferred_mode,
- });
- continue :syslib;
- },
}
@compileError("unreachable");
}