Blob Blame Raw
Description: <short summary of the patch>
 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-17) unstable; urgency=medium
 .
   * Version_2_6_13pre20
Author: Camm Maguire <camm@debian.org>

---
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: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- gcl-2.6.12.orig/configure
+++ gcl-2.6.12/configure
@@ -6553,6 +6553,7 @@ else
 
         #include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "./h/enum.h"
 	#define OBJ_ALIGN
@@ -6681,6 +6682,7 @@ else
 /* end confdefs.h.  */
 #include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "h/enum.h"
 	#include "h/type.h"
@@ -6710,6 +6712,7 @@ else
 /* end confdefs.h.  */
 #include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "`pwd`/h/enum.h"
 	#include "`pwd`/h/type.h"
--- gcl-2.6.12.orig/configure.in
+++ gcl-2.6.12/configure.in
@@ -1301,6 +1301,7 @@ AC_MSG_CHECKING([for required object ali
 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
         #include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "./h/enum.h"
 	#define OBJ_ALIGN
@@ -1341,6 +1342,7 @@ AC_MSG_CHECKING(sizeof struct contblock)
 if test "$use" = "mingw" ; then
 AC_TRY_RUN([#include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "h/enum.h"
 	#include "h/type.h"
@@ -1357,6 +1359,7 @@ AC_TRY_RUN([#include <stdio.h>
 else
 AC_TRY_RUN([#include <stdio.h>
 	#define EXTER
+	#define INLINE
 	#include "$MP_INCLUDE"
 	#include "`pwd`/h/enum.h"
 	#include "`pwd`/h/type.h"
--- gcl-2.6.12.orig/gcl-tk/guis.h
+++ gcl-2.6.12/gcl-tk/guis.h
@@ -7,6 +7,7 @@
 #define IMMNUM_H
 #define GMP_WRAPPERS_H
 #define ERROR_H
+#undef INLINE
 
 #include "include.h"
 
--- gcl-2.6.12.orig/h/elf64_mips_reloc.h
+++ gcl-2.6.12/h/elf64_mips_reloc.h
@@ -15,7 +15,10 @@
       gote=got+(a>>32)-1;
       a&=MASK(32);
       store_val(where,MASK(16),((void *)gote-(void *)got));
-      *gote=s+(a&~MASK(16))+((a&0x8000)<<1);
+      if (s>=ggot && s<ggote) {
+        massert(!write_stub(s,got,gote));
+      } else
+        *gote=s+(a&~MASK(16))+((a&0x8000)<<1);
       break;
     case R_MIPS_GOT_OFST:
       store_val(where,MASK(16),a);
--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h
+++ gcl-2.6.12/h/elf64_mips_reloc_special.h
@@ -1,4 +1,4 @@
-static Rela *hr;
+static ul ggot,ggote; static Rela *hr;
 
 #undef ELF_R_SYM 
 #define ELF_R_SYM(a_) (a_&0xffffffff) 
@@ -7,9 +7,66 @@ static Rela *hr;
 #define ELF_R_FTYPE(a_) ((a_>>56)&0xff)
 
 static int
+write_stub(ul s,ul *got,ul *gote) {
+
+  int *goti;
+
+  *gote=(ul)(goti=(void *)(gote+2));
+  *++gote=s;
+  s=((void *)gote-(void *)got);
+  *goti++=(0x37<<26)|(0x1c<<21)|(0x19<<16)|s;
+  *goti++=(0x37<<26)|(0x19<<21)|(0x19<<16)|0;
+  *goti++=0x03200008;
+  *goti++=0x00200825;
+
+  return 0;
+
+}
+
+static int
+make_got_room_for_stub(Shdr *sec1,Shdr *sece,Sym *sym,const char *st1,ul *gs) {
+
+  Shdr *ssec=sec1+sym->st_shndx;
+  struct node *a;
+  if ((ssec>=sece || !ALLOC_SEC(ssec)) &&
+      (a=find_sym_ptable(st1+sym->st_name)) &&
+      a->address>=ggot && a->address<ggote)
+    (*gs)+=3;
+
+  return 0;
+
+}
+
+static int
 find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn,
 		    const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) {
   
+  Shdr *sec;
+  ul *q,gotsym=0,locgotno=0,stub,stube;
+  void *p,*pe;
+
+  massert(sec=get_section(".dynamic",sec1,sece,sn));
+  for (p=(void *)sec->sh_addr,pe=p+sec->sh_size;p<pe;p+=sec->sh_entsize) {
+    q=p;
+    if (q[0]==DT_MIPS_GOTSYM)
+      gotsym=q[1];
+    if (q[0]==DT_MIPS_LOCAL_GOTNO)
+      locgotno=q[1];
+  }
+  massert(gotsym && locgotno);
+
+  massert(sec=get_section(".MIPS.stubs",sec1,sece,sn));
+  stub=sec->sh_addr;
+  stube=sec->sh_addr+sec->sh_size;
+
+  massert(sec=get_section(".got",sec1,sece,sn));
+  ggot=sec->sh_addr+locgotno*sec->sh_entsize;
+  ggote=sec->sh_addr+sec->sh_size;
+
+  for (ds1+=gotsym,sym=ds1;sym<dse;sym++)
+    if (!sym->st_value || (sym->st_value>=stub && sym->st_value<stube))
+      sym->st_value=ggot+(sym-ds1)*sec->sh_entsize;
+
   return 0;
 
 }
@@ -45,6 +102,8 @@ label_got_symbols(void *v1,Shdr *sec1,Sh
 	      sym->st_size|=(q<<(a*16));
 	    }
 	    
+	    massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs));
+
 	  }
 
 	  b=sizeof(r->r_addend)*4; 
--- gcl-2.6.12.orig/h/notcomp.h
+++ gcl-2.6.12/h/notcomp.h
@@ -364,3 +364,13 @@ extern bool writable_malloc;
 #define pfork() prof_block(fork())
 
 #include "error.h"
+
+#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
+extern void __gmp_randget_mt ();
+extern void __gmp_randclear_mt ();
+extern void __gmp_randiset_mt ();
+
+typedef struct {void *a,*b,*c,*d;} gmp_randfnptr_t;
+EXTER gmp_randfnptr_t Mersenne_Twister_Generator_Noseed;
+#endif
+
--- gcl-2.6.12.orig/h/object.h
+++ gcl-2.6.12/h/object.h
@@ -349,11 +349,7 @@ EXTER char *new_rb_start;		/*  desired r
 EXTER char *rb_start;           	/*  relblock start  */
 EXTER char *rb_end;			/*  relblock end  */
 EXTER char *rb_limit;			/*  relblock limit  */
-EXTER char *rb_pointer;		/*  relblock pointer  */
-
-#ifndef INLINE
-#define INLINE
-#endif
+EXTER char *rb_pointer;                 /*  relblock pointer  */
 
 INLINE ufixnum
 rb_size(void) {
--- gcl-2.6.12.orig/o/big.c
+++ gcl-2.6.12/o/big.c
@@ -70,6 +70,32 @@ DEFUN_NEW("SET-GMP-ALLOCATE-RELOCATABLE"
   RETURN1(flag);
 }
 
+#ifndef GMP_USE_MALLOC
+object big_gcprotect;
+object big_fixnum1;
+
+#include "gmp.c"
+
+void
+gcl_init_big1(void) {
+
+  mp_set_memory_functions( gcl_gmp_alloc,gcl_gmp_realloc,gcl_gmp_free);
+  jmp_gmp=0;
+
+#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
+  Mersenne_Twister_Generator_Noseed.b=__gmp_randget_mt;
+  Mersenne_Twister_Generator_Noseed.c=__gmp_randclear_mt;
+  Mersenne_Twister_Generator_Noseed.d=__gmp_randiset_mt;
+#endif
+
+}
+
+#else
+gcl_init_big1()
+{
+}
+#endif
+
 #ifdef GMP
 #include "gmp_big.c"
 #else
@@ -93,7 +119,6 @@ void zero_big(object x)
   ZERO_BIG(x);
 }
 
-
 #ifndef HAVE_MP_COERCE_TO_STRING
 
 double digitsPerBit[37]={ 0,0,
--- gcl-2.6.12.orig/o/gmp_big.c
+++ gcl-2.6.12/o/gmp_big.c
@@ -81,27 +81,6 @@ static object verify_big_or_zero(object
 #define verify_big_or_zero(x)
 #endif
 
-
- 
-
-
-#ifndef GMP_USE_MALLOC
-object big_gcprotect;
-object big_fixnum1;
-
-#include "gmp.c"
-void
-gcl_init_big1(void) {
-    mp_set_memory_functions( gcl_gmp_alloc,gcl_gmp_realloc,gcl_gmp_free);
-    jmp_gmp=0;
-}
-
-#else
-gcl_init_big1()
-{
-}
-#endif  
-
 object
 new_bignum(void)
 { object ans;
--- gcl-2.6.12.orig/o/main.c
+++ gcl-2.6.12/o/main.c
@@ -511,9 +511,7 @@ main(int argc, char **argv, char **envp)
 
     terminal_io->sm.sm_object0->sm.sm_fp = stdin;
     terminal_io->sm.sm_object1->sm.sm_fp = stdout;
-#ifdef LD_BIND_NOW /*FIXME currently mips only, verify that these two requirements are the same*/
-    reinit_gmp();
-#endif
+
     gcl_init_big1();
 #ifdef HAVE_READLINE
     gcl_init_readline_function();
--- gcl-2.6.12.orig/o/num_rand.c
+++ gcl-2.6.12/o/num_rand.c
@@ -104,34 +104,6 @@ trap_gcl_gmp_allocfun(size_t size){
 }
 #endif
 
-#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
-extern void
-__gmp_randget_mt ();
-extern void
-__gmp_randclear_mt ();
-extern void
-__gmp_randiset_mt ();
-
-typedef struct {void *a,*b,*c,*d;} gmp_randfnptr_t;
-static gmp_randfnptr_t Mersenne_Twister_Generator_Noseed = {
-  NULL,
-  __gmp_randget_mt,
-  __gmp_randclear_mt,
-  __gmp_randiset_mt
-};
-#endif
-
-void
-reinit_gmp() {
-
-#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
-  Mersenne_Twister_Generator_Noseed.b=__gmp_randget_mt;
-  Mersenne_Twister_Generator_Noseed.c=__gmp_randclear_mt;
-  Mersenne_Twister_Generator_Noseed.d=__gmp_randiset_mt;
-#endif
-
-}
-
 void
 init_gmp_rnd_state(__gmp_randstate_struct *x) {
 
--- gcl-2.6.12.orig/unixport/sys_init.lsp.in
+++ gcl-2.6.12/unixport/sys_init.lsp.in
@@ -66,9 +66,7 @@
       *opt-two* @LI-OPT-TWO@
       *init-lsp* @LI-INIT-LSP@)
 
-(import 'si::(clines defentry defcfun object void int double
-		     quit bye gbc system commonp
-		     *break-on-warnings*
+(import 'si::(commonp *break-on-warnings*
 		     make-char char-bits char-font char-bit set-char-bit string-char-p int-char
 		     char-font-limit char-bits-limit char-control-bit
 		     char-meta-bit char-super-bit char-hyper-bit compiler-let) :cltl1-compat)
@@ -79,3 +77,4 @@
 #-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp)))
 
 #+ansi-cl (use-package :pcl :user)
+(import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user)