(wt-label label))))
(if (eq default 't)
- (progn (wt-nl "FEerror(\"The ECASE key value ~s is illegal.\",1,V" cvar ");")
- (unwind-exit nil 'jump))
- (c2expr default))
+ (wt-nl "FEerror(\"The ECASE key value ~s is illegal.\",1,V" cvar ");")
+ (c2expr default))
(wt "}")
(close-inline-blocks))
(defun c2multiple-value-bind (vars init-form body
- &aux (block-p nil) (labels nil)
- (*unwind-exit* *unwind-exit*)
- (*vs* *vs*) (*clink* *clink*) (*ccb-vs* *ccb-vs*)
- top-data)
- (declare (object block-p))
- (multiple-value-check vars init-form)
-
- (dolist** (var vars)
+ &aux (block-p nil)
+ (*unwind-exit* *unwind-exit*)
+ (*vs* *vs*) (*clink* *clink*) (*ccb-vs* *ccb-vs*)
+ top-data)
+
+ (multiple-value-check vars init-form)
+
+ (dolist (var vars)
(let ((kind (c2var-kind var)))
- (declare (object kind))
(if kind
(let ((cvar (next-cvar)))
(setf (var-kind var) kind)
(setf (var-loc var) cvar)
(wt-nl)
(unless block-p (wt "{") (setq block-p t))
- (wt-var-decl var)
- )
- (setf (var-ref var) (vs-push)))))
+ (wt-var-decl var))
+ (setf (var-ref var) (vs-push)))))
(let ((*value-to-go* 'top) *top-data*)
(c2expr* init-form) (setq top-data *top-data*))
+
(and *record-call-info* (record-call-info nil (car top-data)))
- (let ((*clink* *clink*)
- (*unwind-exit* *unwind-exit*)
- (*ccb-vs* *ccb-vs*))
- (do ((vs vars (cdr vs)))
- ((endp vs))
- (declare (object vs))
- (push (next-label) labels)
- (wt-nl "if(vs_base>=vs_top){")
- (reset-top)
- (wt-go (car labels)) (wt "}")
+
+ (wt-nl "if(vs_base>vs_top) vs_top=vs_base;*vs_top=Cnil;")
+ (do ((vs vars (cdr vs)))
+ ((endp vs))
(c2bind-loc (car vs) '(vs-base 0))
- (unless (endp (cdr vs)) (wt-nl "vs_base++;"))))
+ (unless (endp (cdr vs)) (wt-nl "if (vs_base<vs_top) vs_base++;")))
(wt-nl) (reset-top)
- (let ((label (next-label)))
- (wt-nl) (wt-go label)
-
- (setq labels (nreverse labels))
-
- (dolist** (v vars)
- (wt-label (car labels))
- (pop labels)
- (c2bind-loc v nil))
-
- (wt-label label))
-
(c2expr body)
- (when block-p (wt "}"))
- )
+ (when block-p (wt "}")))
(*value-to-go* 'trash))
(c2expr (car l))
(wt-label *exit*))
- (unless (eq (caar l) 'go) (unwind-exit nil)))))
+ (unless (member (caar l) '(go return-from)) (unwind-exit nil)))))
(declare (object l written))
(cond (written (setq written nil))
((typep (car l) 'tag)
case $use in
alpha*)
assert_arg_to_cflags -mieee
- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1
+# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1
;;
aarch64*)
TLIBS="$TLIBS -lgcc_s";;
case $use in
alpha*)
assert_arg_to_cflags -mieee
- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1
+# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1
;;
aarch64*)
TLIBS="$TLIBS -lgcc_s";;
case R_ALPHA_GPDISP:
- gotoff=(ul)(got+(a>>32));
+ gotoff=(ul)(got+(a>>32)-1);
s=gotoff-p;
store_val(where,MASK(16),(s-(short)s)>>16);
store_val((void *)where+(a&MASK(32)),MASK(16),s);
s+=a&MASK(32);
a=(a>>32)-1;
if (s>=ggot1 && s<ggote) {
- massert(!write_stub(s,(ul *)gotoff,got+a));
+ massert(!write_stub(s,got+a));
} else
got[a]=s;
store_vals(where,MASK(16),(ul)(got+a)-gotoff);
static ul ggot1,ggote,gotoff;
static int
-write_stub(ul s,ul *got,ul *gote) {
+write_stub(ul s,ul *gote) {
unsigned int *goti;
*gote=(ul)(goti=(void *)(gote+2));
*++gote=s;
- *goti++=(0x29<<26)|(0x1b<<21)|(0x1d<<16)|((void *)gote-(void *)got);
- *goti++=(0x29<<26)|(0x1b<<21)|(0x1b<<16)|0;
- *goti++=(0x1a<<26)|(0x1f<<21)|(0x1b<<16)|0x4000;
- *goti++=0;
+ *goti++=(0x29<<26)|(0x1b<<21)|(0x1b<<16)|0xfff8; /*ldq t12,-8(t12)*/
+ *goti++=(0x29<<26)|(0x1b<<21)|(0x1b<<16)|0; /*ldq t12,0(t12)*/
+ *goti++=(0x1a<<26)|(0x1f<<21)|(0x1b<<16)|0x4000; /*jsr zero,(t12),$pc+4*/
+ *goti++=0; /*halt*/
return 0;
q=++*gs;
- massert(!(r->r_addend>>32));
+ if (r->r_addend>>32)
+ fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32);
+ r->r_addend&=0xffffffff;
+ massert((q&0xffffffff)==q);
r->r_addend|=(q<<32);
q=(q-gotp)*sizeof(*gs);
gotp=*gs+1;
}
+ if (r->r_addend>>32)
+ fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32);
+ r->r_addend&=0xffffffff;
+ massert((gotp&0xffffffff)==gotp);
r->r_addend|=(gotp<<32);
break;