diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2021-02-01 19:29:31 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2021-02-01 19:29:31 +0100 |
| commit | 7f19a2d2de32ea61a8c9b8bca44a13894954b3be (patch) | |
| tree | a4d4c91a81d47af411bb4d9c1b7f432ea91a3c83 /compiler/rustc_interface/src | |
| parent | 1fe1fa9122b8ea0cac7e7e92be798a44cc89831c (diff) | |
| download | rust-7f19a2d2de32ea61a8c9b8bca44a13894954b3be.tar.gz rust-7f19a2d2de32ea61a8c9b8bca44a13894954b3be.zip | |
Find codegen backends in more locations
* Search in the sysroot passed using `--sysroot` in addition to the default sysroot. * Search for `librustc_codegen_$name.so` in addition to `librustc_codegen_$name-$release.so`.
Diffstat (limited to 'compiler/rustc_interface/src')
| -rw-r--r-- | compiler/rustc_interface/src/util.rs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/compiler/rustc_interface/src/util.rs b/compiler/rustc_interface/src/util.rs index f34990a1a10..ec496032f52 100644 --- a/compiler/rustc_interface/src/util.rs +++ b/compiler/rustc_interface/src/util.rs @@ -241,7 +241,7 @@ pub fn get_codegen_backend(sopts: &config::Options) -> Box<dyn CodegenBackend> { let backend = match codegen_name { filename if filename.contains('.') => load_backend_from_dylib(filename.as_ref()), - codegen_name => get_builtin_codegen_backend(codegen_name), + codegen_name => get_builtin_codegen_backend(&sopts.maybe_sysroot, codegen_name), }; unsafe { @@ -366,15 +366,21 @@ fn sysroot_candidates() -> Vec<PathBuf> { } } -pub fn get_builtin_codegen_backend(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> { +pub fn get_builtin_codegen_backend( + maybe_sysroot: &Option<PathBuf>, + backend_name: &str, +) -> fn() -> Box<dyn CodegenBackend> { match backend_name { #[cfg(feature = "llvm")] "llvm" => rustc_codegen_llvm::LlvmCodegenBackend::new, - _ => get_codegen_sysroot(backend_name), + _ => get_codegen_sysroot(maybe_sysroot, backend_name), } } -pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> { +pub fn get_codegen_sysroot( + maybe_sysroot: &Option<PathBuf>, + backend_name: &str, +) -> fn() -> Box<dyn CodegenBackend> { // For now we only allow this function to be called once as it'll dlopen a // few things, which seems to work best if we only do that once. In // general this assertion never trips due to the once guard in `get_codegen_backend`, @@ -389,8 +395,9 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend let target = session::config::host_triple(); let sysroot_candidates = sysroot_candidates(); - let sysroot = sysroot_candidates + let sysroot = maybe_sysroot .iter() + .chain(sysroot_candidates.iter()) .map(|sysroot| { let libdir = filesearch::relative_target_lib_path(&sysroot, &target); sysroot.join(libdir).with_file_name("codegen-backends") @@ -426,8 +433,10 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend let mut file: Option<PathBuf> = None; - let expected_name = - format!("rustc_codegen_{}-{}", backend_name, release_str().expect("CFG_RELEASE")); + let expected_names = &[ + format!("rustc_codegen_{}-{}", backend_name, release_str().expect("CFG_RELEASE")), + format!("rustc_codegen_{}", backend_name), + ]; for entry in d.filter_map(|e| e.ok()) { let path = entry.path(); let filename = match path.file_name().and_then(|s| s.to_str()) { @@ -438,7 +447,7 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend continue; } let name = &filename[DLL_PREFIX.len()..filename.len() - DLL_SUFFIX.len()]; - if name != expected_name { + if !expected_names.iter().any(|expected| expected == name) { continue; } if let Some(ref prev) = file { |
