|
1 |
| -use values::{BasicValueEnum, InstructionValue}; |
2 |
| -use llvm_sys::core::{LLVMGetNextUse, LLVMGetUser, LLVMGetUsedValue}; |
| 1 | +use either::{Either, Either::{Left, Right}}; |
| 2 | +use llvm_sys::core::{LLVMGetNextUse, LLVMGetUser, LLVMGetUsedValue, LLVMIsABasicBlock, LLVMValueAsBasicBlock}; |
3 | 3 | use llvm_sys::prelude::LLVMUseRef;
|
4 | 4 |
|
| 5 | +use basic_block::BasicBlock; |
| 6 | +use values::{BasicValueEnum, InstructionValue}; |
| 7 | + |
5 | 8 | /// A usage of a `BasicValue` in an `InstructionValue`.
|
6 | 9 | #[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
7 | 10 | pub struct BasicValueUse(LLVMUseRef);
|
@@ -118,7 +121,7 @@ impl BasicValueUse {
|
118 | 121 | InstructionValue::new(user)
|
119 | 122 | }
|
120 | 123 |
|
121 |
| - /// Gets the used value(a `BasicValueEnum`) of this use. |
| 124 | + /// Gets the used value(a `BasicValueEnum` or `BasicBlock`) of this use. |
122 | 125 | ///
|
123 | 126 | /// ```no_run
|
124 | 127 | /// use inkwell::AddressSpace;
|
@@ -149,15 +152,29 @@ impl BasicValueUse {
|
149 | 152 | /// let bitcast_use_value = free_operand0_instruction
|
150 | 153 | /// .get_first_use()
|
151 | 154 | /// .unwrap()
|
152 |
| - /// .get_used_value(); |
| 155 | + /// .get_used_value() |
| 156 | + /// .left() |
| 157 | + /// .unwrap(); |
153 | 158 | ///
|
154 | 159 | /// assert_eq!(bitcast_use_value, free_operand0);
|
155 | 160 | /// ```
|
156 |
| - pub fn get_used_value(&self) -> BasicValueEnum { |
| 161 | + pub fn get_used_value(&self) -> Either<BasicValueEnum, BasicBlock> { |
157 | 162 | let used_value = unsafe {
|
158 | 163 | LLVMGetUsedValue(self.0)
|
159 | 164 | };
|
160 | 165 |
|
161 |
| - BasicValueEnum::new(used_value) |
| 166 | + let is_basic_block = unsafe { |
| 167 | + !LLVMIsABasicBlock(used_value).is_null() |
| 168 | + }; |
| 169 | + |
| 170 | + if is_basic_block { |
| 171 | + let used_value = unsafe { |
| 172 | + LLVMValueAsBasicBlock(used_value) |
| 173 | + }; |
| 174 | + |
| 175 | + Right(BasicBlock::new(used_value).expect("BasicBlock should be valid")) |
| 176 | + } else { |
| 177 | + Left(BasicValueEnum::new(used_value)) |
| 178 | + } |
162 | 179 | }
|
163 | 180 | }
|
0 commit comments