11#![ expect( dead_code) ]
22
3+
4+ use tracing:: info;
5+
6+ use std:: path:: Path ;
7+
38use libc:: { c_char, c_uint} ;
49
510use super :: MetadataKindId ;
@@ -107,18 +112,20 @@ pub(crate) struct EnzymeFns {
107112 }
108113 dbg ! ( "starting" ) ;
109114 dbg ! ( "Loading Enzyme" ) ;
110- let lib = unsafe { libloading:: Library :: new ( "/home/manuel/prog/rust/build/x86_64-unknown-linux-gnu/enzyme/lib/libEnzyme-21.so" ) ?} ;
115+ use std:: sync:: OnceLock ;
116+ static ENZYME_PATH : OnceLock < String > = OnceLock :: new ( ) ;
117+ assert ! ( ENZYME_PATH . get( ) . is_some( ) ) ;
118+ let mypath = ENZYME_PATH . get ( ) . unwrap ( ) ; // load Library from mypath
119+ let lib = unsafe { libloading:: Library :: new ( mypath) ?} ;
120+ //let lib = unsafe {libloading::Library::new("/home/manuel/prog/rust/build/x86_64-unknown-linux-gnu/enzyme/lib/libEnzyme-21.so")?};
111121 dbg ! ( "second" ) ;
112122 let EnzymeSetCLBool : libloading:: Symbol < ' _ , SetFlag > = unsafe { lib. get ( b"EnzymeSetCLBool" ) ?} ;
113123 dbg ! ( "third" ) ;
114124 let registerEnzymeAndPassPipeline =
115125 load_ptr ( & lib, b"registerEnzymeAndPassPipeline" ) . unwrap ( ) as * const c_void ;
116126 dbg ! ( "fourth" ) ;
117- //let EnzymeSetCLBool: libloading::Symbol<'_, unsafe extern "C" fn(&mut c_void, u8) -> ()> = unsafe{lib.get(b"registerEnzymeAndPassPipeline")?};
118- //let EnzymeSetCLBool = unsafe {EnzymeSetCLBool.try_as_raw_ptr().unwrap()};
119127 let EnzymeSetCLString : libloading:: Symbol < ' _ , SetFlag > = unsafe { lib. get ( b"EnzymeSetCLString" ) ?} ;
120128 dbg ! ( "done" ) ;
121- //let EnzymeSetCLString = unsafe {EnzymeSetCLString.try_as_raw_ptr().unwrap()};
122129
123130 let EnzymePrintPerf = load_ptr ( & lib, b"EnzymePrintPerf" ) . unwrap ( ) ;
124131 let EnzymePrintActivity = load_ptr ( & lib, b"EnzymePrintActivity" ) . unwrap ( ) ;
@@ -141,8 +148,6 @@ pub(crate) struct EnzymeFns {
141148 looseTypeAnalysis,
142149 EnzymeInline ,
143150 RustTypeRules ,
144- //EnzymeSetCLBool: EnzymeFns {set_cl: unsafe{*EnzymeSetCLBool}},
145- //EnzymeSetCLString: EnzymeFns {set_cl: unsafe{*EnzymeSetCLString}},
146151 EnzymeSetCLBool : EnzymeFns { set_cl : * EnzymeSetCLBool } ,
147152 EnzymeSetCLString : EnzymeFns { set_cl : * EnzymeSetCLString } ,
148153 registerEnzymeAndPassPipeline,
@@ -152,17 +157,72 @@ pub(crate) struct EnzymeFns {
152157 Ok ( wrap)
153158 }
154159use std:: sync:: Mutex ;
160+ use rustc_middle:: bug;
161+ use tracing:: info;
162+ use rustc_session:: filesearch;
163+ use rustc_session:: Session ;
164+ use rustc_session:: config:: host_tuple;
155165unsafe impl Sync for EnzymeWrapper { }
156166unsafe impl Send for EnzymeWrapper { }
157167 impl EnzymeWrapper {
158168 pub ( crate ) fn current ( ) -> & ' static Mutex < EnzymeWrapper > {
159169 use std:: sync:: OnceLock ;
160170 static CELL : OnceLock < Mutex < EnzymeWrapper > > = OnceLock :: new ( ) ;
171+ static ENZYME_PATH : OnceLock < String > = OnceLock :: new ( ) ;
161172 fn init_enzyme ( ) -> Mutex < EnzymeWrapper > {
162173 call_dynamic ( ) . unwrap ( ) . into ( )
163174 }
175+ ENZYME_PATH . wait ( ) ;
176+ //if ENZYME_PATH.get().is_none() {
177+ // bug!("enzyme path is none!");
178+ //}
164179 CELL . get_or_init ( || init_enzyme ( ) )
165180 }
181+ pub ( crate ) fn set_path ( session : & Session ) -> String {
182+ fn get_enzyme_path ( session : & Session ) -> String {
183+ dbg ! ( "starting" ) ;
184+ dbg ! ( "Loading Enzyme" ) ;
185+ let target = host_tuple ( ) ;
186+ let lib_ext = std:: env:: consts:: DLL_EXTENSION ;
187+ let sysroot = & session. opts . sysroot ;
188+ //dbg!(sysroot);
189+
190+ let sysroot = sysroot
191+ . all_paths ( )
192+ . map ( |sysroot| {
193+ filesearch:: make_target_lib_path ( sysroot, target) . join ( "lib" ) . with_file_name ( "libEnzyme-21" ) . with_extension ( lib_ext)
194+ //filesearch::make_target_lib_path(sysroot, target).join("lib").with_file_name("lib")
195+ } )
196+ . find ( |f| {
197+ info ! ( "Enzyme candidate: {}" , f. display( ) ) ;
198+ f. exists ( )
199+ } )
200+ . unwrap_or_else ( || {
201+ let candidates = sysroot
202+ . all_paths ( )
203+ . map ( |p| p. join ( "lib" ) . display ( ) . to_string ( ) )
204+ . collect :: < Vec < _ > > ( )
205+ . join ( "\n * " ) ;
206+ let err = format ! (
207+ "failed to find a `libEnzyme` folder \
208+ in the sysroot candidates:\n * {candidates}"
209+ ) ;
210+ dbg ! ( & err) ;
211+ bug ! ( "asdf" ) ;
212+ //early_dcx.early_fatal(err);
213+ } ) ;
214+
215+ info ! ( "probing {} for a codegen backend" , sysroot. display( ) ) ;
216+ let enzyme_path = sysroot. to_str ( ) . unwrap ( ) . to_string ( ) ;
217+ //dbg!(&enzyme_path);
218+ enzyme_path
219+ }
220+ use std:: sync:: OnceLock ;
221+ static ENZYME_PATH : OnceLock < String > = OnceLock :: new ( ) ;
222+ ENZYME_PATH . get_or_init ( || get_enzyme_path ( session) ) . to_string ( )
223+ //ENZYME_PATH.get().unwrap().to_string()
224+ //ENZYME_PATH.get_or_init(|| get_enzyme_path(session)).clone()
225+ }
166226 pub ( crate ) fn set_print_perf ( & mut self , print : bool ) {
167227 unsafe {
168228 //(self.EnzymeSetCLBool.set_cl)(self.EnzymePrintPerf, print as u8);
0 commit comments