| 
									
										
										
										
											2009-06-30 22:08:57 -04:00
										 |  |  | ! Copyright (C) 2009 Matthew Willis. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-12-25 19:54:45 -05:00
										 |  |  | USING: accessors alien.c-types alien.data alien.syntax assocs | 
					
						
							|  |  |  | destructors kernel llvm.core llvm.engine llvm.wrappers | 
					
						
							|  |  |  | namespaces ;
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | IN: llvm.jit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: jit ee mps ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : empty-engine ( -- engine )
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  |     "initial-module" <module> <provider> <engine> ;
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <jit> ( -- jit )
 | 
					
						
							|  |  |  |     jit new empty-engine >>ee H{ } clone >>mps ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  | : current-jit ( -- jit )
 | 
					
						
							|  |  |  |     \ current-jit global [ drop <jit> ] cache ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  | : (remove-functions) ( function -- )
 | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |     current-jit ee>> value>> over LLVMFreeMachineCodeForFunction | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  |     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 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  | : remove-provider ( provider -- )
 | 
					
						
							| 
									
										
										
										
											2010-10-25 14:22:50 -04:00
										 |  |  |     current-jit ee>> value>> swap value>> f void* <ref> f void* <ref> | 
					
						
							|  |  |  |     [ LLVMRemoveModuleProvider drop ] 2keep void* deref [ llvm-throw ] when*
 | 
					
						
							|  |  |  |     void* deref module new swap >>value | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  |     [ value>> remove-functions ] with-disposal ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  | : remove-module ( name -- )
 | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |     dup current-jit mps>> at [ | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  |         remove-provider | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |         current-jit mps>> delete-at
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:41:40 -04:00
										 |  |  |     ] [ drop ] if* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  | : add-module ( module name -- )
 | 
					
						
							|  |  |  |     [ <provider> ] dip [ remove-module ] keep
 | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |     current-jit ee>> value>> pick
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  |     [ [ value>> LLVMAddModuleProvider ] [ t >>disposed drop ] bi ] with-disposal | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |     current-jit mps>> set-at ;
 | 
					
						
							| 
									
										
										
										
											2009-06-29 22:43:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : function-pointer ( name -- alien )
 | 
					
						
							| 
									
										
										
										
											2010-04-13 21:43:48 -04:00
										 |  |  |     current-jit ee>> value>> dup
 | 
					
						
							| 
									
										
										
										
											2010-10-25 14:22:50 -04:00
										 |  |  |     rot f void* <ref> [ LLVMFindFunction drop ] keep
 | 
					
						
							|  |  |  |     void* deref LLVMGetPointerToGlobal ;
 |