authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2025-01-29 14:25:13+01:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2025-02-10 23:24:32+01:00
log0499c731eabd2c88928ef740b488706c51a8a6a7
treee27ec6ec25921988425fe9a1ecbad19fae6cfdc2
parent819716b59f941253ae98405bb4b30049aea5f8de
signaturelock-open Commit is signed but in an unrecognized format.

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.

1 files changed, 110 insertions(+), 109 deletions(-)

src/link.zig+110-109
......@@ -1889,8 +1889,116 @@ pub fn resolveInputs(
18891889 mem.reverse(UnresolvedInput, unresolved_inputs.items);
18901890
18911891 syslib: while (unresolved_inputs.pop()) |unresolved_input| {
1892 const name_query: UnresolvedInput.NameQuery = switch (unresolved_input) {
1893 .name_query => |nq| nq,
1892 switch (unresolved_input) {
1893 .name_query => |name_query| {
1894 const query = name_query.query;
1895
1896 // Checked in the first pass above while looking for libc libraries.
1897 assert(!fs.path.isAbsolute(name_query.name));
1898
1899 checked_paths.clearRetainingCapacity();
1900
1901 switch (query.search_strategy) {
1902 .mode_first, .no_fallback => {
1903 // check for preferred mode
1904 for (lib_directories) |lib_directory| switch (try resolveLibInput(
1905 gpa,
1906 arena,
1907 unresolved_inputs,
1908 resolved_inputs,
1909 &checked_paths,
1910 &ld_script_bytes,
1911 lib_directory,
1912 name_query,
1913 target,
1914 query.preferred_mode,
1915 color,
1916 )) {
1917 .ok => continue :syslib,
1918 .no_match => {},
1919 };
1920 // check for fallback mode
1921 if (query.search_strategy == .no_fallback) {
1922 try failed_libs.append(arena, .{
1923 .name = name_query.name,
1924 .strategy = query.search_strategy,
1925 .checked_paths = try arena.dupe(u8, checked_paths.items),
1926 .preferred_mode = query.preferred_mode,
1927 });
1928 continue :syslib;
1929 }
1930 for (lib_directories) |lib_directory| switch (try resolveLibInput(
1931 gpa,
1932 arena,
1933 unresolved_inputs,
1934 resolved_inputs,
1935 &checked_paths,
1936 &ld_script_bytes,
1937 lib_directory,
1938 name_query,
1939 target,
1940 query.fallbackMode(),
1941 color,
1942 )) {
1943 .ok => continue :syslib,
1944 .no_match => {},
1945 };
1946 try failed_libs.append(arena, .{
1947 .name = name_query.name,
1948 .strategy = query.search_strategy,
1949 .checked_paths = try arena.dupe(u8, checked_paths.items),
1950 .preferred_mode = query.preferred_mode,
1951 });
1952 continue :syslib;
1953 },
1954 .paths_first => {
1955 for (lib_directories) |lib_directory| {
1956 // check for preferred mode
1957 switch (try resolveLibInput(
1958 gpa,
1959 arena,
1960 unresolved_inputs,
1961 resolved_inputs,
1962 &checked_paths,
1963 &ld_script_bytes,
1964 lib_directory,
1965 name_query,
1966 target,
1967 query.preferred_mode,
1968 color,
1969 )) {
1970 .ok => continue :syslib,
1971 .no_match => {},
1972 }
1973
1974 // check for fallback mode
1975 switch (try resolveLibInput(
1976 gpa,
1977 arena,
1978 unresolved_inputs,
1979 resolved_inputs,
1980 &checked_paths,
1981 &ld_script_bytes,
1982 lib_directory,
1983 name_query,
1984 target,
1985 query.fallbackMode(),
1986 color,
1987 )) {
1988 .ok => continue :syslib,
1989 .no_match => {},
1990 }
1991 }
1992 try failed_libs.append(arena, .{
1993 .name = name_query.name,
1994 .strategy = query.search_strategy,
1995 .checked_paths = try arena.dupe(u8, checked_paths.items),
1996 .preferred_mode = query.preferred_mode,
1997 });
1998 continue :syslib;
1999 },
2000 }
2001 },
18942002 .ambiguous_name => |an| {
18952003 // First check the path relative to the current working directory.
18962004 // 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(
19602068 try resolved_inputs.append(gpa, .{ .dso_exact = dso_exact });
19612069 continue;
19622070 },
1963 };
1964 const query = name_query.query;
1965
1966 // Checked in the first pass above while looking for libc libraries.
1967 assert(!fs.path.isAbsolute(name_query.name));
1968
1969 checked_paths.clearRetainingCapacity();
1970
1971 switch (query.search_strategy) {
1972 .mode_first, .no_fallback => {
1973 // check for preferred mode
1974 for (lib_directories) |lib_directory| switch (try resolveLibInput(
1975 gpa,
1976 arena,
1977 unresolved_inputs,
1978 resolved_inputs,
1979 &checked_paths,
1980 &ld_script_bytes,
1981 lib_directory,
1982 name_query,
1983 target,
1984 query.preferred_mode,
1985 color,
1986 )) {
1987 .ok => continue :syslib,
1988 .no_match => {},
1989 };
1990 // check for fallback mode
1991 if (query.search_strategy == .no_fallback) {
1992 try failed_libs.append(arena, .{
1993 .name = name_query.name,
1994 .strategy = query.search_strategy,
1995 .checked_paths = try arena.dupe(u8, checked_paths.items),
1996 .preferred_mode = query.preferred_mode,
1997 });
1998 continue :syslib;
1999 }
2000 for (lib_directories) |lib_directory| switch (try resolveLibInput(
2001 gpa,
2002 arena,
2003 unresolved_inputs,
2004 resolved_inputs,
2005 &checked_paths,
2006 &ld_script_bytes,
2007 lib_directory,
2008 name_query,
2009 target,
2010 query.fallbackMode(),
2011 color,
2012 )) {
2013 .ok => continue :syslib,
2014 .no_match => {},
2015 };
2016 try failed_libs.append(arena, .{
2017 .name = name_query.name,
2018 .strategy = query.search_strategy,
2019 .checked_paths = try arena.dupe(u8, checked_paths.items),
2020 .preferred_mode = query.preferred_mode,
2021 });
2022 continue :syslib;
2023 },
2024 .paths_first => {
2025 for (lib_directories) |lib_directory| {
2026 // check for preferred mode
2027 switch (try resolveLibInput(
2028 gpa,
2029 arena,
2030 unresolved_inputs,
2031 resolved_inputs,
2032 &checked_paths,
2033 &ld_script_bytes,
2034 lib_directory,
2035 name_query,
2036 target,
2037 query.preferred_mode,
2038 color,
2039 )) {
2040 .ok => continue :syslib,
2041 .no_match => {},
2042 }
2043
2044 // check for fallback mode
2045 switch (try resolveLibInput(
2046 gpa,
2047 arena,
2048 unresolved_inputs,
2049 resolved_inputs,
2050 &checked_paths,
2051 &ld_script_bytes,
2052 lib_directory,
2053 name_query,
2054 target,
2055 query.fallbackMode(),
2056 color,
2057 )) {
2058 .ok => continue :syslib,
2059 .no_match => {},
2060 }
2061 }
2062 try failed_libs.append(arena, .{
2063 .name = name_query.name,
2064 .strategy = query.search_strategy,
2065 .checked_paths = try arena.dupe(u8, checked_paths.items),
2066 .preferred_mode = query.preferred_mode,
2067 });
2068 continue :syslib;
2069 },
20702071 }
20712072 @compileError("unreachable");
20722073 }