factor/vm/profiler.c

87 lines
1.8 KiB
C
Raw Normal View History

#include "master.h"
2008-01-02 19:36:36 -05:00
/* Allocates memory */
F_COMPILED *compile_profiling_stub(F_WORD *word)
{
2008-01-02 19:36:36 -05:00
CELL literals = allot_array_1(tag_object(word));
REGISTER_ROOT(literals);
F_ARRAY *quadruple = untag_object(userenv[JIT_PROFILING]);
CELL code = array_nth(quadruple,0);
REGISTER_ROOT(code);
2008-05-30 15:10:18 -04:00
F_REL rel;
rel.type = to_fixnum(array_nth(quadruple,2)) | (to_fixnum(array_nth(quadruple,1)) << 8);
rel.offset = to_fixnum(array_nth(quadruple,3)) * compiled_code_format();
2008-01-02 19:36:36 -05:00
2008-05-30 15:10:18 -04:00
F_BYTE_ARRAY *relocation = allot_byte_array(sizeof(F_REL));
memcpy((void *)BREF(relocation,0),&rel,sizeof(F_REL));
2008-01-02 19:36:36 -05:00
UNREGISTER_ROOT(code);
UNREGISTER_ROOT(literals);
return add_compiled_block(
WORD_TYPE,
untag_object(code),
NULL, /* no labels */
2008-05-30 15:10:18 -04:00
tag_object(relocation),
2008-01-02 19:36:36 -05:00
untag_object(literals));
}
2008-01-02 19:36:36 -05:00
/* Allocates memory */
void update_word_xt(F_WORD *word)
{
/* If we just enabled the profiler, reset call count */
2008-01-02 19:36:36 -05:00
if(profiling_p)
{
2007-12-29 12:44:01 -05:00
word->counter = tag_fixnum(0);
2008-01-02 19:36:36 -05:00
if(!word->profiling)
{
REGISTER_UNTAGGED(word);
F_COMPILED *profiling = compile_profiling_stub(word);
UNREGISTER_UNTAGGED(word);
word->profiling = profiling;
}
word->xt = (XT)(word->profiling + 1);
}
2007-12-29 12:44:01 -05:00
else
2008-01-02 19:36:36 -05:00
word->xt = (XT)(word->code + 1);
}
void set_profiling(bool profiling)
{
2008-01-02 19:36:36 -05:00
if(profiling == profiling_p)
return;
2008-01-02 19:36:36 -05:00
profiling_p = profiling;
/* Push everything to tenured space so that we can heap scan
and allocate profiling blocks if necessary */
gc();
2008-04-05 09:27:07 -04:00
CELL words = find_all_words();
2008-04-05 09:27:07 -04:00
REGISTER_ROOT(words);
CELL i;
CELL length = array_capacity(untag_object(words));
for(i = 0; i < length; i++)
{
2008-04-05 09:27:07 -04:00
F_WORD *word = untag_word(array_nth(untag_array(words),i));
update_word_xt(word);
}
2008-04-05 09:27:07 -04:00
UNREGISTER_ROOT(words);
/* Update XTs in code heap */
iterate_code_heap(relocate_code_block);
}
DEFINE_PRIMITIVE(profiling)
{
set_profiling(to_boolean(dpop()));
}