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 | c87ee2f69072af6a0ab2607afedbbc4d6edb98b8 (patch) | |
tree | 02b2896748b3fd17f3b1441c794381cbadb45d16 /openwrt/target/linux/generic-2.6 | |
parent | b1d7fb7b1690cde31f4cae029aabf65ea6224ca5 (diff) |
add gcc4 fix for mips
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@3053 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'openwrt/target/linux/generic-2.6')
-rw-r--r-- | openwrt/target/linux/generic-2.6/patches/005-gcc4_fix.patch | 173 |
1 files changed, 173 insertions, 0 deletions
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 000000000..ff1f4bec1 --- /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 <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 + |