Skip to content

Commit 11bdf37

Browse files
committed
Fixed target pattern matching, added int+float const compare
Also added LLVM clone for InstructionValues
1 parent 58eaae3 commit 11bdf37

File tree

5 files changed

+39
-7
lines changed

5 files changed

+39
-7
lines changed

src/builder.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ impl Builder {
582582
}
583583

584584
// SubType: <I>(&self, op, lhs: &IntValue<I>, rhs: &IntValue<I>, name) -> IntValue<bool> { ?
585+
// FIXME: Don't take llvm-sys op enum
585586
pub fn build_int_compare(&self, op: LLVMIntPredicate, lhs: &IntValue, rhs: &IntValue, name: &str) -> IntValue {
586587
let c_string = CString::new(name).expect("Conversion to CString failed unexpectedly");
587588

@@ -593,6 +594,7 @@ impl Builder {
593594
}
594595

595596
// SubType: <F>(&self, op, lhs: &FloatValue<F>, rhs: &FloatValue<F>, name) -> IntValue<bool> { ?
597+
// FIXME: Don't take llvm-sys op enum
596598
pub fn build_float_compare(&self, op: LLVMRealPredicate, lhs: &FloatValue, rhs: &FloatValue, name: &str) -> IntValue {
597599
let c_string = CString::new(name).expect("Conversion to CString failed unexpectedly");
598600

src/targets.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ pub enum CodeGenOptLevel {
2222

2323
impl CodeGenOptLevel {
2424
pub(crate) fn as_u32(&self) -> u32 {
25-
match self {
26-
Less => 1,
27-
Default => 2,
28-
Aggressive => 3,
25+
match *self {
26+
CodeGenOptLevel::Less => 1,
27+
CodeGenOptLevel::Default => 2,
28+
CodeGenOptLevel::Aggressive => 3,
2929
}
3030
}
3131
}

src/values/float_value.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use llvm_sys::core::{LLVMConstFNeg, LLVMConstFAdd, LLVMConstFSub, LLVMConstFMul, LLVMConstFDiv, LLVMConstFRem, LLVMConstFPCast, LLVMConstFPToUI, LLVMConstFPToSI, LLVMConstFPTrunc, LLVMConstFPExt};
1+
use llvm_sys::core::{LLVMConstFNeg, LLVMConstFAdd, LLVMConstFSub, LLVMConstFMul, LLVMConstFDiv, LLVMConstFRem, LLVMConstFPCast, LLVMConstFPToUI, LLVMConstFPToSI, LLVMConstFPTrunc, LLVMConstFPExt, LLVMConstFCmp};
22
use llvm_sys::prelude::LLVMValueRef;
3+
use llvm_sys::LLVMRealPredicate;
34

45
use std::ffi::CStr;
56

@@ -156,6 +157,15 @@ impl FloatValue {
156157
pub fn set_metadata(&self, metadata: &MetadataValue, kind_id: u32) {
157158
self.float_value.set_metadata(metadata, kind_id)
158159
}
160+
161+
// FIXME: Don't take llvm-sys op enum
162+
pub fn const_float_compare(&self, op: LLVMRealPredicate, rhs: &FloatValue) -> IntValue {
163+
let value = unsafe {
164+
LLVMConstFCmp(op, self.as_value_ref(), rhs.as_value_ref())
165+
};
166+
167+
IntValue::new(value)
168+
}
159169
}
160170

161171
impl AsValueRef for FloatValue {

src/values/instruction_value.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use llvm_sys::core::{LLVMGetInstructionOpcode, LLVMIsTailCall, LLVMGetPreviousInstruction, LLVMGetNextInstruction, LLVMGetInstructionParent, LLVMInstructionEraseFromParent};
1+
use llvm_sys::core::{LLVMGetInstructionOpcode, LLVMIsTailCall, LLVMGetPreviousInstruction, LLVMGetNextInstruction, LLVMGetInstructionParent, LLVMInstructionEraseFromParent, LLVMInstructionClone};
22
use llvm_sys::LLVMOpcode;
33
use llvm_sys::prelude::LLVMValueRef;
44

@@ -230,6 +230,16 @@ impl InstructionValue {
230230
}
231231
}
232232

233+
impl Clone for InstructionValue {
234+
fn clone(&self) -> Self {
235+
let value = unsafe {
236+
LLVMInstructionClone(self.as_value_ref())
237+
};
238+
239+
InstructionValue::new(value)
240+
}
241+
}
242+
233243
impl AsValueRef for InstructionValue {
234244
fn as_value_ref(&self) -> LLVMValueRef {
235245
self.instruction_value.value

src/values/int_value.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use llvm_sys::core::{LLVMConstNot, LLVMConstNeg, LLVMConstNSWNeg, LLVMConstNUWNeg, LLVMConstAdd, LLVMConstNSWAdd, LLVMConstNUWAdd, LLVMConstSub, LLVMConstNSWSub, LLVMConstNUWSub, LLVMConstMul, LLVMConstNSWMul, LLVMConstNUWMul, LLVMConstUDiv, LLVMConstSDiv, LLVMConstSRem, LLVMConstURem, LLVMConstIntCast, LLVMConstXor, LLVMConstOr, LLVMConstAnd, LLVMConstExactSDiv, LLVMConstShl, LLVMConstLShr, LLVMConstAShr, LLVMConstUIToFP, LLVMConstSIToFP, LLVMConstIntToPtr, LLVMConstTrunc, LLVMConstSExt, LLVMConstZExt, LLVMConstTruncOrBitCast, LLVMConstSExtOrBitCast, LLVMConstZExtOrBitCast, LLVMConstBitCast};
1+
use llvm_sys::core::{LLVMConstNot, LLVMConstNeg, LLVMConstNSWNeg, LLVMConstNUWNeg, LLVMConstAdd, LLVMConstNSWAdd, LLVMConstNUWAdd, LLVMConstSub, LLVMConstNSWSub, LLVMConstNUWSub, LLVMConstMul, LLVMConstNSWMul, LLVMConstNUWMul, LLVMConstUDiv, LLVMConstSDiv, LLVMConstSRem, LLVMConstURem, LLVMConstIntCast, LLVMConstXor, LLVMConstOr, LLVMConstAnd, LLVMConstExactSDiv, LLVMConstShl, LLVMConstLShr, LLVMConstAShr, LLVMConstUIToFP, LLVMConstSIToFP, LLVMConstIntToPtr, LLVMConstTrunc, LLVMConstSExt, LLVMConstZExt, LLVMConstTruncOrBitCast, LLVMConstSExtOrBitCast, LLVMConstZExtOrBitCast, LLVMConstBitCast, LLVMConstICmp};
22
use llvm_sys::prelude::LLVMValueRef;
3+
use llvm_sys::LLVMIntPredicate;
34

45
use std::ffi::CStr;
56

@@ -355,6 +356,15 @@ impl IntValue {
355356
pub fn set_metadata(&self, metadata: &MetadataValue, kind_id: u32) {
356357
self.int_value.set_metadata(metadata, kind_id)
357358
}
359+
360+
// FIXME: Don't take llvm-sys op enum
361+
pub fn const_int_compare(&self, op: LLVMIntPredicate, rhs: &IntValue) -> IntValue {
362+
let value = unsafe {
363+
LLVMConstICmp(op, self.as_value_ref(), rhs.as_value_ref())
364+
};
365+
366+
IntValue::new(value)
367+
}
358368
}
359369

360370
impl AsValueRef for IntValue {

0 commit comments

Comments
 (0)