~ chicken-core (chicken-5) d7bd5f081b9c35ce7f13d693f52cbc20ec397f19
commit d7bd5f081b9c35ce7f13d693f52cbc20ec397f19 Author: Peter Bex <peter@more-magic.net> AuthorDate: Sat Aug 22 15:13:04 2015 +0200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Sat Aug 22 15:13:04 2015 +0200 first go at conversion of CPS-calls to use of argument-vector. Conflicts: c-backend.scm diff --git a/c-backend.scm b/c-backend.scm index f85a1c17..98770ac6 100644 --- a/c-backend.scm +++ b/c-backend.scm @@ -251,10 +251,9 @@ (gen #t "C_trace(\"" (slashify name-str) "\");") (gen #t "/* " (uncommentify name-str) " */") ) ) (cond ((eq? '##core#proc (node-class fn)) + (push-args args i "0") (let ([fpars (node-parameters fn)]) - (gen #t (first fpars) #\( nf ",0,") ) - (expr-args args i) - (gen ");") ) + (gen #t (first fpars) #\( nf ",av);") )) (call-id (cond ((and (eq? call-id (lambda-literal-id ll)) (lambda-literal-looping ll) ) @@ -276,11 +275,10 @@ (gen #t #\t nc #\=) (expr fn i) (gen #\;) ) + (push-args args i (and (not empty-closure) (string-append "t" (number->string nc)))) (gen #t call-id #\() (unless customizable (gen nf #\,)) - (unless empty-closure (gen #\t nc #\,)) - (expr-args args i) - (gen ");") ) ) ) + (gen "av);") ) ) ) ((and (eq? '##core#global (node-class fn)) (not unsafe) (not no-procedure-checks) @@ -290,7 +288,8 @@ (safe (second gparams)) (block (third gparams)) (carg #f)) - (gen #t "((C_proc" nf ")") + (push-args args i #f) + (gen #tr "((C_proc)") (cond (no-global-procedure-checks (set! carg (if block @@ -304,7 +303,7 @@ (gen "C_retrieve2_symbol_proc(" carg "," (c-ify-string (##sys#symbol->qualified-string (fourth gparams))) #\)) ) ) - (safe + (safe (set! carg (string-append "*((C_word*)lf[" (number->string index) "]+1)")) (gen "C_fast_retrieve_proc(" carg ")")) @@ -312,20 +311,17 @@ (set! carg (string-append "*((C_word*)lf[" (number->string index) "]+1)")) (gen "C_fast_retrieve_symbol_proc(lf[" index "])") )) - (gen ")(" nf #\, carg #\,) - (expr-args args i) - (gen ");") ) ) + (gen ")(" nf #\, carg ",av);"))) (else (gen #t #\t nc #\=) (expr fn i) - (gen #\; #t - "((C_proc" nf ")") + (gen #\;) + (push-args args i #f) + (gen #t "((C_proc)") (if (or unsafe no-procedure-checks (first params)) (gen "(void*)(*((C_word*)t" nc "+1))") (gen "C_fast_retrieve_proc(t" nc ")") ) - (gen ")(" nf ",t" nc #\,) - (expr-args args i) - (gen ");") ) ) ) ) + (gen ")(" nf ",t" nc ",av);") ) ) ) ) ((##core#recurse) (let* ([n (length subs)] @@ -377,9 +373,8 @@ ;; one unused variable: (let* ((n (length subs)) (nf (+ n 1)) ) - (gen #t "C_" (first params) "_toplevel(" nf ",C_SCHEME_UNDEFINED,") - (expr-args subs i) - (gen ");") ) ) + (push-args subs i "C_SCHEME_UNDEFINED") + (gen #t "C_" (first params) "_toplevel(" nf ",av);"))) ((##core#return) (gen #t "return(") @@ -468,6 +463,17 @@ (expr (car xs) i) (loop (cdr xs))))) + (define (push-args args i karg) + (let ((n (length args))) + (gen #t "C_word av[" n "];") + (when karg (gen #t "av[0]=" karg ";")) + (do ((j 0 (add1 j)) + (args args (cdr args))) + ((null? args)) + (gen #t "av[" j "]=") + (expr (car xs) i) + (gen ";")))) + (expr node temps) ) (define (header) @@ -518,7 +524,7 @@ (for-each (lambda (uu) (gen #t "C_noret_decl(C_" uu "_toplevel)" - #t "C_externimport void C_ccall C_" uu "_toplevel(C_word c,C_word d,C_word k) C_noret;")) + #t "C_externimport void C_ccall C_" uu "_toplevel(C_word c,C_word av) C_noret;")) used-units) (unless (zero? n) (gen #t #t "static C_TLS C_word lf[" n "];") ) @@ -572,7 +578,7 @@ (gen id) ] [else (let ((uname (if unit-name (string-append unit-name "_toplevel") "toplevel"))) - (gen "C_noret_decl(C_" uname ")" #t) + (gen "C_noret_decl(C_" uname ")" #t) ;XXX what's this for? (gen "C_externexport void C_ccall ") (gen "C_" uname) ) ] ) (gen #\() @@ -580,20 +586,12 @@ (when (and direct (not (zero? allocated))) (gen "C_word *a") (when (pair? varlist) (gen #\,)) ) - (apply gen varlist) - (cond [rest - (gen ",...) C_noret;") - (if (not (eq? rest-mode 'none)) - (begin - (gen #t "C_noret_decl(" id ")" - #t "static void C_ccall " id "r(") - (apply gen varlist) - (gen ",C_word t" (+ n 1) ") C_noret;") ) ) ] - [else - (gen #\)) - ;;(when customizable (gen " C_c_regparm")) - (unless direct (gen " C_noret")) - (gen #\;) ] ) ) ) + (when (or customizable direct) + (apply gen varlist)) + (gen #\)) + ;;(when customizable (gen " C_c_regparm")) + (unless direct (gen " C_noret")) + (gen #\;) )) lambda-table) (for-each (lambda (s) @@ -614,28 +612,6 @@ (gen #t "C_word t" i "=C_pick(" j ");") ) (gen #t "C_adjust_stack(-" n ");") ) - (define (emitter vflag) - (lambda (n) - (gen #t #t "C_noret_decl(tr" n #\r (if vflag #\v "") ")" - #t "static void C_fcall tr" n #\r (if vflag #\v "")) - (gen "(C_proc" n " k) C_regparm C_noret;") - (gen #t "C_regparm static void C_fcall tr" n #\r) - (when vflag (gen #\v)) - (gen "(C_proc" n " k){" - #t "int n;" - #t "C_word *a,t" n #\;) - (restore n) - (gen #t "n=C_rest_count(0);") - (if vflag - (gen #t "a=C_alloc(n+1);") - (gen #t "a=C_alloc(n*3);") ) - (gen #t #\t n "=C_restore_rest") - (when vflag (gen "_vector")) - (gen "(a,n);") - (gen #t "(k)(") - (apply gen (intersperse (make-argument-list (+ n 1) "t") #\,)) - (gen ");}") ) ) - (##sys#hash-table-for-each (lambda (id ll) (let* ([argc (lambda-literal-argument-count ll)] @@ -644,33 +620,16 @@ [customizable (lambda-literal-customizable ll)] [empty-closure (and customizable (zero? (lambda-literal-closure-size ll)))] ) (when empty-closure (set! argc (sub1 argc))) - (unless (lambda-literal-direct ll) - (cond [customizable - (gen #t #t "C_noret_decl(tr" id ")" - #t "static void C_fcall tr" id "(void *dummy) C_regparm C_noret;") - (gen #t "C_regparm static void C_fcall tr" id "(void *dummy){") - (restore argc) - (gen #t id #\() - (let ([al (make-argument-list argc "t")]) - (apply gen (intersperse al #\,)) ) - (gen ");}") ] - [(or rest (> (lambda-literal-allocated ll) 0) (lambda-literal-external ll)) - (if (and rest (not (eq? rest-mode 'none))) - (set! nsr (lset-adjoin/eq? nsr argc)) - (set! ns (lset-adjoin/eq? ns argc)))])))) - lambda-table) - (for-each - (lambda (n) - (gen #t #t "C_noret_decl(tr" n ")" - #t "static void C_fcall tr" n "(C_proc" n " k) C_regparm C_noret;") - (gen #t "C_regparm static void C_fcall tr" n "(C_proc" n " k){") - (restore n) - (gen #t "(k)(" n #\,) - (apply gen (intersperse (make-argument-list n "t") #\,)) - (gen ");}") ) - ns) - (for-each (emitter #f) nsr) - (for-each (emitter #t) nsrv) ) ) + (when (and (not (lambda-literal-direct ll)) customizable) + (gen #t #t "C_noret_decl(tr" id ")" + #t "static void C_ccall tr" id "(C_word c,C_word *av) C_noret;") + (gen #t "static void C_ccall tr" id "(C_word c,C_word *av){") + (restore argc) + (gen #t id #\() + (let ([al (make-argument-list argc "t")]) + (apply gen (intersperse al #\,)) ) + (gen ");}") ))) + lambda-table))) (define (literal-frame) (do ([i 0 (add1 i)] @@ -795,21 +754,20 @@ (gen "static C_TLS int toplevel_initialized=0;") (unless unit-name (gen #t "C_main_entry_point") ) - (gen #t "C_noret_decl(toplevel_trampoline)" - #t "static void C_fcall toplevel_trampoline(void *dummy) C_regparm C_noret;" - #t "C_regparm static void C_fcall toplevel_trampoline(void *dummy){" - #t "C_" topname "(2,C_SCHEME_UNDEFINED,C_restore);}" - #t #t "void C_ccall C_" topname) ] ) + (gen #t #t "void C_ccall C_" topname) ] ) (gen #\() (unless customizable (gen "C_word c,")) (when (and direct (not (zero? demand))) (gen "C_word *a") (when (pair? varlist) (gen #\,)) ) - (apply gen varlist) - (when rest (gen ",...")) + (when (or customizable direct) (apply gen varlist)) (gen "){") (when (eq? rest-mode 'none) (set! rest #f)) (gen #t "C_word tmp;") + (unless (or customizable direct) + (do ((i 0 (add1 i))) + ((>= i n)) + (gen #t "C_word t" i "=av[" i "];"))) (if rest (gen #t "C_word t" n #\;) ; To hold rest-list if demand is met (begin @@ -838,7 +796,7 @@ (gen #t "C_check_nursery_minimum(" demand ");" #t "if(!C_demand(" demand ")){" #t "C_save(t1);" - #t "C_reclaim((void*)toplevel_trampoline,NULL);}" + #t "C_reclaim((void*)toplevel);}" #t "toplevel_initialized=1;") (gen #t "if(!C_demand_2(" ldemand ")){" #t "C_save(t1);" @@ -850,7 +808,6 @@ (literal-frame) (gen #t "C_register_lf2(lf," llen ",create_ptable());") ) ) ] [rest - (gen #t "va_list v;") (gen #t "C_word *a,c2=c;") (gen #t "C_save_rest(") (if (> n 0) @@ -887,37 +844,21 @@ (not direct) (or rest external (> demand 0)) ) (cond [rest - (gen #t (if (> nec 0) "C_save_and_reclaim" "C_reclaim") "((void*)tr" n #\r) - (gen ",(void*)" id "r") - (when (> nec 0) - (gen #\, nec #\,) - (apply gen arglist) ) - (gen ");}" + (gen #t "C_reclaim((void*)" id ");" #t "else{" #t "a=C_alloc((c-" n ")*3);") (gen #t "t" n "=C_restore_rest(a,C_rest_count(0));") - (gen #t id "r(") - (apply gen (intersperse (make-argument-list n "t") #\,)) - (gen ",t" n ");}}") - ;; Create secondary routine (no demand-check or argument-count-parameter): - (gen #t #t "static void C_ccall " id "r(") - (apply gen varlist) - (gen ",C_word t" n "){") - (gen #t "C_word tmp;") (do ([i (+ n 1) (+ i 1)] [j temps (- j 1)] ) ((zero? j)) (gen #t "C_word t" i #\;) ) (when (> demand 0) (gen #t "C_word *a=C_alloc(" demand ");")) ] [else - (gen #t (if (> nec 0) "C_save_and_reclaim" "C_reclaim") "((void*)tr") - (if customizable - (gen id ",NULL") - (gen n ",(void*)" id) ) - (when (> nec 0) - (gen #\, nec #\,) - (apply gen arglist) ) - (gen ");}") ] ) ) + (cond ((and customizable (> nec 0)) + (gen #t "C_save_and_reclaim_args((void *)tr" id "," nec ",") + (apply gen arglist) ) + (else + (gen "C_save_and_reclaim((void *)" id ",av);")))])) (expression (lambda-literal-body ll) (if rest @@ -1028,7 +969,6 @@ [rname (real-name2 id db)] [types (foreign-stub-argument-types stub)] [n (length types)] - [varlist (intersperse (cons "C_word C_buf" (make-variable-list n "C_a")) #\,)] [rtype (foreign-stub-return-type stub)] [sname (foreign-stub-name stub)] [body (foreign-stub-body stub)] @@ -1042,16 +982,17 @@ (when body (gen #t "#define return(x) C_cblock C_r = (" rconv "(x))); goto C_ret; C_cblockend")) - (if cps - (gen #t "C_noret_decl(" id ")" - #t "static void C_ccall " id "(C_word C_c,C_word C_self,C_word C_k,") - (gen #t "static C_word C_fcall " id #\() ) - (apply gen varlist) - (if cps - (gen ") C_noret;" #t "static void C_ccall " id "(C_word C_c,C_word C_self,C_word C_k,") - (gen ") C_regparm;" #t "C_regparm static C_word C_fcall " id #\() ) - (apply gen varlist) - (gen "){") + (cond (cps + (gen #t "C_noret_decl(" id ")" + #t "static void C_ccall " id "(C_word C_c,C_word C_av){" + #t "C_word C_buf=C_av[0];") + (do ((i 1 (add1 i))) + ((>= i n)) + (gen #t "C_word C_a" i "=C-av[" i "];"))) + (else + (gen #t "C_regparm static C_word C_fcall " id #\() + (apply gen (intersperse (cons "C_word C_buf" (make-variable-list n "C_a")) #\,)) + (gen "){"))) (gen #t "C_word C_r=C_SCHEME_UNDEFINED,*C_a=(C_word*)C_buf;") (for-each (lambda (type index name)Trap