home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / compiler / machines / sparc / decls.scm < prev    next >
Encoding:
Text File  |  1999-01-02  |  21.3 KB  |  606 lines

  1. #| -*-Scheme-*-
  2.  
  3. $Id: decls.scm,v 1.4 1999/01/02 06:06:43 cph Exp $
  4.  
  5. Copyright (c) 1988-1999 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. |#
  21.  
  22. ;;;; Compiler File Dependencies
  23.  
  24. (declare (usual-integrations))
  25.  
  26. (define (initialize-package!)
  27.   (add-event-receiver! event:after-restore reset-source-nodes!)
  28.   (reset-source-nodes!))
  29.  
  30. (define (reset-source-nodes!)
  31.   (set! source-filenames '())
  32.   (set! source-hash)
  33.   (set! source-nodes)
  34.   (set! source-nodes/by-rank))
  35.  
  36. (define (maybe-setup-source-nodes!)
  37.   (if (null? source-filenames)
  38.       (setup-source-nodes!)))
  39.  
  40. (define (setup-source-nodes!)
  41.   (let ((filenames
  42.      (mapcan (lambda (subdirectory)
  43.            (map (lambda (pathname)
  44.               (string-append subdirectory
  45.                      "/"
  46.                      (pathname-name pathname)))
  47.             (directory-read
  48.              (string-append subdirectory
  49.                     "/"
  50.                     source-file-expression))))
  51.          '("back" "base" "fggen" "fgopt" "rtlbase" "rtlgen" "rtlopt"
  52.               "machines/sparc"))))
  53.     (if (null? filenames)
  54.     (error "Can't find source files of compiler"))
  55.     (set! source-filenames filenames))
  56.   (set! source-hash (make-string-hash-table))
  57.   (set! source-nodes
  58.     (map (lambda (filename)
  59.            (let ((node (make/source-node filename)))
  60.          (hash-table/put! source-hash filename node)
  61.          node))
  62.          source-filenames))
  63.   (initialize/syntax-dependencies!)
  64.   (initialize/integration-dependencies!)
  65.   (initialize/expansion-dependencies!)
  66.   (source-nodes/rank!))
  67.  
  68. (define source-file-expression "*.scm")
  69. (define source-filenames)
  70. (define source-hash)
  71. (define source-nodes)
  72. (define source-nodes/by-rank)
  73.  
  74. (define (filename/append directory . names)
  75.   (map (lambda (name) (string-append directory "/" name)) names))
  76.  
  77. (define-structure (source-node
  78.            (conc-name source-node/)
  79.            (constructor make/source-node (filename)))
  80.   (filename false read-only true)
  81.   (pathname (string->pathname filename) read-only true)
  82.   (forward-links '())
  83.   (backward-links '())
  84.   (forward-closure '())
  85.   (backward-closure '())
  86.   (dependencies '())
  87.   (dependents '())
  88.   (rank false)
  89.   (syntax-table false)
  90.   (declarations '())
  91.   (modification-time false))
  92.  
  93. (define (filename->source-node filename)
  94.   (let ((node (hash-table/get source-hash filename #f)))
  95.     (if (not node)
  96.     (error "Unknown source file:" filename))
  97.     node))
  98.  
  99. (define (source-node/circular? node)
  100.   (memq node (source-node/backward-closure node)))
  101.  
  102. (define (source-node/link! node dependency)
  103.   (if (not (memq dependency (source-node/backward-links node)))
  104.       (begin
  105.     (set-source-node/backward-links!
  106.      node
  107.      (cons dependency (source-node/backward-links node)))
  108.     (set-source-node/forward-links!
  109.      dependency
  110.      (cons node (source-node/forward-links dependency)))
  111.     (source-node/close! node dependency))))
  112.  
  113. (define (source-node/close! node dependency)
  114.   (if (not (memq dependency (source-node/backward-closure node)))
  115.       (begin
  116.     (set-source-node/backward-closure!
  117.      node
  118.      (cons dependency (source-node/backward-closure node)))
  119.     (set-source-node/forward-closure!
  120.      dependency
  121.      (cons node (source-node/forward-closure dependency)))
  122.     (for-each (lambda (dependency)
  123.             (source-node/close! node dependency))
  124.           (source-node/backward-closure dependency))
  125.     (for-each (lambda (node)
  126.             (source-node/close! node dependency))
  127.           (source-node/forward-closure node)))))
  128.  
  129. ;;;; Rank
  130.  
  131. (define (source-nodes/rank!)
  132.   (compute-dependencies! source-nodes)
  133.   (compute-ranks! source-nodes)
  134.   (set! source-nodes/by-rank (source-nodes/sort-by-rank source-nodes)))
  135.  
  136. (define (compute-dependencies! nodes)
  137.   (for-each (lambda (node)
  138.           (set-source-node/dependencies!
  139.            node
  140.            (list-transform-negative (source-node/backward-closure node)
  141.          (lambda (node*)
  142.            (memq node (source-node/backward-closure node*)))))
  143.           (set-source-node/dependents!
  144.            node
  145.            (list-transform-negative (source-node/forward-closure node)
  146.          (lambda (node*)
  147.            (memq node (source-node/forward-closure node*))))))
  148.         nodes))
  149.  
  150. (define (compute-ranks! nodes)
  151.   (let loop ((nodes nodes) (unranked-nodes '()))
  152.     (if (null? nodes)
  153.     (if (not (null? unranked-nodes))
  154.         (loop unranked-nodes '()))
  155.     (loop (cdr nodes)
  156.           (let ((node (car nodes)))
  157.         (let ((rank (source-node/rank* node)))
  158.           (if rank
  159.               (begin
  160.             (set-source-node/rank! node rank)
  161.             unranked-nodes)
  162.               (cons node unranked-nodes))))))))
  163.  
  164. (define (source-node/rank* node)
  165.   (let loop ((nodes (source-node/dependencies node)) (rank -1))
  166.     (if (null? nodes)
  167.     (1+ rank)
  168.     (let ((rank* (source-node/rank (car nodes))))
  169.       (and rank*
  170.            (loop (cdr nodes) (max rank rank*)))))))
  171.  
  172. (define (source-nodes/sort-by-rank nodes)
  173.   (sort nodes (lambda (x y) (< (source-node/rank x) (source-node/rank y)))))
  174.  
  175. ;;;; File Syntaxer
  176.  
  177. (define (syntax-files!)
  178.   (maybe-setup-source-nodes!)
  179.   (for-each
  180.    (lambda (node)
  181.      (let ((modification-time
  182.         (let ((source (modification-time node "scm"))
  183.           (binary (modification-time node "bin")))
  184.           (if (not source)
  185.           (error "Missing source file" (source-node/filename node)))
  186.           (and binary (< source binary) binary))))
  187.      (set-source-node/modification-time! node modification-time)
  188.      (if (not modification-time)
  189.      (begin (write-string "\nSource file newer than binary: ")
  190.         (write (source-node/filename node))))))
  191.    source-nodes)
  192.   (if compiler:enable-integration-declarations?
  193.       (begin
  194.     (for-each
  195.      (lambda (node)
  196.        (let ((time (source-node/modification-time node)))
  197.          (if (and time
  198.               (there-exists? (source-node/dependencies node)
  199.             (lambda (node*)
  200.               (let ((newer?
  201.                  (let ((time*
  202.                     (source-node/modification-time node*)))
  203.                    (or (not time*)
  204.                        (> time* time)))))
  205.                 (if newer?
  206.                 (begin
  207.                   (write-string "\nBinary file ")
  208.                   (write (source-node/filename node))
  209.                   (write-string " newer than dependency ")
  210.                   (write (source-node/filename node*))))
  211.                 newer?))))
  212.          (set-source-node/modification-time! node false))))
  213.      source-nodes)
  214.     (for-each
  215.      (lambda (node)
  216.        (if (not (source-node/modification-time node))
  217.            (for-each (lambda (node*)
  218.                (if (source-node/modification-time node*)
  219.                    (begin
  220.                  (write-string "\nBinary file ")
  221.                  (write (source-node/filename node*))
  222.                  (write-string " depends on ")
  223.                  (write (source-node/filename node))))
  224.                (set-source-node/modification-time! node* false))
  225.              (source-node/forward-closure node))))
  226.      source-nodes)))
  227.   (for-each (lambda (node)
  228.           (if (not (source-node/modification-time node))
  229.           (pathname-delete!
  230.            (pathname-new-type (source-node/pathname node) "ext"))))
  231.         source-nodes/by-rank)
  232.   (write-string "\n\nBegin pass 1:")
  233.   (for-each (lambda (node)
  234.           (if (not (source-node/modification-time node))
  235.           (source-node/syntax! node)))
  236.         source-nodes/by-rank)
  237.   (if (there-exists? source-nodes/by-rank
  238.     (lambda (node)
  239.       (and (not (source-node/modification-time node))
  240.            (source-node/circular? node))))
  241.       (begin
  242.     (write-string "\n\nBegin pass 2:")
  243.     (for-each (lambda (node)
  244.             (if (not (source-node/modification-time node))
  245.             (if (source-node/circular? node)
  246.                 (source-node/syntax! node)
  247.                 (source-node/touch! node))))
  248.           source-nodes/by-rank))))
  249.  
  250. (define (source-node/touch! node)
  251.   (with-values
  252.       (lambda ()
  253.     (sf/pathname-defaulting (source-node/pathname node) "" false))
  254.     (lambda (input-pathname bin-pathname spec-pathname)
  255.       input-pathname
  256.       (pathname-touch! bin-pathname)
  257.       (pathname-touch! (pathname-new-type bin-pathname "ext"))
  258.       (if spec-pathname (pathname-touch! spec-pathname)))))
  259.  
  260. (define (pathname-touch! pathname)
  261.   (if (file-exists? pathname)
  262.       (begin
  263.     (write-string "\nTouch file: ")
  264.     (write (pathname->string pathname))
  265.     (file-touch pathname))))
  266.  
  267. (define (pathname-delete! pathname)
  268.   (if (file-exists? pathname)
  269.       (begin
  270.     (write-string "\nDelete file: ")
  271.     (write (pathname->string pathname))
  272.     (delete-file pathname))))
  273.  
  274. (define (sc filename)
  275.   (maybe-setup-source-nodes!)
  276.   (source-node/syntax! (filename->source-node filename)))
  277.  
  278. (define (source-node/syntax! node)
  279.   (with-values
  280.       (lambda ()
  281.     (sf/pathname-defaulting (source-node/pathname node) "" false))
  282.     (lambda (input-pathname bin-pathname spec-pathname)
  283.       (sf/internal
  284.        input-pathname bin-pathname spec-pathname
  285.        (source-node/syntax-table node)
  286.        ((if compiler:enable-integration-declarations?
  287.         identity-procedure
  288.         (lambda (declarations)
  289.           (list-transform-negative declarations
  290.         integration-declaration?)))
  291.     ((if compiler:enable-expansion-declarations?
  292.          identity-procedure
  293.          (lambda (declarations)
  294.            (list-transform-negative declarations
  295.          expansion-declaration?)))
  296.      (source-node/declarations node)))))))
  297.  
  298. (define-integrable (modification-time node type)
  299.   (file-modification-time
  300.    (pathname-new-type (source-node/pathname node) type)))
  301.  
  302. ;;;; Syntax dependencies
  303.  
  304. (define (initialize/syntax-dependencies!)
  305.   (let ((file-dependency/syntax/join
  306.      (lambda (filenames syntax-table)
  307.        (for-each (lambda (filename)
  308.                (set-source-node/syntax-table!
  309.             (filename->source-node filename)
  310.             syntax-table))
  311.              filenames))))
  312.     (file-dependency/syntax/join
  313.      (append (filename/append "base"
  314.                   "blocks" "cfg1" "cfg2" "cfg3" "constr"
  315.                   "contin" "crstop" "ctypes" "debug" "enumer"
  316.                   "infnew" "lvalue" "object" "pmerly" "proced"
  317.                   "refctx" "rvalue" "scode" "sets" "subprb"
  318.                   "switch" "toplev" "utils")
  319.          (filename/append "back"
  320.                   "asmmac" "bittop" "bitutl" "insseq" "lapgn1"
  321.                   "lapgn2" "lapgn3" "linear" "regmap" "symtab"
  322.                   "syntax")
  323.          (filename/append "machines/sparc"
  324.                   "insmac" "lapopt" "machin" "rulrew" "rgspcm")
  325.          (filename/append "fggen"
  326.                   "declar" "fggen" "canon")
  327.          (filename/append "fgopt"
  328.                   "blktyp" "closan" "conect" "contan" "delint"
  329.                   "desenv" "envopt" "folcon" "offset" "operan"
  330.                   "order" "outer" "param" "reord" "reteqv" "reuse"
  331.                   "sideff" "simapp" "simple" "subfre" "varind")
  332.          (filename/append "rtlbase"
  333.                   "regset" "rgraph" "rtlcfg" "rtlcon" "rtlexp"
  334.                   "rtline" "rtlobj" "rtlreg" "rtlty1" "rtlty2"
  335.                   "valclass")
  336.          (filename/append "rtlgen"
  337.                   "fndblk" "fndvar" "opncod" "rgcomb" "rgproc"
  338.                   "rgretn" "rgrval" "rgstmt" "rtlgen")
  339.          (filename/append "rtlopt"
  340.                   "ralloc" "rcompr" "rcse1" "rcse2" "rcseep"
  341.                   "rcseht" "rcserq" "rcsesr" "rdebug" "rdflow"
  342.                   "rerite" "rinvex" "rlife" "rtlcsm"))
  343.      compiler-syntax-table)
  344.     (file-dependency/syntax/join
  345.      (filename/append "machines/sparc"
  346.               "lapgen"
  347.               "rules1" "rules2" "rules3" "rules4" "rulfix" "rulflo")
  348.      lap-generator-syntax-table)
  349.     (file-dependency/syntax/join
  350.      (filename/append "machines/sparc"
  351.               "instr1" "instr2a" "instr2b" "instr3")
  352.      assembler-syntax-table)))
  353.  
  354. ;;;; Integration Dependencies
  355.  
  356. (define (initialize/integration-dependencies!)
  357.  
  358.   (define (add-declaration! declaration filenames)
  359.     (for-each (lambda (filenames)
  360.         (let ((node (filename->source-node filenames)))
  361.           (set-source-node/declarations!
  362.            node
  363.            (cons declaration
  364.              (source-node/declarations node)))))
  365.           filenames))
  366.  
  367.   (let* ((front-end-base
  368.       (filename/append "base"
  369.                "blocks" "cfg1" "cfg2" "cfg3"
  370.                "contin" "ctypes" "enumer" "lvalue"
  371.                "object" "proced" "rvalue"
  372.                "scode" "subprb" "utils"))
  373.      (sparc-base
  374.       (filename/append "machines/sparc" "machin"))
  375.      (rtl-base
  376.       (filename/append "rtlbase"
  377.                "rgraph" "rtlcfg" "rtlobj" "rtlreg" "rtlty1"
  378.                "rtlty2"))
  379.      (cse-base
  380.       (filename/append "rtlopt"
  381.                "rcse1" "rcseht" "rcserq" "rcsesr"))
  382.      (cse-all
  383.       (append (filename/append "rtlopt"
  384.                    "rcse2" "rcseep")
  385.           cse-base))
  386.      (instruction-base
  387.       (filename/append "machines/sparc" "assmd" "machin"))
  388.      (lapgen-base
  389.       (append (filename/append "back" "lapgn3" "regmap")
  390.           (filename/append "machines/sparc" "lapgen")))
  391.      (assembler-base
  392.       (append (filename/append "back" "symtab")
  393.           (filename/append "machines/sparc" "instr1")))
  394.      (lapgen-body
  395.       (append
  396.        (filename/append "back" "lapgn1" "lapgn2" "syntax")
  397.        (filename/append "machines/sparc"
  398.                 "rules1" "rules2" "rules3" "rules4"
  399.                 "rulfix" "rulflo")))
  400.      (assembler-body
  401.       (append
  402.        (filename/append "back" "bittop")
  403.        (filename/append "machines/sparc"
  404.                 "instr1" "instr2a" "instr2b" "instr3"))))
  405.  
  406.     (define (file-dependency/integration/join filenames dependencies)
  407.       (for-each (lambda (filename)
  408.           (file-dependency/integration/make filename dependencies))
  409.         filenames))
  410.  
  411.     (define (file-dependency/integration/make filename dependencies)
  412.       (let ((node (filename->source-node filename)))
  413.     (for-each (lambda (dependency)
  414.             (let ((node* (filename->source-node dependency)))
  415.               (if (not (eq? node node*))
  416.               (source-node/link! node node*))))
  417.           dependencies)))
  418.  
  419.     (define (define-integration-dependencies directory name directory* . names)
  420.       (file-dependency/integration/make
  421.        (string-append directory "/" name)
  422.        (apply filename/append directory* names)))
  423.  
  424.     (define-integration-dependencies "base" "object" "base" "enumer")
  425.     (define-integration-dependencies "base" "enumer" "base" "object")
  426.     (define-integration-dependencies "base" "utils" "base" "scode")
  427.     (define-integration-dependencies "base" "cfg1" "base" "object")
  428.     (define-integration-dependencies "base" "cfg2" "base"
  429.       "cfg1" "cfg3" "object")
  430.     (define-integration-dependencies "base" "cfg3" "base" "cfg1" "cfg2")
  431.     (define-integration-dependencies "base" "ctypes" "base"
  432.       "blocks" "cfg1" "cfg2" "cfg3" "contin" "lvalue" "object" "subprb")
  433.     (define-integration-dependencies "base" "rvalue" "base"
  434.       "blocks" "cfg1" "cfg2" "cfg3" "enumer" "lvalue" "object" "utils")
  435.     (define-integration-dependencies "base" "lvalue" "base"
  436.       "blocks" "object" "proced" "rvalue" "utils")
  437.     (define-integration-dependencies "base" "blocks" "base"
  438.       "enumer" "lvalue" "object" "proced" "rvalue" "scode")
  439.     (define-integration-dependencies "base" "proced" "base"
  440.       "blocks" "cfg1" "cfg2" "cfg3" "contin" "enumer" "lvalue" "object"
  441.       "rvalue" "utils")
  442.     (define-integration-dependencies "base" "contin" "base"
  443.       "blocks" "cfg3" "ctypes")
  444.     (define-integration-dependencies "base" "subprb" "base"
  445.       "cfg3" "contin" "enumer" "object" "proced")
  446.  
  447.     (define-integration-dependencies "machines/sparc" "machin" "rtlbase"
  448.       "rtlreg" "rtlty1" "rtlty2")
  449.  
  450.     (define-integration-dependencies "rtlbase" "rgraph" "base" "cfg1" "cfg2")
  451.     (define-integration-dependencies "rtlbase" "rgraph" "machines/sparc"
  452.       "machin")
  453.     (define-integration-dependencies "rtlbase" "rtlcfg" "base"
  454.       "cfg1" "cfg2" "cfg3")
  455.     (define-integration-dependencies "rtlbase" "rtlcon" "base" "cfg3" "utils")
  456.     (define-integration-dependencies "rtlbase" "rtlcon" "machines/sparc"
  457.       "machin")
  458.     (define-integration-dependencies "rtlbase" "rtlexp" "rtlbase"
  459.       "rtlreg" "rtlty1")
  460.     (define-integration-dependencies "rtlbase" "rtline" "base" "cfg1" "cfg2")
  461.     (define-integration-dependencies "rtlbase" "rtline" "rtlbase"
  462.       "rtlcfg" "rtlty2")
  463.     (define-integration-dependencies "rtlbase" "rtlobj" "base"
  464.       "cfg1" "object" "utils")
  465.     (define-integration-dependencies "rtlbase" "rtlreg" "machines/sparc"
  466.       "machin")
  467.     (define-integration-dependencies "rtlbase" "rtlreg" "rtlbase"
  468.       "rgraph" "rtlty1")
  469.     (define-integration-dependencies "rtlbase" "rtlty1" "rtlbase" "rtlcfg")
  470.     (define-integration-dependencies "rtlbase" "rtlty2" "base" "scode")
  471.     (define-integration-dependencies "rtlbase" "rtlty2" "machines/sparc"
  472.       "machin")
  473.     (define-integration-dependencies "rtlbase" "rtlty2" "rtlbase" "rtlty1")
  474.  
  475.     (file-dependency/integration/join
  476.      (append
  477.       (filename/append "base" "refctx")
  478.       (filename/append "fggen"
  479.                "declar" "fggen") ; "canon" needs no integrations
  480.       (filename/append "fgopt"
  481.                "blktyp" "closan" "conect" "contan" "delint" "desenv"
  482.                "envopt" "folcon" "offset" "operan" "order" "param"
  483.                "outer" "reuse" "reteqv" "sideff" "simapp" "simple"
  484.                "subfre" "varind"))
  485.      (append sparc-base front-end-base))
  486.  
  487.     (define-integration-dependencies "fgopt" "reuse" "fgopt" "reord")
  488.  
  489.     (file-dependency/integration/join
  490.      (filename/append "rtlgen"
  491.               "fndblk" "fndvar" "opncod" "rgcomb" "rgproc" "rgretn"
  492.               "rgrval" "rgstmt" "rtlgen")
  493.      (append sparc-base front-end-base rtl-base))
  494.  
  495.     (file-dependency/integration/join
  496.      (append cse-all
  497.          (filename/append "rtlopt" "ralloc" "rcompr" "rdebug" "rdflow"
  498.                   "rerite" "rinvex" "rlife" "rtlcsm")
  499.          (filename/append "machines/sparc" "rulrew"))
  500.      (append sparc-base rtl-base))
  501.  
  502.     (file-dependency/integration/join cse-all cse-base)
  503.  
  504.     (file-dependency/integration/join
  505.      (filename/append "rtlopt" "ralloc" "rcompr" "rdebug" "rlife")
  506.      (filename/append "rtlbase" "regset"))
  507.  
  508.     (file-dependency/integration/join
  509.      (filename/append "rtlopt" "rcseht" "rcserq")
  510.      (filename/append "base" "object"))
  511.  
  512.     (define-integration-dependencies "rtlopt" "rlife"  "base" "cfg2")
  513.  
  514.     (let ((dependents
  515.        (append instruction-base
  516.            lapgen-base
  517.            lapgen-body
  518.            assembler-base
  519.            assembler-body
  520.            (filename/append "back" "linear" "syerly"))))
  521.       (add-declaration! '(USUAL-DEFINITION (SET EXPT)) dependents)
  522.       (file-dependency/integration/join dependents instruction-base))
  523.  
  524.     (file-dependency/integration/join (append lapgen-base lapgen-body)
  525.                       lapgen-base)
  526.  
  527.     (file-dependency/integration/join (append assembler-base assembler-body)
  528.                       assembler-base)
  529.  
  530.     (define-integration-dependencies "back" "lapgn1" "base"
  531.       "cfg1" "cfg2" "utils")
  532.     (define-integration-dependencies "back" "lapgn1" "rtlbase"
  533.       "rgraph" "rtlcfg")
  534.     (define-integration-dependencies "back" "lapgn2" "rtlbase" "rtlreg")
  535.     (define-integration-dependencies "back" "lapgn3" "rtlbase" "rtlcfg")
  536.     (define-integration-dependencies "back" "linear" "base" "cfg1" "cfg2")
  537.     (define-integration-dependencies "back" "linear" "rtlbase" "rtlcfg")
  538.     (define-integration-dependencies "back" "mermap" "back" "regmap")
  539.     (define-integration-dependencies "back" "regmap" "base" "utils")
  540.     (define-integration-dependencies "back" "symtab" "base" "utils"))
  541.  
  542.   (for-each (lambda (node)
  543.           (let ((links (source-node/backward-links node)))
  544.         (if (not (null? links))
  545.             (set-source-node/declarations!
  546.              node
  547.              (cons (make-integration-declaration
  548.                 (source-node/pathname node)
  549.                 (map source-node/pathname links))
  550.                (source-node/declarations node))))))
  551.         source-nodes))
  552.  
  553. (define (make-integration-declaration pathname integration-dependencies)
  554.   `(INTEGRATE-EXTERNAL
  555.     ,@(map (let ((default
  556.           (make-pathname
  557.            false
  558.            false
  559.            (make-list (length (pathname-directory pathname)) 'UP)
  560.            false
  561.            false
  562.            false)))
  563.          (lambda (pathname)
  564.            (merge-pathnames pathname default)))
  565.        integration-dependencies)))
  566.  
  567. (define-integrable (integration-declaration? declaration)
  568.   (eq? (car declaration) 'INTEGRATE-EXTERNAL))
  569.  
  570. ;;;; Expansion Dependencies
  571.  
  572. (define (initialize/expansion-dependencies!)
  573.   (let ((file-dependency/expansion/join
  574.      (lambda (filenames expansions)
  575.        (for-each (lambda (filename)
  576.                (let ((node (filename->source-node filename)))
  577.              (set-source-node/declarations!
  578.               node
  579.               (cons (make-expansion-declaration expansions)
  580.                 (source-node/declarations node)))))
  581.              filenames))))
  582.     (file-dependency/expansion/join
  583.      (filename/append "machines/sparc"
  584.               "lapgen" "rules1" "rules2" "rules3" "rules4"
  585.               "rulfix" "rulflo")
  586.      (map (lambda (entry)
  587.         `(,(car entry)
  588.           (PACKAGE/REFERENCE (FIND-PACKAGE '(COMPILER LAP-SYNTAXER))
  589.                  ',(cadr entry))))
  590.       '((LAP:SYNTAX-INSTRUCTION LAP:SYNTAX-INSTRUCTION-EXPANDER)
  591.         (INSTRUCTION->INSTRUCTION-SEQUENCE
  592.          INSTRUCTION->INSTRUCTION-SEQUENCE-EXPANDER)
  593.         (SYNTAX-EVALUATION SYNTAX-EVALUATION-EXPANDER)
  594.         (CONS-SYNTAX CONS-SYNTAX-EXPANDER)
  595.         (OPTIMIZE-GROUP-EARLY OPTIMIZE-GROUP-EXPANDER)
  596.         (EA-KEYWORD-EARLY EA-KEYWORD-EXPANDER)
  597.         (EA-MODE-EARLY EA-MODE-EXPANDER)
  598.         (EA-REGISTER-EARLY EA-REGISTER-EXPANDER)
  599.         (EA-EXTENSION-EARLY EA-EXTENSION-EXPANDER)
  600.         (EA-CATEGORIES-EARLY EA-CATEGORIES-EXPANDER))))))
  601.  
  602. (define-integrable (make-expansion-declaration expansions)
  603.   `(EXPAND-OPERATOR ,@expansions))
  604.  
  605. (define-integrable (expansion-declaration? declaration)
  606.   (eq? (car declaration) 'EXPAND-OPERATOR))