aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/llvm/basic_block.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm/basic_block.rs')
-rw-r--r--src/llvm/basic_block.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/llvm/basic_block.rs b/src/llvm/basic_block.rs
new file mode 100644
index 0000000..e40c7f1
--- /dev/null
+++ b/src/llvm/basic_block.rs
@@ -0,0 +1,39 @@
+use llvm_sys::{core::LLVMGetBasicBlockParent, prelude::LLVMBasicBlockRef};
+
+use std::marker::PhantomData;
+
+use super::FnValue;
+
+/// Wrapper for a LLVM Basic Block.
+#[derive(Copy, Clone)]
+pub struct BasicBlock<'llvm>(LLVMBasicBlockRef, PhantomData<&'llvm ()>);
+
+impl<'llvm> BasicBlock<'llvm> {
+ /// Create a new BasicBlock instance.
+ ///
+ /// # Panics
+ ///
+ /// Panics if `bb_ref` is a null pointer.
+ pub(super) fn new(bb_ref: LLVMBasicBlockRef) -> BasicBlock<'llvm> {
+ assert!(!bb_ref.is_null());
+ BasicBlock(bb_ref, PhantomData)
+ }
+
+ /// Get the raw LLVM value reference.
+ #[inline]
+ pub(super) fn bb_ref(&self) -> LLVMBasicBlockRef {
+ self.0
+ }
+
+ /// Get the function to which the basic block belongs.
+ ///
+ /// # Panics
+ ///
+ /// Panics if LLVM API returns a `null` pointer.
+ pub fn get_parent(&self) -> FnValue<'llvm> {
+ let value_ref = unsafe { LLVMGetBasicBlockParent(self.bb_ref()) };
+ assert!(!value_ref.is_null());
+
+ FnValue::new(value_ref)
+ }
+}