From ddc638fde430dd3b63a2e9900595f6735e49b425 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 27 Dec 2009 20:20:38 +0100 Subject: [PATCH] New separate pass for assigning numbers to labels. --- src/new-cmp/cmpbackend.lsp | 4 ++-- src/new-cmp/cmppass.lsp | 20 ++++++++++++++++++++ src/new-cmp/cmptop.lsp | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/new-cmp/cmpbackend.lsp b/src/new-cmp/cmpbackend.lsp index 7b01a6410..ed5bfc9f2 100644 --- a/src/new-cmp/cmpbackend.lsp +++ b/src/new-cmp/cmpbackend.lsp @@ -34,8 +34,8 @@ (when (plusp (tag-ref form)) (let ((label (tag-label form))) (unless label - (setf (tag-label form) (setf label (next-label)))) - (wt-label (tag-label form))))) + (error "No label for tag ~A" form)) + (wt-label label)))) ((c1form-p form) (pprint-c1form form) (let* ((*file* (c1form-file form)) diff --git a/src/new-cmp/cmppass.lsp b/src/new-cmp/cmppass.lsp index 89d309a98..a816bbacd 100644 --- a/src/new-cmp/cmppass.lsp +++ b/src/new-cmp/cmppass.lsp @@ -225,3 +225,23 @@ form in its read/set nodes, and add other consistency checks." (error ";;; Inconsistent form ~S form with arguments~{~&;;; ~A~}" (c1form-name form) args))) forms)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; ASSIGN LABELS +;;; + +(defun pass-assign-labels (function forms) + (loop with *last-label* = 0 + with last = nil + for f in forms + do (cond ((not (tag-p f)) + (setf last nil)) + (last + (setf (tag-label f) last + (tag-ref f) 0)) + (t + (setf last (next-label) + (tag-label f) last))) + finally (setf (fun-last-label function) *last-label*)) + forms) diff --git a/src/new-cmp/cmptop.lsp b/src/new-cmp/cmptop.lsp index a8e1ad888..3b13b1a3e 100644 --- a/src/new-cmp/cmptop.lsp +++ b/src/new-cmp/cmptop.lsp @@ -152,6 +152,7 @@ (execute-pass 'pass-delete-no-side-effects) (execute-pass 'pass-delete-unused-bindings) (execute-pass 'pass-decide-var-rep-types) + (execute-pass 'pass-assign-labels) ;; Emit entry function (let ((*compile-to-linking-call* nil))