Verify before printing
This commit is contained in:
parent
7f3a3ac1f8
commit
a3642f127c
@ -1,7 +1,9 @@
|
|||||||
use std::borrow::BorrowMut;
|
use std::borrow::BorrowMut;
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::ptr::null_mut;
|
||||||
|
|
||||||
|
use llvm_sys::analysis::LLVMVerifyModule;
|
||||||
use llvm_sys::{
|
use llvm_sys::{
|
||||||
core::*, prelude::*, LLVMBasicBlock, LLVMBuilder, LLVMContext, LLVMModule, LLVMType, LLVMValue,
|
core::*, prelude::*, LLVMBasicBlock, LLVMBuilder, LLVMContext, LLVMModule, LLVMType, LLVMValue,
|
||||||
};
|
};
|
||||||
@ -105,7 +107,14 @@ impl<'a> IRModule<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_to_string(&mut self) -> Result<&str, std::str::Utf8Error> {
|
pub fn print_to_string(&mut self) -> Result<&str, std::str::Utf8Error> {
|
||||||
unsafe { CStr::from_ptr(LLVMPrintModuleToString(self.module)).to_str() }
|
unsafe {
|
||||||
|
LLVMVerifyModule(
|
||||||
|
self.module,
|
||||||
|
llvm_sys::analysis::LLVMVerifierFailureAction::LLVMPrintMessageAction,
|
||||||
|
null_mut(),
|
||||||
|
);
|
||||||
|
CStr::from_ptr(LLVMPrintModuleToString(self.module)).to_str()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +139,6 @@ impl<'a, 'b> IRFunction<'a, 'b> {
|
|||||||
// TODO, fix later!
|
// TODO, fix later!
|
||||||
|
|
||||||
let return_type = LLVMInt32TypeInContext(module.context.context);
|
let return_type = LLVMInt32TypeInContext(module.context.context);
|
||||||
|
|
||||||
let mut argts = [];
|
let mut argts = [];
|
||||||
let func_type =
|
let func_type =
|
||||||
LLVMFunctionType(return_type, argts.as_mut_ptr(), argts.len() as u32, 0);
|
LLVMFunctionType(return_type, argts.as_mut_ptr(), argts.len() as u32, 0);
|
||||||
|
@ -109,16 +109,16 @@ impl Expression {
|
|||||||
let IfExpression(expr, block, _) = ifx.as_ref();
|
let IfExpression(expr, block, _) = ifx.as_ref();
|
||||||
let condition = expr.codegen(scope);
|
let condition = expr.codegen(scope);
|
||||||
|
|
||||||
let mut then = IRBlock::new(scope.block.function, c"then");
|
let mut thenb = IRBlock::new(scope.block.function, c"then");
|
||||||
let mut after = IRBlock::new(scope.block.function, c"merge");
|
let mut afterb = IRBlock::new(scope.block.function, c"merge");
|
||||||
|
|
||||||
scope.block.branch(condition, &mut then, &mut after);
|
scope.block.branch(condition, &mut thenb, &mut afterb);
|
||||||
scope.block = after;
|
scope.block = afterb;
|
||||||
|
|
||||||
let mut inner = scope.inner(then);
|
let mut then = scope.inner(thenb);
|
||||||
match block.codegen(&mut inner) {
|
match block.codegen(&mut then) {
|
||||||
Some((ReturnType::Hard, v)) => inner.block.add_return(Some(v)),
|
Some((ReturnType::Hard, v)) => then.block.add_return(Some(v)),
|
||||||
_ => inner.block.move_into(&mut scope.block),
|
_ => then.block.move_into(&mut scope.block),
|
||||||
}
|
}
|
||||||
|
|
||||||
IRValue::from_literal(&crate::ast::Literal::I32(1), scope.block.function.module)
|
IRValue::from_literal(&crate::ast::Literal::I32(1), scope.block.function.module)
|
||||||
|
Loading…
Reference in New Issue
Block a user