0.8.12.8: Really this time. Note to self: remeber to save the
[sbcl.git] / src / compiler / assem.lisp
index 778eb41..3a9e453 100644 (file)
            ;; nothing to do, then emit a nop. ### Note: despite the
            ;; fact that this is a loop, it really won't work for
            ;; repetitions other then zero and one. For example, if
-p          ;; the branch has two dependents and one of them dpends on
+           ;; the branch has two dependents and one of them dpends on
            ;; the other, then the stuff that grabs a dependent could
            ;; easily grab the wrong one. But I don't feel like fixing
            ;; this because it doesn't matter for any of the
@@ -768,7 +768,7 @@ p       ;; the branch has two dependents and one of them dpends on
   (declare (type segment segment)
           (type annotation note))
   (when (annotation-posn note)
-    (error "attempt to emit ~S a second time"))
+    (error "attempt to emit ~S a second time" note))
   (setf (annotation-posn note) (segment-current-posn segment))
   (setf (annotation-index note) (segment-current-index segment))
   (let ((last (segment-last-annotation segment))
@@ -1163,16 +1163,24 @@ p           ;; the branch has two dependents and one of them dpends on
              ,@(mapcar (lambda (name)
                          `(,name (gen-label)))
                        new-labels))
-       (declare (ignorable ,vop-var ,seg-var))
+       (declare (ignorable ,vop-var ,seg-var)
+                ;; Must be done so that contribs and user code doing
+                ;; low-level stuff don't need to worry about this.
+                (disable-package-locks %%current-segment%% %%current-vop%%))
        (macrolet ((%%current-segment%% () '**current-segment**)
                   (%%current-vop%% () '**current-vop**))
-        (symbol-macrolet (,@(when (or inherited-labels nested-labels)
-                              `((..inherited-labels.. ,nested-labels))))
-          ,@(mapcar (lambda (form)
-                      (if (label-name-p form)
-                          `(emit-label ,form)
-                          form))
-                    body)))))))
+          ;; KLUDGE: Some host lisps (CMUCL 18e Sparc at least)
+          ;; can't deal with this declaration, so disable it on host.
+          ;; Ditto for later ENABLE-PACKAGE-LOCKS %%C-S%% declaration.
+          #-sb-xc-host
+         (declare (enable-package-locks %%current-segment%% %%current-vop%%))
+         (symbol-macrolet (,@(when (or inherited-labels nested-labels)
+                                   `((..inherited-labels.. ,nested-labels))))
+             ,@(mapcar (lambda (form)
+                         (if (label-name-p form)
+                             `(emit-label ,form)
+                             form))
+                       body)))))))
 #+sb-xc-host
 (sb!xc:defmacro assemble ((&optional segment vop &key labels)
                          &body body
@@ -1209,13 +1217,13 @@ p           ;; the branch has two dependents and one of them dpends on
        (declare (ignorable ,vop-var ,seg-var))
        (macrolet ((%%current-segment%% () '**current-segment**)
                   (%%current-vop%% () '**current-vop**))
-        (symbol-macrolet (,@(when (or inherited-labels nested-labels)
-                              `((..inherited-labels.. ,nested-labels))))
-          ,@(mapcar (lambda (form)
-                      (if (label-name-p form)
-                          `(emit-label ,form)
-                          form))
-                    body)))))))
+         (symbol-macrolet (,@(when (or inherited-labels nested-labels)
+                                   `((..inherited-labels.. ,nested-labels))))
+             ,@(mapcar (lambda (form)
+                         (if (label-name-p form)
+                             `(emit-label ,form)
+                             form))
+                       body)))))))
 
 (defmacro inst (&whole whole instruction &rest args &environment env)
   #!+sb-doc
@@ -1270,8 +1278,7 @@ p     ;; the branch has two dependents and one of them dpends on
     (setf (segment-postits segment) (segment-postits other-segment))
     (dolist (postit postits)
       (emit-back-patch segment 0 postit)))
-  #!-x86 (emit-alignment segment nil max-alignment)
-  #!+x86 (emit-alignment segment nil max-alignment #x90)
+  (emit-alignment segment nil max-alignment #!+(or x86-64 x86) #x90)
   (let ((segment-current-index-0 (segment-current-index segment))
        (segment-current-posn-0  (segment-current-posn  segment)))
     (incf (segment-current-index segment)
@@ -1637,10 +1644,19 @@ p           ;; the branch has two dependents and one of them dpends on
           ,@(when decls
               `((declare ,@decls)))
           (let ((,postits (segment-postits ,segment-name)))
+            ;; Must be done so that contribs and user code doing
+            ;; low-level stuff don't need to worry about this.
+            (declare (disable-package-locks %%current-segment%%))
             (setf (segment-postits ,segment-name) nil)
             (macrolet ((%%current-segment%% ()
                          (error "You can't use INST without an ~
                                  ASSEMBLE inside emitters.")))
+               ;; KLUDGE: Some host lisps (CMUCL 18e Sparc at least)
+               ;; can't deal with this declaration, so disable it on host
+               ;; Ditto for earlier ENABLE-PACKAGE-LOCKS %%C-S%% %%C-V%%
+               ;; declaration.
+               #-sb-xc-host
+              (declare (enable-package-locks %%current-segment%%))
               ,@emitter))
           (values))
         (eval-when (:compile-toplevel :load-toplevel :execute)