llvm_quick/core/
memory_buffers.rs1use 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}