Permalink
Browse files

vm: strip out call-counting profiler

This makes the separate "code" and "entry_point" fields in word and quotation redundant, so also remove them to reclaim an additional cell per word and quotation object, which should help with #318.
  • Loading branch information...
1 parent 06fc9ec commit 5b43301eb6ea443af5259b84881a5c3eebf4cc6c @jckarter jckarter committed Nov 11, 2011
View
@@ -34,7 +34,6 @@ ifdef CONFIG
vm/code_heap.o \
vm/compaction.o \
vm/contexts.o \
- vm/counting_profiler.o \
vm/data_heap.o \
vm/data_heap_checker.o \
vm/debug.o \
@@ -77,7 +76,6 @@ ifdef CONFIG
vm/contexts.hpp \
vm/run.hpp \
vm/objects.hpp \
- vm/counting_profiler.hpp \
vm/sampling_profiler.hpp \
vm/errors.hpp \
vm/bignumint.hpp \
View
@@ -37,7 +37,6 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
vm\code_heap.obj \
vm\compaction.obj \
vm\contexts.obj \
- vm\counting_profiler.obj \
vm\data_heap.obj \
vm\data_heap_checker.obj \
vm\debug.obj \
@@ -350,11 +350,8 @@ M: f ' drop \ f type-number ;
[ props>> , ]
[ pic-def>> , ]
[ pic-tail-def>> , ]
- [ drop 0 , ] ! count
[ word-sub-primitive , ]
- [ drop 0 , ] ! xt
- [ drop 0 , ] ! code
- [ drop 0 , ] ! profiling
+ [ drop 0 , ] ! entry point
} cleave
] { } make [ ' ] map
] bi
@@ -493,8 +490,7 @@ M: quotation '
emit ! array
f ' emit ! cached-effect
f ' emit ! cache-counter
- 0 emit ! xt
- 0 emit ! code
+ 0 emit ! entry point
] emit-object
] cache-eql-object ;
@@ -20,9 +20,9 @@ CONSTANT: deck-bits 18
: alien-offset ( -- n ) 4 alien type-number slot-offset ; inline
: underlying-alien-offset ( -- n ) 1 alien type-number slot-offset ; inline
: tuple-class-offset ( -- n ) 1 tuple type-number slot-offset ; inline
-: word-entry-point-offset ( -- n ) 10 \ word type-number slot-offset ; inline
+: word-entry-point-offset ( -- n ) 9 \ word type-number slot-offset ; inline
: quot-entry-point-offset ( -- n ) 4 quotation type-number slot-offset ; inline
-: word-code-offset ( -- n ) 11 \ word type-number slot-offset ; inline
+: code-block-entry-point-offset ( -- n ) 4 bootstrap-cells ; inline
: array-start-offset ( -- n ) 2 array type-number slot-offset ; inline
: compiled-header-size ( -- n ) 4 bootstrap-cells ; inline
: callstack-length-offset ( -- n ) 1 \ callstack type-number slot-offset ; inline
@@ -77,19 +77,6 @@ big-endian off
] callback-stub jit-define
[
- ! Load word
- temp0 0 MOV f rc-absolute-cell rel-literal
- ! Bump profiling counter
- temp0 profile-count-offset [+] 1 tag-fixnum ADD
- ! Load word->code
- temp0 temp0 word-code-offset [+] MOV
- ! Compute word entry point
- temp0 compiled-header-size ADD
- ! Jump to entry point
- temp0 JMP
-] jit-profiling jit-define
-
-[
! load literal
temp0 0 MOV f rc-absolute-cell rel-literal
! increment datastack pointer
@@ -241,7 +241,6 @@ bi
"props"
"pic-def"
"pic-tail-def"
- { "counter" { "fixnum" "math" } }
{ "sub-primitive" read-only }
} define-builtin
View
@@ -59,19 +59,15 @@ void code_block_visitor<Fixup>::visit_object_code_block(object *obj)
case WORD_TYPE:
{
word *w = (word *)obj;
- if(w->code)
- w->code = visit_code_block(w->code);
- if(w->counting_profiler)
- w->counting_profiler = visit_code_block(w->counting_profiler);
-
- parent->update_word_entry_point(w);
+ if(w->entry_point)
+ w->entry_point = visit_code_block(w->code())->entry_point();
break;
}
case QUOTATION_TYPE:
{
quotation *q = (quotation *)obj;
- if(q->code)
- parent->set_quot_entry_point(q,visit_code_block(q->code));
+ if(q->entry_point)
+ q->entry_point = visit_code_block(q->code())->entry_point();
break;
}
case CALLSTACK_TYPE:
View
@@ -84,4 +84,17 @@ struct code_block
};
VM_C_API void undefined_symbol(void);
+
+inline code_block *word::code() const {
+ assert(entry_point != NULL);
+ return (code_block*)entry_point - 1;
+}
+
+inline code_block *quotation::code() const {
+ assert(entry_point != NULL);
+ return (code_block*)entry_point - 1;
}
+
+}
+
+
View
@@ -178,15 +178,13 @@ void factor_vm::primitive_modify_code_heap()
parameters,
literals);
- word->code = compiled;
+ word->entry_point = compiled->entry_point();
}
break;
default:
critical_error("Expected a quotation or an array",data.value());
break;
}
-
- update_word_entry_point(word.untagged());
}
if(update_existing_words)
View
@@ -1,66 +0,0 @@
-#include "master.hpp"
-
-namespace factor
-{
-
-void factor_vm::init_counting_profiler()
-{
- counting_profiler_p = false;
-}
-
-/* Allocates memory */
-code_block *factor_vm::compile_counting_profiler_stub(cell word_)
-{
- data_root<word> word(word_,this);
-
- jit jit(code_block_counting_profiler,word.value(),this);
- jit.emit_with_literal(special_objects[JIT_PROFILING],word.value());
-
- return jit.to_code_block();
-}
-
-/* Allocates memory */
-void factor_vm::set_counting_profiler(bool counting_profiler)
-{
- if(counting_profiler == counting_profiler_p)
- return;
-
- /* Push everything to tenured space so that we can heap scan
- and allocate counting_profiler blocks if necessary */
- primitive_full_gc();
-
- data_root<array> words(find_all_words(),this);
-
- counting_profiler_p = counting_profiler;
-
- cell length = array_capacity(words.untagged());
- for(cell i = 0; i < length; i++)
- {
- tagged<word> word(array_nth(words.untagged(),i));
-
- /* Note: can't do w->counting_profiler = ... since LHS evaluates
- before RHS, and if RHS does a GC, we will have an
- invalid pointer on the LHS */
- if(counting_profiler)
- {
- if(!word->counting_profiler)
- {
- code_block *counting_profiler_block = compile_counting_profiler_stub(word.value());
- word->counting_profiler = counting_profiler_block;
- }
-
- word->counter = tag_fixnum(0);
- }
-
- update_word_entry_point(word.untagged());
- }
-
- update_code_heap_words(false);
-}
-
-void factor_vm::primitive_counting_profiler()
-{
- set_counting_profiler(to_boolean(ctx->pop()));
-}
-
-}
View
@@ -1,4 +0,0 @@
-namespace factor
-{
-
-}
View
@@ -63,7 +63,7 @@ void factor_vm::dispatch_signal_handler(cell *sp, cell *pc, cell handler)
else
assert(false);
- *pc = (cell)handler_word->code->entry_point();
+ *pc = (cell)handler_word->entry_point;
}
}
View
@@ -22,34 +22,30 @@ void factor_vm::c_to_factor(cell quot)
template<typename Func> Func factor_vm::get_entry_point(cell n)
{
- /* We return word->code->entry_point() and not word->entry_point,
- because if the counting profiler is enabled, we don't want to go through the
- entry point's counting profiler stub. This clobbers registers, since entry
- points use the C ABI and not the Factor ABI. */
tagged<word> entry_point_word(special_objects[n]);
- return (Func)entry_point_word->code->entry_point();
+ return (Func)entry_point_word->entry_point;
}
void factor_vm::unwind_native_frames(cell quot, stack_frame *to)
{
tagged<word> entry_point_word(special_objects[UNWIND_NATIVE_FRAMES_WORD]);
- void *func = entry_point_word->code->entry_point();
+ void *func = entry_point_word->entry_point;
CODE_TO_FUNCTION_POINTER(func);
((unwind_native_frames_func_type)func)(quot,to);
}
cell factor_vm::get_fpu_state()
{
tagged<word> entry_point_word(special_objects[GET_FPU_STATE_WORD]);
- void *func = entry_point_word->code->entry_point();
+ void *func = entry_point_word->entry_point;
CODE_TO_FUNCTION_POINTER(func);
return ((get_fpu_state_func_type)func)();
}
void factor_vm::set_fpu_state(cell state)
{
tagged<word> entry_point_word(special_objects[SET_FPU_STATE_WORD]);
- void *func = entry_point_word->code->entry_point();
+ void *func = entry_point_word->entry_point;
CODE_TO_FUNCTION_POINTER(func);
((set_fpu_state_func_type)func)(state);
}
View
@@ -4,7 +4,6 @@ namespace factor
{
/* Simple code generator used by:
-- counting_profiler (counting_profiler.cpp),
- quotation compiler (quotations.cpp),
- megamorphic caches (dispatch.cpp),
- polymorphic inline caches (inline_cache.cpp) */
View
@@ -98,7 +98,6 @@ enum code_block_type
{
code_block_unoptimized,
code_block_optimized,
- code_block_counting_profiler,
code_block_pic
};
@@ -253,7 +252,11 @@ struct string : public object {
struct code_block;
-/* Assembly code makes assumptions about the layout of this struct */
+/* Assembly code makes assumptions about the layout of this struct:
+ basis/bootstrap/images/images.factor
+ basis/compiler/constants/constants.factor
+ core/bootstrap/primitives.factor
+*/
struct word : public object {
static const cell type_number = WORD_TYPE;
/* TAGGED hashcode */
@@ -270,16 +273,14 @@ struct word : public object {
cell pic_def;
/* TAGGED alternative entry point for direct tail calls. Used for inline caching */
cell pic_tail_def;
- /* TAGGED call count for counting_profiler */
- cell counter;
/* TAGGED machine code for sub-primitive */
cell subprimitive;
/* UNTAGGED entry point: jump here to execute word */
void *entry_point;
/* UNTAGGED compiled code block */
- code_block *code;
- /* UNTAGGED counting_profiler stub */
- code_block *counting_profiler;
+
+ /* defined in code_blocks.hpp */
+ code_block *code() const;
};
/* Assembly code makes assumptions about the layout of this struct */
@@ -299,7 +300,11 @@ struct boxed_float : object {
double n;
};
-/* Assembly code makes assumptions about the layout of this struct */
+/* Assembly code makes assumptions about the layout of this struct:
+ basis/bootstrap/images/images.factor
+ basis/compiler/constants/constants.factor
+ core/bootstrap/primitives.factor
+*/
struct quotation : public object {
static const cell type_number = QUOTATION_TYPE;
/* tagged */
@@ -310,8 +315,9 @@ struct quotation : public object {
cell cache_counter;
/* UNTAGGED entry point; jump here to call quotation */
void *entry_point;
- /* UNTAGGED compiled code block */
- code_block *code;
+
+ /* defined in code_blocks.hpp */
+ code_block *code() const;
};
/* Assembly code makes assumptions about the layout of this struct */
View
@@ -96,7 +96,6 @@ namespace factor
#include "contexts.hpp"
#include "run.hpp"
#include "objects.hpp"
-#include "counting_profiler.hpp"
#include "sampling_profiler.hpp"
#include "errors.hpp"
#include "bignumint.hpp"
View
@@ -46,7 +46,6 @@ namespace factor
_(context_object) \
_(context_object_for) \
_(current_callback) \
- _(counting_profiler) \
_(data_room) \
_(datastack) \
_(datastack_for) \
Oops, something went wrong.

0 comments on commit 5b43301

Please sign in to comment.