rustc_codegen_llvm/llvm/
enzyme_ffi.rs

1#![expect(dead_code)]
2
3use libc::{c_char, c_uint};
4
5use super::MetadataKindId;
6use super::ffi::{AttributeKind, BasicBlock, Metadata, Module, Type, Value};
7use crate::llvm::Bool;
8
9#[link(name = "llvm-wrapper", kind = "static")]
10unsafe extern "C" {
11    // Enzyme
12    pub(crate) safe fn LLVMRustHasMetadata(I: &Value, KindID: MetadataKindId) -> bool;
13    pub(crate) fn LLVMRustEraseInstUntilInclusive(BB: &BasicBlock, I: &Value);
14    pub(crate) fn LLVMRustGetLastInstruction<'a>(BB: &BasicBlock) -> Option<&'a Value>;
15    pub(crate) fn LLVMRustDIGetInstMetadata(I: &Value) -> Option<&Metadata>;
16    pub(crate) fn LLVMRustEraseInstFromParent(V: &Value);
17    pub(crate) fn LLVMRustGetTerminator<'a>(B: &BasicBlock) -> &'a Value;
18    pub(crate) fn LLVMRustVerifyFunction(V: &Value, action: LLVMRustVerifierFailureAction) -> Bool;
19    pub(crate) fn LLVMRustHasAttributeAtIndex(V: &Value, i: c_uint, Kind: AttributeKind) -> bool;
20    pub(crate) fn LLVMRustGetArrayNumElements(Ty: &Type) -> u64;
21    pub(crate) fn LLVMRustHasFnAttribute(
22        F: &Value,
23        Name: *const c_char,
24        NameLen: libc::size_t,
25    ) -> bool;
26    pub(crate) fn LLVMRustRemoveFnAttribute(F: &Value, Name: *const c_char, NameLen: libc::size_t);
27    pub(crate) fn LLVMGetFirstFunction(M: &Module) -> Option<&Value>;
28    pub(crate) fn LLVMGetNextFunction(Fn: &Value) -> Option<&Value>;
29    pub(crate) fn LLVMRustRemoveEnumAttributeAtIndex(
30        Fn: &Value,
31        index: c_uint,
32        kind: AttributeKind,
33    );
34}
35
36unsafe extern "C" {
37    // Enzyme
38    pub(crate) fn LLVMDumpModule(M: &Module);
39    pub(crate) fn LLVMDumpValue(V: &Value);
40    pub(crate) fn LLVMGetFunctionCallConv(F: &Value) -> c_uint;
41    pub(crate) fn LLVMGetReturnType(T: &Type) -> &Type;
42    pub(crate) fn LLVMGetParams(Fnc: &Value, params: *mut &Value);
43    pub(crate) fn LLVMGetNamedFunction(M: &Module, Name: *const c_char) -> Option<&Value>;
44}
45
46#[repr(C)]
47#[derive(Copy, Clone, PartialEq)]
48pub(crate) enum LLVMRustVerifierFailureAction {
49    LLVMAbortProcessAction = 0,
50    LLVMPrintMessageAction = 1,
51    LLVMReturnStatusAction = 2,
52}
53
54#[cfg(llvm_enzyme)]
55pub(crate) use self::Enzyme_AD::*;
56
57#[cfg(llvm_enzyme)]
58pub(crate) mod Enzyme_AD {
59    use std::ffi::{CString, c_char};
60
61    use libc::c_void;
62
63    unsafe extern "C" {
64        pub(crate) fn EnzymeSetCLBool(arg1: *mut ::std::os::raw::c_void, arg2: u8);
65        pub(crate) fn EnzymeSetCLString(arg1: *mut ::std::os::raw::c_void, arg2: *const c_char);
66    }
67    unsafe extern "C" {
68        static mut EnzymePrintPerf: c_void;
69        static mut EnzymePrintActivity: c_void;
70        static mut EnzymePrintType: c_void;
71        static mut EnzymeFunctionToAnalyze: c_void;
72        static mut EnzymePrint: c_void;
73        static mut EnzymeStrictAliasing: c_void;
74        static mut looseTypeAnalysis: c_void;
75        static mut EnzymeInline: c_void;
76        static mut RustTypeRules: c_void;
77    }
78    pub(crate) fn set_print_perf(print: bool) {
79        unsafe {
80            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymePrintPerf), print as u8);
81        }
82    }
83    pub(crate) fn set_print_activity(print: bool) {
84        unsafe {
85            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymePrintActivity), print as u8);
86        }
87    }
88    pub(crate) fn set_print_type(print: bool) {
89        unsafe {
90            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymePrintType), print as u8);
91        }
92    }
93    pub(crate) fn set_print_type_fun(fun_name: &str) {
94        let c_fun_name = CString::new(fun_name).unwrap();
95        unsafe {
96            EnzymeSetCLString(
97                std::ptr::addr_of_mut!(EnzymeFunctionToAnalyze),
98                c_fun_name.as_ptr() as *const c_char,
99            );
100        }
101    }
102    pub(crate) fn set_print(print: bool) {
103        unsafe {
104            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymePrint), print as u8);
105        }
106    }
107    pub(crate) fn set_strict_aliasing(strict: bool) {
108        unsafe {
109            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymeStrictAliasing), strict as u8);
110        }
111    }
112    pub(crate) fn set_loose_types(loose: bool) {
113        unsafe {
114            EnzymeSetCLBool(std::ptr::addr_of_mut!(looseTypeAnalysis), loose as u8);
115        }
116    }
117    pub(crate) fn set_inline(val: bool) {
118        unsafe {
119            EnzymeSetCLBool(std::ptr::addr_of_mut!(EnzymeInline), val as u8);
120        }
121    }
122    pub(crate) fn set_rust_rules(val: bool) {
123        unsafe {
124            EnzymeSetCLBool(std::ptr::addr_of_mut!(RustTypeRules), val as u8);
125        }
126    }
127}
128
129#[cfg(not(llvm_enzyme))]
130pub(crate) use self::Fallback_AD::*;
131
132#[cfg(not(llvm_enzyme))]
133pub(crate) mod Fallback_AD {
134    #![allow(unused_variables)]
135
136    pub(crate) fn set_inline(val: bool) {
137        unimplemented!()
138    }
139    pub(crate) fn set_print_perf(print: bool) {
140        unimplemented!()
141    }
142    pub(crate) fn set_print_activity(print: bool) {
143        unimplemented!()
144    }
145    pub(crate) fn set_print_type(print: bool) {
146        unimplemented!()
147    }
148    pub(crate) fn set_print_type_fun(fun_name: &str) {
149        unimplemented!()
150    }
151    pub(crate) fn set_print(print: bool) {
152        unimplemented!()
153    }
154    pub(crate) fn set_strict_aliasing(strict: bool) {
155        unimplemented!()
156    }
157    pub(crate) fn set_loose_types(loose: bool) {
158        unimplemented!()
159    }
160    pub(crate) fn set_rust_rules(val: bool) {
161        unimplemented!()
162    }
163}