Skip to main content

diffsol_c/
jit_c.rs

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/// Return the number of JIT backends compiled into this library.
37///
38/// # Safety
39/// This function is safe to call from C. It does not dereference any
40/// caller-provided pointers.
41#[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/// Return whether a JIT backend enum value is valid.
47///
48/// # Safety
49/// This function is safe to call from C. It does not dereference any
50/// caller-provided pointers.
51#[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/// Return the name of a JIT backend enum value.
62///
63/// # Safety
64/// The returned pointer is borrowed from static storage owned by this library
65/// and must not be freed or mutated by the caller.
66#[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}