64-bit fasl files can now be produced and read.
This commit is contained in:
parent
3c99e7d393
commit
341e53a36d
|
@ -5536,6 +5536,7 @@ cat >>confdefs.h <<_ACEOF
|
|||
_ACEOF
|
||||
|
||||
|
||||
# remember to enable before release.
|
||||
# if (test $ac_cv_sizeof_void_p != 4); then
|
||||
# AC_MSG_ERROR([Ikarus can only run in 32-bit mode.])
|
||||
# fi
|
||||
|
|
|
@ -29,6 +29,7 @@ case "$target_os" in
|
|||
|
||||
|
||||
AC_CHECK_SIZEOF(void *)
|
||||
# remember to enable before release.
|
||||
# if (test $ac_cv_sizeof_void_p != 4); then
|
||||
# AC_MSG_ERROR([Ikarus can only run in 32-bit mode.])
|
||||
# fi
|
||||
|
|
|
@ -2059,7 +2059,11 @@
|
|||
|
||||
;;; refer to the picture in src/ikarus-collect.c for details
|
||||
;;; on how call-frames are laid out. (search for livemask)
|
||||
(define call-instruction-size 5)
|
||||
(define call-instruction-size
|
||||
(case wordsize
|
||||
[(4) 5]
|
||||
[(8) 10]
|
||||
[else (die 'call-instruction-size "invalid" wordsize)]))
|
||||
(define disp-frame-size (- (+ call-instruction-size (* 3 wordsize))))
|
||||
(define disp-frame-offset (- (+ call-instruction-size (* 2 wordsize))))
|
||||
(define disp-multivalue-rp (- (+ call-instruction-size (* 1 wordsize))))
|
||||
|
|
|
@ -64,18 +64,19 @@
|
|||
(define (put-tag c p)
|
||||
(write-byte (char->integer c) p))
|
||||
|
||||
(define write-int
|
||||
(define write-int32
|
||||
(lambda (x p)
|
||||
(unless (int? x) (die 'write-int "not a int" x))
|
||||
(write-byte (bitwise-and x #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 8) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 16) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 24) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 24) #xFF) p)))
|
||||
|
||||
(define write-int
|
||||
(lambda (x p)
|
||||
(unless (int? x) (die 'write-int "not a int" x))
|
||||
(write-int32 x p)
|
||||
(when (eqv? wordsize 8)
|
||||
(write-byte (bitwise-and (sra x 32) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 40) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 48) #xFF) p)
|
||||
(write-byte (bitwise-and (sra x 56) #xFF) p))))
|
||||
(write-int32 (sra x 32) p))))
|
||||
|
||||
(define fasl-write-immediate
|
||||
(lambda (x p)
|
||||
|
@ -92,7 +93,7 @@
|
|||
(write-byte n p))
|
||||
(begin
|
||||
(put-tag #\C p)
|
||||
(write-int n p))))]
|
||||
(write-int32 n p))))]
|
||||
[(boolean? x)
|
||||
(put-tag (if x #\T #\F) p)]
|
||||
[(eof-object? x) (put-tag #\E p)]
|
||||
|
@ -164,7 +165,7 @@
|
|||
(write-int (string-length x) p)
|
||||
(let f ([x x] [i 0] [n (string-length x)])
|
||||
(unless (= i n)
|
||||
(write-int (char->integer (string-ref x i)) p)
|
||||
(write-int32 (char->integer (string-ref x i)) p)
|
||||
(f x (fxadd1 i) n)))])
|
||||
m]
|
||||
[(gensym? x)
|
||||
|
@ -269,11 +270,11 @@
|
|||
[(fx> mark 0) ; marked but not written
|
||||
(hashtable-set! h x (fx- 0 m))
|
||||
(put-tag #\> p)
|
||||
(write-int m p)
|
||||
(write-int32 m p)
|
||||
(do-write x p h (fxadd1 m))]
|
||||
[else
|
||||
(put-tag #\< p)
|
||||
(write-int (fx- 0 mark) p)
|
||||
(write-int32 (fx- 0 mark) p)
|
||||
m]))]
|
||||
[else (die 'fasl-write "BUG: not in hash table" x)])))
|
||||
(define make-graph
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
(except (ikarus code-objects) procedure-annotation)
|
||||
(ikarus system $pairs))
|
||||
|
||||
|
||||
(module (wordsize)
|
||||
(include "ikarus.config.ss"))
|
||||
|
||||
(define fold
|
||||
(lambda (f init ls)
|
||||
(cond
|
||||
|
@ -710,9 +714,10 @@
|
|||
(case (car x)
|
||||
[(byte) (fx+ ac 1)]
|
||||
[(word reloc-word reloc-word+ label-addr foreign-label
|
||||
relative local-relative current-frame-offset)
|
||||
local-relative)
|
||||
(fx+ ac 4)]
|
||||
[(label) ac]
|
||||
[(relative current-frame-offset) (+ ac wordsize)]
|
||||
[else (die 'compute-code-size "unknown instr" x)])))
|
||||
0
|
||||
ls)))
|
||||
|
@ -784,15 +789,17 @@
|
|||
(f (cdr ls) (fx+ idx 1) reloc)]
|
||||
[(reloc-word reloc-word+)
|
||||
(f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))]
|
||||
[(local-relative relative label-addr foreign-label)
|
||||
[(local-relative label-addr foreign-label)
|
||||
(f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))]
|
||||
[(relative)
|
||||
(f (cdr ls) (fx+ idx wordsize) (cons (cons idx a) reloc))]
|
||||
[(word)
|
||||
(let ([v (cdr a)])
|
||||
(set-code-word! x idx v)
|
||||
(f (cdr ls) (fx+ idx 4) reloc))]
|
||||
[(current-frame-offset)
|
||||
(set-code-word! x idx idx)
|
||||
(f (cdr ls) (fx+ idx 4) reloc)]
|
||||
(set-code-word! x idx idx) ;;; FIXME 64bit
|
||||
(f (cdr ls) (fx+ idx wordsize) reloc)]
|
||||
[(label)
|
||||
(set-label-loc! (cdr a) (list x idx))
|
||||
(f (cdr ls) idx reloc)]
|
||||
|
@ -800,8 +807,6 @@
|
|||
(die 'whack-instructions "unknown instr" a)])))])))
|
||||
(f ls 0 '())))
|
||||
|
||||
(define wordsize 4)
|
||||
|
||||
|
||||
(define compute-reloc-size
|
||||
(lambda (ls)
|
||||
|
|
|
@ -1 +1 @@
|
|||
1315
|
||||
1316
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env ikarus -b ikarus.boot --r6rs-script
|
||||
#!../src/ikarus -b ikarus.boot --r6rs-script
|
||||
;;; Ikarus Scheme -- A compiler for R6RS Scheme.
|
||||
;;; Copyright (C) 2006,2007 Abdulaziz Ghuloum
|
||||
;;;
|
||||
|
|
|
@ -219,7 +219,8 @@ ikptr ik_safe_alloc(ikpcb* pcb, int size);
|
|||
#define align(n) \
|
||||
((((n) + align_size - 1) >> align_shift) << align_shift)
|
||||
|
||||
#define IK_FASL_HEADER "#@IK01"
|
||||
#define IK_FASL_HEADER \
|
||||
((sizeof(ikptr) == 4) ? "#@IK01" : "#@IK02")
|
||||
#define IK_FASL_HEADER_LEN (strlen(IK_FASL_HEADER))
|
||||
|
||||
#define code_pri_tag vector_tag
|
||||
|
@ -351,7 +352,8 @@ ikptr ik_safe_alloc(ikpcb* pcb, int size);
|
|||
#define align_to_prev_page(x) \
|
||||
((((unsigned long int)(x)) >> pageshift) << pageshift)
|
||||
|
||||
#define call_instruction_size 5
|
||||
#define call_instruction_size \
|
||||
((wordsize == 4) ? 5 : 10)
|
||||
#define disp_frame_size (- (call_instruction_size + 3 * wordsize))
|
||||
#define disp_frame_offset (- (call_instruction_size + 2 * wordsize))
|
||||
#define disp_multivale_rp (- (call_instruction_size + 1 * wordsize))
|
||||
|
|
|
@ -110,8 +110,12 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){
|
|||
}
|
||||
close(fd);
|
||||
}
|
||||
ikptr val = ik_exec_code(pcb, v);
|
||||
val = void_object;
|
||||
ikptr val = void_object;
|
||||
if(wordsize == 4){
|
||||
ik_exec_code(pcb, v);
|
||||
} else {
|
||||
fprintf(stderr, "NOT EXECING YET\n");
|
||||
}
|
||||
if(val != void_object){
|
||||
/* this is from revision 1
|
||||
and is no longer needed
|
||||
|
@ -123,6 +127,10 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){
|
|||
fprintf(stderr, "fasl-read did not reach eof!\n");
|
||||
exit(-10);
|
||||
}
|
||||
if(wordsize == 8){
|
||||
fprintf(stderr, "DONE READING FASL, EXITING ...\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static ikptr
|
||||
|
@ -279,9 +287,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
}
|
||||
if(c == 'x'){
|
||||
int code_size;
|
||||
long int code_size;
|
||||
ikptr freevars;
|
||||
fasl_read_buf(p, &code_size, sizeof(int));
|
||||
fasl_read_buf(p, &code_size, sizeof(long int));
|
||||
fasl_read_buf(p, &freevars, sizeof(ikptr));
|
||||
ikptr annotation = do_read(pcb, p);
|
||||
ikptr code = alloc_code(align(code_size+disp_code_data), pcb, p);
|
||||
|
@ -317,16 +325,16 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
else if(c == 's'){
|
||||
/* ascii string */
|
||||
int len;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
int size = align(len*string_char_size + disp_string_data);
|
||||
long int len;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
long int size = align(len*string_char_size + disp_string_data);
|
||||
ikptr str = ik_unsafe_alloc(pcb, size) + string_tag;
|
||||
ref(str, off_string_length) = fix(len);
|
||||
fasl_read_buf(p, (char*)(long)str+off_string_data, len);
|
||||
{
|
||||
unsigned char* pi = (unsigned char*)(long)(str+off_string_data);
|
||||
ikchar* pj = (ikchar*)(long)(str+off_string_data);
|
||||
int i = len-1;
|
||||
long int i = len-1;
|
||||
for(i=len-1; i >= 0; i--){
|
||||
pj[i] = integer_to_char(pi[i]);
|
||||
}
|
||||
|
@ -339,9 +347,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
else if(c == 'S'){
|
||||
/* string */
|
||||
int len;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
int size = align(len*string_char_size + disp_string_data);
|
||||
long int len;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
long int size = align(len*string_char_size + disp_string_data);
|
||||
ikptr str = ik_unsafe_alloc(pcb, size) + string_tag;
|
||||
ref(str, off_string_length) = fix(len);
|
||||
long int i;
|
||||
|
@ -356,17 +364,16 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
else if(c == 'V'){
|
||||
int len;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
int size = align(len * wordsize + disp_vector_data);
|
||||
long int len;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
long int size = align(len * wordsize + disp_vector_data);
|
||||
ikptr vec = ik_unsafe_alloc(pcb, size) + vector_tag;
|
||||
if(put_mark_index){
|
||||
p->marks[put_mark_index] = vec;
|
||||
}
|
||||
ref(vec, off_vector_length) = fix(len);
|
||||
int i;
|
||||
long int i;
|
||||
for(i=0; i<len; i++){
|
||||
ref(vec, off_vector_data + i*wordsize) = do_read(pcb, p);
|
||||
}
|
||||
|
@ -374,7 +381,7 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
else if(c == 'I'){
|
||||
ikptr fixn;
|
||||
fasl_read_buf(p, &fixn, sizeof(int));
|
||||
fasl_read_buf(p, &fixn, sizeof(ikptr));
|
||||
return fixn;
|
||||
}
|
||||
else if(c == 'F'){
|
||||
|
@ -404,8 +411,8 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
else if(c == 'R'){ /* R is for RTD */
|
||||
ikptr name = do_read(pcb, p);
|
||||
ikptr symb = do_read(pcb, p);
|
||||
int i, n;
|
||||
fasl_read_buf(p, &n, sizeof(int));
|
||||
long int i, n;
|
||||
fasl_read_buf(p, &n, sizeof(long int));
|
||||
ikptr fields;
|
||||
if(n == 0){
|
||||
fields = null_object;
|
||||
|
@ -471,9 +478,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
else if(c == 'v'){
|
||||
/* bytevector */
|
||||
int len;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
int size = align(len + disp_bytevector_data + 1);
|
||||
long int len;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
long int size = align(len + disp_bytevector_data + 1);
|
||||
ikptr x = ik_unsafe_alloc(pcb, size) + bytevector_tag;
|
||||
ref(x, off_bytevector_length) = fix(len);
|
||||
fasl_read_buf(p, (void*)(long)(x+off_bytevector_data), len);
|
||||
|
@ -485,10 +492,6 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
}
|
||||
else if(c == 'l'){
|
||||
int len = (unsigned char) fasl_read_byte(p);
|
||||
if(len < 0){
|
||||
fprintf(stderr, "invalid len=%d\n", len);
|
||||
exit(-1);
|
||||
}
|
||||
ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag;
|
||||
if(put_mark_index){
|
||||
p->marks[put_mark_index] = pair;
|
||||
|
@ -504,17 +507,17 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
return pair;
|
||||
}
|
||||
else if(c == 'L'){
|
||||
int len;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
long int len;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
if(len < 0){
|
||||
fprintf(stderr, "invalid len=%d\n", len);
|
||||
fprintf(stderr, "invalid len=%ld\n", len);
|
||||
exit(-1);
|
||||
}
|
||||
ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag;
|
||||
if(put_mark_index){
|
||||
p->marks[put_mark_index] = pair;
|
||||
}
|
||||
int i; ikptr pt = pair;
|
||||
long int i; ikptr pt = pair;
|
||||
for(i=0; i<len; i++){
|
||||
ref(pt, off_car) = do_read(pcb, p);
|
||||
ref(pt, off_cdr) = pt + pair_size;
|
||||
|
@ -539,15 +542,15 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){
|
|||
return int_to_scheme_char(n);
|
||||
}
|
||||
else if(c == 'b'){
|
||||
int len;
|
||||
int sign = 0;
|
||||
fasl_read_buf(p, &len, sizeof(int));
|
||||
long int len;
|
||||
long int sign = 0;
|
||||
fasl_read_buf(p, &len, sizeof(long int));
|
||||
if(len < 0) {
|
||||
sign = 1;
|
||||
len = -len;
|
||||
}
|
||||
if(len & 3){
|
||||
fprintf(stderr, "Error in fasl-read: invalid bignum length %d\n", len);
|
||||
fprintf(stderr, "Error in fasl-read: invalid bignum length %ld\n", len);
|
||||
exit(-1);
|
||||
}
|
||||
unsigned long int tag = bignum_tag | (sign << bignum_sign_shift) |
|
||||
|
|
|
@ -42,8 +42,8 @@ int total_allocated_pages = 0;
|
|||
extern char **environ;
|
||||
|
||||
|
||||
#define segment_size (pagesize*pagesize/wordsize)
|
||||
#define segment_shift (pageshift+pageshift-wordshift)
|
||||
#define segment_size (pagesize*pagesize/4)
|
||||
#define segment_shift (pageshift+pageshift-2)
|
||||
#define segment_index(x) (((unsigned long int)(x)) >> segment_shift)
|
||||
|
||||
ikptr ik_mmap(int size);
|
||||
|
@ -328,9 +328,9 @@ ikpcb* ik_make_pcb(){
|
|||
hi_mem = pcb->heap_base + pcb->heap_size + pagesize;
|
||||
}
|
||||
|
||||
long int lo_seg = segment_index(lo_mem);
|
||||
long int hi_seg = segment_index(hi_mem+segment_size-1);
|
||||
long int vec_size = (hi_seg - lo_seg) * pagesize;
|
||||
unsigned long int lo_seg = segment_index(lo_mem);
|
||||
unsigned long int hi_seg = segment_index(hi_mem+segment_size-1);
|
||||
unsigned long int vec_size = (hi_seg - lo_seg) * pagesize;
|
||||
ikptr dvec = ik_mmap(vec_size);
|
||||
bzero((char*)(long)dvec, vec_size);
|
||||
pcb->dirty_vector_base = (unsigned int*)(long) dvec;
|
||||
|
|
Loading…
Reference in New Issue