* Added $code-annotation and $set-code-annotation! primops
This commit is contained in:
parent
50dcf3a11f
commit
ad118623ec
BIN
bin/ikarus
BIN
bin/ikarus
Binary file not shown.
|
@ -886,6 +886,7 @@ add_code_entry(gc_t* gc, ikp entry){
|
||||||
int code_size = unfix(ref(x, disp_code_code_size));
|
int code_size = unfix(ref(x, disp_code_code_size));
|
||||||
ikp reloc_vec = ref(x, disp_code_reloc_vector);
|
ikp reloc_vec = ref(x, disp_code_reloc_vector);
|
||||||
ikp freevars = ref(x, disp_code_freevars);
|
ikp freevars = ref(x, disp_code_freevars);
|
||||||
|
ikp annotation = ref(x, disp_code_annotation);
|
||||||
int required_mem = align(disp_code_data + code_size);
|
int required_mem = align(disp_code_data + code_size);
|
||||||
if(required_mem >= pagesize){
|
if(required_mem >= pagesize){
|
||||||
int new_tag = next_gen_tag[gen];
|
int new_tag = next_gen_tag[gen];
|
||||||
|
@ -907,6 +908,7 @@ add_code_entry(gc_t* gc, ikp entry){
|
||||||
ref(y, disp_code_code_size) = fix(code_size);
|
ref(y, disp_code_code_size) = fix(code_size);
|
||||||
ref(y, disp_code_reloc_vector) = reloc_vec;
|
ref(y, disp_code_reloc_vector) = reloc_vec;
|
||||||
ref(y, disp_code_freevars) = freevars;
|
ref(y, disp_code_freevars) = freevars;
|
||||||
|
ref(y, disp_code_annotation) = annotation;
|
||||||
memcpy(y+disp_code_data, x+disp_code_data, code_size);
|
memcpy(y+disp_code_data, x+disp_code_data, code_size);
|
||||||
ref(x, 0) = forward_ptr;
|
ref(x, 0) = forward_ptr;
|
||||||
ref(x, wordsize) = y + vector_tag;
|
ref(x, wordsize) = y + vector_tag;
|
||||||
|
@ -1354,6 +1356,8 @@ relocate_new_code(ikp x, gc_t* gc){
|
||||||
ikp relocvector = ref(x, disp_code_reloc_vector);
|
ikp relocvector = ref(x, disp_code_reloc_vector);
|
||||||
relocvector = add_object(gc, relocvector, "relocvec");
|
relocvector = add_object(gc, relocvector, "relocvec");
|
||||||
ref(x, disp_code_reloc_vector) = relocvector;
|
ref(x, disp_code_reloc_vector) = relocvector;
|
||||||
|
ref(x, disp_code_annotation) =
|
||||||
|
add_object(gc, ref(x, disp_code_annotation), "annotation");
|
||||||
int relocsize = (int)ref(relocvector, off_vector_length);
|
int relocsize = (int)ref(relocvector, off_vector_length);
|
||||||
ikp p = relocvector + off_vector_data;
|
ikp p = relocvector + off_vector_data;
|
||||||
ikp q = p + relocsize;
|
ikp q = p + relocsize;
|
||||||
|
|
|
@ -10,7 +10,9 @@
|
||||||
#define disp_code_code_size 4
|
#define disp_code_code_size 4
|
||||||
#define disp_code_reloc_vector 8
|
#define disp_code_reloc_vector 8
|
||||||
#define disp_code_freevars 12
|
#define disp_code_freevars 12
|
||||||
|
#define disp_code_annotation 16
|
||||||
#define disp_code_data 24
|
#define disp_code_data 24
|
||||||
|
#define off_code_annotation (disp_code_annotation - code_pri_tag)
|
||||||
#define off_code_data (disp_code_data - code_pri_tag)
|
#define off_code_data (disp_code_data - code_pri_tag)
|
||||||
#define off_code_reloc_vector (disp_code_reloc_vector - code_pri_tag)
|
#define off_code_reloc_vector (disp_code_reloc_vector - code_pri_tag)
|
||||||
|
|
||||||
|
|
|
@ -747,6 +747,7 @@ ikrt_make_code(ikp codesizeptr, ikp freevars, ikp rvec, ikpcb* pcb){
|
||||||
ref(mem, disp_code_code_size) = codesizeptr;
|
ref(mem, disp_code_code_size) = codesizeptr;
|
||||||
ref(mem, disp_code_freevars) = freevars;
|
ref(mem, disp_code_freevars) = freevars;
|
||||||
ref(mem, disp_code_reloc_vector) = rvec;
|
ref(mem, disp_code_reloc_vector) = rvec;
|
||||||
|
ref(mem, disp_code_annotation) = false_object;
|
||||||
ik_relocate_code(mem);
|
ik_relocate_code(mem);
|
||||||
return mem+vector_tag;
|
return mem+vector_tag;
|
||||||
}
|
}
|
||||||
|
@ -759,6 +760,15 @@ ikrt_set_code_reloc_vector(ikp code, ikp vec, ikpcb* pcb){
|
||||||
return void_object;
|
return void_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ikp
|
||||||
|
ikrt_set_code_annotation(ikp code, ikp annot, ikpcb* pcb){
|
||||||
|
ref(code, off_code_annotation) = annot;
|
||||||
|
pcb->dirty_vector[page_index(code)] = -1;
|
||||||
|
return void_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ikp
|
ikp
|
||||||
ikrt_bvftime(ikp outbv, ikp fmtbv){
|
ikrt_bvftime(ikp outbv, ikp fmtbv){
|
||||||
time_t t;
|
time_t t;
|
||||||
|
|
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -3,12 +3,14 @@
|
||||||
(export
|
(export
|
||||||
make-code code-reloc-vector code-freevars
|
make-code code-reloc-vector code-freevars
|
||||||
code-size code-ref code-set! set-code-reloc-vector!
|
code-size code-ref code-set! set-code-reloc-vector!
|
||||||
|
set-code-annotation!
|
||||||
code->thunk)
|
code->thunk)
|
||||||
(import
|
(import
|
||||||
(ikarus system $fx)
|
(ikarus system $fx)
|
||||||
(ikarus system $codes)
|
(ikarus system $codes)
|
||||||
(except (ikarus) make-code code-reloc-vector code-freevars
|
(except (ikarus) make-code code-reloc-vector code-freevars
|
||||||
code-size code-ref code-set! set-code-reloc-vector!))
|
code-size code-ref code-set! set-code-reloc-vector!
|
||||||
|
set-code-annotation!))
|
||||||
|
|
||||||
(define make-code
|
(define make-code
|
||||||
(lambda (code-size freevars)
|
(lambda (code-size freevars)
|
||||||
|
@ -63,6 +65,13 @@
|
||||||
(error 'set-code-reloc-vector! "~s is not a vector" v))
|
(error 'set-code-reloc-vector! "~s is not a vector" v))
|
||||||
(foreign-call "ikrt_set_code_reloc_vector" x v)))
|
(foreign-call "ikrt_set_code_reloc_vector" x v)))
|
||||||
|
|
||||||
|
|
||||||
|
(define set-code-annotation!
|
||||||
|
(lambda (x v)
|
||||||
|
(unless (code? x)
|
||||||
|
(error 'set-code-annotation! "~s is not a code" x))
|
||||||
|
(foreign-call "ikrt_set_code_annotation" x v)))
|
||||||
|
|
||||||
(define code->thunk
|
(define code->thunk
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(unless (code? x)
|
(unless (code? x)
|
||||||
|
|
|
@ -1795,6 +1795,7 @@
|
||||||
(define disp-code-instrsize 4)
|
(define disp-code-instrsize 4)
|
||||||
(define disp-code-relocsize 8)
|
(define disp-code-relocsize 8)
|
||||||
(define disp-code-freevars 12)
|
(define disp-code-freevars 12)
|
||||||
|
(define disp-code-annotation 16)
|
||||||
(define disp-code-data 24)
|
(define disp-code-data 24)
|
||||||
|
|
||||||
(define port-tag #x3F)
|
(define port-tag #x3F)
|
||||||
|
|
|
@ -775,8 +775,10 @@
|
||||||
[$code-reloc-vector $codes]
|
[$code-reloc-vector $codes]
|
||||||
[$code-freevars $codes]
|
[$code-freevars $codes]
|
||||||
[$code-size $codes]
|
[$code-size $codes]
|
||||||
|
[$code-annotation $codes]
|
||||||
[$code-ref $codes]
|
[$code-ref $codes]
|
||||||
[$code-set! $codes]
|
[$code-set! $codes]
|
||||||
|
[$set-code-annotation! $codes]
|
||||||
|
|
||||||
[$make-tcbucket $tcbuckets]
|
[$make-tcbucket $tcbuckets]
|
||||||
[$tcbucket-key $tcbuckets]
|
[$tcbucket-key $tcbuckets]
|
||||||
|
|
|
@ -1579,6 +1579,9 @@
|
||||||
(define-primop $code-size unsafe
|
(define-primop $code-size unsafe
|
||||||
[(V x) (prm 'mref (T x) (K (- disp-code-instrsize vector-tag)))])
|
[(V x) (prm 'mref (T x) (K (- disp-code-instrsize vector-tag)))])
|
||||||
|
|
||||||
|
(define-primop $code-annotation unsafe
|
||||||
|
[(V x) (prm 'mref (T x) (K (- disp-code-annotation vector-tag)))])
|
||||||
|
|
||||||
(define-primop $code->closure unsafe
|
(define-primop $code->closure unsafe
|
||||||
[(V x)
|
[(V x)
|
||||||
(with-tmp ([v (prm 'alloc
|
(with-tmp ([v (prm 'alloc
|
||||||
|
@ -1609,6 +1612,8 @@
|
||||||
(K (- disp-code-data vector-tag)))
|
(K (- disp-code-data vector-tag)))
|
||||||
(prm 'sll (T v) (K (- 8 fixnum-shift))))])
|
(prm 'sll (T v) (K (- 8 fixnum-shift))))])
|
||||||
|
|
||||||
|
(define-primop $set-code-annotation! unsafe
|
||||||
|
[(E x v) (mem-assign v (T x) (- disp-code-annotation vector-tag))])
|
||||||
|
|
||||||
/section)
|
/section)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue