45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								USING: accessors alien.c-types alien.syntax assocs destructors
							 | 
						||
| 
								 | 
							
								kernel llvm.core llvm.engine llvm.wrappers namespaces ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								IN: llvm.jit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SYMBOL: thejit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: jit ee mps ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: empty-engine ( -- engine )
							 | 
						||
| 
								 | 
							
								    "initial-module" <module> [
							 | 
						||
| 
								 | 
							
								        <provider>
							 | 
						||
| 
								 | 
							
								    ] with-disposal [
							 | 
						||
| 
								 | 
							
								        <engine>
							 | 
						||
| 
								 | 
							
								    ] with-disposal ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <jit> ( -- jit )
							 | 
						||
| 
								 | 
							
								    jit new empty-engine >>ee H{ } clone >>mps ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (remove-functions) ( function -- )
							 | 
						||
| 
								 | 
							
								    thejit get ee>> value>> over LLVMFreeMachineCodeForFunction
							 | 
						||
| 
								 | 
							
								    LLVMGetNextFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: remove-functions ( module -- )
							 | 
						||
| 
								 | 
							
								    ! free machine code for each function in module
							 | 
						||
| 
								 | 
							
								    LLVMGetFirstFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (remove-provider) ( provider -- )
							 | 
						||
| 
								 | 
							
								    thejit get ee>> value>> swap value>> f <void*> f <void*>
							 | 
						||
| 
								 | 
							
								    [ LLVMRemoveModuleProvider drop ] 2keep *void* [ llvm-throw ] when*
							 | 
						||
| 
								 | 
							
								    *void* module new swap >>value
							 | 
						||
| 
								 | 
							
								    [ value>> remove-functions ] with-disposal ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: remove-provider ( name -- )
							 | 
						||
| 
								 | 
							
								    dup thejit get mps>> at [
							 | 
						||
| 
								 | 
							
								        (remove-provider)
							 | 
						||
| 
								 | 
							
								        thejit get mps>> delete-at
							 | 
						||
| 
								 | 
							
								    ] [ drop ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: add-provider ( provider name -- )
							 | 
						||
| 
								 | 
							
								    dup remove-provider
							 | 
						||
| 
								 | 
							
								    thejit get ee>> value>>  pick value>> LLVMAddModuleProvider
							 | 
						||
| 
								 | 
							
								    [ t >>disposed ] dip thejit get mps>> set-at ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								thejit [ <jit> ] initialize
							 |