uclibc: patches to compile with gcc 4.1.1 with thumb instruction set
authorFrans Meulenbroeks <fransmeulenbroeks@yahoo.com>
Mon, 14 Aug 2006 16:27:13 +0000 (16:27 +0000)
committerFrans Meulenbroeks <fransmeulenbroeks@yahoo.com>
Mon, 14 Aug 2006 16:27:13 +0000 (16:27 +0000)
(patches derived from busybox mailing list)

packages/uclibc/uclibc-0.9.28/dl-string.h.patch [new file with mode: 0644]
packages/uclibc/uclibc-0.9.28/dl-sysdep.h.patch [new file with mode: 0644]
packages/uclibc/uclibc_0.9.28.bb

diff --git a/packages/uclibc/uclibc-0.9.28/dl-string.h.patch b/packages/uclibc/uclibc-0.9.28/dl-string.h.patch
new file mode 100644 (file)
index 0000000..a2bdb81
--- /dev/null
@@ -0,0 +1,225 @@
+--- uClibc-0.9.28/ldso/include/dl-string.h.orig        2006-08-14 17:20:02.000000000 +0200
++++ uClibc-0.9.28/ldso/include/dl-string.h     2006-08-14 17:19:38.000000000 +0200
+@@ -1,9 +1,24 @@
++/* vi: set sw=4 ts=4: */
++/*
++ * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
++ *
++ * GNU Lesser General Public License version 2.1 or later.
++ */
++
+ #ifndef _LINUX_STRING_H_
+ #define _LINUX_STRING_H_
+-#include <dl-sysdep.h> // for do_rem
++#include <dl-sysdep.h> /* for do_rem */
+ #include <features.h>
++/* provide some sane defaults */
++#ifndef do_rem
++# define do_rem(result, n, base) ((result) = (n) % (base))
++#endif
++#ifndef do_div_10
++# define do_div_10(result, remain) ((result) /= 10)
++#endif
++
+ static size_t _dl_strlen(const char * str);
+ static char *_dl_strcat(char *dst, const char *src);
+ static char * _dl_strcpy(char * dst,const char *src);
+@@ -26,8 +41,8 @@
+ static __always_inline size_t _dl_strlen(const char * str)
+ {
+       register const char *ptr = (char *) str-1;
+-
+-      while (*++ptr);
++      while (*++ptr)
++              ;/* empty */
+       return (ptr - str);
+ }
+@@ -49,7 +64,8 @@
+       register char *ptr = dst;
+       dst--;src--;
+-      while ((*++dst = *++src) != 0);
++      while ((*++dst = *++src) != 0)
++              ;/* empty */
+       return ptr;
+ }
+@@ -63,8 +79,7 @@
+               c2 = (unsigned char) *++s2;
+               if (c1 == '\0')
+                       return c1 - c2;
+-      }
+-      while (c1 == c2);
++      } while (c1 == c2);
+       return c1 - c2;
+ }
+@@ -98,43 +113,41 @@
+       return 0;
+ }
+-static inline char * _dl_strrchr(const char *str, int c)
++static __always_inline char * _dl_strrchr(const char *str, int c)
+ {
+-    register char *prev = 0;
+-    register char *ptr = (char *) str-1;
++      register char *prev = 0;
++      register char *ptr = (char *) str-1;
+-    while (*++ptr != '\0') {
+-      if (*ptr == c)
+-          prev = ptr;
+-    }
+-    if (c == '\0')
+-      return(ptr);
+-    return(prev);
++      while (*++ptr != '\0') {
++              if (*ptr == c)
++                      prev = ptr;
++      }
++      if (c == '\0')
++              return(ptr);
++      return(prev);
+ }
+-static inline char * _dl_strstr(const char *s1, const char *s2)
++static __always_inline char * _dl_strstr(const char *s1, const char *s2)
+ {
+-    register const char *s = s1;
+-    register const char *p = s2;
++      register const char *s = s1;
++      register const char *p = s2;
+-    do {
+-        if (!*p) {
+-          return (char *) s1;;
+-      }
+-      if (*p == *s) {
+-          ++p;
+-          ++s;
+-      } else {
+-          p = s2;
+-          if (!*s) {
+-            return NULL;
+-          }
+-          s = ++s1;
+-      }
+-    } while (1);
++      do {
++              if (!*p)
++                      return (char *) s1;;
++              if (*p == *s) {
++                      ++p;
++                      ++s;
++              } else {
++                      p = s2;
++                      if (!*s)
++                              return NULL;
++                      s = ++s1;
++              }
++      } while (1);
+ }
+-static inline void * _dl_memcpy(void * dst, const void * src, size_t len)
++static __always_inline void * _dl_memcpy(void * dst, const void * src, size_t len)
+ {
+       register char *a = dst-1;
+       register const char *b = src-1;
+@@ -163,27 +176,28 @@
+ /* Will generate smaller and faster code due to loop unrolling.*/
+ static __always_inline void * _dl_memset(void *to, int c, size_t n)
+ {
+-        unsigned long chunks;
+-        unsigned long *tmp_to;
++      unsigned long chunks;
++      unsigned long *tmp_to;
+       unsigned char *tmp_char;
+-        chunks = n / 4;
+-        tmp_to = to + n;
+-        c = c << 8 | c;
+-        c = c << 16 | c;
+-        if (!chunks)
+-                goto lessthan4;
+-        do {
+-                *--tmp_to = c;
+-        } while (--chunks);
+- lessthan4:
+-        n = n % 4;
+-        if (!n ) return to;
+-        tmp_char = (unsigned char *)tmp_to;
+-        do {
+-                *--tmp_char = c;
+-        } while (--n);
+-        return to;
++      chunks = n / 4;
++      tmp_to = to + n;
++      c = c << 8 | c;
++      c = c << 16 | c;
++      if (!chunks)
++              goto lessthan4;
++      do {
++              *--tmp_to = c;
++      } while (--chunks);
++lessthan4:
++      n = n % 4;
++      if (!n)
++              return to;
++      tmp_char = (unsigned char *)tmp_to;
++      do {
++              *--tmp_char = c;
++      } while (--n);
++      return to;
+ }
+ #else
+ static __always_inline void * _dl_memset(void * str,int c,size_t len)
+@@ -225,10 +239,10 @@
+       char *p = &local[22];
+       *--p = '\0';
+       do {
+-          char temp;
+-          do_rem(temp, i, 10);
+-          *--p = '0' + temp;
+-          i /= 10;
++              char temp;
++              do_rem(temp, i, 10);
++              *--p = '0' + temp;
++              do_div_10(i, temp);
+       } while (i > 0);
+       return p;
+ }
+@@ -242,9 +256,9 @@
+       do {
+               char temp = i & 0xf;
+               if (temp <= 0x09)
+-                  *--p = '0' + temp;
++                      *--p = '0' + temp;
+               else
+-                  *--p = 'a' - 0x0a + temp;
++                      *--p = 'a' - 0x0a + temp;
+               i >>= 4;
+       } while (i > 0);
+       *--p = 'x';
+@@ -270,8 +284,8 @@
+ /* On some arches constant strings are referenced through the GOT.
+  * This requires that load_addr must already be defined... */
+-#if defined(mc68000) || defined(__arm__) || defined(__thumb__) || defined(__mips__)   \
+-                     || defined(__sh__) ||  defined(__powerpc__)
++#if defined(mc68000)  || defined(__arm__) || defined(__thumb__) || \
++    defined(__mips__) || defined(__sh__)  || defined(__powerpc__)
+ # define CONSTANT_STRING_GOT_FIXUP(X) \
+       if ((X) < (const char *) load_addr) (X) += load_addr
+ # define NO_EARLY_SEND_STDERR
+@@ -318,7 +332,7 @@
+       do { \
+               do_rem(v, (X), 10); \
+               *--tmp2 = '0' + v; \
+-              (X) /= 10; \
++              do_div_10((X), v); \
+       } while ((X) > 0); \
+       _dl_write(2, tmp2, tmp1 - tmp2 + sizeof(tmp) - 1); \
+ }
diff --git a/packages/uclibc/uclibc-0.9.28/dl-sysdep.h.patch b/packages/uclibc/uclibc-0.9.28/dl-sysdep.h.patch
new file mode 100644 (file)
index 0000000..0d271a9
--- /dev/null
@@ -0,0 +1,10 @@
+--- uClibc-0.9.28/ldso/ldso/arm/dl-sysdep.h.orig       2006-08-14 17:22:50.000000000 +0200
++++ uClibc-0.9.28/ldso/ldso/arm/dl-sysdep.h    2006-08-14 17:23:45.000000000 +0200
+@@ -43,6 +43,7 @@
+       return m;
+ }
+ #define do_rem(result, n, base) ((result) = arm_modulus(n, base))
++#define do_div_10(result, remain) ((result) = (((result) - (remain)) / 2) * -(-1ul / 5ul))
+ /* Here we define the magic numbers that this dynamic loader should accept */
+ #define MAGIC1 EM_ARM
index a5d4095..1801af2 100644 (file)
@@ -1,5 +1,5 @@
 DEFAULT_PREFERENCE = "1"
-PR = "r4"
+PR = "r5"
 
 require uclibc.inc
 
@@ -31,6 +31,8 @@ SRC_URI += " file://thumb-sysnum-h.patch;patch=1"
 SRC_URI += " file://thumb-asm-swi.patch;patch=1"
 SRC_URI += " file://thumb-call-via-rx.patch;patch=1"
 SRC_URI += " file://dl-startup.h.patch;patch=1"
+SRC_URI += " file://dl-string.h.patch;patch=1"
+SRC_URI += " file://dl-sysdep.h.patch;patch=1"
 #
 # This is a core change and is controversial, maybe even wrong
 # on some architectures