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> {
 | 
			
		||||
        unsafe {
 | 
			
		||||
            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,
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        IRModule::new(self, name)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -71,6 +44,34 @@ pub struct 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> {
 | 
			
		||||
        unsafe { CStr::from_ptr(LLVMPrintModuleToString(self.module)).to_str() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user