|
|
1.1 ! root 1: ; l i s z t v 4 ! 2: ; ! 3: ; ! 4: ; ! 5: ; A compiler for Franz lisp ! 6: ; ! 7: ; Copyright (c) 1980 , The Regents of the University of California. ! 8: ; All rights reserved. ! 9: ; author: j. foderaro ! 10: ; ! 11: ; Section INIT -- initialization and macros ! 12: ! 13: (include "caspecs.l") ! 14: ! 15: (eval-when (compile eval) ! 16: (cond ((not (getd 'If)) ! 17: (fasl 'camacs)))) ! 18: ! 19: ;the version number is maintained by hand, and is written twice ! 20: ; once for the benefit of the user ! 21: (setq compiler-name "Lisp Compiler 5.0") ! 22: ; and the other time for SCCS's what command ! 23: (setq sccs-compiler-name "@(#)Liszt version 5.0") ! 24: ! 25: (setq sectioncarid "@(#)car.l 5.4 11/11/80") ; id for SCCS ! 26: ! 27: (setq original-readtable readtable) ! 28: (setq raw-readtable (makereadtable t)) ! 29: ! 30: ;--- special handlers ! 31: (putprop 'and 'cc-and 'fl-exprcc) ! 32: (putprop 'arg 'cc-arg 'fl-exprcc) ! 33: (putprop 'atom 'cc-atom 'fl-exprcc) ! 34: (putprop 'bigp 'cc-bigp 'fl-exprcc) ! 35: (putprop 'bcdp 'cc-bcdp 'fl-exprcc) ! 36: (putprop '*catch 'c-*catch 'fl-expr) ! 37: (putprop 'comment 'cc-ignore 'fl-exprcc) ! 38: (putprop 'cond 'c-cond 'fl-expr) ! 39: (putprop 'cons 'c-cons 'fl-expr) ! 40: (putprop 'cxr 'c-cxr 'fl-exprcc) ! 41: (putprop 'declare 'c-declare 'fl-expr) ! 42: (putprop 'do 'c-do 'fl-expr) ! 43: (putprop 'dtpr 'cc-dtpr 'fl-exprcc) ! 44: (putprop 'eq 'cc-eq 'fl-exprcc) ! 45: (putprop 'equal 'cc-equal 'fl-exprcc) ! 46: (putprop '= 'cc-equal 'fl-exprcc) ! 47: (putprop 'errset 'c-errset 'fl-expr) ! 48: (putprop 'fixp 'cc-fixp 'fl-exprcc) ! 49: (putprop 'floatp 'cc-floatp 'fl-exprcc) ! 50: (putprop 'get 'c-get 'fl-expr) ! 51: (putprop 'go 'c-go 'fl-expr) ! 52: (putprop 'list 'c-list 'fl-expr) ! 53: (putprop 'map 'cm-map 'fl-exprm) ! 54: (putprop 'mapc 'cm-mapc 'fl-exprm) ! 55: (putprop 'mapcan 'cm-mapcan 'fl-exprm) ! 56: (putprop 'mapcar 'cm-mapcar 'fl-exprm) ! 57: (putprop 'mapcon 'cm-mapcon 'fl-exprm) ! 58: (putprop 'maplist 'cm-maplist 'fl-exprm) ! 59: (putprop 'memq 'cc-memq 'fl-exprcc) ! 60: (putprop 'not 'cc-not 'fl-exprcc) ! 61: (putprop 'null 'cc-not 'fl-exprcc) ! 62: (putprop 'numberp 'cc-numberp 'fl-exprcc) ! 63: (putprop 'or 'cc-or 'fl-exprcc) ! 64: (putprop 'prog 'c-prog 'fl-expr) ! 65: (putprop 'progn 'cm-progn 'fl-exprm) ! 66: (putprop 'prog1 'cm-prog1 'fl-exprm) ! 67: (putprop 'prog2 'cm-prog2 'fl-exprm) ! 68: (putprop 'quote 'cc-quote 'fl-exprcc) ! 69: (putprop 'return 'c-return 'fl-expr) ! 70: (putprop 'rplaca 'c-rplaca 'fl-expr) ! 71: (putprop 'rplacd 'c-rplacd 'fl-expr) ! 72: (putprop 'setarg 'c-setarg 'fl-expr) ! 73: (putprop 'setq 'cc-setq 'fl-exprcc) ! 74: (putprop 'stringp 'cc-stringp 'fl-exprcc) ! 75: (putprop 'symbolp 'cc-symbolp 'fl-exprcc) ! 76: (putprop 'symeval 'cm-symeval 'fl-exprm) ! 77: (putprop '*throw 'c-*throw 'fl-expr) ! 78: (putprop 'typep 'cc-typep 'fl-exprcc) ! 79: (putprop 'zerop 'cm-zerop 'fl-exprm) ! 80: ! 81: (putprop '1+ 'c-1+ 'fl-expr) ! 82: (putprop '1- 'c-1- 'fl-expr) ! 83: (putprop '+ 'c-+ 'fl-expr) ! 84: (putprop '- 'c-- 'fl-expr) ! 85: (putprop '* 'c-* 'fl-expr) ! 86: (putprop '/ 'c-/ 'fl-expr) ! 87: (putprop '\\ 'c-\\ 'fl-expr) ! 88: ! 89: ! 90: ! 91: ! 92: ; Section INTERF -- user interface ! 93: ! 94: ! 95: ;--- lisztinit : called upon compiler startup. If there are any args ! 96: ; on the command line, we build up a call to lcf, which ! 97: ; will do the compile. Afterwards we exit. ! 98: ; ! 99: (def lisztinit ! 100: (lambda nil ! 101: (cond ((greaterp (argv -1) 1) ; build up list of args ! 102: (do ((i (1- (argv -1)) (1- i)) (arglis)) ! 103: ((lessp i 1) ! 104: (setq user-top-level nil) ! 105: (exit (apply 'liszt arglis))) ! 106: (setq arglis (cons (argv i) arglis)))) ! 107: (t (patom compiler-name) ! 108: (terpr poport) ! 109: (setq user-top-level nil))))) ! 110: ! 111: (setq user-top-level 'lisztinit) ! 112: ! 113: ! 114: ! 115: ;--- lcf - v-x : list containing file name to compile and optionaly ! 116: ; and output file name for the assembler source. ! 117: ; ! 118: (def liszt ! 119: (nlambda (v-x) ! 120: (prog (piport v-root v-ifile v-sfile v-ofile ! 121: vp-ifile vp-sfile vps-crap ! 122: vps-include ! 123: tmp rootreal ! 124: g-fname ! 125: tem temr starttime startptime startgccount ! 126: fl-asm fl-warn fl-verb fl-inter fl-xref fl-uci ! 127: g-skipcode g-dropnpcnt) ! 128: ! 129: ; turn on monitoring if it exists ! 130: #+monitoring ! 131: (errset (progn (monitor t) ; turn it on ! 132: (print 'monitor-on) ! 133: (terpr)) ! 134: nil) ! 135: (setq starttime (syscall 13) ; real time in seconds ! 136: startptime (ptime) ! 137: startgccount $gccount$) ! 138: (cond ((null (boundp 'internal-macros)) ! 139: (setq internal-macros nil))) ! 140: (cond ((null (boundp 'macros)) ! 141: (setq macros nil))) ! 142: (setq er-fatal 0) ! 143: (setq vps-include nil) ! 144: (setq twa-list nil) ! 145: (setq liszt-eof-forms nil) ! 146: ! 147: ; set up once only g variables ! 148: (setq g-comments nil ! 149: g-current nil ; current function name ! 150: g-funcs nil ! 151: g-lits nil ! 152: g-trueloc nil ! 153: g-tran nil ! 154: g-allf nil ; used in xrefs ! 155: g-reguse '((r5 0 . nil) (r4 0 . nil) (r3 0 . nil) ! 156: (r2 0 . nil) (r7 0 . nil) (r1 0 . nil)) ! 157: g-trancnt 0 ! 158: g-ignorereg nil ! 159: g-litcnt 0) ! 160: (setq g-spec (gensym 'S)) ; flag for special atom ! 161: (setq special nil) ; t if all vrbs are special ! 162: (setq g-functype (gensym) ! 163: g-bindloc (gensym) ! 164: g-localf (gensym) ! 165: g-tranloc (gensym)) ! 166: ! 167: ; declare these special ! 168: ! 169: (sstatus feature complr) ! 170: (d-makespec 't) ; always special ! 171: ! 172: ; process input form ! 173: (setq fl-asm t ; assembler file assembled ! 174: fl-warn t ; print warnings ! 175: fl-verb t ; be verbose ! 176: fl-macl nil ; compile maclisp file ! 177: fl-inter nil ; do interlisp compatablity ! 178: fl-tty nil ; put .s on tty ! 179: fl-comments nil ; put in comments ! 180: fl-profile nil ; profiling ! 181: fl-tran t ; use transfer tables ! 182: fl-vms nil ; vms hacks ! 183: fl-xref nil ; xrefs ! 184: fl-uci nil ; uci lisp compatibility ! 185: ) ! 186: ! 187: (do ((i v-x (cdr i))) ; for each argument ! 188: ((null i)) ! 189: (setq tem (aexplodec (car i))) ! 190: ! 191: (cond ((eq '- (car tem)) ; if switch ! 192: (do ((j (cdr tem) (cdr j))) ! 193: ((null j)) ! 194: (cond ((eq 'S (car j)) (setq fl-asm nil)) ! 195: ((eq 'C (car j)) (setq fl-comments t)) ! 196: ((eq 'm (car j)) (setq fl-macl t)) ! 197: ((eq 'o (car j)) (setq v-ofile (cadr i) ! 198: i (cdr i))) ! 199: ((eq 'w (car j)) (setq fl-warn nil)) ! 200: ((eq 'q (car j)) (setq fl-verb nil)) ! 201: ((eq 'T (car j)) (setq fl-tty t)) ! 202: ((eq 'i (car j)) (setq fl-inter t)) ! 203: ((eq 'p (car j)) (setq fl-profile t)) ! 204: ((eq 'F (car j)) (setq fl-tran nil)) ! 205: ((eq 'v (car j)) (setq fl-vms t)) ! 206: ((eq 'x (car j)) (setq fl-xref t)) ! 207: ((eq 'u (car j)) (setq fl-uci t)) ! 208: (t (comp-gerr "Unknown switch: " ! 209: (car j)))))) ! 210: ((null v-root) ! 211: (setq temr (reverse tem)) ! 212: (cond ((and (eq 'l (car temr)) ! 213: (eq '\. (cadr temr))) ! 214: (setq rootreal nil) ! 215: (setq v-root (apply 'concat (reverse (cddr temr))))) ! 216: (t (setq v-root (car i) ! 217: rootreal t)))) ! 218: ! 219: (t (comp-gerr "Extra input file name: " (car i))))) ! 220: ! 221: ! 222: (cond (fl-vms (setq fl-tran nil))) ; no transfer tables in vms ! 223: ! 224: ; now see what the arguments have left us ! 225: ! 226: (cond ((null v-root) ! 227: (comp-gerr "No file for input")) ! 228: ((or (portp ! 229: (setq vp-ifile ! 230: (car (errset (infile ! 231: (setq v-ifile ! 232: (concat v-root '".l"))) ! 233: nil)))) ! 234: (and rootreal ! 235: (portp ! 236: (setq vp-ifile ! 237: (car (errset ! 238: (infile (setq v-ifile v-root)) ! 239: nil))))))) ! 240: (t (comp-gerr "Couldn't open the source file :" ! 241: (or v-ifile)))) ! 242: ! 243: ! 244: ; determine the name of the .s file ! 245: ; strategy: if fl-asm is t (only assemble) use (v-root).s ! 246: ; else use /tmp/(PID).s ! 247: ; ! 248: ; direct asm to tty temporarily ! 249: (setq v-sfile '"tty") ! 250: (setq vp-sfile nil) ! 251: (If (null fl-tty) then ! 252: (cond (fl-asm (setq v-sfile (concat '"/tmp/jkf" ! 253: (boole 1 65535 ! 254: (syscall 20)) ! 255: '".s"))) ! 256: (t (setq v-sfile (concat v-root '".s")))) ! 257: ! 258: (cond ((not (portp (setq vp-sfile ! 259: (car (errset (outfile v-sfile) ! 260: nil))))) ! 261: (comp-gerr "Couldn't open the .s file: " ! 262: (or v-sfile))))) ! 263: ! 264: ! 265: ; determine the name of the .o file (object file) ! 266: ; strategy: if we aren't supposed to assemble the .s file ! 267: ; don't worry about a name ! 268: ; else if a name is given, use it ! 269: ; else if use (v-root).o ! 270: ; if profiling, use .o ! 271: (cond ((or v-ofile (null fl-asm))) ;ignore ! 272: ((null fl-profile) (setq v-ofile (concat v-root '".o"))) ! 273: (t (setq v-ofile (concat v-root ".o")))) ! 274: ! 275: ; determine the name of the .x file (xref file) ! 276: ; strategy: if fl-xref is true, then use (v-root).x ! 277: ; ! 278: (cond (fl-xref ! 279: (cond ((not ! 280: (portp ! 281: (setq vp-xfile ! 282: (car (errset (outfile (setq v-xfile ! 283: (concat v-root ".x")))))))) ! 284: (comp-gerr "Can't open the .x file" (or v-xfile)))))) ! 285: (cond ((checkfatal) (return 1))) ! 286: ! 287: (setq readtable (makereadtable nil)) ; use new readtable ! 288: ! 289: ! 290: ; if the macsyma flag is set, change the syntax to the ! 291: ; maclisp standard syntax. We must be careful that we ! 292: ; dont clobber any syntax changes made by files preloaded ! 293: ; into the compiler. ! 294: ! 295: (cond (fl-macl (setsyntax '\/ 143) ; 143 = vesc ! 296: ! 297: (cond ((equal 143 (status syntax \\)) ! 298: (setsyntax '\\ 2))) ! 299: ! 300: (setsyntax '\| 138) ; 138 = vdq ! 301: (cond ((equal 198 (status syntax \[)) ! 302: (setsyntax '\[ 2) ! 303: (setsyntax '\] 2))) ! 304: (setq ibase 8.) ! 305: (sstatus uctolc t) ! 306: ! 307: (d-makespec 'ibase) ; to be special ! 308: (d-makespec 'base) ! 309: (d-makespec 'tty) ! 310: ! 311: (errset (cond ((null (getd 'macsyma-env)) ! 312: (fasl '/usr/lib/lisp/machacks))) ! 313: nil)) ! 314: (fl-uci (load "/usr/lib/lisp/ucifnc") ! 315: (cvttoucilisp))) ! 316: ! 317: (cond (fl-inter (putprop '* 'cc-ignore 'fl-exprcc) ;comment ! 318: (remprop '* 'fl-expr) ! 319: )) ! 320: ! 321: (cond ((checkfatal) (return 1))) ; leave if fatal errors ! 322: ! 323: (comp-note "Compilation begins with " compiler-name) ! 324: (comp-note "source: " v-ifile ", result: " ! 325: (cond (fl-asm v-ofile) (t v-sfile))) ! 326: (setq piport vp-ifile) ; set to standard input ! 327: (setq liszt-root-name v-root ! 328: liszt-file-name v-ifile) ! 329: ! 330: ! 331: (If fl-profile then (e-write1 '".globl mcount")) ! 332: loop ! 333: ! 334: (cond ((atom (errset ; list for debugging, ! 335: ; errset for production. ! 336: (do ((i (read piport '<<end-of-file>>) ! 337: (read piport '<<end-of-file>>))) ! 338: ((eq i '<<end-of-file>>) nil) ! 339: (catch (liszt-form i) Comp-error)))) ! 340: (comp-note "Lisp error during compilation") ! 341: (setq piport nil) ! 342: (setq er-fatal (1+ er-fatal)) ! 343: (return 1))) ! 344: ! 345: (close piport) ! 346: ! 347: (cond ((checkfatal) (return 1))) ! 348: ! 349: ; if doing special character stuff (maclisp) reassert ! 350: ; the state ! 351: ! 352: (cond (vps-include ! 353: (comp-note " done include") ! 354: (setq piport (car vps-include)) ! 355: (setq vps-include (cdr vps-include)) ! 356: (go loop))) ! 357: ! 358: (cond (liszt-eof-forms ! 359: (do ((ll liszt-eof-forms (cdr ll))) ! 360: ((null ll)) ! 361: (cond ((atom (errset (liszt-form (car ll)))) ! 362: (comp-note "Lisp error during eof forms") ! 363: (setq piport nil) ! 364: (return 1)))))) ! 365: ! 366: ; reset input base ! 367: (setq ibase 10.) ! 368: (setq readtable (makereadtable t)) ! 369: (d-bindtab) ! 370: ! 371: ! 372: (close vp-sfile) ; close assembler language file ! 373: (comp-note "Compilation complete") ! 374: ! 375: (setq tem (Divide (difference (syscall 13) starttime) 60)) ! 376: (comp-note " Real time: " (car tem) " minutes, " ! 377: (cadr tem) " seconds") ! 378: (setq tem (ptime)) ! 379: (setq temr (Divide (difference (car tem) (car startptime)) ! 380: 3600)) ! 381: (comp-note " CPU time: " (car temr) " minutes, " ! 382: (quotient (cadr temr) 60.0) " seconds") ! 383: (setq temr (Divide (difference (cadr tem) (cadr startptime)) ! 384: 3600)) ! 385: (comp-note " of which " (car temr) " minutes and " ! 386: (quotient (cadr temr) 60.0) ! 387: " seconds were for the " ! 388: (difference $gccount$ startgccount) ! 389: " gcs which were done") ! 390: ! 391: (cond (fl-xref ! 392: (comp-note "Cross reference being generated") ! 393: (print (list 'File v-ifile) vp-xfile) ! 394: (terpr vp-xfile) ! 395: (do ((ii g-allf (cdr ii))) ! 396: ((null ii)) ! 397: (print (car ii) vp-xfile) ! 398: (terpr vp-xfile)) ! 399: (close vp-xfile))) ! 400: ! 401: ! 402: ; the assember we use must generate the new a.out format ! 403: ; with a string table. We will assume that the assembler ! 404: ; is in /usr/lib/lisp/as so that other sites can run ! 405: ; the new assembler without installing the new assembler ! 406: ; as /bin/as ! 407: (cond (fl-asm ; assemble file ! 408: (comp-note "Assembly begins") ! 409: (cond ((not ! 410: (zerop ! 411: (setq tmp ! 412: (apply 'process ! 413: (ncons (concat ! 414: "/usr/lib/lisp/as -o " ! 415: v-ofile ! 416: '" " ! 417: v-sfile)))))) ! 418: (comp-gerr "Assembler detected error, code: " ! 419: tmp) ! 420: (comp-note "Assembler temp file " v-sfile ! 421: " is not unlinked")) ! 422: (t (comp-note "Assembly completed successfully") ! 423: (syscall 10 v-sfile))))) ; unlink tmp file ! 424: ! 425: (setq readtable original-readtable) ! 426: #+monitoring ! 427: (errset (progn (monitor) ; turn off monitoring ! 428: (print 'monitor-off)) ! 429: nil) ! 430: (return 0)))) ! 431: ! 432: (def checkfatal ! 433: (lambda nil ! 434: (cond ((greaterp er-fatal 0) ! 435: (comp-note "Compilation aborted") ! 436: t)))) ! 437: ! 438: ;--- liszt-form - i : form to compile ! 439: ; This compiles one form. ! 440: ; ! 441: (def liszt-form ! 442: (lambda (i) ! 443: (prog (tmp v-x) ! 444: ; macro expand ! 445: loop ! 446: (If (and (dtpr i) (eq 'macro (d-functyp (car i)))) ! 447: then (setq i (apply (car i) i)) ! 448: (go loop)) ! 449: ; now look at what is left ! 450: (cond ((eq (car i) 'def) ; jkf mod ! 451: (cond (fl-verb (print (cadr i)) (terpr)(drain))) ! 452: (d-dodef i)) ! 453: ((eq (car i) 'declare) (funcall 'complr-declare (cdr i))) ! 454: ((eq (car i) 'eval-when) (doevalwhen i)) ! 455: ((and (eq (car i) 'progn) (equal (cadr i) '(quote compile))) ! 456: ((lambda (internal-macros) ; compile macros too ! 457: (mapc 'liszt-form (cddr i))) ! 458: t)) ! 459: ((or (and (eq (car i) 'includef) (setq tmp (eval (cadr i)))) ! 460: (and (eq (car i) 'include ) (setq tmp (cadr i)))) ! 461: (cond ((or (portp (setq v-x ! 462: (car (errset (infile tmp) nil)))) ! 463: (portp (setq v-x ! 464: (car (errset (infile (concat '"/usr/lib/lisp" ! 465: tmp)) ! 466: nil)))) ! 467: (portp (setq v-x ! 468: (car (errset (infile (concat tmp ! 469: '".l")) ! 470: nil))))) ! 471: (setq vps-include (cons piport vps-include)) ! 472: (setq piport v-x) ! 473: (comp-note " INCLUDEing file: " tmp)) ! 474: (t (comp-gerr "Cannot open include file: " tmp)))) ! 475: ((eq (car i) 'comment) nil) ; just ignore comments ! 476: (t (Push g-funcs `(eval ,i))))))) ! 477: ! 478: ;--- d-dodef :: handle the def form ! 479: ; - form : a def form: (def name (type args . body)) ! 480: ; ! 481: (defun d-dodef (form) ! 482: (prog nil ! 483: ! 484: loop ! 485: ! 486: (let ( ((g-fname (g-ftype g-args . body)) (cdr form)) ! 487: (lambdaform (caddr form)) ! 488: (symlab (gensym 'F))) ! 489: (If (or (memq '&rest g-args) ! 490: (memq '&optional g-args) ! 491: (memq '&aux g-args)) ! 492: then (setq form ! 493: `(def ,(cadr form) ,(lambdacvt (cdr lambdaform)))) ! 494: (go loop)) ! 495: (If (null (atom g-fname)) ! 496: then (comp-err "bad function name") ! 497: else (setq g-flocal (get g-fname g-localf)) ! 498: (If (eq g-ftype 'macro) ! 499: then (eval form) ! 500: (If (and (null macros) ! 501: (null internal-macros)) ! 502: then (comp-note " macro will not be compiled") ! 503: (return nil)) ! 504: (Push g-funcs `(macro ,symlab ,g-fname)) ! 505: elseif g-flocal ! 506: then (If (null (or (eq g-ftype 'lambda) ! 507: (eq g-ftype 'nlambda))) ! 508: then (comp-err "bad type for fcn" (or g-ftype))) ! 509: elseif (or (eq g-ftype 'lambda) ! 510: (eq g-ftype 'lexpr)) ! 511: then (Push g-funcs `(lambda ,symlab ,g-fname)) ! 512: elseif (eq g-ftype 'nlambda) ! 513: then (Push g-funcs `(nlambda ,symlab ,g-fname)) ! 514: else (comp-err " bad function type " g-ftype))) ! 515: (setq g-skipcode nil) ;make sure we aren't skipping code ! 516: (forcecomment `(fcn ,g-ftype ,g-fname)) ! 517: (If g-flocal ! 518: then (comp-note "is a local function") ! 519: (e-writel (car g-flocal)) ! 520: else ! 521: (If (null fl-vms) then (e-write2 '".globl" symlab)) ! 522: (e-writel symlab)) ! 523: (setq g-locs nil g-loccnt 0 g-labs nil g-loc 'reg g-cc nil ! 524: g-ret t g-topsym (d-genlab)) ! 525: (If fl-xref then (setq g-refseen (gensym) g-reflst nil)) ! 526: (d-clearreg) ! 527: (Push g-locs (cons 'lambda 0)) ! 528: (setq g-currentargs (length g-args)) ! 529: (mapc '(lambda (x) (Push g-locs nil) (incr g-loccnt)) ! 530: g-args) ! 531: (d-prelude) ; do beginning stuff ! 532: (d-lambbody lambdaform) ; emit code ! 533: (d-fini) ! 534: (If fl-xref then ! 535: (Push g-allf ! 536: (cons g-fname ! 537: (cons (cond (g-flocal (cons g-ftype 'local)) ! 538: (t g-ftype)) ! 539: g-reflst))))))) ! 540: ! 541: ! 542: ;--- d-prelude :: emit code common to beginning of all functions ! 543: ; ! 544: (defun d-prelude nil ! 545: (If g-flocal ! 546: then (e-write3 'movl 'r10 '"-(sp)") ; (faster than pushl) ! 547: (e-write3 'movab `(,(* -4 g-currentargs) r6) 'r10) ! 548: (e-writel g-topsym) ! 549: else ! 550: (e-write2 '".word" '0x5c0) ! 551: (If fl-profile ! 552: then (e-write3 'movab 'mcounts 'r0) ! 553: (e-write2 'jsb 'mcount)) ! 554: (e-write3 'movab 'linker '#.bind-reg) ! 555: (If (eq g-ftype 'lexpr) ! 556: then ! 557: (e-write4 'subl3 '$4 Lbot-reg '"-(sp)") ; set up base for (arg) ! 558: (e-writel g-topsym) ! 559: (e-write3 'movl Np-reg oLbot-reg) ; will stack num of args ! 560: (e-write4 'subl3 Lbot-reg Np-reg 'r0) ; arg cnt again ! 561: (e-write3 'movab '"0x1400(r0)" np-plus) ; stack lispval ! 562: (e-write3 'movl '(0 #.oLbot-reg) '"-(sp)") ; also on runtime stk ! 563: else ! 564: ; set up old lbot register, base register for variable ! 565: ; references ! 566: (e-write3 'movl '#.Lbot-reg '#.oLbot-reg) ! 567: ; make sure the np register points where it should since ! 568: ; the caller might have given too few or too many args ! 569: (e-write3 'movab `(,(* 4 g-currentargs) #.oLbot-reg) ! 570: '#.Np-reg) ! 571: (e-writel g-topsym)))) ! 572: ! 573: ;--- d-fini :: emit code at end of function ! 574: ! 575: (defun d-fini nil ! 576: (If g-flocal then (e-write3 'movl '"(sp)+" 'r10) ! 577: (e-write1 'rsb) ! 578: else (e-return))) ! 579: ! 580: ! 581: ;--- d-bindtab :: emit binder table when all functions compiled ! 582: ; ! 583: (defun d-bindtab nil ! 584: (setq g-skipcode nil) ; make sure this isnt ignored ! 585: (e-writel "bind_org") ! 586: (e-write2 ".set linker_size," (length g-lits)) ! 587: (e-write2 ".set trans_size," (length g-tran)) ! 588: (do ((ll (setq g-funcs (nreverse g-funcs)) (cdr ll))) ! 589: ((null ll)) ! 590: (If (memq (caar ll) '(lambda nlambda macro eval)) ! 591: then (e-write2 '".long" (cdr (assoc (caar ll) ! 592: '((lambda . 0) ! 593: (nlambda . 1) ! 594: (macro . 2) ! 595: (eval . 99))))) ! 596: else (comp-err " bad type in lit list " (car ll)))) ! 597: ! 598: (e-write1 ".long -1") ! 599: (e-write1 '"lit_org:") ! 600: (d-asciiout (nreverse g-lits)) ! 601: (If g-tran then (d-asciiout (nreverse g-tran))) ! 602: (d-asciiout (mapcar '(lambda (x) (If (eq (car x) 'eval) ! 603: then (cadr x) ! 604: else (caddr x))) ! 605: g-funcs)) ! 606: ! 607: (e-write1 '"lit_end:")) ! 608: ! 609: ;--- d-asciiout :: print a list of asciz strings ! 610: ; ! 611: (defun d-asciiout (args) ! 612: (do ((lits args (cdr lits)) ! 613: (form)) ! 614: ((null lits)) ! 615: (setq form (explode (car lits)) ! 616: formsiz (length form)) ! 617: (do ((remsiz formsiz) ! 618: (curform form) ! 619: (thissiz)) ! 620: ((zerop remsiz)) ! 621: (If (greaterp remsiz 60) then (sfilewrite '".ascii \"") ! 622: else (sfilewrite '".asciz \"")) ! 623: (setq thissiz (min 60 remsiz)) ! 624: (do ((count thissiz (1- count))) ! 625: ((zerop count) ! 626: (sfilewrite (concat '\" (ascii 10))) ! 627: (setq remsiz (difference remsiz thissiz))) ! 628: (If (eq ch-newline (car curform)) ! 629: then (sfilewrite '\\012) ! 630: else (If (or (eq '\\ (car curform)) ! 631: (eq '\" (car curform))) ! 632: then (sfilewrite '\\)) ! 633: (sfilewrite (car curform))) ! 634: (setq curform (cdr curform)))))) ! 635: ! 636: ;--- doevalwhen, process evalwhen directive. This is inadequate. ! 637: ; ! 638: (def doevalwhen ! 639: (lambda (v-f) ! 640: (prog (docom dolod) ! 641: (setq docom (memq 'compile (cadr v-f)) ! 642: ! 643: dolod (memq 'load (cadr v-f))) ! 644: (mapc '(lambda (frm) (cond (docom (eval frm))) ! 645: (cond (dolod ! 646: ((lambda (internal-macros) ! 647: (liszt-form frm)) ! 648: t)))) ! 649: (cddr v-f))))) ! 650: ! 651: ! 652: ;---- dodcl - forms declare form ! 653: ; process the declare form given. We evaluate each arg ! 654: ; ! 655: (defun complr-declare fexpr (forms) ! 656: (do ((i forms (cdr i))) ! 657: ((null i)) ! 658: (cond ((and (atom (caar i)) ! 659: (getd (caar i))) ! 660: (eval (car i))) ; if this is a function ! 661: (t (comp-warn "Unknown declare attribute: " (car i)))))) ! 662: ! 663: ;---> handlers for declare forms ! 664: ; ! 665: (def *fexpr ! 666: (nlambda (args) ! 667: (mapc '(lambda (v-a) ! 668: (putprop v-a 'nlambda g-functype)) ! 669: args))) ! 670: ! 671: (def nlambda ! 672: (nlambda (args) ! 673: (mapc '(lambda (v-a) ! 674: (putprop v-a 'nlambda g-functype)) ! 675: args))) ! 676: ! 677: (def special ! 678: (nlambda (v-l) ! 679: (mapc '(lambda (v-a) ! 680: (putprop v-a t g-spec) ) ! 681: v-l) ! 682: t)) ! 683: (def unspecial ! 684: (nlambda (v-l) ! 685: (mapc '(lambda (v-a) ! 686: (putprop v-a nil g-spec)) ! 687: v-l) ! 688: t)) ! 689: ! 690: (def *expr ! 691: (nlambda (args) ! 692: (mapc ! 693: '(lambda (v-a) ! 694: (cond ((atom v-a) (putprop v-a 'lambda g-functype)) ! 695: (t (comp-warn "Bad declare form " v-a ! 696: " in list " args)))) ! 697: args) ! 698: t)) ! 699: ! 700: (def *lexpr ! 701: (nlambda (args) ! 702: (mapc '(lambda (v-a) ! 703: (putprop v-a 'lexpr g-functype)) ! 704: args) ! 705: t)) ; ignore ! 706: ! 707: (def fixnum ! 708: (nlambda (args) ! 709: nil)) ; ignore ! 710: ! 711: (def flonum ! 712: (nlambda (args) ! 713: nil)) ; ignore ! 714: ! 715: (def macros ! 716: (nlambda (args) (setq macros (car args)))) ! 717: ! 718: (def localf ! 719: (nlambda (args) (mapc '(lambda (ar) ! 720: (If (null (get ar g-localf)) ! 721: then (putprop ar ! 722: (cons (d-genlab) -1) ! 723: g-localf))) ! 724: args))) ! 725: ;---> end declare form handlers ! 726: ! 727: ! 728: ! 729: ! 730: ! 731: ! 732: ! 733: ! 734: ! 735: ;--- lambdacvt ! 736: ; converts a lambda expression with &optional, &rest and &aux forms in ! 737: ; the argument list into a lexpr which will do the desired function. ! 738: ; method of operation ! 739: ; the argument list is examined and the following lists are made: ! 740: ; vbs - list of variables to be lambda bound ! 741: ; opl - list of optional forms ! 742: ; vals - list of values to be assigned to the vbs ! 743: ; ! 744: (def lambdacvt ! 745: (lambda (exp) ! 746: (prog (arg vbs vals opl rest opflg restflg narg narg2 narg3 auxflg ! 747: avbs) ! 748: (do ((ll (car exp) (cdr ll)) ! 749: (count 1 (1+ count))) ! 750: ((null ll)) ! 751: (cond ((eq '&rest (car ll)) ! 752: (setq restflg t opflg nil count (1- count))) ! 753: ((eq '&optional (car ll)) ! 754: (setq opflg t count (1- count))) ! 755: ((eq '&aux (car ll)) ! 756: (setq auxflg t ! 757: opflg nil ! 758: restflg nil ! 759: count (1- count))) ! 760: (opflg ! 761: (cond ((atom (setq arg (car ll))) ! 762: (setq opl (cons (cons (ncons arg) count) opl) ! 763: vbs (cons arg vbs) ! 764: vals (cons nil vals))) ! 765: ((cddr arg) ! 766: (setq vbs (cons (car arg) ! 767: (cons (caddr arg) ! 768: vbs)) ! 769: vals (cons nil ! 770: (cons nil vals)) ! 771: opl (cons (cons arg count) opl))) ! 772: (t (setq vbs (cons (car arg) vbs) ! 773: vals (cons nil vals) ! 774: opl (cons (cons arg count) opl))))) ! 775: (restflg ! 776: (setq vbs (cons (car ll) vbs) ! 777: vals (cons nil vals) ! 778: rest (cons (car ll) count))) ! 779: (auxflg ! 780: (setq count (1- count)) ! 781: (cond ((atom (setq arg (car ll))) ! 782: (setq avbs (cons (ncons arg) avbs))) ! 783: (t (setq avbs (cons arg avbs))))) ! 784: (t (setq vbs (cons (car ll) vbs) ! 785: vals (cons `(arg ,count) vals))))) ! 786: (setq narg (gensym)) ! 787: ! 788: (return ! 789: `(lexpr (,narg) ! 790: ((lambda ,(nreverse vbs) ! 791: ,@(mapcar ! 792: '(lambda (arg) ! 793: `(cond ((greaterp ,(cdr arg) ! 794: ,narg) ! 795: ,@(cond ((cadar arg) ! 796: `((setq ,(caar arg) ! 797: ,(cadar arg)))))) ! 798: (t (setq ,(caar arg) (arg ,(cdr arg))) ! 799: ,@(cond ((cddar arg) ! 800: `((setq ,(caddar arg) ! 801: t))))))) ! 802: (nreverse opl)) ! 803: ,@(cond (rest (setq narg2 (gensym) ! 804: narg3 (gensym)) ! 805: `((do ((,narg2 ,narg (1- ,narg2)) ! 806: (,narg3 nil (cons (arg ,narg2) ! 807: ,narg3))) ! 808: ((lessp ,narg2 ,(cdr rest)) ! 809: (setq ,(car rest) ,narg3)))))) ! 810: ,@(cond (auxflg `((let* ,(nreverse avbs) ! 811: ,@(cdr exp)))) ! 812: (t (cdr exp)))) ! 813: ,@(nreverse vals))))))) ! 814: ! 815: ; this routine is copied from ccb.l so we can make it a local function ! 816: ; in both files ! 817: ! 818: ;--- d-genlab :: generate a pseudo label ! 819: ; ! 820: (defun d-genlab nil ! 821: (gensym 'L)) ! 822:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.