| ... | @@ -1889,8 +1889,116 @@ pub fn resolveInputs( | ... | @@ -1889,8 +1889,116 @@ pub fn resolveInputs( |
| 1889 | mem.reverse(UnresolvedInput, unresolved_inputs.items); | 1889 | mem.reverse(UnresolvedInput, unresolved_inputs.items); |
| 1890 | | 1890 | |
| 1891 | syslib: while (unresolved_inputs.pop()) |unresolved_input| { | 1891 | syslib: while (unresolved_inputs.pop()) |unresolved_input| { |
| 1892 | const name_query: UnresolvedInput.NameQuery = switch (unresolved_input) { | 1892 | switch (unresolved_input) { |
| 1893 | .name_query => |nq| nq, | 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 | }, |
| 1894 | .ambiguous_name => |an| { | 2002 | .ambiguous_name => |an| { |
| 1895 | // First check the path relative to the current working directory. | 2003 | // First check the path relative to the current working directory. |
| 1896 | // If the file is a library and is not found there, check the library search paths as well. | 2004 | // 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( | ... | @@ -1960,113 +2068,6 @@ pub fn resolveInputs( |
| 1960 | try resolved_inputs.append(gpa, .{ .dso_exact = dso_exact }); | 2068 | try resolved_inputs.append(gpa, .{ .dso_exact = dso_exact }); |
| 1961 | continue; | 2069 | continue; |
| 1962 | }, | 2070 | }, |
| 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 | }, | | |
| 2070 | } | 2071 | } |
| 2071 | @compileError("unreachable"); | 2072 | @compileError("unreachable"); |
| 2072 | } | 2073 | } |