Package more functions in LLVMWrapper

This commit is contained in:
greg 2016-12-26 12:36:28 -08:00
parent a65544356c
commit fca307d3ab

View File

@ -112,6 +112,41 @@ mod LLVMWrap {
core::LLVMConstInt(int_type, n, if sign_extend { 1 } else { 0 }) core::LLVMConstInt(int_type, n, if sign_extend { 1 } else { 0 })
} }
} }
pub fn BuildAdd(builder: LLVMBuilderRef, lhs: LLVMValueRef, rhs: LLVMValueRef, reg_name: &str) -> LLVMValueRef {
let name = CString::new(reg_name).unwrap();
unsafe {
core::LLVMBuildAdd(builder, lhs, rhs, name.as_ptr())
}
}
pub fn BuildSub(builder: LLVMBuilderRef, lhs: LLVMValueRef, rhs: LLVMValueRef, reg_name: &str) -> LLVMValueRef {
let name = CString::new(reg_name).unwrap();
unsafe {
core::LLVMBuildSub(builder, lhs, rhs, name.as_ptr())
}
}
pub fn BuildMul(builder: LLVMBuilderRef, lhs: LLVMValueRef, rhs: LLVMValueRef, reg_name: &str) -> LLVMValueRef {
let name = CString::new(reg_name).unwrap();
unsafe {
core::LLVMBuildMul(builder, lhs, rhs, name.as_ptr())
}
}
pub fn BuildUDiv(builder: LLVMBuilderRef, lhs: LLVMValueRef, rhs: LLVMValueRef, reg_name: &str) -> LLVMValueRef {
let name = CString::new(reg_name).unwrap();
unsafe {
core::LLVMBuildUDiv(builder, lhs, rhs, name.as_ptr())
}
}
pub fn BuildSRem(builder: LLVMBuilderRef, lhs: LLVMValueRef, rhs: LLVMValueRef, reg_name: &str) -> LLVMValueRef {
let name = CString::new(reg_name).unwrap();
unsafe {
core::LLVMBuildSRem(builder, lhs, rhs, name.as_ptr())
}
}
} }
pub fn compilation_sequence(ast: AST, sourcefile: &str) { pub fn compilation_sequence(ast: AST, sourcefile: &str) {
@ -222,20 +257,16 @@ impl CodeGen for Expression {
&BinExp(ref op, ref left, ref right) => { &BinExp(ref op, ref left, ref right) => {
let lhs = left.codegen(context, builder); let lhs = left.codegen(context, builder);
let rhs = right.codegen(context, builder); let rhs = right.codegen(context, builder);
unsafe {
let generator = match op.as_ref() { let generator = match op.as_ref() {
"+" => core::LLVMBuildAdd, "+" => LLVMWrap::BuildAdd,
"-" => core::LLVMBuildSub, "-" => LLVMWrap::BuildSub,
"*" => core::LLVMBuildMul, "*" => LLVMWrap::BuildMul,
"/" => core::LLVMBuildUDiv, "/" => LLVMWrap::BuildUDiv,
"%" => core::LLVMBuildSRem, "%" => LLVMWrap::BuildSRem,
_ => panic!("Bad operator {}", op), _ => panic!("Bad operator {}", op),
}; };
let reg_name = CString::new("temporary").unwrap(); generator(builder, lhs, rhs, "temp")
generator(builder, lhs, rhs, reg_name.as_ptr())
}
}, },
&Number(ref n) => { &Number(ref n) => {
let native_val = *n as u64; let native_val = *n as u64;