@@ -153,7 +153,7 @@ pub(crate) mod Enzyme_AD {
153153 fn load_ptr_by_symbol_mut_void (
154154 lib : & libloading:: Library ,
155155 bytes : & [ u8 ] ,
156- ) -> Result < * mut c_void , Box < dyn std :: error :: Error > > {
156+ ) -> Result < * mut c_void , libloading :: Error > {
157157 unsafe {
158158 let s: libloading:: Symbol < ' _ , * mut c_void > = lib. get ( bytes) ?;
159159 // libloading = 0.9.0: try_as_raw_ptr always succeeds and returns Some
@@ -192,15 +192,27 @@ pub(crate) mod Enzyme_AD {
192192
193193 static ENZYME_INSTANCE : OnceLock < Mutex < EnzymeWrapper > > = OnceLock :: new ( ) ;
194194
195+ #[ derive( Debug ) ]
196+ pub ( crate ) enum EnzymeLibraryError {
197+ NotFound { err : String } ,
198+ LoadFailed { err : String } ,
199+ }
200+
201+ impl From < libloading:: Error > for EnzymeLibraryError {
202+ fn from ( err : libloading:: Error ) -> Self {
203+ Self :: LoadFailed { err : format ! ( "{err:?}" ) }
204+ }
205+ }
206+
195207 impl EnzymeWrapper {
196208 /// Initialize EnzymeWrapper with the given sysroot if not already initialized.
197209 /// Safe to call multiple times - subsequent calls are no-ops due to OnceLock.
198210 pub ( crate ) fn get_or_init (
199211 sysroot : & rustc_session:: config:: Sysroot ,
200- ) -> Result < MutexGuard < ' static , Self > , Box < dyn std :: error :: Error > > {
212+ ) -> Result < MutexGuard < ' static , Self > , EnzymeLibraryError > {
201213 let mtx: & ' static Mutex < EnzymeWrapper > = ENZYME_INSTANCE . get_or_try_init ( || {
202214 let w = Self :: call_dynamic ( sysroot) ?;
203- Ok :: < _ , Box < dyn std :: error :: Error > > ( Mutex :: new ( w) )
215+ Ok :: < _ , EnzymeLibraryError > ( Mutex :: new ( w) )
204216 } ) ?;
205217
206218 Ok ( mtx. lock ( ) . unwrap ( ) )
@@ -351,7 +363,7 @@ pub(crate) mod Enzyme_AD {
351363 #[ allow( non_snake_case) ]
352364 fn call_dynamic (
353365 sysroot : & rustc_session:: config:: Sysroot ,
354- ) -> Result < Self , Box < dyn std :: error :: Error > > {
366+ ) -> Result < Self , EnzymeLibraryError > {
355367 let enzyme_path = Self :: get_enzyme_path ( sysroot) ?;
356368 let lib = unsafe { libloading:: Library :: new ( enzyme_path) ? } ;
357369
@@ -416,7 +428,7 @@ pub(crate) mod Enzyme_AD {
416428 } )
417429 }
418430
419- fn get_enzyme_path ( sysroot : & Sysroot ) -> Result < String , String > {
431+ fn get_enzyme_path ( sysroot : & Sysroot ) -> Result < String , EnzymeLibraryError > {
420432 let llvm_version_major = unsafe { LLVMRustVersionMajor ( ) } ;
421433
422434 let path_buf = sysroot
@@ -434,15 +446,19 @@ pub(crate) mod Enzyme_AD {
434446 . map ( |p| p. join ( "lib" ) . display ( ) . to_string ( ) )
435447 . collect :: < Vec < String > > ( )
436448 . join ( "\n * " ) ;
437- format ! (
438- "failed to find a `libEnzyme-{llvm_version_major}` folder \
449+ EnzymeLibraryError :: NotFound {
450+ err : format ! (
451+ "failed to find a `libEnzyme-{llvm_version_major}` folder \
439452 in the sysroot candidates:\n * {candidates}"
440- )
453+ ) ,
454+ }
441455 } ) ?;
442456
443457 Ok ( path_buf
444458 . to_str ( )
445- . ok_or_else ( || format ! ( "invalid UTF-8 in path: {}" , path_buf. display( ) ) ) ?
459+ . ok_or_else ( || EnzymeLibraryError :: LoadFailed {
460+ err : format ! ( "invalid UTF-8 in path: {}" , path_buf. display( ) ) ,
461+ } ) ?
446462 . to_string ( ) )
447463 }
448464 }
0 commit comments