Skip to content

Commit f1b0c51

Browse files
committed
deadlocks, the backend thread never get's ENZYME_PATH initialized
1 parent cc7c7b2 commit f1b0c51

File tree

2 files changed

+67
-6
lines changed

2 files changed

+67
-6
lines changed

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,7 @@ impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
834834
}
835835

836836
fn sess(&self) -> &Session {
837+
let _enzyme = crate::llvm::EnzymeWrapper::set_path(self.tcx.sess);
837838
self.tcx.sess
838839
}
839840

compiler/rustc_codegen_llvm/src/llvm/enzyme_ffi.rs

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
#![expect(dead_code)]
22

3+
4+
use tracing::info;
5+
6+
use std::path::Path;
7+
38
use libc::{c_char, c_uint};
49

510
use 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
}
154159
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;
155165
unsafe impl Sync for EnzymeWrapper {}
156166
unsafe 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

Comments
 (0)