Recompute library dep tree after macro expansion

Fix the compiler to recompute library dependencies for a program if additional import expressions were encountered during macro expansion.
This commit is contained in:
Justin Ethier 2020-11-19 14:51:25 -05:00
parent e8ef39c76b
commit 6f5a60bfa4
2 changed files with 30 additions and 5 deletions

View file

@ -5,6 +5,7 @@
Bug Fixes Bug Fixes
- Fixed compilation error in `runtime.c` on Raspberry Pi / ARM. - Fixed compilation error in `runtime.c` on Raspberry Pi / ARM.
- Fix the compiler to recompute library dependencies for a program if additional import expressions were encountered during macro expansion.
## 0.22 - November 3, 2020 ## 0.22 - November 3, 2020

View file

@ -255,13 +255,21 @@
(trace:info meta)) (trace:info meta))
(set! input-program (cdr program:imports/code)) (set! input-program (cdr program:imports/code))
;(set! lib-deps (append lib-deps (lib:get-all-import-deps (car program:imports/code) append-dirs prepend-dirs))) ;(set! lib-deps (append lib-deps (lib:get-all-import-deps (car program:imports/code) append-dirs prepend-dirs)))
(let ((new-lib-deps (lib:get-all-import-deps (car program:imports/code) append-dirs prepend-dirs #f))) (let ((changed #f)
(new-lib-deps (lib:get-all-import-deps (car program:imports/code) append-dirs prepend-dirs #f)))
(for-each (for-each
(lambda (dep) (lambda (dep)
(if (not (member dep lib-deps)) (when (not (member dep lib-deps))
(set! changed #t)
(set! lib-deps (cons dep lib-deps)))) (set! lib-deps (cons dep lib-deps))))
new-lib-deps) new-lib-deps)
(change-lib-deps! lib-deps)) (when changed
;; Library dependencies can change if additional import
;; expressions were encountered during macro expansion.
;; If so, update the list of dependencies now
(set! ;; Use new deps
lib-deps
(change-lib-deps! lib-deps)))) ;; Caller updates and returns new deps
(trace:info lib-deps) (trace:info lib-deps)
))) )))
;; END additional top-level imports ;; END additional top-level imports
@ -728,7 +736,23 @@
program:imports/code program:imports/code
lib-deps lib-deps
(lambda (new-lib-deps) (lambda (new-lib-deps)
(set! lib-deps new-lib-deps)) ;; Deps changed so we need to
;; resolve dependency tree again
(set!
lib-deps
(lib:get-all-import-deps
new-lib-deps
append-dirs
prepend-dirs
expander))
;; Recompute linker options
(set! c-linker-options
(lib:get-all-c-linker-options
lib-deps
append-dirs
prepend-dirs))
;; Return new deps
lib-deps)
in-file in-file
append-dirs append-dirs
prepend-dirs))))) prepend-dirs)))))