Add RT_INLINE_CACHE_MISS relocation type to avoid frequent dlsym lookups when compiling PICs. Fixes #123

db4
Slava Pestov 2011-09-14 01:08:32 -07:00
parent 72d3c6e791
commit f8e475485a
6 changed files with 14 additions and 2 deletions

View File

@ -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

View File

@ -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 -- ? )
${

View File

@ -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 ]

View File

@ -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 ;

View File

@ -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;

View File

@ -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());