Changeset 12010 for trunk/source/level-1


Ignore:
Timestamp:
May 7, 2009, 6:20:29 AM (10 years ago)
Author:
gb
Message:

We can't easily support USE-VALUE, STORE-VALUE, or CONTINUE restarts
after uuo-error-reg-unbound UUOs on x86(32- or 64-bit) platforms.

  • the UUO itself encodes (as #xcd #9x) the register that contains the

symbol whose value is unbound, but not the register that the (unbound)
is loaded into. (USE-VALUE and STORE-VALUE need this.)

  • the anchored UUO mechanism can make it unclear how to continue after

the UUO; we don't always follow the UUO with a meaningful instruction.

So (in this file): assume that #xcd #x90 is (the first two bytes of) a
3-byte UUO which encodes the both the source and destination register in
a third byte. (#xcd #x90 would otherwise be a uuo-error-reg-unbound uuo
that references %eax/%rax, and I assume that we don't currently generate
such an insruction.) Treat #xcd #x9x for non-zero x as an UNBOUND-VARIABLE,
but don't offer automatically-generated restarts.

[The plan is to transfer to the new 3-byte UUO, once all of the restart
support is in place. Until that transfer is complete, we don't want to
offer restarts that can't work, for the reasons described above.]

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/level-1/x86-error-signal.lisp

    r11715 r12010  
    102102                          (encoded-gpr-lisp xp (ldb (byte 4 0) op2))
    103103                          frame-ptr)))
     104                  ((= op1 #x90)
     105                   (setq skip (%check-anchored-uuo xcf 3))
     106                   (setf (encoded-gpr-lisp xp (ldb (byte 4 4) op2))
     107                         (%kernel-restart-internal $xvunbnd
     108                                                   (list
     109                                                    (encoded-gpr-lisp
     110                                                     xp
     111                                                     (ldb (byte 4 0) op2)))
     112                                                   frame-ptr)))
    104113                  ((< op1 #xa0)
    105114                   (setq skip (%check-anchored-uuo xcf 2))
    106                    ;; #x9x - register X is a symbol.  It's unbound.
    107                    (%kernel-restart-internal $xvunbnd
    108                                              (list
    109                                               (encoded-gpr-lisp
     115                   ;; #x9x, x>0 - register X is a symbol.  It's unbound,
     116                   ;; but we don't have enough info to offer USE-VALUE,
     117                   ;; STORE-VALUE, or CONTINUE restarts.
     118                   (%error (make-condition 'unbound-variable
     119                                           :name
     120                                           (encoded-gpr-lisp
    110121                                               xp
    111122                                               (ldb (byte 4 0) op1)))
    112                                              frame-ptr))
     123                           ()
     124                           frame-ptr))
    113125                  ((< op1 #xb0)
    114126                   (setq skip (%check-anchored-uuo xcf 2))
     
    275287                          (encoded-gpr-lisp xp (ldb (byte 4 0) op2))
    276288                          frame-ptr)))
     289                  ((= op1 #x90)
     290                   (setq skip (%check-anchored-uuo xcf 3))
     291                   (setf (encoded-gpr-lisp
     292                          xp
     293                          (ldb (byte 3 0) op2))
     294                         (%kernel-restart-internal $xvunbnd
     295                                                   (list
     296                                                    (encoded-gpr-lisp
     297                                                     xp
     298                                                     (ldb (byte 3 0) op2))
     299                                                    frame-ptr))))
    277300                  ((< op1 #xa0)
    278301                   (setq skip (%check-anchored-uuo xcf 2))
    279                    ;; #x9x - register X is a symbol.  It's unbound.
    280                    (%kernel-restart-internal $xvunbnd
    281                                              (list
    282                                               (encoded-gpr-lisp
     302                   ;; #x9x, x>- - register X is a symbol.  It's unbound,
     303                   ;; but we don't have enough info to offer USE-VALUE,
     304                   ;; STORE-VALUE, or CONTINUE restart
     305                   (%error (make-condition 'unbound-variable
     306                                           :name
     307                                           (encoded-gpr-lisp
    283308                                               xp
    284309                                               (ldb (byte 3 0) op1)))
    285                                              frame-ptr))
     310                           ()
     311                           frame-ptr))
    286312                  ((< op1 #xb0)
    287313                   (setq skip (%check-anchored-uuo xcf 2))
Note: See TracChangeset for help on using the changeset viewer.