Move module creation to IRModule
This commit is contained in:
parent
9a74158ae7
commit
22ee941ad6
@ -24,34 +24,7 @@ impl IRContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn module<'a>(&'a mut self, name: String) -> IRModule<'a> {
|
pub fn module<'a>(&'a mut self, name: String) -> IRModule<'a> {
|
||||||
unsafe {
|
IRModule::new(self, name)
|
||||||
let module =
|
|
||||||
LLVMModuleCreateWithNameInContext(into_cstring(name).as_ptr(), self.context);
|
|
||||||
|
|
||||||
// TODO, fix later!
|
|
||||||
|
|
||||||
let t = LLVMInt32TypeInContext(self.context);
|
|
||||||
|
|
||||||
let mut argts = [];
|
|
||||||
let func_type = LLVMFunctionType(t, argts.as_mut_ptr(), argts.len() as u32, 0);
|
|
||||||
|
|
||||||
let anon_func = LLVMAddFunction(module, into_cstring("testfunc").as_ptr(), func_type);
|
|
||||||
|
|
||||||
let blockref =
|
|
||||||
LLVMCreateBasicBlockInContext(self.context, into_cstring("entryblock").as_ptr());
|
|
||||||
LLVMPositionBuilderAtEnd(self.builder, blockref);
|
|
||||||
|
|
||||||
// What is the last 1 ?
|
|
||||||
let val = LLVMConstInt(t, mem::transmute(3 as i64), 1);
|
|
||||||
|
|
||||||
LLVMAppendExistingBasicBlock(anon_func, blockref);
|
|
||||||
LLVMBuildRet(self.builder, val);
|
|
||||||
|
|
||||||
IRModule {
|
|
||||||
context: self,
|
|
||||||
module,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,6 +44,34 @@ pub struct IRModule<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> IRModule<'a> {
|
impl<'a> IRModule<'a> {
|
||||||
|
fn new(context: &'a mut IRContext, name: String) -> IRModule<'a> {
|
||||||
|
unsafe {
|
||||||
|
let module =
|
||||||
|
LLVMModuleCreateWithNameInContext(into_cstring(name).as_ptr(), context.context);
|
||||||
|
|
||||||
|
// TODO, fix later!
|
||||||
|
|
||||||
|
let t = LLVMInt32TypeInContext(context.context);
|
||||||
|
|
||||||
|
let mut argts = [];
|
||||||
|
let func_type = LLVMFunctionType(t, argts.as_mut_ptr(), argts.len() as u32, 0);
|
||||||
|
|
||||||
|
let anon_func = LLVMAddFunction(module, into_cstring("testfunc").as_ptr(), func_type);
|
||||||
|
|
||||||
|
let blockref =
|
||||||
|
LLVMCreateBasicBlockInContext(context.context, into_cstring("entryblock").as_ptr());
|
||||||
|
LLVMPositionBuilderAtEnd(context.builder, blockref);
|
||||||
|
|
||||||
|
// What is the last 1 ?
|
||||||
|
let val = LLVMConstInt(t, mem::transmute(3 as i64), 1);
|
||||||
|
|
||||||
|
LLVMAppendExistingBasicBlock(anon_func, blockref);
|
||||||
|
LLVMBuildRet(context.builder, val);
|
||||||
|
|
||||||
|
IRModule { context, module }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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 { CStr::from_ptr(LLVMPrintModuleToString(self.module)).to_str() }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user