llvm_quick/core/
memory_buffers.rs

1use std::ffi::CStr;
2use std::ptr::null_mut;
3
4use llvm_sys::core::*;
5use llvm_sys::LLVMMemoryBuffer;
6
7use crate::core::Message;
8use crate::owning::{OpaqueDrop, Owning};
9use crate::*;
10
11impl MemoryBuffer {
12    pub fn create_with_contents_of_file(path: &CStr) -> Result<Owning<Self>, Message> {
13        unsafe {
14            let mut ptr = null_mut();
15            let mut err = null_mut();
16            if LLVMCreateMemoryBufferWithContentsOfFile(path.as_ptr(), &mut ptr, &mut err) != 0 {
17                return Err(Message::from_raw(err));
18            }
19            Ok(Owning::from_raw(ptr))
20        }
21    }
22
23    pub fn create_with_stdin() -> Result<Owning<Self>, Message> {
24        unsafe {
25            let mut ptr = null_mut();
26            let mut err = null_mut();
27            if LLVMCreateMemoryBufferWithSTDIN(&mut ptr, &mut err) != 0 {
28                return Err(Message::from_raw(err));
29            }
30            Ok(Owning::from_raw(ptr))
31        }
32    }
33
34    pub unsafe fn create_with_memory_range(
35        data: *const [u8],
36        name: &CStr,
37        requires_null_terminator: bool,
38    ) -> Owning<Self> {
39        unsafe {
40            let ptr = LLVMCreateMemoryBufferWithMemoryRange(
41                data.cast(),
42                data.len(),
43                name.as_ptr(),
44                requires_null_terminator as _,
45            );
46            Owning::from_raw(ptr)
47        }
48    }
49
50    pub fn create_with_memory_range_copy(data: &[u8], name: &CStr) -> Owning<Self> {
51        unsafe {
52            let ptr = LLVMCreateMemoryBufferWithMemoryRangeCopy(
53                data.as_ptr().cast(),
54                data.len(),
55                name.as_ptr(),
56            );
57            Owning::from_raw(ptr)
58        }
59    }
60
61    pub fn get_start(&self) -> *const u8 {
62        unsafe { LLVMGetBufferStart(self.as_raw()) as *const u8 }
63    }
64
65    pub fn get_size(&self) -> usize {
66        unsafe { LLVMGetBufferSize(self.as_raw()) }
67    }
68}
69
70impl OpaqueDrop for LLVMMemoryBuffer {
71    unsafe fn drop_raw(ptr: *mut Self) {
72        unsafe { LLVMDisposeMemoryBuffer(ptr) }
73    }
74}