diff options
| author | kaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-01-27 10:00:40 +0000 | 
|---|---|---|
| committer | kaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-01-27 10:00:40 +0000 | 
| commit | 7b14666f6f0e9ac8a28984cdfbb048274b375eb4 (patch) | |
| tree | c1a353aca53277871d97e36480ea2582c90cfa22 /target/linux/generic-2.6/patches/005-gcc4_fix.patch | |
| parent | 5d543c881646b6ccf5c80341f192e802e0df0d52 (diff) | |
add gcc4 fix for mips
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@3053 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic-2.6/patches/005-gcc4_fix.patch')
| -rw-r--r-- | target/linux/generic-2.6/patches/005-gcc4_fix.patch | 173 | 
1 files changed, 173 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches/005-gcc4_fix.patch b/target/linux/generic-2.6/patches/005-gcc4_fix.patch new file mode 100644 index 000000000..ff1f4bec1 --- /dev/null +++ b/target/linux/generic-2.6/patches/005-gcc4_fix.patch @@ -0,0 +1,173 @@ +diff -Nur linux-2.6.15.1/include/asm-mips/libgcc.h linux-2.6.15.1-openwrt/include/asm-mips/libgcc.h +--- linux-2.6.15.1/include/asm-mips/libgcc.h	1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15.1-openwrt/include/asm-mips/libgcc.h	2006-01-20 10:32:28.000000000 +0100 +@@ -0,0 +1,8 @@ ++#ifndef __ASM_LIBGCC_H ++#define __ASM_LIBGCC_H ++ ++#define ARCH_NEEDS_ashldi3 ++#define ARCH_NEEDS_ashrdi3 ++#define ARCH_NEEDS_lshrdi3 ++ ++#endif /* __ASM_LIBGCC_H */ +diff -Nur linux-2.6.15.1/include/linux/libgcc.h linux-2.6.15.1-openwrt/include/linux/libgcc.h +--- linux-2.6.15.1/include/linux/libgcc.h	1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15.1-openwrt/include/linux/libgcc.h	2006-01-20 10:33:38.000000000 +0100 +@@ -0,0 +1,32 @@ ++#ifndef __LINUX_LIBGCC_H ++#define __LINUX_LIBGCC_H ++ ++#include <asm/byteorder.h> ++#include <asm/libgcc.h> ++ ++typedef long long DWtype; ++typedef int Wtype; ++typedef unsigned int UWtype; ++typedef int word_type __attribute__ ((mode (__word__))); ++ ++#define BITS_PER_UNIT 8 ++ ++#ifdef __BIG_ENDIAN ++struct DWstruct { ++       Wtype high, low; ++}; ++#elif defined(__LITTLE_ENDIAN) ++struct DWstruct { ++       Wtype low, high; ++}; ++#else ++#error I feel sick. ++#endif ++ ++typedef union ++{ ++       struct DWstruct s; ++       DWtype ll; ++} DWunion; ++ ++#endif /* __LINUX_LIBGCC_H */ +diff -Nur linux-2.6.15.1/lib/ashldi3.c linux-2.6.15.1-openwrt/lib/ashldi3.c +--- linux-2.6.15.1/lib/ashldi3.c	1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15.1-openwrt/lib/ashldi3.c	2006-01-20 10:38:41.000000000 +0100 +@@ -0,0 +1,32 @@ ++#include <linux/libgcc.h> ++#include <linux/module.h> ++ ++#ifdef ARCH_NEEDS_ashldi3 ++ ++DWtype __ashldi3(DWtype u, word_type b) ++{ ++       DWunion uu, w; ++       word_type bm; ++ ++       if (b == 0) ++               return u; ++ ++       uu.ll = u; ++       bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; ++ ++       if (bm <= 0) { ++               w.s.low = 0; ++               w.s.high = (UWtype) uu.s.low << -bm; ++       } else { ++               const UWtype carries = (UWtype) uu.s.low >> bm; ++ ++               w.s.low = (UWtype) uu.s.low << b; ++               w.s.high = ((UWtype) uu.s.high << b) | carries; ++       } ++ ++       return w.ll; ++} ++ ++EXPORT_SYMBOL(__ashldi3); ++ ++#endif /* ARCH_NEEDS_ashldi3 */ +diff -Nur linux-2.6.15.1/lib/ashrdi3.c linux-2.6.15.1-openwrt/lib/ashrdi3.c +--- linux-2.6.15.1/lib/ashrdi3.c	1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15.1-openwrt/lib/ashrdi3.c	2006-01-20 10:39:29.000000000 +0100 +@@ -0,0 +1,36 @@ ++#include <linux/libgcc.h> ++#include <linux/module.h> ++ ++/* Unless shift functions are defined with full ANSI prototypes, ++   parameter b will be promoted to int if word_type is smaller than an int.  */ ++#ifdef ARCH_NEEDS_ashrdi3 ++ ++DWtype __ashrdi3(DWtype u, word_type b) ++{ ++       DWunion uu, w; ++       word_type bm; ++ ++       if (b == 0) ++               return u; ++ ++       uu.ll = u; ++       bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; ++ ++       if (bm <= 0) { ++               /* w.s.high = 1..1 or 0..0 */ ++               w.s.high = ++                   uu.s.high >> (sizeof(Wtype) * BITS_PER_UNIT - 1); ++               w.s.low = uu.s.high >> -bm; ++       } else { ++               const UWtype carries = (UWtype) uu.s.high << bm; ++ ++               w.s.high = uu.s.high >> b; ++               w.s.low = ((UWtype) uu.s.low >> b) | carries; ++       } ++ ++       return w.ll; ++} ++ ++EXPORT_SYMBOL(__ashrdi3); ++ ++#endif /* ARCH_NEEDS_ashrdi3 */ +diff -Nur linux-2.6.15.1/lib/lshrdi3.c linux-2.6.15.1-openwrt/lib/lshrdi3.c +--- linux-2.6.15.1/lib/lshrdi3.c	1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15.1-openwrt/lib/lshrdi3.c	2006-01-20 10:40:10.000000000 +0100 +@@ -0,0 +1,34 @@ ++#include <linux/libgcc.h> ++#include <linux/module.h> ++ ++/* Unless shift functions are defined with full ANSI prototypes, ++   parameter b will be promoted to int if word_type is smaller than an int.  */ ++#ifdef ARCH_NEEDS_lshrdi3 ++ ++DWtype __lshrdi3(DWtype u, word_type b) ++{ ++       DWunion uu, w; ++       word_type bm; ++ ++       if (b == 0) ++               return u; ++ ++       uu.ll = u; ++       bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; ++ ++       if (bm <= 0) { ++               w.s.high = 0; ++               w.s.low = (UWtype) uu.s.high >> -bm; ++       } else { ++               const UWtype carries = (UWtype) uu.s.high << bm; ++ ++               w.s.high = (UWtype) uu.s.high >> b; ++               w.s.low = ((UWtype) uu.s.low >> b) | carries; ++       } ++ ++       return w.ll; ++} ++ ++EXPORT_SYMBOL(__lshrdi3); ++ ++#endif /* ARCH_NEEDS_lshrdi3 */ +diff -Nur linux-2.6.15.1/lib/Makefile linux-2.6.15.1-openwrt/lib/Makefile +--- linux-2.6.15.1/lib/Makefile	2006-01-15 07:16:02.000000000 +0100 ++++ linux-2.6.15.1-openwrt/lib/Makefile	2006-01-20 10:34:19.000000000 +0100 +@@ -8,6 +8,7 @@ + 	 sha1.o +  + lib-y	+= kobject.o kref.o kobject_uevent.o klist.o ++lib-y	+= ashldi3.o ashrdi3.o lshrdi3.o +  + obj-y += sort.o parser.o halfmd4.o +   | 
