1use std::os::raw::c_char;
2use std::ptr;
3
4use crate::c_invalid_arg;
5use crate::jit::JitBackendType;
6
7#[cfg(feature = "diffsl-cranelift")]
8const JIT_BACKEND_CRANELIFT: &[u8] = b"cranelift\0";
9#[cfg(feature = "diffsl-llvm")]
10const JIT_BACKEND_LLVM: &[u8] = b"llvm\0";
11
12pub(crate) fn jit_backend_from_i32(value: i32) -> Option<JitBackendType> {
13 match value {
14 #[cfg(feature = "diffsl-cranelift")]
15 0 => Some(JitBackendType::Cranelift),
16 #[cfg(all(feature = "diffsl-cranelift", feature = "diffsl-llvm"))]
17 1 => Some(JitBackendType::Llvm),
18 #[cfg(all(not(feature = "diffsl-cranelift"), feature = "diffsl-llvm"))]
19 0 => Some(JitBackendType::Llvm),
20 _ => None,
21 }
22}
23
24#[allow(dead_code)]
25pub(crate) fn jit_backend_to_i32(value: JitBackendType) -> i32 {
26 match value {
27 #[cfg(feature = "diffsl-cranelift")]
28 JitBackendType::Cranelift => 0,
29 #[cfg(all(feature = "diffsl-cranelift", feature = "diffsl-llvm"))]
30 JitBackendType::Llvm => 1,
31 #[cfg(all(not(feature = "diffsl-cranelift"), feature = "diffsl-llvm"))]
32 JitBackendType::Llvm => 0,
33 }
34}
35
36#[unsafe(no_mangle)]
42pub unsafe extern "C" fn diffsol_jit_backend_type_count() -> usize {
43 usize::from(cfg!(feature = "diffsl-cranelift")) + usize::from(cfg!(feature = "diffsl-llvm"))
44}
45
46#[unsafe(no_mangle)]
52pub unsafe extern "C" fn diffsol_jit_backend_type_is_valid(value: i32) -> i32 {
53 if jit_backend_from_i32(value).is_some() {
54 1
55 } else {
56 c_invalid_arg!("invalid jit_backend_type");
57 0
58 }
59}
60
61#[unsafe(no_mangle)]
67pub unsafe extern "C" fn diffsol_jit_backend_type_name(value: i32) -> *const c_char {
68 match jit_backend_from_i32(value) {
69 #[cfg(feature = "diffsl-cranelift")]
70 Some(JitBackendType::Cranelift) => JIT_BACKEND_CRANELIFT.as_ptr() as *const c_char,
71 #[cfg(feature = "diffsl-llvm")]
72 Some(JitBackendType::Llvm) => JIT_BACKEND_LLVM.as_ptr() as *const c_char,
73 None => {
74 c_invalid_arg!("invalid jit_backend_type");
75 ptr::null()
76 }
77 }
78}