Rollup merge of #150747 - fix/liloading-enzyme-err, r=lqd
tests/ui/runtime/on-broken-pipe/with-rustc_main.rs: Not needed so remove related: https://github.com/rust-lang/rust/issues/145899#issuecomment-3705550673 print error from EnzymeWrapper::get_or_init(sysroot) as a note r? @ZuseZ4 e.g. 1. when libEnzyme not found ```shell $ rustc +stage1 -Z autodiff=Enable -C lto=fat src/main.rs error: autodiff backend not found in the sysroot: failed to find a `libEnzyme-21` folder in the sysroot candidates: * /Volumes/WD_BLACK_SN850X_HS_1TB/rust-lang/rust/build/aarch64-apple-darwin/stage1/lib | = note: it will be distributed via rustup in the future ``` 2. when could not load libEnzyme successfully ```shell rustc +stage1 -Z autodiff=Enable -C lto=fat src/main.rs error: failed to load our autodiff backend: DlOpen { source: "dlopen(/Volumes/WD_BLACK_SN850X_HS_1TB/rust-lang/rust/build/aarch64-apple-darwin/stage1/lib/rustlib/aarch64-apple-darwin/lib/libEnzyme-21.dylib, 0x0005): tried: \'/Volumes/WD_BLACK_SN850X_HS_1TB/rust-lang/rust/build/aarch64-apple-darwin/stage1/lib/rustlib/aarch64-apple-darwin/lib/libEnzyme-21.dylib\' (slice is not valid mach-o file), \'/System/Volumes/Preboot/Cryptexes/OS/Volumes/WD_BLACK_SN850X_HS_1TB/rust-lang/rust/build/aarch64-apple-darwin/stage1/lib/rustlib/aarch64-apple-darwin/lib/libEnzyme-21.dylib\' (no such file), \'/Volumes/WD_BLACK_SN850X_HS_1TB/rust-lang/rust/build/aarch64-apple-darwin/stage1/lib/rustlib/aarch64-apple-darwin/lib/libEnzyme-21.dylib\' (slice is not valid mach-o file)" } ```
This commit is contained in:
commit
dadacb6589
4 changed files with 47 additions and 13 deletions
|
|
@ -1,4 +1,7 @@
|
|||
codegen_llvm_autodiff_component_unavailable = failed to load our autodiff backend. Did you install it via rustup?
|
||||
codegen_llvm_autodiff_component_missing = autodiff backend not found in the sysroot: {$err}
|
||||
.note = it will be distributed via rustup in the future
|
||||
|
||||
codegen_llvm_autodiff_component_unavailable = failed to load our autodiff backend: {$err}
|
||||
|
||||
codegen_llvm_autodiff_without_enable = using the autodiff feature requires -Z autodiff=Enable
|
||||
codegen_llvm_autodiff_without_lto = using the autodiff feature requires setting `lto="fat"` in your Cargo.toml
|
||||
|
|
|
|||
|
|
@ -34,7 +34,16 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for ParseTargetMachineConfig<'_> {
|
|||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_autodiff_component_unavailable)]
|
||||
pub(crate) struct AutoDiffComponentUnavailable;
|
||||
pub(crate) struct AutoDiffComponentUnavailable {
|
||||
pub err: String,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_autodiff_component_missing)]
|
||||
#[note]
|
||||
pub(crate) struct AutoDiffComponentMissing {
|
||||
pub err: String,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_autodiff_without_lto)]
|
||||
|
|
|
|||
|
|
@ -249,8 +249,14 @@ impl CodegenBackend for LlvmCodegenBackend {
|
|||
|
||||
use crate::back::lto::enable_autodiff_settings;
|
||||
if sess.opts.unstable_opts.autodiff.contains(&AutoDiff::Enable) {
|
||||
if let Err(_) = llvm::EnzymeWrapper::get_or_init(&sess.opts.sysroot) {
|
||||
sess.dcx().emit_fatal(crate::errors::AutoDiffComponentUnavailable);
|
||||
match llvm::EnzymeWrapper::get_or_init(&sess.opts.sysroot) {
|
||||
Ok(_) => {}
|
||||
Err(llvm::EnzymeLibraryError::NotFound { err }) => {
|
||||
sess.dcx().emit_fatal(crate::errors::AutoDiffComponentMissing { err });
|
||||
}
|
||||
Err(llvm::EnzymeLibraryError::LoadFailed { err }) => {
|
||||
sess.dcx().emit_fatal(crate::errors::AutoDiffComponentUnavailable { err });
|
||||
}
|
||||
}
|
||||
enable_autodiff_settings(&sess.opts.unstable_opts.autodiff);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ pub(crate) mod Enzyme_AD {
|
|||
fn load_ptr_by_symbol_mut_void(
|
||||
lib: &libloading::Library,
|
||||
bytes: &[u8],
|
||||
) -> Result<*mut c_void, Box<dyn std::error::Error>> {
|
||||
) -> Result<*mut c_void, libloading::Error> {
|
||||
unsafe {
|
||||
let s: libloading::Symbol<'_, *mut c_void> = lib.get(bytes)?;
|
||||
// libloading = 0.9.0: try_as_raw_ptr always succeeds and returns Some
|
||||
|
|
@ -192,15 +192,27 @@ pub(crate) mod Enzyme_AD {
|
|||
|
||||
static ENZYME_INSTANCE: OnceLock<Mutex<EnzymeWrapper>> = OnceLock::new();
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) enum EnzymeLibraryError {
|
||||
NotFound { err: String },
|
||||
LoadFailed { err: String },
|
||||
}
|
||||
|
||||
impl From<libloading::Error> for EnzymeLibraryError {
|
||||
fn from(err: libloading::Error) -> Self {
|
||||
Self::LoadFailed { err: format!("{err:?}") }
|
||||
}
|
||||
}
|
||||
|
||||
impl EnzymeWrapper {
|
||||
/// Initialize EnzymeWrapper with the given sysroot if not already initialized.
|
||||
/// Safe to call multiple times - subsequent calls are no-ops due to OnceLock.
|
||||
pub(crate) fn get_or_init(
|
||||
sysroot: &rustc_session::config::Sysroot,
|
||||
) -> Result<MutexGuard<'static, Self>, Box<dyn std::error::Error>> {
|
||||
) -> Result<MutexGuard<'static, Self>, EnzymeLibraryError> {
|
||||
let mtx: &'static Mutex<EnzymeWrapper> = ENZYME_INSTANCE.get_or_try_init(|| {
|
||||
let w = Self::call_dynamic(sysroot)?;
|
||||
Ok::<_, Box<dyn std::error::Error>>(Mutex::new(w))
|
||||
Ok::<_, EnzymeLibraryError>(Mutex::new(w))
|
||||
})?;
|
||||
|
||||
Ok(mtx.lock().unwrap())
|
||||
|
|
@ -351,7 +363,7 @@ pub(crate) mod Enzyme_AD {
|
|||
#[allow(non_snake_case)]
|
||||
fn call_dynamic(
|
||||
sysroot: &rustc_session::config::Sysroot,
|
||||
) -> Result<Self, Box<dyn std::error::Error>> {
|
||||
) -> Result<Self, EnzymeLibraryError> {
|
||||
let enzyme_path = Self::get_enzyme_path(sysroot)?;
|
||||
let lib = unsafe { libloading::Library::new(enzyme_path)? };
|
||||
|
||||
|
|
@ -416,7 +428,7 @@ pub(crate) mod Enzyme_AD {
|
|||
})
|
||||
}
|
||||
|
||||
fn get_enzyme_path(sysroot: &Sysroot) -> Result<String, String> {
|
||||
fn get_enzyme_path(sysroot: &Sysroot) -> Result<String, EnzymeLibraryError> {
|
||||
let llvm_version_major = unsafe { LLVMRustVersionMajor() };
|
||||
|
||||
let path_buf = sysroot
|
||||
|
|
@ -434,15 +446,19 @@ pub(crate) mod Enzyme_AD {
|
|||
.map(|p| p.join("lib").display().to_string())
|
||||
.collect::<Vec<String>>()
|
||||
.join("\n* ");
|
||||
format!(
|
||||
"failed to find a `libEnzyme-{llvm_version_major}` folder \
|
||||
EnzymeLibraryError::NotFound {
|
||||
err: format!(
|
||||
"failed to find a `libEnzyme-{llvm_version_major}` folder \
|
||||
in the sysroot candidates:\n* {candidates}"
|
||||
)
|
||||
),
|
||||
}
|
||||
})?;
|
||||
|
||||
Ok(path_buf
|
||||
.to_str()
|
||||
.ok_or_else(|| format!("invalid UTF-8 in path: {}", path_buf.display()))?
|
||||
.ok_or_else(|| EnzymeLibraryError::LoadFailed {
|
||||
err: format!("invalid UTF-8 in path: {}", path_buf.display()),
|
||||
})?
|
||||
.to_string())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue