diff options
| author | Isaac Freund <mail@isaacfreund.com> | 2025-01-29 14:25:13 +0100 |
|---|---|---|
| committer | Isaac Freund <mail@isaacfreund.com> | 2025-02-10 23:24:32 +0100 |
| commit | 0499c731eabd2c88928ef740b488706c51a8a6a7 (patch) | |
| tree | e27ec6ec25921988425fe9a1ecbad19fae6cfdc2 /src/link.zig | |
| parent | 819716b59f941253ae98405bb4b30049aea5f8de (diff) | |
| download | zig-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.zig | 219 |
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"); } |
