1
1
#![ expect( dead_code) ]
2
2
3
+
4
+ use tracing:: info;
5
+
6
+ use std:: path:: Path ;
7
+
3
8
use libc:: { c_char, c_uint} ;
4
9
5
10
use super :: MetadataKindId ;
@@ -107,18 +112,20 @@ pub(crate) struct EnzymeFns {
107
112
}
108
113
dbg ! ( "starting" ) ;
109
114
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")?};
111
121
dbg ! ( "second" ) ;
112
122
let EnzymeSetCLBool : libloading:: Symbol < ' _ , SetFlag > = unsafe { lib. get ( b"EnzymeSetCLBool" ) ?} ;
113
123
dbg ! ( "third" ) ;
114
124
let registerEnzymeAndPassPipeline =
115
125
load_ptr ( & lib, b"registerEnzymeAndPassPipeline" ) . unwrap ( ) as * const c_void ;
116
126
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()};
119
127
let EnzymeSetCLString : libloading:: Symbol < ' _ , SetFlag > = unsafe { lib. get ( b"EnzymeSetCLString" ) ?} ;
120
128
dbg ! ( "done" ) ;
121
- //let EnzymeSetCLString = unsafe {EnzymeSetCLString.try_as_raw_ptr().unwrap()};
122
129
123
130
let EnzymePrintPerf = load_ptr ( & lib, b"EnzymePrintPerf" ) . unwrap ( ) ;
124
131
let EnzymePrintActivity = load_ptr ( & lib, b"EnzymePrintActivity" ) . unwrap ( ) ;
@@ -141,8 +148,6 @@ pub(crate) struct EnzymeFns {
141
148
looseTypeAnalysis,
142
149
EnzymeInline ,
143
150
RustTypeRules ,
144
- //EnzymeSetCLBool: EnzymeFns {set_cl: unsafe{*EnzymeSetCLBool}},
145
- //EnzymeSetCLString: EnzymeFns {set_cl: unsafe{*EnzymeSetCLString}},
146
151
EnzymeSetCLBool : EnzymeFns { set_cl : * EnzymeSetCLBool } ,
147
152
EnzymeSetCLString : EnzymeFns { set_cl : * EnzymeSetCLString } ,
148
153
registerEnzymeAndPassPipeline,
@@ -152,17 +157,72 @@ pub(crate) struct EnzymeFns {
152
157
Ok ( wrap)
153
158
}
154
159
use 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;
155
165
unsafe impl Sync for EnzymeWrapper { }
156
166
unsafe impl Send for EnzymeWrapper { }
157
167
impl EnzymeWrapper {
158
168
pub ( crate ) fn current ( ) -> & ' static Mutex < EnzymeWrapper > {
159
169
use std:: sync:: OnceLock ;
160
170
static CELL : OnceLock < Mutex < EnzymeWrapper > > = OnceLock :: new ( ) ;
171
+ static ENZYME_PATH : OnceLock < String > = OnceLock :: new ( ) ;
161
172
fn init_enzyme ( ) -> Mutex < EnzymeWrapper > {
162
173
call_dynamic ( ) . unwrap ( ) . into ( )
163
174
}
175
+ ENZYME_PATH . wait ( ) ;
176
+ //if ENZYME_PATH.get().is_none() {
177
+ // bug!("enzyme path is none!");
178
+ //}
164
179
CELL . get_or_init ( || init_enzyme ( ) )
165
180
}
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
+ }
166
226
pub ( crate ) fn set_print_perf ( & mut self , print : bool ) {
167
227
unsafe {
168
228
//(self.EnzymeSetCLBool.set_cl)(self.EnzymePrintPerf, print as u8);
0 commit comments