gccjit/
asm.rs

1use std::ffi::CString;
2use std::marker::PhantomData;
3use std::os::raw::c_int;
4
5use {Context, LValue, Object, RValue, ToObject, lvalue, object, rvalue};
6
7#[derive(Copy, Clone)]
8pub struct ExtendedAsm<'ctx> {
9    marker: PhantomData<&'ctx Context<'ctx>>,
10    ptr: *mut gccjit_sys::gcc_jit_extended_asm
11}
12
13impl<'ctx> ToObject<'ctx> for ExtendedAsm<'ctx> {
14    fn to_object(&self) -> Object<'ctx> {
15        unsafe {
16            let ptr = gccjit_sys::gcc_jit_extended_asm_as_object(self.ptr);
17            object::from_ptr(ptr)
18        }
19    }
20}
21
22impl<'ctx> ExtendedAsm<'ctx> {
23    pub fn set_volatile_flag(&self, flag: bool) {
24        unsafe {
25            gccjit_sys::gcc_jit_extended_asm_set_volatile_flag(self.ptr, flag as c_int);
26        }
27    }
28
29    pub fn set_inline_flag(&self, flag: bool) {
30        unsafe {
31            gccjit_sys::gcc_jit_extended_asm_set_inline_flag(self.ptr, flag as c_int);
32        }
33    }
34
35    pub fn add_output_operand(&self, asm_symbolic_name: Option<&str>, constraint: &str, dest: LValue<'ctx>) {
36        let asm_symbolic_name = asm_symbolic_name.map(|name| CString::new(name).unwrap());
37        let asm_symbolic_name =
38            match asm_symbolic_name {
39                Some(name) => name.as_ptr(),
40                None => std::ptr::null_mut(),
41            };
42        let constraint = CString::new(constraint).unwrap();
43        unsafe {
44            gccjit_sys::gcc_jit_extended_asm_add_output_operand(self.ptr, asm_symbolic_name, constraint.as_ptr(), lvalue::get_ptr(&dest));
45        }
46    }
47
48    pub fn add_input_operand(&self, asm_symbolic_name: Option<&str>, constraint: &str, src: RValue<'ctx>) {
49        let asm_symbolic_name = asm_symbolic_name.map(|name| CString::new(name).unwrap());
50        let asm_symbolic_name =
51            match asm_symbolic_name {
52                Some(name) => name.as_ptr(),
53                None => std::ptr::null_mut(),
54            };
55        let constraint = CString::new(constraint).unwrap();
56        unsafe {
57            gccjit_sys::gcc_jit_extended_asm_add_input_operand(self.ptr, asm_symbolic_name, constraint.as_ptr(), rvalue::get_ptr(&src));
58        }
59    }
60
61    pub fn add_clobber(&self, victim: &str) {
62        let victim = CString::new(victim).unwrap();
63        unsafe {
64            gccjit_sys::gcc_jit_extended_asm_add_clobber(self.ptr, victim.as_ptr());
65        }
66    }
67
68    pub unsafe fn from_ptr(ptr: *mut gccjit_sys::gcc_jit_extended_asm) -> Self {
69        Self {
70            marker: PhantomData,
71            ptr
72        }
73    }
74}