Working on profiler

db4
Slava Pestov 2007-12-29 12:44:01 -05:00
parent e2f270be70
commit 2b37b76d65
3 changed files with 29 additions and 14 deletions

18
extra/tools/profiler/profiler-tests.factor Normal file → Executable file
View File

@ -1,6 +1,12 @@
IN: temporary
USING: tools.profiler tools.test kernel memory math threads
alien tools.profiler.private ;
alien tools.profiler.private sequences ;
[ t ] [
\ length profile-counter
10 [ { } length drop ] times
\ length profile-counter =
] unit-test
[ ] [ [ 10 [ data-gc ] times ] profile ] unit-test
@ -26,3 +32,13 @@ alien tools.profiler.private ;
] profile
[ 1 ] [ \ foobar profile-counter ] unit-test
: fooblah { } [ ] each ;
: foobaz fooblah fooblah ;
[ foobaz ] profile
[ 1 ] [ \ foobaz profile-counter ] unit-test
[ 2 ] [ \ fooblah profile-counter ] unit-test

View File

@ -36,7 +36,7 @@ void *get_rel_symbol(F_REL *rel, CELL literals_start)
return undefined_symbol;
}
static CELL xt_offset;
bool profiling_p_;
/* Compute an address to store at a relocation */
INLINE CELL compute_code_rel(F_REL *rel,
@ -56,10 +56,9 @@ INLINE CELL compute_code_rel(F_REL *rel,
return CREF(words_start,REL_ARGUMENT(rel));
case RT_XT:
word = untag_word(get(CREF(words_start,REL_ARGUMENT(rel))));
if(word->compiledp == F)
return (CELL)word->code + sizeof(F_COMPILED);
else
return (CELL)word->code + sizeof(F_COMPILED) + xt_offset;
return (CELL)word->code
+ sizeof(F_COMPILED)
+ (profiling_p_ ? 0 : word->code->profiler_prologue);
case RT_XT_PROFILING:
word = untag_word(get(CREF(words_start,REL_ARGUMENT(rel))));
return (CELL)word->code + sizeof(F_COMPILED);
@ -140,7 +139,7 @@ void relocate_code_block(F_COMPILED *relocating, CELL code_start,
{
if(reloc_start != literals_start)
{
xt_offset = (profiling_p() ? 0 : relocating->profiler_prologue);
profiling_p_ = profiling_p();
F_REL *rel = (F_REL *)reloc_start;
F_REL *rel_end = (F_REL *)literals_start;

View File

@ -8,13 +8,13 @@ bool profiling_p(void)
void profiling_word(F_WORD *word)
{
/* If we just enabled the profiler, reset call count */
// if(profiling_p())
// word->counter = tag_fixnum(0);
//
// if(word->compiledp == F)
// default_word_xt(word);
// else
// set_word_xt(word,word->code);
if(profiling_p())
word->counter = tag_fixnum(0);
if(word->compiledp == F)
default_word_xt(word);
else
set_word_xt(word,word->code);
}
void set_profiling(bool profiling)