First checkin for runtime system version 14.
authorChris Hanson <org/chris-hanson/cph>
Tue, 14 Jun 1988 08:55:55 +0000 (08:55 +0000)
committerChris Hanson <org/chris-hanson/cph>
Tue, 14 Jun 1988 08:55:55 +0000 (08:55 +0000)
v7/src/compiler/machines/bobcat/decls.scm

index c924e38c095a4a3f7a88c2dd49e1c0b973cf0d28..e7762fcb646f4ef3403f7a1e7bf4812515d1c14f 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/decls.scm,v 4.4 1988/04/15 02:08:28 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/decls.scm,v 4.5 1988/06/14 08:55:55 cph Exp $
 
 Copyright (c) 1988 Massachusetts Institute of Technology
 
@@ -36,53 +36,70 @@ MIT in each case. |#
 
 (declare (usual-integrations))
 \f
+(define (initialize-package!)
+  (set! source-filenames
+       (mapcan (lambda (subdirectory)
+                 (map (lambda (pathname)
+                        (string-append subdirectory
+                                       "/"
+                                       (pathname-name pathname)))
+                      (directory-read
+                       (string-append subdirectory
+                                      "/"
+                                      source-file-expression))))
+               '("back" "base" "fggen" "fgopt" "rtlbase" "rtlgen" "rtlopt"
+                        "machines/bobcat")))
+  (set! source-hash
+       (make/hash-table
+        101
+        string-hash-mod
+        (lambda (filename source-node)
+          (string=? filename (source-node/filename source-node)))
+        make/source-node))
+  (set! source-nodes
+       (map (lambda (filename)
+              (hash-table/intern! source-hash
+                                  filename
+                                  identity-procedure
+                                  identity-procedure))
+            source-filenames))
+  (initialize/syntax-dependencies!)
+  (initialize/integration-dependencies!)
+  (initialize/expansion-dependencies!)
+  (source-nodes/rank!))
+
+(define source-file-expression "*.bin")
+(define source-filenames)
+(define source-hash)
+(define source-nodes)
+(define source-nodes/by-rank)
+(define source-nodes/circular-dependencies)
+
+(define (filename/append directory . names)
+  (map (lambda (name) (string-append directory "/" name)) names))
+\f
 (define-structure (source-node
                   (conc-name source-node/)
                   (constructor make/source-node (filename)))
   (filename false read-only true)
+  (pathname (string->pathname filename) read-only true)
   (forward-links '())
   (backward-links '())
   (forward-closure '())
   (backward-closure '())
   (dependencies '())
-  (rank false))
-
-(define source-filenames
-  (let ((load-env (the-environment)))
-    (mapcan (lambda (subdirectory)
-             (map (lambda (pathname)
-                    (string-append subdirectory "/" (pathname-name pathname)))
-                  (directory-read
-                   (string-append
-                    subdirectory
-                    (if (lexical-unbound? load-env
-                                          'SOURCE-FILE-EXPRESSION)
-                        "/*.bin"
-                        source-file-expression)))))
-           '("back" "base" "fggen" "fgopt" "rtlbase" "rtlgen" "rtlopt"
-                    "machines/bobcat"))))
-
-(define source-hash
-  (make/hash-table 101
-                  string-hash-mod
-                  (lambda (filename source-node)
-                    (string=? filename (source-node/filename source-node)))
-                  make/source-node))
-
-(define source-nodes
-  (map (lambda (filename)
-        (hash-table/intern! source-hash
-                            filename
-                            identity-procedure
-                            identity-procedure))
-       source-filenames))
+  (dependents '())
+  (rank false)
+  (syntax-table false)
+  (declarations '())
+  (modification-time false))
 
 (define (filename->source-node filename)
   (hash-table/lookup source-hash
                     filename
                     identity-procedure
                     (lambda () (error "Unknown source file" filename))))
-\f
+
 (define (source-node/link! node dependency)
   (if (not (memq dependency (source-node/backward-links node)))
       (begin
@@ -110,23 +127,16 @@ MIT in each case. |#
                    (source-node/close! node dependency))
                  (source-node/forward-closure node)))))
 \f
-(define (source-files-by-rank)
-  (source-nodes/rank! source-nodes)
-  (map source-node/filename (source-nodes/sort-by-rank source-nodes)))
-
-(define (source-files-with-circular-dependencies)
-  (map source-node/filename
-       (list-transform-positive source-nodes
-        (lambda (node)
-          (memq node (source-node/backward-closure node))))))
+;;;; Rank
 
-(define source-nodes/rank!)
-(let ()
-
-(set! source-nodes/rank!
-  (lambda (nodes)
-    (compute-dependencies! nodes)
-    (compute-ranks! nodes)))
+(define (source-nodes/rank!)
+  (compute-dependencies! source-nodes)
+  (compute-ranks! source-nodes)
+  (set! source-nodes/by-rank (source-nodes/sort-by-rank source-nodes))
+  (set! source-nodes/circular-dependencies
+       (list-transform-positive source-nodes/by-rank
+         (lambda (node)
+           (memq node (source-node/backward-closure node))))))
 
 (define (compute-dependencies! nodes)
   (for-each (lambda (node)
@@ -134,7 +144,12 @@ MIT in each case. |#
               node
               (list-transform-negative (source-node/backward-closure node)
                 (lambda (node*)
-                  (memq node (source-node/backward-closure node*))))))
+                  (memq node (source-node/backward-closure node*)))))
+             (set-source-node/dependents!
+              node
+              (list-transform-negative (source-node/forward-closure node)
+                (lambda (node*)
+                  (memq node (source-node/forward-closure node*))))))
            nodes))
 
 (define (compute-ranks! nodes)
@@ -159,266 +174,337 @@ MIT in each case. |#
          (and rank*
               (loop (cdr nodes) (max rank rank*)))))))
 
-)
-
 (define (source-nodes/sort-by-rank nodes)
   (sort nodes (lambda (x y) (< (source-node/rank x) (source-node/rank y)))))
 \f
-(define (file-dependency/syntax/join filenames dependency)
-  (for-each (lambda (filename)
-             (sf/set-file-syntax-table! filename dependency))
-           filenames))
-
-(define (define-integration-dependencies directory name directory* . names)
-  (file-dependency/integration/make (string-append directory "/" name)
-                                   (apply filename/append directory* names)))
-
-(define (file-dependency/integration/join filenames dependencies)
-  (for-each (lambda (filename)
-             (file-dependency/integration/make filename dependencies))
-           filenames))
-
-(define (file-dependency/integration/make filename dependencies)
-  (let ((node (filename->source-node filename)))
-    (for-each (lambda (dependency)
-               (let ((node* (filename->source-node dependency)))
-                 (if (not (eq? node node*))
-                     (source-node/link! node node*))))
-             dependencies)))
-
-(define (finish-integration-dependencies!)
+;;;; File Syntaxer
+
+(define (syntax-files!)
+  (for-each
+   (lambda (node)
+     (set-source-node/modification-time!
+      node
+      (let ((source (modification-time node "scm"))
+           (binary (modification-time node "bin")))
+       (if (not source)
+           (error "Missing source file" (source-node/filename node)))
+       (and binary (< source binary) binary))))
+   source-nodes)
   (if compiler:enable-integration-declarations?
-      (for-each (lambda (node)
-                 (let ((links (source-node/backward-links node)))
-                   (if (not (null? links))
-                       (sf/add-file-declarations!
-                        (source-node/filename node)
-                        `((INTEGRATE-EXTERNAL
-                           ,@(map (lambda (node*)
-                                    (filename->absolute-pathname
-                                     (source-node/filename node*)))
-                                  links)))))))
-               source-nodes)))
-
-(define (file-dependency/expansion/join filenames expansions)
-  (if compiler:enable-expansion-declarations?
-      (for-each (lambda (filename)
-                 (sf/add-file-declarations!
-                  filename
-                  `((EXPAND-OPERATOR ,@expansions))))
-               filenames)))
-
-(define (filename/append directory . names)
-  (map (lambda (name) (string-append directory "/" name)) names))
-
-(define (filename->absolute-pathname filename)
-  (pathname->absolute-pathname (->pathname filename)))
+      (begin
+       (for-each
+        (lambda (node)
+          (let ((time (source-node/modification-time node)))
+            (if (and time
+                     (there-exists? (source-node/dependencies node)
+                       (lambda (node)
+                         (let ((time* (source-node/modification-time node)))
+                           (or (not time*)
+                               (> time* time))))))
+                (set-source-node/modification-time! node false))))
+        source-nodes)
+       (for-each
+        (lambda (node)
+          (if (not (source-node/modification-time node))
+              (for-each (lambda (node)
+                          (set-source-node/modification-time! node false))
+                        (source-node/dependents node))))
+        source-nodes)))
+  (for-each source-node/syntax! source-nodes/circular-dependencies)
+  (for-each source-node/syntax! source-nodes/by-rank))
+
+(define (source-node/syntax! node)
+  (if (not (source-node/modification-time node))
+      (with-values
+         (lambda ()
+           (sf/pathname-defaulting (source-node/pathname node) "" false))
+       (lambda (input-pathname bin-pathname spec-pathname)
+         (sf/internal
+          input-pathname bin-pathname spec-pathname
+          (source-node/syntax-table node)
+          ((if compiler:enable-integration-declarations?
+               identity-procedure
+               (lambda (declarations)
+                 (list-transform-negative declarations
+                   integration-declaration?)))
+           ((if compiler:enable-expansion-declarations?
+                identity-procedure
+                (lambda (declarations)
+                  (list-transform-negative declarations
+                    expansion-declaration?)))
+            (source-node/declarations node))))))))
+
+(define-integrable (modification-time node type)
+  (file-modification-time
+   (pathname-new-type (source-node/pathname node) type)))
 \f
 ;;;; Syntax dependencies
 
-(file-dependency/syntax/join
- (append (filename/append "base"
+(define (initialize/syntax-dependencies!)
+  (let ((file-dependency/syntax/join
+        (lambda (filenames syntax-table)
+          (for-each (lambda (filename)
+                      (set-source-node/syntax-table!
+                       (filename->source-node filename)
+                       syntax-table))
+                    filenames))))
+    (file-dependency/syntax/join
+     (append (filename/append "base"
+                             "blocks" "cfg1" "cfg2" "cfg3" "contin" "ctypes"
+                             "debug" "enumer" "infnew" "infutl" "lvalue"
+                             "object" "pmerly" "proced" "rvalue"
+                             "scode" "sets" "subprb" "switch" "toplev" "utils"
+                             )
+            (filename/append "back"
+                             "asmmac" "bittop" "bitutl" "insseq" "lapgn1"
+                             "lapgn2" "lapgn3" "linear" "regmap" "symtab"
+                             "syntax")
+            (filename/append "machines/bobcat"
+                             "insmac" "machin" "rgspcm")
+            (filename/append "fggen"
+                             "declar" "fggen" "canon")
+            (filename/append "fgopt"
+                             "blktyp" "closan" "conect" "contan" "desenv"
+                             "folcon" "offset" "operan" "order" "outer"
+                             "simapp" "simple")
+            (filename/append "rtlbase"
+                             "regset" "rgraph" "rtlcfg" "rtlcon" "rtlexp"
+                             "rtline" "rtlobj" "rtlreg" "rtlty1" "rtlty2")
+            (filename/append "rtlgen"
+                             "fndblk" "opncod" "rgcomb" "rgproc" "rgretn"
+                             "rgrval" "rgstmt" "rtlgen")
+            (filename/append "rtlopt"
+                             "ralloc" "rcse1" "rcse2" "rcseep" "rcseht"
+                             "rcserq" "rcsesr" "rdeath" "rdebug" "rlife"))
+     compiler-syntax-table)
+    (file-dependency/syntax/join
+     (filename/append "machines/bobcat"
+                     "lapgen" "rules1" "rules2" "rules3" "rules4")
+     lap-generator-syntax-table)
+    (file-dependency/syntax/join
+     (filename/append "machines/bobcat"
+                     "insutl" "instr1" "instr2" "instr3" "instr4")
+     assembler-syntax-table)))
+\f
+;;;; Integration Dependencies
+
+(define (initialize/integration-dependencies!)
+  (let ((front-end-base
+        (filename/append "base"
                          "blocks" "cfg1" "cfg2" "cfg3" "contin" "ctypes"
-                         "debug" "enumer" "infgen" "infutl" "lvalue" "object"
-                         "pmerly" "proced" "queue" "rvalue" "scode" "sets"
-                         "subprb" "switch" "toplev" "utils")
-        (filename/append "back"
-                         "asmmac" "bittop" "bitutl" "insseq" "lapgn1" "lapgn2"
-                         "lapgn3" "linear" "regmap" "symtab" "syntax")
-        (filename/append "machines/bobcat"
-                         "insmac" "machin" "rgspcm")
-        (filename/append "fggen"
-                         "declar" "fggen" "canon")
-        (filename/append "fgopt"
-                         "blktyp" "closan" "conect" "contan" "desenv" "folcon"
-                         "offset" "operan" "order" "outer" "simapp" "simple")
+                         "enumer" "lvalue" "object" "proced" "rvalue"
+                         "scode" "subprb" "utils"))
+       (bobcat-base
+        (filename/append "machines/bobcat" "machin"))
+       (rtl-base
         (filename/append "rtlbase"
-                         "regset" "rgraph" "rtlcfg" "rtlcon" "rtlexp" "rtline"
-                         "rtlobj" "rtlreg" "rtlty1" "rtlty2")
-        (filename/append "rtlgen"
-                         "fndblk" "opncod" "rgcomb" "rgproc" "rgretn" "rgrval"
-                         "rgstmt" "rtlgen")
+                         "regset" "rgraph" "rtlcfg" "rtlcon" "rtlexp" "rtlobj"
+                         "rtlreg" "rtlty1" "rtlty2"))
+       (cse-base
         (filename/append "rtlopt"
-                         "ralloc" "rcse1" "rcse2" "rcseep" "rcseht" "rcserq"
-                         "rcsesr" "rdeath" "rdebug" "rlife"))
- compiler-syntax-table)
-
-(file-dependency/syntax/join
- (filename/append "machines/bobcat"
-                 "lapgen" "rules1" "rules2" "rules3" "rules4")
- lap-generator-syntax-table)
-
-(file-dependency/syntax/join
- (filename/append "machines/bobcat"
-                 "insutl" "instr1" "instr2" "instr3" "instr4")
- assembler-syntax-table)
-\f
-;;;; Integration Dependencies
+                         "rcse1" "rcse2" "rcseep" "rcseht" "rcserq" "rcsesr"))
+       (instruction-base
+        (append (filename/append "back" "insseq")
+                (filename/append "machines/bobcat" "assmd" "machin")))
+       (lapgen-base
+        (append (filename/append "back" "lapgn2" "lapgn3" "regmap")
+                (filename/append "machines/bobcat" "lapgen")))
+       (assembler-base
+        (append (filename/append "back" "bitutl" "symtab")
+                (filename/append "machines/bobcat" "insutl")))
+       (lapgen-body
+        (append
+         (filename/append "back" "lapgn1" "syntax")
+         (filename/append "machines/bobcat"
+                          "rules1" "rules2" "rules3" "rules4")))
+       (assembler-body
+        (append
+         (filename/append "back" "bittop")
+         (filename/append "machines/bobcat"
+                          "instr1" "instr2" "instr3" "instr4"))))
+
+    (define (file-dependency/integration/join filenames dependencies)
+      (for-each (lambda (filename)
+                 (file-dependency/integration/make filename dependencies))
+               filenames))
 
-(define-integration-dependencies "base" "object" "base" "enumer")
-(define-integration-dependencies "base" "enumer" "base" "object")
-(define-integration-dependencies "base" "utils" "base" "scode")
-(define-integration-dependencies "base" "cfg1" "base" "object")
-(define-integration-dependencies "base" "cfg2" "base" "cfg1" "cfg3" "object")
-(define-integration-dependencies "base" "cfg3" "base" "cfg1" "cfg2")
-(define-integration-dependencies "base" "ctypes" "base"
-  "blocks" "cfg1" "cfg2" "cfg3" "contin" "lvalue" "object" "subprb")
-(define-integration-dependencies "base" "rvalue" "base"
-  "blocks" "cfg1" "cfg2" "cfg3" "enumer" "lvalue" "object" "utils")
-(define-integration-dependencies "base" "lvalue" "base"
-  "blocks" "object" "proced" "rvalue" "utils")
-(define-integration-dependencies "base" "blocks" "base"
-  "enumer" "lvalue" "object" "proced" "rvalue" "scode")
-(define-integration-dependencies "base" "proced" "base"
-  "blocks" "cfg1" "cfg2" "cfg3" "contin" "enumer" "lvalue" "object" "rvalue"
-  "utils")
-(define-integration-dependencies "base" "contin" "base"
-  "blocks" "cfg3" "ctypes")
-(define-integration-dependencies "base" "subprb" "base"
-  "cfg3" "contin" "enumer" "object" "proced")
-(define-integration-dependencies "base" "infnew" "base" "infutl")
-
-(define front-end-base
-  (filename/append "base"
-                  "blocks" "cfg1" "cfg2" "cfg3" "contin" "ctypes" "enumer"
-                  "lvalue" "object" "proced" "queue" "rvalue" "scode"
-                  "subprb" "utils"))
-
-(define-integration-dependencies "machines/bobcat" "machin" "rtlbase"
-  "rtlreg" "rtlty1" "rtlty2")
-
-(define bobcat-base
-  (filename/append "machines/bobcat" "machin"))
-\f
-(define-integration-dependencies "rtlbase" "regset" "base")
-(define-integration-dependencies "rtlbase" "rgraph" "base" "cfg1" "cfg2")
-(define-integration-dependencies "rtlbase" "rgraph" "machines/bobcat" "machin")
-(define-integration-dependencies "rtlbase" "rtlcfg" "base"
-  "cfg1" "cfg2" "cfg3")
-(define-integration-dependencies "rtlbase" "rtlcon" "base" "cfg3" "utils")
-(define-integration-dependencies "rtlbase" "rtlcon" "machines/bobcat" "machin")
-(define-integration-dependencies "rtlbase" "rtlexp" "base" "utils")
-(define-integration-dependencies "rtlbase" "rtlexp" "rtlbase" "rtlreg")
-(define-integration-dependencies "rtlbase" "rtline" "base" "cfg1" "cfg2")
-(define-integration-dependencies "rtlbase" "rtline" "rtlbase"
-  "rtlcfg" "rtlty2")
-(define-integration-dependencies "rtlbase" "rtlobj" "base"
-  "cfg1" "object" "utils")
-(define-integration-dependencies "rtlbase" "rtlreg" "machines/bobcat" "machin")
-(define-integration-dependencies "rtlbase" "rtlreg" "rtlbase"
-  "rgraph" "rtlty1")
-(define-integration-dependencies "rtlbase" "rtlty1" "rtlbase" "rtlcfg")
-(define-integration-dependencies "rtlbase" "rtlty2" "base" "scode")
-(define-integration-dependencies "rtlbase" "rtlty2" "machines/bobcat" "machin")
-(define-integration-dependencies "rtlbase" "rtlty2" "rtlbase" "rtlty1")
-
-(define rtl-base
-  (filename/append "rtlbase"
-                  "regset" "rgraph" "rtlcfg" "rtlcon" "rtlexp" "rtlobj"
-                  "rtlreg" "rtlty1" "rtlty2"))
-\f
-(file-dependency/integration/join
- (append
-  (filename/append "fggen"
-                  "declar" "fggen")    ; "canon" needs no integrations
-  (filename/append "fgopt"
-                  "blktyp" "closan" "conect" "contan" "desenv" "folcon"
-                  "offset" "operan" "order" "outer" "simapp" "simple"))
- (append front-end-base bobcat-base))
-
-(file-dependency/integration/join
- (filename/append "rtlgen"
-                 "fndblk" "opncod" "rgcomb" "rgproc" "rgretn" "rgrval"
-                 "rgstmt" "rtlgen")
- (append front-end-base bobcat-base rtl-base))
-
-(define cse-base
-  (filename/append "rtlopt"
-                  "rcse1" "rcse2" "rcseep" "rcseht" "rcserq" "rcsesr"))
-
-(file-dependency/integration/join
- (append cse-base
-        (filename/append "rtlopt" "ralloc" "rdeath" "rdebug" "rlife"))
- (append bobcat-base rtl-base))
-
-(file-dependency/integration/join cse-base cse-base)
-
-(define-integration-dependencies "rtlopt" "rcseht" "base" "object")
-(define-integration-dependencies "rtlopt" "rcserq" "base" "object")
-(define-integration-dependencies "rtlopt" "rlife"  "base" "cfg2")
-\f
-(define instruction-base
-  (append (filename/append "back" "insseq")
-         (filename/append "machines/bobcat" "assmd" "machin")))
-
-(define lapgen-base
-  (append (filename/append "back" "lapgn2" "lapgn3" "regmap")
-         (filename/append "machines/bobcat" "lapgen")))
-
-(define assembler-base
-  (append (filename/append "back" "bitutl" "symtab")
-         (filename/append "machines/bobcat" "insutl")))
-
-(define lapgen-body
-  (append
-   (filename/append "back" "lapgn1" "syntax")
-   (filename/append "machines/bobcat" "rules1" "rules2" "rules3" "rules4")))
-
-(define assembler-body
-  (append
-   (filename/append "back" "bittop")
-   (filename/append "machines/bobcat" "instr1" "instr2" "instr3" "instr4")))
-
-(file-dependency/integration/join
- (append instruction-base
-        lapgen-base
-        lapgen-body
-        assembler-base
-        assembler-body
-        (filename/append "back" "linear" "syerly"))
- instruction-base)
-
-(file-dependency/integration/join (append lapgen-base lapgen-body) lapgen-base)
-
-(file-dependency/integration/join (append assembler-base assembler-body)
-                                 assembler-base)
-
-(define-integration-dependencies "back" "lapgn1" "base" "cfg1" "cfg2" "utils")
-(define-integration-dependencies "back" "lapgn1" "rtlbase"
-  "regset" "rgraph" "rtlcfg")
-(define-integration-dependencies "back" "lapgn2" "rtlbase" "rtlreg")
-(define-integration-dependencies "back" "lapgn3" "rtlbase" "rtlcfg")
-(define-integration-dependencies "back" "linear" "base" "cfg1" "cfg2")
-(define-integration-dependencies "back" "linear" "rtlbase" "rtlcfg")
-(define-integration-dependencies "back" "regmap" "base" "utils")
-(define-integration-dependencies "back" "symtab" "base" "utils")
+    (define (file-dependency/integration/make filename dependencies)
+      (let ((node (filename->source-node filename)))
+       (for-each (lambda (dependency)
+                   (let ((node* (filename->source-node dependency)))
+                     (if (not (eq? node node*))
+                         (source-node/link! node node*))))
+                 dependencies)))
+
+    (define (define-integration-dependencies directory name directory* . names)
+      (file-dependency/integration/make
+       (string-append directory "/" name)
+       (apply filename/append directory* names)))
+
+    (define-integration-dependencies "base" "object" "base" "enumer")
+    (define-integration-dependencies "base" "enumer" "base" "object")
+    (define-integration-dependencies "base" "utils" "base" "scode")
+    (define-integration-dependencies "base" "cfg1" "base" "object")
+    (define-integration-dependencies "base" "cfg2" "base"
+      "cfg1" "cfg3" "object")
+    (define-integration-dependencies "base" "cfg3" "base" "cfg1" "cfg2")
+    (define-integration-dependencies "base" "ctypes" "base"
+      "blocks" "cfg1" "cfg2" "cfg3" "contin" "lvalue" "object" "subprb")
+    (define-integration-dependencies "base" "rvalue" "base"
+      "blocks" "cfg1" "cfg2" "cfg3" "enumer" "lvalue" "object" "utils")
+    (define-integration-dependencies "base" "lvalue" "base"
+      "blocks" "object" "proced" "rvalue" "utils")
+    (define-integration-dependencies "base" "blocks" "base"
+      "enumer" "lvalue" "object" "proced" "rvalue" "scode")
+    (define-integration-dependencies "base" "proced" "base"
+      "blocks" "cfg1" "cfg2" "cfg3" "contin" "enumer" "lvalue" "object"
+      "rvalue" "utils")
+    (define-integration-dependencies "base" "contin" "base"
+      "blocks" "cfg3" "ctypes")
+    (define-integration-dependencies "base" "subprb" "base"
+      "cfg3" "contin" "enumer" "object" "proced")
+    (define-integration-dependencies "base" "infnew" "base" "infutl")
+
+    (define-integration-dependencies "machines/bobcat" "machin" "rtlbase"
+      "rtlreg" "rtlty1" "rtlty2")
+
+    (define-integration-dependencies "rtlbase" "regset" "base")
+    (define-integration-dependencies "rtlbase" "rgraph" "base" "cfg1" "cfg2")
+    (define-integration-dependencies "rtlbase" "rgraph" "machines/bobcat"
+      "machin")
+    (define-integration-dependencies "rtlbase" "rtlcfg" "base"
+      "cfg1" "cfg2" "cfg3")
+    (define-integration-dependencies "rtlbase" "rtlcon" "base" "cfg3" "utils")
+    (define-integration-dependencies "rtlbase" "rtlcon" "machines/bobcat"
+      "machin")
+    (define-integration-dependencies "rtlbase" "rtlexp" "base" "utils")
+    (define-integration-dependencies "rtlbase" "rtlexp" "rtlbase" "rtlreg")
+    (define-integration-dependencies "rtlbase" "rtline" "base" "cfg1" "cfg2")
+    (define-integration-dependencies "rtlbase" "rtline" "rtlbase"
+      "rtlcfg" "rtlty2")
+    (define-integration-dependencies "rtlbase" "rtlobj" "base"
+      "cfg1" "object" "utils")
+    (define-integration-dependencies "rtlbase" "rtlreg" "machines/bobcat"
+      "machin")
+    (define-integration-dependencies "rtlbase" "rtlreg" "rtlbase"
+      "rgraph" "rtlty1")
+    (define-integration-dependencies "rtlbase" "rtlty1" "rtlbase" "rtlcfg")
+    (define-integration-dependencies "rtlbase" "rtlty2" "base" "scode")
+    (define-integration-dependencies "rtlbase" "rtlty2" "machines/bobcat"
+      "machin")
+    (define-integration-dependencies "rtlbase" "rtlty2" "rtlbase" "rtlty1")
+    (file-dependency/integration/join
+     (append
+      (filename/append "fggen"
+                      "declar" "fggen") ; "canon" needs no integrations
+      (filename/append "fgopt"
+                      "blktyp" "closan" "conect" "contan" "desenv" "folcon"
+                      "offset" "operan" "order" "outer" "simapp" "simple"))
+     (append front-end-base bobcat-base))
+
+    (file-dependency/integration/join
+     (filename/append "rtlgen"
+                     "fndblk" "opncod" "rgcomb" "rgproc" "rgretn" "rgrval"
+                     "rgstmt" "rtlgen")
+     (append front-end-base bobcat-base rtl-base))
+
+    (file-dependency/integration/join
+     (append cse-base
+            (filename/append "rtlopt" "ralloc" "rdeath" "rdebug" "rlife"))
+     (append bobcat-base rtl-base))
+
+    (file-dependency/integration/join cse-base cse-base)
+
+    (define-integration-dependencies "rtlopt" "rcseht" "base" "object")
+    (define-integration-dependencies "rtlopt" "rcserq" "base" "object")
+    (define-integration-dependencies "rtlopt" "rlife"  "base" "cfg2")
+
+    (file-dependency/integration/join
+     (append instruction-base
+            lapgen-base
+            lapgen-body
+            assembler-base
+            assembler-body
+            (filename/append "back" "linear" "syerly"))
+     instruction-base)
+    (file-dependency/integration/join (append lapgen-base lapgen-body)
+                                     lapgen-base)
+
+    (file-dependency/integration/join (append assembler-base assembler-body)
+                                     assembler-base)
+
+    (define-integration-dependencies "back" "lapgn1" "base"
+      "cfg1" "cfg2" "utils")
+    (define-integration-dependencies "back" "lapgn1" "rtlbase"
+      "regset" "rgraph" "rtlcfg")
+    (define-integration-dependencies "back" "lapgn2" "rtlbase" "rtlreg")
+    (define-integration-dependencies "back" "lapgn3" "rtlbase" "rtlcfg")
+    (define-integration-dependencies "back" "linear" "base" "cfg1" "cfg2")
+    (define-integration-dependencies "back" "linear" "rtlbase" "rtlcfg")
+    (define-integration-dependencies "back" "regmap" "base" "utils")
+    (define-integration-dependencies "back" "symtab" "base" "utils"))
+
+(for-each (lambda (node)
+           (let ((links (source-node/backward-links node)))
+             (if (not (null? links))
+                 (set-source-node/declarations!
+                  node
+                  (cons (make-integration-declaration
+                         (source-node/pathname node)
+                         (map source-node/pathname links))
+                        (source-node/declarations node))))))
+         source-nodes))
+
+(define (make-integration-declaration pathname integration-dependencies)
+  `(INTEGRATE-EXTERNAL
+    ,@(map (let ((default
+                 (make-pathname
+                  false
+                  false
+                  (make-list (length (pathname-directory pathname)) 'UP)
+                  false
+                  false
+                  false)))
+            (lambda (pathname)
+              (merge-pathnames pathname default)))
+          integration-dependencies)))
+
+(define-integrable (integration-declaration? declaration)
+  (eq? (car declaration) 'INTEGRATE-EXTERNAL))
 \f
 ;;;; Expansion Dependencies
 
-(file-dependency/expansion/join
- (filename/append "machines/bobcat"
-                 "lapgen" "rules1" "rules2" "rules3" "rules4")
- '((LAP:SYNTAX-INSTRUCTION
-    (ACCESS LAP:SYNTAX-INSTRUCTION-EXPANDER LAP-SYNTAX-PACKAGE
-           COMPILER-PACKAGE))
-   (INSTRUCTION->INSTRUCTION-SEQUENCE
-    (ACCESS INSTRUCTION->INSTRUCTION-SEQUENCE-EXPANDER LAP-SYNTAX-PACKAGE
-           COMPILER-PACKAGE))
-   (SYNTAX-EVALUATION
-    (ACCESS SYNTAX-EVALUATION-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (CONS-SYNTAX
-    (ACCESS CONS-SYNTAX-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (OPTIMIZE-GROUP-EARLY
-    (ACCESS OPTIMIZE-GROUP-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (EA-KEYWORD-EARLY
-    (ACCESS EA-KEYWORD-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (EA-MODE-EARLY
-    (ACCESS EA-MODE-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (EA-REGISTER-EARLY
-    (ACCESS EA-REGISTER-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (EA-EXTENSION-EARLY
-    (ACCESS EA-EXTENSION-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))
-   (EA-CATEGORIES-EARLY
-    (ACCESS EA-CATEGORIES-EXPANDER LAP-SYNTAX-PACKAGE COMPILER-PACKAGE))))
-
-(finish-integration-dependencies!)
\ No newline at end of file
+(define (initialize/expansion-dependencies!)
+  (let ((file-dependency/expansion/join
+        (lambda (filenames expansions)
+          (for-each (lambda (filename)
+                      (let ((node (filename->source-node filename)))
+                        (set-source-node/declarations!
+                         node
+                         (cons (make-expansion-declaration expansions)
+                               (source-node/declarations node)))))
+                    filenames))))
+    (file-dependency/expansion/join
+     (filename/append "machines/bobcat"
+                     "lapgen" "rules1" "rules2" "rules3" "rules4")
+     (map (lambda (entry)
+           `(,(car entry)
+             (PACKAGE/REFERENCE (FIND-PACKAGE '(COMPILER LAP-SYNTAXER))
+                                ',(cadr entry))))
+         '((LAP:SYNTAX-INSTRUCTION LAP:SYNTAX-INSTRUCTION-EXPANDER)
+           (INSTRUCTION->INSTRUCTION-SEQUENCE
+            INSTRUCTION->INSTRUCTION-SEQUENCE-EXPANDER)
+           (SYNTAX-EVALUATION SYNTAX-EVALUATION-EXPANDER)
+           (CONS-SYNTAX CONS-SYNTAX-EXPANDER)
+           (OPTIMIZE-GROUP-EARLY OPTIMIZE-GROUP-EXPANDER)
+           (EA-KEYWORD-EARLY EA-KEYWORD-EXPANDER)
+           (EA-MODE-EARLY EA-MODE-EXPANDER)
+           (EA-REGISTER-EARLY EA-REGISTER-EXPANDER)
+           (EA-EXTENSION-EARLY EA-EXTENSION-EXPANDER)
+           (EA-CATEGORIES-EARLY EA-CATEGORIES-EXPANDER))))))
+
+(define-integrable (make-expansion-declaration expansions)
+  `(EXPAND-OPERATOR ,@expansions))
+
+(define-integrable (expansion-declaration? declaration)
+  (eq? (car declaration) 'EXPAND-OPERATOR))
\ No newline at end of file