Add RT_INLINE_CACHE_MISS relocation type to avoid frequent dlsym lookups when compiling PICs. Fixes #123
							parent
							
								
									72d3c6e791
								
							
						
					
					
						commit
						f8e475485a
					
				| 
						 | 
				
			
			@ -99,6 +99,9 @@ MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ;
 | 
			
		|||
: rel-exception-handler ( class -- )
 | 
			
		||||
    rt-exception-handler add-relocation ;
 | 
			
		||||
 | 
			
		||||
: rel-inline-cache-miss ( class -- )
 | 
			
		||||
    rt-inline-cache-miss add-relocation ;
 | 
			
		||||
 | 
			
		||||
: init-relocation ( -- )
 | 
			
		||||
    V{ } clone parameter-table set
 | 
			
		||||
    V{ } clone literal-table set
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,6 +69,7 @@ CONSTANT: rt-cards-offset 10
 | 
			
		|||
CONSTANT: rt-decks-offset 11
 | 
			
		||||
CONSTANT: rt-exception-handler 12
 | 
			
		||||
CONSTANT: rt-dlsym-toc 13
 | 
			
		||||
CONSTANT: rt-inline-cache-miss 14
 | 
			
		||||
 | 
			
		||||
: rc-absolute? ( n -- ? )
 | 
			
		||||
    ${
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ IN: bootstrap.x86
 | 
			
		|||
    jit-save-context
 | 
			
		||||
    ESP 4 [+] vm-reg MOV
 | 
			
		||||
    ESP [] pic-tail-reg MOV
 | 
			
		||||
    "inline_cache_miss" jit-call
 | 
			
		||||
    0 CALL rc-relative rel-inline-cache-miss
 | 
			
		||||
    jit-restore-context ;
 | 
			
		||||
 | 
			
		||||
[ jit-load-return-address jit-inline-cache-miss ]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -181,7 +181,8 @@ IN: bootstrap.x86
 | 
			
		|||
    jit-save-context
 | 
			
		||||
    arg1 RBX MOV
 | 
			
		||||
    arg2 vm-reg MOV
 | 
			
		||||
    "inline_cache_miss" jit-call
 | 
			
		||||
    RAX 0 MOV rc-absolute-cell rel-inline-cache-miss
 | 
			
		||||
    RAX CALL
 | 
			
		||||
    jit-load-context
 | 
			
		||||
    jit-restore-context ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -269,6 +269,9 @@ void factor_vm::store_external_address(instruction_operand op)
 | 
			
		|||
		op.store_value(compute_dlsym_toc_address(parameters,index));
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
	case RT_INLINE_CACHE_MISS:
 | 
			
		||||
		op.store_value((cell)&factor::inline_cache_miss);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		critical_error("Bad rel type in store_external_address()",op.rel_type());
 | 
			
		||||
		break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,9 @@ enum relocation_type {
 | 
			
		|||
	RT_EXCEPTION_HANDLER,
 | 
			
		||||
	/* arg is a literal table index, holding a pair (symbol/dll) */
 | 
			
		||||
	RT_DLSYM_TOC,
 | 
			
		||||
	/* address of inline_cache_miss function. This is a separate
 | 
			
		||||
	relocation to reduce compile time and size for PICs. */
 | 
			
		||||
	RT_INLINE_CACHE_MISS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum relocation_class {
 | 
			
		||||
| 
						 | 
				
			
			@ -117,6 +120,7 @@ struct relocation_entry {
 | 
			
		|||
		case RT_CARDS_OFFSET:
 | 
			
		||||
		case RT_DECKS_OFFSET:
 | 
			
		||||
		case RT_EXCEPTION_HANDLER:
 | 
			
		||||
		case RT_INLINE_CACHE_MISS:
 | 
			
		||||
			return 0;
 | 
			
		||||
		default:
 | 
			
		||||
			critical_error("Bad rel type in number_of_parameters()",rel_type());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue