From ee4a5352a20cad49e0913f46e18bf9e96287969b Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Fri, 27 Jan 2006 10:00:40 +0000 Subject: [PATCH] add gcc4 fix for mips SVN-Revision: 3053 --- .../generic-2.6/patches/005-gcc4_fix.patch | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 openwrt/target/linux/generic-2.6/patches/005-gcc4_fix.patch diff --git a/openwrt/target/linux/generic-2.6/patches/005-gcc4_fix.patch b/openwrt/target/linux/generic-2.6/patches/005-gcc4_fix.patch new file mode 100644 index 0000000000..ff1f4bec10 --- /dev/null +++ b/openwrt/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 ++#include ++ ++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 ++#include ++ ++#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 ++#include ++ ++/* 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 ++#include ++ ++/* 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 + -- 2.25.1