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.
This commit is contained in:
219
src/link.zig
219
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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user