Description: TODO: Put a short summary on the line above and replace this paragraph with a longer explanation of this change. Complete the meta-information with other relevant fields (see below for details). To make it easier, the information below has been extracted from the changelog. Adjust it or drop it. . gcl (2.6.12-26) unstable; urgency=medium . * Version_2_6_13pre32 Author: Camm Maguire --- The information above should follow the Patch Tagging Guidelines, please checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here are templates for supplementary fields that you might want to add: Origin: , Bug: Bug-Debian: https://bugs.debian.org/ Bug-Ubuntu: https://launchpad.net/bugs/ Forwarded: Reviewed-By: Last-Update: --- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp +++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp @@ -161,7 +161,7 @@ (defun compile-file1 (input-pathname - &key (output-file input-pathname) + &key (output-file (truename input-pathname)) (o-file t) (c-file *default-c-file*) (h-file *default-h-file*) --- gcl-2.6.12.orig/h/elf64_mips_reloc.h +++ gcl-2.6.12/h/elf64_mips_reloc.h @@ -1,18 +1,28 @@ case R_MIPS_JALR: break; - case R_MIPS_64: - if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL32) s-=(ul)got; - add_val(where,~0L,s+a); - break; case R_MIPS_GPREL32: + recurse(s+a-(ul)got); add_val(where,MASK(32),s+a-(ul)got); break; + case R_MIPS_GPREL16: + recurse(s+a-(ul)got); + add_val(where,MASK(16),s+a-(ul)got); + break; + case R_MIPS_SUB: + recurse(-(s+a)); + break;/*???*/ + case R_MIPS_64: + recurse(s+a); + add_val(where,~0L,s+a); + break; case R_MIPS_32: + recurse(s+a); add_val(where,MASK(32),s+a); break; case R_MIPS_GOT_DISP: case R_MIPS_CALL16: case R_MIPS_GOT_PAGE: + recurse(s+a); gote=got+(a>>32)-1; a&=MASK(32); store_val(where,MASK(16),((void *)gote-(void *)got)); @@ -22,28 +32,27 @@ *gote=s+(a&~MASK(16))+((a&0x8000)<<1); break; case R_MIPS_GOT_OFST: + recurse(s+a); store_val(where,MASK(16),a); break; case R_MIPS_HI16: - s+=a&MASK(32); - if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL16) s=(ul)got-s; + recurse(s+a); if (!hr) hr=(void *)r; - if (a&(1L<<32)) add_vals(where,MASK(16),(s+(a>>32))>>16); + if (lr)/*==(Rela *)r*/ + add_vals(where,MASK(16),(s+a+la)>>16); break; case R_MIPS_LO16: + recurse(s+a); s+=a; - if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL16) s=(ul)got-s; a=*where&MASK(16); if (a&0x8000) a|=0xffffffffffff0000; a+=s&MASK(16); a+=(a&0x8000)<<1; store_val(where,MASK(16),a); - a&=~MASK(16); - { - Rela *ra=(void *)r; - for (hr=hr ? hr : (void *)ra;--ra>=hr;) - if (ELF_R_TYPE(ra->r_info)==R_MIPS_HI16) - relocate(sym1,ra,ra->r_addend|(1L<<32)|(a<<32),start,got,gote); - } - hr=NULL; + for (la=a&~MASK(16),lr=(Rela *)r,hr=hr ? hr : lr;--lr>=hr;) + if (ELF_R_TYPE1(lr->r_info)==R_MIPS_HI16|| + ELF_R_TYPE2(lr->r_info)==R_MIPS_HI16|| + ELF_R_TYPE3(lr->r_info)==R_MIPS_HI16) + relocate(sym1,lr,lr->r_addend,start,got,gote); + hr=lr=NULL; break; --- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h +++ gcl-2.6.12/h/elf64_mips_reloc_special.h @@ -1,10 +1,21 @@ -static ul ggot,ggote; static Rela *hr; +static ul ggot,ggote,la; static Rela *hr,*lr; #undef ELF_R_SYM #define ELF_R_SYM(a_) (a_&0xffffffff) +#define ELF_R_TYPE1(a_) ((a_>>56)&0xff) +#define ELF_R_TYPE2(a_) ((a_>>48)&0xff) +#define ELF_R_TYPE3(a_) ((a_>>40)&0xff) +#define recurse(val) ({ \ + if (ELF_R_TYPE2(r->r_info)) { \ + ul i=r->r_info; \ + r->r_info=(((r->r_info>>32)&MASK(24))<<40)|(r->r_info&MASK(32)); \ + relocate(sym1,r,(val)-s,start,got,gote); \ + r->r_info=i; \ + break; \ + }}) + #undef ELF_R_TYPE -#define ELF_R_TYPE(a_) (((a_>>40)&0xff) ? ((a_>>40)&0xff) : (((a_>>48)&0xff) ? ((a_>>48)&0xff) : ((a_>>56)&0xff))) -#define ELF_R_FTYPE(a_) ((a_>>56)&0xff) +#define ELF_R_TYPE(a_) ELF_R_TYPE1(a_) typedef struct { ul entry,gotoff; --- gcl-2.6.12.orig/h/object.h +++ gcl-2.6.12/h/object.h @@ -568,6 +568,12 @@ EXTER unsigned plong signals_allowed, si #define IMMNIL(x) (is_imm_fixnum(x)||x==Cnil) -#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&eql1(_a,_b));}) -#define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&equal1(_a,_b));}) -#define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (_a!=Cnil&&_b!=Cnil&&equalp1(_a,_b));}) +/*gcc boolean expression tail position bug*/ + +/* #define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&eql1(_a,_b));}) */ +/* #define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&equal1(_a,_b));}) */ +/* #define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (_a!=Cnil&&_b!=Cnil&&equalp1(_a,_b));}) */ + +#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : eql1(_a,_b));}) +#define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : equal1(_a,_b));}) +#define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (_a==Cnil||_b==Cnil ? FALSE : equalp1(_a,_b));}) --- gcl-2.6.12.orig/o/main.c +++ gcl-2.6.12/o/main.c @@ -443,6 +443,23 @@ gcl_cleanup(int gc) { } +/*gcc boolean expression tail position bug*/ + +void * +cclear_stack(unsigned long size) { + void *v=alloca(size); + memset(v,0,size); + return v; +} + +DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",object,fSequal_tail_recursion_check,SI,1,1,NONE,II,OO,OO,OO,(fixnum s),"") { + object x0=make_list(s/sizeof(object)),x1=make_list(s/sizeof(object)); + char *u=cclear_stack(s),*w; + fLequal(x0,x1); + for (w=u;wc.c_car,y->c.c_car)) { - x=x->c.c_cdr; - y=y->c.c_cdr; - if (x==y) return TRUE; - if (IMMNIL(x)||IMMNIL(y)) return FALSE; - goto BEGIN; - } else - return FALSE; - } -#else - - if (valid_cdr(x)) return valid_cdr(y)&&equal(x->c.c_car,y->c.c_car)&&equal(x->c.c_cdr,y->c.c_cdr); - -#endif + /*gcc boolean expression tail position bug*/ + /* if (valid_cdr(x)) return valid_cdr(y)&&equal(x->c.c_car,y->c.c_car)&&equal(x->c.c_cdr,y->c.c_cdr); */ + if (valid_cdr(x)) return !valid_cdr(y)||!equal(x->c.c_car,y->c.c_car) ? FALSE : equal(x->c.c_cdr,y->c.c_cdr); if (valid_cdr(y)) return FALSE; @@ -524,7 +510,9 @@ equalp1(register object x, register obje /*x and y are not == and not Cnil*/ - if (listp(x)) return listp(y)&&equalp(x->c.c_car,y->c.c_car)&&equalp(x->c.c_cdr,y->c.c_cdr); + /*gcc boolean expression tail position bug*/ + /* if (listp(x)) return listp(y)&&equalp(x->c.c_car,y->c.c_car)&&equalp(x->c.c_cdr,y->c.c_cdr); */ + if (listp(x)) return !listp(y)||!equalp(x->c.c_car,y->c.c_car) ? FALSE : equalp(x->c.c_cdr,y->c.c_cdr); if (listp(y)) return FALSE; --- gcl-2.6.12.orig/unixport/sys_init.lsp.in +++ gcl-2.6.12/unixport/sys_init.lsp.in @@ -79,3 +79,7 @@ #+ansi-cl (use-package :pcl :user) #+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) + +(let* ((i 4096)(j (si::equal-tail-recursion-check i))) + (unless (eql i j) + (warn "equal is not tail recursive ~s ~s" i j)))