vm: put code block owner directly in the header, instead of as the first entry in the literal table. Reduces x86-64 image size by ~700kb, also eliminates separate 'strip' set of staging images from deploy tool
parent
16c3251072
commit
697e2342d0
|
@ -47,7 +47,6 @@ ARTICLE: "runtime-cli-args" "Command line switches for the VM"
|
|||
{ { $snippet "-i=" { $emphasis "image" } } { "Specifies the image file to use; see " { $link "images" } } }
|
||||
{ { $snippet "-datastack=" { $emphasis "n" } } "Data stack size, kilobytes" }
|
||||
{ { $snippet "-retainstack=" { $emphasis "n" } } "Retain stack size, kilobytes" }
|
||||
{ { $snippet "-generations=" { $emphasis "n" } } "Number of generations, must equal 1, 2 or 3" }
|
||||
{ { $snippet "-young=" { $emphasis "n" } } { "Size of youngest generation (0), megabytes" } }
|
||||
{ { $snippet "-aging=" { $emphasis "n" } } "Size of aging generation (1), megabytes" }
|
||||
{ { $snippet "-tenured=" { $emphasis "n" } } "Size of oldest generation (2), megabytes" }
|
||||
|
|
|
@ -32,30 +32,21 @@ SYMBOL: calls
|
|||
#! Compile this word later.
|
||||
calls get push ;
|
||||
|
||||
SYMBOL: compiling-word
|
||||
|
||||
: compiled-stack-traces? ( -- ? ) 67 getenv ;
|
||||
|
||||
! Mapping _label IDs to label instances
|
||||
SYMBOL: labels
|
||||
|
||||
: init-generator ( word -- )
|
||||
: init-generator ( -- )
|
||||
H{ } clone labels set
|
||||
V{ } clone calls set
|
||||
compiling-word set
|
||||
compiled-stack-traces? [ compiling-word get add-literal ] when ;
|
||||
V{ } clone calls set ;
|
||||
|
||||
: generate-insns ( asm -- code )
|
||||
[
|
||||
[ word>> init-generator ]
|
||||
[
|
||||
instructions>>
|
||||
[
|
||||
[ class insn-counts get inc-at ]
|
||||
[ generate-insn ]
|
||||
bi
|
||||
] each
|
||||
] bi
|
||||
dup word>> [
|
||||
init-generator
|
||||
instructions>> [
|
||||
[ class insn-counts get inc-at ]
|
||||
[ generate-insn ]
|
||||
bi
|
||||
] each
|
||||
] with-fixup ;
|
||||
|
||||
: generate ( mr -- asm )
|
||||
|
|
|
@ -4,9 +4,12 @@ USING: arrays byte-arrays byte-vectors generic assocs hashtables
|
|||
io.binary kernel kernel.private math namespaces make sequences
|
||||
words quotations strings alien.accessors alien.strings layouts
|
||||
system combinators math.bitwise math.order
|
||||
accessors growable compiler.constants ;
|
||||
accessors growable fry generalizations compiler.constants ;
|
||||
IN: compiler.codegen.fixup
|
||||
|
||||
! Owner
|
||||
SYMBOL: compiling-word
|
||||
|
||||
! Literal table
|
||||
SYMBOL: literal-table
|
||||
|
||||
|
@ -91,17 +94,19 @@ SYMBOL: relocation-table
|
|||
[ [ resolve-relative-label ] map concat ]
|
||||
bi* ;
|
||||
|
||||
: init-fixup ( -- )
|
||||
: init-fixup ( word -- )
|
||||
compiling-word set
|
||||
V{ } clone literal-table set
|
||||
V{ } clone label-table set
|
||||
BV{ } clone relocation-table set ;
|
||||
|
||||
: with-fixup ( quot -- code )
|
||||
[
|
||||
: with-fixup ( word quot -- code )
|
||||
'[
|
||||
init-fixup
|
||||
call
|
||||
@
|
||||
label-table [ resolve-labels ] change
|
||||
compiling-word get
|
||||
literal-table get >array
|
||||
relocation-table get >byte-array
|
||||
label-table get
|
||||
] B{ } make 4array ; inline
|
||||
] B{ } make 5 narray ; inline
|
||||
|
|
|
@ -53,9 +53,7 @@ CONSTANT: theme-path "basis/ui/gadgets/theme/"
|
|||
] { } make ;
|
||||
|
||||
: staging-image-name ( profile -- name )
|
||||
"staging."
|
||||
swap strip-word-names? [ "strip" suffix ] when
|
||||
"-" join ".image" 3append temp-file ;
|
||||
"-" join "staging." ".image" surround temp-file ;
|
||||
|
||||
DEFER: ?make-staging-image
|
||||
|
||||
|
@ -72,7 +70,6 @@ DEFER: ?make-staging-image
|
|||
] if
|
||||
"-output-image=" over staging-image-name append ,
|
||||
"-include=" swap " " join append ,
|
||||
strip-word-names? [ "-no-stack-traces" , ] when
|
||||
"-no-user-init" ,
|
||||
] { } make ;
|
||||
|
||||
|
@ -102,7 +99,6 @@ DEFER: ?make-staging-image
|
|||
[ "-deploy-vocab=" prepend , ]
|
||||
[ make-deploy-config "-deploy-config=" prepend , ] bi
|
||||
"-output-image=" prepend ,
|
||||
strip-word-names? [ "-no-stack-traces" , ] when
|
||||
] { } make
|
||||
] bind ;
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ IN: tools.deploy.tests
|
|||
|
||||
[ t ] [ "hello-ui" shake-and-bake 1300000 small-enough? ] unit-test
|
||||
|
||||
[ "staging.math-threads-compiler-ui-strip.image" ] [
|
||||
[ "staging.math-threads-compiler-ui.image" ] [
|
||||
"hello-ui" deploy-config
|
||||
[ bootstrap-profile staging-image-name file-name ] bind
|
||||
] unit-test
|
||||
|
|
|
@ -208,7 +208,7 @@ IN: tools.deploy.shaker
|
|||
[ word? ] instances
|
||||
deploy-word-props? get [ 2dup strip-word-props ] unless
|
||||
deploy-word-defs? get [ dup strip-word-defs ] unless
|
||||
strip-word-names? [ dup strip-word-names ] when
|
||||
strip-word-names? [ dup strip-word-names strip-stack-traces ] when
|
||||
2drop ;
|
||||
|
||||
: compiler-classes ( -- seq )
|
||||
|
|
|
@ -522,6 +522,7 @@ tuple
|
|||
{ "optimized?" "words" (( word -- ? )) }
|
||||
{ "quot-compiled?" "quotations" (( quot -- ? )) }
|
||||
{ "vm-ptr" "vm" (( -- ptr )) }
|
||||
{ "strip-stack-traces" "kernel.private" (( -- )) }
|
||||
} [ [ first3 ] dip swap make-primitive ] each-index
|
||||
|
||||
! Bump build number
|
||||
|
|
|
@ -86,16 +86,7 @@ cell factor_vm::frame_type(stack_frame *frame)
|
|||
|
||||
cell factor_vm::frame_executing(stack_frame *frame)
|
||||
{
|
||||
code_block *compiled = frame_code(frame);
|
||||
if(compiled->literals == F || !stack_traces_p())
|
||||
return F;
|
||||
else
|
||||
{
|
||||
array *literals = untag<array>(compiled->literals);
|
||||
cell executing = array_nth(literals,0);
|
||||
check_data_pointer((object *)executing);
|
||||
return executing;
|
||||
}
|
||||
return frame_code(frame)->owner;
|
||||
}
|
||||
|
||||
stack_frame *factor_vm::frame_successor(stack_frame *frame)
|
||||
|
|
|
@ -194,9 +194,9 @@ template<typename Iterator> void factor_vm::iterate_relocations(code_block *comp
|
|||
{
|
||||
byte_array *relocation = untag<byte_array>(compiled->relocation);
|
||||
|
||||
cell index = stack_traces_p() ? 1 : 0;
|
||||
|
||||
cell index = 0;
|
||||
cell length = array_capacity(relocation) / sizeof(relocation_entry);
|
||||
|
||||
for(cell i = 0; i < length; i++)
|
||||
{
|
||||
relocation_entry rel = relocation->data<relocation_entry>()[i];
|
||||
|
@ -425,16 +425,19 @@ code_block *factor_vm::allot_code_block(cell size, cell type)
|
|||
}
|
||||
|
||||
/* Might GC */
|
||||
code_block *factor_vm::add_code_block(cell type, cell code_, cell labels_, cell relocation_, cell literals_)
|
||||
code_block *factor_vm::add_code_block(cell type, cell code_, cell labels_, cell owner_, cell relocation_, cell literals_)
|
||||
{
|
||||
gc_root<byte_array> code(code_,this);
|
||||
gc_root<object> labels(labels_,this);
|
||||
gc_root<object> owner(owner_,this);
|
||||
gc_root<byte_array> relocation(relocation_,this);
|
||||
gc_root<array> literals(literals_,this);
|
||||
|
||||
cell code_length = align8(array_capacity(code.untagged()));
|
||||
code_block *compiled = allot_code_block(code_length,type);
|
||||
|
||||
compiled->owner = owner.value();
|
||||
|
||||
/* slight space optimization */
|
||||
if(relocation.type() == BYTE_ARRAY_TYPE && array_capacity(relocation.untagged()) == 0)
|
||||
compiled->relocation = F;
|
||||
|
|
|
@ -91,15 +91,17 @@ void factor_vm::primitive_modify_code_heap()
|
|||
case ARRAY_TYPE:
|
||||
{
|
||||
array *compiled_data = data.as<array>().untagged();
|
||||
cell literals = array_nth(compiled_data,0);
|
||||
cell relocation = array_nth(compiled_data,1);
|
||||
cell labels = array_nth(compiled_data,2);
|
||||
cell code = array_nth(compiled_data,3);
|
||||
cell owner = array_nth(compiled_data,0);
|
||||
cell literals = array_nth(compiled_data,1);
|
||||
cell relocation = array_nth(compiled_data,2);
|
||||
cell labels = array_nth(compiled_data,3);
|
||||
cell code = array_nth(compiled_data,4);
|
||||
|
||||
code_block *compiled = add_code_block(
|
||||
WORD_TYPE,
|
||||
code,
|
||||
labels,
|
||||
owner,
|
||||
relocation,
|
||||
literals);
|
||||
|
||||
|
@ -245,4 +247,19 @@ void factor_vm::compact_code_heap()
|
|||
code->build_free_list(size);
|
||||
}
|
||||
|
||||
struct stack_trace_stripper {
|
||||
explicit stack_trace_stripper() {}
|
||||
|
||||
void operator()(code_block *compiled)
|
||||
{
|
||||
compiled->owner = F;
|
||||
}
|
||||
};
|
||||
|
||||
void factor_vm::primitive_strip_stack_traces()
|
||||
{
|
||||
stack_trace_stripper stripper;
|
||||
iterate_code_heap(stripper);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -287,6 +287,7 @@ template<typename Strategy> void factor_vm::trace_contexts(Strategy &strategy)
|
|||
/* Trace all literals referenced from a code block. Only for aging and nursery collections */
|
||||
template<typename Strategy> void factor_vm::trace_literal_references(code_block *compiled, Strategy &strategy)
|
||||
{
|
||||
trace_handle(&compiled->owner,strategy);
|
||||
trace_handle(&compiled->literals,strategy);
|
||||
trace_handle(&compiled->relocation,strategy);
|
||||
}
|
||||
|
|
|
@ -49,8 +49,6 @@ void factor_vm::default_parameters(vm_parameters *p)
|
|||
p->console = false;
|
||||
|
||||
#endif
|
||||
|
||||
p->stack_traces = true;
|
||||
}
|
||||
|
||||
bool factor_vm::factor_arg(const vm_char* str, const vm_char* arg, cell* value)
|
||||
|
@ -85,7 +83,6 @@ void factor_vm::init_parameters_from_args(vm_parameters *p, int argc, vm_char **
|
|||
else if(STRCMP(argv[i],STRING_LITERAL("-fep")) == 0) p->fep = true;
|
||||
else if(STRNCMP(argv[i],STRING_LITERAL("-i="),3) == 0) p->image_path = argv[i] + 3;
|
||||
else if(STRCMP(argv[i],STRING_LITERAL("-console")) == 0) p->console = true;
|
||||
else if(STRCMP(argv[i],STRING_LITERAL("-no-stack-traces")) == 0) p->stack_traces = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,10 +149,7 @@ void factor_vm::init_factor(vm_parameters *p)
|
|||
gc_off = false;
|
||||
|
||||
if(userenv[STAGE2_ENV] == F)
|
||||
{
|
||||
userenv[STACK_TRACES_ENV] = tag_boolean(p->stack_traces);
|
||||
do_stage1_init();
|
||||
}
|
||||
}
|
||||
|
||||
/* May allocate memory */
|
||||
|
|
|
@ -295,8 +295,9 @@ void factor_vm::relocate_data()
|
|||
void factor_vm::fixup_code_block(code_block *compiled)
|
||||
{
|
||||
/* relocate literal table data */
|
||||
data_fixup(&compiled->relocation);
|
||||
data_fixup(&compiled->owner);
|
||||
data_fixup(&compiled->literals);
|
||||
data_fixup(&compiled->relocation);
|
||||
|
||||
relocate_code_block(compiled);
|
||||
}
|
||||
|
|
|
@ -37,7 +37,6 @@ struct vm_parameters {
|
|||
bool secure_gc;
|
||||
bool fep;
|
||||
bool console;
|
||||
bool stack_traces;
|
||||
cell max_pic_size;
|
||||
};
|
||||
|
||||
|
|
|
@ -20,9 +20,7 @@ jit::jit(cell type_, cell owner_, factor_vm *vm)
|
|||
position(0),
|
||||
offset(0),
|
||||
parent_vm(vm)
|
||||
{
|
||||
if(parent_vm->stack_traces_p()) literal(owner.value());
|
||||
}
|
||||
{}
|
||||
|
||||
void jit::emit_relocation(cell code_template_)
|
||||
{
|
||||
|
@ -106,6 +104,7 @@ code_block *jit::to_code_block()
|
|||
type,
|
||||
code.elements.value(),
|
||||
F, /* no labels */
|
||||
owner.value(),
|
||||
relocation.elements.value(),
|
||||
literals.elements.value());
|
||||
}
|
||||
|
|
|
@ -233,8 +233,8 @@ struct free_heap_block : public heap_block
|
|||
|
||||
struct code_block : public heap_block
|
||||
{
|
||||
cell unused;
|
||||
cell literals; /* # bytes */
|
||||
cell owner; /* tagged pointer to word, quotation or f */
|
||||
cell literals; /* tagged pointer to array or f */
|
||||
cell relocation; /* tagged pointer to byte-array or f */
|
||||
|
||||
void *xt() { return (void *)(this + 1); }
|
||||
|
|
|
@ -164,6 +164,7 @@ const primitive_type primitives[] = {
|
|||
primitive_optimized_p,
|
||||
primitive_quot_compiled_p,
|
||||
primitive_vm_ptr,
|
||||
primitive_strip_stack_traces,
|
||||
};
|
||||
|
||||
PRIMITIVE_FORWARD(bignum_to_fixnum)
|
||||
|
@ -289,5 +290,6 @@ PRIMITIVE_FORWARD(inline_cache_stats)
|
|||
PRIMITIVE_FORWARD(optimized_p)
|
||||
PRIMITIVE_FORWARD(quot_compiled_p)
|
||||
PRIMITIVE_FORWARD(vm_ptr)
|
||||
PRIMITIVE_FORWARD(strip_stack_traces)
|
||||
|
||||
}
|
||||
|
|
|
@ -172,5 +172,6 @@ PRIMITIVE(inline_cache_stats);
|
|||
PRIMITIVE(optimized_p);
|
||||
PRIMITIVE(quot_compiled_p);
|
||||
PRIMITIVE(vm_ptr);
|
||||
PRIMITIVE(strip_stack_traces);
|
||||
|
||||
}
|
||||
|
|
|
@ -87,8 +87,6 @@ enum special_object {
|
|||
THREADS_ENV = 64,
|
||||
RUN_QUEUE_ENV = 65,
|
||||
SLEEP_QUEUE_ENV = 66,
|
||||
|
||||
STACK_TRACES_ENV = 67,
|
||||
};
|
||||
|
||||
#define FIRST_SAVE_ENV BOOT_ENV
|
||||
|
@ -96,7 +94,7 @@ enum special_object {
|
|||
|
||||
inline static bool save_env_p(cell i)
|
||||
{
|
||||
return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV) || i == STACK_TRACES_ENV;
|
||||
return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -514,11 +514,7 @@ struct factor_vm
|
|||
void relocate_code_block(code_block *compiled);
|
||||
void fixup_labels(array *labels, code_block *compiled);
|
||||
code_block *allot_code_block(cell size, cell type);
|
||||
code_block *add_code_block(cell type, cell code_, cell labels_, cell relocation_, cell literals_);
|
||||
inline bool stack_traces_p()
|
||||
{
|
||||
return userenv[STACK_TRACES_ENV] != F;
|
||||
}
|
||||
code_block *add_code_block(cell type, cell code_, cell labels_, cell owner_, cell relocation_, cell literals_);
|
||||
|
||||
//code_heap
|
||||
code_heap *code;
|
||||
|
@ -540,6 +536,7 @@ struct factor_vm
|
|||
void forward_object_xts();
|
||||
void fixup_object_xts();
|
||||
void compact_code_heap();
|
||||
void primitive_strip_stack_traces();
|
||||
|
||||
/* Apply a function to every code block */
|
||||
template<typename Iterator> void iterate_code_heap(Iterator &iter)
|
||||
|
|
Loading…
Reference in New Issue