From 76d90c2ed2956d27e0c8af8fb0b76b3069228d5f Mon Sep 17 00:00:00 2001 From: Mike Baker Date: Sun, 16 Jan 2005 11:43:02 +0000 Subject: [PATCH] Initial revision SVN-Revision: 197 --- openwrt/.cvsignore | 6 + openwrt/.defconfig | 113 + openwrt/Config.in | 109 + openwrt/Makefile | 191 + openwrt/docs/README | 18 + openwrt/docs/buildroot-documentation.html | 644 +++ openwrt/docs/stylesheet.css | 65 + openwrt/package/Config.in | 15 + openwrt/package/Makefile.in | 64 + openwrt/package/bridge/Config.in | 8 + openwrt/package/bridge/Makefile.in | 3 + openwrt/package/bridge/bridge.mk | 61 + openwrt/package/bridge/bridge.patch | 11 + openwrt/package/busybox/Config.in | 19 + openwrt/package/busybox/Makefile.in | 3 + openwrt/package/busybox/busybox.config | 464 +++ openwrt/package/busybox/busybox.mk | 62 + openwrt/package/config/.cvsignore | 8 + openwrt/package/config/Config.in | 8 + openwrt/package/config/Kconfig-language.txt | 255 ++ openwrt/package/config/Makefile | 112 + openwrt/package/config/Makefile.in | 3 + openwrt/package/config/checklist.c | 372 ++ openwrt/package/config/colors.h | 161 + openwrt/package/config/conf.c | 583 +++ openwrt/package/config/confdata.c | 447 ++ openwrt/package/config/dialog.h | 196 + openwrt/package/config/expr.c | 1089 +++++ openwrt/package/config/expr.h | 193 + openwrt/package/config/inputbox.c | 240 ++ openwrt/package/config/lex.zconf.c_shipped | 3688 +++++++++++++++++ openwrt/package/config/lkc.h | 113 + openwrt/package/config/lkc_proto.h | 39 + openwrt/package/config/mconf.c | 713 ++++ openwrt/package/config/menu.c | 431 ++ openwrt/package/config/menubox.c | 436 ++ openwrt/package/config/msgbox.c | 85 + openwrt/package/config/symbol.c | 771 ++++ openwrt/package/config/textbox.c | 556 +++ openwrt/package/config/util.c | 375 ++ openwrt/package/config/yesno.c | 118 + openwrt/package/config/zconf.l | 366 ++ openwrt/package/config/zconf.tab.c_shipped | 2127 ++++++++++ openwrt/package/config/zconf.tab.h_shipped | 125 + openwrt/package/config/zconf.y | 687 +++ openwrt/package/dnsmasq/Config.in | 8 + openwrt/package/dnsmasq/Makefile.in | 3 + openwrt/package/dnsmasq/dnsmasq.mk | 50 + .../package/dnsmasq/dnsmasq1-100-bugfix.patch | 25 + .../package/dnsmasq/dnsmasq2-100-config.patch | 49 + openwrt/package/dropbear_sshd/Config.in | 7 + openwrt/package/dropbear_sshd/Makefile.in | 3 + .../package/dropbear_sshd/dropbear-init.patch | 59 + .../package/dropbear_sshd/dropbear_sshd.mk | 79 + openwrt/package/iptables/Config.in | 7 + openwrt/package/iptables/Makefile.in | 3 + openwrt/package/iptables/iptables.mk | 51 + openwrt/package/linux/Config.in | 7 + openwrt/package/linux/Makefile.in | 3 + .../kernel-patches/001-linux-2.4.patch.bz2 | Bin 0 -> 428187 bytes .../kernel-patches/003_kbuild_fixes.diff.bz2 | Bin 0 -> 1091 bytes .../linux/kernel-patches/004_386_emu.diff.bz2 | Bin 0 -> 5292 bytes .../005_modularize_vesafb.diff.bz2 | Bin 0 -> 710 bytes .../kernel-patches/006_init_unshare.diff.bz2 | Bin 0 -> 299 bytes .../007-scsi_add_remove_single.bz2 | Bin 0 -> 3988 bytes .../linux/kernel-patches/008-ieee1394-fix.bz2 | Bin 0 -> 390 bytes .../kernel-patches/009-always-inline.bz2 | Bin 0 -> 468 bytes .../kernel-patches/010-optimize-for-size.bz2 | Bin 0 -> 1201 bytes .../kernel-patches/012-x86-check_gcc.bz2 | Bin 0 -> 329 bytes .../kernel-patches/015_cramfs_initrd.diff.bz2 | Bin 0 -> 406 bytes .../linux/kernel-patches/017-printk.bz2 | Bin 0 -> 336 bytes .../kernel-patches/018-slab-loop-init.bz2 | Bin 0 -> 268 bytes .../kernel-patches/041-changeloop.patch.bz2 | Bin 0 -> 2783 bytes .../kernel-patches/042-loopfixes.patch.bz2 | Bin 0 -> 640 bytes .../linux/kernel-patches/044-streaming_io.bz2 | Bin 0 -> 1743 bytes .../kernel-patches/062-silence-blk-queue.bz2 | Bin 0 -> 374 bytes .../kernel-patches/063-silence.kbd.patch.bz2 | Bin 0 -> 506 bytes .../linux/kernel-patches/064-shutup-md.bz2 | Bin 0 -> 501 bytes .../kernel-patches/067-squashfs2.patch.bz2 | Bin 0 -> 12850 bytes .../linux/kernel-patches/076-nmap-freak.bz2 | Bin 0 -> 1577 bytes .../kernel-patches/077-orinoco-0.13e.bz2 | Bin 0 -> 7387 bytes .../linux/kernel-patches/078-hostap.bz2 | Bin 0 -> 113612 bytes .../linux/kernel-patches/079-jiffies64.bz2 | Bin 0 -> 4774 bytes .../kernel-patches/089-no-touch-makedep.bz2 | Bin 0 -> 858 bytes .../linux/kernel-patches/100_VERSION.bz2 | Bin 0 -> 235 bytes openwrt/package/linux/linux.config | 853 ++++ openwrt/package/linux/linux.mk | 115 + openwrt/package/sed/Config.in | 9 + openwrt/package/sed/Makefile.in | 3 + openwrt/package/sed/sed.mk | 136 + openwrt/package/sed/sedcheck.sh | 21 + openwrt/target/Config.in | 8 + openwrt/target/Makefile.in | 1 + openwrt/target/default/device_table.txt | 162 + openwrt/target/default/skel.tar.gz | Bin 0 -> 4846 bytes openwrt/target/default/target_skeleton/etc/TZ | 1 + .../target/default/target_skeleton/etc/fstab | 8 + .../target/default/target_skeleton/etc/group | 10 + .../default/target_skeleton/etc/hostname | 1 + .../target/default/target_skeleton/etc/hosts | 1 + .../target_skeleton/etc/init.d/S20urandom | 44 + .../target_skeleton/etc/init.d/S40network | 35 + .../default/target_skeleton/etc/init.d/rcS | 27 + .../default/target_skeleton/etc/inittab | 47 + .../default/target_skeleton/etc/inputrc | 44 + .../target/default/target_skeleton/etc/issue | 4 + .../target_skeleton/etc/network/interfaces | 4 + .../target/default/target_skeleton/etc/passwd | 13 + .../default/target_skeleton/etc/profile | 48 + .../default/target_skeleton/etc/protocols | 31 + .../default/target_skeleton/etc/random-seed | Bin 0 -> 512 bytes .../default/target_skeleton/etc/resolv.conf | 2 + .../default/target_skeleton/etc/securetty | 12 + .../default/target_skeleton/etc/services | 302 ++ .../target/default/target_skeleton/etc/shadow | 12 + .../target_skeleton/root/.bash_history | 0 .../default/target_skeleton/root/.bash_logout | 7 + .../target_skeleton/root/.bash_profile | 15 + .../default/target_skeleton/root/.bashrc | 48 + .../target_skeleton/usr/share/terminfo/a/ansi | Bin 0 -> 1450 bytes .../target_skeleton/usr/share/terminfo/d/dumb | Bin 0 -> 308 bytes .../usr/share/terminfo/l/linux | Bin 0 -> 1551 bytes .../target_skeleton/usr/share/terminfo/r/rxvt | Bin 0 -> 1627 bytes .../usr/share/terminfo/s/screen | Bin 0 -> 1318 bytes .../usr/share/terminfo/s/screen-w | Bin 0 -> 1334 bytes .../target_skeleton/usr/share/terminfo/s/sun | Bin 0 -> 1019 bytes .../usr/share/terminfo/v/vt100 | Bin 0 -> 1143 bytes .../usr/share/terminfo/v/vt220 | Bin 0 -> 975 bytes .../target_skeleton/usr/share/terminfo/v/vt52 | Bin 0 -> 461 bytes .../usr/share/terminfo/x/xterm | Bin 0 -> 1366 bytes .../usr/share/terminfo/x/xterm-xfree86 | Bin 0 -> 1840 bytes .../usr/share/udhcpc/default.script | 39 + openwrt/target/jffs2/Config.in | 6 + openwrt/target/jffs2/Makefile.in | 3 + openwrt/target/jffs2/jffs2root.mk | 50 + openwrt/toolchain/Config.in | 57 + openwrt/toolchain/Makefile.in | 7 + .../binutils/2.14.90.0.6/001-debian.patch | 185 + .../2.14.90.0.6/100-uclibc-conf.patch | 646 +++ .../2.14.90.0.6/200-build_modules.patch | 31 + .../binutils/2.14.90.0.6/210-cflags.patch | 32 + .../binutils/2.14.90.0.7/001-debian.patch | 2394 +++++++++++ .../2.14.90.0.7/100-uclibc-conf.patch | 646 +++ .../2.14.90.0.7/200-build_modules.patch | 31 + .../binutils/2.14.90.0.7/210-cflags.patch | 32 + .../2.14.90.0.7/600-arm-textrel.patch | 63 + .../binutils/2.14.90.0.8/001-debian.patch | 142 + .../2.14.90.0.8/100-uclibc-conf.patch | 630 +++ .../2.14.90.0.8/600-arm-textrel.patch | 63 + .../2.15.90.0.1.1/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.1.1/600-arm-textrel.patch | 63 + .../2.15.90.0.1/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.1/600-arm-textrel.patch | 63 + .../2.15.90.0.2/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.2/600-arm-textrel.patch | 63 + .../2.15.90.0.3/100-uclibc-conf.patch | 692 ++++ .../binutils/2.15.90.0.3/210-cflags.patch | 32 + .../2.15.90.0.3/500-branch-likely.patch | 10 + .../2.15.90.0.3/600-arm-textrel.patch | 63 + .../2.15.91.0.1/100-uclibc-conf.patch | 692 ++++ .../2.15.91.0.1/600-arm-textrel.patch | 63 + .../2.15.91.0.2/100-uclibc-conf.patch | 722 ++++ .../2.15.91.0.2/500-branch-likely.patch | 10 + .../2.15.91.0.2/600-arm-textrel.patch | 63 + .../700-binutils-20040817-linkonce.patch | 118 + .../701-binutils-dup-sections.patch | 68 + .../702-binutils-skip-comments.patch | 101 + .../2.15.92.0.2/100-uclibc-conf.patch | 724 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + .../300-117_mips_symbolic_link.patch | 42 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../2.15.92.0.2/600-arm-textrel.patch | 54 + .../702-binutils-skip-comments.patch | 101 + .../2.15.94.0.1/100-uclibc-conf.patch | 734 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../702-binutils-skip-comments.patch | 101 + .../2.15.94.0.2/100-uclibc-conf.patch | 749 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../702-binutils-skip-comments.patch | 101 + .../binutils/2.15/100-uclibc-conf.patch | 692 ++++ .../binutils/2.15/600-arm-textrel.patch | 63 + openwrt/toolchain/binutils/Config.in | 66 + openwrt/toolchain/binutils/Makefile.in | 1 + openwrt/toolchain/binutils/binutils.mk | 134 + openwrt/toolchain/ccache/Config.in | 10 + openwrt/toolchain/ccache/Config.in.2 | 8 + openwrt/toolchain/ccache/Makefile.in | 6 + openwrt/toolchain/ccache/ccache.mk | 151 + .../gcc/2.95/050-debian-subset.patch.bz2 | Bin 0 -> 125295 bytes .../toolchain/gcc/2.95/100-uclibc-conf.patch | 291 ++ .../toolchain/gcc/2.95/STLport-4.5.3.patch | 407 ++ .../toolchain/gcc/3.3.3/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.3/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.3/120-softfloat.patch | 14 + .../gcc/3.3.3/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.3/500-loop.patch | 10 + .../toolchain/gcc/3.3.4/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.4/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.4/120-softfloat.patch | 14 + .../gcc/3.3.4/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.4/500-loop.patch | 10 + .../toolchain/gcc/3.3.4/specs-arm-soft-float | 124 + .../toolchain/gcc/3.3.4/specs-mips-soft-float | 145 + .../gcc/3.3.4/specs-mipsel-soft-float | 145 + .../gcc/3.3.4/specs-powerpc-soft-float | 352 ++ .../toolchain/gcc/3.3.5/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.5/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.5/120-softfloat.patch | 14 + .../gcc/3.3.5/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.5/500-loop.patch | 10 + .../toolchain/gcc/3.3.5/specs-arm-soft-float | 124 + .../toolchain/gcc/3.3.5/specs-mips-soft-float | 145 + .../gcc/3.3.5/specs-mipsel-soft-float | 145 + .../gcc/3.3.5/specs-powerpc-soft-float | 352 ++ .../toolchain/gcc/3.4.0/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.0/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.0/arm-softfloat.patch.conditional | 256 ++ .../toolchain/gcc/3.4.1/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.1/200-uclibc-locale.patch | 3241 +++++++++++++++ .../gcc/3.4.1/400-mips-delay-slot.patch | 46 + .../gcc/3.4.1/800-arm-bigendian.patch | 70 + .../gcc/3.4.1/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.1/arm-softfloat.patch.conditional | 270 ++ .../toolchain/gcc/3.4.2/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.2/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.2/300-libstdc++-pic.patch | 47 + openwrt/toolchain/gcc/3.4.2/300-pr15526.patch | 53 + openwrt/toolchain/gcc/3.4.2/300-pr17541.patch | 234 ++ openwrt/toolchain/gcc/3.4.2/300-pr17976.patch | 106 + .../gcc/3.4.2/400-mips-pr17565.patch | 102 + .../gcc/3.4.2/401-ppc-eabi-typo.patch | 20 + .../gcc/3.4.2/402-mips-pr17770.patch | 12 + .../3.4.2/600-gcc34-arm-ldm-peephole.patch | 79 + .../gcc/3.4.2/601-gcc34-arm-ldm.patch | 119 + .../3.4.2/602-sdk-libstdc++-includes.patch | 22 + .../toolchain/gcc/3.4.2/700-pr15068-fix.patch | 44 + .../gcc/3.4.2/800-arm-bigendian.patch | 70 + .../gcc/3.4.2/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.2/arm-softfloat.patch.conditional | 270 ++ .../toolchain/gcc/3.4.3/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.3/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.3/300-libstdc++-pic.patch | 47 + .../3.4.3/600-gcc34-arm-ldm-peephole.patch | 79 + .../gcc/3.4.3/601-gcc34-arm-ldm.patch | 119 + .../3.4.3/602-sdk-libstdc++-includes.patch | 22 + .../toolchain/gcc/3.4.3/700-pr15068-fix.patch | 44 + .../gcc/3.4.3/800-arm-bigendian.patch | 70 + .../gcc/3.4.3/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.3/arm-softfloat.patch.conditional | 270 ++ openwrt/toolchain/gcc/Config.in | 76 + openwrt/toolchain/gcc/Config.in.2 | 6 + openwrt/toolchain/gcc/Makefile.in | 26 + openwrt/toolchain/gcc/gcc-uclibc-2.95.mk | 277 ++ openwrt/toolchain/gcc/gcc-uclibc-3.x.mk | 321 ++ .../toolchain/gcc/i386-gcc-soft-float.patch | 61 + .../toolchain/gdb/5.3/050-debian-subset.patch | 633 +++ openwrt/toolchain/gdb/5.3/100-uclibc.patch | 154 + .../toolchain/gdb/6.1.1/100-uclibc-conf.patch | 290 ++ .../gdb/6.1.1/200-uclibc-readline-conf.patch | 15 + .../toolchain/gdb/6.2.1/100-uclibc-conf.patch | 290 ++ .../gdb/6.2.1/200-uclibc-readline-conf.patch | 15 + .../gdb/6.2.1/400-mips-coredump.patch | 28 + .../toolchain/gdb/6.2/100-uclibc-conf.patch | 290 ++ .../gdb/6.2/200-uclibc-readline-conf.patch | 15 + openwrt/toolchain/gdb/Config.in | 49 + openwrt/toolchain/gdb/Makefile.in | 10 + openwrt/toolchain/gdb/gdb.mk | 189 + openwrt/toolchain/patch-kernel.sh | 53 + openwrt/toolchain/uClibc/Config.in | 23 + openwrt/toolchain/uClibc/uClibc.config | 150 + openwrt/toolchain/uClibc/uClibc.config-locale | 142 + openwrt/toolchain/uClibc/uclibc.mk | 167 + 280 files changed, 69781 insertions(+) create mode 100644 openwrt/.cvsignore create mode 100644 openwrt/.defconfig create mode 100644 openwrt/Config.in create mode 100644 openwrt/Makefile create mode 100644 openwrt/docs/README create mode 100644 openwrt/docs/buildroot-documentation.html create mode 100644 openwrt/docs/stylesheet.css create mode 100644 openwrt/package/Config.in create mode 100644 openwrt/package/Makefile.in create mode 100644 openwrt/package/bridge/Config.in create mode 100644 openwrt/package/bridge/Makefile.in create mode 100644 openwrt/package/bridge/bridge.mk create mode 100644 openwrt/package/bridge/bridge.patch create mode 100644 openwrt/package/busybox/Config.in create mode 100644 openwrt/package/busybox/Makefile.in create mode 100644 openwrt/package/busybox/busybox.config create mode 100644 openwrt/package/busybox/busybox.mk create mode 100644 openwrt/package/config/.cvsignore create mode 100644 openwrt/package/config/Config.in create mode 100644 openwrt/package/config/Kconfig-language.txt create mode 100644 openwrt/package/config/Makefile create mode 100644 openwrt/package/config/Makefile.in create mode 100644 openwrt/package/config/checklist.c create mode 100644 openwrt/package/config/colors.h create mode 100644 openwrt/package/config/conf.c create mode 100644 openwrt/package/config/confdata.c create mode 100644 openwrt/package/config/dialog.h create mode 100644 openwrt/package/config/expr.c create mode 100644 openwrt/package/config/expr.h create mode 100644 openwrt/package/config/inputbox.c create mode 100644 openwrt/package/config/lex.zconf.c_shipped create mode 100644 openwrt/package/config/lkc.h create mode 100644 openwrt/package/config/lkc_proto.h create mode 100644 openwrt/package/config/mconf.c create mode 100644 openwrt/package/config/menu.c create mode 100644 openwrt/package/config/menubox.c create mode 100644 openwrt/package/config/msgbox.c create mode 100644 openwrt/package/config/symbol.c create mode 100644 openwrt/package/config/textbox.c create mode 100644 openwrt/package/config/util.c create mode 100644 openwrt/package/config/yesno.c create mode 100644 openwrt/package/config/zconf.l create mode 100644 openwrt/package/config/zconf.tab.c_shipped create mode 100644 openwrt/package/config/zconf.tab.h_shipped create mode 100644 openwrt/package/config/zconf.y create mode 100644 openwrt/package/dnsmasq/Config.in create mode 100644 openwrt/package/dnsmasq/Makefile.in create mode 100644 openwrt/package/dnsmasq/dnsmasq.mk create mode 100644 openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch create mode 100644 openwrt/package/dnsmasq/dnsmasq2-100-config.patch create mode 100644 openwrt/package/dropbear_sshd/Config.in create mode 100644 openwrt/package/dropbear_sshd/Makefile.in create mode 100644 openwrt/package/dropbear_sshd/dropbear-init.patch create mode 100644 openwrt/package/dropbear_sshd/dropbear_sshd.mk create mode 100644 openwrt/package/iptables/Config.in create mode 100644 openwrt/package/iptables/Makefile.in create mode 100644 openwrt/package/iptables/iptables.mk create mode 100644 openwrt/package/linux/Config.in create mode 100644 openwrt/package/linux/Makefile.in create mode 100644 openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 create mode 100644 openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 create mode 100644 openwrt/package/linux/kernel-patches/009-always-inline.bz2 create mode 100644 openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 create mode 100644 openwrt/package/linux/kernel-patches/012-x86-check_gcc.bz2 create mode 100644 openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/017-printk.bz2 create mode 100644 openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 create mode 100644 openwrt/package/linux/kernel-patches/041-changeloop.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/044-streaming_io.bz2 create mode 100644 openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 create mode 100644 openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/064-shutup-md.bz2 create mode 100644 openwrt/package/linux/kernel-patches/067-squashfs2.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 create mode 100644 openwrt/package/linux/kernel-patches/077-orinoco-0.13e.bz2 create mode 100644 openwrt/package/linux/kernel-patches/078-hostap.bz2 create mode 100644 openwrt/package/linux/kernel-patches/079-jiffies64.bz2 create mode 100644 openwrt/package/linux/kernel-patches/089-no-touch-makedep.bz2 create mode 100644 openwrt/package/linux/kernel-patches/100_VERSION.bz2 create mode 100644 openwrt/package/linux/linux.config create mode 100644 openwrt/package/linux/linux.mk create mode 100644 openwrt/package/sed/Config.in create mode 100644 openwrt/package/sed/Makefile.in create mode 100644 openwrt/package/sed/sed.mk create mode 100755 openwrt/package/sed/sedcheck.sh create mode 100644 openwrt/target/Config.in create mode 100644 openwrt/target/Makefile.in create mode 100644 openwrt/target/default/device_table.txt create mode 100644 openwrt/target/default/skel.tar.gz create mode 100644 openwrt/target/default/target_skeleton/etc/TZ create mode 100644 openwrt/target/default/target_skeleton/etc/fstab create mode 100644 openwrt/target/default/target_skeleton/etc/group create mode 100644 openwrt/target/default/target_skeleton/etc/hostname create mode 100644 openwrt/target/default/target_skeleton/etc/hosts create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/S20urandom create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/S40network create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/rcS create mode 100644 openwrt/target/default/target_skeleton/etc/inittab create mode 100644 openwrt/target/default/target_skeleton/etc/inputrc create mode 100644 openwrt/target/default/target_skeleton/etc/issue create mode 100644 openwrt/target/default/target_skeleton/etc/network/interfaces create mode 100644 openwrt/target/default/target_skeleton/etc/passwd create mode 100644 openwrt/target/default/target_skeleton/etc/profile create mode 100644 openwrt/target/default/target_skeleton/etc/protocols create mode 100644 openwrt/target/default/target_skeleton/etc/random-seed create mode 100644 openwrt/target/default/target_skeleton/etc/resolv.conf create mode 100644 openwrt/target/default/target_skeleton/etc/securetty create mode 100644 openwrt/target/default/target_skeleton/etc/services create mode 100644 openwrt/target/default/target_skeleton/etc/shadow create mode 100644 openwrt/target/default/target_skeleton/root/.bash_history create mode 100644 openwrt/target/default/target_skeleton/root/.bash_logout create mode 100644 openwrt/target/default/target_skeleton/root/.bash_profile create mode 100644 openwrt/target/default/target_skeleton/root/.bashrc create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt100 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt220 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 create mode 100755 openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script create mode 100644 openwrt/target/jffs2/Config.in create mode 100644 openwrt/target/jffs2/Makefile.in create mode 100644 openwrt/target/jffs2/jffs2root.mk create mode 100644 openwrt/toolchain/Config.in create mode 100644 openwrt/toolchain/Makefile.in create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/Config.in create mode 100644 openwrt/toolchain/binutils/Makefile.in create mode 100644 openwrt/toolchain/binutils/binutils.mk create mode 100644 openwrt/toolchain/ccache/Config.in create mode 100644 openwrt/toolchain/ccache/Config.in.2 create mode 100644 openwrt/toolchain/ccache/Makefile.in create mode 100644 openwrt/toolchain/ccache/ccache.mk create mode 100644 openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 create mode 100644 openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float create mode 100644 openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr15526.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr17541.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr17976.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/Config.in create mode 100644 openwrt/toolchain/gcc/Config.in.2 create mode 100644 openwrt/toolchain/gcc/Makefile.in create mode 100644 openwrt/toolchain/gcc/gcc-uclibc-2.95.mk create mode 100644 openwrt/toolchain/gcc/gcc-uclibc-3.x.mk create mode 100644 openwrt/toolchain/gcc/i386-gcc-soft-float.patch create mode 100644 openwrt/toolchain/gdb/5.3/050-debian-subset.patch create mode 100644 openwrt/toolchain/gdb/5.3/100-uclibc.patch create mode 100644 openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch create mode 100644 openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/Config.in create mode 100644 openwrt/toolchain/gdb/Makefile.in create mode 100644 openwrt/toolchain/gdb/gdb.mk create mode 100755 openwrt/toolchain/patch-kernel.sh create mode 100644 openwrt/toolchain/uClibc/Config.in create mode 100644 openwrt/toolchain/uClibc/uClibc.config create mode 100644 openwrt/toolchain/uClibc/uClibc.config-locale create mode 100644 openwrt/toolchain/uClibc/uclibc.mk diff --git a/openwrt/.cvsignore b/openwrt/.cvsignore new file mode 100644 index 0000000000..60e1751b2e --- /dev/null +++ b/openwrt/.cvsignore @@ -0,0 +1,6 @@ +dl +.config* +.tmpconfig.h +root_fs* +build_* +toolchain_build_* diff --git a/openwrt/.defconfig b/openwrt/.defconfig new file mode 100644 index 0000000000..aba64ee53a --- /dev/null +++ b/openwrt/.defconfig @@ -0,0 +1,113 @@ +# +# Automatically generated make config: don't edit +# +BR2_HAVE_DOT_CONFIG=y +# BR2_arm is not set +# BR2_armeb is not set +# BR2_cris is not set +# BR2_i386 is not set +# BR2_m68k is not set +# BR2_mips is not set +BR2_mipsel=y +# BR2_powerpc is not set +# BR2_sh3 is not set +# BR2_sh3eb is not set +# BR2_sh4 is not set +# BR2_sh4eb is not set +# BR2_sparc is not set +BR2_ARCH="mipsel" + +# +# Build options +# +BR2_WGET="wget --passive-ftp" +# BR2_TAR_VERBOSITY is not set +BR2_STAGING_DIR="$(BUILD_DIR)/staging_dir" +BR2_JLEVEL=1 + +# +# Toolchain Options +# + +# +# uClibc Options +# +BR2_UCLIBC_VERSION_SNAPSHOT=y +BR2_USE_UCLIBC_SNAPSHOT="snapshot" +# BR2_ENABLE_LOCALE is not set + +# +# Binutils Options +# +# BR2_BINUTILS_VERSION_2_14_90_0_6 is not set +# BR2_BINUTILS_VERSION_2_14_90_0_7 is not set +# BR2_BINUTILS_VERSION_2_14_90_0_8 is not set +# BR2_BINUTILS_VERSION_2_15 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_1 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_1_1 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_3 is not set +# BR2_BINUTILS_VERSION_2_15_91_0_1 is not set +# BR2_BINUTILS_VERSION_2_15_91_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_92_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_94_0_1 is not set +BR2_BINUTILS_VERSION_2_15_94_0_2=y +BR2_BINUTILS_VERSION="2.15.94.0.2" + +# +# Gcc Options +# +# BR2_GCC_VERSION_2_95 is not set +# BR2_GCC_VERSION_3_3_3 is not set +# BR2_GCC_VERSION_3_3_4 is not set +# BR2_GCC_VERSION_3_3_5 is not set +# BR2_GCC_VERSION_3_4_0 is not set +# BR2_GCC_VERSION_3_4_1 is not set +# BR2_GCC_VERSION_3_4_2 is not set +BR2_GCC_VERSION_3_4_3=y +BR2_GCC_VERSION="3.4.3" +BR2_GCC_USE_SJLJ_EXCEPTIONS="--enable-sjlj-exceptions" +BR2_EXTRA_GCC_CONFIG_OPTIONS="" +# BR2_INSTALL_LIBSTDCPP is not set + +# +# Ccache Options +# +BR2_CCACHE=y + +# +# Gdb Options +# +# BR2_PACKAGE_GDB is not set +# BR2_PACKAGE_GDB_SERVER is not set + +# +# Common Toolchain Options +# +# BR2_ENABLE_MULTILIB is not set +# BR2_LARGEFILE is not set +BR2_TARGET_OPTIMIZATION="-Os -pipe" + +# +# OpenWrt Package Selection +# + +# +# The default set +# +BR2_PACKAGE_BUSYBOX=y +BR2_PACKAGE_BUSYBOX_SNAPSHOT=y +# BR2_PACKAGE_DNSMASQ is not set +# BR2_PACKAGE_LINUX is not set +# BR2_PACKAGE_IPTABLES is not set +# BR2_PACKAGE_BRIDGE is not set + +# +# Suggested Extras +# +# BR2_PACKAGE_DROPBEAR_SSHD is not set + +# +# Target Filesystem +# +# BR2_TARGET_ROOTFS_JFFS2 is not set diff --git a/openwrt/Config.in b/openwrt/Config.in new file mode 100644 index 0000000000..2b335e68b4 --- /dev/null +++ b/openwrt/Config.in @@ -0,0 +1,109 @@ +# + +mainmenu "Buildroot2 Configuration" + +config BR2_HAVE_DOT_CONFIG + bool + default y + +choice + prompt "Target Architecture" + default BR2_i386 + help + Stuff + +config BR2_arm + bool "arm" + +config BR2_armeb + bool "armeb" + +config BR2_cris + bool "cris" + +config BR2_i386 + bool "i386" + +config BR2_m68k + bool "m68k" + +config BR2_mips + bool "mips" + +config BR2_mipsel + bool "mipsel" + +config BR2_powerpc + bool "powerpc" + +config BR2_sh3 + bool "sh3" + +config BR2_sh3eb + bool "sh3eb" + +config BR2_sh4 + bool "sh4" + +config BR2_sh4eb + bool "sh4eb" + +config BR2_sparc + bool "sparc" + +endchoice + +config BR2_ARCH + string + default "arm" if BR2_arm + default "armeb" if BR2_armeb + default "cris" if BR2_cris + default "i386" if BR2_i386 + default "m68k" if BR2_m68k + default "mips" if BR2_mips + default "mipsel" if BR2_mipsel + default "powerpc" if BR2_powerpc + default "sh3" if BR2_sh3 + default "sh3eb" if BR2_sh3eb + default "sh4" if BR2_sh4 + default "sh4eb" if BR2_sh4eb + default "sparc" if BR2_sparc + + +menu "Build options" + +config BR2_WGET + string "Wget command" + default "wget --passive-ftp -nd" + +config BR2_TAR_VERBOSITY + bool "Tar verbose" + default n + +config BR2_STAGING_DIR + string "Toolchain and header file location?" + default "$(BUILD_DIR)/staging_dir" + help + This is the location where the toolchain will be installed. + Since the toolchain will not work if it is moved from this + location, it is important for people wishing to package up + a uClibc toolchain that this be set to the location in which + the toolchain will be used. + + Most people will leave this set to the default value of + "$(BUILD_DIR)/staging_dir". + +config BR2_JLEVEL + int "Number of jobs to run simultaneously" + default "1" + help + Number of jobs to run simultanesouly + +endmenu + +source "toolchain/Config.in" + +source "package/Config.in" + +source "target/Config.in" + diff --git a/openwrt/Makefile b/openwrt/Makefile new file mode 100644 index 0000000000..5434b0e7f1 --- /dev/null +++ b/openwrt/Makefile @@ -0,0 +1,191 @@ +# Makefile for buildroot2 +# +# Copyright (C) 1999-2004 by Erik Andersen +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#-------------------------------------------------------------- +# Just run 'make menuconfig', configure stuff, then run 'make'. +# You shouldn't need to mess with anything beyond this point... +#-------------------------------------------------------------- +TOPDIR=./ +CONFIG_CONFIG_IN = Config.in +CONFIG_DEFCONFIG = .defconfig +CONFIG = package/config + +noconfig_targets := menuconfig config oldconfig randconfig \ + defconfig allyesconfig allnoconfig release tags + +# Pull in the user's configuration file +ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) +-include $(TOPDIR).config +endif + +ifeq ($(BR2_TAR_VERBOSITY),y) +TAR_OPTIONS=-xvf +else +TAR_OPTIONS=-xf +endif + +ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +############################################################# +# +# The list of stuff to build for the target toolchain +# along with the packages to build for the target. +# +############################################################## +TARGETS:=linux-headers host-sed uclibc-configured binutils gcc uclibc-target-utils +include toolchain/Makefile.in +include toolchain/*/Makefile.in +include package/Makefile.in +include package/*/Makefile.in +include target/Makefile.in +include target/*/Makefile.in + +############################################################# +# +# You should probably leave this stuff alone unless you know +# what you are doing. +# +############################################################# + + + +all: world + +# In this section, we need .config +include .config.cmd + +TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS)) +TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS)) + +world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS) + +.PHONY: all world clean distclean source $(TARGETS) \ + $(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \ + $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR) + +include toolchain/*/*.mk +include package/*/*.mk +include target/*/*.mk + +############################################################# +# +# staging and target directories do NOT list these as +# dependancies anywhere else +# +############################################################# +$(DL_DIR): + @mkdir -p $(DL_DIR) + +$(BUILD_DIR): + @mkdir -p $(BUILD_DIR) + +$(TOOL_BUILD_DIR): + @mkdir -p $(TOOL_BUILD_DIR) + +$(STAGING_DIR): + @mkdir -p $(STAGING_DIR)/lib + @mkdir -p $(STAGING_DIR)/include + @mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) + @ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib + +$(TARGET_DIR): + zcat target/default/skel.tar.gz | tar -C $(BUILD_DIR) -xf - + cp -a target/default/target_skeleton/* $(TARGET_DIR)/ + -find $(TARGET_DIR) -type d -name CVS -exec rm -rf {} \; > /dev/null 2>&1 + +source: $(TARGETS_SOURCE) + +############################################################# +# +# Cleanup and misc junk +# +############################################################# +clean: + rm -rf $(BUILD_DIR) $(IMAGE).* + @$(MAKE) -C $(CONFIG) clean + +distclean: clean + rm -rf $(DL_DIR) $(TOOL_BUILD_DIR) .config + +sourceball: + rm -rf $(BUILD_DIR) + set -e; \ + cd ..; \ + rm -f buildroot.tar.bz2; \ + tar -cvf buildroot.tar buildroot; \ + bzip2 -9 buildroot.tar; \ + + +else # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +all: menuconfig + +# configuration +# --------------------------------------------------------------------------- + +$(CONFIG)/conf: + $(MAKE) -C $(CONFIG) conf + -@if [ ! -f .config ] ; then \ + cp $(CONFIG_DEFCONFIG) .config; \ + fi +$(CONFIG)/mconf: + $(MAKE) -C $(CONFIG) ncurses conf mconf + -@if [ ! -f .config ] ; then \ + cp $(CONFIG_DEFCONFIG) .config; \ + fi + +menuconfig: $(CONFIG)/mconf + @$(CONFIG)/mconf $(CONFIG_CONFIG_IN) + +config: $(CONFIG)/conf + @$(CONFIG)/conf $(CONFIG_CONFIG_IN) + +oldconfig: $(CONFIG)/conf + @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + +randconfig: $(CONFIG)/conf + @$(CONFIG)/conf -r $(CONFIG_CONFIG_IN) + +allyesconfig: $(CONFIG)/conf + #@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN) + #sed -i -e "s/^CONFIG_DEBUG.*/# CONFIG_DEBUG is not set/" .config + @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + +allnoconfig: $(CONFIG)/conf + @$(CONFIG)/conf -n $(CONFIG_CONFIG_IN) + +defconfig: $(CONFIG)/conf + @$(CONFIG)/conf -d $(CONFIG_CONFIG_IN) + +############################################################# +# +# Cleanup and misc junk +# +############################################################# +clean: + @$(MAKE) -C $(CONFIG) clean + +distclean: clean + +endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +.PHONY: dummy subdirs release distclean clean config oldconfig \ + menuconfig tags check test depend + + diff --git a/openwrt/docs/README b/openwrt/docs/README new file mode 100644 index 0000000000..0c7fb4cd4b --- /dev/null +++ b/openwrt/docs/README @@ -0,0 +1,18 @@ +To build and use the buildroot stuff, do the following: + +1) run 'make' +2) select which packages you wish to compile +3) run 'make' +4) wait while it compiles +5) Use your shiney new root filesystem. Depending on which sortof + root filesystem you selecter, you may want to loop mount it, + chroot into it, loop mount it and then nfs mount that on your + target device, burn it to flash, or whatever is appropriate + for your target system. + +You do not need to be root to build or run buildroot. Have fun! + + -Erik + +Please feed suggestions, bug reports, insults, and bribes back to: + Erik Andersen diff --git a/openwrt/docs/buildroot-documentation.html b/openwrt/docs/buildroot-documentation.html new file mode 100644 index 0000000000..8e6c08d047 --- /dev/null +++ b/openwrt/docs/buildroot-documentation.html @@ -0,0 +1,644 @@ + + + + + + Buildroot - Usage and documentation + + + + + +
+
+

Buildroot

+
+ +

Usage and documentation by Thomas Petazzoni. Contributions from + Karsten Kruse, Ned Ludd, Martin Herren.

+ +

Last modification : $Id$

+ + + +

About Buildroot

+ +

Buildroot is a set of Makefiles and patches that allows to easily + generate both a cross-compilation toolchain and a root filesystem for your + target. The cross-compilation toolchain uses uClibc (http://www.uclibc.org/), a tiny C standard + library.

+ +

Buildroot is useful mainly for people working with embedded systems. + Embedded systems often use processors that are not the regular x86 + processors everyone is used to have on his PC. It can be PowerPC + processors, MIPS processors, ARM processors, etc.

+ +

A compilation toolchain is the set of tools that allows to + compile code for your system. It consists of a compiler (in our + case, gcc), binary utils like assembler and linker + (in our case, binutils) and a C standard library (for + example GNU + Libc, uClibc or dietlibc). The system + installed on your development station certainly already has a + compilation toolchain that you can use to compile application that + runs on your system. If you're using a PC, your compilation + toolchain runs on an x86 processor and generates code for a x86 + processor. Under most Linux systems, the compilation toolchain + uses the GNU libc as C standard library. This compilation + toolchain is called the "host compilation toolchain", and more + generally, the machine on which it is running, and on which you're + working is called the "host system". The compilation toolchain is + provided by your distribution, and Buildroot has nothing to do + with it.

+ +

As said above, the compilation toolchain that comes with your system + runs and generates code for the processor of your host system. As your + embedded system has a different processor, you need a cross-compilation + toolchain: it's a compilation toolchain that runs on your host system but + that generates code for your target system (and target processor). For + example, if your host system uses x86 and your target system uses ARM, the + regular compilation toolchain of your host runs on x86 and generates code + for x86, while the cross-compilation toolchain runs on x86 and generates + code for ARM.

+ +

Even if your embedded system uses a x86 processor, you might interested + in Buildroot, for two reasons:

+ +
    +
  • The compilation toolchain of your host certainly uses the GNU Libc + which is a complete but huge C standard library. Instead of using GNU + Libc on your target system, you can use uClibc which is a tiny C standard + library. If you want to use this C library, then you need a compilation + toolchain to generate binaries linked with it. Buildroot can do it for + you.
  • + +
  • Buildroot automates the building of a root filesystem with all needed + tools like busybox. It makes it much easier than doing it by hand.
  • +
+ +

You might wonder why such a tool is needed when you can compile + gcc, binutils, uClibc and all the tools by hand. + Of course, doing so is possible. But dealing with all configure options, + with all problems of every gcc or binutils + version it very time-consuming and uninteresting. Buildroot automates this + process through the use of Makefiles, and has a collection of patches for + each gcc and binutils version to make them work + on most architectures.

+ +

Obtaining Buildroot

+ +

Buildroot is available as daily CVS snapshots or directly using + CVS.

+ +

The latest snapshot is always available at http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2, + and previous snapshots are also available at http://uclibc.org/downloads/snapshots/.

+ +

To download Buildroot using CVS, you can simply follow + the rules described on the "Accessing CVS"-page (http://www.uclibc.org/cvs_anon.html) + of the uClibc website (http://www.uclibc.org), and download the + buildroot CVS module. For the impatient, here's a quick + recipe:

+ +
+ $ cvs -d:pserver:anonymous@uclibc.org:/var/cvs login
+ $ cvs -z3 -d:pserver:anonymous@uclibc.org:/var/cvs co buildroot
+
+ +

Using Buildroot

+ +

Buildroot has a nice configuration tool similar to the one you can find + in the Linux Kernel (http://www.kernel.org/) or in Busybox + (http://www.busybox.org/). Note that + you can run everything as a normal user. There is no need to be root to + configure and use Buildroot. The first step is to run the configuration + assistant:

+ +
+ $ make menuconfig
+
+ +

For each entry of the configuration tool, you can find associated help + that describes the purpose of the entry.

+ +

Once everything is configured, the configuration tool has generated a + .config file that contains the description of your + configuration. It will be used by the Makefiles to do what's needed.

+ +

Let's go:

+ +
+ $ make
+
+ +

This command will download, configure and compile all the selected + tools, and finally generate a target filesystem. The target filesystem will + be named root_fs_ARCH.EXT where ARCH is your + architecture and EXT depends on the type of target filesystem + selected in the Target options section of the configuration + tool.

+ +

Customizing the + target filesystem

+ +

There are two ways to customize the resulting target filesystem:

+ +
    +
  • Customize the target filesystem directly, and rebuild the image. The + target filesystem is available under build_ARCH/root/ where + ARCH is the chosen target architecture. You can simply make + your changes here, and run make afterwards, which will rebuild the target + filesystem image. This method allows to do everything on the target + filesystem, but if you decide to completely rebuild your toolchain and + tools, these changes will be lost.
  • + +
  • Customize the target filesystem skeleton, available under + target/default/target_skeleton/. You can customize + configuration files or other stuff here. However, the full file hierarchy + is not yet present, because it's created during the compilation process. + So you can't do everything on this target filesystem skeleton, but + changes to it remains even you completely rebuild the cross-compilation + toolchain and the tools.
    + You can also customize the target/default/device_table.txt + file which is used by the tools that generate the target filesystem image + to properly set permissions and create device nodes. The + target/default/skel.tar.gz file contains the main + directories of a root filesystem and there is no obvious reason for which + it should be changed. These main directories are in an tarball inside of + inside the skeleton because it contains symlinks that would be broken + otherwise.
  • +
+ +

Customizing the + Busybox configuration

+ +

Busybox is very configurable, and you may want to customize it. You can + follow these simple steps to do it. It's not an optimal way, but it's + simple and it works.

+ +
    +
  1. Make a first compilation of buildroot with busybox without trying to + customize it.
  2. + +
  3. Go into build_ARCH/busybox/ and run make + menuconfig. The nice configuration tool appears and you can + customize everything.
  4. + +
  5. Copy the .config file to + package/busybox/busybox.config so that your customized + configuration will remains even if you remove the cross-compilation + toolchain.
  6. + +
  7. Run the compilation of buildroot again.
  8. +
+ +

Otherwise, you can simply change the + package/busybox/busybox.config file if you know the options + you want to change without using the configuration tool.

+ +

Customizing the uClibc + configuration

+ +

Just like BusyBox, uClibc offers a lot of + configuration options. They allow to select various + functionalities, depending on your needs and limitations.

+ +

The easiest way to modify the configuration of uClibc is to + follow these steps :

+ +
    + +
  1. Make a first compilation of buildroot without trying to + customize uClibc.
  2. + +
  3. Go into the directory + toolchain_build_ARCH/uClibc/ and run make + menuconfig. The nice configuration assistant, similar to + the one used in the Linux Kernel or in Buildroot appears. Make + your configuration as appropriate.
  4. + +
  5. Copy the .config file to + toolchain/uClibc/uClibc.config or + toolchain/uClibc/uClibc.config-locale. The former + is used if you haven't selected locale support in Buildroot + configuration, and the latter is used if you have selected + locale support.
  6. + +
  7. Run the compilation of Buildroot again
  8. + +
+ +

Otherwise, you can simply change + toolchain/uClibc/uClibc.config or + toolchain/uClibc/uClibc.config-locale without running + the configuration assistant.

+ +

How Buildroot + works

+ +

As said above, Buildroot is basically a set of Makefiles that download, + configure and compiles software with the correct options. It also includes + some patches for various software, mainly the ones involved in the + cross-compilation tool chain (gcc, binutils and + uClibc).

+ +

There is basically one Makefile per software, and they are named with + the .mk extension. Makefiles are split into three + sections:

+ +
    +
  • package (in the package/ directory) contains the + Makefiles and associated files for all user-space tools that Buildroot + can compile and add to the target root filesystem. There is one + sub-directory per tool.
  • + +
  • toolchain (in the toolchain/ directory) contains + the Makefiles and associated files for all software related to the + cross-compilation toolchain : binutils, ccache, + gcc, gdb, kernel-headers and + uClibc.
  • + +
  • target (in the target directory) contains the + Makefiles and associated files for software related to the generation of + the target root filesystem image. Four types of filesystems are supported + : ext2, jffs2, cramfs and squashfs. For each of them, there's a + sub-directory with the required files. There is also a + default/ directory that contains the target filesystem + skeleton.
  • +
+ +

Each directory contains at least 3 files :

+ +
    +
  • something.mk is the Makefile that downloads, configures, + compiles and installs the software something.
  • + +
  • Config.in is a part of the configuration tool + description file. It describes the option related to the current + software.
  • + +
  • Makefile.in is a part of Makefile that sets various + variables according to the configuration given through the configuration + tool. For most tools it simply involves adding the name of the tool to + the TARGETS variable.
  • +
+ +

The main Makefile do the job through the following steps (once the + configuration is done):

+ +
    +
  1. Create the download directory (dl/ by default). This is + where the tarballs will be downloaded. It is interesting to know that the + tarballs are in this directory because it may be useful to save them + somewhere to avoid further downloads.
  2. + +
  3. Create the build directory (build_ARCH/ by default, + where ARCH is your architecture). This is where all + user-space tools while be compiled.
  4. + +
  5. Create the toolchain build directory + (toolchain_build_ARCH/ by default, where ARCH + is your architecture). This is where the cross compilation toolchain will + be compiled.
  6. + +
  7. Setup the staging directory (build_ARCH/staging_dir/ by + default). This is where the cross-compilation toolchain will be + installed. If you want to use the same cross-compilation toolchain for + other purposes, such as compiling third-party applications, you can add + build_ARCH/staging_dir/bin to your PATH, and then use + arch-linux-gcc to compile your application. In order to + setup this staging directory, it first removes it, and then it creates + various subdirectories and symlinks inside it.
  8. + +
  9. Create the target directory (build_ARCH/root/ by + default) and the target filesystem skeleton. This directory will contain + the final root filesystem. To setup it up, it first deletes it, then it + uncompress the target/default/skel.tar.gz file to create the + main subdirectories and symlinks, copies the skeleton available in + target/default/target_skeleton and then removes useless + CVS/ directories.
  10. + +
  11. Make the TARGETS dependency. This is where all the job + is done : all Makefile.in files "subscribe" targets into + this global variable, so that the needed tools gets compiled.
  12. +
+ +

Using the + uClibc toolchain

+ +

You may want to compile your own programs or other software + that are not packaged in Buildroot. In order to do this, you can + use the toolchain that was generated by Buildroot.

+ +

The toolchain generated by Buildroot by default is located in + build_ARCH/staging_dir/. The simplest way to use it + is to add build_ARCH/staging_dir/bin/ to your PATH + environnement variable, and then to use + arch-linux-gcc, arch-linux-objdump, + arch-linux-ld, etc.

+ +

For example, you may add the following to your + .bashrc (considering you're building for the MIPS + architecture and that Buildroot is located in + ~/buildroot/) :

+ +
+export PATH=$PATH:~/buildroot/build_mips/bin/
+
+ +

Then you can simply do :

+ +
+mips-linux-gcc -o foo foo.c
+
+ +

Important : do not try to move the toolchain to an other + directory, it won't work. There are some hard-coded paths in the + gcc configuration. If the default toolchain directory + doesn't suit your needs, please refer to the Using the uClibc toolchain outside of + buildroot section.

+ +

Using the + uClibc toolchain outside of buildroot

+ +

By default, the cross-compilation toolchain is generated inside + build_ARCH/staging_dir/. But sometimes, it may be useful to + install it somewhere else, so that it can be used to compile other programs + or by other users. Moving the build_ARCH/staging_dir/ + directory elsewhere is not possible, because they are some hardcoded + paths in the toolchain configuration.

+ +

If you want to use the generated toolchain for other purposes, + you can configure Buildroot to generate it elsewhere using the + option of the configuration tool : Build options -> + Toolchain and header file location, which defaults to + $(BUILD_DIR)/staging_dir/.

+ +

Location of downloaded packages

+ +

It might be useful to know that the various tarballs that are + downloaded by the Makefiles are all stored in the + DL_DIR which by default is the dl + directory. It's useful for example if you want to keep a complete + version of Buildroot which is know to be working with the + associated tarballs. This will allow you to regenerate the + toolchain and the target filesystem with exactly the same + versions.

+ +

Extending Buildroot with + more software

+ +

This section will only consider the case in which you want to + add user-space software.

+ +

Package directory

+ +

First of all, create a directory under the package + directory for your software, for example foo.

+ +

Config.in file

+ +

Then, create a file named Config.in. This file + will contain the portion of options description related to our + foo software that will be used and displayed in the + configuration tool. It should basically contain :

+ +
+config BR2_PACKAGE_FOO
+        bool "foo"
+        default n
+        help
+	     This is a comment that explains what foo is.
+
+ +

Of course, you can add other options to configure particular + things in your software.

+ +

Makefile.in file

+ +

Then, write a Makefile.in file. Basically, this is + a very short Makefile that adds the name of the software to + the list of TARGETS that Buildroot will generate. In + fact, the name of the software is the the identifier of the target + inside the real Makefile that will do everything (download, + compile, install), and that we study below. Back to + Makefile.in, here is an example :

+ +
+ifeq ($(strip $(BR2_PACKAGE_FOO)),y)
+TARGETS+=foo
+endif
+
+ +

As you can see, this short Makefile simply adds the + target foo to the list of targets handled by Buildroot + if software foo was selected using the configuration tool.

+ +

The real Makefile

+ +

Finally, here's the hardest part. Create a file named + foo.mk. It will contain the Makefile rules that + are in charge of downloading, configuring, compiling and installing + the software. Below is an example that we will comment + afterwards.

+ +
+     1  #############################################################
+     2  #
+     3  # foo
+     4  #
+     5  #############################################################
+     6  FOO_VERSION:=1.0
+     7  FOO_SOURCE:=less-$(FOO_VERSION).tar.gz
+     8  FOO_SITE:=http://www.foosoftware.org/downloads
+     9  FOO_DIR:=$(BUILD_DIR)/less-$(FOO_VERSION)
+    10  FOO_BINARY:=foo
+    11  FOO_TARGET_BINARY:=usr/bin/foo
+    12
+    13  $(DL_DIR)/$(FOO_SOURCE):
+    14          $(WGET) -P $(DL_DIR) $(FOO_SITE)/$(FOO_SOURCE)
+    15
+    16  $(FOO_DIR)/.source: $(DL_DIR)/$(FOO_SOURCE)
+    17          zcat $(DL_DIR)/$(FOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+    18          touch $(FOO_DIR)/.source
+    19
+    20  $(FOO_DIR)/.configured: $(FOO_DIR)/.source
+    21          (cd $(FOO_DIR); \
+    22                  $(TARGET_CONFIGURE_OPTS) \
+    23                  CFLAGS="$(TARGET_CFLAGS)" \
+    24                  ./configure \
+    25                  --target=$(GNU_TARGET_NAME) \
+    26                  --host=$(GNU_TARGET_NAME) \
+    27                  --build=$(GNU_HOST_NAME) \
+    28                  --prefix=/usr \
+    29                  --sysconfdir=/etc \
+    30          );
+    31          touch $(FOO_DIR)/.configured;
+    32
+    33  $(FOO_DIR)/$(FOO_BINARY): $(FOO_DIR)/.configured
+    34          $(MAKE) CC=$(TARGET_CC) -C $(FOO_DIR)
+    35
+    36  $(TARGET_DIR)/$(FOO_TARGET_BINARY): $(FOO_DIR)/$(FOO_BINARY)
+    37          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) install
+    38          rm -Rf $(TARGET_DIR)/usr/man
+    39
+    40  foo: uclibc ncurses $(TARGET_DIR)/$(FOO_TARGET_BINARY)
+    41
+    42  foo-source: $(DL_DIR)/$(FOO_SOURCE)
+    43
+    44  foo-clean:
+    45          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) uninstall
+    46          -$(MAKE) -C $(FOO_DIR) clean
+    47
+    48  foo-dirclean:
+    49          rm -rf $(FOO_DIR)
+    50
+
+ +

First of all, this Makefile example works for a single + binary software. For other software such as libraries or more + complex stuff with multiple binaries, it should be adapted. Look at + the other *.mk files in the package + directory.

+ +

At lines 6-11, a couple of useful variables are defined :

+ +
    + +
  • FOO_VERSION : The version of foo that + should be downloaded.
  • + +
  • FOO_SOURCE : The name of the tarball of + foo on the download website of FTP site. As you can see + FOO_VERSION is used.
  • + +
  • FOO_SITE : The HTTP or FTP site from which + foo archive is downloaded. It must include the complete + path to the directory where FOO_SOURCE can be + found.
  • + +
  • FOO_DIR : The directory into which the software + will be configured and compiled. Basically, it's a subdirectory + of BUILD_DIR which is created upon decompression of + the tarball.
  • + +
  • FOO_BINARY : Software binary name. As said + previously, this is an example for a single binary software.
  • + +
  • FOO_TARGET_BINARY : The full path of the binary + inside the target filesystem.
  • + +
+ +

Lines 13-14 defines a target that downloads the tarball from + the remote site to the download directory + (DL_DIR).

+ +

Lines 16-18 defines a target and associated rules that + uncompress the downloaded tarball. As you can see, this target + depends on the tarball file, so that the previous target (line + 13-14) is called before executing the rules of the current + target. Uncompressing is followed by touching a hidden file + to mark the software has having been uncompressed. This trick is + used everywhere in Buildroot Makefile to split steps + (download, uncompress, configure, compile, install) while still + having correct dependencies.

+ +

Lines 20-31 defines a target and associated rules that + configures the software. It depends on the previous target (the + hidden .source file) so that we are sure the software has + been uncompressed. In order to configure it, it basically runs the + well-known ./configurescript. As we may be doing + cross-compilation, target, host and + build arguments are given. The prefix is also set to + /usr, not because the software will be installed in + /usr on your host system, but in the target + filesystem. Finally it creates a .configured file to + mark the software as configured.

+ +

Lines 33-34 defines a target and a rule that compiles the + software. This target will create the binary file in the + compilation directory, and depends on the software being already + configured (hence the reference to the .configured + file). It basically runs make inside the source + directory.

+ +

Lines 36-38 defines a target and associated rules that install + the software inside the target filesystem. It depends on the + binary file in the source directory, to make sure the software has + been compiled. It uses the install target of the + software Makefile by passing a prefix + argument, so that the Makefile doesn't try to install + the software inside host /usr but inside target + /usr. After the installation, the + /usr/man directory inside the target filesystem is + removed to save space.

+ +

Line 40 defines the main target of the software, the one + referenced in the Makefile.in file. This targets + should first of all depends on the dependecies of the software (in + our example, uclibc and ncurses), and then to the + final binary. This last dependency will call all previous + dependencies in the right order.

+ +

Line 42 defines a simple target that only downloads the code + source. This is not used during normal operation of Buildroot, but + might be useful.

+ +

Lignes 44-46 define a simple target to clean the software build + by calling the Makefiles with the appropriate option.

+ +

Lines 48-49 define a simple target to completely remove the + directory in which the software was uncompressed, configured and + compiled.

+ +

Conclusion

+ +

As you can see, adding a software to buildroot is simply a + matter of writing a Makefile using an already existing + example and to modify it according to the compilation process of + the software.

+ +

If you package software that might be useful for other persons, + don't forget to send a patch to Buildroot developers !

+ +

Ressources

+ +

To learn more about Buildroot you can visit these + websites:

+ + + +
+ + diff --git a/openwrt/docs/stylesheet.css b/openwrt/docs/stylesheet.css new file mode 100644 index 0000000000..2c36417823 --- /dev/null +++ b/openwrt/docs/stylesheet.css @@ -0,0 +1,65 @@ +body { + margin: 0px 0px 0px 0px; + color: white; + background-color: #93c6f9; + font: 12pt/18pt georgia; +} + +div.main { + margin: 10px 10px 10px 10px; + padding: 10px 10px 10px 10px; + color: black; + background-color: white; +} + +div.titre { + text-align: center; + background-color: #336699; + color: white; + padding: 10px 10px 10px 10px; +} + +h1 { + text-align: center; + font: 26pt georgia; + letter-spacing: 3px; +} + +h2 { + padding: 5px 5px 5px 5px; + background-color: #c2e0ff; + color: #336699; +} + +a:link, a:visited { + font-weight: bold; + text-decoration: none; + color: #336699; +} + +a:hover, a:active { + text-decoration: underline; + color: #9685BA; +} + +h3 { + font: italic normal 14pt georgia; + letter-spacing: 1px; + margin-bottom: 0px; + margin-left: 10px; + margin-right: 10px; + color: #336699; +} + +p { + margin-left: 10px; + margin-right: 10px; + text-align: justify; +} + +pre { + border-left: 3px #aaa solid; + margin-left: 1em; + padding: 0 1em; + color: #888; +} \ No newline at end of file diff --git a/openwrt/package/Config.in b/openwrt/package/Config.in new file mode 100644 index 0000000000..30f45ad142 --- /dev/null +++ b/openwrt/package/Config.in @@ -0,0 +1,15 @@ +# + +menu "OpenWrt Package Selection" + +comment "The default set" +source "package/busybox/Config.in" +source "package/dnsmasq/Config.in" +source "package/linux/Config.in" +source "package/iptables/Config.in" +source "package/bridge/Config.in" + +comment "Suggested Extras" +source "package/dropbear_sshd/Config.in" + +endmenu diff --git a/openwrt/package/Makefile.in b/openwrt/package/Makefile.in new file mode 100644 index 0000000000..a59ab973fb --- /dev/null +++ b/openwrt/package/Makefile.in @@ -0,0 +1,64 @@ +MAKE1=make +MAKE=make -j$(BR2_JLEVEL) + +# Strip off the annoying quoting +ARCH:=$(strip $(subst ",, $(BR2_ARCH))) +#" +WGET:=$(strip $(subst ",, $(BR2_WGET))) +#" + +ifneq ($(BR2_LARGEFILE),y) +DISABLE_LARGEFILE= --disable-largefile +endif +TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) + +HOSTCC:=gcc +BASE_DIR:=${shell pwd} +DL_DIR:=$(BASE_DIR)/dl +#PATCH_DIR=$(BASE_DIR)/sources/patches +BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX) +TARGET_DIR:=$(BUILD_DIR)/root +TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX) +# Strip off the annoying quoting +STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR))) +#" +TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin +IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX) +REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc +GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux +KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CC=$(TARGET_CROSS)gcc +STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note + + +HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh[234]/sh/' \ + -e 's/mips-.*/mips/' \ + -e 's/mipsel-.*/mipsel/' \ + -e 's/cris.*/cris/' \ + -e 's/i[3-9]86/i386/' \ + ) +GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu +TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \ + AR=$(TARGET_CROSS)ar \ + AS=$(TARGET_CROSS)as \ + LD=$(TARGET_CROSS)ld \ + NM=$(TARGET_CROSS)nm \ + CC=$(TARGET_CROSS)gcc \ + GCC=$(TARGET_CROSS)gcc \ + CXX=$(TARGET_CROSS)g++ \ + RANLIB=$(TARGET_CROSS)ranlib + +ifeq ($(ENABLE_LOCALE),true) +DISABLE_NLS:= +else +DISABLE_NLS:=--disable-nls +endif + + diff --git a/openwrt/package/bridge/Config.in b/openwrt/package/bridge/Config.in new file mode 100644 index 0000000000..8a5ebce0e9 --- /dev/null +++ b/openwrt/package/bridge/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_BRIDGE + bool "bridge" + default n + help + Manage ethernet bridging; a way to connect networks together to + form a larger network. + + http://bridge.sourceforge.net/ diff --git a/openwrt/package/bridge/Makefile.in b/openwrt/package/bridge/Makefile.in new file mode 100644 index 0000000000..5636052953 --- /dev/null +++ b/openwrt/package/bridge/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y) +TARGETS+=bridge +endif diff --git a/openwrt/package/bridge/bridge.mk b/openwrt/package/bridge/bridge.mk new file mode 100644 index 0000000000..7865b6e308 --- /dev/null +++ b/openwrt/package/bridge/bridge.mk @@ -0,0 +1,61 @@ +############################################################# +# +# bridgeutils - User Space Program For Controling Bridging +# +############################################################# +# +BRIDGE_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/bridge/ +BRIDGE_SOURCE=bridge-utils-1.0.4.tar.gz +BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-1.0.4 +BRIDGE_TARGET_BINARY:=usr/sbin/brctl + +$(DL_DIR)/$(BRIDGE_SOURCE): + $(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE) + +$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE) + zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + patch -p1 -d $(BRIDGE_BUILD_DIR) < package/bridge/bridge.patch + touch $(BRIDGE_BUILD_DIR)/.unpacked + +$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.unpacked + (cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-linux=$(LINUX_DIR) \ + ); + touch $(BRIDGE_BUILD_DIR)/.configured + +$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured + $(MAKE) -C $(BRIDGE_BUILD_DIR) + +$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl + cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + $(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + #cp -af $(BRIDGE_BUILD_DIR)/brctl/brctld $(TARGET_DIR)/usr/sbin/ + #$(STRIP) $(TARGET_DIR)/usr/sbin/brctld + +bridge: linux $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + +bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE) + +bridge-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall + -$(MAKE) -C $(BRIDGE_BUILD_DIR) clean + +bridge-dirclean: + rm -rf $(BRIDGE_BUILD_DIR) diff --git a/openwrt/package/bridge/bridge.patch b/openwrt/package/bridge/bridge.patch new file mode 100644 index 0000000000..f44737750b --- /dev/null +++ b/openwrt/package/bridge/bridge.patch @@ -0,0 +1,11 @@ +--- bridge-utils-0.9.6/libbridge/Makefile.in.dist 2004-03-01 20:55:52.000000000 -0600 ++++ bridge-utils-0.9.6/libbridge/Makefile.in 2004-03-01 20:56:23.000000000 -0600 +@@ -5,7 +5,7 @@ + RANLIB=@RANLIB@ + + CC=@CC@ +-CFLAGS = -Wall -g $(KERNEL_HEADERS) ++CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS) + + prefix=@prefix@ + exec_prefix=@exec_prefix@ diff --git a/openwrt/package/busybox/Config.in b/openwrt/package/busybox/Config.in new file mode 100644 index 0000000000..320cb9b1c0 --- /dev/null +++ b/openwrt/package/busybox/Config.in @@ -0,0 +1,19 @@ +config BR2_PACKAGE_BUSYBOX + bool "busybox" + default y + help + The Swiss Army Knife of embedded Linux. It slices, it dices, it + makes Julian Fries. + + http://busybox.net/ + + Most people will answer Y. + +config BR2_PACKAGE_BUSYBOX_SNAPSHOT + bool "Use the daily snapshot of busybox?" + depends BR2_PACKAGE_BUSYBOX + default y + help + Use the latest busybox CVS snapshot instead of release. + + For fun, you should say Y. diff --git a/openwrt/package/busybox/Makefile.in b/openwrt/package/busybox/Makefile.in new file mode 100644 index 0000000000..a8efafb8b4 --- /dev/null +++ b/openwrt/package/busybox/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y) +TARGETS+=busybox +endif diff --git a/openwrt/package/busybox/busybox.config b/openwrt/package/busybox/busybox.config new file mode 100644 index 0000000000..7335635f70 --- /dev/null +++ b/openwrt/package/busybox/busybox.config @@ -0,0 +1,464 @@ +# +# Automatically generated make config: don't edit +# +HAVE_DOT_CONFIG=y + +# +# General Configuration +# +# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_SUID=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_SELINUX is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +CONFIG_LFS=y +# USING_CROSS_COMPILER is not set +EXTRA_CFLAGS_OPTIONS="" + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +PREFIX="./_install" + +# +# Archival Utilities +# +# CONFIG_AR is not set +CONFIG_BUNZIP2=y +# CONFIG_CPIO is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GUNZIP=y +# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_FROM is not set +CONFIG_FEATURE_TAR_GZIP=y +# CONFIG_FEATURE_TAR_COMPRESS is not set +# CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_UNCOMPRESS is not set +CONFIG_UNZIP=y + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_UNARCHIVE_TAPE is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_CHROOT=y +CONFIG_CMP=y +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_DF=y +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_EXPR=y +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +CONFIG_HOSTID=y +CONFIG_ID=y +CONFIG_INSTALL=y +# CONFIG_LENGTH is not set +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +# CONFIG_MKFIFO is not set +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_OD is not set +# CONFIG_PRINTF is not set +CONFIG_PWD=y +# CONFIG_REALPATH is not set +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_SEQ is not set +CONFIG_SHA1SUM=y +CONFIG_SLEEP=y +# CONFIG_FEATURE_FANCY_SLEEP is not set +CONFIG_SORT=y +CONFIG_STTY=y +CONFIG_SYNC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y +CONFIG_FEATURE_TEST_64=y + +# +# test (forced enabled for use with shell) +# +CONFIG_TOUCH=y +# CONFIG_TR is not set +CONFIG_TRUE=y +CONFIG_TTY=y +CONFIG_UNAME=y +CONFIG_UNIQ=y +CONFIG_USLEEP=y +CONFIG_UUDECODE=y +CONFIG_UUENCODE=y +# CONFIG_WATCH is not set +CONFIG_WC=y +# CONFIG_WHO is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls and more +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +# CONFIG_DUMPKMAP is not set +# CONFIG_LOADFONT is not set +# CONFIG_LOADKMAP is not set +CONFIG_OPENVT=y +CONFIG_RESET=y +# CONFIG_SETKEYCODES is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_RUN_PARTS=y +CONFIG_START_STOP_DAEMON=y +CONFIG_WHICH=y + +# +# Editors +# +# CONFIG_AWK is not set +# CONFIG_PATCH is not set +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +CONFIG_INIT=y +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_INITRD=y +# CONFIG_FEATURE_INIT_COREDUMPS is not set +CONFIG_FEATURE_EXTRA_QUIET=y +CONFIG_HALT=y +CONFIG_POWEROFF=y +CONFIG_REBOOT=y +# CONFIG_MESG is not set + +# +# Login/Password Management Utilities +# +# CONFIG_USE_BB_PWD_GRP is not set +CONFIG_ADDGROUP=y +CONFIG_DELGROUP=y +CONFIG_ADDUSER=y +CONFIG_DELUSER=y +CONFIG_GETTY=y +# CONFIG_FEATURE_U_W_TMP is not set +CONFIG_LOGIN=y +CONFIG_FEATURE_SECURETTY=y +CONFIG_PASSWD=y +CONFIG_SU=y +CONFIG_SULOGIN=y +CONFIG_VLOCK=y + +# +# Common options for adduser, deluser, login, su +# +CONFIG_FEATURE_SHADOWPASSWDS=y + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +# CONFIG_CROND is not set +# CONFIG_CRONTAB is not set +CONFIG_DC=y +# CONFIG_DEVFSD is not set +# CONFIG_LAST is not set +# CONFIG_HDPARM is not set +# CONFIG_MAKEDEVS is not set +CONFIG_MT=y +# CONFIG_RX is not set +CONFIG_STRINGS=y +CONFIG_TIME=y +# CONFIG_WATCHDOG is not set + +# +# Linux Module Utilities +# +CONFIG_INSMOD=y +CONFIG_FEATURE_2_4_MODULES=y +# CONFIG_FEATURE_2_6_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +CONFIG_LSMOD=y +CONFIG_FEATURE_QUERY_MODULE_INTERFACE=y +CONFIG_MODPROBE=y +CONFIG_RMMOD=y +CONFIG_FEATURE_CHECK_TAINTED_MODULE=y + +# +# Networking Utilities +# +# CONFIG_FEATURE_IPV6 is not set +# CONFIG_ARPING is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +CONFIG_HOSTNAME=y +# CONFIG_HTTPD is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +# CONFIG_FEATURE_IFCONFIG_HW is not set +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +CONFIG_IFUPDOWN=y +# CONFIG_FEATURE_IFUPDOWN_IP is not set +CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +CONFIG_FEATURE_IFUPDOWN_IPV4=y +# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set +# CONFIG_FEATURE_IFUPDOWN_IPX is not set +# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set +# CONFIG_INETD is not set +# CONFIG_IP is not set +# CONFIG_IPCALC is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_NAMEIF is not set +# CONFIG_NC is not set +CONFIG_NETSTAT=y +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_FEATURE_FANCY_PING=y +CONFIG_ROUTE=y +CONFIG_TELNET=y +CONFIG_FEATURE_TELNET_TTYPE=y +# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_TELNETD is not set +# CONFIG_TFTP is not set +# CONFIG_TRACEROUTE is not set +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +# CONFIG_FEATURE_WGET_IP6_LITERAL is not set + +# +# udhcp Server/Client +# +CONFIG_UDHCPD=y +CONFIG_UDHCPC=y +CONFIG_DUMPLEASES=y +CONFIG_FEATURE_UDHCP_SYSLOG=y +# CONFIG_FEATURE_UDHCP_DEBUG is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_PIDOF=y +CONFIG_PS=y +# CONFIG_RENICE is not set +# CONFIG_TOP is not set +CONFIG_UPTIME=y +# CONFIG_SYSCTL is not set + +# +# Another Bourne-like Shell +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_LASH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +CONFIG_ASH_MATH_SUPPORT_64=y +# CONFIG_ASH_GETOPTS is not set +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_HUSH is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +# CONFIG_FEATURE_SH_EXTRA_QUIET is not set +# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set +CONFIG_FEATURE_COMMAND_EDITING=y +CONFIG_FEATURE_COMMAND_HISTORY=15 +CONFIG_FEATURE_COMMAND_SAVEHISTORY=y +CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y +# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set +CONFIG_FEATURE_SH_FANCY_PROMPT=y + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Linux System Utilities +# +CONFIG_DMESG=y +# CONFIG_FBSET is not set +# CONFIG_FDFLUSH is not set +CONFIG_FDFORMAT=y +CONFIG_FDISK=y +FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +# CONFIG_FEATURE_FDISK_ADVANCED is not set +# CONFIG_FREERAMDISK is not set +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_MINIX is not set +CONFIG_GETOPT=y +CONFIG_HEXDUMP=y +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_LONGOPTIONS=y +# CONFIG_LOSETUP is not set +# CONFIG_MKSWAP is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +CONFIG_SWAPONOFF=y +CONFIG_MOUNT=y +# CONFIG_NFSMOUNT is not set +CONFIG_UMOUNT=y +# CONFIG_FEATURE_MOUNT_FORCE is not set + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Debugging Options +# +# CONFIG_DEBUG is not set diff --git a/openwrt/package/busybox/busybox.mk b/openwrt/package/busybox/busybox.mk new file mode 100644 index 0000000000..ae9abf1332 --- /dev/null +++ b/openwrt/package/busybox/busybox.mk @@ -0,0 +1,62 @@ +############################################################# +# +# busybox +# +############################################################# + +ifeq ($(strip $(BR2_PACKAGE_BUSYBOX_SNAPSHOT)),y) +# Be aware that this changes daily.... +BUSYBOX_DIR:=$(BUILD_DIR)/busybox +BUSYBOX_SOURCE:=busybox-snapshot.tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads/snapshots +else +BUSYBOX_VER:=1.00 +BUSYBOX_DIR:=$(BUILD_DIR)/busybox-$(BUSYBOX_VER) +BUSYBOX_SOURCE:=busybox-$(BUSYBOX_VER).tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads +endif +BUSYBOX_UNZIP=bzcat +BUSYBOX_CONFIG:=package/busybox/busybox.config + +$(DL_DIR)/$(BUSYBOX_SOURCE): + $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE) + +busybox-source: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG) + +$(BUSYBOX_DIR)/.unpacked: $(DL_DIR)/$(BUSYBOX_SOURCE) + $(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + # Allow busybox patches. + toolchain/patch-kernel.sh $(BUSYBOX_DIR) package/busybox busybox-\*.patch + touch $(BUSYBOX_DIR)/.unpacked + +$(BUSYBOX_DIR)/.configured: $(BUSYBOX_DIR)/.unpacked $(BUSYBOX_CONFIG) + cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config + $(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\ + PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak +ifeq ($(BR2_LARGEFILE),y) + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config +else + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config + $(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config +endif + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig + touch $(BUSYBOX_DIR)/.configured + +$(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) + +$(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install + # Just in case + -chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script + +busybox: uclibc $(TARGET_DIR)/bin/busybox + +busybox-clean: + rm -f $(TARGET_DIR)/bin/busybox + -$(MAKE) -C $(BUSYBOX_DIR) clean + +busybox-dirclean: + rm -rf $(BUSYBOX_DIR) diff --git a/openwrt/package/config/.cvsignore b/openwrt/package/config/.cvsignore new file mode 100644 index 0000000000..e8bf7a75ba --- /dev/null +++ b/openwrt/package/config/.cvsignore @@ -0,0 +1,8 @@ +conf +mconf +lkc_defs.h +lex.zconf.c +zconf.tab.h +zconf.tab.c +lex.backup +zconf.output diff --git a/openwrt/package/config/Config.in b/openwrt/package/config/Config.in new file mode 100644 index 0000000000..7b114d9dd5 --- /dev/null +++ b/openwrt/package/config/Config.in @@ -0,0 +1,8 @@ +# + +config BR2_PACKAGE_CONFIG + bool"config" + default n + help + Add help text here. + diff --git a/openwrt/package/config/Kconfig-language.txt b/openwrt/package/config/Kconfig-language.txt new file mode 100644 index 0000000000..493749b32a --- /dev/null +++ b/openwrt/package/config/Kconfig-language.txt @@ -0,0 +1,255 @@ +Introduction +------------ + +The configuration database is collection of configuration options +organized in a tree structure: + + +- Code maturity level options + | +- Prompt for development and/or incomplete code/drivers + +- General setup + | +- Networking support + | +- System V IPC + | +- BSD Process Accounting + | +- Sysctl support + +- Loadable module support + | +- Enable loadable module support + | +- Set version information on all module symbols + | +- Kernel module loader + +- ... + +Every entry has its own dependencies. These dependencies are used +to determine the visible of an entry. Any child entry is only +visible if its parent entry is also visible. + +Menu entries +------------ + +Most entries define a config option, all other entries help to organize +them. A single configuration option is defined like this: + +config MODVERSIONS + bool "Set version information on all module symbols" + depends MODULES + help + Usually, modules have to be recompiled whenever you switch to a new + kernel. ... + +Every line starts with a key word and can be followed by multiple +arguments. "config" starts a new config entry. The following lines +define attributes for this config option. Attributes can be the type of +the config option, input prompt, dependencies, help text and default +values. A config option can be defined multiple times with the same +name, but every definition can have only a single input prompt and the +type must not conflict. + +Menu attributes +--------------- + +A menu entry can have a number of attributes. Not all of them are +applicable everywhere (see syntax). + +- type definition: "bool"/"tristate"/"string"/"hex"/"integer" + Every config option must have a type. There are only two basic types: + tristate and string, the other types base on these two. The type + definition optionally accepts an input prompt, so these two examples + are equivalent: + + bool "Networking support" + and + bool + prompt "Networking support" + +- input prompt: "prompt" ["if" ] + Every menu entry can have at most one prompt, which is used to display + to the user. Optionally dependencies only for this prompt can be added + with "if". + +- default value: "default" ["if" ] + A config option can have any number of default values. If multiple + default values are visible, only the first defined one is active. + Default values are not limited to the menu entry, where they are + defined, this means the default can be defined somewhere else or be + overriden by an earlier definition. + The default value is only assigned to the config symbol if no other + value was set by the user (via the input prompt above). If an input + prompt is visible the default value is presented to the user and can + be overridden by him. + Optionally dependencies only for this default value can be added with + "if". + +- dependencies: "depends on"/"requires" + This defines a dependency for this menu entry. If multiple + dependencies are defined they are connected with '&&'. Dependencies + are applied to all other options within this menu entry (which also + accept "if" expression), so these two examples are equivalent: + + bool "foo" if BAR + default y if BAR + and + depends on BAR + bool "foo" + default y + +- help text: "help" + This defines a help text. The end of the help text is determined by + the level indentation, this means it ends at the first line which has + a smaller indentation than the first line of the help text. + + +Menu dependencies +----------------- + +Dependencies define the visibility of a menu entry and can also reduce +the input range of tristate symbols. The tristate logic used in the +expressions uses one more state than normal boolean logic to express the +module state. Dependency expressions have the following syntax: + + ::= (1) + '=' (2) + '!=' (3) + '(' ')' (4) + '!' (5) + '||' (6) + '&&' (7) + +Expressions are listed in decreasing order of precedence. + +(1) Convert the symbol into an expression. Boolean and tristate symbols + are simply converted into the respective expression values. All + other symbol types result in 'n'. +(2) If the values of both symbols are equal, it returns 'y', + otherwise 'n'. +(3) If the values of both symbols are equal, it returns 'n', + otherwise 'y'. +(4) Returns the value of the expression. Used to override precedence. +(5) Returns the result of (2-/expr/). +(6) Returns the result of min(/expr/, /expr/). +(7) Returns the result of max(/expr/, /expr/). + +An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2 +respectively for calculations). A menu entry becomes visible when it's +expression evaluates to 'm' or 'y'. + +There are two type of symbols: constant and nonconstant symbols. +Nonconstant symbols are the most common ones and are defined with the +'config' statement. Nonconstant symbols consist entirely of alphanumeric +characters or underscores. +Constant symbols are only part of expressions. Constant symbols are +always surrounded by single or double quotes. Within the quote any +other character is allowed and the quotes can be escaped using '\'. + +Menu structure +-------------- + +The position of a menu entry in the tree is determined in two ways. First +it can be specified explicitely: + +menu "Network device support" + depends NET + +config NETDEVICES + ... + +endmenu + +All entries within the "menu" ... "endmenu" block become a submenu of +"Network device support". All subentries inherit the dependencies from +the menu entry, e.g. this means the dependency "NET" is added to the +dependency list of the config option NETDEVICES. + +The other way to generate the menu structure is done by analyzing the +dependencies. If a menu entry somehow depends on the previous entry, it +can be made a submenu of it. First the the previous (parent) symbol must +be part of the dependency list and then one of these two condititions +must be true: +- the child entry must become invisible, if the parent is set to 'n' +- the child entry must only be visible, if the parent is visible + +config MODULES + bool "Enable loadable module support" + +config MODVERSIONS + bool "Set version information on all module symbols" + depends MODULES + +comment "module support disabled" + depends !MODULES + +MODVERSIONS directly depends on MODULES, this means it's only visible if +MODULES is different from 'n'. The comment on the other hand is always +visible when MODULES it's visible (the (empty) dependency of MODULES is +also part of the comment dependencies). + + +Kconfig syntax +-------------- + +The configuration file describes a series of menu entries, where every +line starts with a keyword (except help texts). The following keywords +end a menu entry: +- config +- choice/endchoice +- comment +- menu/endmenu +- if/endif +- source +The first four also start the definition of a menu entry. + +config: + + "config" + + +This defines a config symbol and accepts any of above +attributes as options. + +choices: + + "choice" + + + "endchoice" + +This defines a choice group and accepts any of above attributes as +options. A choice can only be of type bool or tristate, while a boolean +choice only allows a single config entry to be selected, a tristate +choice also allows any number of config entries to be set to 'm'. This +can be used if multiple drivers for a single hardware exists and only a +single driver can be compiled/loaded into the kernel, but all drivers +can be compiled as modules. +A choice accepts another option "optional", which allows to set the +choice to 'n' and no entry needs to be selected. + +comment: + + "comment" + + +This defines a comment which is displayed to the user during the +configuration process and is also echoed to the output files. The only +possible options are dependencies. + +menu: + + "menu" + + + "endmenu" + +This defines a menu block, see "Menu structure" above for more +information. The only possible options are dependencies. + +if: + + "if" + + "endif" + +This defines an if block. The dependency expression is appended +to all enclosed menu entries. + +source: + + "source" + +This reads the specified configuration file. This file is always parsed. diff --git a/openwrt/package/config/Makefile b/openwrt/package/config/Makefile new file mode 100644 index 0000000000..455a33d233 --- /dev/null +++ b/openwrt/package/config/Makefile @@ -0,0 +1,112 @@ +# Makefile for buildroot2 +# +# Copyright (C) 2002-2004 Erik Andersen + + +# Select the compiler needed to build binaries for your development system +HOSTCC = gcc +HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer +# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. +LC_ALL:= C + + +all: ncurses conf mconf + +LIBS = -lncurses +ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h)) + HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" +else +ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h)) + HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" +else +ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h)) + HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" +else +ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h)) + HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" +else +ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h)) + HOSTNCURSES += -DCURSES_LOC="" +else + HOSTNCURSES += -DCURSES_LOC="" +endif +endif +endif +endif +endif + +CONF_SRC =conf.c +MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c +SHARED_SRC=zconf.tab.c +SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h +CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC)) +MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC)) +SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC)) + +conf: $(CONF_OBJS) $(SHARED_OBJS) + $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ + +mconf: $(MCONF_OBJS) $(SHARED_OBJS) + $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS) + +$(CONF_OBJS): %.o : %.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@ + +lkc_defs.h: lkc_proto.h + @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' + +### +# The following requires flex/bison +# By default we use the _shipped versions, uncomment the +# following line if you are modifying the flex/bison src. +#LKC_GENPARSER := 1 + +ifdef LKC_GENPARSER + +%.tab.c %.tab.h: %.y + bison -t -d -v -b $* -p $(notdir $*) $< + +lex.%.c: %.l + flex -P$(notdir $*) -o$@ $< +else + +lex.zconf.o: lex.zconf.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +lex.zconf.c: lex.zconf.c_shipped + cp lex.zconf.c_shipped lex.zconf.c + +zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +zconf.tab.c: zconf.tab.c_shipped + cp zconf.tab.c_shipped zconf.tab.c + +zconf.tab.h: zconf.tab.h_shipped + cp zconf.tab.h_shipped zconf.tab.h +endif + +.PHONY: ncurses + +ncurses: + @echo "main() {}" > lxtemp.c + @if $(HOSTCC) lxtemp.c $(LIBS) ; then \ + rm -f lxtemp.c a.out; \ + else \ + rm -f lxtemp.c; \ + echo -e "\007" ;\ + echo ">> Unable to find the Ncurses libraries." ;\ + echo ">>" ;\ + echo ">> You must have Ncurses installed in order" ;\ + echo ">> to use 'make menuconfig'" ;\ + echo ;\ + exit 1 ;\ + fi + +clean: + rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \ + conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h + diff --git a/openwrt/package/config/Makefile.in b/openwrt/package/config/Makefile.in new file mode 100644 index 0000000000..addf1b9819 --- /dev/null +++ b/openwrt/package/config/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_CONFIG)),y) +TARGETS+=config +endif diff --git a/openwrt/package/config/checklist.c b/openwrt/package/config/checklist.c new file mode 100644 index 0000000000..4dbd16616d --- /dev/null +++ b/openwrt/package/config/checklist.c @@ -0,0 +1,372 @@ +/* + * checklist.c -- implements the checklist box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension + * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static int list_width, check_x, item_x, checkflag; + +/* + * Print list item + */ +static void +print_item (WINDOW * win, const char *item, int status, + int choice, int selected) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset (win, menubox_attr); + wmove (win, choice, 0); + for (i = 0; i < list_width; i++) + waddch (win, ' '); + + wmove (win, choice, check_x); + wattrset (win, selected ? check_selected_attr : check_attr); + if (checkflag == FLAG_CHECK) + wprintw (win, "[%c]", status ? 'X' : ' '); + else + wprintw (win, "(%c)", status ? 'X' : ' '); + + wattrset (win, selected ? tag_selected_attr : tag_attr); + mvwaddch(win, choice, item_x, item[0]); + wattrset (win, selected ? item_selected_attr : item_attr); + waddstr (win, (char *)item+1); + if (selected) { + wmove (win, choice, check_x+1); + wrefresh (win); + } +} + +/* + * Print the scroll indicators. + */ +static void +print_arrows (WINDOW * win, int choice, int item_no, int scroll, + int y, int x, int height) +{ + wmove(win, y, x); + + if (scroll > 0) { + wattrset (win, uarrow_attr); + waddch (win, ACS_UARROW); + waddstr (win, "(-)"); + } + else { + wattrset (win, menubox_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + choice < item_no - 1)) { + wattrset (win, darrow_attr); + waddch (win, ACS_DARROW); + waddstr (win, "(+)"); + } + else { + wattrset (win, menubox_border_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } +} + +/* + * Display the termination buttons + */ +static void +print_buttons( WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button (dialog, "Select", y, x, selected == 0); + print_button (dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x+1 + 14*selected); + wrefresh (dialog); +} + +/* + * Display a dialog box with a list of options that can be turned on or off + * The `flag' parameter is used to select between radiolist and checklist. + */ +int +dialog_checklist (const char *title, const char *prompt, int height, int width, + int list_height, int item_no, struct dialog_list_item ** items, + int flag) + +{ + int i, x, y, box_x, box_y; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; + WINDOW *dialog, *list; + + checkflag = flag; + + /* Allocate space for storing item on/off status */ + if ((status = malloc (sizeof (int) * item_no)) == NULL) { + endwin (); + fprintf (stderr, + "\nCan't allocate memory in dialog_checklist().\n"); + exit (-1); + } + + /* Initializes status */ + for (i = 0; i < item_no; i++) { + status[i] = (items[i]->selected == 1); /* ON */ + if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */ + choice = i + 1; + } + if (choice) + choice--; + + max_choice = MIN (list_height, item_no); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + list_width = width - 6; + box_y = height - list_height - 5; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1); + + keypad (list, TRUE); + + /* draw a box around the list items */ + draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2, + menubox_border_attr, menubox_attr); + + /* Find length of longest item in order to center checklist */ + check_x = 0; + for (i = 0; i < item_no; i++) + check_x = MAX (check_x, + strlen (items[i]->name) + 4); + + check_x = (list_width - check_x) / 2; + item_x = check_x + 4; + + if (choice >= list_height) { + scroll = choice - list_height + 1; + choice -= scroll; + } + + /* Print the list */ + for (i = 0; i < max_choice; i++) { + print_item (list, items[scroll + i]->name, + status[i+scroll], i, i == choice); + } + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + print_buttons(dialog, height, width, 0); + + wnoutrefresh (list); + wnoutrefresh (dialog); + doupdate (); + + while (key != ESC) { + key = wgetch (dialog); + + for (i = 0; i < max_choice; i++) + if (toupper(key) == toupper(items[scroll + i]->name[0])) + break; + + + if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || + key == '+' || key == '-' ) { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (!scroll) + continue; + /* Scroll list down */ + if (list_height > 1) { + /* De-highlight current first item */ + print_item (list, items[scroll]->name, + status[scroll], 0, FALSE); + scrollok (list, TRUE); + wscrl (list, -1); + scrollok (list, FALSE); + } + scroll--; + print_item (list, items[scroll]->name, + status[scroll], 0, TRUE); + wnoutrefresh (list); + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + wrefresh (dialog); + + continue; /* wait for another key press */ + } else + i = choice - 1; + } else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll + choice >= item_no - 1) + continue; + /* Scroll list up */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item (list, items[scroll + max_choice - 1]->name, + status[scroll + max_choice - 1], + max_choice - 1, FALSE); + scrollok (list, TRUE); + scroll (list); + scrollok (list, FALSE); + } + scroll++; + print_item (list, items[scroll + max_choice - 1]->name, + status[scroll + max_choice - 1], + max_choice - 1, TRUE); + wnoutrefresh (list); + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + wrefresh (dialog); + + continue; /* wait for another key press */ + } else + i = choice + 1; + } + if (i != choice) { + /* De-highlight current item */ + print_item (list, items[scroll + choice]->name, + status[scroll + choice], choice, FALSE); + /* Highlight new item */ + choice = i; + print_item (list, items[scroll + choice]->name, + status[scroll + choice], choice, TRUE); + wnoutrefresh (list); + wrefresh (dialog); + } + continue; /* wait for another key press */ + } + switch (key) { + case 'H': + case 'h': + case '?': + for (i = 0; i < item_no; i++) + items[i]->selected = 0; + items[scroll + choice]->selected = 1; + delwin (dialog); + free (status); + return 1; + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (dialog); + break; + case 'S': + case 's': + case ' ': + case '\n': + if (!button) { + if (flag == FLAG_CHECK) { + status[scroll + choice] = !status[scroll + choice]; + wmove (list, choice, check_x); + wattrset (list, check_selected_attr); + wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' '); + } else { + if (!status[scroll + choice]) { + for (i = 0; i < item_no; i++) + status[i] = 0; + status[scroll + choice] = 1; + for (i = 0; i < max_choice; i++) + print_item (list, items[scroll + i]->name, + status[scroll + i], i, i == choice); + } + } + wnoutrefresh (list); + wrefresh (dialog); + + for (i = 0; i < item_no; i++) { + items[i]->selected = status[i]; + } + } else { + for (i = 0; i < item_no; i++) + items[i]->selected = 0; + items[scroll + choice]->selected = 1; + } + delwin (dialog); + free (status); + return button; + case 'X': + case 'x': + key = ESC; + case ESC: + break; + } + + /* Now, update everything... */ + doupdate (); + } + + + delwin (dialog); + free (status); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/colors.h b/openwrt/package/config/colors.h new file mode 100644 index 0000000000..d34dd37c6f --- /dev/null +++ b/openwrt/package/config/colors.h @@ -0,0 +1,161 @@ +/* + * colors.h -- color attribute definitions + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * Default color definitions + * + * *_FG = foreground + * *_BG = background + * *_HL = highlight? + */ +#define SCREEN_FG COLOR_CYAN +#define SCREEN_BG COLOR_BLUE +#define SCREEN_HL TRUE + +#define SHADOW_FG COLOR_BLACK +#define SHADOW_BG COLOR_BLACK +#define SHADOW_HL TRUE + +#define DIALOG_FG COLOR_BLACK +#define DIALOG_BG COLOR_WHITE +#define DIALOG_HL FALSE + +#define TITLE_FG COLOR_YELLOW +#define TITLE_BG COLOR_WHITE +#define TITLE_HL TRUE + +#define BORDER_FG COLOR_WHITE +#define BORDER_BG COLOR_WHITE +#define BORDER_HL TRUE + +#define BUTTON_ACTIVE_FG COLOR_WHITE +#define BUTTON_ACTIVE_BG COLOR_BLUE +#define BUTTON_ACTIVE_HL TRUE + +#define BUTTON_INACTIVE_FG COLOR_BLACK +#define BUTTON_INACTIVE_BG COLOR_WHITE +#define BUTTON_INACTIVE_HL FALSE + +#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE +#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE +#define BUTTON_KEY_ACTIVE_HL TRUE + +#define BUTTON_KEY_INACTIVE_FG COLOR_RED +#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE +#define BUTTON_KEY_INACTIVE_HL FALSE + +#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW +#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE +#define BUTTON_LABEL_ACTIVE_HL TRUE + +#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK +#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE +#define BUTTON_LABEL_INACTIVE_HL TRUE + +#define INPUTBOX_FG COLOR_BLACK +#define INPUTBOX_BG COLOR_WHITE +#define INPUTBOX_HL FALSE + +#define INPUTBOX_BORDER_FG COLOR_BLACK +#define INPUTBOX_BORDER_BG COLOR_WHITE +#define INPUTBOX_BORDER_HL FALSE + +#define SEARCHBOX_FG COLOR_BLACK +#define SEARCHBOX_BG COLOR_WHITE +#define SEARCHBOX_HL FALSE + +#define SEARCHBOX_TITLE_FG COLOR_YELLOW +#define SEARCHBOX_TITLE_BG COLOR_WHITE +#define SEARCHBOX_TITLE_HL TRUE + +#define SEARCHBOX_BORDER_FG COLOR_WHITE +#define SEARCHBOX_BORDER_BG COLOR_WHITE +#define SEARCHBOX_BORDER_HL TRUE + +#define POSITION_INDICATOR_FG COLOR_YELLOW +#define POSITION_INDICATOR_BG COLOR_WHITE +#define POSITION_INDICATOR_HL TRUE + +#define MENUBOX_FG COLOR_BLACK +#define MENUBOX_BG COLOR_WHITE +#define MENUBOX_HL FALSE + +#define MENUBOX_BORDER_FG COLOR_WHITE +#define MENUBOX_BORDER_BG COLOR_WHITE +#define MENUBOX_BORDER_HL TRUE + +#define ITEM_FG COLOR_BLACK +#define ITEM_BG COLOR_WHITE +#define ITEM_HL FALSE + +#define ITEM_SELECTED_FG COLOR_WHITE +#define ITEM_SELECTED_BG COLOR_BLUE +#define ITEM_SELECTED_HL TRUE + +#define TAG_FG COLOR_YELLOW +#define TAG_BG COLOR_WHITE +#define TAG_HL TRUE + +#define TAG_SELECTED_FG COLOR_YELLOW +#define TAG_SELECTED_BG COLOR_BLUE +#define TAG_SELECTED_HL TRUE + +#define TAG_KEY_FG COLOR_YELLOW +#define TAG_KEY_BG COLOR_WHITE +#define TAG_KEY_HL TRUE + +#define TAG_KEY_SELECTED_FG COLOR_YELLOW +#define TAG_KEY_SELECTED_BG COLOR_BLUE +#define TAG_KEY_SELECTED_HL TRUE + +#define CHECK_FG COLOR_BLACK +#define CHECK_BG COLOR_WHITE +#define CHECK_HL FALSE + +#define CHECK_SELECTED_FG COLOR_WHITE +#define CHECK_SELECTED_BG COLOR_BLUE +#define CHECK_SELECTED_HL TRUE + +#define UARROW_FG COLOR_GREEN +#define UARROW_BG COLOR_WHITE +#define UARROW_HL TRUE + +#define DARROW_FG COLOR_GREEN +#define DARROW_BG COLOR_WHITE +#define DARROW_HL TRUE + +/* End of default color definitions */ + +#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y))) +#define COLOR_NAME_LEN 10 +#define COLOR_COUNT 8 + +/* + * Global variables + */ + +typedef struct { + char name[COLOR_NAME_LEN]; + int value; +} color_names_st; + +extern color_names_st color_names[]; +extern int color_table[][3]; diff --git a/openwrt/package/config/conf.c b/openwrt/package/config/conf.c new file mode 100644 index 0000000000..46b7e08f7f --- /dev/null +++ b/openwrt/package/config/conf.c @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf(struct menu *menu); +static void check_conf(struct menu *menu); + +enum { + ask_all, + ask_new, + ask_silent, + set_default, + set_yes, + set_mod, + set_no, + set_random +} input_mode = ask_all; +char *defconfig_file; + +static int indent = 1; +static int valid_stdin = 1; +static int conf_cnt; +static char line[128]; +static struct menu *rootEntry; + +static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; + +static void strip(char *str) +{ + char *p = str; + int l; + + while ((isspace(*p))) + p++; + l = strlen(p); + if (p != str) + memmove(str, p, l + 1); + if (!l) + return; + p = str + l - 1; + while ((isspace(*p))) + *p-- = 0; +} + +static void check_stdin(void) +{ + if (!valid_stdin && input_mode == ask_silent) { + printf("aborted!\n\n"); + printf("Console input/output is redirected. "); + printf("Run 'make oldconfig' to update configuration.\n\n"); + exit(1); + } +} + +static void conf_askvalue(struct symbol *sym, const char *def) +{ + enum symbol_type type = sym_get_type(sym); + tristate val; + + if (!sym_has_value(sym)) + printf("(NEW) "); + + line[0] = '\n'; + line[1] = 0; + + if (!sym_is_changable(sym)) { + printf("%s\n", def); + line[0] = '\n'; + line[1] = 0; + return; + } + + switch (input_mode) { + case ask_new: + case ask_silent: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + return; + case set_default: + printf("%s\n", def); + return; + default: + break; + } + + switch (type) { + case S_INT: + case S_HEX: + case S_STRING: + printf("%s\n", def); + return; + default: + ; + } + switch (input_mode) { + case set_yes: + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_mod: + if (type == S_TRISTATE) { + if (sym_tristate_within_range(sym, mod)) { + line[0] = 'm'; + line[1] = '\n'; + line[2] = 0; + break; + } + } else { + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + } + case set_no: + if (sym_tristate_within_range(sym, no)) { + line[0] = 'n'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_random: + do { + val = (tristate)(random() % 3); + } while (!sym_tristate_within_range(sym, val)); + switch (val) { + case no: line[0] = 'n'; break; + case mod: line[0] = 'm'; break; + case yes: line[0] = 'y'; break; + } + line[1] = '\n'; + line[2] = 0; + break; + default: + break; + } + printf("%s", line); +} + +int conf_string(struct menu *menu) +{ + struct symbol *sym = menu->sym; + const char *def, *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + printf("(%s) ", sym->name); + def = sym_get_string_value(sym); + if (sym_get_string_value(sym)) + printf("[%s] ", def); + conf_askvalue(sym, def); + switch (line[0]) { + case '\n': + break; + case '?': + /* print help */ + if (line[1] == '\n') { + help = nohelp_text; + if (menu->sym->help) + help = menu->sym->help; + printf("\n%s\n", menu->sym->help); + def = NULL; + break; + } + default: + line[strlen(line)-1] = 0; + def = line; + } + if (def && sym_set_string_value(sym, def)) + return 0; + } +} + +static int conf_sym(struct menu *menu) +{ + struct symbol *sym = menu->sym; + int type; + tristate oldval, newval; + const char *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + if (sym->name) + printf("(%s) ", sym->name); + type = sym_get_type(sym); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { + case no: + putchar('N'); + break; + case mod: + putchar('M'); + break; + case yes: + putchar('Y'); + break; + } + if (oldval != no && sym_tristate_within_range(sym, no)) + printf("/n"); + if (oldval != mod && sym_tristate_within_range(sym, mod)) + printf("/m"); + if (oldval != yes && sym_tristate_within_range(sym, yes)) + printf("/y"); + if (sym->help) + printf("/?"); + printf("] "); + conf_askvalue(sym, sym_get_string_value(sym)); + strip(line); + + switch (line[0]) { + case 'n': + case 'N': + newval = no; + if (!line[1] || !strcmp(&line[1], "o")) + break; + continue; + case 'm': + case 'M': + newval = mod; + if (!line[1]) + break; + continue; + case 'y': + case 'Y': + newval = yes; + if (!line[1] || !strcmp(&line[1], "es")) + break; + continue; + case 0: + newval = oldval; + break; + case '?': + goto help; + default: + continue; + } + if (sym_set_tristate_value(sym, newval)) + return 0; +help: + help = nohelp_text; + if (sym->help) + help = sym->help; + printf("\n%s\n", help); + } +} + +static int conf_choice(struct menu *menu) +{ + struct symbol *sym, *def_sym; + struct menu *child; + int type; + bool is_new; + + sym = menu->sym; + type = sym_get_type(sym); + is_new = !sym_has_value(sym); + if (sym_is_changable(sym)) { + conf_sym(menu); + sym_calc_value(sym); + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + return 0; + case yes: + break; + } + } else { + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + return 0; + case yes: + break; + } + } + + while (1) { + int cnt, def; + + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + def_sym = sym_get_choice_value(sym); + cnt = def = 0; + line[0] = '0'; + line[1] = 0; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (!child->sym) { + printf("%*c %s\n", indent, '*', menu_get_prompt(child)); + continue; + } + cnt++; + if (child->sym == def_sym) { + def = cnt; + printf("%*c", indent, '>'); + } else + printf("%*c", indent, ' '); + printf(" %d. %s", cnt, menu_get_prompt(child)); + if (child->sym->name) + printf(" (%s)", child->sym->name); + if (!sym_has_value(child->sym)) + printf(" (NEW)"); + printf("\n"); + } + printf("%*schoice", indent - 1, ""); + if (cnt == 1) { + printf("[1]: 1\n"); + goto conf_childs; + } + printf("[1-%d", cnt); + if (sym->help) + printf("?"); + printf("]: "); + switch (input_mode) { + case ask_new: + case ask_silent: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + strip(line); + if (line[0] == '?') { + printf("\n%s\n", menu->sym->help ? + menu->sym->help : nohelp_text); + continue; + } + if (!line[0]) + cnt = def; + else if (isdigit(line[0])) + cnt = atoi(line); + else + continue; + break; + case set_random: + def = (random() % cnt) + 1; + case set_default: + case set_yes: + case set_mod: + case set_no: + cnt = def; + printf("%d\n", cnt); + break; + } + + conf_childs: + for (child = menu->list; child; child = child->next) { + if (!child->sym || !menu_is_visible(child)) + continue; + if (!--cnt) + break; + } + if (!child) + continue; + if (line[strlen(line) - 1] == '?') { + printf("\n%s\n", child->sym->help ? + child->sym->help : nohelp_text); + continue; + } + sym_set_choice_value(sym, child->sym); + if (child->list) { + indent += 2; + conf(child->list); + indent -= 2; + } + return 1; + } +} + +static void conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (prop) { + const char *prompt; + + switch (prop->type) { + case P_MENU: + if (input_mode == ask_silent && rootEntry != menu) { + check_conf(menu); + return; + } + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) + printf("%*c\n%*c %s\n%*c\n", + indent, '*', + indent, '*', prompt, + indent, '*'); + default: + ; + } + } + + if (!sym) + goto conf_childs; + + if (sym_is_choice(sym)) { + conf_choice(menu); + if (sym->curr.tri != mod) + return; + goto conf_childs; + } + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + conf_string(menu); + break; + default: + conf_sym(menu); + break; + } + +conf_childs: + if (sym) + indent += 2; + for (child = menu->list; child; child = child->next) + conf(child); + if (sym) + indent -= 2; +} + +static void check_conf(struct menu *menu) +{ + struct symbol *sym; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + if (sym) { + if (sym_is_changable(sym) && !sym_has_value(sym)) { + if (!conf_cnt++) + printf("*\n* Restart config...\n*\n"); + rootEntry = menu_get_parent_menu(menu); + conf(rootEntry); + } + if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod) + return; + } + + for (child = menu->list; child; child = child->next) + check_conf(child); +} + +int main(int ac, char **av) +{ + int i = 1; + const char *name; + struct stat tmpstat; + + if (ac > i && av[i][0] == '-') { + switch (av[i++][1]) { + case 'o': + input_mode = ask_new; + break; + case 's': + input_mode = ask_silent; + valid_stdin = isatty(0) && isatty(1) && isatty(2); + break; + case 'd': + input_mode = set_default; + break; + case 'D': + input_mode = set_default; + defconfig_file = av[i++]; + if (!defconfig_file) { + printf("%s: No default config file specified\n", + av[0]); + exit(1); + } + break; + case 'n': + input_mode = set_no; + break; + case 'm': + input_mode = set_mod; + break; + case 'y': + input_mode = set_yes; + break; + case 'r': + input_mode = set_random; + srandom(time(NULL)); + break; + case 'h': + case '?': + printf("%s [-o|-s] config\n", av[0]); + exit(0); + } + } + name = av[i]; + if (!name) { + printf("%s: configuration file missing\n", av[0]); + } + conf_parse(name); + //zconfdump(stdout); + switch (input_mode) { + case set_default: + if (!defconfig_file) + defconfig_file = conf_get_default_confname(); + if (conf_read(defconfig_file)) { + printf("***\n" + "*** Can't find default configuration \"%s\"!\n" + "***\n", defconfig_file); + exit(1); + } + break; + case ask_silent: + if (stat(".config", &tmpstat)) { + printf("***\n" + "*** You have not yet configured Buildroot!\n" + "***\n" + "*** Please run some configurator (e.g. \"make oldconfig\" or\n" + "*** \"make menuconfig\" or \"make config\").\n" + "***\n"); + exit(1); + } + case ask_all: + case ask_new: + conf_read(NULL); + break; + default: + break; + } + + if (input_mode != ask_silent) { + rootEntry = &rootmenu; + conf(&rootmenu); + if (input_mode == ask_all) { + input_mode = ask_silent; + valid_stdin = 1; + } + } + do { + conf_cnt = 0; + check_conf(&rootmenu); + } while (conf_cnt); + if (conf_write(NULL)) { + fprintf(stderr, "\n*** Error during writing of the Buildroot configuration.\n\n"); + return 1; + } + return 0; +} diff --git a/openwrt/package/config/confdata.c b/openwrt/package/config/confdata.c new file mode 100644 index 0000000000..fd3a345e26 --- /dev/null +++ b/openwrt/package/config/confdata.c @@ -0,0 +1,447 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +const char conf_def_filename[] = ".config"; + +const char conf_defname[] = "sysdeps/linux/defconfig"; + +const char *conf_confnames[] = { + ".config", + conf_defname, + NULL, +}; + +static char *conf_expand_value(const char *in) +{ + struct symbol *sym; + const char *src; + static char res_value[SYMBOL_MAXLENGTH]; + char *dst, name[SYMBOL_MAXLENGTH]; + + res_value[0] = 0; + dst = name; + while ((src = strchr(in, '$'))) { + strncat(res_value, in, src - in); + src++; + dst = name; + while (isalnum(*src) || *src == '_') + *dst++ = *src++; + *dst = 0; + sym = sym_lookup(name, 0); + sym_calc_value(sym); + strcat(res_value, sym_get_string_value(sym)); + in = src; + } + strcat(res_value, in); + + return res_value; +} + +char *conf_get_default_confname(void) +{ + struct stat buf; + static char fullname[PATH_MAX+1]; + char *env, *name; + + name = conf_expand_value(conf_defname); + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + if (!stat(fullname, &buf)) + return fullname; + } + return name; +} + +int conf_read(const char *name) +{ + FILE *in = NULL; + char line[1024]; + char *p, *p2; + int lineno = 0; + struct symbol *sym; + struct property *prop; + struct expr *e; + int i; + + if (name) { + in = zconf_fopen(name); + } else { + const char **names = conf_confnames; + while ((name = *names++)) { + name = conf_expand_value(name); + in = zconf_fopen(name); + if (in) { + printf("#\n" + "# using defaults found in %s\n" + "#\n", name); + break; + } + } + } + + if (!in) + return 1; + + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; + sym->flags &= ~SYMBOL_VALID; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->user.val) + free(sym->user.val); + default: + sym->user.val = NULL; + sym->user.tri = no; + } + } + + while (fgets(line, sizeof(line), in)) { + lineno++; + sym = NULL; + switch (line[0]) { + case '#': + if (line[1]!=' ') + continue; + p = strchr(line + 2, ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + sym = sym_find(line + 2); + if (!sym) { + fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2); + break; + } + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + sym->user.tri = no; + sym->flags &= ~SYMBOL_NEW; + break; + default: + ; + } + break; + + case 'A' ... 'Z': + p = strchr(line, '='); + if (!p) + continue; + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) + *p2 = 0; + sym = sym_find(line); + if (!sym) { + fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line); + break; + } + switch (sym->type) { + case S_TRISTATE: + if (p[0] == 'm') { + sym->user.tri = mod; + sym->flags &= ~SYMBOL_NEW; + break; + } + case S_BOOLEAN: + if (p[0] == 'y') { + sym->user.tri = yes; + sym->flags &= ~SYMBOL_NEW; + break; + } + if (p[0] == 'n') { + sym->user.tri = no; + sym->flags &= ~SYMBOL_NEW; + break; + } + break; + case S_STRING: + if (*p++ != '"') + break; + for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { + if (*p2 == '"') { + *p2 = 0; + break; + } + memmove(p2, p2 + 1, strlen(p2)); + } + if (!p2) { + fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); + exit(1); + } + case S_INT: + case S_HEX: + if (sym_string_valid(sym, p)) { + sym->user.val = strdup(p); + sym->flags &= ~SYMBOL_NEW; + } else { + fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); + exit(1); + } + break; + default: + ; + } + break; + case '\n': + break; + default: + continue; + } + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->user.tri) { + case no: + break; + case mod: + if (cs->user.tri == yes) + /* warn? */; + break; + case yes: + if (cs->user.tri != no) + /* warn? */; + cs->user.val = sym; + break; + } + cs->user.tri = E_OR(cs->user.tri, sym->user.tri); + cs->flags &= ~SYMBOL_NEW; + } + } + fclose(in); + + if (modules_sym) + sym_calc_value(modules_sym); + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_has_value(sym) && !sym_is_choice_value(sym)) { + if (sym->visible == no) + sym->flags |= SYMBOL_NEW; + switch (sym->type) { + case S_STRING: + case S_INT: + case S_HEX: + if (!sym_string_within_range(sym, sym->user.val)) + sym->flags |= SYMBOL_NEW; + default: + break; + } + } + if (!sym_is_choice(sym)) + continue; + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) + if (e->right.sym->visible != no) + sym->flags |= e->right.sym->flags & SYMBOL_NEW; + } + + sym_change_count = 1; + + return 0; +} + +int conf_write(const char *name) +{ + FILE *out, *out_h; + struct symbol *sym; + struct menu *menu; + const char *basename; + char dirname[128], tmpname[128], newname[128]; + int type, l; + const char *str; + + dirname[0] = 0; + if (name && name[0]) { + struct stat st; + char *slash; + + if (!stat(name, &st) && S_ISDIR(st.st_mode)) { + strcpy(dirname, name); + strcat(dirname, "/"); + basename = conf_def_filename; + } else if ((slash = strrchr(name, '/'))) { + int size = slash - name + 1; + memcpy(dirname, name, size); + dirname[size] = 0; + if (slash[1]) + basename = slash + 1; + else + basename = conf_def_filename; + } else + basename = name; + } else + basename = conf_def_filename; + + sprintf(newname, "%s.tmpconfig.%d", dirname, getpid()); + out = fopen(newname, "w"); + if (!out) + return 1; + out_h = NULL; + if (!name) { + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) + return 1; + } + fprintf(out, "#\n" + "# Automatically generated make config: don't edit\n" + "#\n"); + if (out_h) { + fprintf(out_h, "/*\n" + " * Automatically generated header file: don't edit\n" + " */\n\n" + "#define AUTOCONF_INCLUDED\n\n" + "/* Version Number */\n" + "#define BB_VER \"%s\"\n" + "#define BB_BT \"%s\"\n", + getenv("VERSION"), + getenv("BUILDTIME")); + if (getenv("EXTRA_VERSION")) + fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n", + getenv("EXTRA_VERSION")); + fprintf(out_h, "\n"); + } + + if (!sym_change_count) + sym_clear_all_valid(); + + menu = rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + str = menu_get_prompt(menu); + fprintf(out, "\n" + "#\n" + "# %s\n" + "#\n", str); + if (out_h) + fprintf(out_h, "\n" + "/*\n" + " * %s\n" + " */\n", str); + } else if (!(sym->flags & SYMBOL_CHOICE)) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE)) + goto next; + sym->flags &= ~SYMBOL_WRITE; + type = sym->type; + if (type == S_TRISTATE) { + sym_calc_value(modules_sym); + if (modules_sym->curr.tri == no) + type = S_BOOLEAN; + } + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + fprintf(out, "# %s is not set\n", sym->name); + if (out_h) + fprintf(out_h, "#undef %s\n", sym->name); + break; + case mod: +#if 0 + fprintf(out, "%s=m\n", sym->name); + if (out_h) + fprintf(out_h, "#define %s_MODULE 1\n", sym->name); +#endif + break; + case yes: + fprintf(out, "%s=y\n", sym->name); + if (out_h) + fprintf(out_h, "#define %s 1\n", sym->name); + break; + } + break; + case S_STRING: + // fix me + str = sym_get_string_value(sym); + fprintf(out, "%s=\"", sym->name); + if (out_h) + fprintf(out_h, "#define %s \"", sym->name); + do { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + if (out_h) + fwrite(str, l, 1, out_h); + } + str += l; + while (*str == '\\' || *str == '"') { + fprintf(out, "\\%c", *str); + if (out_h) + fprintf(out_h, "\\%c", *str); + str++; + } + } while (*str); + fputs("\"\n", out); + if (out_h) + fputs("\"\n", out_h); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "%s=%s\n", sym->name, str); + if (out_h) + fprintf(out_h, "#define %s 0x%s\n", sym->name, str); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "%s=%s\n", sym->name, str); + if (out_h) + fprintf(out_h, "#define %s %s\n", sym->name, str); + break; + } + } + + next: + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->next) { + menu = menu->next; + break; + } + } + } + fclose(out); + if (out_h) { + fclose(out_h); + rename(".tmpconfig.h", "include/config.h"); + file_write_dep(NULL); + } + if (!name || basename != conf_def_filename) { + if (!name) + name = conf_def_filename; + sprintf(tmpname, "%s.old", name); + rename(name, tmpname); + } + sprintf(tmpname, "%s%s", dirname, basename); + if (rename(newname, tmpname)) + return 1; + + sym_change_count = 0; + + return 0; +} diff --git a/openwrt/package/config/dialog.h b/openwrt/package/config/dialog.h new file mode 100644 index 0000000000..6486cc8f77 --- /dev/null +++ b/openwrt/package/config/dialog.h @@ -0,0 +1,196 @@ + +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include + +#ifdef CURSES_LOC +#include CURSES_LOC + +/* + * Colors in ncurses 1.9.9e do not work properly since foreground and + * background colors are OR'd rather than separately masked. This version + * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible + * with standard curses. The simplest fix (to make this work with standard + * curses) uses the wbkgdset() function, not used in the original hack. + * Turn it off if we're building with 1.9.9e, since it just confuses things. + */ +#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) +#define OLD_NCURSES 1 +#undef wbkgdset +#define wbkgdset(w,p) /*nothing*/ +#else +#define OLD_NCURSES 0 +#endif + +#define TR(params) _tracef params + +#define ESC 27 +#define TAB 9 +#define MAX_LEN 2048 +#define BUF_SIZE (10*1024) +#define MIN(x,y) (x < y ? x : y) +#define MAX(x,y) (x > y ? x : y) + + +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif + +/* + * Attribute names + */ +#define screen_attr attributes[0] +#define shadow_attr attributes[1] +#define dialog_attr attributes[2] +#define title_attr attributes[3] +#define border_attr attributes[4] +#define button_active_attr attributes[5] +#define button_inactive_attr attributes[6] +#define button_key_active_attr attributes[7] +#define button_key_inactive_attr attributes[8] +#define button_label_active_attr attributes[9] +#define button_label_inactive_attr attributes[10] +#define inputbox_attr attributes[11] +#define inputbox_border_attr attributes[12] +#define searchbox_attr attributes[13] +#define searchbox_title_attr attributes[14] +#define searchbox_border_attr attributes[15] +#define position_indicator_attr attributes[16] +#define menubox_attr attributes[17] +#define menubox_border_attr attributes[18] +#define item_attr attributes[19] +#define item_selected_attr attributes[20] +#define tag_attr attributes[21] +#define tag_selected_attr attributes[22] +#define tag_key_attr attributes[23] +#define tag_key_selected_attr attributes[24] +#define check_attr attributes[25] +#define check_selected_attr attributes[26] +#define uarrow_attr attributes[27] +#define darrow_attr attributes[28] + +/* number of attributes */ +#define ATTRIBUTE_COUNT 29 + +/* + * Global variables + */ +extern bool use_colors; + +extern chtype attributes[]; +#endif + +extern char *backtitle; + +struct dialog_list_item { + char *name; + int namelen; + char *tag; + int selected; /* Set to 1 by dialog_*() function. */ +}; + +/* + * Function prototypes + */ + +void init_dialog (void); +void end_dialog (void); +void dialog_clear (void); +#ifdef CURSES_LOC +void attr_clear (WINDOW * win, int height, int width, chtype attr); +void color_setup (void); +void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x); +void print_button (WINDOW * win, const char *label, int y, int x, int selected); +void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, + chtype border); +void draw_shadow (WINDOW * win, int y, int x, int height, int width); +#endif + +int first_alpha (const char *string, const char *exempt); +int dialog_yesno (const char *title, const char *prompt, int height, int width); +int dialog_msgbox (const char *title, const char *prompt, int height, + int width, int pause); +int dialog_textbox (const char *title, const char *file, int height, int width); +int dialog_menu (const char *title, const char *prompt, int height, int width, + int menu_height, const char *choice, int item_no, + struct dialog_list_item ** items); +int dialog_checklist (const char *title, const char *prompt, int height, + int width, int list_height, int item_no, + struct dialog_list_item ** items, int flag); +extern unsigned char dialog_input_result[]; +int dialog_inputbox (const char *title, const char *prompt, int height, + int width, const char *init); + +struct dialog_list_item *first_sel_item(int item_no, + struct dialog_list_item ** items); + +/* + * This is the base for fictitious keys, which activate + * the buttons. + * + * Mouse-generated keys are the following: + * -- the first 32 are used as numbers, in addition to '0'-'9' + * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') + * -- uppercase chars are used to invoke the button (M_EVENT + 'O') + */ +#ifdef CURSES_LOC +#define M_EVENT (KEY_MAX+1) +#endif + + +/* + * The `flag' parameter in checklist is used to select between + * radiolist and checklist + */ +#define FLAG_CHECK 1 +#define FLAG_RADIO 0 diff --git a/openwrt/package/config/expr.c b/openwrt/package/config/expr.c new file mode 100644 index 0000000000..10f45232b4 --- /dev/null +++ b/openwrt/package/config/expr.c @@ -0,0 +1,1089 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define DEBUG_EXPR 0 + +struct expr *expr_alloc_symbol(struct symbol *sym) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = E_SYMBOL; + e->left.sym = sym; + return e; +} + +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = ce; + return e; +} + +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = e1; + e->right.expr = e2; + return e; +} + +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.sym = s1; + e->right.sym = s2; + return e; +} + +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; +} + +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; +} + +struct expr *expr_copy(struct expr *org) +{ + struct expr *e; + + if (!org) + return NULL; + + e = malloc(sizeof(*org)); + memcpy(e, org, sizeof(*org)); + switch (org->type) { + case E_SYMBOL: + e->left = org->left; + break; + case E_NOT: + e->left.expr = expr_copy(org->left.expr); + break; + case E_EQUAL: + case E_UNEQUAL: + e->left.sym = org->left.sym; + e->right.sym = org->right.sym; + break; + case E_AND: + case E_OR: + case E_CHOICE: + e->left.expr = expr_copy(org->left.expr); + e->right.expr = expr_copy(org->right.expr); + break; + default: + printf("can't copy type %d\n", e->type); + free(e); + e = NULL; + break; + } + + return e; +} + +void expr_free(struct expr *e) +{ + if (!e) + return; + + switch (e->type) { + case E_SYMBOL: + break; + case E_NOT: + expr_free(e->left.expr); + return; + case E_EQUAL: + case E_UNEQUAL: + break; + case E_OR: + case E_AND: + expr_free(e->left.expr); + expr_free(e->right.expr); + break; + default: + printf("how to free type %d?\n", e->type); + break; + } + free(e); +} + +static int trans_count; + +#define e1 (*ep1) +#define e2 (*ep2) + +static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ + if (e1->type == type) { + __expr_eliminate_eq(type, &e1->left.expr, &e2); + __expr_eliminate_eq(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + __expr_eliminate_eq(type, &e1, &e2->left.expr); + __expr_eliminate_eq(type, &e1, &e2->right.expr); + return; + } + if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) + return; + if (!expr_eq(e1, e2)) + return; + trans_count++; + expr_free(e1); expr_free(e2); + switch (type) { + case E_OR: + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + break; + case E_AND: + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + break; + default: + ; + } +} + +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) +{ + if (!e1 || !e2) + return; + switch (e1->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e1->type, ep1, ep2); + default: + ; + } + if (e1->type != e2->type) switch (e2->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e2->type, ep1, ep2); + default: + ; + } + e1 = expr_eliminate_yn(e1); + e2 = expr_eliminate_yn(e2); +} + +#undef e1 +#undef e2 + +int expr_eq(struct expr *e1, struct expr *e2) +{ + int res, old_count; + + if (e1->type != e2->type) + return 0; + switch (e1->type) { + case E_EQUAL: + case E_UNEQUAL: + return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; + case E_SYMBOL: + return e1->left.sym == e2->left.sym; + case E_NOT: + return expr_eq(e1->left.expr, e2->left.expr); + case E_AND: + case E_OR: + e1 = expr_copy(e1); + e2 = expr_copy(e2); + old_count = trans_count; + expr_eliminate_eq(&e1, &e2); + res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym); + expr_free(e1); + expr_free(e2); + trans_count = old_count; + return res; + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + + if (DEBUG_EXPR) { + expr_fprint(e1, stdout); + printf(" = "); + expr_fprint(e2, stdout); + printf(" ?\n"); + } + + return 0; +} + +struct expr *expr_eliminate_yn(struct expr *e) +{ + struct expr *tmp; + + if (e) switch (e->type) { + case E_AND: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } + } + break; + case E_OR: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + break; + default: + ; + } + return e; +} + +/* + * bool FOO!=n => FOO + */ +struct expr *expr_trans_bool(struct expr *e) +{ + if (!e) + return NULL; + switch (e->type) { + case E_AND: + case E_OR: + case E_NOT: + e->left.expr = expr_trans_bool(e->left.expr); + e->right.expr = expr_trans_bool(e->right.expr); + break; + case E_UNEQUAL: + // FOO!=n -> FOO + if (e->left.sym->type == S_TRISTATE) { + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + } + } + break; + default: + ; + } + return e; +} + +/* + * e1 || e2 -> ? + */ +struct expr *expr_join_or(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='m') -> (a!='n') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='n') -> (a!='m') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { + // (a='m') || (a='n') -> (a!='y') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); + } + } + if (sym1->type == S_BOOLEAN && sym1 == sym2) { + if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || + (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) + return expr_alloc_symbol(&symbol_yes); + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") || ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +struct expr *expr_join_and(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) + // (a) && (a='y') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) + // (a) && (a!='n') -> (a) + return expr_alloc_symbol(sym1); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) + // (a) && (a!='m') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e1->right.sym; + if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e2->right.sym; + if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='m') -> (a='n') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) + // (a!='m') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || + (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) + return NULL; + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") && ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp; + + if (e1->type == type) { + expr_eliminate_dups1(type, &e1->left.expr, &e2); + expr_eliminate_dups1(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups1(type, &e1, &e2->left.expr); + expr_eliminate_dups1(type, &e1, &e2->right.expr); + return; + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e1->type, &e1, &e1); + default: + ; + } + + switch (type) { + case E_OR: + tmp = expr_join_or(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_no); + e2 = tmp; + trans_count++; + } + break; + case E_AND: + tmp = expr_join_and(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_yes); + e2 = tmp; + trans_count++; + } + break; + default: + ; + } +#undef e1 +#undef e2 +} + +static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp, *tmp1, *tmp2; + + if (e1->type == type) { + expr_eliminate_dups2(type, &e1->left.expr, &e2); + expr_eliminate_dups2(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups2(type, &e1, &e2->left.expr); + expr_eliminate_dups2(type, &e1, &e2->right.expr); + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO || BAR) && (!FOO && !BAR) -> n + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_and(&tmp1, &tmp2); + if (expr_is_yes(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_no); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + case E_AND: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO && BAR) || (!FOO || !BAR) -> y + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_or(&tmp1, &tmp2); + if (expr_is_no(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_yes); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + default: + ; + } +#undef e1 +#undef e2 +} + +struct expr *expr_eliminate_dups(struct expr *e) +{ + int oldcount; + if (!e) + return e; + + oldcount = trans_count; + while (1) { + trans_count = 0; + switch (e->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e->type, &e, &e); + expr_eliminate_dups2(e->type, &e, &e); + default: + ; + } + if (!trans_count) + break; + e = expr_eliminate_yn(e); + } + trans_count = oldcount; + return e; +} + +struct expr *expr_transform(struct expr *e) +{ + struct expr *tmp; + + if (!e) + return NULL; + switch (e->type) { + case E_EQUAL: + case E_UNEQUAL: + case E_SYMBOL: + case E_CHOICE: + break; + default: + e->left.expr = expr_transform(e->left.expr); + e->right.expr = expr_transform(e->right.expr); + } + + switch (e->type) { + case E_EQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + break; + case E_UNEQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + break; + case E_NOT: + switch (e->left.expr->type) { + case E_NOT: + // !!a -> a + tmp = e->left.expr->left.expr; + free(e->left.expr); + free(e); + e = tmp; + e = expr_transform(e); + break; + case E_EQUAL: + case E_UNEQUAL: + // !a='x' -> a!='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; + break; + case E_OR: + // !(a || b) -> !a && !b + tmp = e->left.expr; + e->type = E_AND; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_AND: + // !(a && b) -> !a || !b + tmp = e->left.expr; + e->type = E_OR; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_SYMBOL: + if (e->left.expr->left.sym == &symbol_yes) { + // !'y' -> 'n' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + break; + } + if (e->left.expr->left.sym == &symbol_mod) { + // !'m' -> 'm' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_mod; + break; + } + if (e->left.expr->left.sym == &symbol_no) { + // !'n' -> 'y' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + break; + } + break; + default: + ; + } + break; + default: + ; + } + return e; +} + +int expr_contains_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return 0; + + switch (dep->type) { + case E_AND: + case E_OR: + return expr_contains_symbol(dep->left.expr, sym) || + expr_contains_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + case E_UNEQUAL: + return dep->left.sym == sym || + dep->right.sym == sym; + case E_NOT: + return expr_contains_symbol(dep->left.expr, sym); + default: + ; + } + return 0; +} + +bool expr_depends_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return false; + + switch (dep->type) { + case E_AND: + return expr_depends_symbol(dep->left.expr, sym) || + expr_depends_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) + return true; + } + break; + case E_UNEQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_no) + return true; + } + break; + default: + ; + } + return false; +} + +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_AND, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_OR, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + if (e1->type == type) { + expr_extract_eq(type, ep, &e1->left.expr, &e2); + expr_extract_eq(type, ep, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_extract_eq(type, ep, ep1, &e2->left.expr); + expr_extract_eq(type, ep, ep1, &e2->right.expr); + return; + } + if (expr_eq(e1, e2)) { + *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1; + expr_free(e2); + if (type == E_AND) { + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + } else if (type == E_OR) { + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + } + } +#undef e1 +#undef e2 +} + +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) +{ + struct expr *e1, *e2; + + if (!e) { + e = expr_alloc_symbol(sym); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + } + switch (e->type) { + case E_AND: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_AND, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_OR, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_OR: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_OR, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_AND, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_NOT: + return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); + case E_UNEQUAL: + case E_EQUAL: + if (type == E_EQUAL) { + if (sym == &symbol_yes) + return expr_copy(e); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_no); + if (sym == &symbol_no) + return expr_alloc_one(E_NOT, expr_copy(e)); + } else { + if (sym == &symbol_yes) + return expr_alloc_one(E_NOT, expr_copy(e)); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_yes); + if (sym == &symbol_no) + return expr_copy(e); + } + break; + case E_SYMBOL: + return expr_alloc_comp(type, e->left.sym, sym); + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + return NULL; +} + +tristate expr_calc_value(struct expr *e) +{ + tristate val1, val2; + const char *str1, *str2; + + if (!e) + return yes; + + switch (e->type) { + case E_SYMBOL: + sym_calc_value(e->left.sym); + return e->left.sym->curr.tri; + case E_AND: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_AND(val1, val2); + case E_OR: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_OR(val1, val2); + case E_NOT: + val1 = expr_calc_value(e->left.expr); + return E_NOT(val1); + case E_EQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? yes : no; + case E_UNEQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? no : yes; + default: + printf("expr_calc_value: %d?\n", e->type); + return no; + } +} + +int expr_compare_type(enum expr_type t1, enum expr_type t2) +{ +#if 0 + return 1; +#else + if (t1 == t2) + return 0; + switch (t1) { + case E_EQUAL: + case E_UNEQUAL: + if (t2 == E_NOT) + return 1; + case E_NOT: + if (t2 == E_AND) + return 1; + case E_AND: + if (t2 == E_OR) + return 1; + case E_OR: + if (t2 == E_CHOICE) + return 1; + case E_CHOICE: + if (t2 == 0) + return 1; + default: + return -1; + } + printf("[%dgt%d?]", t1, t2); + return 0; +#endif +} + +void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) +{ + if (!e) { + fn(data, "y"); + return; + } + + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, "("); + switch (e->type) { + case E_SYMBOL: + if (e->left.sym->name) + fn(data, e->left.sym->name); + else + fn(data, ""); + break; + case E_NOT: + fn(data, "!"); + expr_print(e->left.expr, fn, data, E_NOT); + break; + case E_EQUAL: + fn(data, e->left.sym->name); + fn(data, "="); + fn(data, e->right.sym->name); + break; + case E_UNEQUAL: + fn(data, e->left.sym->name); + fn(data, "!="); + fn(data, e->right.sym->name); + break; + case E_OR: + expr_print(e->left.expr, fn, data, E_OR); + fn(data, " || "); + expr_print(e->right.expr, fn, data, E_OR); + break; + case E_AND: + expr_print(e->left.expr, fn, data, E_AND); + fn(data, " && "); + expr_print(e->right.expr, fn, data, E_AND); + break; + case E_CHOICE: + fn(data, e->right.sym->name); + if (e->left.expr) { + fn(data, " ^ "); + expr_print(e->left.expr, fn, data, E_CHOICE); + } + break; + case E_RANGE: + fn(data, "["); + fn(data, e->left.sym->name); + fn(data, " "); + fn(data, e->right.sym->name); + fn(data, "]"); + break; + default: + { + char buf[32]; + sprintf(buf, "", e->type); + fn(data, buf); + break; + } + } + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, ")"); +} + +static void expr_print_file_helper(void *data, const char *str) +{ + fwrite(str, strlen(str), 1, data); +} + +void expr_fprint(struct expr *e, FILE *out) +{ + expr_print(e, expr_print_file_helper, out, E_NONE); +} diff --git a/openwrt/package/config/expr.h b/openwrt/package/config/expr.h new file mode 100644 index 0000000000..cac51f6a86 --- /dev/null +++ b/openwrt/package/config/expr.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifndef __cplusplus +#include +#endif + +struct file { + struct file *next; + struct file *parent; + char *name; + int lineno; + int flags; +}; + +#define FILE_BUSY 0x0001 +#define FILE_SCANNED 0x0002 +#define FILE_PRINTED 0x0004 + +typedef enum tristate { + no, mod, yes +} tristate; + +enum expr_type { + E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE +}; + +union expr_data { + struct expr *expr; + struct symbol *sym; +}; + +struct expr { + enum expr_type type; + union expr_data left, right; +}; + +#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) +#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) +#define E_NOT(dep) (2-(dep)) + +struct expr_value { + struct expr *expr; + tristate tri; +}; + +struct symbol_value { + void *val; + tristate tri; +}; + +enum symbol_type { + S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER +}; + +struct symbol { + struct symbol *next; + char *name; + char *help; + enum symbol_type type; + struct symbol_value curr, user; + tristate visible; + int flags; + struct property *prop; + struct expr *dep, *dep2; + struct expr_value rev_dep; +}; + +#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) + +#define SYMBOL_YES 0x0001 +#define SYMBOL_MOD 0x0002 +#define SYMBOL_NO 0x0004 +#define SYMBOL_CONST 0x0007 +#define SYMBOL_CHECK 0x0008 +#define SYMBOL_CHOICE 0x0010 +#define SYMBOL_CHOICEVAL 0x0020 +#define SYMBOL_PRINTED 0x0040 +#define SYMBOL_VALID 0x0080 +#define SYMBOL_OPTIONAL 0x0100 +#define SYMBOL_WRITE 0x0200 +#define SYMBOL_CHANGED 0x0400 +#define SYMBOL_NEW 0x0800 +#define SYMBOL_AUTO 0x1000 +#define SYMBOL_CHECKED 0x2000 +#define SYMBOL_CHECK_DONE 0x4000 +#define SYMBOL_WARNED 0x8000 + +#define SYMBOL_MAXLENGTH 256 +#define SYMBOL_HASHSIZE 257 +#define SYMBOL_HASHMASK 0xff + +enum prop_type { + P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE +}; + +struct property { + struct property *next; + struct symbol *sym; + enum prop_type type; + const char *text; + struct expr_value visible; + struct expr *expr; + struct menu *menu; + struct file *file; + int lineno; +}; + +#define for_all_properties(sym, st, tok) \ + for (st = sym->prop; st; st = st->next) \ + if (st->type == (tok)) +#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) +#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) +#define for_all_prompts(sym, st) \ + for (st = sym->prop; st; st = st->next) \ + if (st->text) + +struct menu { + struct menu *next; + struct menu *parent; + struct menu *list; + struct symbol *sym; + struct property *prompt; + struct expr *dep; + unsigned int flags; + //char *help; + struct file *file; + int lineno; + void *data; +}; + +#define MENU_CHANGED 0x0001 +#define MENU_ROOT 0x0002 + +#ifndef SWIG + +extern struct file *file_list; +extern struct file *current_file; +struct file *lookup_file(const char *name); + +extern struct symbol symbol_yes, symbol_no, symbol_mod; +extern struct symbol *modules_sym; +extern int cdebug; +struct expr *expr_alloc_symbol(struct symbol *sym); +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); +struct expr *expr_copy(struct expr *org); +void expr_free(struct expr *e); +int expr_eq(struct expr *e1, struct expr *e2); +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); +tristate expr_calc_value(struct expr *e); +struct expr *expr_eliminate_yn(struct expr *e); +struct expr *expr_trans_bool(struct expr *e); +struct expr *expr_eliminate_dups(struct expr *e); +struct expr *expr_transform(struct expr *e); +int expr_contains_symbol(struct expr *dep, struct symbol *sym); +bool expr_depends_symbol(struct expr *dep, struct symbol *sym); +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); + +void expr_fprint(struct expr *e, FILE *out); + +static inline int expr_is_yes(struct expr *e) +{ + return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); +} + +static inline int expr_is_no(struct expr *e) +{ + return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EXPR_H */ diff --git a/openwrt/package/config/inputbox.c b/openwrt/package/config/inputbox.c new file mode 100644 index 0000000000..fa7bebc693 --- /dev/null +++ b/openwrt/package/config/inputbox.c @@ -0,0 +1,240 @@ +/* + * inputbox.c -- implements the input box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +unsigned char dialog_input_result[MAX_LEN + 1]; + +/* + * Print the termination buttons + */ +static void +print_buttons(WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button (dialog, " Ok ", y, x, selected==0); + print_button (dialog, " Help ", y, x + 14, selected==1); + + wmove(dialog, y, x+1+14*selected); + wrefresh(dialog); +} + +/* + * Display a dialog box for inputing a string + */ +int +dialog_inputbox (const char *title, const char *prompt, int height, int width, + const char *init) +{ + int i, x, y, box_y, box_x, box_width; + int input_x = 0, scroll = 0, key = 0, button = -1; + unsigned char *instr = dialog_input_result; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + /* Draw the input field box */ + box_width = width - 6; + getyx (dialog, y, x); + box_y = y + 2; + box_x = (width - box_width) / 2; + draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2, + border_attr, dialog_attr); + + print_buttons(dialog, height, width, 0); + + /* Set up the initial value */ + wmove (dialog, box_y, box_x); + wattrset (dialog, inputbox_attr); + + if (!init) + instr[0] = '\0'; + else + strcpy (instr, init); + + input_x = strlen (instr); + + if (input_x >= box_width) { + scroll = input_x - box_width + 1; + input_x = box_width - 1; + for (i = 0; i < box_width - 1; i++) + waddch (dialog, instr[scroll + i]); + } else + waddstr (dialog, instr); + + wmove (dialog, box_y, box_x + input_x); + + wrefresh (dialog); + + while (key != ESC) { + key = wgetch (dialog); + + if (button == -1) { /* Input box selected */ + switch (key) { + case TAB: + case KEY_UP: + case KEY_DOWN: + break; + case KEY_LEFT: + continue; + case KEY_RIGHT: + continue; + case KEY_BACKSPACE: + case 127: + if (input_x || scroll) { + wattrset (dialog, inputbox_attr); + if (!input_x) { + scroll = scroll < box_width - 1 ? + 0 : scroll - (box_width - 1); + wmove (dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch (dialog, instr[scroll + input_x + i] ? + instr[scroll + input_x + i] : ' '); + input_x = strlen (instr) - scroll; + } else + input_x--; + instr[scroll + input_x] = '\0'; + mvwaddch (dialog, box_y, input_x + box_x, ' '); + wmove (dialog, box_y, input_x + box_x); + wrefresh (dialog); + } + continue; + default: + if (key < 0x100 && isprint (key)) { + if (scroll + input_x < MAX_LEN) { + wattrset (dialog, inputbox_attr); + instr[scroll + input_x] = key; + instr[scroll + input_x + 1] = '\0'; + if (input_x == box_width - 1) { + scroll++; + wmove (dialog, box_y, box_x); + for (i = 0; i < box_width - 1; i++) + waddch (dialog, instr[scroll + i]); + } else { + wmove (dialog, box_y, input_x++ + box_x); + waddch (dialog, key); + } + wrefresh (dialog); + } else + flash (); /* Alarm user about overflow */ + continue; + } + } + } + switch (key) { + case 'O': + case 'o': + delwin (dialog); + return 0; + case 'H': + case 'h': + delwin (dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + switch (button) { + case -1: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove (dialog, box_y, box_x + input_x); + wrefresh (dialog); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + case 0: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove (dialog, box_y, box_x + input_x); + wrefresh (dialog); + break; + } + break; + case ' ': + case '\n': + delwin (dialog); + return (button == -1 ? 0 : button); + case 'X': + case 'x': + key = ESC; + case ESC: + break; + } + } + + delwin (dialog); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/lex.zconf.c_shipped b/openwrt/package/config/lex.zconf.c_shipped new file mode 100644 index 0000000000..b877bb6b3c --- /dev/null +++ b/openwrt/package/config/lex.zconf.c_shipped @@ -0,0 +1,3688 @@ + +#line 3 "lex.zconf.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE zconfrestart(zconfin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int zconfleng; + +extern FILE *zconfin, *zconfout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via zconfrestart()), so that the user can continue scanning by + * just pointing zconfin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when zconftext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int zconfleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow zconfwrap()'s to do buffer switches + * instead of setting up a fresh zconfin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void zconfrestart (FILE *input_file ); +void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); +void zconf_delete_buffer (YY_BUFFER_STATE b ); +void zconf_flush_buffer (YY_BUFFER_STATE b ); +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); +void zconfpop_buffer_state (void ); + +static void zconfensure_buffer_stack (void ); +static void zconf_load_buffer_state (void ); +static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); + +void *zconfalloc (yy_size_t ); +void *zconfrealloc (void *,yy_size_t ); +void zconffree (void * ); + +#define yy_new_buffer zconf_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define zconfwrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; + +typedef int yy_state_type; + +extern int zconflineno; + +int zconflineno = 1; + +extern char *zconftext; +#define yytext_ptr zconftext +static yyconst flex_int16_t yy_nxt[][38] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, + 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, + 27, 18, 28, 29, 30, 18, 18, 16 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, + 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, + 27, 18, 28, 29, 30, 18, 18, 16 + + }, + + { + 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31 + }, + + { + 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31 + }, + + { + 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, + + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34 + }, + + { + 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34 + }, + + { + 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, + 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 52 + + }, + + { + 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, + 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 52 + }, + + { + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11 + }, + + { + 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12 + }, + + { + 11, -13, 53, 54, -13, -13, 55, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13 + }, + + { + 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14 + + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16 + }, + + { + 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17 + }, + + { + 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, 58, -18, -18, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -18 + }, + + { + 11, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, 58, -19, -19, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, + 58, 58, 58, 58, 58, 58, 58, -19 + + }, + + { + 11, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, 58, -20, -20, 58, 58, 58, 58, + 58, 58, 58, 58, 60, 58, 58, 58, 58, 61, + 58, 58, 58, 58, 58, 58, 58, -20 + }, + + { + 11, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, 58, -21, -21, 58, 58, 58, 58, + 58, 62, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -21 + }, + + { + 11, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, 58, -22, -22, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 63, 58, + 58, 58, 58, 58, 58, 58, 58, -22 + }, + + { + 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, 58, -23, -23, 58, 58, 58, 58, + 58, 64, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -23 + }, + + { + 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, 58, -24, -24, 58, 58, 58, 58, + 58, 58, 65, 58, 58, 58, 58, 58, 66, 58, + 58, 58, 58, 58, 58, 58, 58, -24 + + }, + + { + 11, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, 58, -25, -25, 58, 67, 58, 58, + 58, 68, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -25 + }, + + { + 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, 58, -26, -26, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 69, 58, 58, 58, 58, 58, 58, -26 + }, + + { + 11, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, 58, -27, -27, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 70, 58, 58, 58, 58, -27 + }, + + { + 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, 58, -28, -28, 58, 71, 58, 58, + 58, 72, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -28 + }, + + { + 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, 58, -29, -29, 58, 58, 58, 58, + 58, 73, 58, 58, 58, 58, 58, 58, 58, 74, + 58, 58, 58, 58, 75, 58, 58, -29 + + }, + + { + 11, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, 58, -30, -30, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 76, 58, 58, 58, 58, -30 + }, + + { + 11, 77, 77, -31, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77 + }, + + { + 11, -32, 78, 79, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32 + }, + + { + 11, 80, -33, -33, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80 + }, + + { + 11, 81, 81, 82, 81, -34, 81, 81, -34, 81, + 81, 81, 81, 81, 81, -34, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81 + + }, + + { + 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35 + }, + + { + 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36 + }, + + { + 11, 83, 83, 84, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83 + }, + + { + 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38 + }, + + { + 11, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39 + + }, + + { + 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, 85, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40 + }, + + { + 11, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41 + }, + + { + 11, 86, 86, -42, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86 + }, + + { + 11, -43, -43, -43, -43, -43, -43, 87, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43 + }, + + { + 11, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44 + + }, + + { + 11, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45 + }, + + { + 11, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, 88, 89, 89, -46, -46, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -46 + }, + + { + 11, -47, -47, -47, -47, -47, -47, -47, -47, -47, + -47, 89, 89, 89, -47, -47, 89, 89, 89, 89, + + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -47 + }, + + { + 11, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48 + }, + + { + 11, -49, -49, 90, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49 + + }, + + { + 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, 89, 89, 89, -50, -50, 89, 89, 89, 89, + 89, 89, 91, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -50 + }, + + { + 11, -51, -51, -51, -51, -51, -51, -51, -51, -51, + -51, 89, 89, 89, -51, -51, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 92, 89, + 89, 89, 89, 89, 89, 89, 89, -51 + }, + + { + 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, 93 + }, + + { + 11, -53, 53, 54, -53, -53, 55, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53 + }, + + { + 11, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54 + + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, + + -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, -57, -57, -57, -57, -57, -57, -57 + }, + + { + 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, 58, -58, -58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -58 + }, + + { + 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, 58, -59, -59, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 94, + 58, 58, 58, 58, 58, 58, 58, -59 + + }, + + { + 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, 58, -60, -60, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 95, + 58, 58, 58, 58, 58, 58, 58, -60 + }, + + { + 11, -61, -61, -61, -61, -61, -61, -61, -61, -61, + -61, -61, -61, 58, -61, -61, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 96, 97, 58, + 58, 58, 58, 58, 58, 58, 58, -61 + }, + + { + 11, -62, -62, -62, -62, -62, -62, -62, -62, -62, + -62, -62, -62, 58, -62, -62, 58, 58, 58, 58, + + 58, 58, 98, 58, 58, 58, 58, 58, 58, 58, + 99, 58, 58, 58, 58, 58, 58, -62 + }, + + { + 11, -63, -63, -63, -63, -63, -63, -63, -63, -63, + -63, -63, -63, 58, -63, -63, 58, 100, 58, 58, + 101, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -63 + }, + + { + 11, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, 58, -64, -64, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 102, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 103, -64 + + }, + + { + 11, -65, -65, -65, -65, -65, -65, -65, -65, -65, + -65, -65, -65, 58, -65, -65, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -65 + }, + + { + 11, -66, -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, 58, -66, -66, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 104, 58, 58, -66 + }, + + { + 11, -67, -67, -67, -67, -67, -67, -67, -67, -67, + -67, -67, -67, 58, -67, -67, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 105, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -67 + }, + + { + 11, -68, -68, -68, -68, -68, -68, -68, -68, -68, + -68, -68, -68, 58, -68, -68, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 106, 58, + 58, 58, 58, 58, 58, 58, 58, -68 + }, + + { + 11, -69, -69, -69, -69, -69, -69, -69, -69, -69, + -69, -69, -69, 58, -69, -69, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 107, 58, 58, -69 + + }, + + { + 11, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, 58, -70, -70, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 108, + 58, 58, 58, 58, 58, 58, 58, -70 + }, + + { + 11, -71, -71, -71, -71, -71, -71, -71, -71, -71, + -71, -71, -71, 58, -71, -71, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 109, 58, + 58, 58, 58, 58, 58, 58, 58, -71 + }, + + { + 11, -72, -72, -72, -72, -72, -72, -72, -72, -72, + -72, -72, -72, 58, -72, -72, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 110, 58, 58, 58, 58, 58, -72 + }, + + { + 11, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -73, 58, -73, -73, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 111, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -73 + }, + + { + 11, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -74, -74, 58, -74, -74, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 112, 58, -74 + + }, + + { + 11, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, 58, -75, -75, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 113, 58, 58, 58, 58, -75 + }, + + { + 11, -76, -76, -76, -76, -76, -76, -76, -76, -76, + -76, -76, -76, 58, -76, -76, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 114, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -76 + }, + + { + 11, 77, 77, -77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77 + }, + + { + 11, -78, 78, 79, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78 + }, + + { + 11, 80, -79, -79, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80 + + }, + + { + 11, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80 + }, + + { + 11, 81, 81, 82, 81, -81, 81, 81, -81, 81, + 81, 81, 81, 81, 81, -81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81 + }, + + { + 11, -82, -82, -82, -82, -82, -82, -82, -82, -82, + -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, + + -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, + -82, -82, -82, -82, -82, -82, -82, -82 + }, + + { + 11, -83, -83, 84, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83 + }, + + { + 11, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84 + + }, + + { + 11, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85 + }, + + { + 11, 86, 86, -86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86 + }, + + { + 11, -87, -87, -87, -87, -87, -87, -87, -87, -87, + -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, + + -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, + -87, -87, -87, -87, -87, -87, -87, -87 + }, + + { + 11, -88, -88, -88, -88, -88, -88, -88, -88, -88, + -88, 115, 89, 89, -88, -88, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -88 + }, + + { + 11, -89, -89, -89, -89, -89, -89, -89, -89, -89, + -89, 89, 89, 89, -89, -89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -89 + + }, + + { + 11, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90 + }, + + { + 11, -91, -91, -91, -91, -91, -91, -91, -91, -91, + -91, 89, 89, 89, -91, -91, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -91 + }, + + { + 11, -92, -92, -92, -92, -92, -92, -92, -92, -92, + -92, 89, 89, 89, -92, -92, 89, 89, 89, 89, + + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -92 + }, + + { + 11, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93 + }, + + { + 11, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -94, -94, 58, -94, -94, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 116, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -94 + + }, + + { + 11, -95, -95, -95, -95, -95, -95, -95, -95, -95, + -95, -95, -95, 58, -95, -95, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 117, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -95 + }, + + { + 11, -96, -96, -96, -96, -96, -96, -96, -96, -96, + -96, -96, -96, 58, -96, -96, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 118, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -96 + }, + + { + 11, -97, -97, -97, -97, -97, -97, -97, -97, -97, + -97, -97, -97, 58, -97, -97, 58, 58, 58, 58, + + 58, 58, 119, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -97 + }, + + { + 11, -98, -98, -98, -98, -98, -98, -98, -98, -98, + -98, -98, -98, 58, -98, -98, 120, 121, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -98 + }, + + { + 11, -99, -99, -99, -99, -99, -99, -99, -99, -99, + -99, -99, -99, 58, -99, -99, 58, 58, 58, 58, + 58, 122, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -99 + + }, + + { + 11, -100, -100, -100, -100, -100, -100, -100, -100, -100, + -100, -100, -100, 58, -100, -100, 58, 58, 123, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -100 + }, + + { + 11, -101, -101, -101, -101, -101, -101, -101, -101, -101, + -101, -101, -101, 58, -101, -101, 58, 58, 58, 124, + 58, 58, 58, 58, 58, 125, 58, 126, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -101 + }, + + { + 11, -102, -102, -102, -102, -102, -102, -102, -102, -102, + -102, -102, -102, 58, -102, -102, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 127, 58, 58, 58, 58, 58, 58, -102 + }, + + { + 11, -103, -103, -103, -103, -103, -103, -103, -103, -103, + -103, -103, -103, 58, -103, -103, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -103 + }, + + { + 11, -104, -104, -104, -104, -104, -104, -104, -104, -104, + -104, -104, -104, 58, -104, -104, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -104 + + }, + + { + 11, -105, -105, -105, -105, -105, -105, -105, -105, -105, + -105, -105, -105, 58, -105, -105, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 128, 58, + 58, 58, 58, 58, 58, 58, 58, -105 + }, + + { + 11, -106, -106, -106, -106, -106, -106, -106, -106, -106, + -106, -106, -106, 58, -106, -106, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 129, 58, -106 + }, + + { + 11, -107, -107, -107, -107, -107, -107, -107, -107, -107, + -107, -107, -107, 58, -107, -107, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 130, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -107 + }, + + { + 11, -108, -108, -108, -108, -108, -108, -108, -108, -108, + -108, -108, -108, 58, -108, -108, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 131, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -108 + }, + + { + 11, -109, -109, -109, -109, -109, -109, -109, -109, -109, + -109, -109, -109, 58, -109, -109, 58, 58, 58, 58, + 58, 58, 58, 132, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -109 + + }, + + { + 11, -110, -110, -110, -110, -110, -110, -110, -110, -110, + -110, -110, -110, 58, -110, -110, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 133, 58, -110 + }, + + { + 11, -111, -111, -111, -111, -111, -111, -111, -111, -111, + -111, -111, -111, 58, -111, -111, 58, 58, 58, 58, + 58, 134, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -111 + }, + + { + 11, -112, -112, -112, -112, -112, -112, -112, -112, -112, + -112, -112, -112, 58, -112, -112, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 135, 58, 58, 58, 58, -112 + }, + + { + 11, -113, -113, -113, -113, -113, -113, -113, -113, -113, + -113, -113, -113, 58, -113, -113, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 136, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -113 + }, + + { + 11, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -114, -114, -114, 58, -114, -114, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 137, 58, 58, 58, -114 + + }, + + { + 11, -115, -115, -115, -115, -115, -115, -115, -115, -115, + -115, 89, 89, 89, -115, -115, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -115 + }, + + { + 11, -116, -116, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, 58, -116, -116, 58, 58, 58, 58, + 58, 138, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -116 + }, + + { + 11, -117, -117, -117, -117, -117, -117, -117, -117, -117, + -117, -117, -117, 58, -117, -117, 58, 58, 58, 139, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -117 + }, + + { + 11, -118, -118, -118, -118, -118, -118, -118, -118, -118, + -118, -118, -118, 58, -118, -118, 58, 58, 58, 58, + 58, 140, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -118 + }, + + { + 11, -119, -119, -119, -119, -119, -119, -119, -119, -119, + -119, -119, -119, 58, -119, -119, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 141, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -119 + + }, + + { + 11, -120, -120, -120, -120, -120, -120, -120, -120, -120, + -120, -120, -120, 58, -120, -120, 58, 58, 142, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 143, 58, 58, -120 + }, + + { + 11, -121, -121, -121, -121, -121, -121, -121, -121, -121, + -121, -121, -121, 58, -121, -121, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 144, 58, -121 + }, + + { + 11, -122, -122, -122, -122, -122, -122, -122, -122, -122, + -122, -122, -122, 58, -122, -122, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 145, 58, + 58, 58, 58, 58, 58, 58, 58, -122 + }, + + { + 11, -123, -123, -123, -123, -123, -123, -123, -123, -123, + -123, -123, -123, 58, -123, -123, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 146, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -123 + }, + + { + 11, -124, -124, -124, -124, -124, -124, -124, -124, -124, + -124, -124, -124, 58, -124, -124, 58, 58, 58, 58, + 58, 58, 58, 58, 147, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -124 + + }, + + { + 11, -125, -125, -125, -125, -125, -125, -125, -125, -125, + -125, -125, -125, 58, -125, -125, 58, 58, 58, 58, + 58, 58, 148, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -125 + }, + + { + 11, -126, -126, -126, -126, -126, -126, -126, -126, -126, + -126, -126, -126, 58, -126, -126, 58, 58, 58, 58, + 58, 149, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -126 + }, + + { + 11, -127, -127, -127, -127, -127, -127, -127, -127, -127, + -127, -127, -127, 58, -127, -127, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -127 + }, + + { + 11, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, 58, -128, -128, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 150, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -128 + }, + + { + 11, -129, -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, 58, -129, -129, 58, 58, 58, 151, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -129 + + }, + + { + 11, -130, -130, -130, -130, -130, -130, -130, -130, -130, + -130, -130, -130, 58, -130, -130, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 152, + 58, 58, 58, 58, 58, 58, 58, -130 + }, + + { + 11, -131, -131, -131, -131, -131, -131, -131, -131, -131, + -131, -131, -131, 58, -131, -131, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 153, 58, 58, 58, 58, 58, 58, -131 + }, + + { + 11, -132, -132, -132, -132, -132, -132, -132, -132, -132, + -132, -132, -132, 58, -132, -132, 58, 58, 58, 58, + + 58, 154, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -132 + }, + + { + 11, -133, -133, -133, -133, -133, -133, -133, -133, -133, + -133, -133, -133, 58, -133, -133, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 155, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -133 + }, + + { + 11, -134, -134, -134, -134, -134, -134, -134, -134, -134, + -134, -134, -134, 58, -134, -134, 58, 58, 58, 156, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -134 + + }, + + { + 11, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, 58, -135, -135, 58, 58, 58, 157, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -135 + }, + + { + 11, -136, -136, -136, -136, -136, -136, -136, -136, -136, + -136, -136, -136, 58, -136, -136, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 158, 58, + 58, 58, 58, 58, 58, 58, 58, -136 + }, + + { + 11, -137, -137, -137, -137, -137, -137, -137, -137, -137, + -137, -137, -137, 58, -137, -137, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 159, 58, 58, -137 + }, + + { + 11, -138, -138, -138, -138, -138, -138, -138, -138, -138, + -138, -138, -138, 58, -138, -138, 58, 160, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -138 + }, + + { + 11, -139, -139, -139, -139, -139, -139, -139, -139, -139, + -139, -139, -139, 58, -139, -139, 58, 58, 58, 58, + 58, 161, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -139 + + }, + + { + 11, -140, -140, -140, -140, -140, -140, -140, -140, -140, + -140, -140, -140, 58, -140, -140, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 162, 58, + 58, 58, 58, 58, 58, 58, 58, -140 + }, + + { + 11, -141, -141, -141, -141, -141, -141, -141, -141, -141, + -141, -141, -141, 58, -141, -141, 58, 58, 58, 58, + 58, 58, 58, 163, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -141 + }, + + { + 11, -142, -142, -142, -142, -142, -142, -142, -142, -142, + -142, -142, -142, 58, -142, -142, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 164, + 58, 58, 58, 58, 58, 58, 58, -142 + }, + + { + 11, -143, -143, -143, -143, -143, -143, -143, -143, -143, + -143, -143, -143, 58, -143, -143, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 165, 58, 58, 58, 58, -143 + }, + + { + 11, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, 58, -144, -144, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 166, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -144 + + }, + + { + 11, -145, -145, -145, -145, -145, -145, -145, -145, -145, + -145, -145, -145, 58, -145, -145, 58, 58, 58, 58, + 167, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -145 + }, + + { + 11, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, 58, -146, -146, 58, 58, 58, 58, + 58, 168, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -146 + }, + + { + 11, -147, -147, -147, -147, -147, -147, -147, -147, -147, + -147, -147, -147, 58, -147, -147, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 169, + 58, 58, 58, 58, 58, 58, 58, -147 + }, + + { + 11, -148, -148, -148, -148, -148, -148, -148, -148, -148, + -148, -148, -148, 58, -148, -148, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -148 + }, + + { + 11, -149, -149, -149, -149, -149, -149, -149, -149, -149, + -149, -149, -149, 58, -149, -149, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 170, 58, + 58, 58, 58, 58, 58, 58, 58, -149 + + }, + + { + 11, -150, -150, -150, -150, -150, -150, -150, -150, -150, + -150, -150, -150, 58, -150, -150, 58, 58, 58, 58, + 58, 171, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -150 + }, + + { + 11, -151, -151, -151, -151, -151, -151, -151, -151, -151, + -151, -151, -151, 58, -151, -151, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 172, + 58, 58, 58, 58, 58, 58, 58, -151 + }, + + { + 11, -152, -152, -152, -152, -152, -152, -152, -152, -152, + -152, -152, -152, 58, -152, -152, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 173, 58, + 58, 58, 58, 58, 58, 58, 58, -152 + }, + + { + 11, -153, -153, -153, -153, -153, -153, -153, -153, -153, + -153, -153, -153, 58, -153, -153, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 174, 58, 58, -153 + }, + + { + 11, -154, -154, -154, -154, -154, -154, -154, -154, -154, + -154, -154, -154, 58, -154, -154, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -154 + + }, + + { + 11, -155, -155, -155, -155, -155, -155, -155, -155, -155, + -155, -155, -155, 58, -155, -155, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 175, 58, 58, 58, 58, -155 + }, + + { + 11, -156, -156, -156, -156, -156, -156, -156, -156, -156, + -156, -156, -156, 58, -156, -156, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 176, 58, 58, -156 + }, + + { + 11, -157, -157, -157, -157, -157, -157, -157, -157, -157, + -157, -157, -157, 58, -157, -157, 58, 58, 58, 58, + + 58, 177, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -157 + }, + + { + 11, -158, -158, -158, -158, -158, -158, -158, -158, -158, + -158, -158, -158, 58, -158, -158, 58, 58, 58, 58, + 58, 58, 58, 178, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -158 + }, + + { + 11, -159, -159, -159, -159, -159, -159, -159, -159, -159, + -159, -159, -159, 58, -159, -159, 58, 179, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -159 + + }, + + { + 11, -160, -160, -160, -160, -160, -160, -160, -160, -160, + -160, -160, -160, 58, -160, -160, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 180, 58, + 58, 58, 58, 58, 58, 58, 58, -160 + }, + + { + 11, -161, -161, -161, -161, -161, -161, -161, -161, -161, + -161, -161, -161, 58, -161, -161, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -161 + }, + + { + 11, -162, -162, -162, -162, -162, -162, -162, -162, -162, + -162, -162, -162, 58, -162, -162, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 181, 58, 58, -162 + }, + + { + 11, -163, -163, -163, -163, -163, -163, -163, -163, -163, + -163, -163, -163, 58, -163, -163, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -163 + }, + + { + 11, -164, -164, -164, -164, -164, -164, -164, -164, -164, + -164, -164, -164, 58, -164, -164, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 182, + 58, 58, 58, 58, 58, 58, 58, -164 + + }, + + { + 11, -165, -165, -165, -165, -165, -165, -165, -165, -165, + -165, -165, -165, 58, -165, -165, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 183, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -165 + }, + + { + 11, -166, -166, -166, -166, -166, -166, -166, -166, -166, + -166, -166, -166, 58, -166, -166, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 184, 58, 58, -166 + }, + + { + 11, -167, -167, -167, -167, -167, -167, -167, -167, -167, + -167, -167, -167, 58, -167, -167, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 185, 58, 58, 58, -167 + }, + + { + 11, -168, -168, -168, -168, -168, -168, -168, -168, -168, + -168, -168, -168, 58, -168, -168, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -168 + }, + + { + 11, -169, -169, -169, -169, -169, -169, -169, -169, -169, + -169, -169, -169, 58, -169, -169, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 186, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -169 + + }, + + { + 11, -170, -170, -170, -170, -170, -170, -170, -170, -170, + -170, -170, -170, 58, -170, -170, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 187, 58, -170 + }, + + { + 11, -171, -171, -171, -171, -171, -171, -171, -171, -171, + -171, -171, -171, 58, -171, -171, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 188, 58, + 58, 58, 58, 58, 58, 58, 58, -171 + }, + + { + 11, -172, -172, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -172, 58, -172, -172, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 189, 58, + 58, 58, 58, 58, 58, 58, 58, -172 + }, + + { + 11, -173, -173, -173, -173, -173, -173, -173, -173, -173, + -173, -173, -173, 58, -173, -173, 58, 190, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -173 + }, + + { + 11, -174, -174, -174, -174, -174, -174, -174, -174, -174, + -174, -174, -174, 58, -174, -174, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -174 + + }, + + { + 11, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, 58, -175, -175, 58, 58, 58, 58, + 58, 191, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -175 + }, + + { + 11, -176, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, 58, -176, -176, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -176 + }, + + { + 11, -177, -177, -177, -177, -177, -177, -177, -177, -177, + -177, -177, -177, 58, -177, -177, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -177 + }, + + { + 11, -178, -178, -178, -178, -178, -178, -178, -178, -178, + -178, -178, -178, 58, -178, -178, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -178 + }, + + { + 11, -179, -179, -179, -179, -179, -179, -179, -179, -179, + -179, -179, -179, 58, -179, -179, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 192, 58, 58, -179 + + }, + + { + 11, -180, -180, -180, -180, -180, -180, -180, -180, -180, + -180, -180, -180, 58, -180, -180, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -180 + }, + + { + 11, -181, -181, -181, -181, -181, -181, -181, -181, -181, + -181, -181, -181, 58, -181, -181, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -181 + }, + + { + 11, -182, -182, -182, -182, -182, -182, -182, -182, -182, + -182, -182, -182, 58, -182, -182, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 193, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -182 + }, + + { + 11, -183, -183, -183, -183, -183, -183, -183, -183, -183, + -183, -183, -183, 58, -183, -183, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 194, 58, 58, 58, -183 + }, + + { + 11, -184, -184, -184, -184, -184, -184, -184, -184, -184, + -184, -184, -184, 58, -184, -184, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -184 + + }, + + { + 11, -185, -185, -185, -185, -185, -185, -185, -185, -185, + -185, -185, -185, 58, -185, -185, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -185 + }, + + { + 11, -186, -186, -186, -186, -186, -186, -186, -186, -186, + -186, -186, -186, 58, -186, -186, 58, 58, 58, 195, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -186 + }, + + { + 11, -187, -187, -187, -187, -187, -187, -187, -187, -187, + -187, -187, -187, 58, -187, -187, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -187 + }, + + { + 11, -188, -188, -188, -188, -188, -188, -188, -188, -188, + -188, -188, -188, 58, -188, -188, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 196, 58, -188 + }, + + { + 11, -189, -189, -189, -189, -189, -189, -189, -189, -189, + -189, -189, -189, 58, -189, -189, 58, 58, 58, 58, + 58, 58, 197, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -189 + + }, + + { + 11, -190, -190, -190, -190, -190, -190, -190, -190, -190, + -190, -190, -190, 58, -190, -190, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 198, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -190 + }, + + { + 11, -191, -191, -191, -191, -191, -191, -191, -191, -191, + -191, -191, -191, 58, -191, -191, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 199, 58, 58, 58, -191 + }, + + { + 11, -192, -192, -192, -192, -192, -192, -192, -192, -192, + -192, -192, -192, 58, -192, -192, 58, 58, 58, 58, + + 58, 200, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -192 + }, + + { + 11, -193, -193, -193, -193, -193, -193, -193, -193, -193, + -193, -193, -193, 58, -193, -193, 58, 58, 58, 58, + 58, 201, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -193 + }, + + { + 11, -194, -194, -194, -194, -194, -194, -194, -194, -194, + -194, -194, -194, 58, -194, -194, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 202, 58, 58, -194 + + }, + + { + 11, -195, -195, -195, -195, -195, -195, -195, -195, -195, + -195, -195, -195, 58, -195, -195, 58, 58, 58, 58, + 58, 203, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -195 + }, + + { + 11, -196, -196, -196, -196, -196, -196, -196, -196, -196, + -196, -196, -196, 58, -196, -196, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -196 + }, + + { + 11, -197, -197, -197, -197, -197, -197, -197, -197, -197, + -197, -197, -197, 58, -197, -197, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 204, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -197 + }, + + { + 11, -198, -198, -198, -198, -198, -198, -198, -198, -198, + -198, -198, -198, 58, -198, -198, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -198 + }, + + { + 11, -199, -199, -199, -199, -199, -199, -199, -199, -199, + -199, -199, -199, 58, -199, -199, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -199 + + }, + + { + 11, -200, -200, -200, -200, -200, -200, -200, -200, -200, + -200, -200, -200, 58, -200, -200, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -200 + }, + + { + 11, -201, -201, -201, -201, -201, -201, -201, -201, -201, + -201, -201, -201, 58, -201, -201, 58, 205, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -201 + }, + + { + 11, -202, -202, -202, -202, -202, -202, -202, -202, -202, + -202, -202, -202, 58, -202, -202, 58, 206, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -202 + }, + + { + 11, -203, -203, -203, -203, -203, -203, -203, -203, -203, + -203, -203, -203, 58, -203, -203, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -203 + }, + + { + 11, -204, -204, -204, -204, -204, -204, -204, -204, -204, + -204, -204, -204, 58, -204, -204, 58, 58, 58, 58, + 58, 58, 58, 207, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -204 + + }, + + { + 11, -205, -205, -205, -205, -205, -205, -205, -205, -205, + -205, -205, -205, 58, -205, -205, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 208, 58, + 58, 58, 58, 58, 58, 58, 58, -205 + }, + + { + 11, -206, -206, -206, -206, -206, -206, -206, -206, -206, + -206, -206, -206, 58, -206, -206, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 209, 58, 58, -206 + }, + + { + 11, -207, -207, -207, -207, -207, -207, -207, -207, -207, + -207, -207, -207, 58, -207, -207, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -207 + }, + + { + 11, -208, -208, -208, -208, -208, -208, -208, -208, -208, + -208, -208, -208, 58, -208, -208, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -208 + }, + + { + 11, -209, -209, -209, -209, -209, -209, -209, -209, -209, + -209, -209, -209, 58, -209, -209, 58, 58, 58, 58, + 58, 210, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -209 + + }, + + { + 11, -210, -210, -210, -210, -210, -210, -210, -210, -210, + -210, -210, -210, 58, -210, -210, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -210 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up zconftext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + zconfleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 64 +#define YY_END_OF_BUFFER 65 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[211] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 5, 4, 3, 2, 36, 37, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 63, 60, 62, 55, 59, 58, 57, 53, 48, 42, + 47, 51, 53, 40, 41, 50, 50, 43, 53, 50, + 50, 53, 4, 3, 2, 2, 1, 35, 35, 35, + 35, 35, 35, 35, 16, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 63, 60, 62, 61, + 55, 54, 57, 56, 44, 51, 38, 50, 50, 52, + 45, 46, 39, 35, 35, 35, 35, 35, 35, 35, + + 35, 35, 30, 29, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 49, 25, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 15, 35, 7, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 17, 35, 35, + 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, + 10, 35, 13, 35, 35, 35, 35, 33, 35, 35, + 35, 35, 35, 22, 35, 32, 9, 31, 35, 26, + 12, 35, 35, 21, 18, 35, 8, 35, 35, 35, + 35, 35, 27, 35, 35, 6, 35, 20, 19, 23, + + 35, 35, 11, 35, 35, 35, 14, 28, 35, 24 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 10, 1, 1, 1, 11, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 14, 1, 1, 1, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 15, 1, 1, 16, 1, 17, 18, 19, 20, + + 21, 22, 23, 24, 25, 13, 13, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 13, 13, 36, + 13, 13, 1, 37, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int zconf_flex_debug; +int zconf_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *zconftext; + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +char *text; +static char *text_ptr; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static struct buffer *zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_ptr = text; + text_size = 0; + *text_ptr = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + text = realloc(text, new_size); + text_asize = new_size; + text_ptr = text + text_size; + } + memcpy(text_ptr, str, size); + text_ptr += size; + text_size += size; + *text_ptr = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +#define INITIAL 0 +#define COMMAND 1 +#define HELP 2 +#define STRING 3 +#define PARAM 4 + +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int zconfwrap (void ); +#else +extern int zconfwrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(zconfin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int zconflex (void); + +#define YY_DECL int zconflex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after zconftext and zconfleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + int str = 0; + int ts, i; + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! zconfin ) + zconfin = stdin; + + if ( ! zconfout ) + zconfout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of zconftext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 2: +YY_RULE_SETUP + + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +current_file->lineno++; return T_EOL; + YY_BREAK +case 4: +YY_RULE_SETUP +{ + BEGIN(COMMAND); +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ + unput(zconftext[0]); + BEGIN(COMMAND); +} + YY_BREAK + +case 6: +YY_RULE_SETUP +BEGIN(PARAM); return T_MAINMENU; + YY_BREAK +case 7: +YY_RULE_SETUP +BEGIN(PARAM); return T_MENU; + YY_BREAK +case 8: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDMENU; + YY_BREAK +case 9: +YY_RULE_SETUP +BEGIN(PARAM); return T_SOURCE; + YY_BREAK +case 10: +YY_RULE_SETUP +BEGIN(PARAM); return T_CHOICE; + YY_BREAK +case 11: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDCHOICE; + YY_BREAK +case 12: +YY_RULE_SETUP +BEGIN(PARAM); return T_COMMENT; + YY_BREAK +case 13: +YY_RULE_SETUP +BEGIN(PARAM); return T_CONFIG; + YY_BREAK +case 14: +YY_RULE_SETUP +BEGIN(PARAM); return T_MENUCONFIG; + YY_BREAK +case 15: +YY_RULE_SETUP +BEGIN(PARAM); return T_HELP; + YY_BREAK +case 16: +YY_RULE_SETUP +BEGIN(PARAM); return T_IF; + YY_BREAK +case 17: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDIF; + YY_BREAK +case 18: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEPENDS; + YY_BREAK +case 19: +YY_RULE_SETUP +BEGIN(PARAM); return T_REQUIRES; + YY_BREAK +case 20: +YY_RULE_SETUP +BEGIN(PARAM); return T_OPTIONAL; + YY_BREAK +case 21: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEFAULT; + YY_BREAK +case 22: +YY_RULE_SETUP +BEGIN(PARAM); return T_PROMPT; + YY_BREAK +case 23: +YY_RULE_SETUP +BEGIN(PARAM); return T_TRISTATE; + YY_BREAK +case 24: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_TRISTATE; + YY_BREAK +case 25: +YY_RULE_SETUP +BEGIN(PARAM); return T_BOOLEAN; + YY_BREAK +case 26: +YY_RULE_SETUP +BEGIN(PARAM); return T_BOOLEAN; + YY_BREAK +case 27: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_BOOLEAN; + YY_BREAK +case 28: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_BOOLEAN; + YY_BREAK +case 29: +YY_RULE_SETUP +BEGIN(PARAM); return T_INT; + YY_BREAK +case 30: +YY_RULE_SETUP +BEGIN(PARAM); return T_HEX; + YY_BREAK +case 31: +YY_RULE_SETUP +BEGIN(PARAM); return T_STRING; + YY_BREAK +case 32: +YY_RULE_SETUP +BEGIN(PARAM); return T_SELECT; + YY_BREAK +case 33: +YY_RULE_SETUP +BEGIN(PARAM); return T_SELECT; + YY_BREAK +case 34: +YY_RULE_SETUP +BEGIN(PARAM); return T_RANGE; + YY_BREAK +case 35: +YY_RULE_SETUP +{ + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 36: +YY_RULE_SETUP + + YY_BREAK +case 37: +/* rule 37 can match eol */ +YY_RULE_SETUP +current_file->lineno++; BEGIN(INITIAL); + YY_BREAK + +case 38: +YY_RULE_SETUP +return T_AND; + YY_BREAK +case 39: +YY_RULE_SETUP +return T_OR; + YY_BREAK +case 40: +YY_RULE_SETUP +return T_OPEN_PAREN; + YY_BREAK +case 41: +YY_RULE_SETUP +return T_CLOSE_PAREN; + YY_BREAK +case 42: +YY_RULE_SETUP +return T_NOT; + YY_BREAK +case 43: +YY_RULE_SETUP +return T_EQUAL; + YY_BREAK +case 44: +YY_RULE_SETUP +return T_UNEQUAL; + YY_BREAK +case 45: +YY_RULE_SETUP +return T_IF; + YY_BREAK +case 46: +YY_RULE_SETUP +return T_ON; + YY_BREAK +case 47: +YY_RULE_SETUP +{ + str = zconftext[0]; + new_string(); + BEGIN(STRING); + } + YY_BREAK +case 48: +/* rule 48 can match eol */ +YY_RULE_SETUP +BEGIN(INITIAL); current_file->lineno++; return T_EOL; + YY_BREAK +case 49: +YY_RULE_SETUP +/* ignore */ + YY_BREAK +case 50: +YY_RULE_SETUP +{ + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 51: +YY_RULE_SETUP +/* comment */ + YY_BREAK +case 52: +/* rule 52 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 53: +YY_RULE_SETUP + + YY_BREAK +case YY_STATE_EOF(PARAM): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 54: +/* rule 54 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 55: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + } + YY_BREAK +case 56: +/* rule 56 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 57: +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + } + YY_BREAK +case 58: +YY_RULE_SETUP +{ + if (str == zconftext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(zconftext, 1); + } + YY_BREAK +case 59: +/* rule 59 can match eol */ +YY_RULE_SETUP +{ + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + YY_BREAK +case YY_STATE_EOF(STRING): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 60: +YY_RULE_SETUP +{ + ts = 0; + for (i = 0; i < zconfleng; i++) { + if (zconftext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + YY_BREAK +case 61: +/* rule 61 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK +case 62: +/* rule 62 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + append_string("\n", 1); + } + YY_BREAK +case 63: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + if (!first_ts) + first_ts = last_ts; + } + YY_BREAK +case YY_STATE_EOF(HELP): +{ + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMAND): +{ + if (current_buf) { + zconf_endfile(); + return T_EOF; + } + fclose(zconfin); + yyterminate(); +} + YY_BREAK +case 64: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed zconfin at a new source and called + * zconflex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( zconfwrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * zconftext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of zconflex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + zconfrestart(zconfin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up zconftext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + zconfrestart(zconfin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( zconfwrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve zconftext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void zconfrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); + zconf_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * zconfpop_buffer_state(); + * zconfpush_buffer_state(new_buffer); + */ + zconfensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + zconf_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (zconfwrap()) processing, but the only time this flag + * is looked at is after zconfwrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void zconf_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + zconf_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with zconf_create_buffer() + * + */ + void zconf_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + zconffree((void *) b->yy_ch_buf ); + + zconffree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a zconfrestart() or at EOF. + */ + static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + zconf_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then zconf_init_buffer was _probably_ + * called from zconfrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void zconf_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + zconf_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + zconfensure_buffer_stack(); + + /* This block is copied from zconf_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from zconf_switch_to_buffer. */ + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void zconfpop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void zconfensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + zconf_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to zconflex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * zconf_scan_bytes() instead. + */ +YY_BUFFER_STATE zconf_scan_string (yyconst char * str ) +{ + + return zconf_scan_bytes(str,strlen(str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) zconfalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = zconf_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + zconftext[zconfleng] = (yy_hold_char); \ + (yy_c_buf_p) = zconftext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + zconfleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int zconfget_lineno (void) +{ + + return zconflineno; +} + +/** Get the input stream. + * + */ +FILE *zconfget_in (void) +{ + return zconfin; +} + +/** Get the output stream. + * + */ +FILE *zconfget_out (void) +{ + return zconfout; +} + +/** Get the length of the current token. + * + */ +int zconfget_leng (void) +{ + return zconfleng; +} + +/** Get the current token. + * + */ + +char *zconfget_text (void) +{ + return zconftext; +} + +/** Set the current line number. + * @param line_number + * + */ +void zconfset_lineno (int line_number ) +{ + + zconflineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see zconf_switch_to_buffer + */ +void zconfset_in (FILE * in_str ) +{ + zconfin = in_str ; +} + +void zconfset_out (FILE * out_str ) +{ + zconfout = out_str ; +} + +int zconfget_debug (void) +{ + return zconf_flex_debug; +} + +void zconfset_debug (int bdebug ) +{ + zconf_flex_debug = bdebug ; +} + +/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ +int zconflex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + zconfpop_buffer_state(); + } + + /* Destroy the stack itself. */ + zconffree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *zconfalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *zconfrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void zconffree (void * ptr ) +{ + free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef yytext_ptr +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static struct buffer *zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(zconfin); + zconf_delete_buffer(YY_CURRENT_BUFFER); + zconf_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; + + return parent; +} + +int zconf_lineno(void) +{ + if (current_buf) + return current_file->lineno - 1; + else + return 0; +} + +char *zconf_curname(void) +{ + if (current_buf) + return current_file->name; + else + return ""; +} + diff --git a/openwrt/package/config/lkc.h b/openwrt/package/config/lkc.h new file mode 100644 index 0000000000..dd040f7a86 --- /dev/null +++ b/openwrt/package/config/lkc.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef LKC_H +#define LKC_H + +#include "expr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LKC_DIRECT_LINK +#define P(name,type,arg) extern type name arg +#else +#include "lkc_defs.h" +#define P(name,type,arg) extern type (*name ## _p) arg +#endif +#include "lkc_proto.h" +#undef P + +#define SRCTREE "srctree" + +int zconfparse(void); +void zconfdump(FILE *out); + +extern int zconfdebug; +void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); +void zconf_initscan(const char *name); +void zconf_nextfile(const char *name); +int zconf_lineno(void); +char *zconf_curname(void); + +/* confdata.c */ +extern const char conf_def_filename[]; +extern char conf_filename[]; + +char *conf_get_default_confname(void); + +/* kconfig_load.c */ +void kconfig_load(void); + +/* menu.c */ +void menu_init(void); +void menu_add_menu(void); +void menu_end_menu(void); +void menu_add_entry(struct symbol *sym); +void menu_end_entry(void); +void menu_add_dep(struct expr *dep); +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); +void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_finalize(struct menu *parent); +void menu_set_type(int type); +struct file *file_lookup(const char *name); +int file_write_dep(const char *name); + +extern struct menu *current_entry; +extern struct menu *current_menu; + +/* symbol.c */ +void sym_init(void); +void sym_clear_all_valid(void); +void sym_set_changed(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct property *prop_alloc(enum prop_type type, struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); + +static inline tristate sym_get_tristate_value(struct symbol *sym) +{ + return sym->curr.tri; +} + + +static inline struct symbol *sym_get_choice_value(struct symbol *sym) +{ + return (struct symbol *)sym->curr.val; +} + +static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) +{ + return sym_set_tristate_value(chval, yes); +} + +static inline bool sym_is_choice(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICE ? true : false; +} + +static inline bool sym_is_choice_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICEVAL ? true : false; +} + +static inline bool sym_is_optional(struct symbol *sym) +{ + return sym->flags & SYMBOL_OPTIONAL ? true : false; +} + +static inline bool sym_has_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_NEW ? false : true; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LKC_H */ diff --git a/openwrt/package/config/lkc_proto.h b/openwrt/package/config/lkc_proto.h new file mode 100644 index 0000000000..97c79178ee --- /dev/null +++ b/openwrt/package/config/lkc_proto.h @@ -0,0 +1,39 @@ + +/* confdata.c */ +P(conf_parse,void,(const char *name)); +P(conf_read,int,(const char *name)); +P(conf_write,int,(const char *name)); + +/* menu.c */ +P(rootmenu,struct menu,); + +P(menu_is_visible,bool,(struct menu *menu)); +P(menu_get_prompt,const char *,(struct menu *menu)); +P(menu_get_root_menu,struct menu *,(struct menu *menu)); +P(menu_get_parent_menu,struct menu *,(struct menu *menu)); + +/* symbol.c */ +P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); +P(sym_change_count,int,); + +P(sym_lookup,struct symbol *,(const char *name, int isconst)); +P(sym_find,struct symbol *,(const char *name)); +P(sym_type_name,const char *,(enum symbol_type type)); +P(sym_calc_value,void,(struct symbol *sym)); +P(sym_get_type,enum symbol_type,(struct symbol *sym)); +P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri)); +P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri)); +P(sym_toggle_tristate_value,tristate,(struct symbol *sym)); +P(sym_string_valid,bool,(struct symbol *sym, const char *newval)); +P(sym_string_within_range,bool,(struct symbol *sym, const char *str)); +P(sym_set_string_value,bool,(struct symbol *sym, const char *newval)); +P(sym_is_changable,bool,(struct symbol *sym)); +P(sym_get_choice_prop,struct property *,(struct symbol *sym)); +P(sym_get_default_prop,struct property *,(struct symbol *sym)); +P(sym_get_string_value,const char *,(struct symbol *sym)); + +P(prop_get_type_name,const char *,(enum prop_type type)); + +/* expr.c */ +P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); +P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)); diff --git a/openwrt/package/config/mconf.c b/openwrt/package/config/mconf.c new file mode 100644 index 0000000000..0db6f8f6c8 --- /dev/null +++ b/openwrt/package/config/mconf.c @@ -0,0 +1,713 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis + * + * Directly use liblxdialog library routines. + * 2002-11-14 Petr Baudis + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dialog.h" + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static char menu_backtitle[128]; +static const char menu_instructions[] = + "Arrow keys navigate the menu. " + " selects submenus --->. " + "Highlighted letters are hotkeys. " + "Pressing selectes a feature, while will exclude a feature. " + "Press to exit, for Help. " + "Legend: [*] feature is selected [ ] feature is excluded", +radiolist_instructions[] = + "Use the arrow keys to navigate this window or " + "press the hotkey of the item you wish to select " + "followed by the . " + "Press for additional information about this option.", +inputbox_instructions_int[] = + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the key to move from the input field to the buttons below it.", +inputbox_instructions_hex[] = + "Please enter a hexadecimal value. " + "Use the key to move from the input field to the buttons below it.", +inputbox_instructions_string[] = + "Please enter a string value. " + "Use the key to move from the input field to the buttons below it.", +setmod_text[] = + "This feature depends on another which has been configured as a module.\n" + "As a result, this feature will be built as a module.", +nohelp_text[] = + "There is no help available for this option.\n", +load_config_text[] = + "Enter the name of the configuration file you wish to load. " + "Accept the name shown to restore the configuration you " + "last retrieved. Leave blank to abort.", +load_config_help[] = + "\n" + "For various reasons, one may wish to keep several different Buildroot\n" + "configurations available on a single machine.\n" + "\n" + "If you have saved a previous configuration in a file other than the\n" + "Buildroot's default, entering the name of the file here will allow you\n" + "to modify that configuration.\n" + "\n" + "If you are uncertain, then you have probably never used alternate\n" + "configuration files. You should therefor leave this blank to abort.\n", +save_config_text[] = + "Enter a filename to which this configuration should be saved " + "as an alternate. Leave blank to abort.", +save_config_help[] = + "\n" + "For various reasons, one may wish to keep different Buildroot\n" + "configurations available on a single machine.\n" + "\n" + "Entering a file name here will allow you to later retrieve, modify\n" + "and use the current configuration as an alternate to whatever\n" + "configuration options you have selected at that time.\n" + "\n" + "If you are uncertain what all this means then you should probably\n" + "leave this blank.\n", +top_menu_help[] = + "\n" + "Use the Up/Down arrow keys (cursor keys) to highlight the item\n" + "you wish to change or submenu wish to select and press .\n" + "Submenus are designated by \"--->\".\n" + "\n" + "Shortcut: Press the option's highlighted letter (hotkey).\n" + "\n" + "You may also use the and keys to scroll\n" + "unseen options into view.\n" +; + +static char filename[PATH_MAX+1] = ".config"; +static int indent = 0; +static struct termios ios_org; +static int rows, cols; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; + +static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */ +static int item_no; + +static void conf(struct menu *menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static void show_textbox(const char *title, const char *text, int r, int c); +static void show_helptext(const char *title, const char *text); +static void show_help(struct menu *menu); +static void show_readme(void); + +static void init_wsize(void) +{ + struct winsize ws; + char *env; + + if (ioctl(1, TIOCGWINSZ, &ws) == -1) { + rows = 24; + cols = 80; + } else { + rows = ws.ws_row; + cols = ws.ws_col; + if (!rows) { + env = getenv("LINES"); + if (env) + rows = atoi(env); + if (!rows) + rows = 24; + } + if (!cols) { + env = getenv("COLUMNS"); + if (env) + cols = atoi(env); + if (!cols) + cols = 80; + } + } + + if (rows < 19 || cols < 80) { + fprintf(stderr, "Your display is too small to run Menuconfig!\n"); + fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + exit(1); + } + + rows -= 4; + cols -= 5; +} + +static void cinit(void) +{ + item_no = 0; +} + +static void cmake(void) +{ + items[item_no] = malloc(sizeof(struct dialog_list_item)); + memset(items[item_no], 0, sizeof(struct dialog_list_item)); + items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0; + items[item_no]->name = malloc(512); items[item_no]->name[0] = 0; + items[item_no]->namelen = 0; + item_no++; +} + +static int cprint_name(const char *fmt, ...) +{ + va_list ap; + int res; + + if (!item_no) + cmake(); + va_start(ap, fmt); + res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen, + 512 - items[item_no - 1]->namelen, fmt, ap); + if (res > 0) + items[item_no - 1]->namelen += res; + va_end(ap); + + return res; +} + +static int cprint_tag(const char *fmt, ...) +{ + va_list ap; + int res; + + if (!item_no) + cmake(); + va_start(ap, fmt); + res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap); + va_end(ap); + + return res; +} + +static void cdone(void) +{ + int i; + + for (i = 0; i < item_no; i++) { + free(items[i]->tag); + free(items[i]->name); + free(items[i]); + } + + item_no = 0; +} + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + switch (prop->type) { + case P_MENU: + child_count++; + cmake(); + cprint_tag("m%p", menu); + + if (single_menu_mode) { + cprint_name("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else { + cprint_name(" %*c%s --->", indent + 1, ' ', prompt); + } + + if (single_menu_mode && menu->data) + goto conf_childs; + return; + default: + if (prompt) { + child_count++; + cmake(); + cprint_tag(":%p", menu); + cprint_name("---%*c%s", indent + 1, ' ', prompt); + } + } + } else + doint = 0; + goto conf_childs; + } + + cmake(); + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changable(sym)) { + cprint_tag("t%p", menu); + switch (type) { + case S_BOOLEAN: + cprint_name("[%c]", val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + cprint_name("<%c>", ch); + break; + } + } else { + cprint_tag("%c%p", def_menu ? 't' : ':', menu); + cprint_name(" "); + } + + cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + cprint_name(" (%s)", menu_get_prompt(def_menu)); + cprint_name(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + cprint_tag(":%p", menu); + cprint_name(" "); + } else { + switch (type) { + case S_BOOLEAN: + cprint_tag("t%p", menu); + if (sym_is_changable(sym)) + cprint_name("[%c]", val == no ? ' ' : '*'); + else + cprint_name("---"); + break; + case S_TRISTATE: + cprint_tag("t%p", menu); + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + if (sym_is_changable(sym)) + cprint_name("<%c>", ch); + else + cprint_name("---"); + break; + default: + cprint_tag("s%p", menu); + tmp = cprint_name("(%s)", sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + goto conf_childs; + } + } + cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + if (menu->prompt->type == P_MENU) { + cprint_name(" --->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void conf(struct menu *menu) +{ + struct dialog_list_item *active_item = NULL; + struct menu *submenu; + const char *prompt = menu_get_prompt(menu); + struct symbol *sym; + char active_entry[40]; + int stat, type; + + unlink("lxdialog.scrltmp"); + active_entry[0] = 0; + while (1) { + indent = 0; + child_count = 0; + current_menu = menu; + cdone(); cinit(); + build_conf(menu); + if (!child_count) + break; + if (menu == &rootmenu) { + cmake(); cprint_tag(":"); cprint_name("--- "); + cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File"); + cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File"); + } + dialog_clear(); + stat = dialog_menu(prompt ? prompt : "Main Menu", + menu_instructions, rows, cols, rows - 10, + active_entry, item_no, items); + if (stat < 0) + return; + + if (stat == 1 || stat == 255) + break; + + active_item = first_sel_item(item_no, items); + if (!active_item) + continue; + active_item->selected = 0; + strncpy(active_entry, active_item->tag, sizeof(active_entry)); + active_entry[sizeof(active_entry)-1] = 0; + type = active_entry[0]; + if (!type) + continue; + + sym = NULL; + submenu = NULL; + if (sscanf(active_entry + 1, "%p", &submenu) == 1) + sym = submenu->sym; + + switch (stat) { + case 0: + switch (type) { + case 'm': + if (single_menu_mode) + submenu->data = (void *) (long) !submenu->data; + else + conf(submenu); + break; + case 't': + if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt->type == P_MENU) + conf(submenu); + break; + case 's': + conf_string(submenu); + break; + case 'L': + conf_load(); + break; + case 'S': + conf_save(); + break; + } + break; + case 2: + if (sym) + show_help(submenu); + else + show_readme(); + break; + case 3: + if (type == 't') { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + show_textbox(NULL, setmod_text, 6, 74); + } + break; + case 4: + if (type == 't') + sym_set_tristate_value(sym, no); + break; + case 5: + if (type == 't') + sym_set_tristate_value(sym, mod); + break; + case 6: + if (type == 't') + sym_toggle_tristate_value(sym); + else if (type == 'm') + conf(submenu); + break; + } + } +} + +static void show_textbox(const char *title, const char *text, int r, int c) +{ + int fd; + + fd = creat(".help.tmp", 0777); + write(fd, text, strlen(text)); + close(fd); + while (dialog_textbox(title, ".help.tmp", r, c) < 0) + ; + unlink(".help.tmp"); +} + +static void show_helptext(const char *title, const char *text) +{ + show_textbox(title, text, rows, cols); +} + +static void show_help(struct menu *menu) +{ + const char *help; + char *helptext; + struct symbol *sym = menu->sym; + + help = sym->help; + if (!help) + help = nohelp_text; + if (sym->name) { + helptext = malloc(strlen(sym->name) + strlen(help) + 16); + sprintf(helptext, "%s:\n\n%s", sym->name, help); + show_helptext(menu_get_prompt(menu), helptext); + free(helptext); + } else + show_helptext(menu_get_prompt(menu), help); +} + +static void show_readme(void) +{ + show_helptext("Help", top_menu_help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child; + struct symbol *active; + + active = sym_get_choice_value(menu->sym); + while (1) { + current_menu = menu; + cdone(); cinit(); + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + cmake(); + cprint_tag("%p", child); + cprint_name("%s", menu_get_prompt(child)); + if (child->sym == sym_get_choice_value(menu->sym)) + items[item_no - 1]->selected = 1; /* ON */ + else if (child->sym == active) + items[item_no - 1]->selected = 2; /* SELECTED */ + else + items[item_no - 1]->selected = 0; /* OFF */ + } + + switch (dialog_checklist(prompt ? prompt : "Main Menu", + radiolist_instructions, 15, 70, 6, + item_no, items, FLAG_RADIO)) { + case 0: + if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1) + break; + sym_set_tristate_value(child->sym, yes); + return; + case 1: + if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) { + show_help(child); + active = child->sym; + } else + show_help(menu); + break; + case 255: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = (char *) inputbox_instructions_int; + break; + case S_HEX: + heading = (char *) inputbox_instructions_hex; + break; + case S_STRING: + heading = (char *) inputbox_instructions_string; + break; + default: + heading = "Internal mconf error!"; + /* panic? */; + } + + switch (dialog_inputbox(prompt ? prompt : "Main Menu", + heading, 10, 75, + sym_get_string_value(menu->sym))) { + case 0: + if (sym_set_string_value(menu->sym, dialog_input_result)) + return; + show_textbox(NULL, "You have made an invalid entry.", 5, 43); + break; + case 1: + show_help(menu); + break; + case 255: + return; + } + } +} + +static void conf_load(void) +{ + while (1) { + switch (dialog_inputbox(NULL, load_config_text, 11, 55, + filename)) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) + return; + show_textbox(NULL, "File does not exist!", 5, 38); + break; + case 1: + show_helptext("Load Alternate Configuration", load_config_help); + break; + case 255: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + switch (dialog_inputbox(NULL, save_config_text, 11, 55, + filename)) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_write(dialog_input_result)) + return; + show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); + break; + case 1: + show_helptext("Save Alternate Configuration", save_config_help); + break; + case 255: + return; + } + } +} + +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); + unlink(".help.tmp"); +} + +static void winch_handler(int sig) +{ + struct winsize ws; + + if (ioctl(1, TIOCGWINSZ, &ws) == -1) { + rows = 24; + cols = 80; + } else { + rows = ws.ws_row; + cols = ws.ws_col; + } + + if (rows < 19 || cols < 80) { + end_dialog(); + fprintf(stderr, "Your display is too small to run Menuconfig!\n"); + fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + exit(1); + } + + rows -= 4; + cols -= 5; + +} + +int main(int ac, char **av) +{ + int stat; + char *mode; + struct symbol *sym; + + conf_parse(av[1]); + conf_read(NULL); + + sym = sym_lookup("VERSION", 0); + sym_calc_value(sym); + snprintf(menu_backtitle, 128, "Buildroot v%s Configuration", + sym_get_string_value(sym)); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + tcgetattr(1, &ios_org); + atexit(conf_cleanup); + init_wsize(); + init_dialog(); + signal(SIGWINCH, winch_handler); + conf(&rootmenu); + end_dialog(); + + /* Restart dialog to act more like when lxdialog was still separate */ + init_dialog(); + do { + stat = dialog_yesno(NULL, + "Do you wish to save your new Buildroot configuration?", 5, 60); + } while (stat < 0); + end_dialog(); + + if (stat == 0) { + conf_write(NULL); + printf("\n\n" + "*** End of Buildroot configuration.\n" + "*** Check the top-level Makefile for additional configuration options.\n\n"); + } else + printf("\n\nYour Buildroot configuration changes were NOT saved.\n\n"); + + return 0; +} diff --git a/openwrt/package/config/menu.c b/openwrt/package/config/menu.c new file mode 100644 index 0000000000..6425296fc3 --- /dev/null +++ b/openwrt/package/config/menu.c @@ -0,0 +1,431 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct menu rootmenu; +struct menu *current_menu, *current_entry; +static struct menu **last_entry_ptr; + +struct file *file_list; +struct file *current_file; + +static void menu_warn(struct menu *menu, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static void prop_warn(struct property *prop, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +void menu_init(void) +{ + current_entry = current_menu = &rootmenu; + last_entry_ptr = &rootmenu.list; +} + +void menu_add_entry(struct symbol *sym) +{ + struct menu *menu; + + menu = malloc(sizeof(*menu)); + memset(menu, 0, sizeof(*menu)); + menu->sym = sym; + menu->parent = current_menu; + menu->file = current_file; + menu->lineno = zconf_lineno(); + + *last_entry_ptr = menu; + last_entry_ptr = &menu->next; + current_entry = menu; +} + +void menu_end_entry(void) +{ +} + +void menu_add_menu(void) +{ + current_menu = current_entry; + last_entry_ptr = ¤t_entry->list; +} + +void menu_end_menu(void) +{ + last_entry_ptr = ¤t_menu->next; + current_menu = current_menu->parent; +} + +struct expr *menu_check_dep(struct expr *e) +{ + if (!e) + return e; + + switch (e->type) { + case E_NOT: + e->left.expr = menu_check_dep(e->left.expr); + break; + case E_OR: + case E_AND: + e->left.expr = menu_check_dep(e->left.expr); + e->right.expr = menu_check_dep(e->right.expr); + break; + case E_SYMBOL: + /* change 'm' into 'm' && MODULES */ + if (e->left.sym == &symbol_mod) + return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); + break; + default: + break; + } + return e; +} + +void menu_add_dep(struct expr *dep) +{ + current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); +} + +void menu_set_type(int type) +{ + struct symbol *sym = current_entry->sym; + + if (sym->type == type) + return; + if (sym->type == S_UNKNOWN) { + sym->type = type; + return; + } + menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n", + sym->name ? sym->name : "", + sym_type_name(sym->type), sym_type_name(type)); +} + +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) +{ + struct property *prop = prop_alloc(type, current_entry->sym); + + prop->menu = current_entry; + prop->text = prompt; + prop->expr = expr; + prop->visible.expr = menu_check_dep(dep); + + if (prompt) { + if (current_entry->prompt) + menu_warn(current_entry, "prompt redefined\n"); + current_entry->prompt = prop; + } + + return prop; +} + +void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) +{ + menu_add_prop(type, prompt, NULL, dep); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, NULL, expr, dep); +} + +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) +{ + menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); +} + +void sym_check_prop(struct symbol *sym) +{ + struct property *prop; + struct symbol *sym2; + for (prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_DEFAULT: + if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && + prop->expr->type != E_SYMBOL) + prop_warn(prop, + "default for config symbol '%'" + " must be a single symbol", sym->name); + break; + case P_SELECT: + sym2 = prop_get_symbol(prop); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + prop_warn(prop, + "config symbol '%s' uses select, but is " + "not boolean or tristate", sym->name); + else if (sym2->type == S_UNKNOWN) + prop_warn(prop, + "'select' used by config symbol '%s' " + "refer to undefined symbol '%s'", + sym->name, sym2->name); + else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE) + prop_warn(prop, + "'%s' has wrong type. 'select' only " + "accept arguments of boolean and " + "tristate type", sym2->name); + break; + case P_RANGE: + if (sym->type != S_INT && sym->type != S_HEX) + prop_warn(prop, "range is only allowed " + "for int or hex symbols"); + if (!sym_string_valid(sym, prop->expr->left.sym->name) || + !sym_string_valid(sym, prop->expr->right.sym->name)) + prop_warn(prop, "range is invalid"); + break; + default: + ; + } + } +} + +void menu_finalize(struct menu *parent) +{ + struct menu *menu, *last_menu; + struct symbol *sym; + struct property *prop; + struct expr *parentdep, *basedep, *dep, *dep2, **ep; + + sym = parent->sym; + if (parent->list) { + if (sym && sym_is_choice(sym)) { + /* find the first choice value and find out choice type */ + for (menu = parent->list; menu; menu = menu->next) { + if (menu->sym) { + current_entry = parent; + menu_set_type(menu->sym->type); + current_entry = menu; + menu_set_type(sym->type); + break; + } + } + parentdep = expr_alloc_symbol(sym); + } else if (parent->prompt) + parentdep = parent->prompt->visible.expr; + else + parentdep = parent->dep; + + for (menu = parent->list; menu; menu = menu->next) { + basedep = expr_transform(menu->dep); + basedep = expr_alloc_and(expr_copy(parentdep), basedep); + basedep = expr_eliminate_dups(basedep); + menu->dep = basedep; + if (menu->sym) + prop = menu->sym->prop; + else + prop = menu->prompt; + for (; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + dep = expr_transform(prop->visible.expr); + dep = expr_alloc_and(expr_copy(basedep), dep); + dep = expr_eliminate_dups(dep); + if (menu->sym && menu->sym->type != S_TRISTATE) + dep = expr_trans_bool(dep); + prop->visible.expr = dep; + if (prop->type == P_SELECT) { + struct symbol *es = prop_get_symbol(prop); + es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } + } + } + for (menu = parent->list; menu; menu = menu->next) + menu_finalize(menu); + } else if (sym) { + basedep = parent->prompt ? parent->prompt->visible.expr : NULL; + basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); + basedep = expr_eliminate_dups(expr_transform(basedep)); + last_menu = NULL; + for (menu = parent->next; menu; menu = menu->next) { + dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; + if (!expr_contains_symbol(dep, sym)) + break; + if (expr_depends_symbol(dep, sym)) + goto next; + dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); + dep = expr_eliminate_dups(expr_transform(dep)); + dep2 = expr_copy(basedep); + expr_eliminate_eq(&dep, &dep2); + expr_free(dep); + if (!expr_is_yes(dep2)) { + expr_free(dep2); + break; + } + expr_free(dep2); + next: + menu_finalize(menu); + menu->parent = parent; + last_menu = menu; + } + if (last_menu) { + parent->list = parent->next; + parent->next = last_menu->next; + last_menu->next = NULL; + } + } + for (menu = parent->list; menu; menu = menu->next) { + if (sym && sym_is_choice(sym) && menu->sym) { + menu->sym->flags |= SYMBOL_CHOICEVAL; + if (!menu->prompt) + menu_warn(menu, "choice value must have a prompt"); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->type == P_PROMPT && prop->menu != menu) { + prop_warn(prop, "choice values " + "currently only support a " + "single prompt"); + } + if (prop->type == P_DEFAULT) + prop_warn(prop, "defaults for choice " + "values not supported"); + } + current_entry = menu; + menu_set_type(sym->type); + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); + for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) + ; + *ep = expr_alloc_one(E_CHOICE, NULL); + (*ep)->right.sym = menu->sym; + } + if (menu->list && (!menu->prompt || !menu->prompt->text)) { + for (last_menu = menu->list; ; last_menu = last_menu->next) { + last_menu->parent = parent; + if (!last_menu->next) + break; + } + last_menu->next = menu->next; + menu->next = menu->list; + menu->list = NULL; + } + } + + if (sym && !(sym->flags & SYMBOL_WARNED)) { + if (sym->type == S_UNKNOWN) + menu_warn(parent, "config symbol defined " + "without type\n"); + + if (sym_is_choice(sym) && !parent->prompt) + menu_warn(parent, "choice must have a prompt\n"); + + /* Check properties connected to this symbol */ + sym_check_prop(sym); + sym->flags |= SYMBOL_WARNED; + } + + if (sym && !sym_is_optional(sym) && parent->prompt) { + sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, + expr_alloc_and(parent->prompt->visible.expr, + expr_alloc_symbol(&symbol_mod))); + } +} + +bool menu_is_visible(struct menu *menu) +{ + struct menu *child; + struct symbol *sym; + tristate visible; + + if (!menu->prompt) + return false; + sym = menu->sym; + if (sym) { + sym_calc_value(sym); + visible = menu->prompt->visible.tri; + } else + visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); + + if (visible != no) + return true; + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) + if (menu_is_visible(child)) + return true; + return false; +} + +const char *menu_get_prompt(struct menu *menu) +{ + if (menu->prompt) + return menu->prompt->text; + else if (menu->sym) + return menu->sym->name; + return NULL; +} + +struct menu *menu_get_root_menu(struct menu *menu) +{ + return &rootmenu; +} + +struct menu *menu_get_parent_menu(struct menu *menu) +{ + enum prop_type type; + + for (; menu != &rootmenu; menu = menu->parent) { + type = menu->prompt ? menu->prompt->type : 0; + if (type == P_MENU) + break; + } + return menu; +} + +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) + return file; + } + + file = malloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = strdup(name); + file->next = file_list; + file_list = file; + return file; +} + +int file_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + if (!name) + name = ".config.cmd"; + out = fopen(".config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n"); + fclose(out); + rename(".config.tmp", name); + return 0; +} + diff --git a/openwrt/package/config/menubox.c b/openwrt/package/config/menubox.c new file mode 100644 index 0000000000..431f09fc99 --- /dev/null +++ b/openwrt/package/config/menubox.c @@ -0,0 +1,436 @@ +/* + * menubox.c -- implements the menu box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Changes by Clifford Wolf (god@clifford.at) + * + * [ 1998-06-13 ] + * + * *) A bugfix for the Page-Down problem + * + * *) Formerly when I used Page Down and Page Up, the cursor would be set + * to the first position in the menu box. Now lxdialog is a bit + * smarter and works more like other menu systems (just have a look at + * it). + * + * *) Formerly if I selected something my scrolling would be broken because + * lxdialog is re-invoked by the Menuconfig shell script, can't + * remember the last scrolling position, and just sets it so that the + * cursor is at the bottom of the box. Now it writes the temporary file + * lxdialog.scrltmp which contains this information. The file is + * deleted by lxdialog if the user leaves a submenu or enters a new + * one, but it would be nice if Menuconfig could make another "rm -f" + * just to be sure. Just try it out - you will recognise a difference! + * + * [ 1998-06-14 ] + * + * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files + * and menus change their size on the fly. + * + * *) If for some reason the last scrolling position is not saved by + * lxdialog, it sets the scrolling so that the selected item is in the + * middle of the menu box, not at the bottom. + * + * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) + * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. + * This fixes a bug in Menuconfig where using ' ' to descend into menus + * would leave mis-synchronized lxdialog.scrltmp files lying around, + * fscanf would read in 'scroll', and eventually that value would get used. + */ + +#include "dialog.h" + +static int menu_width, item_x; + +/* + * Print menu item + */ +static void +print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey) +{ + int j; + char menu_item[menu_width+1]; + + strncpy(menu_item, item, menu_width); + menu_item[menu_width] = 0; + j = first_alpha(menu_item, "YyNnMm"); + + /* Clear 'residue' of last item */ + wattrset (win, menubox_attr); + wmove (win, choice, 0); +#if OLD_NCURSES + { + int i; + for (i = 0; i < menu_width; i++) + waddch (win, ' '); + } +#else + wclrtoeol(win); +#endif + wattrset (win, selected ? item_selected_attr : item_attr); + mvwaddstr (win, choice, item_x, menu_item); + if (hotkey) { + wattrset (win, selected ? tag_key_selected_attr : tag_key_attr); + mvwaddch(win, choice, item_x+j, menu_item[j]); + } + if (selected) { + wmove (win, choice, item_x+1); + wrefresh (win); + } +} + +/* + * Print the scroll indicators. + */ +static void +print_arrows (WINDOW * win, int item_no, int scroll, + int y, int x, int height) +{ + int cur_y, cur_x; + + getyx(win, cur_y, cur_x); + + wmove(win, y, x); + + if (scroll > 0) { + wattrset (win, uarrow_attr); + waddch (win, ACS_UARROW); + waddstr (win, "(-)"); + } + else { + wattrset (win, menubox_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + height < item_no)) { + wattrset (win, darrow_attr); + waddch (win, ACS_DARROW); + waddstr (win, "(+)"); + } + else { + wattrset (win, menubox_border_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + wmove(win, cur_y, cur_x); +} + +/* + * Display the termination buttons. + */ +static void +print_buttons (WINDOW *win, int height, int width, int selected) +{ + int x = width / 2 - 16; + int y = height - 2; + + print_button (win, "Select", y, x, selected == 0); + print_button (win, " Exit ", y, x + 12, selected == 1); + print_button (win, " Help ", y, x + 24, selected == 2); + + wmove(win, y, x+1+12*selected); + wrefresh (win); +} + +/* + * Display a menu for choosing among a number of options + */ +int +dialog_menu (const char *title, const char *prompt, int height, int width, + int menu_height, const char *current, int item_no, + struct dialog_list_item ** items) +{ + int i, j, x, y, box_x, box_y; + int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice; + WINDOW *dialog, *menu; + FILE *f; + + max_choice = MIN (menu_height, item_no); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + wbkgdset (dialog, dialog_attr & A_COLOR); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + menu_width = width - 6; + box_y = height - menu_height - 5; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin (dialog, menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + keypad (menu, TRUE); + + /* draw a box around the menu items */ + draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2, + menubox_border_attr, menubox_attr); + + /* + * Find length of longest item in order to center menu. + * Set 'choice' to default item. + */ + item_x = 0; + for (i = 0; i < item_no; i++) { + item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2)); + if (strcmp(current, items[i]->tag) == 0) choice = i; + } + + item_x = (menu_width - item_x) / 2; + + /* get the scroll info from the temp file */ + if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) { + if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) && + (scroll+max_choice > choice) && (scroll >= 0) && + (scroll+max_choice <= item_no) ) { + first_item = scroll; + choice = choice - scroll; + fclose(f); + } else { + scroll=0; + remove("lxdialog.scrltmp"); + fclose(f); + f=NULL; + } + } + if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) { + if (choice >= item_no-max_choice/2) + scroll = first_item = item_no-max_choice; + else + scroll = first_item = choice - max_choice/2; + choice = choice - scroll; + } + + /* Print the menu */ + for (i=0; i < max_choice; i++) { + print_item (menu, items[first_item + i]->name, i, i == choice, + (items[first_item + i]->tag[0] != ':')); + } + + wnoutrefresh (menu); + + print_arrows(dialog, item_no, scroll, + box_y, box_x+item_x+1, menu_height); + + print_buttons (dialog, height, width, 0); + wmove (menu, choice, item_x+1); + wrefresh (menu); + + while (key != ESC) { + key = wgetch(menu); + + if (key < 256 && isalpha(key)) key = tolower(key); + + if (strchr("ynm", key)) + i = max_choice; + else { + for (i = choice+1; i < max_choice; i++) { + j = first_alpha(items[scroll + i]->name, "YyNnMm>"); + if (key == tolower(items[scroll + i]->name[j])) + break; + } + if (i == max_choice) + for (i = 0; i < max_choice; i++) { + j = first_alpha(items[scroll + i]->name, "YyNnMm>"); + if (key == tolower(items[scroll + i]->name[j])) + break; + } + } + + if (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE) { + + print_item (menu, items[scroll + choice]->name, choice, FALSE, + (items[scroll + choice]->tag[0] != ':')); + + if (key == KEY_UP || key == '-') { + if (choice < 2 && scroll) { + /* Scroll menu down */ + scrollok (menu, TRUE); + wscrl (menu, -1); + scrollok (menu, FALSE); + + scroll--; + + print_item (menu, items[scroll]->name, 0, FALSE, + (items[scroll]->tag[0] != ':')); + } else + choice = MAX(choice - 1, 0); + + } else if (key == KEY_DOWN || key == '+') { + + print_item (menu, items[scroll + choice]->name, choice, FALSE, + (items[scroll + choice]->tag[0] != ':')); + + if ((choice > max_choice-3) && + (scroll + max_choice < item_no) + ) { + /* Scroll menu up */ + scrollok (menu, TRUE); + scroll (menu); + scrollok (menu, FALSE); + + scroll++; + + print_item (menu, items[scroll + max_choice - 1]->name, + max_choice-1, FALSE, + (items[scroll + max_choice - 1]->tag[0] != ':')); + } else + choice = MIN(choice+1, max_choice-1); + + } else if (key == KEY_PPAGE) { + scrollok (menu, TRUE); + for (i=0; (i < max_choice); i++) { + if (scroll > 0) { + wscrl (menu, -1); + scroll--; + print_item (menu, items[scroll]->name, 0, FALSE, + (items[scroll]->tag[0] != ':')); + } else { + if (choice > 0) + choice--; + } + } + scrollok (menu, FALSE); + + } else if (key == KEY_NPAGE) { + for (i=0; (i < max_choice); i++) { + if (scroll+max_choice < item_no) { + scrollok (menu, TRUE); + scroll(menu); + scrollok (menu, FALSE); + scroll++; + print_item (menu, items[scroll + max_choice - 1]->name, + max_choice-1, FALSE, + (items[scroll + max_choice - 1]->tag[0] != ':')); + } else { + if (choice+1 < max_choice) + choice++; + } + } + + } else + choice = i; + + print_item (menu, items[scroll + choice]->name, choice, TRUE, + (items[scroll + choice]->tag[0] != ':')); + + print_arrows(dialog, item_no, scroll, + box_y, box_x+item_x+1, menu_height); + + wnoutrefresh (dialog); + wrefresh (menu); + + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_LEFT: + case TAB: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 2 : (button > 2 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (menu); + break; + case ' ': + case 's': + case 'y': + case 'n': + case 'm': + /* save scroll info */ + if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { + fprintf(f,"%d\n",scroll); + fclose(f); + } + delwin (dialog); + items[scroll + choice]->selected = 1; + switch (key) { + case 's': return 3; + case 'y': return 3; + case 'n': return 4; + case 'm': return 5; + case ' ': return 6; + } + return 0; + case 'h': + case '?': + button = 2; + case '\n': + delwin (dialog); + items[scroll + choice]->selected = 1; + + remove("lxdialog.scrltmp"); + return button; + case 'e': + case 'x': + key = ESC; + case ESC: + break; + } + } + + delwin (dialog); + remove("lxdialog.scrltmp"); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/msgbox.c b/openwrt/package/config/msgbox.c new file mode 100644 index 0000000000..93692e1fbc --- /dev/null +++ b/openwrt/package/config/msgbox.c @@ -0,0 +1,85 @@ +/* + * msgbox.c -- implements the message box and info box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display a message box. Program will pause and display an "OK" button + * if the parameter 'pause' is non-zero. + */ +int +dialog_msgbox (const char *title, const char *prompt, int height, int width, + int pause) +{ + int i, x, y, key = 0; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 2); + + if (pause) { + wattrset (dialog, border_attr); + mvwaddch (dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + print_button (dialog, " Ok ", + height - 2, width / 2 - 4, TRUE); + + wrefresh (dialog); + while (key != ESC && key != '\n' && key != ' ' && + key != 'O' && key != 'o' && key != 'X' && key != 'x') + key = wgetch (dialog); + } else { + key = '\n'; + wrefresh (dialog); + } + + delwin (dialog); + return key == ESC ? -1 : 0; +} diff --git a/openwrt/package/config/symbol.c b/openwrt/package/config/symbol.c new file mode 100644 index 0000000000..a9fae9c13a --- /dev/null +++ b/openwrt/package/config/symbol.c @@ -0,0 +1,771 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct symbol symbol_yes = { + .name = "y", + .curr = { "y", yes }, + .flags = SYMBOL_YES|SYMBOL_VALID, +}, symbol_mod = { + .name = "m", + .curr = { "m", mod }, + .flags = SYMBOL_MOD|SYMBOL_VALID, +}, symbol_no = { + .name = "n", + .curr = { "n", no }, + .flags = SYMBOL_NO|SYMBOL_VALID, +}, symbol_empty = { + .name = "", + .curr = { "", no }, + .flags = SYMBOL_VALID, +}; + +int sym_change_count; +struct symbol *modules_sym; +tristate modules_val; + +void sym_add_default(struct symbol *sym, const char *def) +{ + struct property *prop = prop_alloc(P_DEFAULT, sym); + + prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); +} + +void sym_init(void) +{ + struct symbol *sym; + char *p; + static bool inited = false; + + if (inited) + return; + inited = true; + + sym = sym_lookup("VERSION", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("VERSION"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("TARGET_ARCH", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("TARGET_ARCH"); + if (p) + sym_add_default(sym, p); + +} + +enum symbol_type sym_get_type(struct symbol *sym) +{ + enum symbol_type type = sym->type; + + if (type == S_TRISTATE) { + if (sym_is_choice_value(sym) && sym->visible == yes) + type = S_BOOLEAN; + else if (modules_val == no) + type = S_BOOLEAN; + } + return type; +} + +const char *sym_type_name(enum symbol_type type) +{ + switch (type) { + case S_BOOLEAN: + return "boolean"; + case S_TRISTATE: + return "tristate"; + case S_INT: + return "integer"; + case S_HEX: + return "hex"; + case S_STRING: + return "string"; + case S_UNKNOWN: + return "unknown"; + case S_OTHER: + break; + } + return "???"; +} + +struct property *sym_get_choice_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_choices(sym, prop) + return prop; + return NULL; +} + +struct property *sym_get_default_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +struct property *sym_get_range_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_properties(sym, prop, P_RANGE) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +static void sym_calc_visibility(struct symbol *sym) +{ + struct property *prop; + tristate tri; + + /* any prompt visible? */ + tri = no; + for_all_prompts(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + tri = E_OR(tri, prop->visible.tri); + } + if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) + tri = yes; + if (sym->visible != tri) { + sym->visible = tri; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym)) + return; + tri = no; + if (sym->rev_dep.expr) + tri = expr_calc_value(sym->rev_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->rev_dep.tri != tri) { + sym->rev_dep.tri = tri; + sym_set_changed(sym); + } +} + +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* is the user choice visible? */ + def_sym = sym->user.val; + if (def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + def_sym = e->right.sym; + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* no choice? reset tristate value */ + sym->curr.tri = no; + return NULL; +} + +void sym_calc_value(struct symbol *sym) +{ + struct symbol_value newval, oldval; + struct property *prop; + struct expr *e; + + if (!sym) + return; + + if (sym->flags & SYMBOL_VALID) + return; + sym->flags |= SYMBOL_VALID; + + oldval = sym->curr; + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + newval = symbol_empty.curr; + break; + case S_BOOLEAN: + case S_TRISTATE: + newval = symbol_no.curr; + break; + default: + sym->curr.val = sym->name; + sym->curr.tri = no; + return; + } + if (!sym_is_choice_value(sym)) + sym->flags &= ~SYMBOL_WRITE; + + sym_calc_visibility(sym); + + /* set default if recursively called */ + sym->curr = newval; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_is_choice_value(sym) && sym->visible == yes) { + prop = sym_get_choice_prop(sym); + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) + newval.tri = sym->user.tri; + else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) + newval.tri = expr_calc_value(prop->expr); + } + newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); + } else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + sym->flags |= SYMBOL_WRITE; + newval.tri = expr_calc_value(prop->expr); + } + } + if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) + newval.tri = yes; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) { + newval.val = sym->user.val; + break; + } + } + prop = sym_get_default_prop(sym); + if (prop) { + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } + } + break; + default: + ; + } + + sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); + + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) + sym_set_changed(sym); + if (modules_sym == sym) + modules_val = modules_sym->curr.tri; + + if (sym_is_choice(sym)) { + int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + e->right.sym->flags |= flags; + if (flags & SYMBOL_CHANGED) + sym_set_changed(e->right.sym); + } + } +} + +void sym_clear_all_valid(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_VALID; + sym_change_count++; + if (modules_sym) + sym_calc_value(modules_sym); +} + +void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + +void sym_set_all_changed(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym_set_changed(sym); +} + +bool sym_tristate_within_range(struct symbol *sym, tristate val) +{ + int type = sym_get_type(sym); + + if (sym->visible == no) + return false; + + if (type != S_BOOLEAN && type != S_TRISTATE) + return false; + + if (type == S_BOOLEAN && val == mod) + return false; + if (sym->visible <= sym->rev_dep.tri) + return false; + if (sym_is_choice_value(sym) && sym->visible == yes) + return val == yes; + return val >= sym->rev_dep.tri && val <= sym->visible; +} + +bool sym_set_tristate_value(struct symbol *sym, tristate val) +{ + tristate oldval = sym_get_tristate_value(sym); + + if (oldval != val && !sym_tristate_within_range(sym, val)) + return false; + + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym) && val == yes) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + + cs->user.val = sym; + cs->flags &= ~SYMBOL_NEW; + } + + sym->user.tri = val; + if (oldval != val) { + sym_clear_all_valid(); + if (sym == modules_sym) + sym_set_all_changed(); + } + + return true; +} + +tristate sym_toggle_tristate_value(struct symbol *sym) +{ + tristate oldval, newval; + + oldval = newval = sym_get_tristate_value(sym); + do { + switch (newval) { + case no: + newval = mod; + break; + case mod: + newval = yes; + break; + case yes: + newval = no; + break; + } + if (sym_set_tristate_value(sym, newval)) + break; + } while (oldval != newval); + return newval; +} + +bool sym_string_valid(struct symbol *sym, const char *str) +{ + char ch; + + switch (sym->type) { + case S_STRING: + return true; + case S_INT: + ch = *str++; + if (ch == '-') + ch = *str++; + if (!isdigit(ch)) + return false; + if (ch == '0' && *str != 0) + return false; + while ((ch = *str++)) { + if (!isdigit(ch)) + return false; + } + return true; + case S_HEX: + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + str += 2; + ch = *str++; + do { + if (!isxdigit(ch)) + return false; + } while ((ch = *str++)); + return true; + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + case 'm': case 'M': + case 'n': case 'N': + return true; + } + return false; + default: + return false; + } +} + +bool sym_string_within_range(struct symbol *sym, const char *str) +{ + struct property *prop; + int val; + + switch (sym->type) { + case S_STRING: + return sym_string_valid(sym, str); + case S_INT: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 10); + return val >= strtol(prop->expr->left.sym->name, NULL, 10) && + val <= strtol(prop->expr->right.sym->name, NULL, 10); + case S_HEX: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 16); + return val >= strtol(prop->expr->left.sym->name, NULL, 16) && + val <= strtol(prop->expr->right.sym->name, NULL, 16); + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + return sym_tristate_within_range(sym, yes); + case 'm': case 'M': + return sym_tristate_within_range(sym, mod); + case 'n': case 'N': + return sym_tristate_within_range(sym, no); + } + return false; + default: + return false; + } +} + +bool sym_set_string_value(struct symbol *sym, const char *newval) +{ + const char *oldval; + char *val; + int size; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (newval[0]) { + case 'y': case 'Y': + return sym_set_tristate_value(sym, yes); + case 'm': case 'M': + return sym_set_tristate_value(sym, mod); + case 'n': case 'N': + return sym_set_tristate_value(sym, no); + } + return false; + default: + ; + } + + if (!sym_string_within_range(sym, newval)) + return false; + + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; + sym_set_changed(sym); + } + + oldval = sym->user.val; + size = strlen(newval) + 1; + if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { + size += 2; + sym->user.val = val = malloc(size); + *val++ = '0'; + *val++ = 'x'; + } else if (!oldval || strcmp(oldval, newval)) + sym->user.val = val = malloc(size); + else + return true; + + strcpy(val, newval); + free((void *)oldval); + sym_clear_all_valid(); + + return true; +} + +const char *sym_get_string_value(struct symbol *sym) +{ + tristate val; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + return "n"; + case mod: + return "m"; + case yes: + return "y"; + } + break; + default: + ; + } + return (const char *)sym->curr.val; +} + +bool sym_is_changable(struct symbol *sym) +{ + return sym->visible > sym->rev_dep.tri; +} + +struct symbol *sym_lookup(const char *name, int isconst) +{ + struct symbol *symbol; + const char *ptr; + char *new_name; + int hash = 0; + + if (name) { + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name)) { + if ((isconst && symbol->flags & SYMBOL_CONST) || + (!isconst && !(symbol->flags & SYMBOL_CONST))) + return symbol; + } + } + new_name = strdup(name); + } else { + new_name = NULL; + hash = 256; + } + + symbol = malloc(sizeof(*symbol)); + memset(symbol, 0, sizeof(*symbol)); + symbol->name = new_name; + symbol->type = S_UNKNOWN; + symbol->flags = SYMBOL_NEW; + if (isconst) + symbol->flags |= SYMBOL_CONST; + + symbol->next = symbol_hash[hash]; + symbol_hash[hash] = symbol; + + return symbol; +} + +struct symbol *sym_find(const char *name) +{ + struct symbol *symbol = NULL; + const char *ptr; + int hash = 0; + + if (!name) + return NULL; + + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name) && + !(symbol->flags & SYMBOL_CONST)) + break; + } + + return symbol; +} + +struct symbol *sym_check_deps(struct symbol *sym); + +static struct symbol *sym_check_expr_deps(struct expr *e) +{ + struct symbol *sym; + + if (!e) + return NULL; + switch (e->type) { + case E_OR: + case E_AND: + sym = sym_check_expr_deps(e->left.expr); + if (sym) + return sym; + return sym_check_expr_deps(e->right.expr); + case E_NOT: + return sym_check_expr_deps(e->left.expr); + case E_EQUAL: + case E_UNEQUAL: + sym = sym_check_deps(e->left.sym); + if (sym) + return sym; + return sym_check_deps(e->right.sym); + case E_SYMBOL: + return sym_check_deps(e->left.sym); + default: + break; + } + printf("Oops! How to check %d?\n", e->type); + return NULL; +} + +struct symbol *sym_check_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + + if (sym->flags & SYMBOL_CHECK_DONE) + return NULL; + if (sym->flags & SYMBOL_CHECK) { + printf("Warning! Found recursive dependency: %s", sym->name); + return sym; + } + + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_expr_deps(sym->rev_dep.expr); + if (sym2) + goto out; + + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->type == P_CHOICE || prop->type == P_SELECT) + continue; + sym2 = sym_check_expr_deps(prop->visible.expr); + if (sym2) + goto out; + if (prop->type != P_DEFAULT || sym_is_choice(sym)) + continue; + sym2 = sym_check_expr_deps(prop->expr); + if (sym2) + goto out; + } +out: + if (sym2) + printf(" %s", sym->name); + sym->flags &= ~SYMBOL_CHECK; + return sym2; +} + +struct property *prop_alloc(enum prop_type type, struct symbol *sym) +{ + struct property *prop; + struct property **propp; + + prop = malloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->sym = sym; + prop->file = current_file; + prop->lineno = zconf_lineno(); + + /* append property to the prop list of symbol */ + if (sym) { + for (propp = &sym->prop; *propp; propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_CHOICE)) + return prop->expr->left.sym; + return NULL; +} + +const char *prop_get_type_name(enum prop_type type) +{ + switch (type) { + case P_PROMPT: + return "prompt"; + case P_COMMENT: + return "comment"; + case P_MENU: + return "menu"; + case P_DEFAULT: + return "default"; + case P_CHOICE: + return "choice"; + case P_SELECT: + return "select"; + case P_RANGE: + return "range"; + case P_UNKNOWN: + break; + } + return "unknown"; +} diff --git a/openwrt/package/config/textbox.c b/openwrt/package/config/textbox.c new file mode 100644 index 0000000000..a5a460b5cc --- /dev/null +++ b/openwrt/package/config/textbox.c @@ -0,0 +1,556 @@ +/* + * textbox.c -- implements the text box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static void back_lines (int n); +static void print_page (WINDOW * win, int height, int width); +static void print_line (WINDOW * win, int row, int width); +static char *get_line (void); +static void print_position (WINDOW * win, int height, int width); + +static int hscroll, fd, file_size, bytes_read; +static int begin_reached = 1, end_reached, page_length; +static char *buf, *page; + +/* + * Display text from a file in a dialog box. + */ +int +dialog_textbox (const char *title, const char *file, int height, int width) +{ + int i, x, y, cur_x, cur_y, fpos, key = 0; + int passed_end; + char search_term[MAX_LEN + 1]; + WINDOW *dialog, *text; + + search_term[0] = '\0'; /* no search term entered yet */ + + /* Open input file for reading */ + if ((fd = open (file, O_RDONLY)) == -1) { + endwin (); + fprintf (stderr, + "\nCan't open input file in dialog_textbox().\n"); + exit (-1); + } + /* Get file size. Actually, 'file_size' is the real file size - 1, + since it's only the last byte offset from the beginning */ + if ((file_size = lseek (fd, 0, SEEK_END)) == -1) { + endwin (); + fprintf (stderr, "\nError getting file size in dialog_textbox().\n"); + exit (-1); + } + /* Restore file pointer to beginning of file after getting file size */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + /* Allocate space for read buffer */ + if ((buf = malloc (BUF_SIZE + 1)) == NULL) { + endwin (); + fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; /* mark end of valid data */ + page = buf; /* page is pointer to start of page to be displayed */ + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + /* Create window for text region, used for scrolling text */ + text = subwin (dialog, height - 4, width - 2, y + 1, x + 1); + wattrset (text, dialog_attr); + wbkgdset (text, dialog_attr & A_COLOR); + + keypad (text, TRUE); + + /* register the new window, along with its borders */ + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + wbkgdset (dialog, dialog_attr & A_COLOR); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE); + wnoutrefresh (dialog); + getyx (dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear (text, height - 4, width - 2, dialog_attr); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + + while ((key != ESC) && (key != '\n')) { + key = wgetch (dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + case 'X': + case 'x': + delwin (dialog); + free (buf); + close (fd); + return 0; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + /* First page not in buffer? */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if (fpos > bytes_read) { /* Yes, we have to read it in */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, + "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } + page = buf; + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case 'G': /* Last page */ + case KEY_END: + + end_reached = 1; + /* Last page not in buffer? */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if (fpos < file_size) { /* Yes, we have to read it in */ + if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, + "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } + page = buf + bytes_read; + back_lines (height - 4); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + break; + case 'K': /* Previous line */ + case 'k': + case KEY_UP: + if (!begin_reached) { + back_lines (page_length + 1); + + /* We don't call print_page() here but use scrolling to ensure + faster screen update. However, 'end_reached' and + 'page_length' should still be updated, and 'page' should + point to start of next page. This is done by calling + get_line() in the following 'for' loop. */ + scrollok (text, TRUE); + wscrl (text, -1); /* Scroll text region down one line */ + scrollok (text, FALSE); + page_length = 0; + passed_end = 0; + for (i = 0; i < height - 4; i++) { + if (!i) { + /* print first line of page */ + print_line (text, 0, width - 2); + wnoutrefresh (text); + } else + /* Called to update 'end_reached' and 'page' */ + get_line (); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case 'B': /* Previous page */ + case 'b': + case KEY_PPAGE: + if (begin_reached) + break; + back_lines (page_length + height - 4); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case 'J': /* Next line */ + case 'j': + case KEY_DOWN: + if (!end_reached) { + begin_reached = 0; + scrollok (text, TRUE); + scroll (text); /* Scroll text region up one line */ + scrollok (text, FALSE); + print_line (text, height - 5, width - 2); + wnoutrefresh (text); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case KEY_NPAGE: /* Next page */ + case ' ': + if (end_reached) + break; + + begin_reached = 0; + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll <= 0) + break; + + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines (page_length); + print_page (text, height - 4, width - 2); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll >= MAX_LEN) + break; + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines (page_length); + print_page (text, height - 4, width - 2); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case ESC: + break; + } + } + + delwin (dialog); + free (buf); + close (fd); + return 1; /* ESC pressed */ +} + +/* + * Go back 'n' lines in text file. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void +back_lines (int n) +{ + int i, fpos; + + begin_reached = 0; + /* We have to distinguish between end_reached and !end_reached + since at end of file, the line is not ended by a '\n'. + The code inside 'if' basically does a '--page' to move one + character backward so as to skip '\n' of the previous line */ + if (!end_reached) { + /* Either beginning of buffer or beginning of file reached? */ + if (page == buf) { + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "back_lines().\n"); + exit (-1); + } + if (fpos > bytes_read) { /* Not beginning of file yet */ + /* We've reached beginning of buffer, but not beginning of + file yet, so read previous part of file into buffer. + Note that we only move backward for BUF_SIZE/2 bytes, + but not BUF_SIZE bytes to avoid re-reading again in + print_page() later */ + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE / 2 + bytes_read) { + /* No, move less then */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "back_lines().\n"); + exit (-1); + } + page = buf + fpos - bytes_read; + } else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) + == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer " + "in back_lines().\n"); + exit (-1); + } + page = buf + BUF_SIZE / 2; + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in back_lines().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + if (*(--page) != '\n') { /* '--page' here */ + /* Something's wrong... */ + endwin (); + fprintf (stderr, "\nInternal error in back_lines().\n"); + exit (-1); + } + } + /* Go back 'n' lines */ + for (i = 0; i < n; i++) + do { + if (page == buf) { + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in back_lines().\n"); + exit (-1); + } + if (fpos > bytes_read) { + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE / 2 + bytes_read) { + /* No, move less then */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer " + "in back_lines().\n"); + exit (-1); + } + page = buf + fpos - bytes_read; + } else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), + SEEK_CUR) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer" + " in back_lines().\n"); + exit (-1); + } + page = buf + BUF_SIZE / 2; + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in " + "back_lines().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + } while (*(--page) != '\n'); + page++; +} + +/* + * Print a new page of text. Called by dialog_textbox(). + */ +static void +print_page (WINDOW * win, int height, int width) +{ + int i, passed_end = 0; + + page_length = 0; + for (i = 0; i < height; i++) { + print_line (win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh (win); +} + +/* + * Print a new line of text. Called by dialog_textbox() and print_page(). + */ +static void +print_line (WINDOW * win, int row, int width) +{ + int y, x; + char *line; + + line = get_line (); + line += MIN (strlen (line), hscroll); /* Scroll horizontally */ + wmove (win, row, 0); /* move cursor to correct line */ + waddch (win, ' '); + waddnstr (win, line, MIN (strlen (line), width - 2)); + + getyx (win, y, x); + /* Clear 'residue' of previous line */ +#if OLD_NCURSES + { + int i; + for (i = 0; i < width - x; i++) + waddch (win, ' '); + } +#else + wclrtoeol(win); +#endif +} + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static char * +get_line (void) +{ + int i = 0, fpos; + static char line[MAX_LEN + 1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { + /* Either end of file or end of buffer reached */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "get_line().\n"); + exit (-1); + } + if (fpos < file_size) { /* Not end of file yet */ + /* We've reached end of buffer, but not end of file yet, + so read next part of file into buffer */ + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in get_line().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + page = buf; + } else { + if (!end_reached) + end_reached = 1; + break; + } + } else if (i < MAX_LEN) + line[i++] = *(page++); + else { + /* Truncate lines longer than MAX_LEN characters */ + if (i == MAX_LEN) + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move pass '\n' */ + + return line; +} + +/* + * Print current position + */ +static void +print_position (WINDOW * win, int height, int width) +{ + int fpos, percent; + + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in print_position().\n"); + exit (-1); + } + wattrset (win, position_indicator_attr); + wbkgdset (win, position_indicator_attr & A_COLOR); + percent = !file_size ? + 100 : ((fpos - bytes_read + page - buf) * 100) / file_size; + wmove (win, height - 3, width - 9); + wprintw (win, "(%3d%%)", percent); +} diff --git a/openwrt/package/config/util.c b/openwrt/package/config/util.c new file mode 100644 index 0000000000..0a2f827570 --- /dev/null +++ b/openwrt/package/config/util.c @@ -0,0 +1,375 @@ +/* + * util.c + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + + +/* use colors by default? */ +bool use_colors = 1; + +char *backtitle = NULL; + +const char *dialog_result; + +/* + * Attribute values, default is for mono display + */ +chtype attributes[] = +{ + A_NORMAL, /* screen_attr */ + A_NORMAL, /* shadow_attr */ + A_NORMAL, /* dialog_attr */ + A_BOLD, /* title_attr */ + A_NORMAL, /* border_attr */ + A_REVERSE, /* button_active_attr */ + A_DIM, /* button_inactive_attr */ + A_REVERSE, /* button_key_active_attr */ + A_BOLD, /* button_key_inactive_attr */ + A_REVERSE, /* button_label_active_attr */ + A_NORMAL, /* button_label_inactive_attr */ + A_NORMAL, /* inputbox_attr */ + A_NORMAL, /* inputbox_border_attr */ + A_NORMAL, /* searchbox_attr */ + A_BOLD, /* searchbox_title_attr */ + A_NORMAL, /* searchbox_border_attr */ + A_BOLD, /* position_indicator_attr */ + A_NORMAL, /* menubox_attr */ + A_NORMAL, /* menubox_border_attr */ + A_NORMAL, /* item_attr */ + A_REVERSE, /* item_selected_attr */ + A_BOLD, /* tag_attr */ + A_REVERSE, /* tag_selected_attr */ + A_BOLD, /* tag_key_attr */ + A_REVERSE, /* tag_key_selected_attr */ + A_BOLD, /* check_attr */ + A_REVERSE, /* check_selected_attr */ + A_BOLD, /* uarrow_attr */ + A_BOLD /* darrow_attr */ +}; + + +#include "colors.h" + +/* + * Table of color values + */ +int color_table[][3] = +{ + {SCREEN_FG, SCREEN_BG, SCREEN_HL}, + {SHADOW_FG, SHADOW_BG, SHADOW_HL}, + {DIALOG_FG, DIALOG_BG, DIALOG_HL}, + {TITLE_FG, TITLE_BG, TITLE_HL}, + {BORDER_FG, BORDER_BG, BORDER_HL}, + {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL}, + {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL}, + {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL}, + {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL}, + {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL}, + {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG, + BUTTON_LABEL_INACTIVE_HL}, + {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL}, + {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL}, + {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL}, + {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL}, + {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL}, + {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL}, + {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL}, + {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL}, + {ITEM_FG, ITEM_BG, ITEM_HL}, + {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL}, + {TAG_FG, TAG_BG, TAG_HL}, + {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL}, + {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL}, + {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL}, + {CHECK_FG, CHECK_BG, CHECK_HL}, + {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL}, + {UARROW_FG, UARROW_BG, UARROW_HL}, + {DARROW_FG, DARROW_BG, DARROW_HL}, +}; /* color_table */ + +/* + * Set window to attribute 'attr' + */ +void +attr_clear (WINDOW * win, int height, int width, chtype attr) +{ + int i, j; + + wattrset (win, attr); + for (i = 0; i < height; i++) { + wmove (win, i, 0); + for (j = 0; j < width; j++) + waddch (win, ' '); + } + touchwin (win); +} + +void dialog_clear (void) +{ + attr_clear (stdscr, LINES, COLS, screen_attr); + /* Display background title if it exists ... - SLH */ + if (backtitle != NULL) { + int i; + + wattrset (stdscr, screen_attr); + mvwaddstr (stdscr, 0, 1, (char *)backtitle); + wmove (stdscr, 1, 1); + for (i = 1; i < COLS - 1; i++) + waddch (stdscr, ACS_HLINE); + } + wnoutrefresh (stdscr); +} + +/* + * Do some initialization for dialog + */ +void +init_dialog (void) +{ + initscr (); /* Init curses */ + keypad (stdscr, TRUE); + cbreak (); + noecho (); + + + if (use_colors) /* Set up colors */ + color_setup (); + + + dialog_clear (); +} + +/* + * Setup for color display + */ +void +color_setup (void) +{ + int i; + + if (has_colors ()) { /* Terminal supports color? */ + start_color (); + + /* Initialize color pairs */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + init_pair (i + 1, color_table[i][0], color_table[i][1]); + + /* Setup color attributes */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + attributes[i] = C_ATTR (color_table[i][2], i + 1); + } +} + +/* + * End using dialog functions. + */ +void +end_dialog (void) +{ + endwin (); +} + + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Newline + * characters '\n' are replaced by spaces. We start on a new line + * if there is no room for at least 4 nonblanks following a double-space. + */ +void +print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x) +{ + int newl, cur_x, cur_y; + int i, prompt_len, room, wlen; + char tempstr[MAX_LEN + 1], *word, *sp, *sp2; + + strcpy (tempstr, prompt); + + prompt_len = strlen(tempstr); + + /* + * Remove newlines + */ + for(i=0; i room || + (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room + && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) { + cur_y++; + cur_x = x; + } + wmove (win, cur_y, cur_x); + waddstr (win, word); + getyx (win, cur_y, cur_x); + cur_x++; + if (sp && *sp == ' ') { + cur_x++; /* double space */ + while (*++sp == ' '); + newl = 1; + } else + newl = 0; + word = sp; + } + } +} + +/* + * Print a button + */ +void +print_button (WINDOW * win, const char *label, int y, int x, int selected) +{ + int i, temp; + + wmove (win, y, x); + wattrset (win, selected ? button_active_attr : button_inactive_attr); + waddstr (win, "<"); + temp = strspn (label, " "); + label += temp; + wattrset (win, selected ? button_label_active_attr + : button_label_inactive_attr); + for (i = 0; i < temp; i++) + waddch (win, ' '); + wattrset (win, selected ? button_key_active_attr + : button_key_inactive_attr); + waddch (win, label[0]); + wattrset (win, selected ? button_label_active_attr + : button_label_inactive_attr); + waddstr (win, (char *)label + 1); + wattrset (win, selected ? button_active_attr : button_inactive_attr); + waddstr (win, ">"); + wmove (win, y, x + temp + 1); +} + +/* + * Draw a rectangular box with line drawing characters + */ +void +draw_box (WINDOW * win, int y, int x, int height, int width, + chtype box, chtype border) +{ + int i, j; + + wattrset (win, 0); + for (i = 0; i < height; i++) { + wmove (win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch (win, border | ACS_ULCORNER); + else if (i == height - 1 && !j) + waddch (win, border | ACS_LLCORNER); + else if (!i && j == width - 1) + waddch (win, box | ACS_URCORNER); + else if (i == height - 1 && j == width - 1) + waddch (win, box | ACS_LRCORNER); + else if (!i) + waddch (win, border | ACS_HLINE); + else if (i == height - 1) + waddch (win, box | ACS_HLINE); + else if (!j) + waddch (win, border | ACS_VLINE); + else if (j == width - 1) + waddch (win, box | ACS_VLINE); + else + waddch (win, box | ' '); + } +} + +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void +draw_shadow (WINDOW * win, int y, int x, int height, int width) +{ + int i; + + if (has_colors ()) { /* Whether terminal supports color? */ + wattrset (win, shadow_attr); + wmove (win, y + height, x + 2); + for (i = 0; i < width; i++) + waddch (win, winch (win) & A_CHARTEXT); + for (i = y + 1; i < y + height + 1; i++) { + wmove (win, i, x + width); + waddch (win, winch (win) & A_CHARTEXT); + waddch (win, winch (win) & A_CHARTEXT); + } + wnoutrefresh (win); + } +} + +/* + * Return the position of the first alphabetic character in a string. + */ +int +first_alpha(const char *string, const char *exempt) +{ + int i, in_paren=0, c; + + for (i = 0; i < strlen(string); i++) { + c = tolower(string[i]); + + if (strchr("<[(", c)) ++in_paren; + if (strchr(">])", c) && in_paren > 0) --in_paren; + + if ((! in_paren) && isalpha(c) && + strchr(exempt, c) == 0) + return i; + } + + return 0; +} + +/* + * Get the first selected item in the dialog_list_item list. + */ +struct dialog_list_item * +first_sel_item(int item_no, struct dialog_list_item ** items) +{ + int i; + + for (i = 0; i < item_no; i++) { + if (items[i]->selected) + return items[i]; + } + + return NULL; +} diff --git a/openwrt/package/config/yesno.c b/openwrt/package/config/yesno.c new file mode 100644 index 0000000000..11fcc25f51 --- /dev/null +++ b/openwrt/package/config/yesno.c @@ -0,0 +1,118 @@ +/* + * yesno.c -- implements the yes/no box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display termination buttons + */ +static void +print_buttons(WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 10; + int y = height - 2; + + print_button (dialog, " Yes ", y, x, selected == 0); + print_button (dialog, " No ", y, x + 13, selected == 1); + + wmove(dialog, y, x+1 + 13*selected ); + wrefresh (dialog); +} + +/* + * Display a dialog box with two buttons - Yes and No + */ +int +dialog_yesno (const char *title, const char *prompt, int height, int width) +{ + int i, x, y, key = 0, button = 0; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + print_buttons(dialog, height, width, 0); + + while (key != ESC) { + key = wgetch (dialog); + switch (key) { + case 'Y': + case 'y': + delwin (dialog); + return 0; + case 'N': + case 'n': + delwin (dialog); + return 1; + + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (dialog); + break; + case ' ': + case '\n': + delwin (dialog); + return button; + case ESC: + break; + } + } + + delwin (dialog); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/zconf.l b/openwrt/package/config/zconf.l new file mode 100644 index 0000000000..55517b2877 --- /dev/null +++ b/openwrt/package/config/zconf.l @@ -0,0 +1,366 @@ +%option backup nostdinit noyywrap never-interactive full ecs +%option 8bit backup nodefault perf-report perf-report +%x COMMAND HELP STRING PARAM +%{ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +char *text; +static char *text_ptr; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static struct buffer *zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_ptr = text; + text_size = 0; + *text_ptr = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + text = realloc(text, new_size); + text_asize = new_size; + text_ptr = text + text_size; + } + memcpy(text_ptr, str, size); + text_ptr += size; + text_size += size; + *text_ptr = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} +%} + +ws [ \n\t] +n [A-Za-z0-9_] + +%% + int str = 0; + int ts, i; + +[ \t]*#.*\n current_file->lineno++; +[ \t]*#.* + +[ \t]*\n current_file->lineno++; return T_EOL; + +[ \t]+ { + BEGIN(COMMAND); +} + +. { + unput(yytext[0]); + BEGIN(COMMAND); +} + + +{ + "mainmenu" BEGIN(PARAM); return T_MAINMENU; + "menu" BEGIN(PARAM); return T_MENU; + "endmenu" BEGIN(PARAM); return T_ENDMENU; + "source" BEGIN(PARAM); return T_SOURCE; + "choice" BEGIN(PARAM); return T_CHOICE; + "endchoice" BEGIN(PARAM); return T_ENDCHOICE; + "comment" BEGIN(PARAM); return T_COMMENT; + "config" BEGIN(PARAM); return T_CONFIG; + "menuconfig" BEGIN(PARAM); return T_MENUCONFIG; + "help" BEGIN(PARAM); return T_HELP; + "if" BEGIN(PARAM); return T_IF; + "endif" BEGIN(PARAM); return T_ENDIF; + "depends" BEGIN(PARAM); return T_DEPENDS; + "requires" BEGIN(PARAM); return T_REQUIRES; + "optional" BEGIN(PARAM); return T_OPTIONAL; + "default" BEGIN(PARAM); return T_DEFAULT; + "prompt" BEGIN(PARAM); return T_PROMPT; + "tristate" BEGIN(PARAM); return T_TRISTATE; + "def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE; + "bool" BEGIN(PARAM); return T_BOOLEAN; + "boolean" BEGIN(PARAM); return T_BOOLEAN; + "def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN; + "def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN; + "int" BEGIN(PARAM); return T_INT; + "hex" BEGIN(PARAM); return T_HEX; + "string" BEGIN(PARAM); return T_STRING; + "select" BEGIN(PARAM); return T_SELECT; + "enable" BEGIN(PARAM); return T_SELECT; + "range" BEGIN(PARAM); return T_RANGE; + {n}+ { + alloc_string(yytext, yyleng); + zconflval.string = text; + return T_WORD; + } + . + \n current_file->lineno++; BEGIN(INITIAL); +} + +{ + "&&" return T_AND; + "||" return T_OR; + "(" return T_OPEN_PAREN; + ")" return T_CLOSE_PAREN; + "!" return T_NOT; + "=" return T_EQUAL; + "!=" return T_UNEQUAL; + "if" return T_IF; + "on" return T_ON; + \"|\' { + str = yytext[0]; + new_string(); + BEGIN(STRING); + } + \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; + --- /* ignore */ + ({n}|[-/.])+ { + alloc_string(yytext, yyleng); + zconflval.string = text; + return T_WORD; + } + #.* /* comment */ + \\\n current_file->lineno++; + . + <> { + BEGIN(INITIAL); + } +} + +{ + [^'"\\\n]+/\n { + append_string(yytext, yyleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + [^'"\\\n]+ { + append_string(yytext, yyleng); + } + \\.?/\n { + append_string(yytext + 1, yyleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + \\.? { + append_string(yytext + 1, yyleng - 1); + } + \'|\" { + if (str == yytext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(yytext, 1); + } + \n { + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + <> { + BEGIN(INITIAL); + } +} + +{ + [ \t]+ { + ts = 0; + for (i = 0; i < yyleng; i++) { + if (yytext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + [ \t]*\n/[^ \t\n] { + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + [ \t]*\n { + current_file->lineno++; + append_string("\n", 1); + } + [^ \t\n].* { + append_string(yytext, yyleng); + if (!first_ts) + first_ts = last_ts; + } + <> { + zconf_endhelp(); + return T_HELPTEXT; + } +} + +<> { + if (current_buf) { + zconf_endfile(); + return T_EOF; + } + fclose(yyin); + yyterminate(); +} + +%% +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + yyin = zconf_fopen(name); + if (!yyin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + yyin = zconf_fopen(name); + if (!yyin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static struct buffer *zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(yyin); + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; + + return parent; +} + +int zconf_lineno(void) +{ + if (current_buf) + return current_file->lineno - 1; + else + return 0; +} + +char *zconf_curname(void) +{ + if (current_buf) + return current_file->name; + else + return ""; +} diff --git a/openwrt/package/config/zconf.tab.c_shipped b/openwrt/package/config/zconf.tab.c_shipped new file mode 100644 index 0000000000..83dbf9ed57 --- /dev/null +++ b/openwrt/package/config/zconf.tab.c_shipped @@ -0,0 +1,2127 @@ +/* A Bison parser, made by GNU Bison 1.875a. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse zconfparse +#define yylex zconflex +#define yyerror zconferror +#define yylval zconflval +#define yychar zconfchar +#define yydebug zconfdebug +#define yynerrs zconfnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_MENUCONFIG = 266, + T_HELP = 267, + T_HELPTEXT = 268, + T_IF = 269, + T_ENDIF = 270, + T_DEPENDS = 271, + T_REQUIRES = 272, + T_OPTIONAL = 273, + T_PROMPT = 274, + T_DEFAULT = 275, + T_TRISTATE = 276, + T_DEF_TRISTATE = 277, + T_BOOLEAN = 278, + T_DEF_BOOLEAN = 279, + T_STRING = 280, + T_INT = 281, + T_HEX = 282, + T_WORD = 283, + T_WORD_QUOTE = 284, + T_UNEQUAL = 285, + T_EOF = 286, + T_EOL = 287, + T_CLOSE_PAREN = 288, + T_OPEN_PAREN = 289, + T_ON = 290, + T_SELECT = 291, + T_RANGE = 292, + T_OR = 293, + T_AND = 294, + T_EQUAL = 295, + T_NOT = 296 + }; +#endif +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_MENUCONFIG 266 +#define T_HELP 267 +#define T_HELPTEXT 268 +#define T_IF 269 +#define T_ENDIF 270 +#define T_DEPENDS 271 +#define T_REQUIRES 272 +#define T_OPTIONAL 273 +#define T_PROMPT 274 +#define T_DEFAULT 275 +#define T_TRISTATE 276 +#define T_DEF_TRISTATE 277 +#define T_BOOLEAN 278 +#define T_DEF_BOOLEAN 279 +#define T_STRING 280 +#define T_INT 281 +#define T_HEX 282 +#define T_WORD 283 +#define T_WORD_QUOTE 284 +#define T_UNEQUAL 285 +#define T_EOF 286 +#define T_EOL 287 +#define T_CLOSE_PAREN 288 +#define T_OPEN_PAREN 289 +#define T_ON 290 +#define T_SELECT 291 +#define T_RANGE 292 +#define T_OR 293 +#define T_AND 294 +#define T_EQUAL 295 +#define T_NOT 296 + + + + +/* Copy the first part of user declarations. */ + + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(int token, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +#define YYERROR_VERBOSE + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + +typedef union YYSTYPE { + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} YYSTYPE; +/* Line 191 of yacc.c. */ + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +#define LKC_DIRECT_LINK +#include "lkc.h" + + +/* Line 214 of yacc.c. */ + + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 201 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 42 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 41 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 104 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 182 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 296 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 4, 7, 9, 11, 13, 17, 19, + 21, 23, 26, 28, 30, 32, 34, 36, 38, 42, + 45, 49, 52, 53, 56, 59, 62, 65, 69, 74, + 78, 83, 87, 91, 95, 100, 105, 110, 116, 119, + 122, 124, 128, 131, 132, 135, 138, 141, 144, 149, + 153, 157, 160, 165, 166, 169, 173, 175, 179, 182, + 183, 186, 189, 192, 196, 199, 201, 205, 208, 209, + 212, 215, 218, 222, 226, 228, 232, 235, 238, 241, + 242, 245, 248, 253, 257, 261, 262, 265, 267, 269, + 272, 275, 278, 280, 282, 283, 286, 288, 292, 296, + 300, 303, 307, 311, 313 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 43, 0, -1, -1, 43, 44, -1, 45, -1, 55, + -1, 66, -1, 3, 77, 79, -1, 5, -1, 15, + -1, 8, -1, 1, 79, -1, 61, -1, 71, -1, + 47, -1, 49, -1, 69, -1, 79, -1, 10, 28, + 32, -1, 46, 50, -1, 11, 28, 32, -1, 48, + 50, -1, -1, 50, 51, -1, 50, 75, -1, 50, + 73, -1, 50, 32, -1, 21, 76, 32, -1, 22, + 81, 80, 32, -1, 23, 76, 32, -1, 24, 81, + 80, 32, -1, 26, 76, 32, -1, 27, 76, 32, + -1, 25, 76, 32, -1, 19, 77, 80, 32, -1, + 20, 81, 80, 32, -1, 36, 28, 80, 32, -1, + 37, 82, 82, 80, 32, -1, 7, 32, -1, 52, + 56, -1, 78, -1, 53, 58, 54, -1, 53, 58, + -1, -1, 56, 57, -1, 56, 75, -1, 56, 73, + -1, 56, 32, -1, 19, 77, 80, 32, -1, 21, + 76, 32, -1, 23, 76, 32, -1, 18, 32, -1, + 20, 28, 80, 32, -1, -1, 58, 45, -1, 14, + 81, 32, -1, 78, -1, 59, 62, 60, -1, 59, + 62, -1, -1, 62, 45, -1, 62, 66, -1, 62, + 55, -1, 4, 77, 32, -1, 63, 74, -1, 78, + -1, 64, 67, 65, -1, 64, 67, -1, -1, 67, + 45, -1, 67, 66, -1, 67, 55, -1, 67, 1, + 32, -1, 6, 77, 32, -1, 68, -1, 9, 77, + 32, -1, 70, 74, -1, 12, 32, -1, 72, 13, + -1, -1, 74, 75, -1, 74, 32, -1, 16, 35, + 81, 32, -1, 16, 81, 32, -1, 17, 81, 32, + -1, -1, 77, 80, -1, 28, -1, 29, -1, 5, + 79, -1, 8, 79, -1, 15, 79, -1, 32, -1, + 31, -1, -1, 14, 81, -1, 82, -1, 82, 40, + 82, -1, 82, 30, 82, -1, 34, 81, 33, -1, + 41, 81, -1, 81, 38, 81, -1, 81, 39, 81, + -1, 28, -1, 29, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 94, 94, 95, 98, 99, 100, 101, 102, 103, + 104, 105, 109, 110, 111, 112, 113, 114, 120, 128, + 134, 142, 152, 154, 155, 156, 157, 160, 166, 173, + 179, 186, 192, 198, 204, 210, 216, 222, 230, 239, + 245, 254, 255, 261, 263, 264, 265, 266, 269, 275, + 281, 287, 293, 299, 301, 306, 315, 324, 325, 331, + 333, 334, 335, 340, 347, 353, 362, 363, 369, 371, + 372, 373, 374, 377, 383, 390, 397, 404, 410, 417, + 418, 419, 422, 427, 432, 440, 442, 447, 448, 451, + 452, 453, 457, 457, 459, 460, 463, 464, 465, 466, + 467, 468, 469, 472, 473 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", + "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", + "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", + "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE", + "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT", + "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL", + "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR", + "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", + "common_block", "config_entry_start", "config_stmt", + "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", + "config_option", "choice", "choice_entry", "choice_end", "choice_stmt", + "choice_option_list", "choice_option", "choice_block", "if", "if_end", + "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt", + "menu_block", "source", "source_stmt", "comment", "comment_stmt", + "help_start", "help", "depends_list", "depends", "prompt_stmt_opt", + "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 42, 43, 43, 44, 44, 44, 44, 44, 44, + 44, 44, 45, 45, 45, 45, 45, 45, 46, 47, + 48, 49, 50, 50, 50, 50, 50, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, + 54, 55, 55, 56, 56, 56, 56, 56, 57, 57, + 57, 57, 57, 58, 58, 59, 60, 61, 61, 62, + 62, 62, 62, 63, 64, 65, 66, 66, 67, 67, + 67, 67, 67, 68, 69, 70, 71, 72, 73, 74, + 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, + 78, 78, 79, 79, 80, 80, 81, 81, 81, 81, + 81, 81, 81, 82, 82 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 0, 2, 1, 1, 1, 3, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, + 3, 2, 0, 2, 2, 2, 2, 3, 4, 3, + 4, 3, 3, 3, 4, 4, 4, 5, 2, 2, + 1, 3, 2, 0, 2, 2, 2, 2, 4, 3, + 3, 2, 4, 0, 2, 3, 1, 3, 2, 0, + 2, 2, 2, 3, 2, 1, 3, 2, 0, 2, + 2, 2, 3, 3, 1, 3, 2, 2, 2, 0, + 2, 2, 4, 3, 3, 0, 2, 1, 1, 2, + 2, 2, 1, 1, 0, 2, 1, 3, 3, 3, + 2, 3, 3, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 2, 0, 1, 0, 0, 0, 8, 0, 0, 10, + 0, 0, 0, 0, 9, 93, 92, 3, 4, 22, + 14, 22, 15, 43, 53, 5, 59, 12, 79, 68, + 6, 74, 16, 79, 13, 17, 11, 87, 88, 0, + 0, 0, 38, 0, 0, 0, 103, 104, 0, 0, + 0, 96, 19, 21, 39, 42, 58, 64, 0, 76, + 7, 63, 73, 75, 18, 20, 0, 100, 55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, + 85, 0, 85, 85, 85, 26, 0, 0, 23, 0, + 25, 24, 0, 0, 0, 85, 85, 47, 44, 46, + 45, 0, 0, 0, 54, 41, 40, 60, 62, 57, + 61, 56, 81, 80, 0, 69, 71, 66, 70, 65, + 99, 101, 102, 98, 97, 77, 0, 0, 0, 94, + 94, 0, 94, 94, 0, 94, 0, 0, 0, 94, + 0, 78, 51, 94, 94, 0, 0, 89, 90, 91, + 72, 0, 83, 84, 0, 0, 0, 27, 86, 0, + 29, 0, 33, 31, 32, 0, 94, 0, 0, 49, + 50, 82, 95, 34, 35, 28, 30, 36, 0, 48, + 52, 37 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 1, 17, 18, 19, 20, 21, 22, 52, 88, + 23, 24, 105, 25, 54, 98, 55, 26, 109, 27, + 56, 28, 29, 117, 30, 58, 31, 32, 33, 34, + 89, 90, 57, 91, 131, 132, 106, 35, 155, 50, + 51 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -99 +static const short yypact[] = +{ + -99, 48, -99, 38, 46, 46, -99, 46, -29, -99, + 46, -17, -3, -11, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, -99, -99, -99, -99, -99, 38, + 12, 15, -99, 18, 51, 62, -99, -99, -11, -11, + 4, -24, 138, 138, 160, 121, 110, -4, 81, -4, + -99, -99, -99, -99, -99, -99, -19, -99, -99, -11, + -11, 70, 70, 73, 32, -11, 46, -11, 46, -11, + 46, -11, 46, 46, 46, -99, 36, 70, -99, 95, + -99, -99, 96, 46, 106, 46, 46, -99, -99, -99, + -99, 38, 38, 38, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, 112, -99, -99, -99, -99, -99, + -99, 117, -99, -99, -99, -99, -11, 33, 65, 131, + 1, 119, 131, 1, 136, 1, 153, 154, 155, 131, + 70, -99, -99, 131, 131, 156, 157, -99, -99, -99, + -99, 101, -99, -99, -11, 158, 159, -99, -99, 161, + -99, 162, -99, -99, -99, 163, 131, 164, 165, -99, + -99, -99, 99, -99, -99, -99, -99, -99, 166, -99, + -99, -99 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -99, -99, -99, 111, -99, -99, -99, -99, 178, -99, + -99, -99, -99, 91, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, 115, -99, -99, -99, -99, -99, + -99, 146, 168, 89, 27, 0, 126, -1, -98, -48, + -63 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -68 +static const short yytable[] = +{ + 66, 67, 36, 42, 39, 40, 71, 41, 123, 124, + 43, 44, 74, 75, 120, 154, 72, 46, 47, 69, + 70, 121, 122, 48, 140, 45, 127, 128, 112, 130, + 49, 133, 156, 135, 158, 159, 68, 161, 60, 69, + 70, 165, 69, 70, 61, 167, 168, 62, 2, 3, + 63, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 46, 47, 13, 14, 139, 152, 48, 126, 178, 15, + 16, 69, 70, 49, 37, 38, 129, 166, 151, 15, + 16, -67, 114, 64, -67, 5, 101, 7, 8, 102, + 10, 11, 12, 143, 65, 13, 103, 153, 46, 47, + 147, 148, 149, 69, 70, 125, 172, 134, 141, 136, + 137, 138, 15, 16, 5, 101, 7, 8, 102, 10, + 11, 12, 145, 146, 13, 103, 101, 7, 142, 102, + 10, 11, 12, 171, 144, 13, 103, 69, 70, 69, + 70, 15, 16, 100, 150, 154, 113, 108, 113, 116, + 73, 157, 15, 16, 74, 75, 70, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 104, 107, 160, 115, + 85, 110, 73, 118, 86, 87, 74, 75, 92, 93, + 94, 95, 111, 96, 119, 162, 163, 164, 169, 170, + 173, 174, 97, 175, 176, 177, 179, 180, 181, 53, + 99, 59 +}; + +static const unsigned char yycheck[] = +{ + 48, 49, 3, 32, 4, 5, 30, 7, 71, 72, + 10, 28, 16, 17, 33, 14, 40, 28, 29, 38, + 39, 69, 70, 34, 87, 28, 74, 75, 32, 77, + 41, 79, 130, 81, 132, 133, 32, 135, 39, 38, + 39, 139, 38, 39, 32, 143, 144, 32, 0, 1, + 32, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 28, 29, 14, 15, 28, 32, 34, 35, 166, 31, + 32, 38, 39, 41, 28, 29, 76, 140, 126, 31, + 32, 0, 1, 32, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 93, 32, 14, 15, 32, 28, 29, + 101, 102, 103, 38, 39, 32, 154, 80, 13, 82, + 83, 84, 31, 32, 4, 5, 6, 7, 8, 9, + 10, 11, 95, 96, 14, 15, 5, 6, 32, 8, + 9, 10, 11, 32, 28, 14, 15, 38, 39, 38, + 39, 31, 32, 54, 32, 14, 57, 56, 59, 58, + 12, 32, 31, 32, 16, 17, 39, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 55, 56, 32, 58, + 32, 56, 12, 58, 36, 37, 16, 17, 18, 19, + 20, 21, 56, 23, 58, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 21, + 54, 33 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 43, 0, 1, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 14, 15, 31, 32, 44, 45, 46, + 47, 48, 49, 52, 53, 55, 59, 61, 63, 64, + 66, 68, 69, 70, 71, 79, 79, 28, 29, 77, + 77, 77, 32, 77, 28, 28, 28, 29, 34, 41, + 81, 82, 50, 50, 56, 58, 62, 74, 67, 74, + 79, 32, 32, 32, 32, 32, 81, 81, 32, 38, + 39, 30, 40, 12, 16, 17, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 32, 36, 37, 51, 72, + 73, 75, 18, 19, 20, 21, 23, 32, 57, 73, + 75, 5, 8, 15, 45, 54, 78, 45, 55, 60, + 66, 78, 32, 75, 1, 45, 55, 65, 66, 78, + 33, 81, 81, 82, 82, 32, 35, 81, 81, 77, + 81, 76, 77, 81, 76, 81, 76, 76, 76, 28, + 82, 13, 32, 77, 28, 76, 76, 79, 79, 79, + 32, 81, 32, 32, 14, 80, 80, 32, 80, 80, + 32, 80, 32, 32, 32, 80, 82, 80, 80, 32, + 32, 32, 81, 32, 32, 32, 32, 32, 80, 32, + 32, 32 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (cinluded). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylineno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylineno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 8: + + { zconfprint("unexpected 'endmenu' statement"); ;} + break; + + case 9: + + { zconfprint("unexpected 'endif' statement"); ;} + break; + + case 10: + + { zconfprint("unexpected 'endchoice' statement"); ;} + break; + + case 11: + + { zconfprint("syntax error"); yyerrok; ;} + break; + + case 18: + + { + struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 19: + + { + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 20: + + { + struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 21: + + { + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 27: + + { + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 28: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 29: + + { + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 30: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 31: + + { + menu_set_type(S_INT); + printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 32: + + { + menu_set_type(S_HEX); + printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 33: + + { + menu_set_type(S_STRING); + printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 34: + + { + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 35: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 36: + + { + menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 37: + + { + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 38: + + { + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 39: + + { + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 40: + + { + if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 42: + + { + printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 48: + + { + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 49: + + { + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 50: + + { + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 51: + + { + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 52: + + { + menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 55: + + { + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep(yyvsp[-1].expr); + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 56: + + { + if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 58: + + { + printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 63: + + { + menu_add_entry(NULL); + menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 64: + + { + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 65: + + { + if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 67: + + { + printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 72: + + { zconfprint("invalid menu option"); yyerrok; ;} + break; + + case 73: + + { + yyval.string = yyvsp[-1].string; + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 74: + + { + zconf_nextfile(yyvsp[0].string); +;} + break; + + case 75: + + { + menu_add_entry(NULL); + menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 76: + + { + menu_end_entry(); +;} + break; + + case 77: + + { + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +;} + break; + + case 78: + + { + current_entry->sym->help = yyvsp[0].string; +;} + break; + + case 82: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 83: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 84: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 86: + + { + menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr); +;} + break; + + case 89: + + { yyval.token = T_ENDMENU; ;} + break; + + case 90: + + { yyval.token = T_ENDCHOICE; ;} + break; + + case 91: + + { yyval.token = T_ENDIF; ;} + break; + + case 94: + + { yyval.expr = NULL; ;} + break; + + case 95: + + { yyval.expr = yyvsp[0].expr; ;} + break; + + case 96: + + { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;} + break; + + case 97: + + { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} + break; + + case 98: + + { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} + break; + + case 99: + + { yyval.expr = yyvsp[-1].expr; ;} + break; + + case 100: + + { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;} + break; + + case 101: + + { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;} + break; + + case 102: + + { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;} + break; + + case 103: + + { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;} + break; + + case 104: + + { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;} + break; + + + } + +/* Line 999 of yacc.c. */ + + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("syntax error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyss < yyssp) + { + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + YYPOPSTACK; + } + YYABORT; + } + + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + yyvsp--; + yystate = *--yyssp; + + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + + + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup("MODULES", 0); + rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL); + + //zconfdebug = 1; + zconfparse(); + if (zconfnerrs) + exit(1); + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) + printf("\n"); + else + sym->flags |= SYMBOL_CHECK_DONE; + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + } + return ""; +} + +static bool zconf_endtoken(int token, int starttoken, int endtoken) +{ + if (token != endtoken) { + zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfprint("location of the '%s'", zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" + + diff --git a/openwrt/package/config/zconf.tab.h_shipped b/openwrt/package/config/zconf.tab.h_shipped new file mode 100644 index 0000000000..3b191ef599 --- /dev/null +++ b/openwrt/package/config/zconf.tab.h_shipped @@ -0,0 +1,125 @@ +/* A Bison parser, made from zconf.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef BISON_ZCONF_TAB_H +# define BISON_ZCONF_TAB_H + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_HELP = 266, + T_HELPTEXT = 267, + T_IF = 268, + T_ENDIF = 269, + T_DEPENDS = 270, + T_REQUIRES = 271, + T_OPTIONAL = 272, + T_PROMPT = 273, + T_DEFAULT = 274, + T_TRISTATE = 275, + T_BOOLEAN = 276, + T_INT = 277, + T_HEX = 278, + T_WORD = 279, + T_STRING = 280, + T_UNEQUAL = 281, + T_EOF = 282, + T_EOL = 283, + T_CLOSE_PAREN = 284, + T_OPEN_PAREN = 285, + T_ON = 286, + T_OR = 287, + T_AND = 288, + T_EQUAL = 289, + T_NOT = 290 + }; +#endif +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_HELP 266 +#define T_HELPTEXT 267 +#define T_IF 268 +#define T_ENDIF 269 +#define T_DEPENDS 270 +#define T_REQUIRES 271 +#define T_OPTIONAL 272 +#define T_PROMPT 273 +#define T_DEFAULT 274 +#define T_TRISTATE 275 +#define T_BOOLEAN 276 +#define T_INT 277 +#define T_HEX 278 +#define T_WORD 279 +#define T_STRING 280 +#define T_UNEQUAL 281 +#define T_EOF 282 +#define T_EOL 283 +#define T_CLOSE_PAREN 284 +#define T_OPEN_PAREN 285 +#define T_ON 286 +#define T_OR 287 +#define T_AND 288 +#define T_EQUAL 289 +#define T_NOT 290 + + + + +#ifndef YYSTYPE +#line 33 "zconf.y" +typedef union { + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} yystype; +/* Line 1281 of /usr/share/bison/yacc.c. */ +#line 118 "zconf.tab.h" +# define YYSTYPE yystype +#endif + +extern YYSTYPE zconflval; + + +#endif /* not BISON_ZCONF_TAB_H */ + diff --git a/openwrt/package/config/zconf.y b/openwrt/package/config/zconf.y new file mode 100644 index 0000000000..f354c89e6c --- /dev/null +++ b/openwrt/package/config/zconf.y @@ -0,0 +1,687 @@ +%{ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(int token, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +#define YYERROR_VERBOSE +%} +%expect 40 + +%union +{ + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} + +%token T_MAINMENU +%token T_MENU +%token T_ENDMENU +%token T_SOURCE +%token T_CHOICE +%token T_ENDCHOICE +%token T_COMMENT +%token T_CONFIG +%token T_MENUCONFIG +%token T_HELP +%token T_HELPTEXT +%token T_IF +%token T_ENDIF +%token T_DEPENDS +%token T_REQUIRES +%token T_OPTIONAL +%token T_PROMPT +%token T_DEFAULT +%token T_TRISTATE +%token T_DEF_TRISTATE +%token T_BOOLEAN +%token T_DEF_BOOLEAN +%token T_STRING +%token T_INT +%token T_HEX +%token T_WORD +%token T_WORD_QUOTE +%token T_UNEQUAL +%token T_EOF +%token T_EOL +%token T_CLOSE_PAREN +%token T_OPEN_PAREN +%token T_ON +%token T_SELECT +%token T_RANGE + +%left T_OR +%left T_AND +%left T_EQUAL T_UNEQUAL +%nonassoc T_NOT + +%type prompt +%type source +%type symbol +%type expr +%type if_expr +%type end + +%{ +#define LKC_DIRECT_LINK +#include "lkc.h" +%} +%% +input: /* empty */ + | input block +; + +block: common_block + | choice_stmt + | menu_stmt + | T_MAINMENU prompt nl_or_eof + | T_ENDMENU { zconfprint("unexpected 'endmenu' statement"); } + | T_ENDIF { zconfprint("unexpected 'endif' statement"); } + | T_ENDCHOICE { zconfprint("unexpected 'endchoice' statement"); } + | error nl_or_eof { zconfprint("syntax error"); yyerrok; } +; + +common_block: + if_stmt + | comment_stmt + | config_stmt + | menuconfig_stmt + | source_stmt + | nl_or_eof +; + + +/* config/menuconfig entry */ + +config_entry_start: T_CONFIG T_WORD T_EOL +{ + struct symbol *sym = sym_lookup($2, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +config_stmt: config_entry_start config_option_list +{ + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL +{ + struct symbol *sym = sym_lookup($2, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +menuconfig_stmt: menuconfig_entry_start config_option_list +{ + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +config_option_list: + /* empty */ + | config_option_list config_option + | config_option_list depends + | config_option_list help + | config_option_list T_EOL +; + +config_option: T_TRISTATE prompt_stmt_opt T_EOL +{ + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEF_TRISTATE expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_BOOLEAN prompt_stmt_opt T_EOL +{ + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEF_BOOLEAN expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_INT prompt_stmt_opt T_EOL +{ + menu_set_type(S_INT); + printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_HEX prompt_stmt_opt T_EOL +{ + menu_set_type(S_HEX); + printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_STRING prompt_stmt_opt T_EOL +{ + menu_set_type(S_STRING); + printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_PROMPT prompt if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEFAULT expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_SELECT T_WORD if_expr T_EOL +{ + menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_RANGE symbol symbol if_expr T_EOL +{ + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +}; + +/* choice entry */ + +choice: T_CHOICE T_EOL +{ + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +}; + +choice_entry: choice choice_option_list +{ + menu_end_entry(); + menu_add_menu(); +}; + +choice_end: end +{ + if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +}; + +choice_stmt: + choice_entry choice_block choice_end + | choice_entry choice_block +{ + printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +choice_option_list: + /* empty */ + | choice_option_list choice_option + | choice_option_list depends + | choice_option_list help + | choice_option_list T_EOL +; + +choice_option: T_PROMPT prompt if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_TRISTATE prompt_stmt_opt T_EOL +{ + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_BOOLEAN prompt_stmt_opt T_EOL +{ + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_OPTIONAL T_EOL +{ + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_DEFAULT T_WORD if_expr T_EOL +{ + menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +}; + +choice_block: + /* empty */ + | choice_block common_block +; + +/* if entry */ + +if: T_IF expr T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep($2); + menu_end_entry(); + menu_add_menu(); +}; + +if_end: end +{ + if (zconf_endtoken($1, T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +}; + +if_stmt: + if if_block if_end + | if if_block +{ + printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +if_block: + /* empty */ + | if_block common_block + | if_block menu_stmt + | if_block choice_stmt +; + +/* menu entry */ + +menu: T_MENU prompt T_EOL +{ + menu_add_entry(NULL); + menu_add_prop(P_MENU, $2, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +}; + +menu_entry: menu depends_list +{ + menu_end_entry(); + menu_add_menu(); +}; + +menu_end: end +{ + if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +}; + +menu_stmt: + menu_entry menu_block menu_end + | menu_entry menu_block +{ + printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +menu_block: + /* empty */ + | menu_block common_block + | menu_block menu_stmt + | menu_block choice_stmt + | menu_block error T_EOL { zconfprint("invalid menu option"); yyerrok; } +; + +source: T_SOURCE prompt T_EOL +{ + $$ = $2; + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +source_stmt: source +{ + zconf_nextfile($1); +}; + +/* comment entry */ + +comment: T_COMMENT prompt T_EOL +{ + menu_add_entry(NULL); + menu_add_prop(P_COMMENT, $2, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +}; + +comment_stmt: comment depends_list +{ + menu_end_entry(); +}; + +/* help option */ + +help_start: T_HELP T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +}; + +help: help_start T_HELPTEXT +{ + current_entry->sym->help = $2; +}; + +/* depends option */ + +depends_list: /* empty */ + | depends_list depends + | depends_list T_EOL +; + +depends: T_DEPENDS T_ON expr T_EOL +{ + menu_add_dep($3); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +} + | T_DEPENDS expr T_EOL +{ + menu_add_dep($2); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +} + | T_REQUIRES expr T_EOL +{ + menu_add_dep($2); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +}; + +/* prompt statement */ + +prompt_stmt_opt: + /* empty */ + | prompt if_expr +{ + menu_add_prop(P_PROMPT, $1, NULL, $2); +}; + +prompt: T_WORD + | T_WORD_QUOTE +; + +end: T_ENDMENU nl_or_eof { $$ = T_ENDMENU; } + | T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; } + | T_ENDIF nl_or_eof { $$ = T_ENDIF; } +; + +nl_or_eof: + T_EOL | T_EOF; + +if_expr: /* empty */ { $$ = NULL; } + | T_IF expr { $$ = $2; } +; + +expr: symbol { $$ = expr_alloc_symbol($1); } + | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); } + | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); } + | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; } + | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); } + | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); } + | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } +; + +symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } + | T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); } +; + +%% + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup("MODULES", 0); + rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL); + + //zconfdebug = 1; + zconfparse(); + if (zconfnerrs) + exit(1); + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) + printf("\n"); + else + sym->flags |= SYMBOL_CHECK_DONE; + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + } + return ""; +} + +static bool zconf_endtoken(int token, int starttoken, int endtoken) +{ + if (token != endtoken) { + zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfprint("location of the '%s'", zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" diff --git a/openwrt/package/dnsmasq/Config.in b/openwrt/package/dnsmasq/Config.in new file mode 100644 index 0000000000..05e40f34eb --- /dev/null +++ b/openwrt/package/dnsmasq/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_DNSMASQ + bool "dnsmasq" + default n + help + A lightweight DNS and DHCP server. It is intended to provide + coupled DNS and DHCP service to a LAN. + + http://www.thekelleys.org.uk/dnsmasq/ diff --git a/openwrt/package/dnsmasq/Makefile.in b/openwrt/package/dnsmasq/Makefile.in new file mode 100644 index 0000000000..36548bd2b1 --- /dev/null +++ b/openwrt/package/dnsmasq/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_DNSMASQ)),y) +TARGETS+=dnsmasq +endif diff --git a/openwrt/package/dnsmasq/dnsmasq.mk b/openwrt/package/dnsmasq/dnsmasq.mk new file mode 100644 index 0000000000..b1848c6aa8 --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq.mk @@ -0,0 +1,50 @@ +############################################################# +# +# dnsmasq +# +############################################################# + +DNSMASQ_SITE=http://thekelleys.org.uk/dnsmasq +ifeq ($(filter $(TARGETS),dnsmasq1),) +DNSMASQ_SOURCE=dnsmasq-2.15.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-2.15 +DNSMASQ_VER=dnsmasq2 +else +DNSMASQ_SOURCE=dnsmasq-1.18.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-1.18 +DNSMASQ_VER=dnsmasq1 +endif +DNSMASQ_BINARY=dnsmasq +DNSMASQ_TARGET_BINARY=usr/sbin/dnsmasq + +$(DL_DIR)/$(DNSMASQ_SOURCE): + $(WGET) -P $(DL_DIR) $(DNSMASQ_SITE)/$(DNSMASQ_SOURCE) + +$(DNSMASQ_DIR)/.source: $(DL_DIR)/$(DNSMASQ_SOURCE) + zcat $(DL_DIR)/$(DNSMASQ_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(DNSMASQ_DIR) package/dnsmasq/ \ + $(DNSMASQ_VER)-\*.patch + touch $(DNSMASQ_DIR)/.source + +$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source + $(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \ + BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR) + +$(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY): $(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY) + $(MAKE) BINDIR=/usr/sbin MANDIR=/usr/man \ + DESTDIR=$(TARGET_DIR) -C $(DNSMASQ_DIR) install + $(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + rm -rf $(TARGET_DIR)/usr/man + +dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE) + +dnsmasq-clean: + #$(MAKE) prefix=$(TARGET_DIR)/usr -C $(DNSMASQ_DIR) uninstall + -$(MAKE) -C $(DNSMASQ_DIR) clean + +dnsmasq-dirclean: + rm -rf $(DNSMASQ_DIR) diff --git a/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch b/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch new file mode 100644 index 0000000000..c676a1a398 --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch @@ -0,0 +1,25 @@ +--- dnsmasq-1.18/config.h.dist 2004-03-01 22:25:12.000000000 -0600 ++++ dnsmasq-1.18/config.h 2004-03-01 22:26:50.000000000 -0600 +@@ -126,7 +126,9 @@ + + /* Must preceed __linux__ since uClinux defines __linux__ too. */ + #if defined(__uClinux__) || defined(__UCLIBC__) ++#ifndef __UCLIBC_HAS_IPV6__ + #undef HAVE_LINUX_IPV6_PROC ++#endif + #define HAVE_GETOPT_LONG + #undef HAVE_ARC4RANDOM + #define HAVE_RANDOM +diff -x CVS -urN dnsmasq-1.18/option.c dnsmasq.old/option.c +--- dnsmasq-1.18/option.c 2003-11-05 08:22:18.000000000 -0600 ++++ dnsmasq.old/option.c 2004-01-05 23:40:11.000000000 -0600 +@@ -578,8 +578,8 @@ + #ifdef HAVE_IPV6 + else if (tmp->source_addr.sa.sa_family == AF_INET6) + tmp->source_addr.in6.sin6_port = htons(*query_port); +- } + #endif ++ } + } + + if (*if_addrs) diff --git a/openwrt/package/dnsmasq/dnsmasq2-100-config.patch b/openwrt/package/dnsmasq/dnsmasq2-100-config.patch new file mode 100644 index 0000000000..270c22740e --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq2-100-config.patch @@ -0,0 +1,49 @@ +diff -ur dnsmasq-2.15.orig/src/config.h dnsmasq-2.15/src/config.h +--- dnsmasq-2.15.orig/src/config.h 2004-10-08 11:41:34.757371880 -0400 ++++ dnsmasq-2.15/src/config.h 2004-10-08 11:43:49.074952504 -0400 +@@ -78,6 +78,11 @@ + /* We assume that systems which don't have IPv6 + headers don't have ntop and pton either */ + ++#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_IPV6__) ++# undef NO_IPV6 ++# define NO_IPV6 ++#endif ++ + #if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6) + # define HAVE_IPV6 + # define ADDRSTRLEN INET6_ADDRSTRLEN +@@ -194,7 +199,7 @@ + /* platform dependent options. */ + + /* Must preceed __linux__ since uClinux defines __linux__ too. */ +-#if defined(__uClinux__) || defined(__UCLIBC__) ++#if defined(__uClinux__) + #undef HAVE_LINUX_IPV6_PROC + #define HAVE_GETOPT_LONG + #undef HAVE_ARC4RANDOM +@@ -208,6 +213,24 @@ + # define NO_FORK + #endif + ++#elif defined(__linux__) && defined(__UCLIBC__) ++# define HAVE_LINUX_IPV6_PROC ++# if defined(__UCLIBC_HAS_GNU_GETOPT__) || \ ++ ((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21)) ++# define HAVE_GETOPT_LONG ++# else ++# undef HAVE_GETOPT_LONG ++# endif ++#undef HAVE_ARC4RANDOM ++#define HAVE_RANDOM ++#define HAVE_DEV_URANDOM ++#define HAVE_DEV_RANDOM ++#undef HAVE_SOCKADDR_SA_LEN ++#undef HAVE_PSELECT ++#if !defined(__ARCH_HAS_MMU__) ++# define NO_FORK ++#endif ++ + /* libc5 - must precede __linux__ too */ + /* Note to build a libc5 binary on a modern Debian system: + install the packages altgcc libc5 and libc5-altdev diff --git a/openwrt/package/dropbear_sshd/Config.in b/openwrt/package/dropbear_sshd/Config.in new file mode 100644 index 0000000000..07c5218840 --- /dev/null +++ b/openwrt/package/dropbear_sshd/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_DROPBEAR_SSHD + bool "dropbear_sshd" + default n + help + A small SSH 2 server designed for small memory environments. + + http://matt.ucc.asn.au/dropbear/ diff --git a/openwrt/package/dropbear_sshd/Makefile.in b/openwrt/package/dropbear_sshd/Makefile.in new file mode 100644 index 0000000000..87247fcee5 --- /dev/null +++ b/openwrt/package/dropbear_sshd/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_DROPBEAR_SSHD)),y) +TARGETS+=dropbear_sshd +endif diff --git a/openwrt/package/dropbear_sshd/dropbear-init.patch b/openwrt/package/dropbear_sshd/dropbear-init.patch new file mode 100644 index 0000000000..d6bf1740a0 --- /dev/null +++ b/openwrt/package/dropbear_sshd/dropbear-init.patch @@ -0,0 +1,59 @@ +--- dropbear-0.42/S50dropbear ++++ dropbear-0.42/S50dropbear +@@ -0,0 +1,56 @@ ++#!/bin/sh ++# ++# Starts dropbear sshd. ++# ++ ++# Make sure the dropbearkey progam exists ++[ -f /usr/bin/dropbearkey ] || exit 0 ++ ++# Check for the Dropbear RSA key ++if [ ! -f /etc/dropbear/dropbear_rsa_host_key ] ; then ++ echo Generating RSA Key... ++ mkdir -p /etc/dropbear ++ /usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key ++fi ++ ++# Check for the Dropbear DSS key ++if [ ! -f /etc/dropbear/dropbear_dss_host_key ] ; then ++ echo Generating DSS Key... ++ mkdir -p /etc/dropbear ++ /usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key ++fi ++ ++umask 077 ++ ++start() { ++ echo -n "Starting dropbear sshd: " ++ start-stop-daemon --start --quiet --pidfile /var/run/dropbear.pid --exec /usr/sbin/dropbear ++ echo "OK" ++} ++stop() { ++ echo -n "Stopping sshd: " ++ start-stop-daemon --stop --quiet --pidfile /var/run/dropbear.pid ++ echo "OK" ++} ++restart() { ++ stop ++ start ++} ++ ++case "$1" in ++ start) ++ start ++ ;; ++ stop) ++ stop ++ ;; ++ restart|reload) ++ restart ++ ;; ++ *) ++ echo $"Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? ++ diff --git a/openwrt/package/dropbear_sshd/dropbear_sshd.mk b/openwrt/package/dropbear_sshd/dropbear_sshd.mk new file mode 100644 index 0000000000..26c9b17830 --- /dev/null +++ b/openwrt/package/dropbear_sshd/dropbear_sshd.mk @@ -0,0 +1,79 @@ +############################################################# +# +# dropbear_sshd +# +############################################################# +DROPBEAR_SSHD_SOURCE:=dropbear-0.44.tar.bz2 +DROPBEAR_SSHD_SITE:=http://matt.ucc.asn.au/dropbear/releases/ +DROPBEAR_SSHD_DIR:=$(BUILD_DIR)/dropbear-0.44 +DROPBEAR_SSHD_CAT:=bzcat +DROPBEAR_SSHD_BINARY:=dropbearmulti +DROPBEAR_SSHD_TARGET_BINARY:=usr/sbin/dropbear + + +$(DL_DIR)/$(DROPBEAR_SSHD_SOURCE): + $(WGET) -P $(DL_DIR) $(DROPBEAR_SSHD_SITE)/$(DROPBEAR_SSHD_SOURCE) + +dropbear_sshd-source: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + +$(DROPBEAR_SSHD_DIR)/.unpacked: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + $(DROPBEAR_SSHD_CAT) $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(DROPBEAR_SSHD_DIR) package/dropbear_sshd/ dropbear-\*.patch + $(SED) 's,^/\* #define DROPBEAR_MULTI.*,#define DROPBEAR_MULTI,g' $(DROPBEAR_SSHD_DIR)/options.h + touch $(DROPBEAR_SSHD_DIR)/.unpacked + +$(DROPBEAR_SSHD_DIR)/.configured: $(DROPBEAR_SSHD_DIR)/.unpacked + (cd $(DROPBEAR_SSHD_DIR); rm -rf config.cache; \ + autoconf; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-shared \ + ); + touch $(DROPBEAR_SSHD_DIR)/.configured + +$(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY): $(DROPBEAR_SSHD_DIR)/.configured + $(MAKE) $(TARGET_CONFIGURE_OPTS) LD=$(TARGET_CC) \ + PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" \ + MULTI=1 SCPPROGRESS=1 -C $(DROPBEAR_SSHD_DIR) + +$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY): $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) + #$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + # LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + install -d -m 755 $(TARGET_DIR)/usr/sbin + install -d -m 755 $(TARGET_DIR)/usr/bin + install -m 755 $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) \ + $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/scp + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/ssh + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearkey + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearconvert + cp $(DROPBEAR_SSHD_DIR)/S50dropbear $(TARGET_DIR)/etc/init.d/ + chmod a+x $(TARGET_DIR)/etc/init.d/S50dropbear + +dropbear_sshd: uclibc zlib $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + +dropbear_sshd-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) uninstall + -$(MAKE) -C $(DROPBEAR_SSHD_DIR) clean + +dropbear_sshd-dirclean: + rm -rf $(DROPBEAR_SSHD_DIR) + diff --git a/openwrt/package/iptables/Config.in b/openwrt/package/iptables/Config.in new file mode 100644 index 0000000000..f1e5ef631d --- /dev/null +++ b/openwrt/package/iptables/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_IPTABLES + bool "iptables" + default n + help + Linux kernel (2.4+) firewall, NAT, and packet mangling tools. + + http://www.iptables.org/ diff --git a/openwrt/package/iptables/Makefile.in b/openwrt/package/iptables/Makefile.in new file mode 100644 index 0000000000..5be894b9a6 --- /dev/null +++ b/openwrt/package/iptables/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_IPTABLES)),y) +TARGETS+=iptables +endif diff --git a/openwrt/package/iptables/iptables.mk b/openwrt/package/iptables/iptables.mk new file mode 100644 index 0000000000..f053f1e33d --- /dev/null +++ b/openwrt/package/iptables/iptables.mk @@ -0,0 +1,51 @@ +############################################################# +# +# iptables +# +############################################################# +IPTABLES_VER:=1.2.11 +IPTABLES_SOURCE_URL:=http://www.netfilter.org/files +IPTABLES_SOURCE:=iptables-$(IPTABLES_VER).tar.bz2 +IPTABLES_BUILD_DIR:=$(BUILD_DIR)/iptables-$(IPTABLES_VER) + +$(DL_DIR)/$(IPTABLES_SOURCE): + $(WGET) -P $(DL_DIR) $(IPTABLES_SOURCE_URL)/$(IPTABLES_SOURCE) + +$(IPTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(IPTABLES_SOURCE) + bzcat $(DL_DIR)/$(IPTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(IPTABLES_BUILD_DIR)/.unpacked + +$(IPTABLES_BUILD_DIR)/.configured: $(IPTABLES_BUILD_DIR)/.unpacked + # Allow patches. Needed for openwrt for instance. + toolchain/patch-kernel.sh $(IPTABLES_BUILD_DIR) package/iptables/ iptables-\*.patch + # + $(SED) "s;\[ -f /usr/include/netinet/ip6.h \];grep -q '__UCLIBC_HAS_IPV6__ 1' \ + $(BUILD_DIR)/uClibc/include/bits/uClibc_config.h;" $(IPTABLES_BUILD_DIR)/Makefile + touch $(IPTABLES_BUILD_DIR)/.configured + +$(IPTABLES_BUILD_DIR)/iptables: $(IPTABLES_BUILD_DIR)/.configured + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" + +$(TARGET_DIR)/usr/sbin/iptables: $(IPTABLES_BUILD_DIR)/iptables + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" \ + DESTDIR=$(TARGET_DIR) install + $(STRIP) $(TARGET_DIR)/usr/sbin/iptables* + $(STRIP) $(TARGET_DIR)/usr/lib/iptables/*.so + rm -rf $(TARGET_DIR)/usr/man + +iptables: kernel-headers $(TARGET_DIR)/usr/sbin/iptables + +iptables-source: $(DL_DIR)/$(IPTABLES_SOURCE) + +iptables-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPTABLES_BUILD_DIR) uninstall + -$(MAKE) -C $(IPTABLES_BUILD_DIR) clean + +iptables-dirclean: + rm -rf $(IPTABLES_BUILD_DIR) diff --git a/openwrt/package/linux/Config.in b/openwrt/package/linux/Config.in new file mode 100644 index 0000000000..4588e48efb --- /dev/null +++ b/openwrt/package/linux/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_LINUX + bool "linux" + default n + help + The Linux kernel. + + http://www.kernel.org/ diff --git a/openwrt/package/linux/Makefile.in b/openwrt/package/linux/Makefile.in new file mode 100644 index 0000000000..3b62d24c1d --- /dev/null +++ b/openwrt/package/linux/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_LINUX)),y) +TARGETS+=linux +endif diff --git a/openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 b/openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3e68dba7a3ead1614f99f4e8ca9d731acae24c44 GIT binary patch literal 428187 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
8=9-D&{6mWgI{(j(l3dcO%dqNV=HD$39E8 zo9%~PDGQ7CTZwuR+fq}`){cMEBMb+C>dF<65IEHo6XV5KvU93;>Oyg_j)f_>`u&H{ zi*H><-Ld!^{$cYicNtkrtVviJ5MqpqHD2^E`a8Lu|#6*Kg{C>+v%GP6@LTGDMSU!8C&$WwVe|=JGG}s94h|cY@PDf)aYatr&)vqn9 zWGzV8EcBQO`^m2MmX$?XVUxxT=OXhp>YZZNEsKL2tMaW2fE1(TVSY)F*%qHRX$<_n zJ{W|?=Y z;UzP8D46i+%M#HGgoaZ{a-jg2ZC})~kEbx2$h&u`Y(vtKb1fPIN7>0Vu{%JHCBxI9 zBej!+?e2@i-?jpW%-yLfVI*6o3QGn74;r!|NqLSg0v~pUUtfMdEBy~H+FxF?op`r$ zeV!X;9+@EcOD?MiUHhR=2ARq1whF0^SCY$vWOC}T3kGWb{R2&|SJ*d|FGLYKIPLXU z61)ND)jG#+M8D&^&{90B1lM}bn-iW@#}#CGujx6AWz?|w7&Spjk$)IrBqN29M3Q8_ zeY8a1#?qloq0?7+3ZAH;-nnKx%IR}S0}OQGDFihRsAOYODtS8A?&c-9Dfm{3ap6p*VlXty*tw6jL^{uB!fv7A&0gFOKl?#nMd`$na)u@b`G9(AJ>l1 zx^vhlRPfUYnp#8GPdl_6p|ui}e4)921Lf5~+)iloa&mb;#XwKML)rrNzW5d+Cb`>& zrnkXC%<540oH7b(kOa{_g3P$h6uCF2o zoPM`g*k5kDZJzLKx@k3R90pbs2-|&jbh+P5v%hh|KR}9`0X+yD%63)UpqF$DY)sB2 z@@K3s%04`WJ3vFwVmqsWrUG){a|1oD*{gnH$Or2VxQ$ywMpuo_=dU~{{=tVYS`e%(9YgdlDj zIVDCk<4E+brx)4O{_cit9&!t`eR*l(QZxxOvFSR=%R(C>ta7I~ge;3oEJ_XDMHa7W z&JsAlo&Wf%KFAMOo%M3?mn$Qt6&*jX3J7`5krH|kIPxL#74#4I-b11y$^%m^^3kDL zR#8*2xKnFhSa*^G+E;b7(;Y1<$K}tlexSDxS}Z4+zG#=>B(P5|Ecjol8RGzBH4G`H<#|^ZD*}bQB+wv2Ju}ob2 zf+xP!0(ez5gMQ&>*RiL=i-56RHj#KqLji)M$<{EFeQddS+MWHPzWeLT^8zynHfev^ zj2+>m&xE|(R33*Mzg0!s%91R9nmcqSoVg3U@Kx7-h0SD)#Sb!Hj2{!KIqH|q<-|9y zjz0zrE57Az)lx}(FmysHAJg=ug!0KOnL}i}wu39_AcnbcU|$A8Zsgz#`Q38juMzGT zTn0_T$d5j5Vse#AmC8zXWi>$Si%vJ>y5bv(2fD@jY)Fqa=(`tYMn^|`&zHJ9c`;tj zzf9jL%7}c7hv$t1?qI#qVOURn0z-KSjD=GaJN z0u9BfB8Nz2>!gej#bzv_=&2?G`AK{9%8k+)Xrx&1VvujT(fNc8 z{m)Rs!Qc@Jez=K`?w9TuohdXA7qP|RmUFe4(xa@CwkJI_k#NF&Frx^R$oi>AG~9|o z#{Q)WrEv1ZBua8hqU1^fE96X4(j-WTT8aX< zA~h|NhHN6w>YsXV(gN?j+#yGZrmLYM-z?B!U?iYWLw$ry=oylppmAgQ@fX-L6RmH6x z$vH@E&ijJMU-h>)JD*+6s*3gxLK7A05G%#BX!U~E*mI9K4~s-q}IK!Qdf zDVhYGW2I6X``(?I)i-OWXjMh)$g5LiS+8Xw?{uX%ReWd$NcJI%Q&`sU6lrWEsz+z)_jD7besG} z)8wU5c%lQcxy0)V$3U|nvA(O4W8cBBE&z&DL&*NMVXp6T3s5J7N#DWx_$_F*6W=LU z!$<=#K2OR4>Bs;@$%q;zuwG-wMQJq|9Tj!8Bz4ur#UkJ$yOViiRS`>7S)(noFeqpd zNg$d(B~eWg3^+EjFl@ zTj5B_EX`Y5x2vWus~wF~6tgG&ZggC?NKo6Pm1<00iw`gRm!U&5)D|Jf5uswW4|F~&Kul1rXcmTIVzEFb|VDnqjp zr>R6%CS|3eFe_XF7ST&lTc|F@$x3IKvy)3TG%ehS1|l+o*&SR7_3YbHrs z%B9amV3mbNCPL*wJ|jK%q%Od{=F5?DGbtW$za~R>P$kb$QGZ7or_&^e0LtkzL)$X_ zbV}<^Q4&c4ewPC|#-)|VWLDMH=XHoi4)7%vAtU9?SV|#7Ui^jOOV`rGkTq2`C;v7A z!`IO(!*n+%8b%uyiO8^+f3yeU5Nb$ZNLq(e{-enE5-&Z9yTKt4rLh|DAo}9eUtLW{ z32gO$a|@&`k^vwrggrSgd44%>k@dADd1po} zq|Hy8+Sa7h?>?Nnp(~f-aaA*LtV$~>q_+}UDyS>gil6VAO=QE0IPP-i$#u$p;+5`q z&lE`Ic}E9+qwRhW35QoAY(%ksm?%)DWL?v4$R|GVr|`KxL+bS*)TchHrSaE`Xejp~ z4@ElPP-T$4-PzhQLvA~W1QZoS4+J?QbvF?IYLdBjTys5>f}{xZiRqb4^De%I`~&>_ z#4x0OKSwk3soFNe-op3cyj-`gR;m0m7?^2GGd-^pNQAkb(x)($O-L>5m4?3e5!+No zkHfy}`S!GiC$p1G?7bl{6a9kaYyJsneeELJawckE(dU`5)>iAuy<~UqosWFkI}hH8 z`V4p|P1qD~3W%_qXhB&I#1kXdEEWzi9?R$K|A{fC;tj&i{4_Oi;$jet1c}Lc!mRC;Y-U_MEkjizVhac}bG_mbIZz4#hb!7A{?JMp zQGeqg9^LP<5PH1O9;f5IZ(kQ4CCfbX}s}s?L(XIM!Rbpud>awbnFK@iV|$sU-F`z%-bI8ig?#lz>>wjYCj$trf(mMe|5Q}Y)%H$z zRaeFRW-DE6Y|n!rZ0!P5Jct9aEX=YlvMl-!=s)w`B-Dt}!>bLbYNi|Bf z?d@56pUH&=zEXI#xhbz!t(?C{I4$dQi82X9fNLQyHnV6JVcwBOodEU771oU^8)pvw z(_1TON@pM}Wlz}6SKl?UFlLOd!mkV6o6`*V?Vc9`NHx=eQY_#61muL(FRI~K#dlcy z=Z{vL?cVY8j*94L`{tikY>PID%IKy&q?2WVAOg7U}f zPDk^X>Y`DZ0|3g#%>iAg7cmU1u%4 zPBC$eoayl!++?^1`1`|m-0}0borpKV(XLl{u5F(ZELj=VbF`R#4CDE`6|Sol&ESS1 z6OrmVTQ;xc-}D2X`Hwyr^RTM-6V?1^4GLS069jKh11ktE~j@4?*M0#WN-fnZ3)>xUQ+ z7|4D2QH5R1TXybHMzvgm$0dThG9SL8euIANI5~mRyZ~MSn8eEINV>kbbP@>;LH~mIm3!l3c{%7* zPn*obe=JDqsGHW=CR5nMCLm#L(AN_sYABc_o_2Q-0)5ci?>>_%V1KoBI(2%F_FH&2 zT%a?eckb;r2rT;pPY_SJ23JByoSM_tpv&5&XPXhoFy!Uku>527qe9gR|g{W6y8jm1gLIIgD_6WPAboq2-%gTg3M$t#Q-3ylq8ELe7LD}Y}rzc)yt zVNc|OXgJ?vl-JkAIk&#sdrf^sY>kGUphD8%rkfN>+3^n+IW zBZb5VePIAKz?O=KI14=vehGg0EH4u(N2gO!MC8U9PLJ%x0 z`zB5&5|(s08r*P=W<;|gMdnos#cL@^`1;k%ya0~AaQsWjgG#(miREAyg}nJA^~4^+ zV@z+PQ-$3iA>iU+mWZ@wx`eR$BJ$N~`f5y%{VaRbqSuY*CzmXOuP}z8B1w%R!c+hu znVhJm6g4!8@VIzx+l&y5MT=<9>TaUB?~#^y{A(sPxN#PvlP}#)(L) zeci?AZe+D4_T$~+9PJw3SSZ+NAcZ~fc+`2j+y0)rp5#ehQiBGXYqIz^&OPwaC9`)1 zIx!A4_QtMb$yyz(X}1qAQQ?jk3f#9aG<`^2jegDU^o>f?aaa%V8ob+`fnHT9W(UI|sSgs6Tozw~DZ(M+B3J=NGY*JaFo-|_JIBs3m@MLl z;pO8~#Fp(;Gcp4h6iIRFKMUN!h`7snj{?cuaQ7F~JczB2EuFOpDH)eXcC@~thgg!4 zQm|o8AHW+S;NL@^993cq2hrlVeA4_95kbd6q3B>a1v9hT{AYfQ#1Ya3wf@S(z#mt}MxBKuJ8w61oPG4Pt9_eL%v%q59 zgfVL(e9YwW`F&hg^6rwP42&Y~D!OS6yuPQ%xxf*OBrp6v$J_|Odavy7VDgDXP7ooj z#ll+&_dG<(lf{F_;xg#2BJleTLR5ijssio>Q6;POVSxGe6czXdcs*Nn93Q%UCy8C3 zaPS$x2x9{h@?e-qg&wVr<5C`fUHY<1i#eyT3A|OOH^DDFDmqM-yU2_(HlLc64lAdHIyNx4d!4@Vi{_RVu8k%7M!# z4YL-NiEi($MA6DeC;TJSTcH5Tdl$EhF&_vPPOaJb6H8)n%%LAD=s2tz+uJYr^vKRK z?AuIuGpk*d$y5%*|HtFKjw|qipPePNX7C2o{Hr##g5dM(0btrNFIOXBU{jpK5523$ zQFc{Q@_OC!DL((l^Y*xov^+(2!aOrr702GT3_M1BXtzphG*aqsp@(NDUWU4$&6 z9F()jPhv4(`^t-tE@|MQ^YCP3M4~dTKo)fzA(Lc^UbUn1s@Ld}g##6TX!TLiA!oDZ z;&eA9c%u0shqRJbRDK4^6mj+aTcGOb&wmOgu;k;O70CL3#Uv^^Q1&A+PDyj4eD`6v z<80`$@#SG73Y3Gv!dhaE)r>}UaTEH=(o;9BhM)YP?{mvo9rO38;&;U-NhiD}JGr&7 zc=2q{TC;fe=h=->{LY?BIGsL!&IAAc8wcY9186ikt@u&RK|gG#8`UDizsgKhY>scl z*a$5>6BBC~82}Kg1Wb^*30(gLd7|StfhU8b96s?LYCTeg>2*h1S}*t-rzaE(%Xj6# z0xQblJYOtT8$X8Z)UuJ)Ez`0%Dsq@ed4Ej53}y?Hz)CDbf=rA9|^6L zGG51p4s|AN_eUM`+sXd+W>&01Q;xi-J}&A?OGB3L>8YTGt?kZqDTW%Kc||_`g~pSO znquNJspAGoYiM}M0ly_d(By9sy3s!VRe<0a0EM{vctgfQ;Lsa*pn+6#4-E>5hnO3? z;*152;1AkgWBciaqER~|WOxKFs3d2;R-5{oR^<~?#(g>J%)!E33=E!ti&^RoW5>B22@I$P> zsc3E@VD#8}?)<)z*Vp65&E%xq0Z5hJk5!DyK}DV3Y_5?L$R)ypRw7)>%XfF z()kRPoG4lC_RQ>X?IS!YB!=OKgAqpb_x(`_BZ2sW_YnEk1QNY~zL$4Y%4jY7CT5vMbjd$r$>`&@cZ3gmXn`jke8fiJ`ec13=Ey@q$7t^^FRG%#v-ZSy{ z0>w}ZIrn%vj{lN>b0F~T+5G*L*7B~9zkf%~aGUn*bH4X+|GCZBk1%%5f9^fPIr}a% z(`+!;Dvuy!$+rlx3Afp^TaTh?NdS}M^LvrTqiWH&q~(FKsVk7Mc(U%^>5Zz7`x^&$ z#@V3sWsdlX_-t{12LT{m#qjexR;-2RzHR% z@~*Px1@*0GKy?`jm<5*dj0v+XJ}+ zo!tSySa@}>wfKeKNaIom&o61)aD6{KJNMJE|Fmt&Ax1s-As+%cqv!HFfIaiVd&Sms*Fv@wh~EnZ z-wX%3O#P!1Jw&7kFzK4M3GX+GN$qEST8SH?x!(bX?Xv)bM6kP4>gCgEDl_bh$KFmW zYzTDx(2irO{I_b4I4By#Vi){b_LHaV50K*r$x)xt?v9Ep#Dw7&#=jMegA@coGObw( z&E>pDSXMv&-jr1~J!8_}=Sj`TB(zD$CwF?lWtNN0?r|He(xoYD#xuI2JVRiuLgE2i*fb`euaJaP6c<9Fm+nKApbi^E)^@;fEqZ?&n7sQEZ+ z}8*k|h~wBmJFvDV9I3#GCs zopL^XPM^SdMU->xtajH{#usE~$nw71)@}L;O@a1`h=lBIq;fH2?Pd4oeA>B&k?lxa z06?Wzox|A#e)iZ-RU;nv1ebpT0r%GnkUNe+WyyfOm>ynEkNbmoeSLHb_&=PTQ;aTA zx31gxdZlgKUTxd9ZQHhO+pBHcwr$(k{qLQVlXG(}_DtQ(iVQc*py&I8&ss z-S1!d`e3*n)UE}$T&`|dI4IIe9x4p2`R^Tea9B%E++`}Sma5w9c1SxxGHm>FreWqR zEnhrZIjly!*uA(aoGEzRcQOSa@3D{*_c$?<>k{+$I&uH99Yt<-i%BT9qmOJP(p~vp z-VOf>`rF2^IgKo=*%uVzwpSff6S|zN1w0gHclHuHmU$O_bMPHc?Lfb<-o)R)(QVy= zqhY!DTwPsMH1>#got@ty{Bl{9&v5;A*&aT!n@90z|JY`FNMdGqeV@GhaJxIb4tD)^ zv52-d4{O)7Jaj>lPMSLNT{D$@rIWB3(dJI$7eZ~ie)18dc32B$5Wo(|BfziTy-UVsMeoZo&g*8Th5=% z?ON?yL)(%qRhe5md#@vmG#`Hnt?|$GbPNIJEp0} z?w>t~KPiq?*DrWaQ}3=SS0-L|BNIp$uQhZkytp=4?0CpBHXaToYY*;(uSO!@l{CmR zj*apcZ%PyY=xE<_oQKIT@y_i}bCR4*mW~fH({D@J%~3B;Wkrsy*)rjMxUn}N%?FN7 zP7k6KcX~@uRUgPs46QZIE@$1F&M(^>vjk-YkB7X-?MKM=tXv0OQ@b&4cg(fj*Eq#K zT|8QOXRBzkGVLL*vXyx(S39e1tFeeUQaW$eq*K`C*rnQek%dCa^DRt%esOZ!T9=f? z`S$Isu!Z5G^t`2v)0w9!T|ImrRS%owXe=isH~=ArorYWXnylti#xSR*Ft@c0Hp!)V zICrno(!{d~+8Fbh)SmPAucZ}bxgf$54$d~I&(za(sE}-{^;X*v-LoyC^Br8TsOkQC z@k)yZdZQfU3*%qQ1+5WZ3hYrvXjOcD>c980g0x4>&T#QhuP8j>;yg3vbglz2kLHj6 zreD`*o;^ZMFOjDA{Ta?-2RYDOLC6j*cOO?SOtD4apW#7l?xE_?9qD0d&I9f@wr;2W zVs0`%-q)#IijXnTsSI28R^}RcdgA0al2a*vZG<6)Q?(bda}l_Sqgq=XmW~2{RY552l3{ks;xk^&E9HoHt^f=ZiWe7Tu9{ z2i*0C4QJcB=6zVI3x};ppf=-=Yzt_b`OvDWW%th z0U0Ic$&Kc=!HEN$j05)7IVUGF)j4g`-~As<*9|sl=ZQ)jr+1~r!*?WgW5JR~OlP{( zpOW@h1%AgSFbu+qrG{MebM-xyJULmlTuD)eqQMQ9x5ak_)n(5E3jNS!eg}UpdM0?B zw^lZ2vsi2^F&(dOd~IScpGKvi-HUtJu%g&6?9-Yz#`^;b1C_^g%R9=4VQtZsCvbwf zH9cE+b4%qqTI-gM?(M2tt}jeEYjQfD5S(g-q0~pSqBhfNEK%-G=NWc~8nipu@8cJy zZ*Zq&bV)m`6t%1@rs&RpaxqXO+jB*mr)??pYo>ltO6`l@D6<}K0vCts{KuCKcH255 zOPrx)oT}s~#pBe@nVc*AIk_+&R4nQ`a2Qi~T+A<4&sIa)>Y8R&xF3Qj)g9GbajB7$ zC^%FA4wJ1hDE8E1Q;Q^b9Tir|T=&HjY!?2iI@&ej*qnQ5y`@vDL!gVE+D|2xvC;Moe zy``fa-e)}5;bZfp$H!ICD)~jV!{r6=h_=?d!@|bYA%}6`hhwy}#n(uUP39a{3@%o% zLSkr{&EN(I_CQIgNO}3}-KMj{#b1BsqmwK1PUV`=)R$RVs+e}Jc9l{=k0vKcwPWeX zRX1~U{YII%q7Hc5@XS${-02+RIzA~f}2W$3E^L2*dwdd7zglAN>D|=>XX^<^r=yzFv_3F=k(9FwtJ!J>HoLwu8?M2WhSOqf zoy>spFhfHpU(gsljNqpLyq!ArK+@&`iyR90=+h) z!$E6Di;-1owgXIi^`qpp#b{-?Xut&(=ta~1L-W^aO2+Hyyz@KTl+bWE zQTNJ`k)6$6^Acz<_xDa!XfEeCRUy4FKW3Xbb**_kfW zxtsB9T10Rbr_jza+*@KzAx*Pj9z~hckIWBo&2hWV6%Hp?#!;K_rH%Mp_i6ROXt=dm zoZO0lQ{?G0Yl)lpn?kt%@h3SenLtHB{!Ic2hr9L(&MkRs%0N*r&uG>^p)d!Qx}%s= zi|%P|_~-k_D=8@Bxr+uZ3JYD&4BU+z<%WsV;{shxM>ltNcUE0GK}($(EjSvi!W!v# z2^DXEd-sq($!7N$-Sk!h;e4s#45ntQ7yYFOQz=E0Nn`pRw(a?tZtIa1%?o`oo_pj<2UJ_8IDv66!HOLy=45jt!jfHch{Cp8r zn|=-W*w&@L61l-k4he2DJ|r_Sg56){e>yKo-~W z_GqQ`sw4#x{zF#NVRm!C}+#FeC?o; zSGzlXtByzDShn%S60)a*Z6`OLCCB>Z=3(L7ncF7V*LbUPU`~q5ctRDTk~h?r-{z{h z247h*&!hoO_0cBsz0ldodUHCc^uaabCfYS%ZOJw`IBorcdr8MCI0bpo!?R&aG_|;E z!bdB+_g+yZ`pj$mslPScrD^chifj$)DW(T@hb9}7KR>W@y$id8u76|gic?C*|7;$({$N#YwB<(l_|5OL*}0 z$TH){pqtgRk?oCDjosP$@1Yy_IzHvJh&{C{BnCZSL+XsW)Q*AC{R28zfq?QX&=PHl>_DN|FW`Rnq1S&E+Vlh3gPCzj><1f2A1P7pg3amAZ@7!U^M% ziYy6@N%FPU;n(f!ELQ6Yz4{a|YR#w$>gmzc8YB$)=`>)A+vC;ZzomCUp`xVODsX)K zA15=jus8#Uc_P9pe>ow+wiS7EVH#4i;X3C1YW0wELRrq{#rc*GtbD8HB!wx8XrbA1 z@uKy6RU<)Srg6F{IvtM(?M6)$7DH*8#LSY}WMdjHm$n9y!p}s9QHD%G-hZpeqw~)f zu9FYbW%LQcg+`MN0%Pc%7Dp7RpI_B;pXm+}(ivvoHkX!I#yVG(#e5wtCi8;?)TpEZ z*Bi}58rrOigcLNG+sPA%ERm5d{DIC=fmB zBjJ6AjC_v!eUph{`yyiP1{h%c#KZtTeowf*`o^gypj$xp2@;B6GUV`LWX0sG0>H&k z3Q>e{fqrik!f@aEYaqgy>H36)*8vH5G`!5Q@4MNz@ZNUHUPa(OZZP)X9(@Q$@PZ@? zv~$GYuK^|?`bHp>KjV}r$jHxpiU)pdeU5=eNXQ0IF1_9g{Jd6jKjs28KVkbn@(sZd zt=z0olQ*(gR}q1;P|m*L3^H+Ipq+;hqxjBYyM9`N5)x<{Mf&jP+l)Y}7@EXEqcV($ z=;0y|M8JHD9LoSkskcPM5?~nojK`&}jP)(%y5=#=vr6Uh$|)MpE;?!i%7R8~TWvNw zxMZC@khltR0pTFTABBpr-~}v^^l$PYpozBn=R$a8ccfKZ%( zpK=(qoC-MzGJX~za#ybEbhil*<@M)GJK2|!-{?mH%GE=@K_4o?XX-;ne%##$`-QII zXK5?AhPIOd7aZ1C%d@YN!{mXw^3w_Z;Ku90hl}G1p4nc5`2y(}o!(f%Q9z`^>?0n5 zYp^bi+NaeU68lo7)^SYn*8tB zu=~;lS%fiBDs?2SQe5{)0jz2$>IO9#a$?ojbchtI3*B6-AA+y|b_r+YRpFY5ZS6WT9k4o{_ww+|`6 z$7O*)QkvSm_b^2XQ^Ekmn)d5gOm6|Tjn?0I?opX{T=-bm$o12TN zcWbOP4)i@CWz1fp)&w%QLq_O&8E%m>oQf|lClPG%9do_m*Km)%gHI%}6adgWWm{zr+6naPgubNAY1#c*N*30cmUx5&hged-*D~ z1dPdm$%_nEQ1wz2!Y@Ap+Y`&#F_HM0YYqYFaz_Ys;K*HGS2Xx_v4H5w^Jn?>vGnr$ zxueDOo%y6^wyoN_~O&Cp#*|* zt5*1))tm_6uY$u7+Gk3*L^^TH9W}i^31w z;)$*m8=RJ!&Zb$YNK9@{g{-=%eCn{K%>gH2*{Kj(6;Rm*6|2y*K zFyWW)p5F#{>Ho&7{f8_yDlJT2+Y#?(@XeHBNbpSY)EN>Ih};=C7#N~gpO3$VJW2S^ z!xR$nDCR##>`8qm3Bn95XSqIsbIdZ6e1P0%pi8FTrUl!nKseKy30UkKOl;dQsqxma ziD`UNQE%)ywQt!j7M7J=2dGwp>=nK9un_?u4rji0uAQ_Ls4cyP?&hyr2WF>)%VfhH zJr%W$?LhTh^V19hg_$!D$F3V91>&>#to}$7KS8~5f6GD%~eZ~?_nmje>h&QTSbc9AfYyihO0;W~SW9|~**7z$w*F)WSTDHB!6 zP328mF*_Qme(^;@El=7Z7sFVARJETP51*9WuMm14YoSKawAT6%S0xyT?;2Pj+rYze z2e$($dwY_KeA#bxpzx2hKE(nVjZm+?gsZU&ZfkS=_e;Iu#8Vzd*Ln0DD$x09U7qZk z8VM=$U|e<*8Rhu6K=1wBopJ!qmY&mA_!)Ra>RTY^Oh{JW(fMT4_mF5m0})!rR599C zdjfJ60|7jC88qah<+3|yT;CpG-x0mFsMPHj9}ib{1t3vyhD&^n9GNLx)`)nO(g5Hz z&zJ-1xmn39la-adz6J2H7P;gVvodh3%iY0P)oX5pS7NUjJxT@S^iV9siOsIh5SZmx zSP~P&Pc|!OXo3;RnCd9et_18c-hEX<{@~RdFLL^Y2StmB@U2X|8Q#8FU*GtssYG79 zdcu)kiE_)O7a+NVc>|K%^W4ks?z1Uf-I)oMLZ=nqt4d_?WUjxG`TO@2V`a1YQa42s zT<;;{?vsUtu(A00!7i`#){4CGIN#2)EadG8mt))oqMfPP;tF=zmkG{pW;SiYGo_C3 zNdL6CbJx|bxwcuTo8~R??5Jkh9&v=h9zzOVV#km_7KgqQ&5M?SUT2+&7B1_>=ptoiFX0p$anxIvDA7m5-rlJ%7% z2?sGS<`8ja6uUtE$Ap%~8Z^@t$v2Q^i8=-AcAaavOG1xY^*vtZxt=*Nxnx4bM0G~m zD(yy`00O(S`O^zB)`J^Qsg92HA~^tx0T%xf=uSw}#J+RIASQekAvSi_I(8mNHNE|7 z2WQW0QByl0dqB2!Yl~Sg?$OW=$HQPW6-nixiqH|KKd6@y$MxOkq-!P49iGj`Z5VfKh+jp4S-X?`G0N=cA> zYpiG7UgccvI7c1si)-M}{#rxrc>waQnM@H#Ya9TiY@dX^ zLFb>OU=~YeE*zQ+e25wz>3kea#jrkiw)s>?r`iq%EZE^_{}uq>=6+I4NN~0*N5=pw zgG%4xx}2N~%ZyCDEA^mIi|KfU|uY^&m_#CZS#AMq<*6f*(u=D?$qP1VKhUCT)n zu9u&Wal1yGOq9(rz9L%8lvx<@nOJBXRBa8aFpFS=RtYb+U+4Wbt}Rc+eq*OUu}LQ9Gb=l01dQ3J?w^o-R~gfII;a|suh9hgW# z%eclK^Lj)!Wch!)GvI{Kt-ma++=BDLCPS@H+SD{1d!w z(QQe`1Y6RZhcZ9`ruZms13v=yi{mn$TH?w29r{z-#EgG{!)1i3hS_F%oUJ!c8orPA zBBXVur2E-=m;$8C1JghOMbBn9vZzwdLnkM58WP_tGRjTeFG*o(pFYf8iT}ve6Ir?V z6p>>LI(i>Jhqjr=S68a(qm;*|hd1|EVW12pKW>Sz8Cu+jzPWQPJ&Sh(7Ga81RM(Kir10E;Zgnrlb?yFxg*F*VR? zB!(Fx`zeLDPxtcDEj8qM9f*9EQ*V0oCk)ov2t=)q80@h`TXd6LWg_&bydhz^TAquvlvQDwO~0?6>O1L{+^Qmvjc0f+U7^os1{ir?l#9j z_Kx4{Uf?3n*7CZY#Pg}fdAzGkJB&vXA)W{?XkW;VcEz!O61J6am=)ycK8Ale-v;6ySJ>BRoNMsXJP$Ta{_$s z>rkkfIi`?XDHs(@G+tFK;T;+YhK|m0a+|Pvf|?eqx)7=mEcj@AK?`fo3a-kxL%=i^ zkr90INAV98ODkKSHOz_}DK(lW$gBFY_%y^}XH}ZDrV?y-9%)jFVaE=qCTm%f7oS{n zwSem3ew~~^OzF+o5caq< z0k79?hD*^=3Q92)9R9T8G}&_D$7`lIMHGoj2KxFUmu30;hr){$k)8ye3G~>uj`tH* z?gd|J1v_B^i5!g%*k9q7n!=9kkbjZ-kd#ReRHv=?8f({_KdhP8OX7<6XJzi2_PG%= z(c`&QvP!(F%%-y!Bw4h%)w1>@N%@;}T`&MNVSK5+mMj?K$>$9Uq|| zPiiHThG^HBCq1`%Cpu|N=?ls-Y8oF<{f{{2qV3G(02@u^R|*|V9}NEC1n5*uzy63B zIVy$G;ydeXdezmfu}%o;azg0z4wea_6`W&>@`Ag?06VP;nWPv|h4}MqBWKm3f(Rv4 z#fv#}CA>M3H7#Rw~Xi7g^I8rpmc^4@Z>=`lVwZZ4cgHR}6k`J3UH*3r<| zdUB4i&Ml{6J%A!V!mC#vSzeYx-iX28@bn#ZXHu9SHkOL?JRK^pOfDFrWhPUF=Tz`Z z`r@PKIDzoaG?H5&r0d4nb0^JtlB-LDR%cLWnenJbJt?UE@dj3E8Hx(|sEk5gtoCqQ z+|%G+a>k^j{@DovyIUfVJNHMv(W!S#x~0#wpv)2d-Ibl2`b8h2SHI?rA8wzu`RMMq% zDt(@60ru$4OuqS7GF5NOP5;VMD+9NeJhBYT1j?OivZjQQtO!1qQfyIaHh2eyo1qjo1umR!3KG-=;5)GeH& zjQ=ieuT}InRV8kVPCMumTf6U(wZ$y7A&hwW~>&vPFP%>BHTKKsFf*86XD4xq(tcGSe-?P zSi9{}h=wiMOC!6M2v@qeYo!g@8BD~D@&d|l!f*?j*_+L}&TZ*Xjb59UstQre6w@T? zsSa3&$gB2kGxwK^Lqmr!x}+ty*MemYo?N>fT~o89sVX}bl@I;H+tWsp zBJq1-x{Y%tCP&B{k8jD!YFh`l;ijk=j?kv|DmnOC6gWk_8o80Arpz#bv?lnQ&5n z=a7t}=g~2Y$$a+xkx>?$Ta&;P#?);hw<#R!c-4}UG-_wJHSKf2tBRr|ZT^k9s~5Tm z?mvKX4aIf}CAC6Vjl-}mQt0%b!>WFjB#J3*#qHOj8<%PQs)CZ4j6Q?jxHz30x~#Yg z<-1fm&mFj^_O5KLE)@cUJ10VG(;@OUz$=4l6W8IyU|RQIfVtq2bg{TI6|+aw5@j=; zfi3K-oD}r+b5-Y@8~hCe8f8@}O6JDjG)Xif3<`nC{l8`bwa-xoN-7K%LrPN(4&%1Y zQ)I(Ab^r7wB+9QXUR9!GvQLP2&?}{luSgWcxuywGkPF63k#j=jB@q9)mUW38l4>u8 zZ~abg#5)aI-eXgQ;r_nl7eG_t&mPd~r0>MOY^#cb{80Et;h+5Zuczn{_D<3tIIha~ zxldeq{NUsu%Ru!YdhviDfnb5Kf!KiTfOdg3*M|^}2CokRuMgj< zMuGUfJqFuhe|1sdhIB29RKTl8R}~QcF#BBqgpV-<`2aPVd(|!{Rx6}1N}f+hj8GqK z&9vOUURm5k(G+Q-!dHnX3;_=pp@x9;;^%l8L-iy3Hj6jGUjPlH9QRanvEAF&3a;i& z_D=6F!-sQn!sPU%y5^ZH!uOM(4+T_-F1_1gfeVC_Co2d2@McY;{!Fv;NPb=b`eapr z(a669s>h5hDo+?Q`$sGgY~*?B_G^STxcW-McS8s%NcO<#dz5SzUWV?Vwv>rBZ3x$d zJPG<^-=%B|9RvhBN8%+6W5fxF&0HX;9XMX3mlOaFV;6=agdV2nOXGWUP!c){q&(fU z6}?Ck-rZXY6+_P803>yw1t(T%Q42~*51Lm>si;q8h2$hwb_|No=;SXKW;qHYvQGq8 z5_BE*7|~+50fh9<2Qnxi6dy+b4GqSPl%(8eQQm2MIct0Qg>4f>i8 z8fK--+1h$X`E9Nq8q{2E*dZdq!^s&O%a@mrZTYR1W;N|JMB-$!;b~?AyK5m#d|GA@ z^ua#x;{s>1019jq2b1NUqMD$?sgkKiPZe_;3+vIvp@|bj)7tN3&>gXE0Dq=MMd!28 zPoe^z$oPtc>+OVZ3(~ZN9tLHai zmFzj}y!o8mQVh%aXG5h^Z)9STBacqg>xw?pH3WUb@~G&IIg(H0RCpo^i% znbR$w>1*Bs5Dc5s_n%?iVFP=enak0|Nsl=&D=dJK>}bgBE2C=H_{FGsg=w7gS;Tq1 z(y_>nc8*h4^MNOtGBbnc1EN;t^};7o)m^hAEb`cPfy2T@g8uPEh*72uGhxboX7Ru? zmU)KYE??d*$=q`R^^)<7mFigsPU(;Evo;?-0D?FWKr{3B1JSX~>NA73Kq;)#&_)bn zXce&>nO5V12%sDxvylAg!KPZ_d;b~>z#?6)YK`&XED$gnVNZjwKm(?l3$f-g`TX+* z<@`Bn&4Ty>_7PyBNL{5k(Ac;xpc)C*x}%l$%Ai26nbQmobf{(#E%6`*8WZ*UEN4th zL8Ag836%iB_{i~bK=<~WVea2#S!bl~Q*^uW{?D~Qar|%iC@64Kf9U3XSzbf2jY1l3 z6A8J0_TKva5g(QAz3FO(LG(?1pneG7`{ZQl1%s5l!j*u#UOd}?lXxH?&p=POL!eAA zKRU<+B2%<=W#ueFM1fJkpx{5{b{uu9Sa?Nu5rX^&0RZ$`(Ca^eqiZ~JS0%%RN^y(8 zDvNkQ!0)E9a~Ym2z3)FN%&k>^DD$|){()05KIJ&VAf>ZqF%0Yr6sxi|xws3*hLhJL%zA<~Hhz@P14(j1 zB-zlNQDC6Q1^7vL(H>J1B3mtZzxXLf--p%DWC~r>S9QT2ytxnBSG7ek1S8*ox+1Mv>*yUskWrPBC@O0=5VDTQ$gZ1VPmxR~0R z;tqH)ZSi&0H|sc6Y_}G9aR_~~7pf44wFn@7uX%CrNWa)4C6`b72Ty0LBWD_I1Xr`8 zqociA2R?_gAxq=c4HDI`w|?|XuWZXQP7DGY zJ2#_$a!Mj>uxYE1GkVCHsN~^;9t_RU%LpcXEn3a}E<%z^Ae^Dm!BR)cWRNU~fw=3& zRK8B3aJiOexIF7yQACe6CB&SlJhnuYsPx1UHJ&i1t{v3%S!Ec%l9#C%5|1!Kc{v(d zAyj^}wRb)jPMnX=GCh$(byS5%%g5(e_IUz0%iE$5&$8tUfOak!c5w1ya!;SeV}^|$ z|LYnnjG@B*itp<#S&Th5tGlREcG6j;I%f_qU|C%5OgWdlO=ql!qcVD;mqZ!dWViPS z*&Qa&uE~?u{tn?Z$)6!1_&0wPM|p%HkE;QDO#w1vTKgK>6=bBiTzUn=F5h@3xUZd6 z+}iJ&D~b<{N!{)3nmybIl7OE~bwyt;@+i6>+n@{e1)y=_A8Z9TD>z2LIZLFBEzbZ5 zx{~Djsd&Cbq!9PS_T!Dcx?Dk6DkfDoE*;0d%M*gh2`xvXkg#A;;uP|I zGeDSnjmD%tDPQLEeTJIzUc1858a~41R6Qkr9&}!^6s7i9&VIG?5Lm^Gg2-A)K%y8y zWmvvH0#fp)LCw8RTlbLjo;M?o-z6$^F_g9P4zzrP4z+v|Am7=d@Sq4iX=p7q51HN(0E!qzuNHS;G|HYlRl(fOnJO)Ts2Au} z{xuf*nG5dy7~>lZ;2Z}9j|IPJnY&|1JXGyo%>M=TfUBN!BA=wIMdX& zYbct(K%LoceQZ*utUg@HzSY8Rm1#6F8jNbSTNB29F!YgeYJeG z6}`GrzG2%o-z3!e+2p&@&1F=h%X#Nnv!ogU^DRG)^6k|=T$9s2|4OScvXo?_`p?UH z$H!*C@O1eym(t)l8|{H7-FA3N=`NG-*2)EKc$0FcKgRrQie`hwTr-hNw?W)oP@`Qn z^$(U*)p5U5fBM)!)`_TQ3RvFw>!}Pq(U9$4i;RV>H_G%tM8jS6_(c+md)1<4GindE z%CKd8dZK;%@U$FZ(?&bo-c+$_hcV~zo0h~xS?M3P#%!(1f@G6Qj0dK=^(DiK_A49X zd5zn)R{dO7rnBI`iJ|P%F)h^4{KJWs1#u*YYHJE*GVl#d(ar>tmv z*#1SW5d9@x2#(Im6Si#e!t2SDsBsy0ow{#LPL=;HK$!mDNR?XowJpyHk%Q)1(+ioMC_>S zu`5ioijWEvrejrUCxHo@_Hc<7Rm}{J8oWuP<-a?b7d_0|UJGfQzk4_LsJG+Khauli zs`(F-vN(BVGnM=s9l>waEt(Nov~6{yw6>hpIhqs$AK8Ab>BaTK{-L;^rqMo@=ESr& z@2~|ur3x?Af9Ctm;9`ev6WWj1GMt0O(4Yhwb=(~&pR=HZ@XeuOq8o^n-~GU_WRQal2#dF_(0l#A%`lm7k$HUu_&5^BOJeE|-;>X;Qm=d5-5^yO z0~84U0;Le~R>C+Z1wZwQLkNAX5bz4nKp_ka2Js5YQ@M;X)fQIhZp4d1Q-DYQim$K@ zYRR6E+qt|HN{N;N_XkPf_C+@JACxC=r5;s4sziah^cLaCmXgAvHJ~p;v6#UpUE1nw z7q(%{Ec1Yk5XiSg{=rxc2?#MPHY_w6!c=(U0`qKhlVxmSPec_~B$#b*?6!K(cc^A+{&8sT_UjRCU=G^5%deF_^O)dZj`le3- z)EZpF{%-Un@8s8@yde9P{||+2GL0}Gj9{WUUPvD%ko%7BDaBb zO_*G44d>%zBIgY9TXxGV0ysc}5k$?m-nVg!l48i{r{l*L+#QyWw|im}3;rlr7+8jJ z2tF)`mDV8lC2L)B!Z}{xZwUZ-N^j5*T1_bmo}-zJLLGm$G;ucQ0JxEyJQQ_1fi=TU zz=*!T7Wa5?%uT&18#+imMy~vO58%+XM(rf#d)Pa+!~GG++=(bLI9Vq!yJ2Z9oYL!? zX+>L`C3R1@3_~g|pSQ5iCA23oSPW~DAW#n#sb-;`aiIQ(SWf-aU(RcT{w|w9j$*=< z%Vueb$zjl>zsaF;tZW3M_UHRf%sZ4iyOuIvjbd<8E}hIquv&qu9@|KPU#~1gAI3~h zML69*C<0uNfIhA;v#eVjK$i-NNF6rn>j6WsD_C9SKO4`7iuBF$CRg-uCkwkQ^>{~e z9sx2oY-#YJ5f9Hy!QlZXQ`D5s(hRj#h$?-R_#Qov1F3GGB(Ds-!=i*D1nan8I&kee zbL0N}*H!X6{)3nA!MBLV=)3^W^M~V7HBabUWkHgj;VE<#w{Wa38;~iiukLf_ol~Q3 zZd<+K_k((ONci82_eJ*Lr02O<_x5J?K*391p&cf+CDpMetUj`Fmaf&MYvC^eGZ@VA3FNr-=po*X&SFE`vl&VL@di3A@XfKnk_ zQQ-@tJix89GHoB6xq;rKi9RLqH|yBZ>V%p62XY@G3i7OGLYMNb#Qs$xRRU8cjVt6up6Ks4|LjtD6WPGMbeuQ z&lyY6`G|ZCutN80*(_=s0YGk8pzwg*-lPCbkicGSNDrGp{6M`u9q_+) zJp5)DJ(th8XwVS)ku7KaC&(lwTHr{4_JnfJop;Oimz#UUFbh|GqE<1^B&>eRxvnGB7*h{%pQoQ}(z% zKRv)7K{Ylb?9stc{t>?pO1;xin2lvXGw$ln9sr5Z=Ned)!f%l*3QXOVm$2UiXJr+S$cO$a{jB!|9_N z_q6S@K%h_*fY3=aXpoMHP0Ad;-#7Kw9B}D}SCx+FXQk?+iz)ZXq*wXDe){2GJ-}V) zKJJ(=FVGrP2(kjAqT=aA_SdPQIyrBbIk$g!UNh%pI=NMKjBzNUUiyt*h zg8xKDi)W*AxwyZ?k>s#kRVI!F75fOMG=w+zMR$z%UUhmEvbRewZUEXOu#hEkto8@+Q_9KX;i$J6$=87UqXF9oN9+RxtOsV8L1W$l3Ada)-!HES$8=I&A{%z37U`o?2_?6p)JklRK*~Qww?hk{8@07%r7^&h#Q80~IUs0p` zynt4(pDV|fI?=%>MfCO;d!h<3NNJw_J8zu(RX?qC4LmABT46aK1y+D({FZsasjRt_ z(t5Uy+4flcEq7&JaCbTY)qRl!DSq_r_>-fyY+Ej^h#f$?3g9?dN+ILhO1wYBFm2vAtPmp6Guw^I=rI{tjtj3=H2Y7(7 z5;A2y(P3A2h>@_dTGlDpdkC9uHA1OS~WGy9k`_|dh8UFa)=XnRxLpqk5aJxRd zuT(WrK-U$EeDxHw6ORY0&}5n>XC$Wpau&BXg%D{qMRGTz1n!ImOgPBP0-^)>9ywGR z{%xP&I+j`*Wd2}CP!~RmmY)`<_V4SwJ!_gje>_A8yb%9xh+!YlfZC*!V%GuE(LYO# zN5662VThzC=+!?@pL>6Dw zUC?XOJn2lh%7l#JuRGM6#2v;|)txiRXh)aM+SI>PQ`+;o@b15$>vUONnrNfs?cFHn zcEb16Yq}_w+jC~YSzQ&jUi1Jv2s;Qrh@BrqKZbBZuvoTaa=_ZLin(}Rp0Y7GX^o|z z<#|?^rz?K6E=AYbmo70mydS)h&`I3#IBEO-+kU%%B*2`J+JGbtJ)Bq^F$E=qDZB*L zm@vRZCB%Z7U%sk;l9&)h0tEwD)(cEw(B0Q5-tPmfbBg?)Z6d|Cdlz z;*{|BhWc4Fe!%;VnCNoT=59vAmfJ{QxWpnz_DmQom?00}e#R=QY+4ilLzqsL1o2;I zMFk#e03v>Z0Q~(u!)m8L8KNW<)@u5s2u&F3}hngUg{09bF(0E_Q+9UDWs!Cg(p z%NGou@Lh2xug1Y&r;y{5Qdg%k-+Kcg!c`?$rMV8a<+V_YO6DAb>#H4d?7I>zmyF}* z05lg3Up|m3N=E|uM5{ApmGCcMM2I6=C`d6!{IfK@C?f4vkR@SgL?oNzW)g*3f{+fb zY)EX7-bMuwz(|^gL+r#vt7HP8t!hpG8F`=lnlD%!C?7?}Xt3bsuko#;F67_4VlROS z1093>44n8Tpy8x9EM6gkXFjr}woPudiG+G?+#JPL>o|2Nb9*F`T>+=O!?a^Yk#d?IA?MqhW z-hFK0JGL5{=(nO)>5G=*7a-rfohc*kd{WbuNek077ih4Nv&D2-+tgR@$IdhN1!pgK zy~oe;jYQ%k5g7?pK(*SjBV;Sfu#bQD84*aIwULT-Bc(pKfXBidOhD|NK5E`)Y~<<}l)+zQhQ9^NHY3GQdR;K>r~YauYSdzY3RcUUW+AEm z@4}EDH-+o1ZFZ#NhNp?%Tg=O{{muwyL&ZqPTkL=z_aiB)IR6>TpUDQJw=nM2hYC+F zh_it_5Vh8dbKpk7_dF+%peOen5evKu2$Of+gb9rs5Kh_=LUe!I8@rmcmutnAjs5{k zxN|#TV*0bpHmLkclaO7i^_UK#>X^0mniPvaje3@KK`+_YQ>>Aa(PWE29;R5G+YsV- zww3W`W)}zUIj(o>(Z-X2OQTwBkxq&E7%VKqfi}A$DbEH4`&u(20ViWqMr>&$_UQ%! zpQ%HAlK>Wn9t$glQsg0m)IC!uVS=poAG>MLXboo@&KJ6hhQU2QK*=qv7xXdUzIPV` zzQB?h((i^1?Y*IAc22+b{J;yf&wQG2DFodObss{B&8q|y1GoR#)=>XeBB4fmBVlKSBHXw9Y?EODZHCf4Bi0Cndu_ZK%^|LO-7F6+C%lXZxFVIc3d)m5O2>5?48KU>W{Qxh{CY{0$D(&zce%}7OQ0P;V7{F#`$92C_sx%n-g91mZ|TG7Rw1j^oLR!!Q7RpKO{FY5RA+dnu-f=*3Xd`5FtAKLwFd4Bt%3N-b1aW^Mcy+O{9s32IjOYoiL<)ON&z>ng_pMz^lSJMx5c;8~BV-*Bv)PE)ghmVejJCsc_8tby zAu??=_g#n3Fj%x_n4WxRsqbE6uKdv3Z6@r^dL+jPn8EZnPW5EbBRRv-3}Hc|jx(;S zMElY2)Z;t%n&xZG{>RxGkIwy6u*D=^PYF$&XhV-Jv!=TJA6vH66;z4Cj9l@jgCM14 zKop0}g#U}i2W&pawg76?B}lV?sdbeCe$knLAGIW%Fj_TZZbzwqG`6pIvgM-H?6YVa zlZ`Ids6pVdNG4V+01$SZp<{UNzc1C`cpZC&|E)8le=T-LGO zZprfc?q6A@rEOz(-!aPBhum&8RczR&b4q(#TE97*$4^!|ELjU&#z&3fYYL-0-*Hr) z`R7=S8jVeE_1639x74{-mo<)}v_34aM!09gE9+S2EMyNO>yiL0ks^Uc)CyRFhxz^B zLIEWFzCFNsKcG>-;&Uumus|pdU_*c%K%oqqP7qYKIcO#~GN(JDT^E24T9`HnMNJBg zjs=!jL7Fw;Bo^>WM~_$Geq}eP?-G*I%dIH8^Vi0 zDvkv)DPU@0)VHGIS3#F@_OhQ>u5#PxZpCZ`n^`9V zU0!cCt>-Uj^!jEYTH)xEFqd-z9A&Lz!yy}DQN+;CKADiv#V#Q?sKM5&dknt39FCj{ zgQW_WeLV@;e2KX1b`tY4Lp}y}xhAj%#@OW3lT_U2GoG`LIo|rsXO=rbW7HNJ+7RN0 z8W{9PP^fO9oe(bjMYv^qX3XTt-@oOp0gL+IqrCB&=3HfXEf?&ImI-RO-iP!zW`%KZ zZZT!1f;=0BA|Kl}wN`XJ@KG8Y5X`ub4D&Nr>H6Diy-vZv*t|OM=)s}6$AQM!T@}PW z<={QW4;XakR=kOwkkb3>5Z;0FiXe&^`?F4rgpC*(dX~8wh%(Kl;zhDIAJxSahIW+8 zp}6^cwxPWh)Lylo_}y`;zL84IYUcBq&F|N;HYahBb&tJampq6SemnW;mopo zOC%7601yEA!~_4w{+1t(ED-;)pVY`@ky%0_HDBWYx6S@9@%Fi?-L-l@w}1O!ulCgX zHMQ0uz=|UxpSd7uYf6%9VtKCS-KP8=bR|+&qIsuUlGMW%(TdVVv_)u0NtR9Z%b`(! z4BU<8ZZZTDS7uM2%I&6Bp@k44Rps5c`z5+;8We&tMT{oWV5F#!kRs4Bwy(kT_2=MT zd7&i40Bf9pfIGM#H>wtEZU36pw)}0@|GL-#(1GVI1Y(lKCMIl{Q(G32s6wQ!)0&MD zvM?g7$x5bdmMwKQrfRt+BM1zWSdwLuA|^lvl)c>8O;Z20dc55zvo(tvDnmiB8Y0Y# zCEM4YSY`^KqzJN6jU>YwjTw=(c{3|qq=*bgjSv$k!59o!iegonqQw+w(Y7d!NEQ+q zQKJTmq9oSarpdTf|M7B@WQ!rZn?Cel(C z@v7-rGcApbS|d~ujQ~j*GX%6_MY}exNrr-BCP^6}NntA+WV~9dgb}xsbfDTIO$ECx z%8kx!MlFpB1c5-5kpz=uOs1=%TKMyfmP!*ANt8*V&{3Hfl)?xB1t4*k{reCyDjkwa z1w#-T!Lhyba)mL{+oeT}CbAL>w{oK;qXD6&NUqJPn%xs61tkpDSdk`-MI@NS%SMYD zB8|CnFlRV|BCyFeHX@@L3Y1Kkq$0i7EMW?~%+0Hjl8G`=BTQQ*0f8VIYg*}ROxlZC zEX!3hY|6&AS!P>IjkSNNtI08?7^7H>%|?R8iy91;Wd>7d+A(N@SV)lD22Fz*kdY?B zVl-Hi2?-R9gB2AqND7FfMj1g*UAbb&P>N$njG9{{$Y3Rmn4+}JnM|+*h(bmr(qmvG zF%}{ukW82{L|DlQMG#VBWU;Y?qZR^9f+3nnD2PgAZ4hG-3n-#MvSUS!G6_jA8YGz@ zrBDQsjBOxMB_#+6MlYFjA`H>6NKp{Y1V$`TjikWD#Dp438DS`dCM<-8VD+UN<-@n?tCe>)MX0(<@mPha{ zSL)mM>-n``%u9a)tEy6!DO8z}36#s_e^>R_ujk!gAG+W9iXX#MmzIi$EB*Uc_;Nxd zVFnP8<4ZvVlA={@WY3ZA`YTv&uj$Jy)*DvRFoIu(yDDwhQAt)=rH| z;PT7m|6=Z#cbzYI{kvj5wgo?CSV(adAR5B4mESVZigg$M2erx(16Tgq2III|t zK5TUH4i@|MCn}~Z1Y|yvS6Ua0x&C9y?~~>a$c!`|jlCo#F{Y5X1lgE26B3C^r4T}f z2$N8?)IOZVnBYoT|H6|RnJmDP!XwZg0mCZ^SWk+1h9KXJP)7VQk=ihlARuuuKQs9w z#|iy79SHP6C?IKJceDXOhNh0(gEvRayMxul!OS!w1R{1ClB|7&0m8~s4i4cy&zo&Z zt{L3}GM{E%MaMUI*b3l*y!AuXsksYX_mq}R*Y3VMvanHV|gbO)4OR@IbtyL zdnn#&_RGZLsa0jxVP-RUy`u!p&5@klV;8YEobw)_-V@j)sf=~9!3+ra%j{z^M^m)`O27sKxJ zgbzOExbvWiHBmdu*gEq9&n)q}ANhn_IL%f^sTm|Y@&aXsPAe{0Sr0ESN28y&)ux#D zXjjd+1MO80{1t_~ZU|d#53lm3COClrM=7^nqY(nrNwSLAj~pewF3E zP8c602%gN+qfMW2Pqc~FDc+<0t0#T`01%GlA!AXN{_6z6LOm9!S}O@v&-Y$~eLcB( z^QMs-5zdLrW!k4H0z7c-fZhAC>G{-&`l}L;md_8x#th?)ws+##)Ofmi>oz?8l<+u4S2Dq&IFi z4r2(&o`BMY;LG=VPem`Ou?B34eo`4L+Na_Y?XlaZ-z&#iYFU3w_3lTrVz-=*}>_*;xtDZQ@xrb@gzdE;FKpj;* z>6-iPj()|pUARp4-6Gh~&Mu+-F<~7tM)Be*t0_lCl2wH+M+=$=c|=hv<5>p9{G2-Z zV;xNKHc?=ugs>6Kh|6O|67ISlO_K*t+&j0SZ36DP2Y|QQ z^+AMm$}BLILNJh+_v_8g9r^DB60?eqvXN?PH9@P@9I)(?A|hwJS+fiyF@&IrKvHeW zBpz5ogp>xY3A{$=0N8+Q4)9o`*nJ-0I{L4W5MrblnQY)0(abw8`KR>1xk zmm?F{p^%l&vl>w#nG`ejEC;na#JrslTMEd3z}z`B(@t<-`vXDnd?8)pG{CLug9gzN z3hQ;&mSd%Fjuh1Uo06KR#Kpz2(`aOrrfz}JL;hWvX6T}{)zHq0 zAbyMnd;m40D1eNB_GSghgo_dgnu|pbgQgvt>0CK;=X$*Qoi@N3Ha~-~=`pz=jS9iw zY5MpiHBZOzi+za3O7((bGb1dHN()+HL;^@mujbCFVm{ z*X8Mq$e53edlqorxSR9rIF2W3&DPy*dQP4pJ7^t8ZA3$6y>0-34nUiLWsS~);Ewr* zTDE0dsn-l1<(1W%Opw2`(b0WCqm{;@ND@Q652Ac*KCJD5~6-nf!!L29O?NyR+tCUN z%!bW0)rAyl!z{GZRSwEM9iC82fF`JmYKoQUs5qs{g-C-bzVhRB@oj`8iI9~N7A!U} ztV$sxC_#i`)YZ@%lo7Td3(f+Ns72vu+1a(`5W`3_3Q1u;)9dBvs3ixmEhtOhuI5E= zkz>l}Zic-^g^EL7<-~}qy~uyDU0nMj4$PqYOr%}k?#+CeOiKJOR44~mFE+ziKP0)*%l9>}9OG-cCWCHi7SbEBg< zmv(^P7n<2$c1 zUZe2@QKIf!ya5)IXdkQ22A_pu_U!kL-fHjd%fqufWVw8NeF4+nx$3zY^mzxX0l+{Z zjkfkRAY40c;%*r-$U&0Ka5(W>nCIdHX{`{<6%!=~X}H({MAN3U8aAkvE;sAhS|N0y z7f)fN(g)|>(v_mf1@-qn;RwC&emZN(NKJ&%HY(g_2fV7ALyMfXAj)4nM=dHQ`y%Pu zO+l!I$J%xvgy2xa%*McbQM^WzJbF5cP6e7_Zi47AcvzuIWm`KFKF;nQ9PPiCe}4;S z*Iscd?m4eEb$HvRF>*QC+cjgF6x}gIs(Y7%4lDi5otLui(0ch9kCqQw)Bs9iT?pXb})~s(>>o}NO)!lEo zKXsn=<@?3;p6%W5&G+1N`}3~zd{y)0|EsBiqLhauftm7T^t}U*+&Y!GLCCJkA&nFcb$vrM>zcTi^ zRNZX@?zZVTwuk$~>j6apMc@aJq}mPxR|)KD3LlEt2*?N>AACquieUTb1>4NV93(1Mre>HG>^U-$%3i(1<8No+5uOB`b+GrRsgTVE1a$_mE#vwZZV8+B2!OGqRyuyeV3ZdW1T zWznV;i5r39EL@F4L?$26IA(oWF=NiXDq*E;Z5oWfmKu>|YtaNC zk)PBaGg@Wv=XrC`-LkvB2NO;9LnF3nHem-lHqAL1TyI{48XeYee(jxay;k*=t}&#T zmfa%LPa|Rz7sV4aaPb#oY*}>hf7%M*Z^35Xo!@7#E{_KF*#?Px89=IxbSb$b`WkE5 zD&)EsuRYrZ{4;U6x88Ot=bb>-G;3^`-DU=HPD1zZLq>P# z+@>=A9+ATGn9B~Nwh6nOjtWwcg|V(Q6}Ko=h_j61EP?zZcRPOQApq;f$y}V@T>Fw?#vqdjKlC0IYWpTiTT91{NX}3+)`*=yQDQ|#$!3lz?d^D z+hcY;GcsUC0Stp` z(@i|y9)Ewslc*=~k2rB;oM#)uF^pZ^#F|{mOnfh-)g*Wqgcl%FHW?^?`~PGAv`zE# z)($^*0(9$<;{xbiIds;oeJH{ zz5Cp$$CiS3#Wy4t7bs;yf{1TC?P#GC5xtRk8IOXF5l+ZpY-Qy-sQ{V?P!*UEQ=bGJ z5CeP;TB>f%5fIHrZ6f@?EwEnnUokDt3a_X7=%1AMt3$8CPqp!Asg$USo7wY>PVTg3 zU0R;L~FG9RsYVxscwl6IxQAtc<8qQd3N=Jd1PTz zU@idI0muQ+0o6sTl@U0W2dwo{KsT<4^$P6>plp}*a7FhDSYHqYTH!znw%Wr@InBhV z(mIkiIEJ~~1@>c)=Dx$As2@lN;v@6@SbBnXqw-2QQkeyJP;`&*2p8Qh8)n?QflM;* z@95R7TlnaA->-*_p;~SLcz<%5ZXqQ9vHUHSPC;vBz6Q)5tZM`GqJBjM%oTva22Yqf4vg)`b10cbqcbc#3HUPd)Zk~(O_qH^E5a3@S5x- zvuT|l)c0|}=91kg!@@3|R6~C?^V1G3zWULH`i&V)YIT8-p4XR4_73>RZ+J|_RYCzv zmv{!vT0MS2`)}&JT!`N|z2C)j22a)$1(pV7{t6WXhy`S^t~`wPHe2X6aC9@Z)uA+boIa;s9y41TENtz1>{ouRg2RgzOns(M zk{7pFHM_fgeGI*}3WtKyG>WKEBMMku?MW>?c)?8B`z!XbxWES23Rg{)BR z_IH8GsSeDk*#fh~Y&PdO_3XNf{ip5UtpGPCcKcpgS_CrbF@jCcLvVQOCN)m%(Y2HE z<M)X~AnZiET@^|}RYkC&=$UDvU!$BEeL6=l zY_V0fX|nxD_&FVF;ATzmW@;SlD^wdJDLBoO7wbQFq{RK1yk^lE=-gfcdq&1~VWQTl z3L@Tp*^t&P_!}sXW@kr@TPM|@)mp{(KG?#@-j*VHLq>8_;bk$F_eqDz4!YU1zwGss zh@#xJUTFO@lc$C-!i*m*86+!;NPe9fQ>aNZ2J5&`D4^F|hAEyYjyX<1M(Wp9WQ!0(_2bl+iwNyJ95@xJF5H z8>kXao0$BJ`RMu7z94Q&VcJO6OW*Vw+P+KI3sPfVb3ELnS(@LbAHUTfY9ra^?N24f zn+o*mSi9)|p~=v9I_G!$(HJztspN>3GgXsFpR^!>1TsCfx6aUaD1|8XLQlAwxbstUz- z4zpJ_bqfk?#2zDaJfNLuk+RLk+Eoh%P=!*?BkP{`-@Xf7RL>3%)Wee#gD70~g5(&} z)3aMdlAzphx$KTcOgbAt$8S*T`l0K=POv+-wqla38;&Pr<8Ja^-EUUDAP%dDdw2G1 zc$@lK+qdl#twfZ$)JpL&+Y?K{efr(`kAlI{K0UK98M82Fx%-5Oy#6M+0ZVV_)qD;) zqlWQfM?qG3{8LxLLqkD2?~s-6BvX_X3$82C5J4|~5UusUJ1EL{R&C5KsE!VP9v(C( zY>m(pygw)#ccu4?C6>YGJ+=Ygz1+5m{T+jLIj zGW*w|+s6+abmFtdxmBwiG`veYS|#;A0l2I1l18nK*`1$HSS@ZQ{CX`p!3X1WZZymF zA?%-zKGuE~&N3@`)o%=3UD$7oy2@hSxV*&q)??!)E1LJ~Y0fij_Zc=_yG@34a9<_{ z#MIzuWwnl6SB5q**3SGmW>Lc^ny7dgc86-J9FRz4slZH_EG8_XLEF9h_3~~em&Ik6 z0}iW&W>9>$9eC_EG3hXvTxTKdwwJD^(e3bMDYeOn!6P~7Xf;WSoL?C4w9b!%vAn?4O~$b{h@+RoQB2_sh(5waQ6;8`mzW`X;Z~H@nvlB&f}ma~ z6C;Ch;7C>?bKdCGEYUG5Uj@kB(&OUnQJRgMW7CyQJ3AjW+GTsJxzs)?F9UpHc?fFp zsWaQ=2|@5yf>BXv=wo4J;qCR? zmK&dz&74-5ZgeG0Jh()q?t43&q4m>C-&J!~TI_vRlZ@<@*IRnMp0=$R#nrj{^UbVu zviGO+Z@#>`iCu8h)-{gfUB%A3u4JC?t98D*I`do1+qJ~5^X4aJPc6S4KC)1rCLgT# z-h1x6es`Yq^FC_4&j<5rV%=+yM!Jsrx0Bpjv%BvZ$;H=ZsqK9Ck1ywCmsfu0A}i3?OyudOTOp)!h<@bL#c!XgmD}Ty*u7 zW}nwdiaW6LVV|k&c64sneumR}PUBd&lnB`HjO58EI2|5Pt#1z>Ms6E5*# z&5ip8=2)_ZT(bT{R6vMZoPi{3Un!^c$a zHfb>fNZ5OkzRRGZ8D`9ePzI@m}rRZ`W_%uw5n~ z$r&4Y+q0)xAlZItf=iX2r2jvJ`Wf;o;A;3A1=@SPo^D4{M4KBFLkdSu zOCFcsk-FMHze1lqUK1XOjNF7GYWzFy)z$4-&5vG}ewewQ>@;#HZ0}5#+-?ZBAnluM z)65*oXJ$rZO$S=e9i5w~Ol-sOYbcZpFON<)ErLaXC_*LdOqskxHA-W$BNrpH(Mho1?5{`yvB}jF#GmdmD875DR`?!@{u{4-^m$70q*=%<{ z)OFD_ln!3!LJN*Iv^kwEb~xHMo!cI7;@b7!t8ac7Hz$ZKPMTl02P%f~_BG<#G-s~P zraY%D#>Pu{Jq$yrcPVPs_rzXCDLYr=4`{$5eWec&+&_)?>`|;q7)coc{#N_?-^%_R zUD_MNAh1wVV1j%a{lCZCw=IJQ^=r!M9uxQL-@|s~kDfP*Dnb$_B8;8&+;9u6r$|by ziBaJShHxYbFnVGG)HEt71++f|E4cjHbqC&|Q?HXb-mo3{CureO<3NzABre0+A9`}~ zaRI90TEXEwIqC9ermhr#ktb4CSPXLG3!fqS|JCTgg(mV3F=O8DYN|}==E_0quD3<+ zmuN#2x=vL^1{hIMnLtt!LIi3wHAd@wgQ;}&zu?&XOljLQljQlgZt6KO{>SPMkL-19 zM_k`b9QC~is&0j-d$`+Pp^&(_Fd!r#ok~W=H25{It4g%uZs}cFU)$At#Vq3(ti%_~ z=NGk<-W^TTtVu7FUllVd*1e@#YQzRqy+h^Z)A|fsN~$0o^O&te!prJ!i(41e&04L6 zHb0bM?v`@`#x7x1)N8u8Vq=EwcjBV`(BRxxd-Z>meFC|GY`)23wL-1%ItdG|#13a> z=6>xTXqyh(2f<7D$gaw&~`4clX!|{?v+L7=`RnlBW`wjX&4Z zISK9-M1`;)V&{Q-l4FS`0jX}YQV2bi&IRS0;Z6^kqcHPOfjYkgmq*a}{!9w>_2m$y zTZG{WGAXW_M#-_AIr7w-2Ry<)_OrWk0l;wK1q zBEk9Yh*E^GyGw_X!}>(aLhXW&{EvS_N_kqQr`%z%my0gw_EYTw$x2OPnc9&!{@-7U zH`F87Zvdmuv8bArVU=$&*%7Lo;vtGxJdpYbY$BfQpF5}J0mvQ9@`TfW1t;bC@mP+aD(x!uw6j1iGP=q{!YFi%m zC{T(rrK&fQnuWFa;q@ICCqj2NlD9RoytQ2Gam8i!9Fy!2Ut;-$=HhrF2#Od3I>kJ! zf87)hU=BmcsT051>8(6TS5@thVD164AfcF1u-gSfxlynz5)qurP0@_U2*VKv6whl= ziPnj{3NM$3JTACwRiA4)x;lhJqz24|3hJ?-)I?$Ui1du)CJ31%l_bbtX1iG__Un3XZO_dK!(F`?7W+#GmPbU8kI6c)J$O1QH5HV(W|ZtoaLJ-2}qS7 z31~Ez=fK#EjqL2z{vK%C{F%C9_7(~`Z=XF1X3AynB>VJUb~))XlhgLhH)I*}kI~`F z8Pf9`ef}3U*?#G;j*Y;*iTxpvA7kGK_}XJ{?AOiodaqI2`SagX?;05%427=K5L#vQ zIt*NG3lx~x=q{POFT%XZ-(j=S+jt}o_6ahueV1N5y|8rUOJkf|3}&l|mK5fzh?R)x zv!pn*&Cz636wbQJ1hFhsxymET$S5|Qx(|gSWniP9RvTXL=#kpqu=l&ZMHGBx#~Q@? z=5~FwU0^k`{@-$0^8QF6r=JVTbHAMWzjwl;)X$n443L9V%}ptzLOCu#vQa26zg#X_ zp!PSc@GOXw89x2mpJq-L_=an@(NGrMwI0>I$&8>vSGG`UKoeDAMGH#VaGz=>SCWP9 zGBX+Uh~k^bV=La|!VE#G(JEA2ttzzNiIuR?!mw#fGR8{>tYr3Z=<6k5j+PLH_HNe3a*tVTwi7;C zwr9XT#n3+@#+lGtXStk<%C@g}?}H)7cD`@mBPFaF`IiiuL1E(md_}!;75BHljC;?o zE$-)tB!fcGBYVp>HPJ#4LLb`CMIgU#7wn$UhDXl(FT&b`#N)>S!C~CQR)V_etzMk& zuRsSr5wW44>qPm``WnUtW8N?IB?xQs4uTO3)Baw*`NrMSM59xEtnxZ&Z=KCY2l)p0 zW^Rqm4$e8#{iTrA-TVJj12<=utH1I84^BayL^V_sL&%BTM^?%2eg%5VEq*xduWIej z5d;Id6%as}7K#R#=j&BNWUE#mx78cs@10`saDpXI=BI zJ*!yjQ8v1cMmb%@*&WY`cZ=(4qf^WAJ!0L(@uBkF@0rCvR^}gM?jHQ+sGm8l#g@8J z4zK-x@_`5hC(Xuniaxc0)*&M9C;o@4`!E;GK4MS`9(0tZ577lt@a*+^RId}&>K|3B zpOK*^ATWm-tzy4FyWR*v`ibDrrm{_qD7}lI{b3oO)@LEy{;hMWdxv zMmN#X9-qX9c7)Jc?9@~%K}0~_9Y?429$he<0RB7(f}^WlGelhG3bdg$kpu5%4%(Mi zttuLeT(?mIB*4$xcNH@uMNehq^^A5ch_{1o{7gn=XUx@?p1X^B%p@j8jFL3dGouQ$ z+wGdg3gEcbIgPp?cuZ}c6iu=-g-#AJv2WbH2#N*GwOw)`-#DCy5~9}t#5o%m)?j%x z9tTVtE$Ij`RtunfvuV$XtQfRhotGwbG^ElYfGCJ2k^7@RB||k+e^5x)kag;x%z@vg2OY zedg|lah$Pa8ZbK2&~rTs@St(6qCD?=OIp@@&axWH9j<6PM&E>zc+Bl7Af>5YeB4f?QyNC5DgzkyNM(L>3Cf5Ga$rm;cdDPga@x|37x;9yAja zLlj(YKZ;rkJQ651pVj9$a?w_}k`heGCE{Z%brm5Z7gZF{2jV9{lR}y+R+|HXTnvT^ zj-P-X57UkIIhN;6(BVXXxAuoXTpT9pniFfM#;jnN2|`i}pKoaL0;DlLg#IF*pq?zm zM=&e#Ff9~C3Z6D;jGq4Wd8H%FcWFLpvaGqbBf+8X!94In|37u80 zSZljGxO2xJ*`YfP-@srS|Zm3ZS6K1!rLx|EO1d0+#5pbV3 z&>eJz;i5Qf}4!pEI+e zBdfjW+kvU7aC^*N4>Lj$(9PuH!;Tn5CzJ}nd4m9=fr$~2VxdK)b%ZsO9*Du=a)t(( znTUuxX2CSqwY}YZnspOUuxTB=E`*#0Ph*aN5o zumf(uATkFOdXXXR*5^E+yD-{@N`)dEkC#XQtNwHS(3EU^m_iVQ*Kk&2?cd6BFQ5n2 z3Lyw0rofO!0zeQB0k~K=03ZkxV5uu#kK73gqs5?4ikc6G67;KHe+tqvB;QNtlah%WZt#t0Uga01Ezry$AdgSzyN#|LKN=BmNE~8xfv`=O3&r$FJF) z1cW+GE{9VOX5o+Mbg{dphXXyCL7pQrp%O8o9Y|Csk)ljZp|V<%>LN;F<9s)$9vzoD zshu%(rf#UFZDsH1k+?z+`}#dX@Kc#0vcc4*8SdeJOLlQ~r8U^ZvXtIdC>AK<0<{(} zTP<=a(3KVU{QpxmvUGi9)^zY6u`jwMP^~3=a*oK~3A;ATn9_bIj!J8+M?RDurenio z+UMAjriOcb#vEvDjV4|Tpjl?gnBOi(jC>5NZJHOX+w$@xljrg2+rCKH zF_@Ib%|)~LeiLROS^J&}Dr=+A-3m>!x;P|-WHk15qX*r?-*taGA9gk1hT+c{lR4GX z9FMB^nYN+TbKTYZhTHa7u-%HzYg!Ox4ja(5L;5Dp8*Ba{BO)KHZT<;jR-5s#-Q?`O ztLs@H#X}rcSX$hWzr+weVXq~mw&`Ot3}9eU++zC2z1 z%!IdTsOELtVbgJua@)*1Ea{7Q;gZ4WI^sDj4zWS#n#u$%a5{`5URcbw==dx3+D+*ly3jmYrDgVtO=9 zI&%}xg5HPdQALTYOYmhKX+k7w$U-LM$2|1X=v3+8n7zp?(-*=pfn}@J5t9ti)SFo& z?UF|NTR$F(FNhnQYO3orD|9H%_^Gc<5fH%pX%a+c;@ff>;UxuaO@?1TA{VuH8?JLF zqt^mMBR}=+@n5J#v#xI1VimYcni}O_)_J z9XF)VH&}@TP?3GwrHO+&EXx?k0W2E=1L@lPeEYnBarv zsm=>BJ7A%(SMKZ=Q+~=?JU_o6UFVYAGBN%DS6X z@zlDroFLJ5ix*K!h_M?3EVF1J`Fwmp*+{Hn(Ei6KBWe)eC)bCC&|tscMa*B(_a=7k zGBO?2ue>*2OZc!O<33_(`|fyitNZm}j{f&B(3-lVUnWL}bk5o^f_DzoB-$|19HNG*{Bpt4%3!n@ybo1$Ep%EsO)dR*U|Q@KW69bxHFB8plRUG0y;3%!_hU?G&7C^@V=5bB&`vgCKr|| zGWu<)t<4Y*1N9#ny7=U2diA(oX8z~o)37|6ByNWHb){8SAr*Z?woHK*sDoRky{O%h z2GeE2>od;?3Y4NMSZ{3h8R70*PQp=d4`plMn9I>aU4ADs)_&qykit6Q8;IyKU1>`( zX|AYOQCU@DYmlgH z7BQbVc!Bo*L)ttPW5OwDs8V!@wM9ANj~`%a!ky82sK*m#dmB})y%G_zI5y{~NJ9jfb>e>I#PKbG<_JMuc_qZL!m`QMkdw_rCMzc#K-lU1PJ)FWcu9?>ai&yz?FM*~XL4dhyP? znu=G)URmvx)4IviOk-3@R~ukD#g#2^*d1DcQ9w~~)9y>(p*`pl@aXH1Hq6mQJqm96 z*$UT;JP*1d;Kgyk$k;)uJM0=4A!Q)_yIxDJS@w43E8?ZimX%6TB9V$TBybj#f$#%} z&LC7y>gIPErt`Z96iV+ML~VZfbv=Ev8;GT z{KGabH?IrBG`+@iwrKEZJBl{)b}r@4(VPmr=!w?`a*P@o33ww>XPWQ5_WJ62w@HkR zV}se7tZAW9jQMDDLv%a#=1D5q{*DUJkz4H2hxYp#L_}nh+-I`maZjP3XG36g9D%GY z5ANx`HWPN~k7gW8YWwAPe4Chi(*@bJyby!7ZrY@Mu?h6ho0&PXa7r!j1sX7Dv~}TW zOk8aX!=nS9Zx$NdZ4!ax@MxHL$<wJGFH~QlWP6nL zWX5vx_1|T*bA9*V+smP{Sah4N_!FWgj-SWuY=oxB`=iEZF|$XTX48H6h1aKN8@_@p zF8Ar5(B6axofwMtG_yomhZ#Y#9NmbypLyr8mxJE<9Bi?5IcgfsNun_ORQb;|MV>L6 z)mrnkfZ1UNY%L)71_{lc;_uO}np1k<$|bc6>%8D_%!!=Bp+nEZk{0nA=7C^7eMSU{ zwF#KedGy8P$U;s38JzUdXbLO4gQ4#V1CNvD6Yke8^_l&l6&%p<2k`4db_X+cyucOA=u*w?3qMJc6Cr)1}x(}m6U&=hvG z4vdb21}RE#Gx9c+=*QU@SU8ZYBu-Z9k%o(n*(;hi}FWp*6UHl)ZR?6eq`KA#6~JJr&$E7CnH?a zN|&Q51%l23eul>-wI6w_CO7amp{T8miLKnSW9>f#ps%hG>l^d9bp6tr--pe*^6jKT z3#t{TC(0k;-QR?K{2s5SZ69=YYc3rh5Z)6feqY={m@b~^3Q-K$fTcKzsxnba%$d$I z2NIT<6&a#e8F@8l^VrwmPnPu5n+)lqv0QPG&NUNPN5a+<(8}B_nn`DH17jn~tP(#R{)UOs!nKxW@kaPrx+rwcQVJosLJ2JhcJUnx;}c>E=X?$($&Ao< z7&53U$`QNB5`5|{aVsgic{K_(WNrLu^l&PUb>Ds#%L!GRW4Fju=m4hi%4wHuOr?zq zJdKRE8Rv53$i8;FM=vZdS6-alXAG#y;{wxe?!}FG<;}Er7)%nH=wb@eXEUbv#|awt zmz9zjN+elrISG<~(GhukiN>R{4$3TJ^z!XR9;c2p7qkwx&E@p%NxhDO7qSx)@IyDr zI6o1*k_hg!Xx_AZ@iBCo&O!(JK0WvAFRVvfi9O_RzH;Rxj;C@mZ9(tl3Ufx8zIxrC zO|i{rLvSvSzTCKp^C5V#>p*?cDUAaO0zzj(1#9v%*$3f_Wtyx)bsdy}Y0H`{n+1?lHjOKdexBZ8Fym&8FNR^0-cN!| zAopdyb%JH33J~IeU}T8;a2pD(yBuSIMIeaeN?iiixciawvj@U2zYFG$M%||2D0Xz! z!viLi-%QTR7$~b$q&&AwrF@{MODgWCCt^9;JbJ#Z9~vb0_0J%F$VSOVh53IDkjap! zJ6$S4^doGCIMyZ0t5S&Jgn=DI8596pK%~D+sDntO5(*iOsP=~rhTBeb{x+b{(gv%Z z?#{vSkg+F@S;CDStbz=wnzkZXkSuLgMXIK0W1Qm0N-v{JY|<{24-U0%T?%2YG^hK? zdZEyBnnQFHh;0NSM3FF~Sza@^c<|eNNTe-X7hcH<3ta_tb7$7)5ch89Z;fLoq*(`9 zJUk!{yYbHhPUdiyE(&?&f`oh_+yl7p&PafxR>)c;&5ku|9@!yNEE^ zO!tQx10?V0oC>CEKTbD4Bjmk#h`xCmJ})=;==AVf3y^xKb!2PcWF>rdNp$d;A7{HJ z`g|8b15g(vIQcX4v`5d!&9*m8Z7s<@&y;Nv|43gagMA4Vv9Q~JqlSddXKGF7gKecV z$IEFodmrl@@%`gXl-L5f@;6BZ%nI1acWPCOzDny|df~4}!fgoz$-waybkMMQhPYA{ z{g!V6QD^P;S7rq0QnVd9Xk# z7Na#4N(I9zUkBfGmrQ(>_sR3l=bvf1dY=3H^B!}zSe@s6)-`QwzK;8?dEHdHdk=hf z8t&cN+`2ceQisKJuJ2K~@4qQLb=Od})vaUA$9BzKKR4yiJWH7CkF4_(4tdWjxW+U} z$gghB?|fqm8S}~WojttG_sy$c%kBHOk!*S2on`UkW;}<$to(lQV|l#!Ths8~uQuun zZT!rCa6Uie0uTu&;yoeOA*@lcp<N7>9^u-UR<`S;^eXc`8LjbpR!?77@>u-HuHmj!ML4mx{|H5Wkh)-BQRcE%T3 z#CC#`8Xcy{U2>J(ahVZbk?X^p!c|9PN%_7?4)Dj&n;pQay1@nUGCbBSkG78 z^=C3Pl^lH$PEPvio3nBhj*TM$DB$QjW6q`H1bKZFHp)Qi2e7P-pC<9>Y7pwl3gjj> zTtsTHj+w4f4v^?5)rTxn3c;i^jnLZ}EP>XZU%YS3?d4?Ezo}R>=vm)b2+BETgyCXx;?BrBPW{Q$jFZt_;r%>_yrwN)&gIa{qn5k4 zFLBer(stCF>$JTgiZ8zcS(ll);ciXF?DP|>3N1c_G(vrv8PXdCAaT%W%VlOHl0_p$ z+UhUxJ5$5JT0Iv<%;NO0*ygIKwl0f|<9F+XT?c4)OmD$94y;)Rj}O^mnv*-K2TkqX z3Plb$$XC)}zQc^@zMByH!*Du)SZTv=H)RGfmC{I*%GJ5KWZwUy?{;utJt5kSAwsG` z=LNg~VD%~m;9Imlkusa$hgc)u1j;EQ7(prm)IoT40~q%B1-^ODU4*$IAQCKukWzSM z6$qrXDGE=fL#qs)4hoHk}L?=I+C$*nSW$D}RlR7nkNe+Gb`VB4v;4 z1Pa_}7)=8)eYZ4Mcn6({>&N<-%*M5q4GKKvWlri#j3D$ztVQS->V)k zCpo8JcrfN;^E4YkTuBgeQg|gUEM~8O0n>_M!^FhY#qobzfuHFzDt%dTeNO{L(MxBEcr)NOgvu4?t7`H zGV)(3;gy9s3l%zjVef2I3iiw1=1RR@Eqo`rHhflY__hb7r%Al8n$@=6{jL621Q(aC z`bbzm9p2EqcjK=8vLrI;E2h<=hzV?673~XR`4%N4IlWZVDv796=`h0fl~*qI1sOtP zIzsF$v1^niw zWFFJIj)IB%x#aJs-ggh`Pp>HPn!81$mFQ>_x+w-V6EYBq2TWMG_X$%+Si$AS>@Sae zpR>k355JbkRK*|!Rfbv+90f~~Q=w}SKJ$`4;*zKKDh zy^`md_ABScYb^?6$9rUJ4uax6eA;FD)O>H%Zr=WJpN{VEXz*-~{Kie*Ms%9;aO;;0 zPU{v%h{;TSdpLd?_qMYj*FHP(e3Q64kEwOctm2p2BkO9-?VEY)FA9rD(Za}R>fJxk z-w^+R_2RJDGJ3^zY}! zUqT1N^#`;**ZKZ8ZEf3a_wPAfa@(D)%mV?ifQGxBIwIOpd{s#B?~dL@Rs6!2{J9UPQ1om_7Z5I=93vDV|y1(V6atT{-P$cltw zLedHkrP33A#WFxnBDr5#MRj48xDv5v4_W3 z$?=mP1>8Dpxr>}MgC1w+*v??O3YzZ1WJ%kMuk-1!LJElYqeAjso5xIUJ8A6sEq^^< z*74t5)p+s3L$10ty$W%pYlYDBIltsngO`XTLOsEzZ{o8tH{E@ATkGeyt3(RlH7i>8 za8}UPID=8JMJn|E(Tt4=HV(Mo4Bq%{2Xzmvqqhu9r^vSUhFGq(%v`PnU>2kb|~wBe)k#Lh*TRp3Zx5W4~Va(MT>~ zm}FIY8Zzm+duF|5dcVIb74h+7$329XesD(}HU@GUj1~I<4nTedIG=cVNJYAxPtky~4u z$5?Y2e09rf8(8h*$Zsb7cHQpwch>y!s;J*Jw^qI5G1q-gRCVR6eq#OKUB`2W-K_m* zoWynAyzXu&m-7=HtY5D1xo*v7_+9vQzZaIy-SNvPiR;YeRhGId%Szt#t#2=@`ORwn zch%!xAG8QSB%Z%ub%EIfAPBFnCi9Kyut=ZBcrF+^_#J_ORof8NqT#g^APztxv8fboNhCw(Mlhow0KGme=p z8)v)vJTF{(9gK|NvIvyiFJ`i9W`vJUHjcOGnHx6I8IIYzYbIKP9y!HDHO-z%aB-Y0 zUp)jgCeZ{fboIVoZNj!clu3DJhg4}a3&`8z6BaY)8N1;cUnWfo`X*o};;poI!n&yuO_3 z&7;B1nIs(ZFjTjM^1EI+*R!vu)-+TOLCP#B8_v4(9pd^@p565O?vDx*f~G0r#2~@u$i4hX zWg;8ElxKOIzgE$_csG#7R-lyjntb9e_HRI-^jLJ39HVcx%59C6nbF~vgw`1f$k`eW z&dWufdQ^;NH_+xf@X1BGJdZ8SPQAsAzY6Bu8zkY>qH1O+J zw>>e;KD6hd`N$}3mW+q)C88c;+M_~VaH9X%-+*=s_dsO<7z!|z6rxn75r&wXon5pX z3pX+DdS@@YADz9Nzj?fH_&8?(B11k-+?~g1od9as?XhBNrf1c=y{B;(#NI9H3})7} z-b_QenF)6ZdPR$v{^oLBV5`n%+12%gvl8!;Fy;%^Z7$iVn!a(IT602j_RT`D>FHW< zJI%89wOjj&ZCEuLeOmDZ+O-y&LYr#QH5D2C05c;8!{}fHL`#UCU1{+VM7tO@IAHi- zrN%fd5Vfg60ff&NY&=Qt2(E_whrQrASy%EOA;ty{CLo`_FfzOOqBDQv8s5(4_hc|c zj?kFZQRwo=`7Q&d`0j&Z%aD5UiBvYhd{pR7{lezA|OArf=8l+{^g{ii${jy*Wg7)5)4=UBd`_3_WP0Q*blsbgxb z8TcRT*}lxKt-pinu+F|3$)L2Hfehs!eX$DzI>^Z>g|?VnOE;J)B4icDRONk;%B7mN zI7=ph2-8SbkBkWRdpe6u@KzgPNaS^f*jWz!NQ*8wp?n@XqR}mjD4BG1WlAO_Vl~;V zcbSgBvN@QMA8gs=hC2AcS^6mkCqGB8wo_BLi42)&m%*-Be%x&ftJQ|~!>=rbbJf|W z?R=BkJ!jH7Qe6i}#*W^-NkS2$=KnLu(!Tt?bw3{RG@=Eoi0|%hP6VSud~l050_ZG{ zK|u)U!B48JT#B8KF6<(TUKU_Em&tlI{89& zxaP!Lx`|TyZ6-R`ajIe@h8Mi=Oil+C&c?l~p?JrH79*!TK7CI+x2}0ny2HQB2xx9* z)Ak(tEw*Sf7(?F-*DLE_=;6;|2~J0OtUSvjD?G?1N8&a@@!R(8?fY*{{uV;&*?r#D z&W6J9%7$$QwH&8IbwjaZerKGKUj1u?X4hWS5>;vJaDlA*Wu#QADz$ zeZ~3hJ)fB)!n-~1%bgW_qk}sqHh$xcq|x+8ktB2EUPsf#Asq|dwEl>>X!7G;{t7r5 zOe8?K37e23O5Xk=B;Qw=xUD}%nWo!#ehOZ|_1BDyd>HxcSLl=<5+4l6vGBH%#?O7t zvP+@JK%8!S@fBunxTB~;diPtm1o|#I2RaEomKsIdT{Gz8S_df}n`j33o0~PRa~~Wl z*O7al1RS(tz8Sp)wUaKs3zykQGuJxkvIiRfqLxN+^L+9B_3!39P{$X+@lo;_RRCq_5zoi#U|bTuLT^d|SsXl|P+pXNF!HG`uo*?)+=?6I}z zM4xtVJzHG9jQM3!fYI$vYlysL0%6-QQ=4{vB*JuI6^%T zIC;&kxMdS{WQd`eT+DuMAFupPHzp8_K{6P0$lnjXUy=3adi6S`Z=av4-!l{S&F`qY z^!(IYn4hTctofJY~D8iK>0_d3ziTekehx7KmA#!r;(GyYf>oc=L$CHM%u}r#%t%oFOOM!3T;}h@Hb9bsRRy#W<5`tZmphq z4Bm~gl=u)k5T4aLcw$B2g55`T-W=OqHz}+&`fUo*v9mhx^$=rX8@`3#2$pUjri9pxINWMY9&^<_&YBZnuDR%J8Z6B`k+rQJ6D-*)njKv6$U%I|dQLdnrm}1^ zIydK3I?K$-tTZTeHeMl=ELQqlUJI5HI0|D7sOzF5cUEK=%ZKG_@v9Z`vY)kRvWs2j*`!3k=STs0T&ogSG8*nR0!N%Do zj>UeG84tki7aIh6iXj7-jvf*(9rQrac;$7=dFPk${mvV`zn9@%L*cp*-6S@M8^Xb4 zJYad=&e{_`8WTCwLT^$$OUbVSk<;VHGvStN9h2(*vB%W55$N6W64OtZYmi9NGGfch ze_a+V`hi9I7R%WTp9p7hlUW!Y{PfL%$w9ID8O|QM#c!6+sfE_Mv-;K!uJ~qmB=ZPs zUW@2%*rkIr=8GV4uQOECX{howk6ZtT_GvSHLvD+xv;hP496%Tk7;CTL{3KA52ItTC zNFsh0vblF4I(4fe8&oXyg@EoW+ewsU{6ka`uiF3v{}9OnLPaBYb-A&C)K@M0*Ya$~o;VT2z9)0?DZLPZpfI?Z(>=i%|1)ui)1XeKa?(Y^!B%}VH zP!a&uY~IbgvpWEZWXIap_>*CCRPO3TmAiU~c53?^EZ^U30k{TqPA4GOCYf-Fvtddc z2t$iOp>Lo`D4iXJgo;G&fxuBTr11s}uPT&{74coXmE}^ElC!XAe5Z|HH^ty0al=pb z+pEO+^l|t@zh;{)9ER+>3kt#v49CI?%=|-7uwW>oBoYHm%e%lg$sfaWCVd@ao1Fg& z^NS@>F%n}Ky%Q0uP3?SMFLhU;Uj!`T`OV@LjAtyV@oPm^9}1FhV>N==GgWL< zF+>-ojJ{#Tl%3-gp=M#=c&L<;wjTw5O4lR-t^nHrZR(E@6d|Q3j+dbU)|VU>L}o+% zYp=g(oOfN|jkW7F49!uzY4?Y=qs@P||NTjP|K;8b(|S*^vO-ZUALjmF#GtED2fBWv zp4(jdP1Q~TY&!d7APTXHdf(~t8V|9qc*7lU!NNBx2l_}rJI;M;IYzyi&Id3n)IOF= zt<1pgKI{9&htt4@Ae?%f2ZNDWS-oC$RmV+uuAa=D4ki0So0My)?N8(6e5&cs15P-1 z6(oXX;LdZidZjN27+WXVa;3myCQ&XmhjMvo5#{O@vf@7nh_tw8%&&^0WMf<5c(yy)Lk6R_h|lq_zQe2b2~_?ImM zzxRqmV(2b;?{?ewk57-WMTW8)fP6({n4TVwiaYgMjq@>ny1z_bI(y8sbMZv^l#MpV z;My7Au;Mtag3zNQh_^yJrXA&1Zr1PVb0VhT>=@*DN8!R3Pw+L8E!~qI78}#EuSFoH z_&uJ5i1Uzeb0{F}BDP@G54q*djYmFwYE1oVVVmvfZ)Bi?N*(I*MsLfHKLwen`EmT_ zOs#gc)_!NWVVpZc+#Q-aX3*$`@qUJ}ypYBQWwd;1Z8oP2%?js@mf|i~E=;hd=fPbR zNe{*XO=l5l%Aw!?1)^lClO&+?6S%aES*WVvM9^KLF-nDdHc%f?9ZZfN9a$P0@HJRT zh?S^jBR>*0r>$=+qyFM5AK*cIsKAGKumZ zBYOx#ub^rr2Nle#9I`H2{EC6>_`=xn<||>!-8gmDqnF4XftwOG4n_uWl|NPV@$v4| zSKjnTWFUOQ{SMcC0znaQs&=##a)W9p=Q)XzP?IQ_4j5+yGo&|aU7N1pvIXyC*_sDD zfv{Y#*Z1LR_7skL#nshw5vlg0ItFBY&!GQfSipm(x<^)Civ>o^OD@?V_*1Byi|-hO zHI^AH^BE{pllP|%tL943?biV2(U^!GdE_mi2AtSA0H=Od?UnBP?l!U^Q;Fwo7H}C z^x$UAfPa zjG%Il0#Rew(ay|5Vro2oj?VmsPTb|Bh$~L@%kI{@t202h=fPCW?ALn|7DP0VxJG?* z);=)2I~Z%A#c~4+s2npQjZ`GZpPT!-Yhy^%(ggY_z!5G)6i5S-r>^(?=$;)`m}RNg zPfVpKJ@AYpte?l>oqhdh6_2%LUzLpfa$(eSy}jS94si)Z(DdugdbLeN1mXXS{diTg%3IxaFr4e9gL<^UZU# zy7HrYH|KtHuPw1hS&q!zSWfx3H8Fj@E6y3?)pgG|bi7v0pjgLSUF_yKa0X$zVZPsy zcsc@rag2dS-s4DGizsyHi;g%F1qpy8iwE}yjoh$>K#=|DXgsXw=ELDsuUzy;)Fv)E z3kP*6kFe`(*vM6i#r}rF>FD7(`wtvF{bie$OfES08+ZE(SJ2sX#0Yfdf@Lu*I@@`n*JEAZ!PqYpMoGs- zig!sH6nSS{*@yB|4n6Kr(`|ZYOgv5xDrdz8#EJ@|FkGBONhSAli z5+?V(gSW&j$aJoi&K!5~#>KWgv@bqX-CWe&K-0LK@ zdeJ1=_$x!vB>HpU)JyvCQRMP?S3@fb!x7{49r$pt<(ZYz8`ZXYGJ~h>`|sJJ$>dFw zu?|A&+L5S_Iv*oy`Oc#6u3r|Hrff1^GkFTM)HVDzK>PyH|CPHm+QWD|Y@W}dk9E{VE>q~F@tL+}_jGn;+VhvpW+^Gf7%WwwiJEjx zsC-^ON{ZHEn+1|z5YG+zUJ@tb8X9b8mJC==|ks+p`#Mk`lLU|=d5`{&J{4*j0~Q9l{1Wts0e ziE>=c5{cPSQDjz@PN)`KWO>bNR&a6V(N&QS)&U1b&d^{Jc;N_mN6?Q)vdB38Kh-9e z8|{J+egTGWtWNlzzOBx>>8HM~WP!BJJo}M0>fcVABWxuP0mkXaNkTAeejkH2ap=KT z-CUbS^%IX?ZPsq(nQ4rAHt%n>x)@F7L^^FT@8O%|o}=b2_#p=$FYhw+cx-41P3Iy0 zcWL$t>}(f!_pWa3LwvaF2f?Hs2C7l;c|@SIH%-4ck6!!p`ZrrWcvgFG+w}9;kpgB$ zbksq(%eTSdTInV_j?WL*{$l5c=UT8PHD-7NoEW-alIeZJdS@=|)h=?Nqe z&Iw7x?B+(%)7YJe{T`#Y39v=~B zw}6iz%QwN{UHpyOX2J2>H?FMuhHMFRDcO9Dl(Lw?*Fo7x9AnpN)Q@h)fNa!4GBsXS*R7$P$zUnh>`*WF-!$lN_!{bKFb5b;Sqr!cjd8(A>hqxf; zqU_$_+30T%5Og$4y!<@-_|TZO^v1=*l~3X8=j3l?(0Y$|ft+UInl6}r%w?;` zYY{AZQ9UO_&Cgd%ShCu2$7yVh)!e7#Zgxh^-FGq!Fl zk@7dL3ehMY7-OaoPIJ5+#Ot`{R_m>Jn7Q_0kL42x`e^Yn)5G-QQTFJ6o0dC0orhEH z_#=d(-i&14G<3{-2xHs%&dIcC=yYCwa{>EeXG>^rPcP}4UY5^jJ6=2Xz}f~2u7(DM zojBsS@QHeY@gYz@<{$io9-d&p^*C0>N-J)3@(YF+NvCqqyFlS|9s{E6%u^n*rMrA{ zM*aJF&r3#)8$JfCvaR)%cY@=N5jF9*eni}HjvXn3Pkr*OH(K5?@TZx&EJ?NYw z&OFpPk_Z}znMP;+-;Ty(49GB>$o27wnAPX4;d=Gmr+b^>Zus+BJ#RaYi}Q_VCT?@3 z&IsPBD}DTDgmigp=e2xldgS$dTAwrDS?gBoQ2tw&nDJ*l!8y)W^St@p8-DGJ<=%R> zqcy$v9cNqKd1c$EdgbADYu8%o`q8D$Z#vPA;LLVwJiW6yj_i^*p0m66P54xdhwe3 zDKo1Y-aLJ?bptxDG;0bASjk%S&YRN?r*6ngu@ZuFSWJtSv<6F)j21503P+67(I^~k zgElrJJ~URF?BuPQgk92 zvXi2)9b6vCgNur#B~a^LTx{%whLn3pieEJaKlWwCpIT>f)#?b z3TJp(^?#&0@}ejHPg77V-wGH@ALarEYoR7o<3pXV!vBN)J?4jVIlI~C?K3!foEU;J zceP4MB$*+o6SzC2p_FQ`{_rfqNm*$}jx^cpmy9DEu;3EeDLJs;4u?1azDaP>j>{<+WH5Z{2v3 zU2E^WjbkXWaz8+jkrDHJk*HS7u;I%0+{vry+fGkr-q@2 zpPONfL`3~ZuKIZ?idrVIFn*fGE7A4Q^+zxuL*P#0->O{oouLO8z-8uEfS#U*ogjyi z2;>{ZK!QO3?*n3w-~;SBdp>keu@lyV_JY5LXk07Us1&97@vRI&)kdGkHCm@bTQ(HV z$ZN7--v0I2L^Tp{6wcrf3YN;2Pz6NUQ%j@>4pehM=``Cw6HHsSq6A&rO3fBwK#|i* z3KR-NlWM$y2uQoA6@Z{z7U*JRfu0#>@irvo_j^N3q>@TTW)jeIm>HFHGE6s~aB4f4 zh`itm2zn4>hszv(j*U@(!x#@6EiIoL=(#K){KFj|Q=8wfE*r0Y2I#|zQJHY)shTEU z^(FPbx4uXa!Y3}?-dCDC?p5)2NSh{}?|+jC4*k(EK?)275L;=M=1Y0>MMgUKB81HG;(7wUdB`-=(+>QJ>Q^t{;z*F{IvC{hqLtxCS;O4LnR zQikL>RAU-yC{e^2gkO5SK8qMWYp*6svYUviHXSVMehTCNL4yUUP$H1yO$JAV-P(~ zU@aiQdYhNHxNZd~%5-vob@V9_K7~Rwu|lD50f4i~-0IaMbj+axsZMI!j~LSM%}q)X zPzN(3oW^RIIfUHJ3cb$d$_K6a+0}!@N|-)+IL%;hUp{TYNH05B>lc+x#%zX-LEP^$I6i8$`ytocIEET)n7WlBRY$O;pAe(B(WGXI8x=7qdr` zI~$((UfPiK3JO7h#CjSr=H5P~$eU@1Mm}#I5d5?C_jW%t7597la$|5EAp4}LD?Sf; z1n{p{sv3Far^2|QilMPX9xabmE<&{vj@ANlqb!>sc$RKy(X%Kz$1SkkX3yUld*oF5 z7~AW%*O@7|7ST-Bs@jTL7%)Lop=w-IIhHCLl+jTy@NTh3PS*iW+f~!HLD?A&o*Jhb zEl`^HubX6Ly4tY@|K>T;`uvc3(6kFFED}e3nmFaa&$WATrp^0Y z!;;llojA=p)Ttr$_5%gI3c@?^W8A1xzG$@yBC6iW%=WLF%I(YMBS%EqtNQ7niu5SN zsG~RoxGf#a_P|DtZnM`t?~tLX?Dg&cEvcWa}2&jpgrV5#GWD7+xJ z4*9F4==i(Y&3ic1qn3&p67PEw>2E5D+@!W*;N+*BSXAm2l`>P-yy}$nG2p136C2{E zP^S@7edfmpa;03&!BQ&9kkc*gj1uJ@KfeI;`438SoN$A!Vn3U@Y2N%B&}V*E@_$~^ zWj_z^ug-4!{#Ji3REIe3I{9_A-r3_ehI-a1By#;sgN1uBV!DqPAoV=zCFUNZqUa_V z--Ymo3L(u?ycxkqoBxW3oK=>Fh~(t9V$N5^D0OaQ#)l5u(8%S&wsb+Zn>m@>>WOZR z)U+y9eR@96TimJzYD&tylsX2A5;Xa_4#k36)U6eah3KJW@N9pN%BfIrWINR^744Z2 zGMjLu=~>zS$tUrLe=RI+_LP25)_WoBil4jdr^0!sTI5;ouSJXPgX|y&$qLEui|n$s zl^=vDJepndqq6J5dwm$PN2K^&9?4Q4z@u1nnk)qcQF>Hrv$gN_HwV*HID1gOmnB_|>7#Df(|H_DcH--yMYh-9NVH_D8I5H8rl?Uf~Rs(>BA{H49RYeNIf2 z8PRa6;-=NF*5ul$@KlNFy4QiPn9j$gimEEAl2hcOd6p_{=Vb90F+wVZDrlk??BMHE zf~9`;3aTE(JLx@cneXB%x(YJTry*0XTM|=pq!g0bfrhL-PL5}gV@w$SqSB}*wrGu* z;Y#Y|2`C;s<8>axb^in1XBpz7D1}Ol=GSJYZK+Ouk4_4mOYNl_YNkF}o0NL-EqB(l zQnvQGN`X>Ao%L`X*l}%2DxvAzQ0uB{md4uSF73`b)c%Vkt&){tL7h)P@yqYV**z1C z{xtYNNGN(rpyXsU@Nyu%(C^EcWBz8I&r{HKOnm1`^|S3+cyL@xh&%7~7Eu7G8pEZO;L*EcPlsxu!x(R9{CiBtn(dA~LgxYbif{zMa9vx3dC>CbO ztB*j%-9E9&g5V3k1`c{GtXH-oo#~t)H14|h5kEdLX0^XOUTABa`tFEN^-Zk&(KU(r z`3|}K6q32_OmBiik2|8H#Sb!~Pv_t2SJk_%$t6mu^YD4P6k9%@wni!m&tW0Rs(jA& z7-^;H*gyCt2S>?{ib$vVN z(yl$uEUMBX#>@;OL>Osf*XExQ8UyR(0RE?46-p1s#?F&kPG48QjF}-A2dO zf~k*FRHu<$@@-0ry!c^&#r{`XE%-D{eXhQI_8Yow9i-8)T`6oGh25``>w93+b;U_X zsx(Lt@HyLg$_^DmYh^eZo$T4+ZmcOv^<^6VwQnq8MNJ+~YIczy**M3{r^my=HoW29 z>O7R+<2~w;hG?BEa*iqbd#D`zvisiB7zboZNeQg_N+lU*UJ=4^=vOZ_HMmRg`^NQ; z%>}>8r-!<1F0A&8?EI+x@clZiPpESq@pAUQaTI|=?RjHcLhhVgHjeJwG6_=ASjw(c z+ct{Zv7VUw%bC@5r0Y{#YP>2q(k)h>C>z+=5&p;MX5MY8$6)grxA zJ;yqRwR+co)a&kc7JGZ%CwB(PZj)pEXk1RqJQ6PR zDnDYq!t%|#RMxy|M&9ndoU@d+ErPA8Zl#ZckXOZ=Kq5g2>XbP`kc>}tv@O@A2Ga9M zD`zb@yNZXOg&FTiyIi7~7xwpv?KPKbRCN%K;6wJcXomcz zjZ8s^2p~kEs_LQjR`K=pt|Zz^>w6Gy)A8evI?-Rd!7l6J@_eI$&ut{ac`vo>g>4rh zx$J@OUX`h2s&=oEws_Psc(0{SEAr{*a!6Vi;-e}WtdYgwIa2#tosaW989~Gh&daT5 zIQqRr&UzU<_^gx9F%FR771W*)ZY;^PkV>$5Q~z#$T)Dk9LPAWxjnR0G=>nI zcx80YDxH=7;va-Y(AGbcHuK+O6GEMP>z7j^U552=9n-SLp6H~NRX1=OqDOPC; z)x9hwD_Zv~=WKC;R;o5*t6xf@W~7&rs`OhDuC^-IHu9A4sI5wuy7xO$xLyLYSJeC! z4C`cap_5m!w@=wRu_+HNw0;#3LF#uZAn6Q`Q8yeLRc*2=$q%EBPk$cS<92S49kx^N z%Ng{v@4&c^*HmoQ=DGh*w!M!ezEw%8skxNqcJh|jDY{iRGLc!((yM?u22_IJ=(#)G z$p!GIOZ?urpm<{^Mz%cGG6jp)x~R>>6)2^Xa-?yCg^O^B&h%vpji+?y9{GenI9@wW zQ1JHH%iGP%bywA)7+&o=;mrEJdJaf&WJE4hOIO5Ftx<{aAe}jqaYujS$V=9wZ9B!7}kv~soPp>oSw0x7w;j}vfAI(n{iu|Esw#>&A^S9y=~U6w>n?d4g%Vv zpU(@RuY-bX!AdB}-5zEqbX=!nbXL`==Tpm@SiH-nPFGQivD&ayOm#Gu&$X;`9M`uM zC|efGhI+pyEL)dTHQKtZesW@(t8!AME25=KZpyVzh=M;AH5wdnK+BiyPjFc^r;%-{$mx)XEip4XPo-002`dQXb7qceG$wM2;{ z-94_;q|t@Bs5ofbruz&kiNbIl4>!)JYCg$*9JWIK3J}{w6(5dqwjQ3Bn~p6woX4bO zsmivptQD$%2yx8g6Q7P^c4NV3jK{jCPdARbA=7ByHoZ6#eg*Z^`b>&5FgwfmMa#{Q z^@(F+kRPj=p+Dkc>cQT`4A?YSDFTRUPmtmTqOS-gkCTXIaf^O`F1XN6OVhKI0z4lZ z1&kPoL3+$Vh(R?_2CYbib41LN))|}50!7|nK9Olo<8!Ki`GlTdLAm}wSU`}7LIBAr zrlmC`rr3>XDM-pts~NLtvN4TCwJCsv3HHFDMd}(+OBJ#r#t4D<)B4;DpT+)yL;d0b zkN1D||ACmqJjw-F41xcuQ9%xborAF7^+X}W7$FXp(p2n8I}%_?9zwu}Vu%q8*9gSe zKb}Jyf9a**AqYr^Gh&hvlY}Kma4(G{x`r46B%XsO`&b-;1b~MWg9w?{j6@1ZxPR+P zTokbPCGY2Okt9!@(KOC<$qx$=D2q!-uC;EPO>{~tl!U>(F{LW01&~0f3PLCxprBCz zCj_bH$QkLv9JEdpJZN4=jxF|Z*GzfZa7VTjPdx5<0uzA~Klf(M2-b~f48{e)q)<)a zPzsB-hBSd@2S9@uhNU#u*s;|4^BP-LPoL^(pBa(l3NF+`lP z3DziK63J(b7rt1bJsaF*Xp)5UIeRBo0Zxo#!yzo>IAew^*#n3oq?nKjc|z23UlcSB zL5vXKgky#%gC#~DW7)XojZd4()v_c|fEqTbWrdfafxy`c*=!dTnof!a?D3B?kj(4NIY z3bV_)K)sd-djzOf9us+5AdE=?h;$*yBWV`Mt5F@d?XV0RM^Zvsrjig%P=Q1w2Uv-| z3R)r<1k@pzXI9s=y_LQuK#Xh^;??P|K|sL^f?^vGbc3x|{}4eo2-YBv^XY`Piaba13WOMunUMC zXN2i=$cDz|wt^d=LLd=|U?2=~?eck)PVoK%MWkU{KtMjuk-u=x&89`tNiNGGV|z( zDWb*ibOkrU8=iYcu^O5NHS5k5{7 z0Sl*TTYhy3Mc#lKttrz|5cM7 zXYiojJO8~*m6m(wf47Uk|IGk!Y&WY`LQmfcpVz{oyZbo{f*(iD5P$%F*XC#VPqx6% z&GqL{eaKRzCcqx=>qq*;AeaDWK$yP(@9{m8rX`^{I)R|pIq69z9T!?;YKk@9uVS3X zVi*ElZ+}e3xYK^Uay~4Tt;$2VWKU$9*j4LC4+=qx@BbfaWS{j)M;~f^h3{pk;;} zH^$F8wyuz{_0XBYPSXd)uPuE1d6_Gp#PDaG5}(EVjxL~NU<@iRY>zdGYn4JVvTgpW z=DPiL^zCn-K|9{qJq}$tdc+u}5PBh?YVsLdxu>Kb;C}VW2p%Wlrlf$-4^W}N7#F;#n%$*Cs54YEV9eM`rii-4>_=S>;}>EwL7&IaZ@|vW zzX%+mX6rz4$6`Fd=oGd`j}Kg;$vhWy7#gT?ga}zWC_-Ap90xX23QWvU2Am2hhMJfe znGlm30#F@ABnzAm8cx&GWTO9Yp@#7mOg6*>9YRO0aZ^E zNU;ca(P7VWj>FMbVuG>Hc$(`p&9;Ivb!HG%;0FQ$?O;2uUIek^UG*)&WS z))5Y*gzxXG!9H?HB!qZ`LmufT($DEYlZ=NLaX0+H{^uhRkP?!Q<5a^f3-`n9?Dnxp z{Nx``)%54go+rfo$!DCoMtA!lSjO2P8-)9~J8Bq#77;#?1Sn0~k_R0S*HhH;qu71z zoZcpn>oKPm{}&@u;O5W2Mvex~=DP5CxO5M_j}wW;mxMcgzVS-@H23Aj!_+whK{OxfxZUkj6E9n$YQQ+D{tgQL`gyz* z;&4)h8;4Fd$MQh<6<{$S7Xx>Tq!^jNLJ~<78dH-<96=pOCV|u}6Hq@m1H!-)CIseb zMjVp_5Z{6c`u(*x%#w>QZb9{c7MSlC_wp29@%btFgNI=_oyQkOBR>QGxiAZ-NVzzY zi2x7JBcZMOY*;J-LkDO=KYmajU}Atvh*}I2wO_ct-vjaje(o=*u{HuefFShy|2&Y1XdZ;YRaD84 zz)o|c$EnXmiXAgO8p}X~#HegkuVW!n^N#F`sYvOLX8$j{Eal}HHUNNpD^g;bg9yY1 zVq&4XuP8fJ8&fejWM3ezp6b%9)*QSvx{_RZpd^`XlLWIm4mb5R&yM&%bK$3B;m_nW za%uLw+H_<0HTTA!Edrkok52ppzdp|n>;3GGcR-_S;zKMDFl#eb=oc?Y8B1j#a%~zw zh*_&>7u6m`pjg$w=CmGJ2YFb1WvL2`-(Vq(3#ZZ>H+P@ss$@4dD^P;M0zv?P79r(9 zm_i=I6eSQK5KjYZF@h8EqsXS?g7IIp-WwPPSD}t3l=P-*P+~r1 zur%7V0SG0K*l`P)q8gF?)lUlT+<y2LN&OabLG28VO+ z!X8{8Plwd@w$*D^+vo+jwtii>DCB8q^_Ff0D^9TRP$2~^Jctmb9Z~^qh&=v%$|K$p z!;wu87tat8q4J!9fc++*a|0=aO_#v52nbXySad9~Y>Q4m%b#}ZAU;Et7(Oy5-a-)w zK`cm-_^CWKPXZSBfImR@tOss-zD7-ZXlN4;bF=?alvx-MeX$Eh(4mNm^Ns<|?(1(ir%8$@qN+Rqh?p# zI03tw-2>be$su^A1Spe+K&_1;bQu6bf%bAtewEWBxDHzgd+&WcLtCS0h31}Qf;tlXa))$#InH6 zDA22@Z@I*hNJCSGj*k3|O<+y+3cFu91^Sps9zcknm$3aYEkpG{KXlLjhtNRgH~#ZN zoFIGRw;_=g{K$c^4~&3&f`8>C0o@odKbUl||HdFLDOE)vMrAIQp)*moqw_fPtq6jj*=t(H1{O9%0zJFoy zpGPMbll{+akM4KQl=tXm_q0>F*Jol1JMZ3>Bi?9tAKi@ebgkj16Yg#vt`=M(?s_Rk zKF~Pvf%<%GzaBgHKN+18p$W>0LcM&g@O{WYua@&!ArVQqIWC7VhUXXR_R&x)Agnw4 zvvGed#=!Kav;g2Iydj@gFewH2J`9j1^b`UlrqT-Z*=pv`i+t_2zRPdsMN0byTp(J4 zfb2{_jR07SvxO`2hj|IkPupZ&067O%(F#~CKmsTp>IPt752)ZC(*X-7(xRdWr6`8S z;!uEmMuSO^1`vDg6zgs#j^V))uFx%F0Q(=_A9o<;=ZTCI?qb=wBTWTC zHyLUJsk?cQ{|I;?5PTpV!MXL|PI7)x2SAGRABbu10pj>N+$^FQQ_`40gd~uFNeI&4 z3}_A}PVI0Z$Ibp(|p6$ zY(NSKlt6jd@BV z)8%Wt>X|nx7>0+eI}13U0DUB23A8Y~qysGFuo}LVT=8ax1UV0284464IRXLm>cWml z8lZ84JW250fIDKVNI*cwKN28f3GcWz5{EJQITwOpQWW+aM6`8C4#YcRXyXNjP=LF` zwA^WVxoSBnMGk?2C}SIv!88b$Bh-TKK*UNQwH009Zf6RDaY%=7-7h8toE4~0Q79fQ z4;pKU0bz7HM1cX??Mp{o384_WUz(N}SRpf}d~ksSm{F0Rdi~V~vY7-U`BO-+Gk<@vj8}^$Nij0*)^WxY zC3Qnhidvx2tdJRmveQt@OR`$0`tAUE5$LaZd;ne3;9g1w+``Kr%EXNYrw$9p2H|D-}o2BX8db@`` zWGV4Tc6tgkKqhw+d9~Dc6cN^(T?z62Wz`gb$?$sy3=s7!6ItHAUHrKTObFBU+^nkj&5pi@jNIJu!K9~(k6Dg) z^UsR%fgkonQ%kIvhaTDb+uP!&3a=J;!;qc%ajhDVgoWglt}>dDs?ZMTQOtXvts-2C zl>~thIhyaVr3bWuL(T_93=@Lo-8g}uV<3Z6yPnhYWFhhW=a^02X!ZwH^Yc6VOnJhP zIqP&3x$PnUYFKwnP|j+&68IJ`Ctx^dl-BB_6v5^^Oi>Yh}iTD7-V$* zJ1UhHF=_DzXes2{meZc!hI*eLrgh*12RKxTl`-qT1Iq|;#LMNuxMXK{XOU?GpvB*? zPT*m>HtsK9zBcuEsmF(kWPlsPWIPch2?h(&D04{cSOP;@5u0jdvwi)wy*Be!TH1jj z_wm%v0tz-b3PZg8W(%&}UDaFUu+%`@Dv2WkLV%f^)pbo2IRzuy(sBrlio^mACyA#5 zjjT2}3fRR%CJ(T}gUe8xL``CN1=1U|3Mbq^F1GL~D3le}$q2p|DDZ_z+G2y=Ks-!I zBxIyb$FV)_fP0=|QE`K)cRaxH>Y^98`{UsXdXGdj_}que!?*y*?McmNhnD*45`?-4 zVn*pJya|>jN62OF^SCO4);2-vgY4`I@1-s_*u=;>1}=0zc@CCNf^BmoJd?m6#_k3N zC9rtFJ1Ol8qhd3&BFGy1dwIP6FzuLxJ&`bVdfu&ovlEz|bLOVvH!6 z?uIaTK7hgAouTxdc)wTx{eM@>0eY}f87iO%!0N^6U%qSKy7@sk-dd#@RAH20Wu1#2 z-KbLt3F<1fI9R>FCSCY9w z12EA81fi&f5f}soB}1iPzIoAII3}vpBP0-n5F#6ffsw<8BLXW43oRy&1i(QcAc6uO z4$iqJ07Qb3fSgmy@y+uJHq{FhVkm*Yo&&JQ)%A(SWKDJ2T408vLxBL?E)o(l5DpA_ zs+H31Drl;e-)6S!`O5hIJUjUb@7tZiA?#RSS?>!Th+xp%;ixw*m=hA_!IyB%mVi*`X#}iWu z3PPOG0o4l<#D-%{7ICp13p6i8rnA`(WYmO-%jjNcb6`>R1r`)HT(3^_#^Z1U2~iIJ9?&n|Ns?ocFG71rfIU3r zr<8}qI$)AL5P3>e$x1Rjr8P89Cpy#YSrGP-%pAc2u{Z}hFYPl-B<0qJ)8bEjIQ+k0 zTg=f<%ytOk2w(hR?7T#ZBZevt>eC9*-be>3A*h=y4kwF{@E`&jkoK?-ltlHAvUv$Y zg--!nqWY;JbUW}9TtsliQKAF`u>*Jl8ng+8;-)OQN?({zZYYuhM<~yTfr?*a3RU`Kp$_Nxf9QHNxv{N{Y^Ac6#?gi}%$?#w-bbknia3lmL4QPrnmu*g6@ ze!#Gbb`cNlg5ZLri}~m4inLoypMLEr%Zy(vr@|Kqrqn1N%0q&nDvV+7zp?zIdHFFn zx(NV>)sl-PcyK8A!i8{|TctwObhSQqWNS~-%de|Yk(Gu6-k)E-QDk%q%xU3a&(>$p z=+_`Az#wl%MO+EZEJOu91|WNWbT4jH1azBeytFzTfDo(*9m)3U8T{V?P5Ccz`~$Eq z!`y6e8kHgn95TT@r+t-GO}-j}997Sd$`uph=vSTNo?|Oh7%A{bjf(;sk=S-37(lYhM8sQHfIuiX3R3YoenIJ>5>Duc`ek`6X;o~R zv0G~Vbt`SI`DeND?eA#l7?1W`yJO6U)2z~xBO#niD2Laj9gs9!g(*QaLxGGI#8NOK zq%ZTL&|nN=bgj(!!-Jr<0%nk)P2@8K!Y7!pK-&Z-r4D%tW+AJP-vK^g&~TOpq&0LY z_ZkVK5d1zGqp$9V_1?@tvKs-ipl*rx9(^&RM{y}o{EDRR0NqD>3Mml@shk0*5DElD z{um(x!2642u+pmup|XbPcd0={Wd!#m0keYCEN#gs#S$q}iNq9x%-{Hj?m_|a7bz_Y z(tt1qA((|l2pwr$bLQ@e%;h90CxrkN3Gw8t>{WF6OZm7u;G$HV6ku@f_M&l}U~guW zx1!VT>sraCXf(m}DiQj%*ogMRKI8u@mtA$Rn!a`FC`!H&ljXfq# z+V@KHQkgSIK2j~GGzSmtj)4ZF@rL7LF;j?%6bJ+c0zm>GL|~+f5F)#gPDE@VtQyT^ z)$L7H+N`R@O4*r^ffhhaZ6gUjfQWG6UZ>MAFR(kmxGoSNc-fugC?#kLrNFRq0*sXO z1I_#uO+nFba?T*_dj~#o87;={iCEW3N{4ZtM5-1$$`xX zbv&#OS+Uxf7-?0Qh9Wl{YmSIWFbMb%B?SaWV~Qz<2!Yl}ub615Kv8&3`9!caOA%-a zRi}?aNe*#;ef!>Xo*)Ro4)lU1Rc@g~uW&%2W7rX$6#|s80Y5?t5ChJJq((u9EkSIr ziuizdbK(R8!xQ|3r_!54wp&$C0_dUGCNDILVDMukSjiz2BtcDsxPn4|r4qa#SdXIb z-dYNA)yCK02 z&|L#~d70$5iq!=Z=}H}tv#ak&p@CP4??pEN)C0{A z0Ae%x(v3=nVL=b+OBiMp6Y%|X7C_}Hh{#X=>^R7O=F}(M%8b@c2*|L*YFsxT)|%!v`X2uTkw8kz)Zr+EO#LEG4ZK6Fum5~DZuup)Z9MLD4`H*OSD;sUgLuq~pD zhPnr?<`4=T;b?45^3?{IJ*3ML{Dm;>Eg`l8CIJGCiwG2(1Q866_^(Haqeut72vfBk zuzkc(??|5VL;K1H`~NhONm!195rkPh2s@(x?}FI5LJ#a6s*|W}s%-j(gj_a^hH>8z zsUd2hJzxRW0j+lhft$I86#+p}IlQe`<`%Jb3VO1PSop!B{6YC zeHq=#0p!#Q)C$xJ)C$xJ)C$xJIlCj3hO~tuN*Ht8vdkb+MbSu+q80=oP)c!sf93+N zzRQqQkz@WrJ)Y`MiXs0f_%9WFN~t98rs~RK6=OWh-4EtR3fsE0 z1||wNkq?f*+ZehFhJW+aj{-PUs2Pb&FGZF|7rlEM>U2`QGYC#dqIFNM)V5*}I4VkiJw*$6Tkgjj*nn-Ro}=Tsqq^8{PVhpX&z9Sb+kaVxP;t1qQ2k=V1Dq` zgF4Zuz>HCmVLORbVYIuXJ0k)sc%8OXBpDOis`27-r3{?}hU8#KQz}iXCMRgR1$Bq_ zkf4!cAt15@4nWh6(x2dXF7BMTClxp&b!hc(s-e`l9r1+2watksX(3G%5E7$J0&Ie5 z6%MQ_fbiH5DQ!0vlsJQDL5+Yx{N(8bIrZXE-Gq@H$=P^;EwjJ(zC|)9b^@l+1%yOk zAs*FwM0mmdM6>HKP~O`VHjo58ghfG0f}$dON}vSq(nc09S|}3%bl7$71^$<`Gq);xs8&vMH>fiGvA70?Je=X82-QqUMMX@^J&%D1kqmI+iH<3X2h6LHZBo zSZu*xtWV=eG6X;QJw9x3%{r*6l?zIU+ygu1v*Ym7PRL5C6?Y{^gSepJVu8adh%m0- zo1CfBTR8pS-t54FzqC=iypJwAJw$6uz67v(5Dr`lz66E?+L{BQ7v2z5fCjwGRIooj zth7oBswD)e$EWrGFY9aJjD}tNgR%i9PDg2E?1e&%asnVohcY8RaX$Rv_lx^x0HDS( z56TowH&6>dR4AgB5K2NoPn~?bFbGBjD^42Izl{1!Vvm>MVN|^fw^P^46$i%xrd1#%{C)M3Ze?5QA0(757h-dpGCqDjlOJP z#a*{Bhst1klENSmNQ>!1+7Y>l0t8tW2ScA|kOQKFR3URo7r-rD;n#qc9l?`dNf-E$ zSBwB85FMZp2nfajPz)GuO-Os=bI?NZ4$u-Y7>tKRIGFE=;}ZVkO~Hu*>l4Ehu{$yf zQq174tKw`JkG~vp3rq&rVWM^#Qe@jNxokHw_U>3mWQmA2F1sjX!NcqOKZp1BkJaiD zm);8l{Jbeg^T9Ppe-Z$FN72fx1Lz{A(LS$|gP+2cJ)lbz#ZW?}Ltf3H-feB7qt*vk zJbpxv2ZV{NQAw*;MwcpZJisd5n!u$)yG(lr0@O}YAQC@wHs7}983o;%Q|d^GatV@T z5@FKrQwzpvW-so>yvDTUb{0`g3iaD0*9_3E1j!2~GEt%Nr3wb0iO@Kq^&|+8AevJ_ z2Oo_v4n-*LjEC&y*?X?zi3+aWCgh3=I+KKL0zAQsX=WCbXo}=iAmY%L3Xeg!T^4yT z(R5OjQ1-W0TWTR|kZ~LlFbc;8M2sE*#2P{{422XW2JpufNX8J52@o8_z;>Dp14Q{Z z2nLDw4j68J%!@|=0|bQ$z!+il1#(L*gd*evVL%vyKBUkV*3qHBKoS&OQV@^@`X^9X zY(VOT6sZOPV!Vi8b!g4`kssM3Cuc1Rg*LEoxS((n7O-0$LRzR6FoX6oh6RxRW`u5z_Q9Slg9 zE{78kz%Mu#qKKfA5;DsLkYQr2TK!7IvPuFh(u^BU0oNhOFbG)NizHQ`Foh}xL5X0P zpu!oe&EQxe1$Nl__@gx|eZyBfh--1Mb_OI z`$U7N-6dr8G#g$^q%sZ#COM?>NxPaJv8xEu-aNDo?l-J!3Fo+kPZDv_uj)CABN4Ew|&f)@!CPjSputqJ-I z)g`Wo20~i6b|)( zjbs>=f?cc^y!aG3oa*X_8b|{&A!?z+zsC1McbFt1?osAYWdPrbC=Ytk2T?eVIgsK& zkyn~fyG-bdv5X)moZ=XUsG-qZkjOTP2$td)iE%fM4yXnWK=5)2*ec*Q3KF_JOh3n< z7J7IVwjEqv62o#j&ccIn!0d9zECOnvZPhvAb`TJOm7<0N5Qu}WLz;l)a0Q|Ud{cSQ zgHb{>Qlr|2$RU7%qHL3gFY+gByQ(GA`{?2TaRRY9AX>#u;l#}B=V@JH8vrUtiH5_$ zI9OaRJCiXk3<5*|>Ne ztDzL28D)lrBsiTzIzXTkLJ^2HjgIg#FN4V>dw`q>n&hVIsBUZI}Cl=q4%sHk)(B(p|3p5FsNHSjb=+S?vDfcL69 zglzQdBr?%8d^W~9OW(K6My+Ji)0DGQF1SMVqhyb4!5^1S1XTTV9%P2CXYa7WxKcHQzIPn8u=lvPy} zdT%%nX9(07NNR?nw7e5o520J(W&|V#0o*W3knTs>L*9f(kpRdLJBVnPLQSazIB^mt z;2FAm=s29UDFUIcAwtm-yHJU63ltgxdcN-a`JxzunI%M+v#bIBKup{eeaRJI&ibiT z2k>BD|1_X|WKcVppZrhzk{`OZFOk&sz`#mb>KXugQKX^+^M&dZy^Z}rbPm-H@~!9@ z9!LI5K842rKu6QM41>7VL)$KXu6Gggjx6oFG0;b>qheKsPN5E3& z>!DtzXJ!u`KpF|Ox)6y80Eopvh{z)XJXa$mdm^{MezG4#&V6QEhx5P3=h1tPK3#^@ z^ef~!iX0EAKPA(&&Yh;G7QeAQB49OC*!2ZAY?TjEg)7tq@dB2QIn{3kpz(=ZnKgoM}|0jL9zxF;pHHZ$PkU|=?gF*y5@qn<^P>oGh`}z1Z%KN5U`2Jeg zzs{*PA|Vr#-v_RTwZf2t|Im~W{$x0qw;wj)s9-__G}KRw4zp`jQq_6pO-wHkq4QL` z2h^ZI)IGf>yi#OZN=j;VHw>$wg;!ne1K%pp@7lZ|e@P2L+@(35c2u+6|1YwQ5$RImvi%n3skGYX&l*_x%20F_Wf)MDK5#Uc=J(@t>2# z51mIYJoMw~hmpZP5hJ^(Z8Y4;oAL4vrgjPe=Yz;EUgKdbNrn^?XzgZ59Lv(ufT)w7 z(M6e!6)5HTh^%6a0Mt49p6;eEn~q_JRa`5!p_gM06G~pI%*QYx`KE_ACdLZsk&*|7 z_-<~qQX~L4oq|FkEbcDA&^ra(h?;?pOOZ<;LJ;V5*wclpfC7TowAiio5efmK6M-m~ zDfzaJ;R^%ggb1;_i~%g1;>y&~J;79pbp+&4&aH)ENBsO`F@jesPEcJu5IeJ~cZ4NSaSDI& zAaDpTez}z=oV*AIz({ui)I3pWO7Se9*KG(lEtji&pezKN1qSee+VDy$(4&4WC66H? z6}3RL>=Wd%5Uxl8xa_zo*Z~zsR{Pqm%BPvoC`I6u9GP$A=r^B)+MiBtgqCny2n zdWljN|B*-b!CY9NM`NKT@!|j%X%H>xWNZlq^PZ5s4zxKCHz1)-rW{%tgfbL(8-^O4 zrbSF5223KBtEg}=KsXuH@|y@36OQPZFkw6QE!a4Vxk2ZnbCl7DE~fShh!%Fhw16Fc zW6lIV1^Z9%ubw1+s*wr*oe7o8g@Gh~;UaiVV28{xC=dA&Pni%8XhZYCb_hS+1Az}$ z&m|TR_nscmS=Y+d=W75Lmp>x?fO%u*WhQcks;sOzh!4-F4AQMlXfwCbKmj70a&N%{ z0h0E9Y4Cvv8FR*0x=DHU?2*y0paorxg4um;CK=P&|BKv_{gs&mNWI?jNnTA|j|c|P z><;Gs7z^gY6K1~S<&QGyg%gnd#emRbf@{VA=V7EYIo3in_tzr=QPMT>o;bV^iOGQ2 zbQe$t$(VhgUjgymF=o1bMxGc#85wt^xpF9%R9Ibsi_%4x@<>SztnM}o{koGP!`;Ys zaXwgBK}_AflM0j1MVzqWJCm#3d9_aJq$%K^>M47B`%{p9&4c70@*zYhz}d5>3x7m} zKL{P&xW+J9E$#0b$u4F{hZGM43`8q6zU$ZPKBMyFBkU|!e_8OG&Jg6xIs9Qi@Iq%+yT*Hn>Ahp>|Y+ zX*Gqb2#|f{s`kMHt`Z>zi38BzNS^Z)<|i|PBS=tCK!BwRwYqdSY?eHB-3synJIF}W zE*w{{B8nVpNeLwMXSBdBM2Kt}01-gv#MBh!+Ls^&5deS&y1J5r=79s$Z^%_Vvd#j? zc8WnvRm>r#sjsg3HUET_i%D(p+URX5WVWH1rbVT#^jmu?Sv6FBS}%hfT@?z5griPn zfrvngsNh4Hs&Na6baFyKXkU91zgSe1L;&1i4nS#625knyWEpLO7)(LJ3|d0lcPV&q z6u}}#1(1XiLfx%@v2vgc5_X0dSP;3DjQpgY&@LRj&i0Lg&=X7wv4DCkcvwY@5an!+i7k;i4nk}g&1 zUF2p783O#Fri7YIpDd&_r`TKd(voRHv7)ApTh&zN4Cx>Tsj}Aq-h#%D2fI$E?f>*2@iCrqO z;vJU`w>(A`NjpjYhbtH&WTpTnHBgc$F@n0y;S%hA0VG4O?gI+tO;oSdUMH9b6y7Ge z>KticlZ81s1cqxzGu~w11P?SyvW`Z%Zc^u~`fTcQ(|-fT$$(tB)h)#)2pO3^3kZt~ z8t#tpwpx@GDB=#N7KOW57Iziu0>GO_ts879tY8F##btcp@#ZS5T;-3Mt*`py^5#F_MjrD0(F-P}6X@begA0EmZ# zxHRvg>>(*Mv}*%RtoE0gdFUQx=1<4v+HGgG?D16b-+g`AvcSEg-L{D*`XhIrl1C`?*usP|d5eP*cOdJTX0NFag*s3X%PoTkz zD5+FRDnf)I2ZR?sda}KfLe1uR4CjXms`ZMauN>V_78x-pTq(#?u>m#U2U`>w?V(BQ zD->Xe(DOi=1FZ7*iiBiR8Un${79q%C2t~7nh*+{gff1z`G^lD6P(W>lJN8aT{#jnB zxA$lHR<|*Y7qyad-+Z-9#i;=q2yp`sv)vz?>KZ?Al=?p4G685}AQFSSl2h0RM~1|c z^*nZxI_MvhM*Zp(5ecMP2^XL%E(dURJAl|tK@MghL#fTd(HvO!#HbMchQ%BEG_P#B z;NNWoG6_)HqD}6Q#5{3me5P%`F@>Hat92!~*l>=~bTgVY0j@X3&Z!rR(L^aID z<&Co_Q&&JYyc{9DSUbUs10{({Jwq_&?;^rw1qwmvm#`F})QD`BF2?~dhaId#5(UO% zZUp)RDu)Diss(E{S9e&0fX#W=P znKA}qSeZZ@7zxlcG_kO0HrTICfylt^m&l&kI{r{fwRug?%xr^150q*v3vhbTCZ1IUVTA|I%R-)xjvB5<9L zV25bLAqnF`$gJ{9kRM5JJ=?%bf!6|yp#ZXqp8(uIgbIo~08h#G`L37i_pYx)1WNQe z#S^>AUJMZ_Vu|I~uT|CPV2NIbSfX`x>(zVSRqQZ8hf2~YDDWxn57Hjd_J;%W0zjbi zJ>eL8sd(Y^VtUKoDa@)m2SBnLrUzBv0Z*Cd0bgWQgg{{d4o|=P!ujy|j`Mfz<`3>T za{nXfW;_%9+;o9@Acw=kpSC`x{)_*XlDba*ooCzqzP#`MU!zY|0#c}GDkXpV|L6aQ zeOPMOGc`a;l#;a^$XDfA1&il%L02YkNmqp7|_z*Hq;yRomac{uYnP z@NTQ?tJXa)J#)UcpHJLk+34hYr^UI^vfIbjIS2^@t>;IySA@+)o({#dcR!T=|`KLRr=`i z>#N(zRd}y8cdcu2ykZOU9OiS2&i5D3a~^iP@2h!iLgvoLy}XX`YS&X;?;ZI)_sn-| z@@8{q@5^4hjtIo5!@^jYjsM+UJu6d5L*3LWK zKbYP9b*)cNr}T1--aT74?qyd__Pg7xKBo~nk6m@^XL#P%6yosx`tx?Se75SQ4)>f# zes`s(HOq8)xQ@3qoQl!Q8GiXTzIU6_DfK$F@^`NM&U9;sUE6!MUiGJX-PEWpitC+s z71y3eTqk|=tL`ytK5u@_cCw?caqS9xp5Fu8m)A#^uQg@9De1F|XHKsC&FiSf&0l-I z?S8t}y2oAaw};JZojv@Wcdcv7)%;w?Esl2;J?y*rg{r*wyvKaC@f+8kcZ_*_J~2_( zUJl(X-^^8BE6rPvn#0TI&im%|Gu}JB->lc2Z9g@U5xCRFwyJZFC%HR?=I?uD_q$g2 zlDQatBeh#qIP+a+aol64?%dgmJdOFTb=8&e=Pv$dt6pEqrQ+VR&bscg-!l5|Z_Mp$ zr+xX|Z@WK!V-GghR_aW<`C6TLyj^w7Ipf}UJ$cnz8szt{Ej{CwS6%lHy>}dp+*O#p zd3Dz@GP%9qobBVAdnq%h-&eDpuDGvMw)RQ<#HISSW|+Pd`RUwF28rJ1?wtxfNZ#NkGH8_9_0 zkF!y4AIU}^eckf*Yc5;O;~j2c`p$fXYPVOvoy+6VT8`7I&iwVB;`WFxs&6)fkdI>w zdhvRkU&~w9o%+wN)_A#MYZK<*RTirAd1E@~tKZHnZ@5~uw7c;uM%PJA9#5TK{N(dD zwrd&Bc-LvQYk6(onc%#g=R)5xm&W6$p3Y%aM>#t1=Jy77UTB?jl&=C^`P|Oq8u9wI z^Jm>>i&o{e=WCqno%g$M%gzg1Sl3bp&^BA3cV^;IW!QZR$ zFnPagIK%q&tY6OG71OeIHxo-SW^Xl&z>(t)d>mA3g^Xl5Xyk|Iidvlt8xb~FO7Tz#< ziRT5pcNu>8=6Btk#&aFMr5WzVxb@!r=X-uuXjvELRSsP7i?+v}O$ui47ARyMCn`M#~!HOsbB_ZZiB@$b%OeP>&~d&<3G=enM^ z-j*=^o%fYbzVWeM`;Qe*n9jTNQEg(Pbh_(Ax9h9d zAhyf*7xPcoQnRgH%&zSfY~PORFRM*shb_0faMhyOgPO&3rf1FY>sz!&XFd99$uF+U z-_GyfSi70)d(W5V4xc?KiL~l>)$x9J4qhtn&09Uq)b-r;y}s)a&Y!AQ)2-=eT;Gpe zd~);NeCGRl^RBQiw|Mo}dcTh^>#5DV>v&hsuQAQueMIjg`ki-wSJzft-l^?q!P%Ft zTRJK^)@_udHRh&jEV`J9+M~^8`_FzWo-KEK+st)7Vy4}1wcDNU1<1ZHX|;4mL%#XR z#`(_g)+=4#ck#uA=a=nyuHku%`L8hq#x+VSe2Ahi)$^FPd-apEd)?0M-=ci2`oCPY z=ghsmb3ON6;@WkcziK0_L!62AHtO5)^XC*_r#AZT(TZL5R>Cnyny-1!Rhi^39PcRg z->h1%tJ|rG^@yCteO$+{SM}@8OrE>*ljY0NU2<1&cU-rrt9QG5-+S)2U3D9K&b;%j zTHLtyuXnEsqptVNdam==dwIuOwRwzp!aRr0xxX^|)wPG^S5?c#-!Zw`d)W)UcAq`# zPpwkFcei-&2VAJ+kYZmU_a(q#2^SfDh;dk1BT4oIJh7uDR!s{dDur^DvyAcN+69{^HuaVmuYJb%wQX;gjd#wqXT|m2H{SIfd6>6W^3zopIn;DNcJg!HcM_h{=M~j{HPIm9)VmCK?yy_pSoEXP-QG9u8a~Hnty;?ku(YG^; zTdix(_Zpn}Yrmb|yXOwN)pHD?!Yj@F$KW|y{*7I7N)8D^dv0BD^j<=h|U#<6SZto{@ zyUf>9m*H+^GiRLN-t(#={bYXq-<^4hzWVRTw|DbCZQb$QcZJ$_)z>`l)4mT{Ui$54 ze*C4LwI0^=W6x90=N4Ey@_O=biPw4E^Nji5dXR`W+!>?O^Dw; za@NK7t9j?1t?R3B*RK2{p06vuv+3(zX8NK0o98}`W+R>}b1qT6t4Wtb#ejh#!25&V ze$-RmjX#o-$e(zJ`^}HMv*cVTG>!-#Y$S)@$N+w{Pp9_*IULeS3J3d@K!h3kci^R= zpll#fY9Cqo%Q~bfi$LYdt!e|3!+d1>&Ck-qiYHY$C*Hdq#Y8vbs5T4-ffl5SNXHwg z-aShw2Gje_^B_1?fZ%{oK>{pxLT(ffBs>$4az--=1P&;M$Rr?x&CTjrvNfrsn z2(|{qG+ew+i07;o&4C~tGAs$0O$%s99gQi3kp?S}b|GpZ0d0^7S0Dnnz|n#Sxbw0k`NSoN`{zZqD34!@2V(3Oi98Ga?Vx`fXz*jCN-Y{ebQlTcQbX3@ zMwALJ-5j){%nCQF_P{?akT&4oiT$3x)7R=am6QyLrNYW&dg%K9&0Zx*GI)uD_sb6A zMA-Nf8VW!s#0Nu8ON`t$ETMrP^-nHZF(jG**sO_T>W873pcw()Gx>4IvRqk0Nin53 z!09B1I>Xa~Mm$pSsE{G10i0z~C$;)oH)ec&Ra6|!A0;s8z=6Tt-GaL_gFA#^Avg@~ z?moD?1h?Q2EI{z!9^4_g1`ED?|9#tst<&A-cdDzqUaD?aSKYezA?M^vtH%MqK=ncj z4h;2_<*{JtGm?o6AyT1z0FG2xYh0i}BuY`w1dSvSm6Y+nmqM9DV01W0S^&l;v=8T3 zpaJp*X+m1_s4wHTXqOnFh_~<$-m4jG%2NGtfH1Kb(e)mI}`HTQ!KrAYg>{q&YF+7oS%DJ~% zqmS#fh$_4|QB69gWAK)i6lt=F)Fh>9BFKwdWXZKon|dGiUdRtH)2t+Mi;eI5r?Fm5 zs3%!ySY%nO6}YRlQ>=@%bh_?}7Pc*nv%8zz%Xx*yqiX+r(NN=W8_O*TqHlz+v}#sb zQK}9iwMz}IkU@D8*@HaX!*e0;z@D=Cgbgu=Ngjb}c5>g)8BOOFKtQcq8_mJIEOr`;Az%`ILnLY-m$b7?G)rz$9r7VTMRat7 z2A)5{<$+U95gQ|d7b8`vDLJQIZId7(-k4JmR0@;!)?rJh*c|(rNfv8ep&*_10rV&8 zMjf3oqOUGw89<6OBNx5Y!HDC$WhRwm4zSj1Qoh=x*HCWJK#F=%(5nJ#WebY4jStVTXi(qF!4n~6L`d$koMZ^K;q-0xpSvPaWcK2~bJM=bgu zTeJ+ATe50epCttDH@5<5zX$xeG!nj_bj>{wQq)W>W&ZzP|Bbj9ruXlaAB`Fb;FFz>Y*M$*!uZs<(|dj`H|t%G+GbpW8yj^KbT8Mt!eX*PdPZ zI#nwJ9~|j^cI-90x#aBA;+bIYOi**#lBm)E3Cp|{=#mvauub*4YW-)-Hx#*CzS&W~ zY5a1)Ke+odC;D6AI5@K^RJ$E&QbSKR!UZx()7IA3R66p%`bR)RdX~b#^Vm?$d_XG1 z5EB}o{QfpQgI09xvV69r*lr_V+choee9`wR=+X(=*!llLyP3aXca@kSPKW(hR#$Jj zTK8K(-$m|sSW-aq(R)F9_k31z@R!AoA&n3V>i?chV@pAU z%$jKXbB?g6>8siFFCEqBsjthlsT5h8U&VkDp9FveSJE$u$2=~xHG~n?uKh*QUTD?a!e6o zXbG%bZs13t)Rcq*GH0^F>(|k_*Tc3jO%Uk0B#!dBppEi2WE=2?{81*jGUq$Zv@R8l z$v}|upRzSC4rog{Hc=6tjTo-WPJ^bG7&@b2*GOI;A?-os0sl&r9A>T{Soe}N7IED% zX02!NXEDVd?K}Pc;0xhn-9upOGsEQ@xhZ6SujWmqI^L&gV?1!P+~o?p>Uye_O!;p> z;2TFH5PY4sI8bkJV*6Ez^N@vQJaT%c=|(rz<8h7W=awsdjsC&a07sjF!jkUMuceM4 zz38Ifjaj8X2rs@iTV1BHgdL~c)*wlgBwvKe!n%%tD?nb+zp>h<_WSye!JDIvUCdee zIuWNwnKt_CP zG`vH5@evAo4n*|Lq4_|uT(|viMp%M{uJOG$k+7DA?4jUHl~z+xCE&@xORA$v!@~t> zAcjJi-dW!S-5a70ZXFMb(75M%=%>*d=z(xic66pM$doOxiO`v&uJetb?A0LN?M+-R z-}}#n@5X)Cl?I4%=xR19v#TNMqsZ@1?*C<8n9Q%a{2BS6+g@Gz=CvQ%>-b;pq3GME zsTcVJ!SlELz!%}pGjT51dy2o<47_^8knaNvN~22$|3AkAZ$c)gY(V&AGR&e*Hfa`x&N!L zfpN0T;rF}0^=#2K>*YmbW|di^)6=_eM_JvF(94f)fzDT49-f~@SxL`34Pn5E#w zD{q*2q6fcUj9UkYOlA>QP>T+53rid`(U-QZIf!%$sD0Ai2h0aaz7zc3PgJBvV%JM+ zB6(}c)UVhIdQr-$38(e)Zsaa`T&{V-$_(=(su{`*hX3@w*~1v?!XX zhz#@ey7}!9;e?z)=W|ZE4Y0BSruq$99Exv9+&JKKE zCvAuF+&q)2W3hp-u1*-QpRh^-f2TehKLTy{5cMk3&|eLP92_~lV`dT; zijkCEA7mA&5>faF{0W2K>E^#J*{=c3YJ}_V?P+hpLxSFpuLrrw_8bUdF3eva?n@U| zzdkV9ph-L6(ppCk(xv9>H&VV1vy|gtk`)im*BAYjWMdO=XDk)61w_SAg1+bnIRLa` zR@+~pjt*@uD|MgMIQJSJ13wnl`xhzz#g*BlLQ#ndH^4^4q2^fMuEyrpwUw=w9GAk& zoyYVBE~Sj4>5^%`zM4vIjjk8HH_wz|=jo9FtnI>-Z`UBIM7qG0!pZ_W;viM2(Mhjt z_{Gfp8R*(&a5`*X!%iP_3+qHkUC%e+JW2_P}lo`KW!pwY>($*5lu>17gz$I6rWm#V& zv<-LcENnG+p~OWvcU`elDOM{hhsF(x zDh{!|NJbA-NX8oYi;`=5jS)~zl~-pnFY-;Zy4Wkz^*$o|bMP@3CvgYjM;Xiw%jM{q zUK&~HDjQHk{D~Mfe02`=IrRLyebMpbHomHz;TRqj`&xaY5}nFb6${)$-FtWEUR6}} z6_Ff4j7!vHzngk>z;7eM3>0L^87yh5yhn;4O%MG@-Rxa4Jy2E1Q(>Zn8ROWTm^W1J zocs+A3BK~T1>{d;8rc*CX?1CQ*c_4ru)MR`r7Y4P>r3!yGX&(Qh2D_=;;>GhA(a4; zn$?LPjssnyLQ)*)Lqmh1@BvXFNi0E6SIUS8b2vM<0+2P*P|gX8Ex@;*fvVFZ!Wxz4 zr>l%Ahsy##QX~t+^BJrJ9ldjyXPjE1NoPdc2!uY17n?)Q5&6(6G%K{nBcVap1+s@F(B7kTJ_fmA)!QMKPIC+BW+jy;ai>?i}lGBv`8wMLhDNxeFKuTERi=@VyZeDRsM>Vorl%3x(S{6b{YKI&W zTeVAFD6N0FQR@AQi0l!meis?!L!!|IrVn}`c))0jC`vD)BG7?2Cn?r_QE4I)7J>V% z2d7!DWxU4_oW$qN>eemA$L3J1%q=qf3=jp0bC04|na_4QW#39;)09d*U$(Vx0|{-G3yFt^A7Z_V%2UaKc1CQF6sDln)_6+K~dVvrNYI(BOH9J_Pl7^?`8 z3@ESVLYO64QGiOunOg8WwFlyKNI}Ior~|3xnky)v=Az(505F+?XfSJgMrdNkN)uQSi9T*sAzh#HLX{v1O#RKMKJRB>AF^qnz~m z<-)b|H8UzQffW0bpZ$C*SP)S;QA^sAs|vN9xW6E!MAE@si;j=0hPd}IaWy)xjVrE{$-$ObFd6`E@;LafrWa7ZLiQSkq+nJrzaynW7v5$$1$P{tI)DuNb z$&@fHbXd?O5&DNkdW$1&+Q@*Dl>^+)TEo&o7d)aU=D4zbm^T;`gVajHhkuPgOFZg) zKQaByHvN9|j7y$gm1||Skt0y;gw#_cr>PV5|+)2j_`^KVRD|L+ID!~Z`)30d@J5#jhA7i zqe7&jAvR1pFhK?@p_sG-qayLR3Nu?5Dy2vjM7cEQ@HAys?b;I6KS28gt5r}-tG+W^ zB8iT2|AqH$L9t%CcVmO}uf0@-&mn&uJHpQdabtf%r|J$2dRt5QBME*vqRv7HkThD* zf`^8%$d3f-{@iUIpnjWCf7>~{$#d6#7*!3|sd-VfQAItyj8#21e@BRW*WvRaJZK}SP@&lv}F^5nujv>(@GE*KfYUEN!cV*IX?6Fd5Yl6j4odeCqsT)se>F~*^*H_Qk?p7Jgn>&8?c zP`IUa??+(u81^oO#IJ^vB8#8x&*IaKe%Q*4!64jZ7SU#2^ zO19=5+6MS*C^0}y5HSJZ{40pqP)!ujNk^rf3`#uTwSVL)^SX|IEeYq~q3s+$wv=^} zMx+8Ae>Wf!<*ABIuj*T1->p+!@_78+PJo503Hs%W-d$ToRL1EA0=~4`%Q-|JPEw3p zE_-*MM4-41+&ULG$}2dx*@5WlMO^@$#zmPJeWF^lVQc1U##^2Gn(&a5yj*EI691wL zcRF)QkEn%3KnEHmn3lD1z#Q!oU>Db?9>Ss)hnC*~M^#`a4a0>@XOdvD?ceW{q^6DD*kc$=el;Rec}b;mw%pdH;>3DP+^Hr zh93&8@4^*(?wrmUm7r|nAG+T<9me>eM=CWK0mp$&#KuMFH2#?$7N#r}lsLeW!6SKf zIz^i!gO}NJ&{5k%v=NOkU3g6<#K>uSmK7XqrhEY-PXdf;)fIr%YelwN3{+Qze62YCf=l@|%UQ{a62Fsy$k#G{W}**{_$}J@tyAHee33=*=X5 zsxQ|Ra*^0j&m3}y$hxoJ${KMwXv3M+wPw7%6idB+&V+Lb43Cg8skJtQMV4oqxQ6=y z=NBMc2{hztkx)bw&t)db+E5Q2mc|-Z4a?7@jU_avtYu%zT<-mPI7&|91V%00wqVoH zOI{$HxS()f<^T}H0kZnd8w>__i8_w9p6c%lX;bdky9Tuadd~mSxFyT~0v(G#1j@6! zyerROiW_1vGX@-d6eZ0#56eKWFmfLF5ZZmDuYnpCC!JuuZ!`_pK!rv~f+;;PhnmM^ z8r+QVK7)=Upj$vce`H zv8QGL2>9jXtT_RXiZof?_7|gV?T!Sq9Y~1zWk`hN^gvUAp7$=_ED9)mW&l6UeJeMIYEdXhL%xH~;f@BMb8Kt^Xav%Cz}xaaeS z`5IZQdjjrJG9@=Cq@56`JFi%|x194)5Go~)DXQuzq>ibCu&Qbhro)&(KwmZx(3-}1 zPgy?&>deVaR1yq`1^$AWT!MfTAzvc1aI2H09VziY&}>{Jz3`v`Dvvs5kvX$vgGf(# zq?N|e`jJtA);UBFFk>+=cnZ0I%!tj8U{$3sfzn8YbssLtyy6zKQim07YwcQ*@Cyzx zc&3_x^ECg|yLNxj_6TvVpyY~7$`MK9kedu=`19#d+zNGVQkgLZMTo<&&wzU-)TrRh zOH~wXuY|0!WIK+4DlB~AzERYQTfalQ7s zy^X^kk4#!?k~E`wzWn~!LdVyJSdF*-y=L?mHXu`zQ6d5X812k2mEifXd9X|!1hSRl zhVK#S5KaXN<-UZX_~iODKfHJ*kl5|AYP$Z;v6*-YawGAjHbhH4(CuSz)(?C2ad z+`c0dD=n*&mLqHTV+Vz&o)?!65aLCAtSF~rdoxs8WB;H)$%AuL!i(#D)<#NS&vCWy z{A(@A6chZ@`TTl2SF5aN23{dnndqmFc;E5tR^JZ3AVDF)s-zEhRn@mi=1Z&*1Ygwz z-hiM&t?j-TC?SB5)EBbdL@qD6AuXBs#rF5vLB@i!S|Nt~#d)EKk16i-Bd-5K$x?`B zs*$k`Z~=#w8s&W<)%*}81DdYM(1p4J;?MYWDyDG=Hk3vFe7BiUFFMLezGFdhC|hFk zYpXnqTWn-zjfu*Ol+?mA>f)$2JXkKX$?>)HqXka9)>yqeFhT25RK4fie19`h6NUc%*Ossg!S zI?Yh^c9KM?Xq6@&9V}KVr4y*m;F^YbCk_L5w58{0o5rW3q*4azs26*7JaZ-&pidzn z9bCTSM;J7HWXyZpplzRX+PY#b$~di%n5C}jaVAqWcoovnZ`-dP{8fU@Yr~89aqY|d zuVDr7Z9WGwDyl&33Fk$J3qcv2m^tvlpIalJm~W_@YRa74~-Uwa9r53 zyh(!hVy$*HGbBnL!nqz3RS=_^x<(*{tM1~hYs-(^#LGj;+e7uM6IBr@z@J02(1HCv z-vPl<{sbHM+S6r{TR~A6=W0ce8!LD^GMKONGFb*gDin$frw+5CD*Uj4ha^?l{%6RQ z5UL_+iZG~4#)!n`i&1PD#$}UA2vgnO^{IHUJ{HB@P*xn(`x|Ygs3UG}!--o!P-`jV zT`Nxk&ABHC8yWxUDIFH>>By^ZFufGh2KRJw*tY)Y5{6?K`Xe!J3T3_lvr1!*)hB+0 zUexJ>OCG@Go*er3;~J&{T$r@MZ*p#QImC9|+?k)iv+lE&LvyA+hVpS)8Ly;Sqk3|7 z-kQ-QcCQmwb2NUo@zRTko?!itDq(OM_&Mamfb-LzEH*W^UZKh6%vGLVb;cH7I;+!s zeg>u)4k52@Ss1VWhHB$)>r5@6#2fD6I!V&WntE3?RJDZ<&2ghpGL=gWrAjW~ov}(u zNtZ+e`fB+8>>YX&UN~c3-oaP6S1a~`d;VtecJUl7dYFS@JOyfi6RbgmxPzp z({ItfZQLJCZ<#lCOWimR=SO;G#(zX<;yLNS(&ec>3bB-LDomY(ihd9RO#8sM58k(9 zc|DF&^?45whZTKhx)WS$a6xOMMvv6Z*<|IFt>7h7zq+P~AGWt@I~`A4+61d6;2q7N zV%eXebr*PkTO*ccvpV{|TB0CBdhys@H}~NF$D%IF*`uPeLsWypK2r=m3Di@nTY^Vq z4?tnoDA)OQ_8e!yTU!UzXc@&0O8i-CXmMdBxxKWO^+1X^EiUWq4KXc%@HfkmHJlkJ z<5En+zsrVcqVbU{Wf2g4L5(k$FokK}Ee0D^T|ur%Je8CSVfM^z!N$a- zC0R7qKJ_qnhHz(lFn^CTcKTpOkYLNe`Aj>c8VTiIS#_U`k3SJm(D;XbDvTbzR9tMoA+4J~d)%hqpBgb% zr!xp$Lig7rKMk>*Bd3hQ`T1m&*E8FQ6&!vyspkJXlC)cx^xEUZ$lhz6NLD_-4Ke_( zwGbOSvaqQrz#pZhA~=m#^I-II#V~Ng3cyLaVp~L2nBB?fHDW>8d4=;T7o*x)7>*W+ zJ)NPt>F%o`mxmUe0M*@zzka)#LbJ_@!IjgFnW3$qE#7j;iF7d;Tx52R5ngk1Pavd3 zo=vHZCajM-la#)Tha!gwSlIR*URolz_xv#+Id#rHq5dIq2e13_3n|Hyty;Evooi1) zhqFrW2M5g7hJ54&MWdpQN$?EK1zIyzU-nr#?38SUcp6GwM(V`YhiEa4m(6jlZMi?B8%4e_Tt|DC6LsOhdKTw}9})+g z{0GEsRvpKY>rLiUzCL6Q2q84nLQ8h(`-Dnc4A{RnZt~c5Eb7=Dx5RzoPGf1|Ygx6o zZ&@|?6xWiz`X2muR779ot?kVIFV<#nX=ux_wQpVVo7>OdodngRqPnXYIbjWXNfn8` zC^~>*gDY-$nnG|q)z2ASkc88R&6)BOrlC*VwkXNnx;NwN=?fS!k>Xd*c3EZlntIBB zzR)NF#6_sIG>AG_UL%ZoYj16zKz~?9R3>C59W)Tet;$Mp(DG^(sqPN*qVhzW!qUWi zWv()}GfK1gBG>uwP#3W^fJ!ahi_ZfX7duEqAw>JF_?G@u((Jp0{AUgT15uH$f%ZQ3 zyXtyJZA*QcOsl?ZYql zZT>K@(Z58hu-iSuS52>{j0_6adNFxZVV-feGN95*N1_M%BVmQ1TFAfAK$P9oAzv%8 zRMg_wxGAs|O4-C)@i~$x8F3&*ypruwtY-6{G9pR{`v^j~@>{6Tz}%hnRjlAIsrHmOp*V1UzRYGmUw9-l@CrNK zqe!rW==Ba7ftu`7XyHY~fTYCGtSrw*JFb1i95%j3wEuO<8WS^400H!dXhlN~SnoQD zkL2(UZJQH->?Rv-+m0Dz?(;Y&l}t~N*+=QbvlCdWv^KP+w7UuTauR^g%$=)bJ(TDT zmH<#U(oXRh5^>^=)?`oi(@PsO=EdSbl>R(2DT?J5BaE;v!yEP~@C||7;6PGuV)O3{ z!qG*8lW!;8XA7pJCDW5RW|%qYBpgU17aqz!JSU=^W$5^)7>n&8zOa;H z8J^FsdkEtu#+8WEcBkLFa3N1^j^uGiR)U^0haR%7#u6YR=1z<-FU%%0xY$!(UCXYjkqad=EE~<)aeMwz%J2mq|D+8Y5!@ z`rq>{UWBhd%Li9B=Cmmk^23Cxd~?pd1el%d&`9hLXfj=DSUuv3On<y94NOS{LeFwm5DSi6Bh8y0ClnL$vK!$V_ z`dxwsUhyHBYZP5gf&GM2s^#T--E&q_${*FNx|#b>oAfU?}kz7~izIp<^_m}!Jc z%`%eXye62^x_Mp;`T=L66GFC8w@m3_DkHDA|?Y)YuE1DypeXPL1Ue1=F!9xi&ctq~7-28`WCtd)cr7FUPQ z?8OBf%Nn{Fd$mt!ZR#!7aZd#pHvpR#tW+{(R>R=uLXw1_Dwum*GLd;r zP_P%z9k@Sbv2dDhaL_bo&V$=4{MaFL5^koZWsX54b;Hf>c5)IuvhqeEPxV=pL{DQT z=5FIFA}9$}By{XCkk{G!B;R$c?KgQDP4A|eZqK<dbIg+{07|PJ=ns$#SjE&h#!N_{?Vs?+oSTtecjQjxT)9qo``+4}{QC4u ziKneKukS#~V9--PIwSvS1E|R5ldJgGu}dqbPJ}>*btFC`Z8&aKZ)A~$QQWg@tH#0G z*QzoBb5rk6=k9^`>@Q0*d_RNC$QgGkOnL_p2utBYWW;htop`U7WV^K_x&Py^hPSxiw?(| zSy=tXPH=#8?528mlxrtME9CU^G5H7y#SDs=a zUFRqrQlAGx0g}3|h%tHB9g&L4gih~^_TT|_;3S!up)+fC*MZfzK)TxB$Qk-*2r~D` z134`*(ZBENVodb*MmZ)Iy&V)-3O_CcKRo9^bgBFm)VFd+&N$*He`wenEiTp>c0@!S zCl;GG6dqWnaD`&SO0?}2iC0SVq6+AfsjmPlp3ZNaAs^Ke{83UQteP_LqRaWeuh2uN zdk%%+A5pIpwH0_3VR*B!Qart^HxDo}4UhInu2zvHmj{Vr{dkQ(-jgw~SD6yBqJ7i}-<)!5H;MIsuEj{M7-HyuppJytxqF z`9?YL4;k?A68P;HjtCoH9{WYXOnGzf`MQ(%QDkg9S3aw`d6_rIP~c1LwUTZ6RYiqL z8vzbvn{wh|G3oYcs(xeZ1&Ji5XX%Nz^1A=9B^=hZfjoCs$&=gkrVse`CNG`K z&AK_XDCvR~|0bdl`)mA>LS20%w$xofORHSfz@)oI^>Rx+SlLuE3P{fg&#eA~ znT-Y+C3bqtJ^0ON-&akijO96KnxOwip7agQF3U7f(-dPcyr}Ty)BUF~?3jbJD(K$81axkF#<5&=rackd+9uIw%P(~Hv=o{aJm94cY|

>B4QRp={96>XH0Z4^tsGey}=9lPn+ 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 z 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

7jnG6HMVWhEFb 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⁡>M9N)p1iR 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 LoG3^usiO*jkgQhv literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 b/openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cc68c5e7f4f583a4cd3d88522fcf28a98936123e GIT binary patch literal 1091 zcmV-J1ibq~T4*^jL0KkKS%uS1+W-NL-++2>b^rhWfA8NU|L@=KPy~4PO`{gs002ou z(uQgtng*tt29HpBngD19fB@07)b$!1WXYpIXwwmqp@?8j8e$Aag9rdHNRU%Ww21W7 z^*te=X{Ksu42?8-Lu5vWsAOmd88T?l8Z^XYXkr)>Mwo*UpuzwQ5=aO%nl#CvjZ3U8Kak^aWP_G+hJp}$S?|~ zLMBL&c-rnB8S@dRFUn@jGP&({3vC(xVJ(GHduPpD02R-|!;)1Z-eQtlXdLxu;rbdr%Mj$wW) zk9a`7m4o`!!d>2o=d?a`-*`9xA0En5m@7x#JhNuKeDepFJtvoHuk8yMnbfB^{BR zVAwD<1nvtmfmN3f(9yTvgh?QAjW(YEuB~OF<2*zhBQb8SJT*i^a9-c~Yl@o?oI=Oy zfsiN^#l$#X5o#9%Nc0LK%uJ4tMEc?{g{CREQ(FP1J$MBdPC}xPrayQvOiVm&4-}Ka zs-*Ni`dQN+_reTJS_N5C|v|fezTB@|7bb zRPBMuVjO!6JG@RLjlqu4y21q$O_w;ugU(V=G@;W=fnc5*loGU}<_dHX#L&2>2B8cT z8!MSj3=EA+LLwc8si~X_&Ev)fD>a=53Xzon>`zo-kzI?4bEXbrAU#B3#R#GTm`UT& zA%+i)hXT!13|ekRLfkmEdrZ@ZsAffbgNd1#i@}R+H6*s6v=F;>Z}U*p}|1fQY=uYwMk%}A(P6(S+enbs*7PT>*ij5mHKuTc JBq4Ouw!l^&?^yr< literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 b/openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bab1ac54ac2db68f62f361ee907ffdd74d568ed7 GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 b/openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f8efc501b8b85e106417a400196675612a730df1 GIT binary patch literal 710 zcmV;%0y+IcT4*^jL0KkKS*#1MSO5W%Uw~RLUH||3f9Kyyzwh7rKmw&Wg+Rhd6CtTj zCMo)9Ps*E6(=>)?gUUT1Xl+kZPbhkxrh`>KN_vcF)W`rD0009(0000S0|>%th+q&5 zfEY%ZGGQ19XcbdLll3x9HjOFiF&b!SJtIRv8UQpj07MFd;%hLIHy%Fhx|_)dcx-(X zRw7`5}D4KTA#ioC^~GF~z{-ylDC6)Vo-rc!JMAJ+`c6-h#V1pU8v=4uf6V z_>{765)QvFAVMde2rn85HzPq3qpF5kzgLzvs(1;2Z+bapTEFJQ7!~eymvKsK zu6IQ%3NMT>!;)k}4wm;BVZsbf<4F+8MvxkUbv$^$c^DUY?iP=^z;N4vvvLrLo1=`C zgdBy%Z&+)kl!@^w!pf8(&@u4#t;Jg0pz@fUw8|$bt*uryO|U6Ggy)N6Rqc|T8Qd=(bZLO)MOm!8d5~C7Mhb^y0DMikXF~g9`4kC@OlY!*ktrNC_^EsPz z3NFx;M=(T>@+kTNzFVjLK7&YYxHxYpTV&Zk6D9BNIEI#U+szWy{*GZwVMyqjjsgHP z?A-*62YaV@94H}i$x6_wlGkGv_H@X9U)=>`dREV1v0;0hws;$i(vvoPx@N|2k(+`X zoc~LS|C(YVgQbAIq(S%FQYhV~ySG`sE4P)5v2`awLS{+C6SpoEl$}Q6tVS*jd}U~D zv1s3}F-;O#wUL!HV`?ZVh5KzA=J2g#F3wFKn<^}nwxyF+$=etm7_l1|=Or}BVG~cb s*BLQwv#-yFEu{t*=kDG$nfX%@ID%BnfLTzaGnesqBvXY63c$McfT8zG$N&HU literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 b/openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..374282dfe6520cbb2b6c6235ca4e4d6524d6da5d GIT binary patch literal 299 zcmV+`0o49NT4*^jL0KkKS^UD+EdT&9Uw{HILI3}oKmY^)zwh4cFaZWE8ciCfsfL=G zX{V^#fB+gaWEzOb(@h$hG}8bkA)_V$N=BfYQ%y9`149HF44Mi932GZb%;RKlv*J8U zQX7FJm&M|LTM8lEl-OI+b&}9Wz(I_n?Jo*62Jou`262JPj;wyW z&76IgPmm=Tb{KUWOen%od}z^*Ads}Q#1A-lhfCxIq;V4!L0U+T3kL0E>F}&-=cHB8 zQ-UdY!_qNciSgnS56p~$6jh+Agj{9G%x!{euP-%;JD2I+!8oKis`g1*Ef$C{EJ;ZV xQUSCBB*su+u-8KoN(o^_WCHG407wfV&_%v;@Y^8}hqX5%?ntK!5+9ga<)Gf-e)<3a literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 b/openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..aca7fbd25897daa1968c653c4c236b90b24c2cce GIT binary patch literal 3988 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 b/openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7047e3d29deb421a5df8354f1b583dcddd6e6dd8 GIT binary patch literal 390 zcmV;10eSvHT4*^jL0KkKSsoU#I{*MaUw}d|LI3^xcqEDdzvtiVFab+3FqEcgN$Pnp zQK#ww4@fd;nF<1WX$Gn2n@Kn3N277ZVALI9?a0 zA^P#q8ZnU13WtoCJ{&+eR=oBU*x^zVfx5m)M3o97GgrpNH(AEUY{(k4A401&+s^uK zCeA|>QlH}3Bi+XS5jW`L!a0|~(>B$-ZYX#s_(MZYpQ kvZ$&EAp}VPVTe&o3!pi{A3#XS6#t94BAh5l4+~hGfb0#b?EnA( literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/009-always-inline.bz2 b/openwrt/package/linux/kernel-patches/009-always-inline.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e81c1a0e2ea7b17727a167cb0e301ebc60c70269 GIT binary patch literal 468 zcmV;_0W1DOT4*^jL0KkKS@yEVW&i*~Uw}d|NPquxPUqS{zwh7SKmn%?&A^mI)MY)7r^T|fN2t8f_K9kgQMFh_K}!_PQ1-OZJ-qRQ>b5Lb z0~2rMdgQ-m>oHw{50y$B_fG8Zrx=S!XAGeb%Un>&Mj498VhP(l4^rwdlx8tgNswy< zWh7{GY`h@dP~qO|qd1CGCJ$-mB3>zS)K!3$8gJMxD?7PObNGqc;m;wQ zNtpE(u^i-(5g5i0V%4A%7j#+~ES8jZd`Le+3NwVvmx}1BW)>~-& zgN8fztdPAd literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 b/openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9523e475d516731bef85e96f206d6b912a90d9ff GIT binary patch literal 1201 zcmV;i1Wx-xT4*^jL0KkKSuL2!TL1v@Uw}d|eDDAAfA8P4zyJU6Pz0(?y`jA0BTkJ0 zC`e7I>Y8m$s5JE&WYa(gq-mfAO$HzVs%D7vlQB&vq|+lKMwmko#2PUJLrhE(gaCj| z8fi4AsMFLmG{^wR4^SEd)DkEtnW?5tsL`RLKmZy5007Vcs;8owdPO{^l=VGK(fhC#ZUwG7LT;g2@Q1ka9!bKe{Pmc!Q; zzpFFQ!z)Dsk(EH)dBpbIwZlRRZvJ?a6Hk}YqKs%fO#+(~!9 zw1f%;qN7katSywcrzK)OK42?__R^7cE_hvXZ>`2wgjzIWVi@?%*aDb>T+`a*7mX5e zEy+EWNZGN8l`UeXiU|TsR8H;EVi&v2@2&wY&`e zBeiF%F--en|6Q7olJjP)LZ}#6LwfH7 zCMH`xG^+B?fmv_X!LVaNGf=cBBb2t*O(~QOxa?6aG3`oGp@wtq$QQ&6!UxQFMqx1n;`0d#3&VDExUVjGN~uaKGl(@T zO8FJ|@J05}$!8#PVsog#^`o+Et}kl|+**{Wn~3Nb?6Vwa5^PyrvP~}u%%8i;g z8g6=ht72RCmT+4c1LSwN3)LRsds$=Ndn9rfLkQBZ)`eN3KbVM;WQ3#xDd%1h zR{HA*r-&|^AsHHUgzJN%uR(VOR3-6>})c2Y#ndOUO*@cFqJPMa%40ek7lsdED=D( z>Z@~fE;m*zi@kyOH(FD^4hcUDxXD6tC= z987Yevnsi$y`ZTRgn~C9wumx9tJH)DPGHEdVBnY`Uh}4I=9X-*H%~I>dR0N-rz=vp zo<;c<;X+wQ<0fc&&aSxK6M+GZ4u$BcL|z7ExZEP5+ZfE-X_n_$opUk_c>MX;Civ$WY2Ml*2gum9FSFabEw7zzLY3IG5A z00Aner1dn(jZHLYFpV_PpwMZi6F`bo@gpWiq)b%Yf^u;#k zVzjGRZt>YU+?~zF-JWAUL_LdJf};~7)K!%0p?hGxOl0NMnJK(Y7Z+(eq0Z5(w>d3wg+EOv#@?asGTt-h|ss#GbH0P?%`~ bqlSitRXYy2Ian*O|BJaIoG3^Od7Ehf&p(#N literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 b/openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6731cfaca4dedad833fb2697e4c8ab2758b86b14 GIT binary patch literal 406 zcmV;H0crk1T4*^jL0KkKS)?>R?*IV7Uw{IzK>z=HYUA1vzwe*0FadLBvPDJ+Mt}gw(<9UY>IyX@Q)xV)XaS%A3IH@{0F;wWLne$y)B`{O02%-kLehC860sm5 z9d0r{lw{-GjtE2|B{*BI?pM>)7btT{k4#LcV_YTgDqWsEsNnFX@4a`@!<7koEB2n_ z23!cxT94PtE+Luo4}yWlEDs>#+Aux^04IWsbAm>Sz~l~96L{$<8c8a35JF=2yr3Qe zg@dtx=Tj1Z7*$3+HR2g#6PwKHs_+RtSWWh{SK_ zpb3_Uqr_o_ay)G(D6& zHGkSv?xlL*o5Y{L6Tcy7r|@-dht+~6o<&le{fFR<#{ovMF3WeJ5u5JE&uMjk?=3UC-!6U`rBnvh}~H%2^1kCADdj1LiZq0#rB z7Rat63X-;=YqZw@&T#_~9@$!ve|=N_gkVIrQ-U1oL!N?*t^+0-U`Z285wK=N<|PV@ z*UpGYS`5nN6}{F3ZgNG`PIeG6M+k$YP0@jE*Wi`6WL%iBNx^KIRC=aOZ^vXWAn6K& iO&68X(f2w#8HGY{UVu`Cg1}c)XcuxtI8cx@!W6(l1dUDr literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 b/openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..308e576fb1dcd5c9c58b6d18699a0b47375b3403 GIT binary patch literal 268 zcmV+n0rUPsT4*^jL0KkKS)USqB>(^~-+%%zK!5-LYUKa`yYHUTFaXwIN=c%6j7_PK z&;SYm^#DB})CitUA%w|^kYvPqni!b?N~!*)rjtjg8fXEa0000w5KBS=mShrnR!|f8 z=2#;c2J;Du@LIS|G#|KPOsHl;qeFDXbd-{+ev*M^G6R{KI)mb;<*s98Bx0R3$NA6BS?E_XaE2J02&So8Z-(9fXRpqjSPSQ(@cN>1_%HoB!VWUqx980YDV=>)gDvS z)6~h~Kr}SdLuv=89;SfVLFog7MvVhOpfX|uBSRnnG}9me0fGPt5feZ{WW)eKLN<(u z8W?E?nrPF~0iZo5OKNGL>2L}0=Y9wNDN4|nB_NrCX-Nr~r2RF9eHuUEb>&0pK9Rzo zf6_ZrmTb;bl3IxZWFw4m5RyTTsi@)^1nLe9Y$=SYil~AqvAvD%E-m?gUjp#a=3SPd zdzOR$VUV<2QvQob2r3FL_pR~X7x9@8lm zMIrEi+?!30dYPXdybO&DGHi5wYZ;Fo*^pwUj#(U0o(|l&&BbNW*J84@VS>DC@SmA1FNo!p^l_=Uo!f-=Plz4I*mjb4;;!|6gjbDE3tQ9k* z9>B&!EHh=t(K0hLO|j1@#DXVpCo_yXvdZHO%YMq_?%&Dp8v?M~YvK!~m{6#>O{?c( zqlEfKjqFXLj))sh{dy=LSefKz^_9&3iJj6knbjHWU1N62IY%t#fed3{5(E(voSg7k zQ;Pvq6mk~>I?rC1sK|TM8<09>i{AAbRxIHMYQRG=#8aQpx2bjZ|C@C$wru!FOE#sC z-+5;=s@$nowXKF2SoB!FRoXz<`r?l>4hFmmu{6+oNdjKT#xt;#l#-Skc4rd)S0 zt83Iy+ir{G)wb7;y(gT}j7y0^A^X$FMUu$!RxaXrgIJH9qupS2 zwM8fcwvvv=F1lK|x!f zb=@dx#m7nY5Fn=Svmj-{;=KblpE3UJ0S1D1EKso|ARu%yfcXd&O{WyBU~D*GGie7Y z$R8c|ti=J59D`!WT8~&7i-lwZHUSGp{y>eeU}zO8VzW32j0h>1R0%!f=hkwGi$d{2 zMhPGFYZ}-T7A9I*En{O)?_$6YurDTcmN*QOL8Qm-GPCd90k0&w6zCWQ|$=v2D~vMuH;^v zfdu|>S`zw~=*3^4G_*b|Vl=QS)yq}&UFNi)wH0KLhM6G*sR}iGt4#|kS!+{^fvrPLNlWn!JvnrHj->LA=Syk zNpBxDkW*iQEf^*?11YE}k#;87%)4SqV6ewW2__ma?CCuO%x#2 ze)oz?Ab)VDUc+H4#T!m!$clK=SeYT20UNhCMnMYf)U#7mDy!*Bzcy=FGebVY`oUWU zCO5-#E+|$BZ05GxW-~6VFqMP7&sP%+N?u^q#y1qma^;smu9m>47+1G`dFehDpGe*~`>j`5(q zSeUyxdmtG!GrTc|9h-&Js8n?)aCRF5gaL_=R|po?jY$JB%B*m!dEjLr*!ZJhVTp`F z^K@v4c@t+3ZZ%~F#y%0o$Lk5CKy6CJ^yf=(ng!g$$4!hZ_X;zUW44na7am*^C~4BV zJ3?j|4o$lv48mJC?i0Wv;ZUcv5M1mjy>JHG$*VDioYzHQH@-1Bl14jr!7YXn7 zLW1@drA%_XCV$T z^fHX>1(S$mC5gI^e^^x`dm1Wo_qQ%4Nt{lkiyjsQK?hT=;phioZxwSb?OKNL8Y2d_ zwwUZm3BJ!Q{CxJh^XQ`*!ilh}B`AE=B~p#u;Y%hrEfC7N9TOqmHA0L`he6b!P$vq) zkwXU5A)~Nc0q$*#q@GBl+ye|)CdSq66jKHxIy!hQ@ENZK66Z02q+ifl`>CI1%gSMM zp5=V^$yzrMN;-hdVCvP%8csmbI~25_RY+>&Cg-{$)*xZ)3BMH{Y7tW6~>*3JaU z+1g{mHKpim?rra};2S}()|@#qUf~vpRS?1;)Rb~%_p^r)wBveR_ldCZv16|zQHfT; zjLs#r5=7-QYX&c(UD7s=hNKErV@e_!0NQB^1dax$gDi1f@G7y*9qg1ckf|htX$&h+ z>`;)aB8E~eF)J}}$rVU3^V)L@9clO_KOuo+lELMyT5}YHlGGnwrm0C=w%WymW(mWR zN!Z`PNu1A+R3xfUtXp7oz}c94fUwfZDv^MoAS>jNVI^V8ASr1D#1*k|zXj2{xk3JDKTCCN=tp_j=&!VD9VjShYj{7ji{7P>>r1sD&)e5Cs4L literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 b/openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..456ee6145af3b5161ac8329f174f4422017360ec GIT binary patch literal 640 zcmV-`0)PENT4*^jL0KkKSu}j=A^-tH|9}KMi~wQ(@9S(NY>3tWuT>r z6_CUxnn-O3afrwzL?ms5Pcg;vah&TnEW8YEfyP_!AWL|7#%U;8be~nC%)oMuxSEa6 zx+088Nokq|ca$Zewk_N+7R+lr+L$p`LFt*xi?8vEVbU)l(rhY|h*B#OXG;$3J{V$p z7e&?(PuOu*-U!ofiU@|p@}1zO(CG@gQ+TX5MmTj0WTM6L1)MavvN4UkS<5?TQB>E| z%Tx@LWe*~_7zE!)lA}&F&k>Qunx!T(D(FWhC^e~^!&On}RZ9+yqpM#YGR_Dsw5OkH zCbe>z{7D`Y&`dDL_&pt~gMu5>S}Ih8!M!S(zp0p^ z>kd5;`*6;3KGor)D~L4b7u+gRrn+e_QmB#UC79F}6cQpAnAwgA3&u4oD;@*;0z&n| z8N?+qROU!ISg^U#aiq48PQGM>FyQEsX_=U6i_l65{7m`o6m;N>S0@}jaT$+8K^(W=cT$y=laWj6$dsAO9R1rv{$9I^d(7$D-z a5f-pw30OWMA$$3s;_gVN3K9m7okT#Z7aD8; literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/044-streaming_io.bz2 b/openwrt/package/linux/kernel-patches/044-streaming_io.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fc75024c9f8f81dc951599d2ef56a4d8074b443b GIT binary patch literal 1743 zcmV;=1~Bzqh9(CZGGt*G zfMGNk1kh+1GHA(=!UG94BqYjuO{meQlxXz;(9xlxhyc*g(?ACrGGt*GfMGNk1kh+1 zGHA(=!UG8s5uhLw5r~aR>UgKA>TOLlY(&Z8njWXABm~VRiw92EbUh8i8sK4)MR|8nI^A2Mj%<3+<}FQPq_gg;7F85o(ItGwl@Koe|;u zpFeehL~5%d21+42?p>?GF>JC_n-eE3QzsqyZp4;~I0;R|1%khh$o_YEHH&39u(wu0 z&{fJtlQTIKWuGRAAn~NK8h{UCI&|)#kJHPpU?#Y(&x+o~wJhIAgj$cFJ2=OJcDb^{ zyez%7gmU`;sZTI37#eyPS_;0k>(A-(-hAG5+TH7;gkd6?3jjBJ9UzI~9BK@B2oyt0 zu?adHWNWB;W}&s8L2Uh8WlYoZ3iosxKfUPMuYYwc6Q zT+%86zE;RUv2q}0C_y$@S)A7r&KX!e^&USPDk&aOR{SoEw8oVsrFQnk6>7VvQ(YFQYbB zyWuQP3VqH;p1pSP{+1w-sInm0{7&Oa2n5(MgG>};13&~bl8S{9CJA6IM8~5eDDyLa zXAZgRQqgyh@Z;$Gcn2>_fc&U#USL~=Fj7M33HAw#UjC;B;e;CX&zZHJmM`mW_mC{b z`3mDNV24yB&AdcN8cnPSa`bgJ_UzqjsLiaZs^1_30ARh@Y63t9Fij-7OKoBXLxLpT z31FH+WcD!L#u9_X7lg`5V$3Swn8A3UHru_SJ0L^_C>DamR#|3I9sl&1fGjTsaI^|B zX?lQHPt*m#z4A5^!O{Mk@aJMcy4!p-K6)UM*dx zqHv(F;7ynYFGvM|@BqV$lY9;^{Qp?_$H(%pUmz=Gf;y@nKcJVeF=6<>rQsmNGDq8} z48XiI3Oc_}ZL2MTmY_8Xw}yyPILf7vP!e{xJ^`Q6Hf+}Ao?_FN= z@0dGO6(AjZa-o&gy?P63Tf+8@9uNj*q$se6+IHAM7(?P}Tyt8j=ZWSbLxd}|M3vxp4%usX^ z3DN{YBuyxhK^;QgPkftWX@OG6IwgI!TD=5F7mV7s%zdKYsRV^+uBPxA7|7^Sq2D)aufhA7jpM#F(1 z*QNEYwB@%{B?G`)j)Yydi#g=!5@SS$iV(=02+-!iBUq+F3IdFh_>wTHh9dOYddkHY zJ|b#jjblre@e@=*PQIkud2s{lVmP9Ca<`HyiQhC^)DGcOC1|Nq$_vMW?k)-(uP=#B zEn%!q6lxA;JoM=oAqvf##~|htS+ymkxEf25f)*BWA5m~-HK-Qan%%iOx)uwT0>aSj z$7!@R7|^s`s5r)hNL$v6#df+EwA(XFg4C8v6$g86Yx z!oYj3;!1+*9Tw4C6cHkUfQhQ8fL_v~ry;|4V~d3P5eioX!{Uj-Mqd(5gJl}YlZvIa z!Ii45B4L}7bwZi#o#C`cQ%i`87bV@!ixXn_=L0sbfh{=(fmmRz$XW_=jjmEkz*n%! lR0*z6SW$`s4r!`u!l+SOWyv#%mYCQ4UC9*TLO|)pwbW0hBJBVG literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 b/openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..85a21e5f6fafcda2eb801fcbaab58d7d4c7d93b9 GIT binary patch literal 374 zcmV-+0g3)XT4*^jL0KkKSwI%?y8r+^Uw{fQT7UohW9G~RzpwwwFacDoXi9}N(@c#6 zK+tKR3INHbAOI4kjZCTFr|C=y>KXxnk3_^8VgM4RgeIrxX%qEFpnw_xz+`}Wo}<)S zgcX_uYYsl9;QfPjq?I@MBx*pVfP~*#(CI2CD14VUS}F2n7Lsj9&uSOf7ahlaR}kCm zADyuBopPF2SfI$1sI!aI4{23_h6`g#)+UVtd=)f)y!NGZq)$2r)G z1wspb2Z-5REuvEZr{hOBK?z1XFHG7q2^-Q1FA~P=Q$Hk5M%P(fm#}_3Amf*D=xJ~` z5w@&hJp%JE>n`UH(QYQBB9I;qAz&d9ZDr$BOkSwLYJ=S@y9bL%3mGFx#8wBvH>(JO z{gCCL7{TY!dO#|$oESz>Rs68vpea>xBWDqj2gZujc=GXC%%stHoUD=bM~Rj&q$VFJ U2O4jKWKZ#TBvXY61OaawuxY%Z@c;k- literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 b/openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..472eb28dc5238af5047c1c39d3028740f4b5a12b GIT binary patch literal 506 zcmVD5#^ylqE7o zny86siwd}iD0(QzmkI^Hqp!2~UjT2FS_l{>zQONNJ?c-NP9bb2Ek&ZJo`@y1Xre^W zF0&*5r7yv_O*1DfE&_`z6K6-Fv?xnG6cAyNISN-u*t%A&huRRYUGYacG5J|-vV`WT z5^@G2a}>!LhHcI{Ot(2oOq2_SE9EmSphWs)lsJ|ZS+-xacC8t6sz$P}6{XoQ2iK;aN(7NYkB@6Idx} z%lm*>sTr1$!lu5K*#y>+(DocTi7J?M2E(hXbjHsS(7boZq3u=y)^m_pT0wYNWt$~& zR22^v+m&Ww(({Od17M^`$YX%?ocIdTvtG(U%+cZVEJLTnO;?tUro%}?SAnow-Z;UQ zQ9zW2Axz?`r?gRun4h{P{2*eTZ-9h(RGmsD9KzxvbSmxZ`THZW!Z9kSpGwMYITc~Q zY#WFMg=+1DGeeG8FGy|`u4){H9eQ5Y! zPj82By}P^DzJ|BUXLCU)_sH?}y_wWxDuF>*KqmX%_TId2zR}NW0#lMVrT5(RPoHkt zy4$Y3<@aZ7niW^OaTW7hSEaJas+ATjA7@-!w|AX$xvhzMZhJk)p*`nlZtuEzo>^P% z_f1wC?W3av`Imj}dbZ375)cH*FpQJb(+TKJRQ;-cgvc3C^&Xz6(8vd=>UmE{9-vBS zAVknYRR2n!ifuJdX{vgjp4A$e>W8HCh7kQwdVp!505Fh9iAVVAdY+@y zc|dxPQJ??-8Z-a_3Pd6%O$0Sl_L6x?`lj+Hs(zzL^*v0Oo~M+^3Z!YLq?K=VbU=zj_C={epWr$NDz{}?Z%?f~@C?CxNyvPK|w4jy#<$M31 z>Gyp1{J!()n}h@Q5fn~pC`krElu#VvuNa}kG&cP#X~!8K=^?TIow{C%)UmG#{T5g8 z7-jkFwUv^3T%n<$ijJIIC}LWsnyT|MaU2MuY>>e$%px*yC5sXwl8{Le6H`jTB*8e0pRY)0(}RHKF;vABfn;GB7>5X?Y-_SAiwOk>`&gw9 zbZ|ILwHtH+8d)kdSy3SY6EYJi2_(tOm=OsUqQz+J%Mdg$tTDlgjgKp6B5X_E(fj{^ zJ7sm5n%m_ba6L#tAwYMDj6et_qCyF%f>I)gm>{5^beZCHqag|`l&LHdN8ju6-uj9Y zARwI*;7~;pMKg8Nl$wzW!Gr`tK??*ZQV~>>8?uSkAmT_;FeL#a1SB|LpZMCNzkTU9G@t5! zU;F+uq5gu(e`lI0hw1Z{Sc)4XX^t}O_TO7yl}239C2# zSVP9JT0zCYaja9L++nq2<#5}@Dn`g+M4-Y|TYrdXqw$e)(6m@03^St$9ye~R>fD=; z&ChKFkWeABR!Id?6d1-sk`%l`74bUWV8)6|WJx(S8siA4dM*`?C3gsO_4sV@B8~=) zXLY7wCYWk0wl=%ol??F?Ar}df)ceiZ43(i_$j`_-nvy*OR>AIpS9E4mqHr`$2DO9- z#5vZqv9dTbfk}?AMQs9OV;9FpTrHzPe;TjN8HhnzRi&KeP)W-Azh;bta5iE zOvOM`M9@iv+X9- zB*1ZHRK(FmEdi_olDDjDUQ>r}U2{J+FLwR8#i?mXimo*z0a{dn*% z20cQeQkE@XAfp70kc5mwPAzfX4n$VDE0xCJVGmf&jTq1v91(NV-*n%fwOjEwe7F>&BKIL03z)9q z?^Z$y7?qWVSego?SuQ~FMd(`S?Tge)7|t0313tD72=zSM|CjP478Q*|1JX!j1*2bb z#Q4-`$H5=i2y2~)x}Us7Wo#90$cys)3hMEkTU>`y+v@2}<4FM0T$0baI!-tTR@yO*b* ze~KTY3LT|&5$ssauT?}{otN}_+_b^xEa9-Pu{JgMME0DOgac%xhy0+abEZs&ol8Ef zIB|;m;bCNri<=CO*`DTG>%51sY!MFsy*jxxOP*$yIp-CeX2%A(u4%AtWFd^;LSg<2 zP}-W2Bz&A>w`=C(ltB;6aVv^Kn!^LLgObGbhmj7R=1X1z2PDIWlZFEyEZIb@A74o& z3i-Fi7f0?n8sV;gY^PiiXKG3XF1yBqM57-KndiR5&=}d!6 z!|2;vX~-Q)2>fP#R2R@eQuqeI<_tq%FGe!C*ki=X21w-yKLD9D76%=5e$bFmDRR(EJ3_IqKb}5;W@>qe zitahUc^hC5$55(R-^uS!J4kW`s;;oL9G8XFOw{erLf$jtGle3Qg=a`vjLe6~eSb`k zLqULDo=wcYnY2j?X~(Z!)I`syaO&ouS1*l?P)aEBE@d$F3R(=aC=RZ9SZ+i0AC6!o zyfN$tb0qc-K=dn_UOpqfyU1v}jtZLT$tC)E^;XU~6Jo^mUvT691M;(3faJnKGK)`# zoNukI=ig$%+c!SGmf28w`S9m+9-H}|&E!yO0pC9kd~A3Ln#d7jqG^I;RNcYY)UK`J z(z9s_>TS+6!7dgGR9+(t2c?&hNuU+d^f8b1xo+I;>zDKQtew|5@cS#LZCqZ7L*+m^ zkNuws>V#aC%=V*aIqVj~>A$Zet+1cLm~hz38~F(x51CM~&{_w`)G%E2CH}sa&@~;! zpg`%s!{(Y(z$8L-ghOVm-bfzV*k&XajqBf$VN+J>Yq8AWG(v4?cak8Y<@iV@FlJ$g zTBs7hG z8IeX6g(ReC8Xka|xO|(!xp8?XFysj@v%KteeB$LY{ZRu9HSdEP# zjg0{cv=3OPcx$Uw)!n+8t^JR38VU@RV?;0F9EL8_)2!+j7?x{-1bK6nm!Tgx+B$DE2JSaMDEzWoCB^QP_qag?7e z^cd%r5C_#htcAfK(R^D0Yy@?O*gZ=70D}Vgm*8{HBB7e( z0#IZE%o)mC&T{p-QhS@-2QzK0!N^3Qk*-sb18~S^Rwn%UcJemcdv>Bh%~mFaMXgB@ zG;3^Qj&nP94zRV=;=^&Qs=Fd8*((-8OlV@^4j_7v z?yRVy)%xCk2>eYI#B!FY9N#KHe=R{!Y1m$6*8)EU@3WV65=VIH?l2@T*v=m4;l~f} z?k)GlRk`;|CTwO5>!n_)+kfwz=AY?&f5*?uFO~u0*&HK~e6g#|0_Hhs+n8be_? zn~yD|2Qaqw!d47n%bT`hhPY7>7o?viQWdr6=+Y`NP=kXz+C3fw;E{gcQ7ca-S&7z$ z_#;Y8{7(NG|9Lj7UZgwk=Ptu~9M!zD^Zt)*w07U&(M?`)R$puq6ygMim^MB+)#tvR zQ{9BVSAQ}5Z{WU4;5QyoIDDQxI^ccS@GY?pp?Gfms>x_Q-wd;-;>Wr(mOcKXlAGIa zd_}U9nb07+h+-CnWX-!9AfOIFC9`bdn7&-?AaWgFz#dRsKB6 z3Q9U7QG@}l7>HlYiUOG+D<8=?s*;KJi2*1D3K06gW9LQ0``m)jIl#;e0$_#=hj}QX zfR9aqu!R)*1K7?W6WZ!kcZ40kD>O4)a7Z3Sv$QDvLE{Nvk!=FEq7#p8erEeiGLXSQ zfVdjCz}d9mhKE55ID-Ns0x-U9=GpQaG!6$%=01?Vq-cL%b*8hVwCu|nbw=8_#5Y7Z zjZOl{YcS)As$wz)8wEGI8%W{qxQ3WsK@+&Zd>OkY&P$octqzssQUHJ)J1E(&9N zwj3rcYlC6WEwPmm!lUvJeEh3~UiqPXJ&t9oJf&T|%QYp)YeiwGL3WH_icOMBjPS(i zF)9qg1{+Obl=^)tOEu@+3~U(C<&e!kW;u|`;&h*g_$G+w;cT^wr$a-d5SAQu2hP;Y zHcn@SUGC6BPPXP()pI-jgkygmr*JM1x!2Qzi66cS;F9BqK2XHTc0Bj#j@xGnpQmH7 zuMUIQ&6_!PZ6>_zB8%h`B11y(t1QycQH@kE+%iDmR||`8LiJ4^dGQNGwxx0|pTl~( zkqfEetvoNXYjV*MqhYg7U|%b3su7wgdu)~D5m{#1g9?bj()*XoCp}=rRA7nuFAKxeJ0(@$QEuoB(0EG@FVOY_qud3D>#*R)cw%*Lo8IJw@mSH;uLU? z>}EG`xI-Xg8Im(LkYd5)S_|LmiyofCj+khPBVzOx7|GF;CAfax4_{pI`e$O~3y63U zph4+RV3*pjD~OqOfbRs*DLi22PL3)`JcOHw@P`7Wl(!cCqXRrcmRn1bdGHFlUV>!> zd3W;G>C&MYyF;948YF}Ykegzd2|%49U12$H1fz#8Qcf-bnlz8Q^YWD> zB~(VjG@yD6pis9wmTz*DG7C8e5IBZE0Wg3k6((QcaEsdbi+UB4)5fh_>S_ zvEh}V>Z}!^qeKEMFxPGvMp)5OnSwIWoFQ3u41)JouX`x!%+HWU4oEmQX>4MSr;~a^ zzviv@&n;oKnXPVqev(k-5s>~q7&ColISHBMfdU28xnE}oGsQh%h6<|zYXnOLIf%hb z^!BztSG0yTqMAxpU00%J*~Spgd50?DWFfSXT1X}XIpDWN(-dgmi=9I-PFf(np_ z5J5-cKC**(++Hp+#S&?^KJgJZ*s5wf44JAOtGU8D^Mhi@?$~z5`(21bN^ORcJ&H@N zZXLSdMJm=G(@p$R%qWvgo@BZ-x7NV&n_Tf3uP z+nhDIgw;L65g`Ja14-ePl`pQnxD6y-Z_%bXl*B({x@CpI_Vf6+}KnZ)A(dSWyzf6!GxA=#nL@huR(ujYX3>6|*^@N~% z-^q~)5BD|FrD0vwP%8-AV?-F)2H0d#4ksKSH-d{6OhsOY0pl?0MBtR|DDF<&*am39 z8VrTe2x$u9aVDe__QCoB5a&%05fW6o#2+1aDgqnYr~bq!LInO%4~;y3FknBh3sbl# zKA}_UL_VU>fQ5(JiMVK2*+Kq_es>4v2pWC=s4O-Q-YC4oslc_PQ2WLF1w}s84vonS zgy-HSuBdFC4y8mg0OTk70+CPmkXIh*>AS}A6L+ZuL+)@E7(^g*NQzGoSlS`tVD|oj zXkdac0Qe*)pMTaF8JIxGA-M)@yfr2-KlfjPB$!vu!ephS(2vO=ZTQecVZp8-z|2kq zNaN;yz#(;m9136(MGOiDzU$zJRXDuQyLSsF1#zgQ2Vrh_@4r<^hxKHUK;T!j>@SJf zkNh6yo#l;Kw;<+-f1g!n6g4szRuU(q9?8;DkTXQK?XZAsF2RE_jxhEc5m<-s@>AM- zNB@CIN0N0EfF2>?Z$QFaAaw&F0*!iXe3NPzha7ifo$^a>%W2c$WIxrKws73l4qQ^Qc} z4;J!!wIvFf1q_M#H-Zc94S+>FWwk-T`)% z_vqi6n=S?HC}snV3n)+>Gk9?E@leI6GFb)w8JMu1qPPk|;9jj1!q1CwJt85XnP4;2 z`US$Mn7qrRd0dYd9x^ zzuN_Y1HtVD7{h{C3MlQRr<$q43U_sBpP1Atw+rQfwijn=SwS=)c6?id#6T(RuiXcz zoY3}qqR%3d{>wi;q2P5gL^b1qf$6$)hQX+6m-95O2prK0;jA=5F*x606S!Q!MG_AeWYD;W5i^ecj{k_y z%fFo^^o5I7KqEV9p%TX|?5q-8V_yhV<{eDEoda@)7$NjtTa(aF5qiR+o-Y^6AY|c@ zVkh*Zrv=eI^M@QTUh4{UL;KKweM?j$qDi~i7ZxCWN8&L6)PI!W$Y3=J;)@;*WYSY{ zR9IP7RZdk|R#YM2f?eMb0D^<^U?+G61%d<8D1kwsz&{9wGuN(6-Pj>OL}ZqcfiL0* zkYNrda_Dl421iuXEGLnud-T9~S+_7B2#kTu-^2=FNIK0ZS_%*hdR%T4LPTaz6kBJ6_^>zTrXp@wN7^RA z1I09;*a#q4!_-ZKuq(9+e(&Z#jir5`VfLGGKQ{Ph{Emz^%@Gw9FcTd-H{?5k+Mmq- zc)%=#1Q2MHBjNS&I6BcsG^lam$Lz~Pi5=3T_CT|9Pv}zW5eWB?5i&YVp<{HAzoj?v zi_4q0A?Cj`P}GSe2SI!@E{o`V-C0&xjQ|^fED@|10c>DEr07vYRqzvLJN|)H7%>gpyzoxjpt1HUqHb%%`^6>-sxVs+ow1nwhFrw9TzCXqu^+ znunN|nVPOIbWwK2m%z@WFd*u3r7kkzb}DfI-ige?-z7A}RUh+n3xnOkvt&UNLL^{> z|4~*7E}SEx%C!_$I-7@Mv@;n)G`ZvDOmq)}(LnbK40H#nlrk|PD9>Dn6;whU@HA@C z;&~$N6WIt?vOwo)(HCqF2y~N#Nt(OWQp9FZYIzJ3Zt%w`nhY!~m>mc9Ms6Z3K3@#8 z5H$nICLSKn_W}3!%&@Z~8Z)3UeI>?5eN2&ikew26Iq<$;G9 zksuaADu2sM2Vgck0x#~pz$m(+nVz(%m_-EG%#vn_^??OQ2@I>)bSj3xenmb&4|nE5 zD!al5yi=bbi-UG6x{+3;QAok-75TZ;Dn16cH|< z@f;U02P7`9cbD?o)iuweCxF%R3SG(?J>aze3fv7QF13D^T~cm3Td^sGY9ySehSprQg< z)BrmdS%Z+KfwrP(tvd!%G%XHLsd$zP3Q7m|k%&lA@JiqjTZ|;6E0Plm4o_z->x6m! z6UgB<-jK{G5wNg*Mw04boTO@sm<$f4sD(z|;G_cvbsupGs!xO;Fbo<)agvcy2U2_glY0(0bZa$+5s?Lsf}p5^l9SLc zr8g?S0uw-$Jy(!vthvVlQmqS2myqi4M`n>*9Y^buZ$gAizhzpx|NF2I>ki5cI#yu`cIYzGvO9DTPC(f?r* z7GOo0gzPqKHp-|)Ca^e!ID(kBSdof03KIlME3%uzzGZfdR@VejB8-#-rHXXG%h8%b z!HGg%Aaod}=yWN9Jm5wvnF^?c#PaKfI8h}M9#2d}jVp*G9Dyia%gBQnCCwNCeAQ44 ztfvP1@fWD@1EyoJEzXe^3dH~*5CsgleaLQOKsNs50iHOz>%#xbnE`bH;1GKvt)<{F zx^O7I{@$BD*GNYFsPP3F4E96<2BEie$%NZ6wyyI-3b`CZ&>;+ZBztN9cq8MiAiEK% zz8RonJ+#}xj}|DX9fAj$3lAhtBA(DV#C&qqD{B!fETV91SinbN<(xEE7=) z$ZPVb2nXf}2y?9#8c?JY*hoV<0_yNT5ZIE!s6gt-D2yDkIwX*xqih^yg>A5)#4c`5 zlcSFzU>pFrB?!pndt_lSgb&+(HVdh#vN7e8Sir=Lh}hn#@|>7(up@VLTUNEA))sA? z(N->=N(5kQZjp8Y0!xAb4bey+}M^-oFFIAZ3er(UeJJye89t=cJ8}U|iv? zVBs+Em|dzwQzGlM7_UAQ!-Sby95zo!InAjf*dOoLg{!DVuSBU z0QmCqD>D#X>Lv^SMHY4TsgPAX=Iwh)|LcgiH$HQ@C4PfCqQ3(@?=dDIiGz zKn}yrND8nc`CW%WBtUcVO$I0ATL2(1e?-Pu0)mWcA7G_=1WX2@>zC?cu{>c29qf$+ zb6)TdnIIj64+?$)FijH>YA6aI^r*DR`qd69n7rkRr#O07_{Ho2=Xxv{0Rkw~X=kDK zgUItR80HY=1;i<&(Ss6;l?Z4(&UaVO$!}~W6onBHAt5pl87kCNDk1rUaEuREFyJRM z!6Dj)!QD_EK7a{d-yr)2719V>Cvwmp;Hpd}0Pd=C4}fe@h@Wm^zd$v}!g}Kf_@3y; zc44v8W@H07m<2fH5(+{ABQStE$92Viwa=%Iubx>~u3p@H6KA8*d32+Z^I|gQfK}W=bbh;u#5Rlk} zhJ#SMg!>2zM$mxi>(+hb7#pAxB^S;R!HI|>B$6a0q>^cv3K4`H*gr1GN}fUUJVi=Z zct(BnjRXQkKNb_K;6qwpi4c8+0Y1G|@`DP&j*^F1qI12)2xJE@;oKh1lCA+)Jr!6k zhT5=T*j$nHo}l0x8aPi_MA#h)(63U?BhrC=O^#TEm=koN*(Ad8O35A^Kc#K$L_MNLZqXciV?bGI`;l z>>ltn#oY)U{z{PUXzoJL5irRK61FQs(P|g2;utCeH3ZQB+>7Lc`2&w{gh9j(A*yyY z8LD--4}Mm?4?MYk3N& zcpan@AbSThv<|0{uzLYwpTTw_5R4=x;X8-ca1wa{QV?b!&*)U!BuW4jB%pbRp%0NH zujneI?jzXbRC*vvK}Rnkg+RNW@53jJ!lA}4Vi`UmHv|g?ap;^w%n|G!YKGy!c8whF ze~+${!WjW&GN?b9BSLpE5t7h=)yxNpgbWznLA4d1!Q65P`2|T~)j~)SAP@pUkHGGl zKtBOgKI>z^sA8*)d}BW!ymV{Pe1UbcfzcaN-e5HM6dd`gcF?^6s4l_8Ux<)3VZ4#I zA?ZNq$4Gcuj4W~{NaLOMRih(ipqv>-NeIY5V9FNOP$?3Ygpsqb8^@S)2Qada0O0Mw z*|MER5{N6IT4!@(>mG%FK+!Je3YQuC4Rj0#CCP5U@PV3@VL~MU6G)oiK6~hDLViD?eic)YOr&dAj4n02k zQUp!gl=cV*%pY)lsN9RupVEU!8bBLk4~s1iLOII=Y-rN_2jBMp2aDMVdx7A(+A-y0$p#8yBdXhkup|l%J z*_)7{z%>217(a;NH_BE_bOXd)!2xy;<)9mML1GYT;vW>tUV)JV_$9D2cOWSsIwoUm z)PEY~MFZX`!51hW*d0VZ*b2+m;kNAq)nIuC@pU3Z035=^Hs-!#n0J6#0klAjr3b+1 zoluzKUl)LR;pHtw46^$}do%@Xk{~sMkYo&C((xiahZ-zUY7`1!onYi35$S>vKoNtW z5E_Z+?+_Bfpmr1ApkWCYMBr`AaXwJ?9Y%REHXu-LDp(;dQ5y$CL_QG$GL+6Bnie72 zl9OsrxC|k4$awhlaJR%67YsTy_KhSkk|98Wu)V?Ya2$o|r3Z891Xo>9_hOR8Y?-<~ z2f;m|6*A5Ke~8dER5A*K%{;`^N1zVmxSueiWV`r=c_ssZff&LVhpoAq1JoxE*~G6b zgUGh0k)oOGoKieuatI{~j1mD&1qjH37tV^ixEQYiK?)+n=9wo}u+{H64m5s4>iBKu zuM8auNNguAlsl;~gB$NSEQoTGL%7t$kd0!Je~~&2<4_RZz>56z3eYnvCEdd2*(6<9 z+?#8~n&cEzG`wGw1<9KP%7!FYxr;Pj5Ip|iaeM#?g@a9$7nUfcoP>Z|MOs;ge7%tg z#>)usJJh8iAyD~M6u*dPS||wf zfl@MBhgCM%p>|VkN?WvPVTj;8^kEV~E~5Dg3qUibp3_JNhL0|{k3U1P4}I8zfJ~hF zOi@EpCdf9P5R{dJ@&qfA3&27F**Bld_hI-2Ar)a)YTqtHXp_8t61`*$at@HlFi=oY z>MQ63J_z!#Sg0Xn4&4gySqMl*25-wdCm~Yv%m^qaZX66`FT^!L0kln(0iLY13Ihcp zLKKILHi@6f8=>HNffwR1`aq_tpvs^wb*tUXoQ>HUF>sDCC_N-LNfG!pj+Ib-jd4s$ z84P1VlR8EL9VAB0i@8i&xic{2V}uSV!Qv7HuLs^uf_Ee&yF?@o=^@o^wz8Cp(2^G0 zZ7^(Lu%>2J&~k1{YlDq^1&9Vb1Rk;a$YUo+jg|wFTUHN-5NQUDYTItmv580}V54Xo zaWiE#nQfrmBVj3&Wp2uc0p(OF+#sd60fB-rcM&j*g!Rz9V?08t3TR^|T9i;MC}_gX z=YT2qC}8%FzkpanEzW_jGGGq07-NAW5hQ7}G(P*=@vEt0{J`=M%dMG(1B2i56;rWy~} z)`LK6gA>4s^yPrKW%UVg%9nP8fkRLXLCRAE8@(nl7@%lX_U9X0B4(7sV*te`Z3CMc ziF%O4AY;7es|3OzA|^sAO-#bZ>I$_Cu&s@=GOJO5l(n%&X^hNql(bYTW(Fh1vk1s+ z#Lo=EQZ(;T1QN+=(-mQbQWRiFIC2tl5%!TJr-^TX$WI&ybIBDdcCt9sT6AVighXPA zP)1`Ec6KLfAfYCT03k^kf&vIlaJnKeRK;;I;>{#)EHbJJvUy{cQ)N&oNYQ3O6|`Cd zHK24zg^kJq$y0ocNTDg*HMW%%1noLFMg>qKI>qZYhY2qV9%m^o8A821Jk z6cTR`lkq+|;D@A5A~q=sViMw=4s0&M_1K2-$U=eL0xJVP&1_Y7s5#9R5FkW>1K+B? zEmNTc^#e1|IgLm=LZBXpr70-Q`rY+8G-l$ zoCN50;Cy3BGynhq literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 b/openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4bd53a8a5b4a5378b2f6a249d0c5ef2752606db4 GIT binary patch literal 1577 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/079-jiffies64.bz2 b/openwrt/package/linux/kernel-patches/079-jiffies64.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..498f1fb3e4ca660c14de5a51566766ea8b09be48 GIT binary patch literal 4774 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/100_VERSION.bz2 b/openwrt/package/linux/kernel-patches/100_VERSION.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cd4ee5d700c68d95dbbecbdb91b9d9f30dded919 GIT binary patch literal 235 zcmVHEpo}#= zO&Ky^0%*`M(9=K)00w{nWHbpx)M#okBWgCIX&D(kPiZDK9+5*lwRIf1u?jf0)E1z2 z0|JxDDh4M+tFJLaxS=#W5~;+D$UW?HN=Jhd ltgM{Q#%JMY6DbUbjgY31OeZrlhG%p9UC9*TLPGdkqIehaWLE$H literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/linux.config b/openwrt/package/linux/linux.config new file mode 100644 index 0000000000..60424cef4a --- /dev/null +++ b/openwrt/package/linux/linux.config @@ -0,0 +1,853 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_MIPS=y +CONFIG_MIPS32=y +# CONFIG_MIPS64 is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# Machine selection +# +# CONFIG_ACER_PICA_61 is not set +# CONFIG_MIPS_DB1000 is not set +# CONFIG_MIPS_DB1100 is not set +# CONFIG_MIPS_DB1500 is not set +# CONFIG_MIPS_PB1000 is not set +# CONFIG_MIPS_PB1100 is not set +# CONFIG_MIPS_PB1500 is not set +# CONFIG_BAGET_MIPS is not set +# CONFIG_CASIO_E55 is not set +# CONFIG_MIPS_COBALT is not set +# CONFIG_DECSTATION is not set +# CONFIG_MIPS_EV64120 is not set +# CONFIG_MIPS_EV96100 is not set +# CONFIG_MIPS_IVR is not set +# CONFIG_HP_LASERJET is not set +# CONFIG_IBM_WORKPAD is not set +# CONFIG_LASAT is not set +# CONFIG_MIPS_ITE8172 is not set +# CONFIG_MIPS_ATLAS is not set +# CONFIG_MIPS_MAGNUM_4000 is not set +# CONFIG_MIPS_MALTA is not set +# CONFIG_MIPS_SEAD is not set +# CONFIG_MOMENCO_OCELOT is not set +# CONFIG_MOMENCO_OCELOT_G is not set +# CONFIG_DDB5074 is not set +# CONFIG_DDB5476 is not set +# CONFIG_DDB5477 is not set +# CONFIG_NEC_OSPREY is not set +# CONFIG_NEC_EAGLE is not set +# CONFIG_OLIVETTI_M700 is not set +# CONFIG_NINO is not set +# CONFIG_SGI_IP22 is not set +# CONFIG_SGI_IP27 is not set +# CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SB1xxx_SOC is not set +CONFIG_MIPS_BRCM=y +CONFIG_BCM947XX=y +CONFIG_BCM4710=y +CONFIG_BCM4310=y +CONFIG_BCM4704=y +# CONFIG_BCM5365 is not set +# CONFIG_SNI_RM200_PCI is not set +# CONFIG_TOSHIBA_JMR3927 is not set +# CONFIG_VICTOR_MPC30X is not set +# CONFIG_ZAO_CAPCELLA is not set +# CONFIG_HIGHMEM is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit noinitrd console=ttyS0,115200" +CONFIG_PCI=y +CONFIG_NONCOHERENT_IO=y +CONFIG_NEW_TIME_C=y +CONFIG_NEW_IRQ=y +CONFIG_HND=y +# CONFIG_MIPS_AU1000 is not set + +# +# CPU selection +# +CONFIG_CPU_MIPS32=y +# CONFIG_CPU_MIPS64 is not set +# CONFIG_CPU_R3000 is not set +# CONFIG_CPU_TX39XX is not set +# CONFIG_CPU_VR41XX is not set +# CONFIG_CPU_R4300 is not set +# CONFIG_CPU_R4X00 is not set +# CONFIG_CPU_TX49XX is not set +# CONFIG_CPU_R5000 is not set +# CONFIG_CPU_R5432 is not set +# CONFIG_CPU_R6000 is not set +# CONFIG_CPU_NEVADA is not set +# CONFIG_CPU_R8000 is not set +# CONFIG_CPU_R10000 is not set +# CONFIG_CPU_RM7000 is not set +# CONFIG_CPU_SB1 is not set +CONFIG_CPU_HAS_PREFETCH=y +# CONFIG_VTAG_ICACHE is not set +# CONFIG_64BIT_PHYS_ADDR is not set +# CONFIG_CPU_ADVANCED is not set +CONFIG_CPU_HAS_LLSC=y +# CONFIG_CPU_HAS_LLDSCD is not set +# CONFIG_CPU_HAS_WB is not set +CONFIG_CPU_HAS_SYNC=y + +# +# General setup +# +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_NET=y +# CONFIG_PCI_NAMES is not set +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_TC is not set +# CONFIG_MCA is not set +# CONFIG_SBUS is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +# CONFIG_PCMCIA is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +# CONFIG_HOTPLUG_PCI_ACPI is not set +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +# CONFIG_PRINT_SYSCALLS is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_MIPS32_COMPAT is not set +# CONFIG_MIPS32_O32 is not set +# CONFIG_MIPS32_N32 is not set +# CONFIG_BINFMT_ELF32 is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_CONCAT is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLOCK is not set +CONFIG_MTD_BLOCK_RO=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +CONFIG_MTD_CFI_B2=y +# CONFIG_MTD_CFI_B4 is not set +CONFIG_MTD_CFI_I1=y +# CONFIG_MTD_CFI_I2 is not set +# CONFIG_MTD_CFI_I4 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_SSTSTD=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set +# CONFIG_MTD_JEDEC is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_BCM947XX=y +# CONFIG_MTD_PB1000 is not set +# CONFIG_MTD_PB1500 is not set +# CONFIG_MTD_PB1100 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_LASAT is not set +# CONFIG_MTD_PCI is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_SFLASH=y +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_MSYS is not set +# CONFIG_NOROOT is not set +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NBD=m +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +# CONFIG_BLK_STATS is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_NETSWAP=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +# CONFIG_IP_ROUTE_VERBOSE is not set +# CONFIG_IP_ROUTE_LARGE_TABLES is not set +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=y +CONFIG_IP_NF_FTP=y +CONFIG_IP_NF_H323=y +CONFIG_IP_NF_CONNTRACK_MARK=y +# CONFIG_IP_NF_AMANDA is not set +CONFIG_IP_NF_TFTP=y +CONFIG_IP_NF_IRC=y +CONFIG_IP_NF_CT_PROTO_GRE=y +CONFIG_IP_NF_PPTP=y +CONFIG_IP_NF_MMS=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_SET=m +CONFIG_IP_NF_SET_MAX=256 +CONFIG_IP_NF_SET_IPMAP=m +CONFIG_IP_NF_SET_PORTMAP=m +CONFIG_IP_NF_SET_MACIPMAP=m +CONFIG_IP_NF_SET_IPHASH=m +CONFIG_IP_NF_MATCH_QUOTA=m +CONFIG_IP_NF_POOL=m +CONFIG_IP_POOL_STATISTICS=y +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_DSTLIMIT=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=y +CONFIG_IP_NF_MATCH_MULTIPORT=y +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_CONDITION=m +# CONFIG_IP_NF_MATCH_RANDOM is not set +CONFIG_IP_NF_MATCH_PSD=m +# CONFIG_IP_NF_MATCH_OSF is not set +# CONFIG_IP_NF_MATCH_NTH is not set +CONFIG_IP_NF_MATCH_IPV4OPTIONS=m +# CONFIG_IP_NF_MATCH_FUZZY is not set +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +# CONFIG_IP_NF_MATCH_U32 is not set +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=y +# CONFIG_IP_NF_MATCH_REALM is not set +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=y +CONFIG_IP_NF_MATCH_CONNMARK=m +CONFIG_IP_NF_MATCH_CONNLIMIT=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_UNCLEAN=m +CONFIG_IP_NF_MATCH_STRING=m +# CONFIG_IP_NF_MATCH_OWNER is not set +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_TARGET_NETLINK=m +CONFIG_IP_NF_TARGET_IPV4OPTSSTRIP=m +CONFIG_IP_NF_TARGET_MIRROR=m +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_NAT_H323=y +# CONFIG_IP_NF_TARGET_SAME is not set +# CONFIG_IP_NF_TARGET_NETMAP is not set +CONFIG_IP_NF_NAT_PPTP=y +CONFIG_IP_NF_NAT_PROTO_GRE=y +# CONFIG_IP_NF_NAT_LOCAL is not set +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=y +CONFIG_IP_NF_NAT_MMS=y +CONFIG_IP_NF_NAT_FTP=y +CONFIG_IP_NF_NAT_TFTP=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=y +CONFIG_IP_NF_TARGET_IPMARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=y +CONFIG_IP_NF_TARGET_CONNMARK=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=y +# CONFIG_IP_NF_RAW is not set +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IPV6=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +# CONFIG_IP6_NF_MATCH_RANDOM is not set +# CONFIG_IP6_NF_MATCH_NTH is not set +# CONFIG_IP6_NF_MATCH_FUZZY is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_HL is not set +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_AHESP is not set +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +# CONFIG_IP6_NF_TARGET_HL is not set +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +CONFIG_VLAN_8021Q=y +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +CONFIG_BRIDGE=y +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_IPF=m +CONFIG_BRIDGE_EBT_ARPF=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_VLANF=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_MARKF=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_MARK_T=m +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +CONFIG_WAN_ROUTER=m +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_CSZ=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set +# CONFIG_PHONE_IXJ is not set +# CONFIG_PHONE_IXJ_PCMCIA is not set + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_PCI is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# Broadcom HND network devices +# +CONFIG_HND=y +# CONFIG_IL is not set +CONFIG_ET=m +# CONFIG_ET_4413 is not set +CONFIG_ET_47XX=y +CONFIG_WL=m +CONFIG_WL_AP=y +CONFIG_WL_STA=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +# CONFIG_STRIP is not set +# CONFIG_WAVELAN is not set +# CONFIG_ARLAN is not set +# CONFIG_AIRONET4500 is not set +# CONFIG_AIRONET4500_NONCS is not set +# CONFIG_AIRONET4500_PROC is not set +# CONFIG_AIRO is not set +# CONFIG_HERMES is not set +# CONFIG_PLX_HERMES is not set +# CONFIG_PCI_HERMES is not set +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +CONFIG_SHAPER=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=128 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y +# CONFIG_ACQUIRE_WDT is not set +# CONFIG_ADVANTECH_WDT is not set +# CONFIG_ALIM7101_WDT is not set +# CONFIG_SC520_WDT is not set +# CONFIG_PCWATCHDOG is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +# CONFIG_WAFER_WDT is not set +# CONFIG_I810_TCO is not set +# CONFIG_MIXCOMWD is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SC1200_WDT is not set +CONFIG_SOFT_WATCHDOG=y +# CONFIG_W83877F_WDT is not set +# CONFIG_WDT is not set +# CONFIG_WDTPCI is not set +# CONFIG_MACHZ_WDT is not set +# CONFIG_INDYDOG is not set +# CONFIG_AMD7XX_TCO is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# File systems +# +CONFIG_BLKDEV_SWAP=m +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_BBC_ARMLIB is not set +CONFIG_JFFS2_BBC_LZO=y +CONFIG_JFFS2_BBC_LZARI=y +CONFIG_JFFS2_BBC_LZHD=y +CONFIG_JFFS2_BBC_LZSS=y +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +CONFIG_DEVFS_FS=y +CONFIG_DEVFS_MOUNT=y +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +CONFIG_SWAP_VIA_NFS=m +CONFIG_NETSWAP=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MSDOS_PARTITION is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Support for USB gadgets +# +# CONFIG_USB_GADGET is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +CONFIG_CROSSCOMPILE=y +# CONFIG_KERNPROF is not set +# CONFIG_MCOUNT is not set +# CONFIG_DEBUG is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_MIPS_UNCACHED is not set +# CONFIG_KTRACE is not set +# CONFIG_HWSIM is not set + +# +# Library routines +# +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y diff --git a/openwrt/package/linux/linux.mk b/openwrt/package/linux/linux.mk new file mode 100644 index 0000000000..69245b083c --- /dev/null +++ b/openwrt/package/linux/linux.mk @@ -0,0 +1,115 @@ +############################################################# +# +# Linux kernel targets +# +# Note: If you have any patches to apply, create the directory +# sources/kernel-patches and put your patches in there and number +# them in the order you wish to apply them... i.e. +# +# sources/kernel-patches/001-my-special-stuff.bz2 +# sources/kernel-patches/003-gcc-Os.bz2 +# sources/kernel-patches/004_no-warnings.bz2 +# sources/kernel-patches/030-lowlatency-mini.bz2 +# sources/kernel-patches/031-lowlatency-fixes-5.bz2 +# sources/kernel-patches/099-shutup.bz2 +# etc... +# +# these patches will all be applied by the patch-kernel.sh +# script (which will also abort the build if it finds rejects) +# -Erik +# +############################################################# +ifneq ($(filter $(TARGETS),linux),) + +# Version of Linux to download and then apply patches to +DOWNLOAD_LINUX_VERSION=2.4.27 +# Version of Linux AFTER patches +LINUX_VERSION=2.4.28-pre4-erik + +LINUX_FORMAT=vmlinux +#LINUX_FORMAT=images/zImage.prep +LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ + -e 's/mipsel/mips/' \ + -e 's/powerpc/ppc/' \ + -e 's/sh[234]/sh/' \ + ) +LINUX_BINLOC=arch/$(LINUX_KARCH)/boot/$(LINUX_FORMAT) + +LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION) +LINUX_SOURCE=linux-$(DOWNLOAD_LINUX_VERSION).tar.bz2 +LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.4 +LINUX_KCONFIG=package/linux/linux.config +LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel +# Used by pcmcia-cs and others +LINUX_SOURCE_DIR=$(LINUX_DIR) + + +$(DL_DIR)/$(LINUX_SOURCE): + -mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE) + +$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE) + -mkdir -p $(TOOL_BUILD_DIR) + -(cd $(TOOL_BUILD_DIR); ln -sf $(LINUX_DIR) linux) + bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - +ifneq ($(DOWNLOAD_LINUX_VERSION),$(LINUX_VERSION)) + # Rename the dir from the downloaded version to the AFTER patch version + mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX_VERSION) $(BUILD_DIR)/linux-$(LINUX_VERSION) +endif + mkdir -p package/linux/kernel-patches + toolchain/patch-kernel.sh $(LINUX_DIR) package/linux/kernel-patches + touch $(LINUX_DIR)/.unpacked + +$(LINUX_KCONFIG): + @if [ ! -f "$(LINUX_KCONFIG)" ] ; then \ + echo ""; \ + echo "You should create a .config for your kernel"; \ + echo "and install it as $(LINUX_KCONFIG)"; \ + echo ""; \ + sleep 5; \ + fi; + +$(LINUX_DIR)/.configured $(BUILD_DIR)/linux/.configured: $(LINUX_DIR)/.unpacked $(LINUX_KCONFIG) + $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile + -cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) oldconfig include/linux/version.h + touch $(LINUX_DIR)/.configured + +$(LINUX_DIR)/.depend_done: $(LINUX_DIR)/.configured + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) dep + touch $(LINUX_DIR)/.depend_done + +$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) $(LINUX_FORMAT) + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) modules + +$(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC) + cp -fa $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_KERNEL) + touch -c $(LINUX_KERNEL) + +$(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep: $(LINUX_KERNEL) + rm -rf $(TARGET_DIR)/lib/modules + rm -f $(TARGET_DIR)/sbin/cardmgr + $(MAKE) -C $(LINUX_DIR) INSTALL_MOD_PATH=$(TARGET_DIR) modules_install + (cd $(TARGET_DIR)/lib/modules; ln -s $(LINUX_VERSION)/kernel/drivers .) + +$(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured + mkdir -p $(STAGING_DIR)/include + tar -ch -C $(LINUX_DIR)/include -f - linux | tar -xf - -C $(STAGING_DIR)/include/ + tar -ch -C $(LINUX_DIR)/include -f - asm | tar -xf - -C $(STAGING_DIR)/include/ + +linux: $(STAGING_DIR)/include/linux/version.h $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep + +linux-source: $(DL_DIR)/$(LINUX_SOURCE) + +# This has been renamed so we do _NOT_ by default run this on 'make clean' +linuxclean: clean + rm -f $(LINUX_KERNEL) + -$(MAKE) -C $(LINUX_DIR) clean + +linux-dirclean: + rm -rf $(LINUX_DIR) + +linux-headers: $(LINUX_DIR)/.configured + +endif diff --git a/openwrt/package/sed/Config.in b/openwrt/package/sed/Config.in new file mode 100644 index 0000000000..5cfc12d41f --- /dev/null +++ b/openwrt/package/sed/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_SED + bool "sed" + default n + help + Super-useful stream editor. + + http://sed.sourceforge.net/ + + Most people will answer Y. diff --git a/openwrt/package/sed/Makefile.in b/openwrt/package/sed/Makefile.in new file mode 100644 index 0000000000..6738e4f246 --- /dev/null +++ b/openwrt/package/sed/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_SED)),y) +TARGETS+=sed +endif diff --git a/openwrt/package/sed/sed.mk b/openwrt/package/sed/sed.mk new file mode 100644 index 0000000000..5154c1f795 --- /dev/null +++ b/openwrt/package/sed/sed.mk @@ -0,0 +1,136 @@ +############################################################# +# +# sed +# +############################################################# +SED_VER:=4.1.2 +SED_SOURCE:=sed-$(SED_VER).tar.gz +SED_SITE:=ftp://ftp.gnu.org/gnu/sed +SED_CAT:=zcat +SED_DIR1:=$(TOOL_BUILD_DIR)/sed-$(SED_VER) +SED_DIR2:=$(BUILD_DIR)/sed-$(SED_VER) +SED_BINARY:=sed/sed +SED_TARGET_BINARY:=bin/sed +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +SED_CPPFLAGS=-D_FILE_OFFSET_BITS=64 +endif +SED:=$(STAGING_DIR)/bin/sed -i -e +HOST_SED_TARGET=$(shell package/sed/sedcheck.sh) + +$(DL_DIR)/$(SED_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(SED_SITE)/$(SED_SOURCE) + +sed-source: $(DL_DIR)/$(SED_SOURCE) + + +############################################################# +# +# build sed for use on the host system +# +############################################################# +$(SED_DIR1)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + mkdir -p $(STAGING_DIR)/bin; + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(SED_DIR1)/.unpacked + +$(SED_DIR1)/.configured: $(SED_DIR1)/.unpacked + (cd $(SED_DIR1); rm -rf config.cache; \ + ./configure \ + --prefix=$(STAGING_DIR) \ + --prefix=/usr \ + ); + touch $(SED_DIR1)/.configured + +$(SED_DIR1)/$(SED_BINARY): $(SED_DIR1)/.configured + $(MAKE) -C $(SED_DIR1) + +# This stuff is needed to work around GNU make deficiencies +build-sed-host-binary: $(SED_DIR1)/$(SED_BINARY) + @if [ -L $(STAGING_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); fi; + @if [ ! -f $(STAGING_DIR)/$(SED_TARGET_BINARY) -o $(STAGING_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR1)/$(SED_BINARY) ] ; then \ + set -x; \ + mkdir -p $(STAGING_DIR)/bin; \ + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) install; \ + mv $(STAGING_DIR)/usr/bin/sed $(STAGING_DIR)/bin/; \ + rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/usr/info \ + $(STAGING_DIR)/usr/man $(STAGING_DIR)/usr/share/doc; fi + +use-sed-host-binary: + @if [ -x /usr/bin/sed ]; then SED="/usr/bin/sed"; else \ + if [ -x /bin/sed ]; then SED="/bin/sed"; fi; fi; \ + mkdir -p $(STAGING_DIR)/bin; \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); \ + ln -s $$SED $(STAGING_DIR)/$(SED_TARGET_BINARY) + +host-sed: $(HOST_SED_TARGET) + +host-sed-clean: + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) uninstall + -$(MAKE) -C $(SED_DIR1) clean + +host-sed-dirclean: + rm -rf $(SED_DIR1) + + +############################################################# +# +# build sed for use on the target system +# +############################################################# +$(SED_DIR2)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(SED_DIR2)/.unpacked + +$(SED_DIR2)/.configured: $(SED_DIR2)/.unpacked + (cd $(SED_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CPPFLAGS="$(SED_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(SED_DIR2)/.configured + +$(SED_DIR2)/$(SED_BINARY): $(SED_DIR2)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(SED_DIR2) + +# This stuff is needed to work around GNU make deficiencies +sed-target_binary: $(SED_DIR2)/$(SED_BINARY) + @if [ -L $(TARGET_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(SED_TARGET_BINARY); fi; + + @if [ ! -f $(SED_DIR2)/$(SED_BINARY) -o $(TARGET_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR2)/$(SED_BINARY) ] ; then \ + set -x; \ + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) install; \ + mv $(TARGET_DIR)/usr/bin/sed $(TARGET_DIR)/bin/; \ + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi + +sed: uclibc sed-target_binary + +sed-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) uninstall + -$(MAKE) -C $(SED_DIR2) clean + +sed-dirclean: + rm -rf $(SED_DIR2) + + diff --git a/openwrt/package/sed/sedcheck.sh b/openwrt/package/sed/sedcheck.sh new file mode 100755 index 0000000000..4d645b6ab0 --- /dev/null +++ b/openwrt/package/sed/sedcheck.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +if [ -x /usr/bin/sed ]; then + SED="/usr/bin/sed"; +else + if [ -x /bin/sed ]; then + SED="/bin/sed"; + fi; +fi; + +echo "HELLO" > .sedtest +$SED -i -e "s/HELLO/GOODBYE/" .sedtest >/dev/null 2>&1 + +if [ $? != 0 ] ; then + echo build-sed-host-binary +else + echo use-sed-host-binary +fi; +rm -f .sedtest + + diff --git a/openwrt/target/Config.in b/openwrt/target/Config.in new file mode 100644 index 0000000000..18d4114e6d --- /dev/null +++ b/openwrt/target/Config.in @@ -0,0 +1,8 @@ +# + +menu "Target Filesystem" + +source "target/jffs2/Config.in" + +endmenu + diff --git a/openwrt/target/Makefile.in b/openwrt/target/Makefile.in new file mode 100644 index 0000000000..c01ade299a --- /dev/null +++ b/openwrt/target/Makefile.in @@ -0,0 +1 @@ +# Nothing diff --git a/openwrt/target/default/device_table.txt b/openwrt/target/default/device_table.txt new file mode 100644 index 0000000000..8b46ca0323 --- /dev/null +++ b/openwrt/target/default/device_table.txt @@ -0,0 +1,162 @@ +# When building a target filesystem, it is desirable to not have to +# become root and then run 'mknod' a thousand times. Using a device +# table you can create device nodes and directories "on the fly". +# +# This is a sample device table file for use with genext2fs. You can +# do all sorts of interesting things with a device table file. For +# example, if you want to adjust the permissions on a particular file +# you can just add an entry like: +# /sbin/foobar f 2755 0 0 - - - - - +# and (assuming the file /sbin/foobar exists) it will be made setuid +# root (regardless of what its permissions are on the host filesystem. +# Furthermore, you can use a single table entry to create a many device +# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] +# I could just use the following two table entries: +# /dev/hda b 640 0 0 3 0 0 0 - +# /dev/hda b 640 0 0 3 1 1 1 15 +# +# Device table entries take the form of: +# +# where name is the file name, type can be one of: +# f A regular file +# d Directory +# c Character special device file +# b Block special device file +# p Fifo (named pipe) +# uid is the user id for the target file, gid is the group id for the +# target file. The rest of the entries (major, minor, etc) apply only +# to device special files. + +# Have fun +# -Erik Andersen +# + +# +/dev d 755 0 0 - - - - - +/dev/pts d 755 0 0 - - - - - +/tmp d 1777 0 0 - - - - - +/etc d 755 0 0 - - - - - +/home/default d 2755 1000 1000 - - - - - +# +/bin/busybox f 4755 0 0 - - - - - +/etc/shadow f 600 0 0 - - - - - +/etc/passwd f 644 0 0 - - - - - +/etc/network/if-up.d d 755 0 0 - - - - - +/etc/network/if-pre-up.d d 755 0 0 - - - - - +/etc/network/if-down.d d 755 0 0 - - - - - +/etc/network/if-post-down.d d 755 0 0 - - - - - +/usr/share/udhcpc/default.script f 755 0 0 - - - - - +# uncomment this to allow starting x as non-root +#/usr/X11R6/bin/Xfbdev f 4755 0 0 - - - - - +# Normal system devices +/dev/mem c 640 0 0 1 1 0 0 - +/dev/kmem c 640 0 0 1 2 0 0 - +/dev/null c 666 0 0 1 3 0 0 - +/dev/zero c 666 0 0 1 5 0 0 - +/dev/random c 666 0 0 1 8 0 0 - +/dev/urandom c 666 0 0 1 9 0 0 - +/dev/ram b 640 0 0 1 1 0 0 - +/dev/ram b 640 0 0 1 0 0 1 4 +/dev/loop b 640 0 0 7 0 0 1 2 +/dev/rtc c 640 0 0 10 135 - - - +/dev/console c 666 0 0 5 1 - - - +/dev/tty c 666 0 0 5 0 - - - +/dev/tty c 666 0 0 4 0 0 1 8 +/dev/ttyp c 666 0 0 3 0 0 1 10 +/dev/ptyp c 666 0 0 2 0 0 1 10 +/dev/ptmx c 666 0 0 5 2 - - - +/dev/ttyP c 666 0 0 57 0 0 1 4 +/dev/ttyS c 666 0 0 4 64 0 1 4 +/dev/fb c 640 0 5 29 0 0 32 4 +#/dev/ttySA c 666 0 0 204 5 0 1 3 +/dev/psaux c 666 0 0 10 1 0 0 - +#/dev/ppp c 666 0 0 108 0 - - - + +# MTD stuff +/dev/mtd c 640 0 0 90 0 0 2 4 +/dev/mtdblock b 640 0 0 31 0 0 1 4 + +#Tun/tap driver +/dev/net d 755 0 0 - - - - - +/dev/net/tun c 660 0 0 10 200 - - - + +# Audio stuff +#/dev/audio c 666 0 29 14 4 - - - +#/dev/audio1 c 666 0 29 14 20 - - - +#/dev/dsp c 666 0 29 14 3 - - - +#/dev/dsp1 c 666 0 29 14 19 - - - +#/dev/sndstat c 666 0 29 14 6 - - - + +# User-mode Linux stuff +/dev/ubda b 640 0 0 98 0 0 0 - +/dev/ubda b 640 0 0 98 1 1 1 15 + +# IDE Devices +/dev/hda b 640 0 0 3 0 0 0 - +/dev/hda b 640 0 0 3 1 1 1 15 +/dev/hdb b 640 0 0 3 64 0 0 - +/dev/hdb b 640 0 0 3 65 1 1 15 +#/dev/hdc b 640 0 0 22 0 0 0 - +#/dev/hdc b 640 0 0 22 1 1 1 15 +#/dev/hdd b 640 0 0 22 64 0 0 - +#/dev/hdd b 640 0 0 22 65 1 1 15 +#/dev/hde b 640 0 0 33 0 0 0 - +#/dev/hde b 640 0 0 33 1 1 1 15 +#/dev/hdf b 640 0 0 33 64 0 0 - +#/dev/hdf b 640 0 0 33 65 1 1 15 +#/dev/hdg b 640 0 0 34 0 0 0 - +#/dev/hdg b 640 0 0 34 1 1 1 15 +#/dev/hdh b 640 0 0 34 64 0 0 - +#/dev/hdh b 640 0 0 34 65 1 1 15 + +# SCSI Devices +#/dev/sda b 640 0 0 8 0 0 0 - +#/dev/sda b 640 0 0 8 1 1 1 15 +#/dev/sdb b 640 0 0 8 16 0 0 - +#/dev/sdb b 640 0 0 8 17 1 1 15 +#/dev/sdc b 640 0 0 8 32 0 0 - +#/dev/sdc b 640 0 0 8 33 1 1 15 +#/dev/sdd b 640 0 0 8 48 0 0 - +#/dev/sdd b 640 0 0 8 49 1 1 15 +#/dev/sde b 640 0 0 8 64 0 0 - +#/dev/sde b 640 0 0 8 65 1 1 15 +#/dev/sdf b 640 0 0 8 80 0 0 - +#/dev/sdf b 640 0 0 8 81 1 1 15 +#/dev/sdg b 640 0 0 8 96 0 0 - +#/dev/sdg b 640 0 0 8 97 1 1 15 +#/dev/sdh b 640 0 0 8 112 0 0 - +#/dev/sdh b 640 0 0 8 113 1 1 15 +#/dev/sg c 640 0 0 21 0 0 1 15 +#/dev/scd b 640 0 0 11 0 0 1 15 +#/dev/st c 640 0 0 9 0 0 1 8 +#/dev/nst c 640 0 0 9 128 0 1 8 +#/dev/st c 640 0 0 9 32 1 1 4 +#/dev/st c 640 0 0 9 64 1 1 4 +#/dev/st c 640 0 0 9 96 1 1 4 + +# Floppy disk devices +#/dev/fd b 640 0 0 2 0 0 1 2 +#/dev/fd0d360 b 640 0 0 2 4 0 0 - +#/dev/fd1d360 b 640 0 0 2 5 0 0 - +#/dev/fd0h1200 b 640 0 0 2 8 0 0 - +#/dev/fd1h1200 b 640 0 0 2 9 0 0 - +#/dev/fd0u1440 b 640 0 0 2 28 0 0 - +#/dev/fd1u1440 b 640 0 0 2 29 0 0 - +#/dev/fd0u2880 b 640 0 0 2 32 0 0 - +#/dev/fd1u2880 b 640 0 0 2 33 0 0 - + +# All the proprietary cdrom devices in the world +#/dev/aztcd b 640 0 0 29 0 0 0 - +#/dev/bpcd b 640 0 0 41 0 0 0 - +#/dev/capi20 c 640 0 0 68 0 0 1 2 +#/dev/cdu31a b 640 0 0 15 0 0 0 - +#/dev/cdu535 b 640 0 0 24 0 0 0 - +#/dev/cm206cd b 640 0 0 32 0 0 0 - +#/dev/sjcd b 640 0 0 18 0 0 0 - +#/dev/sonycd b 640 0 0 15 0 0 0 - +#/dev/gscd b 640 0 0 16 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 1 4 +#/dev/mcd b 640 0 0 23 0 0 0 - +#/dev/optcd b 640 0 0 17 0 0 0 - + diff --git a/openwrt/target/default/skel.tar.gz b/openwrt/target/default/skel.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa6ba5518663acc7614d726718b3c4d59f720a6d GIT binary patch literal 4846 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 F{2%ai`9J^w literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/etc/TZ b/openwrt/target/default/target_skeleton/etc/TZ new file mode 100644 index 0000000000..9fcb2a3c56 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/TZ @@ -0,0 +1 @@ +MST7MDT diff --git a/openwrt/target/default/target_skeleton/etc/fstab b/openwrt/target/default/target_skeleton/etc/fstab new file mode 100644 index 0000000000..6d33629a7b --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/fstab @@ -0,0 +1,8 @@ +# /etc/fstab: static file system information. +# +# +/dev/root / ext2 rw,noauto 0 1 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts defaults,gid=5,mode=620 0 0 +tmpfs /tmp tmpfs defaults 0 0 + diff --git a/openwrt/target/default/target_skeleton/etc/group b/openwrt/target/default/target_skeleton/etc/group new file mode 100644 index 0000000000..a21ef0f769 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/group @@ -0,0 +1,10 @@ +root:x:0: +daemon:x:1: +bin:x:2: +sys:x:3: +adm:x:4: +tty:x:5: +disk:x:6: +utmp:x:43: +staff:x:50: +default:x:1000: diff --git a/openwrt/target/default/target_skeleton/etc/hostname b/openwrt/target/default/target_skeleton/etc/hostname new file mode 100644 index 0000000000..52e67d68aa --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/hostname @@ -0,0 +1 @@ +uclibc diff --git a/openwrt/target/default/target_skeleton/etc/hosts b/openwrt/target/default/target_skeleton/etc/hosts new file mode 100644 index 0000000000..ba712fe033 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/hosts @@ -0,0 +1 @@ +127.0.0.1 localhost diff --git a/openwrt/target/default/target_skeleton/etc/init.d/S20urandom b/openwrt/target/default/target_skeleton/etc/init.d/S20urandom new file mode 100755 index 0000000000..433fafee4e --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/S20urandom @@ -0,0 +1,44 @@ +#! /bin/sh +# +# urandom This script saves the random seed between reboots. +# It is called from the boot, halt and reboot scripts. +# +# Version: @(#)urandom 1.33 22-Jun-1998 miquels@cistron.nl +# + +[ -c /dev/urandom ] || exit 0 +#. /etc/default/rcS + +case "$1" in + start|"") + if [ "$VERBOSE" != no ] + then + echo -n "Initializing random number generator... " + fi + # Load and then save 512 bytes, + # which is the size of the entropy pool + if [ -f /etc/random-seed ] + then + cat /etc/random-seed >/dev/urandom + fi + rm -f /etc/random-seed + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom start: failed." + umask 022 + [ "$VERBOSE" != no ] && echo "done." + ;; + stop) + # Carry a random seed from shut-down to start-up; + # see documentation in linux/drivers/char/random.c + [ "$VERBOSE" != no ] && echo -n "Saving random seed... " + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom stop: failed." + [ "$VERBOSE" != no ] && echo "done." + ;; + *) + echo "Usage: urandom {start|stop}" >&2 + exit 1 + ;; +esac diff --git a/openwrt/target/default/target_skeleton/etc/init.d/S40network b/openwrt/target/default/target_skeleton/etc/init.d/S40network new file mode 100755 index 0000000000..d835d9c72a --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/S40network @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Start the network.... +# + +start() { + echo "Starting network..." + /sbin/ifup -a +} +stop() { + echo -n "Stopping network..." + /sbin/ifdown -a +} +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 +esac + +exit $? + diff --git a/openwrt/target/default/target_skeleton/etc/init.d/rcS b/openwrt/target/default/target_skeleton/etc/init.d/rcS new file mode 100755 index 0000000000..de411534da --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/rcS @@ -0,0 +1,27 @@ +#!/bin/sh + + +# Start all init scripts in /etc/init.d +# executing them in numerical order. +# +for i in /etc/init.d/S??* ;do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set start + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i start + ;; + esac +done + diff --git a/openwrt/target/default/target_skeleton/etc/inittab b/openwrt/target/default/target_skeleton/etc/inittab new file mode 100644 index 0000000000..a6c014e751 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/inittab @@ -0,0 +1,47 @@ +# /etc/inittab +# +# Copyright (C) 2001 Erik Andersen +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. +# +# Format for each entry: ::: +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + +# Startup the system +null::sysinit:/bin/mount -o remount,rw / +null::sysinit:/bin/mount -t proc proc /proc +null::sysinit:/bin/mount -a +null::sysinit:/bin/hostname -F /etc/hostname +null::sysinit:/sbin/ifconfig lo 127.0.0.1 up +null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo +# now run any rc scripts +::sysinit:/etc/init.d/rcS + +# Set up a couple of getty's +tty1::respawn:/sbin/getty 38400 tty1 +tty2::respawn:/sbin/getty 38400 tty2 + +# Put a getty on the serial port +#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 + +# Logging junk +null::sysinit:/bin/touch /var/log/messages +null::respawn:/sbin/syslogd -n -m 0 +null::respawn:/sbin/klogd -n +tty3::respawn:/usr/bin/tail -f /var/log/messages + +# Stuff to do for the 3-finger salute +::ctrlaltdel:/sbin/reboot + +# Stuff to do before rebooting +null::shutdown:/usr/bin/killall klogd +null::shutdown:/usr/bin/killall syslogd +null::shutdown:/bin/umount -a -r +null::shutdown:/sbin/swapoff -a + diff --git a/openwrt/target/default/target_skeleton/etc/inputrc b/openwrt/target/default/target_skeleton/etc/inputrc new file mode 100644 index 0000000000..2f1cb601a5 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/inputrc @@ -0,0 +1,44 @@ +# /etc/inputrc - global inputrc for libreadline +# See readline(3readline) and `info readline' for more information. + +# Be 8 bit clean. +set input-meta on +set output-meta on +set bell-style visible + +# To allow the use of 8bit-characters like the german umlauts, comment out +# the line below. However this makes the meta key not work as a meta key, +# which is annoying to those which don't need to type in 8-bit characters. + +# set convert-meta off + +"\e0d": backward-word +"\e0c": forward-word +"\e[h": beginning-of-line +"\e[f": end-of-line +"\e[1~": beginning-of-line +"\e[4~": end-of-line +#"\e[5~": beginning-of-history +#"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert + +# Common standard keypad and cursor +# (codes courtsey Werner Fink, ) +#"\e[1~": history-search-backward +"\e[2~": yank +"\e[3~": delete-char +#"\e[4~": set-mark +"\e[5~": history-search-backward +"\e[6~": history-search-forward +# Normal keypad and cursor of xterm +"\e[F": end-of-line +"\e[H": beginning-of-line +# Application keypad and cursor of xterm +"\eOA": previous-history +"\eOC": forward-char +"\eOB": next-history +"\eOD": backward-char +"\eOF": end-of-line +"\eOH": beginning-of-line + diff --git a/openwrt/target/default/target_skeleton/etc/issue b/openwrt/target/default/target_skeleton/etc/issue new file mode 100644 index 0000000000..f24b862c97 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/issue @@ -0,0 +1,4 @@ + + +Welcome to the Erik's uClibc development environment. + diff --git a/openwrt/target/default/target_skeleton/etc/network/interfaces b/openwrt/target/default/target_skeleton/etc/network/interfaces new file mode 100644 index 0000000000..218b82cde5 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/network/interfaces @@ -0,0 +1,4 @@ +# Configure Loopback +auto lo +iface lo inet loopback + diff --git a/openwrt/target/default/target_skeleton/etc/passwd b/openwrt/target/default/target_skeleton/etc/passwd new file mode 100644 index 0000000000..e0f473fc7b --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/passwd @@ -0,0 +1,13 @@ +root:x:0:0:root:/root:/bin/sh +daemon:x:1:1:daemon:/usr/sbin:/bin/sh +bin:x:2:2:bin:/bin:/bin/sh +sys:x:3:3:sys:/dev:/bin/sh +sync:x:4:100:sync:/bin:/bin/sync +mail:x:8:8:mail:/var/spool/mail:/bin/sh +proxy:x:13:13:proxy:/bin:/bin/sh +www-data:x:33:33:www-data:/var/www:/bin/sh +backup:x:34:34:backup:/var/backups:/bin/sh +operator:x:37:37:Operator:/var:/bin/sh +sshd:x:103:99:Operator:/var:/bin/sh +nobody:x:99:99:nobody:/home:/bin/sh +default:x:1000:1000:Default non-root user:/home/default:/bin/sh diff --git a/openwrt/target/default/target_skeleton/etc/profile b/openwrt/target/default/target_skeleton/etc/profile new file mode 100644 index 0000000000..cc2e0beb87 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/profile @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/openwrt/target/default/target_skeleton/etc/protocols b/openwrt/target/default/target_skeleton/etc/protocols new file mode 100644 index 0000000000..98f9f2d30e --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/protocols @@ -0,0 +1,31 @@ +# /etc/protocols: +# $Id$ +# +# Internet (IP) protocols +# +# from: @(#)protocols 5.1 (Berkeley) 4/17/89 +# +# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992). + +ip 0 IP # internet protocol, pseudo protocol number +icmp 1 ICMP # internet control message protocol +igmp 2 IGMP # Internet Group Management +ggp 3 GGP # gateway-gateway protocol +ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') +st 5 ST # ST datagram mode +tcp 6 TCP # transmission control protocol +egp 8 EGP # exterior gateway protocol +pup 12 PUP # PARC universal packet protocol +udp 17 UDP # user datagram protocol +hmp 20 HMP # host monitoring protocol +xns-idp 22 XNS-IDP # Xerox NS IDP +rdp 27 RDP # "reliable datagram" protocol +iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4 +xtp 36 XTP # Xpress Tranfer Protocol +ddp 37 DDP # Datagram Delivery Protocol +idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport +rspf 73 RSPF #Radio Shortest Path First. +vmtp 81 VMTP # Versatile Message Transport +ospf 89 OSPFIGP # Open Shortest Path First IGP +ipip 94 IPIP # Yet Another IP encapsulation +encap 98 ENCAP # Yet Another IP encapsulation diff --git a/openwrt/target/default/target_skeleton/etc/random-seed b/openwrt/target/default/target_skeleton/etc/random-seed new file mode 100644 index 0000000000000000000000000000000000000000..fbc7352fbb40c3cab0441fad743cf61c5342d51c GIT binary patch literal 512 zcmV+b0{{Iq0UOB42;n4xpAvJIL$H4mg*!B4&9jh)7+B2j-fX7o@K*bzj;pJ$FwoQzl&MuZ^Wy zrYS)x9vq<)#e~&1uB|_ITW-fntEg1^KXs3>vvgL7?_kg!+6=fg{R%Utkr$#pmPZ13liCc zi|M+im&71p*p+Z|7f(m-aedNFtEezFN-nZHytAhV~}?OM$-f$(%cG(ioV{==Ub4mfZP}OaJJ7 z25tvCcku=>;L?}O-dvK9`}<^gmg@IrnfQm#P>RRF|C9c;GDgEg_bw26{dkIVt1`{` z3#ol{Q_FL91TBD~{uZnRRZ(Otf!KXM&;q)8B The Registered Ports are not controlled by the IANA and on most systems +#> can be used by ordinary user processes or programs executed by ordinary +#> users. +# +#> Ports are used in the TCP [45,106] to name the ends of logical +#> connections which carry long term conversations. For the purpose of +#> providing services to unknown callers, a service contact port is +#> defined. This list specifies the port used by the server process as its +#> contact port. While the IANA can not control uses of these ports it +#> does register or list uses of these ports as a convienence to the +#> community. +# +nfsdstatus 1110/tcp +nfsd-keepalive 1110/udp + +ingreslock 1524/tcp +ingreslock 1524/udp +prospero-np 1525/tcp # Prospero non-privileged +prospero-np 1525/udp +datametrics 1645/tcp old-radius # datametrics / old radius entry +datametrics 1645/udp old-radius # datametrics / old radius entry +sa-msg-port 1646/tcp old-radacct # sa-msg-port / old radacct entry +sa-msg-port 1646/udp old-radacct # sa-msg-port / old radacct entry +radius 1812/tcp # Radius +radius 1812/udp # Radius +radacct 1813/tcp # Radius Accounting +radacct 1813/udp # Radius Accounting +nfsd 2049/tcp nfs +nfsd 2049/udp nfs +cvspserver 2401/tcp # CVS client/server operations +cvspserver 2401/udp # CVS client/server operations +mysql 3306/tcp # MySQL +mysql 3306/udp # MySQL +rfe 5002/tcp # Radio Free Ethernet +rfe 5002/udp # Actually uses UDP only +cfengine 5308/tcp # CFengine +cfengine 5308/udp # CFengine +bbs 7000/tcp # BBS service +# +# +# Kerberos (Project Athena/MIT) services +# Note that these are for Kerberos v4, and are unofficial. Sites running +# v4 should uncomment these and comment out the v5 entries above. +# +kerberos4 750/udp kerberos-iv kdc # Kerberos (server) udp +kerberos4 750/tcp kerberos-iv kdc # Kerberos (server) tcp +kerberos_master 751/udp # Kerberos authentication +kerberos_master 751/tcp # Kerberos authentication +passwd_server 752/udp # Kerberos passwd server +krb_prop 754/tcp # Kerberos slave propagation +krbupdate 760/tcp kreg # Kerberos registration +kpasswd 761/tcp kpwd # Kerberos "passwd" +kpop 1109/tcp # Pop with Kerberos +knetd 2053/tcp # Kerberos de-multiplexor +zephyr-srv 2102/udp # Zephyr server +zephyr-clt 2103/udp # Zephyr serv-hm connection +zephyr-hm 2104/udp # Zephyr hostmanager +eklogin 2105/tcp # Kerberos encrypted rlogin +# +# Unofficial but necessary (for NetBSD) services +# +supfilesrv 871/tcp # SUP server +supfiledbg 1127/tcp # SUP debugging +# +# Datagram Delivery Protocol services +# +rtmp 1/ddp # Routing Table Maintenance Protocol +nbp 2/ddp # Name Binding Protocol +echo 4/ddp # AppleTalk Echo Protocol +zip 6/ddp # Zone Information Protocol +# +# Services added for the Debian GNU/Linux distribution +poppassd 106/tcp # Eudora +poppassd 106/udp # Eudora +mailq 174/tcp # Mailer transport queue for Zmailer +mailq 174/tcp # Mailer transport queue for Zmailer +omirr 808/tcp omirrd # online mirror +omirr 808/udp omirrd # online mirror +rmtcfg 1236/tcp # Gracilis Packeten remote config server +xtel 1313/tcp # french minitel +coda_opcons 1355/udp # Coda opcons (Coda fs) +coda_venus 1363/udp # Coda venus (Coda fs) +coda_auth 1357/udp # Coda auth (Coda fs) +coda_udpsrv 1359/udp # Coda udpsrv (Coda fs) +coda_filesrv 1361/udp # Coda filesrv (Coda fs) +codacon 1423/tcp venus.cmu # Coda Console (Coda fs) +coda_aux1 1431/tcp # coda auxiliary service (Coda fs) +coda_aux1 1431/udp # coda auxiliary service (Coda fs) +coda_aux2 1433/tcp # coda auxiliary service (Coda fs) +coda_aux2 1433/udp # coda auxiliary service (Coda fs) +coda_aux3 1435/tcp # coda auxiliary service (Coda fs) +coda_aux3 1435/udp # coda auxiliary service (Coda fs) +cfinger 2003/tcp # GNU Finger +afbackup 2988/tcp # Afbackup system +afbackup 2988/udp # Afbackup system +icp 3130/tcp # Internet Cache Protocol (Squid) +icp 3130/udp # Internet Cache Protocol (Squid) +postgres 5432/tcp # POSTGRES +postgres 5432/udp # POSTGRES +fax 4557/tcp # FAX transmission service (old) +hylafax 4559/tcp # HylaFAX client-server protocol (new) +noclog 5354/tcp # noclogd with TCP (nocol) +noclog 5354/udp # noclogd with UDP (nocol) +hostmon 5355/tcp # hostmon uses TCP (nocol) +hostmon 5355/udp # hostmon uses TCP (nocol) +ircd 6667/tcp # Internet Relay Chat +ircd 6667/udp # Internet Relay Chat +webcache 8080/tcp # WWW caching service +webcache 8080/udp # WWW caching service +tproxy 8081/tcp # Transparent Proxy +tproxy 8081/udp # Transparent Proxy +mandelspawn 9359/udp mandelbrot # network mandelbrot +amanda 10080/udp # amanda backup services +amandaidx 10082/tcp # amanda backup services +amidxtape 10083/tcp # amanda backup services +isdnlog 20011/tcp # isdn logging system +isdnlog 20011/udp # isdn logging system +vboxd 20012/tcp # voice box system +vboxd 20012/udp # voice box system +binkp 24554/tcp # Binkley +binkp 24554/udp # Binkley +asp 27374/tcp # Address Search Protocol +asp 27374/udp # Address Search Protocol +tfido 60177/tcp # Ifmail +tfido 60177/udp # Ifmail +fido 60179/tcp # Ifmail +fido 60179/udp # Ifmail + +# Local services + diff --git a/openwrt/target/default/target_skeleton/etc/shadow b/openwrt/target/default/target_skeleton/etc/shadow new file mode 100644 index 0000000000..4941a1ac53 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/shadow @@ -0,0 +1,12 @@ +root::10933:0:99999:7::: +bin:*:10933:0:99999:7::: +daemon:*:10933:0:99999:7::: +adm:*:10933:0:99999:7::: +lp:*:10933:0:99999:7::: +sync:*:10933:0:99999:7::: +shutdown:*:10933:0:99999:7::: +halt:*:10933:0:99999:7::: +uucp:*:10933:0:99999:7::: +operator:*:10933:0:99999:7::: +nobody:*:10933:0:99999:7::: +default::10933:0:99999:7::: diff --git a/openwrt/target/default/target_skeleton/root/.bash_history b/openwrt/target/default/target_skeleton/root/.bash_history new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openwrt/target/default/target_skeleton/root/.bash_logout b/openwrt/target/default/target_skeleton/root/.bash_logout new file mode 100644 index 0000000000..77ef1f9508 --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bash_logout @@ -0,0 +1,7 @@ +# ~/.bash_logout: executed by bash(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy + +case "`tty`" in + /dev/tty[0-9]*) clear +esac diff --git a/openwrt/target/default/target_skeleton/root/.bash_profile b/openwrt/target/default/target_skeleton/root/.bash_profile new file mode 100644 index 0000000000..27bf14953d --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bash_profile @@ -0,0 +1,15 @@ +# .bash_profile + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +umask 022 + +if [ -f ~/.bashrc ]; then + source ~/.bashrc +fi diff --git a/openwrt/target/default/target_skeleton/root/.bashrc b/openwrt/target/default/target_skeleton/root/.bashrc new file mode 100644 index 0000000000..d13c8f9026 --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bashrc @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi b/openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi new file mode 100644 index 0000000000000000000000000000000000000000..d1e14008c5b102878b914b58343dad09d75a7f21 GIT binary patch literal 1450 zcmds$O=uHQ5Xa}O#fJ7$Az*8y^s*RjquFHh#j1%KFlq`#dyoXFX|}ej`7(*N+NR*i zqX!WM>%oHu4}wL#c=4n0=2cJ&dQkA_=Rq&V|LkUy9IW6;aN$4mdo%Oqy`4=q2{&z| zKB|ehlqpn<1vWcMSx-^QBDHn9NNL%^KAitaHUOk)ZY??1i8)a!@}te)Bje zM(ePri`FCWpdNCfax-`fg=r^z%-k1;O+ZQX;x^-yq6w3DrGpGAP=)5`0$pszFVW>z z1y}KN6_M*5(Hk9XRdm{$bPM_0&6+z+zx>BNjm87yAJPgvrx)~wKF}xnL6Ybdc4wy; z5QD8%qu~SZf}-LI?6r=Jy@UM{;;U=qI_v%~e*2ei{9b$%-$b|6EB(7UIHken>27I6 z@=EF&cL__oC09B{-T2kJ(!Ob!ge!dz?hwRYHsq2b>-*cN$t9nxClJ^Rv5!OhpgqtS zGzuw79yY+nq%c#cWmG1!^HHww^3tnWo|%=zU$%Wn65Kwh$CW;UfZ2hMG-1>RzL*(_ z+0ZKHHfD-@nZP$UVcZ6O57mGP7{r+@7x?6Pr6zl1eUi(psp#g|_}+4q3#(d4));+2 z)k1$essaO6Gze5I3<1LyMmUNv-k#@rfQI`3X?dnW(OuxqtS_?9;h>=f0l*GXHMjWo>EkCt9Q+g})_ktZTA<7#J+T tMCG*RReXLm5DbMQ$Fc~q{1Hu!@bLZSNSIWc+!*UtXd5&PHNP=`v|lT3JNf_s literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb b/openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb new file mode 100644 index 0000000000000000000000000000000000000000..ffdc8acf34bed25a78f4a019267bfca72f716179 GIT binary patch literal 308 zcmb1Qlwe?DU}R`w;9y88%}uJYFwjlT&neB#Qvh)lN=hmj7#IT>{{LqHs{4-ySTID; P6bvIS8v{E77Z?Hn(+>pZ literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux b/openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux new file mode 100644 index 0000000000000000000000000000000000000000..e9ec115d5c584a45dedfa30384ced55125c985d9 GIT binary patch literal 1551 zcmb_cOGs2v82-<}$ZAnSQ8@?|T_UWUd+xpSV5~7qoKhpiML2}UOg_i){U~*kAc7zw zXj8O`7Old_Hnk|twryJUkQO~~Q7a1~2%5hC+?lboNU6j8-~avp`Q|*nIZUBgPertr zM#X)ZXifGHjcD8w>rD1`CQcFwd=PqMNUo%GIv?@7kxylqA(E6w8>o=Bl0iGsv8jS8 zsfudB>nI9rK*XpSm`=A-Hw|buOk;Eo>;he)D|D4^&@J5`r+f5(CNt&;C zl8Jv@ap4Zxx@Vc|4$8Cgyu2tcFY|lZ{r*S3CT}ij_uFzpuB6rEi5jg&mubX9Mwc?; zJ!n|XfQTo07^w=uIU}l^r>;Jtmx!PpR!)NQUDASd0I?r&6j6gP%?_Z$pqXN3vogTU zp97njKGHD|)61ndwd19X9wd4tK$Mrc* z9zUDLYQB~cW@%r@Z-kgCP}`-}eAfnb+^z$vTW6{4l5Y4gZzVA+COG?j=3+0AHom(k1vV< literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt b/openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt new file mode 100644 index 0000000000000000000000000000000000000000..ba6987a1a8ae0e70a6f1f4f24a1ee3f1c79dcff6 GIT binary patch literal 1627 zcmbVL&r4KM6h8NAr4b5&5k87ZnjDM5d2hy127gvC_ydiQGC>q)97o^GI6rj!H7*Ql zk&B{&Xc28Hh!)Z!Y7+#l+SH~^ix&L{1uY_I`p%iBW+tJRIp6utch9|Z@AuxTR%hr4 zRZ>Egm!xNBvWpC^Y$P3zB}QylBtC7AWRq!^=d$ZkED=uTTo>mu*+{&ONa4pp7)&?` za_*xtI!uLsj52D2PNb=ns;HW3=!Ep0q#!j@JB3hn(gk2Y4bU)!Wp!x{bxhT&)5=m!s#Tp= zU8)ar{fGfIq(+f>MAf89IJ~HA#gv*?SJeu-?y3js3G(V+D_*HjqWl6XU8?tLoC0wG zQ5+TepgyFl^-)o3fc@)p+%d4JVr5uIpvAW6Jh%Nwpg*H$*H`7imZiD|yy56Koy_~( z(f9R3{a8QK&-F|FTEErr{+QkVpLRa;VVC=U+~vBRpKxQvXXih^=x+{FC3{Nt(S9-p z-7)u+*BuVJr%ZP^4Z(^6LdKxkiQI+Yys0ZB3qz1wO}~xrN60wRSw#Cr*$3J~6+nL+ z-~|NG>kDwNk0HRifG>`Z+Zc>9n4QvP8;vM@HY?I&q6stpaR!#Lm2EU5d$~$ud2un0 z-x}a9Z_o<*f(^E_O&hwp<-pbwXa}Nk2w-}-^a?uM6h+#+KH+}BfMBCw6QfzrD6*_M zhpK@k>31AyA)^_RSk0~o=~*Lu4pI1gLb}%o?|6+) z|FOcrdEjk;A0$o@qH;2NbBH;_G$Mt_(D3lc$kj`TP=J`wAJJ4x_FflwIoOTZ*yPaWJv6ky(HtjA&ruXBb78 zV!0`OrdVi-o2FQ9ise>uKe5}AeyjM1_;t0Kg1#nxPuA>RuTp>|m{@)+s$O I-cwJ%0l%&O@&Et; literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen new file mode 100644 index 0000000000000000000000000000000000000000..8f4206c81e6bb6dd8e0e7cc01cc0699d7d095c4f GIT binary patch literal 1318 zcmc&zJ8aWX6g>|REg(@gK9(RtibP3M{7ciQ>X(87ZAhUNittjaO%o?}>N=mM`ILnP zF|aT(Au%u@76t|e!~hZ!EHEJkrcMm7Ft8wV--|P#bYMZXe9t-ey!)>2dy-GF^BBM} zSnNA1uXx#PsdaNHq{#Ax>1&HuLK$s%L=V+0uTnMbP$la*R>`yhCSFb?7#7fv6YzI= z`Z0z5RCE9bspce3BaA^&8N~#x&0>zS6qX1xFkm7pRxK3a3g!D%!42HT9a493PvrOU z01xpfsCgXl6XK_Ven$K}(7yiyFYy|0@D3mF37_#5JNSklwEh#n@EiMBAL|_82peF> z1HH?U{4=z6mPMG(#z|dfX_g^2dv+9r;}E*6%&Nq7il%UT`?h=hS3OSeuK(k_W$*Xw z+y8c=k9#=Z7q-JB;}-gG7?KgT!mbit9Sgf^c-13A%Mm0c<0{b{1?Rttl44(y>`66d z({CX}p6DW^6p^OegbNfY93_l71PTY8SH-!~MC#DbD;YxaEvj%;oeUacP$p|$^w+i_ zrDrI3Q&r*Fb&4Ali{vOVattLda8zJ|qbdt6Btd$XJe_AF9QdX*jhvpQWKyxE3Bh@3 z9MUC{;$HX%g-CS;jnQ$Yx?;X7cz;n$T|0tWuRt1w6z7*lJ(4(tNMvXz8XX>%<>h75 zTwBZK@_EZD6pBULcAQdaecg38HaxFfu2ibkT5WT)UfQ?{& literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w new file mode 100644 index 0000000000000000000000000000000000000000..965601433d1e6a82be5936d800c9f6198b3aa8c9 GIT binary patch literal 1334 zcmc&zJ8Tm{5Pb`X1ds?FpOfH(bP|zcb3ey1QN9FZNQ@zgki|8z9LGNU&UXBdKcS&P z6f{&+NE8%^hJu0uQGkR54OEDNDisAZ6g23VUE2k63K|s4^WK}cv$L}+-6?hfBRB?| zeP`ulDV56m>+PGXvZku%=dP_>k>f^S+>~o}sZvciawS!A?L3LPUCGFrq07mFQwEs$ zb0WcT2g5i4Z6n#VnULj1I+pAkRrY0rCsmw1ggc!v-8gwObj9el$NTK|b( z_>FyRh;=V;gpIJ{J-y47yfd_Rmid^;rbu08F%~CI4D84X$0aPXGOH3dC|bfD?Asae zUkx~eyZ(>!mc8Gzv;XZzANO#+FKmZN)-4R-FeFQ{m7=DsPbx)SSuc@cqzNLDb(Lt5 zg7aTR5wR~q_KY5M=(7+aLv#^Rl*lk0!s`@K93>381R4jESB1DTMC#JVELlSGExK@Z zlMEVSR3&Rk^f$I4#pWq^Q(fcP4T@!o6>_v7IhGa@I3Y01QCEc)k|4G~p2@Ru4t!IL zMvl!*)MpEM45m2v3?}{*;Cofh)78{s5B@@1g(z literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun new file mode 100644 index 0000000000000000000000000000000000000000..47c0d66faa75dd398d28cce7e313fbd4d1edcb8c GIT binary patch literal 1019 zcmb_aJx>Bb5S>-ySB%EkK_O^1YD~nvLq0-?qL_$6z!)oR3{aqQhujfALPBR}XJ=<& zXJ=tyYinz3Vf-67J9`j7sPvLI@6F8H$xL!C7J?}lge8_{R@JB>gbZ5kplWzh#azX- zt}MGyvOEbRx8k`lE2oxyY!^+#lQRv=JSzY&pidEl3^W>Z2!H{Mjm8iR!#Jr)m?id7 zoX5C;SOy>E(%bpz5OO+Ehhx8-+mOIo%BiQ3_gkJrID#CUz&Tt(9d6(j?%?JBn-Ay*?Iw;_>4 zVc`+(>?&X9~%;(U;zghWj{M3mA}*uqe&&PQ82aT3Q#TDKA_ zYXxFJhyfu6gcukY7#J8B7#J8BkYE4_2_}S?kj(LWPTGk60iJyBJ@?%6uHLgf&Q8;D z8lw>Nm}9H4m@DEL&2;thN<uQBM!OK^PcWe zp9TCmy`Y!$ieA$jdQ0!rzXbUk{h(g~AI#h@{|P*Y8Qz(90vKHpp=1&B ztiWd39NPiEGxXhM_t*pWkUbX4lcD~JeHHxsP}!aPb02ND`~R`uY>bYPQsS%JQn{Yt zR-EfC2#G2}Q7K)DW>c{o_*^ub@bgd@*;0fpCngo~=P9L`Xg2PIOos; zq+kl|EM(xCjO%a{DzF6)(R&0AvWsYdFS8vOz=>3G{7l;C@Dg65dIRsI{~kWT$D|^T zKcV`J_=fnNM1P?DndmtF1;1g6%#e%Z5}70OBtvp!f#@WT3kaL6kQ->lSx@ZP`+vTJ zeVXJ1`3ZSSUXWL^@0T;We?5)QrRG!r{%R&Q4HrPE(gqDQTC-@tXf4D*S*f!1tZk@8 zbZ%vBUD(sWU*+Yjt;w=g@g8EC86M1xMIFr=Vg<2@sDP4Fvo;g$3_lUtL~v1VPCU~` zk0a$)vo;rROfuX1y#*rJj4*Uv@+y--7w#+JE5D8oX1@^%FF)@%WliD^btxN zc0&xrmeAYSLfl2%6TM84*9wwFw#rn=nv6&(sDxM)!Vr{PvWVB$JtQv35Mcziq(_rb9x Ji%s(p`~h@Wg6jYP literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 b/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 new file mode 100644 index 0000000000000000000000000000000000000000..d55932876a44f3f076fc94bdfe1a6903af666286 GIT binary patch literal 461 zcmb1QAlA5dlVlV_Sa4<+P{Qu9uzyu`!|7T&~WZ(g__!%@9 zw1F%=FwYQ3nt)j#Rsa8+Be5YOFwzRA3`~VBk_vkyHcTF!c7m#Lh0-1b^mr4HM>ikD z_XCCmL_8RW?obAH1}+9^4{0w3X>SG)8L3)esH(1@uBxq?tXg0MV=_oP0hKXGyD&&Q zGe|o!NV_pey90w6Bn%Vd0vY8A4C{o1#Kg3;^z^K(?ChMJ+}ymp{QQD~!os4W;^LB$ Z($ccB^74v`%F3#$>gt-B+SQ4gt>wvPw%G-b*Jl{^`{eR8*C_am?;=A}M zev1KZNIR$<(RQx5JN0qxw02&zcI7lNZ66JhZih?Zsu9k`!&Mp1c@WG3U{bf`6!J7e z<-c5$JaG~qgKkeC#u2lK6b%Cnm-MJ^C#`4^m8BpGsRx#ek5RW(EvMMz=rI(Q(^q?w zJyI@SshkpF~O6WmU zbu~qUG(VrsE-n@drP9*U^0MQ&Zn<2kRI4j1o>!~Y>y5_hYO~pDwcBfJ>+79Px4VIp zk4CVcrS73R(PL7z$d;^1ZinQXN^Xbbc9?88rE;3=H`$LTj+Y{bZrWpI0G@+fKvt2W EKW-D*_5c6? literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 b/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 new file mode 100644 index 0000000000000000000000000000000000000000..eeac9d8d35fdaf374dd11590cfaabc6f45a69c64 GIT binary patch literal 1840 zcmcIkONbn05U%PGlc;3zAhMQFjU;xC>l}>p9&jYMLSE;$ z`5i>P&mZ#_&|fAQ-|!ZH2Y!QpRL@QRgKzU4zRQ1c*@&W(kocJ~P8+Wq=Z!bjQycr= zGd@)QiQ?yDe-vFauEW~=hi6plVfyPG8$TF78^0RA8-E(Nj625PJIa69ZnoF& z?XWJVo=82JnoLclMm6@Qf-xWY{vUlkdCz8QD`i$M&@Ot6%&OJ2y0%p>SzX7f_uz0B z0A;i4oPa(F5uHT6x=rJRveqcW?K{~3pNNu0sFxrwZkwk-XJ{`l+XC1EzMb(3i?Pm2 zjweu%rTiE?VYID19UZpZKQ?M3ql z7WEkNHYGD7f<45Zqa!jsB2rv~rJYKoZWH1OWC0hU|8>LyoXO1UWaec`^16)WOObBQ zTC>8EZI#4!K)sk^$gw9s`uc{n&)0k4 z=P|bf$IOEn)Os0i>2F02AXAFF?a275j&|PBQ8_vQM@Qx8s9X(q9f@=`-qm1<`LeFYQ`&M1Ga*5@sWhYinEjPC6Xc($^ S|49`&zpHm3t|^~wi|zx05Hhj= literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script b/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script new file mode 100755 index 0000000000..a52a7f8122 --- /dev/null +++ b/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script @@ -0,0 +1,39 @@ +#!/bin/sh + +# udhcpc script edited by Tim Riker + +[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 + +RESOLV_CONF="/etc/resolv.conf" +[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" +[ -n "$subnet" ] && NETMASK="netmask $subnet" + +case "$1" in + deconfig) + /sbin/ifconfig $interface 0.0.0.0 + ;; + + renew|bound) + /sbin/ifconfig $interface $ip $BROADCAST $NETMASK + + if [ -n "$router" ] ; then + echo "deleting routers" + while route del default gw 0.0.0.0 dev $interface ; do + : + done + + for i in $router ; do + route add default gw $i dev $interface + done + fi + + echo -n > $RESOLV_CONF + [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF + for i in $dns ; do + echo adding dns $i + echo nameserver $i >> $RESOLV_CONF + done + ;; +esac + +exit 0 diff --git a/openwrt/target/jffs2/Config.in b/openwrt/target/jffs2/Config.in new file mode 100644 index 0000000000..0d79dd1ffa --- /dev/null +++ b/openwrt/target/jffs2/Config.in @@ -0,0 +1,6 @@ +config BR2_TARGET_ROOTFS_JFFS2 + bool "jffs2 root filesystem for the target device" + default n + help + Build a jffs2 root filesystem + diff --git a/openwrt/target/jffs2/Makefile.in b/openwrt/target/jffs2/Makefile.in new file mode 100644 index 0000000000..31452eba8d --- /dev/null +++ b/openwrt/target/jffs2/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_TARGET_ROOTFS_JFFS2)),y) +TARGETS+=jffs2root +endif diff --git a/openwrt/target/jffs2/jffs2root.mk b/openwrt/target/jffs2/jffs2root.mk new file mode 100644 index 0000000000..5dd79032fd --- /dev/null +++ b/openwrt/target/jffs2/jffs2root.mk @@ -0,0 +1,50 @@ +############################################################# +# +# mtd provides us with mkfs.jffs2, to target JFFS2 filesystems +# +############################################################# + +MTD_DIR:=$(BUILD_DIR)/mtd-20011217 +MTD_SOURCE=mtd_20011217.orig.tar.gz +MTD_SITE=http://ftp.debian.org/debian/pool/main/m/mtd +MKFS_JFFS2=$(shell which mkfs.jffs2 2>/dev/null || echo $(MTD_DIR)/util/mkfs.jffs2) + +$(DL_DIR)/$(MTD_SOURCE): + $(WGET) -P $(DL_DIR) $(MTD_SITE)/$(MTD_SOURCE) + +$(MTD_DIR)/.unpacked: $(DL_DIR)/$(MTD_SOURCE) + zcat $(DL_DIR)/$(MTD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MTD_DIR)/.unpacked + +$(MTD_DIR)/util/mkfs.jffs2: $(MTD_DIR)/.unpacked +# CFLAGS=-I$(LINUX_HEADERS_DIR)/include $(MAKE) LINUXDIR=$(LINUX_DIR) -C $(MTD_DIR)/util + $(MAKE) LINUXDIR=$(LINUX_DIR) -C $(MTD_DIR)/util + +mtd: $(MKFS_JFFS2) + + +############################################################# +# +# Build the jffs2 root filesystem image +# +############################################################# + +jffs2root: mtd + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + @rm -rf $(TARGET_DIR)/usr/man + @rm -rf $(TARGET_DIR)/usr/info + $(MKFS_JFFS2) --pad --little-endian --squash -e 0x20000 \ + -D target/default/device_table.txt -d $(TARGET_DIR) \ + -o $(IMAGE).jffs2 + +jffs2root-source: $(DL_DIR)/$(MTD_SOURCE) + +jffs2root-clean: + -$(MAKE) -C $(MTD_DIR) clean + +jffs2root-dirclean: + rm -rf $(MTD_DIR) + + + diff --git a/openwrt/toolchain/Config.in b/openwrt/toolchain/Config.in new file mode 100644 index 0000000000..22a11e7d65 --- /dev/null +++ b/openwrt/toolchain/Config.in @@ -0,0 +1,57 @@ +# + +menu "Toolchain Options" + + +source "toolchain/uClibc/Config.in" +source "toolchain/binutils/Config.in" +source "toolchain/gcc/Config.in" +source "toolchain/ccache/Config.in" +source "toolchain/gdb/Config.in" + + +comment "Common Toolchain Options" + +config BR2_ENABLE_MULTILIB + bool "Enable multilib support?" + default y + help + If you want multilib enabled, enable this... + +config BR2_LARGEFILE + bool "Enable large file (files > 2 GB) support?" + depends on !BR2_cris + default y + help + Enable large file (files > 2 GB) support + +config BR2_SOFT_FLOAT + bool "Use software floating point by default" + default n + depends on BR2_arm || BR2_mips || BR2_powerpc + help + If your target CPU does not have a Floating Point Unit (FPU) or a + kernel FPU emulator, but you still wish to support floating point + functions, then everything will need to be compiled with soft floating + point support (-msoft-float). + + Most people will answer N. + +config BR2_TARGET_OPTIMIZATION + string "Target Optimizations" + default "-Os -pipe" + help + Optimizations to use when building for the target host. + +# Might be worth experimenting with for gcc 3.4.x. +#GCC_WITH_CPU:= +#GCC_WITH_ARCH:= +#GCC_WITH_TUNE:= + +#GCC_WITH_CPU:=--with-cpu= +#GCC_WITH_ARCH:=--with-arch= +#GCC_WITH_TUNE:=--with-tune= + + +endmenu + diff --git a/openwrt/toolchain/Makefile.in b/openwrt/toolchain/Makefile.in new file mode 100644 index 0000000000..5b2d7f213d --- /dev/null +++ b/openwrt/toolchain/Makefile.in @@ -0,0 +1,7 @@ +ifeq ($(BR2_ENABLE_MULTILIB),y) +MULTILIB:=--enable-multilib +endif + + +# FIXME -- this is temporary +OPTIMIZE_FOR_CPU=$(ARCH) diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch new file mode 100644 index 0000000000..97b8e7fde7 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch @@ -0,0 +1,185 @@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.am ++++ binutils-2.11.90.0.19/ld/Makefile.am +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.in ++++ binutils-2.11.90.0.19/ld/Makefile.in +@@ -123,7 +123,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.11.90.0.27/gprof/gprof.texi binutils-2.11.90.0.27.new/gprof/gprof.texi +--- binutils-2.11.90.0.27/gprof/gprof.texi Tue Jun 19 14:57:58 2001 ++++ binutils-2.11.90.0.27.new/gprof/gprof.texi Mon Aug 27 10:27:23 2001 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -266,6 +270,11 @@ + to do the linking, simply specify @samp{-pg} in addition to your usual + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: ++ ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. + + @example + cc -g -c myprog.c utils.c -pg +diff -urN binutils-2.11.92.0.5/bfd/opncls.c binutils-2.11.92.0.5.new/bfd/opncls.c +--- binutils-2.11.92.0.5/bfd/opncls.c Mon Oct 1 18:25:21 2001 ++++ binutils-2.11.92.0.5.new/bfd/opncls.c Sat Oct 13 11:26:59 2001 +@@ -127,6 +127,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.11.92.0.12.3/opcodes/i386-dis.c binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c +--- binutils-2.11.92.0.12.3/opcodes/i386-dis.c Fri Nov 16 17:05:55 2001 ++++ binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c Mon Dec 31 15:55:04 2001 +@@ -1830,7 +1830,7 @@ + * The function returns the length of this instruction in bytes. + */ + +-static char intel_syntax; ++static signed char intel_syntax; + static char open_char; + static char close_char; + static char separator_char; +diff -urN binutils-2.12.90.0.12/ld/emultempl/elf32.em binutils-2.12.90.0.12.new/ld/emultempl/elf32.em +--- binutils-2.12.90.0.12/ld/emultempl/elf32.em Wed Jun 19 00:41:59 2002 ++++ binutils-2.12.90.0.12.new/ld/emultempl/elf32.em Wed Jun 26 10:00:26 2002 +@@ -672,6 +672,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -867,6 +869,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.13.90.0.18/gprof/gprof.texi binutils-2.13.90.0.18.new/gprof/gprof.texi +--- binutils-2.13.90.0.18/gprof/gprof.texi 2003-02-02 18:29:09.000000000 -0500 ++++ binutils-2.13.90.0.18.new/gprof/gprof.texi 2003-02-02 18:28:37.000000000 -0500 +@@ -185,7 +185,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +diff -urN binutils-2.13.90.0.10/opcodes/alpha-opc.c binutils-2.13.90.0.10.new/opcodes/alpha-opc.c +--- binutils-2.13.90.0.10/opcodes/alpha-opc.c 2002-03-07 14:52:40.000000000 -0500 ++++ binutils-2.13.90.0.10.new/opcodes/alpha-opc.c 2002-10-12 20:16:08.000000000 -0400 +@@ -1101,7 +1101,8 @@ + { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE }, + { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } }, + { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } }, +- { "rpcc", MFC(0x18,0xC000), BASE, { RA } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, ZB } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, RB } }, /* ev6 una */ + { "rc", MFC(0x18,0xE000), BASE, { RA } }, + { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */ + { "rs", MFC(0x18,0xF000), BASE, { RA } }, +--- binutils-2.13.90.0.18/bfd/elf64-alpha.c 2003-01-21 19:21:32.000000000 +0100 ++++ binutils-2.13.90.0.18-modif/bfd/elf64-alpha.c 2003-04-11 01:24:26.000000000 +0200 +@@ -4184,9 +4184,12 @@ + + loc = srel->contents; + loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); +- bfd_elf64_swap_reloca_out (abfd, &outrel, loc); +- BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count +- <= srel->_cooked_size); ++ if (loc) ++ { ++ bfd_elf64_swap_reloca_out (abfd, &outrel, loc); ++ BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count ++ <= srel->_cooked_size); ++ } + } + + /* Relocate an Alpha ELF section for a relocatable link. +2003-05-23 H.J. Lu + + * ltmain.sh: Make symlink for shared library if needed. + +opcodes/ + +2003-07-14 H.J. Lu + + * Makefile.in: Regenerated. + +2003-06-11 H.J. Lu + + * Makefile.in: Regenerated. + +2003-05-23 H.J. Lu + + * Makefile.am (libopcodes_la_LIBADD): Use "-L../bfd -lbfd" + instead of "../bfd/libbfd.la". + * Makefile.in: Regenerated. + +--- binutils/ltmain.sh.dso 2002-03-22 00:16:20.000000000 -0800 ++++ binutils/ltmain.sh 2003-07-14 12:50:17.000000000 -0700 +@@ -4413,6 +4413,10 @@ relink_command=\"$relink_command\"" + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +--- binutils/opcodes/Makefile.am.dso 2003-06-11 07:18:04.000000000 -0700 ++++ binutils/opcodes/Makefile.am 2003-07-14 12:50:18.000000000 -0700 +@@ -283,7 +283,7 @@ disassemble.lo: disassemble.c $(INCDIR)/ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch new file mode 100644 index 0000000000..87db23fb01 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.6/bfd/config.bfd binutils-2.14.90.0.6-uClibc/bfd/config.bfd +--- binutils-2.14.90.0.6/bfd/config.bfd 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/config.bfd 2004-01-06 23:20:32.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,8 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++ ia64*-*-linux-uclibc* | ia64*-*-elf*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -214,7 +215,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -222,7 +223,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux*) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -355,7 +357,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -366,7 +368,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -488,7 +490,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +504,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -662,7 +664,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -929,7 +931,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +964,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1113,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1157,7 +1160,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.6/bfd/configure binutils-2.14.90.0.6-uClibc/bfd/configure +--- binutils-2.14.90.0.6/bfd/configure 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure 2004-01-06 20:26:51.000000000 -0600 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5102,7 +5107,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5161,7 +5166,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5211,7 +5216,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.6/bfd/configure.in binutils-2.14.90.0.6-uClibc/bfd/configure.in +--- binutils-2.14.90.0.6/bfd/configure.in 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure.in 2004-01-06 20:33:02.000000000 -0600 +@@ -153,7 +153,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -233,7 +233,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.6/config.sub binutils-2.14.90.0.6-uClibc/config.sub +--- binutils-2.14.90.0.6/config.sub 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/config.sub 2004-01-06 22:56:56.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -1257,6 +1262,18 @@ + i[3456789]86-*-freebsd*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -508,6 +513,19 @@ + i[[3456789]]86-*-freebsd*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ build_modules= ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/demangler/configure binutils-2.14.90.0.6-uClibc/demangler/configure +--- binutils-2.14.90.0.6/demangler/configure 2003-08-21 10:29:31.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/demangler/configure 2004-01-06 21:45:51.000000000 -0600 +@@ -1363,6 +1363,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/gas/configure binutils-2.14.90.0.6-uClibc/gas/configure +--- binutils-2.14.90.0.6/gas/configure 2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure 2004-01-06 21:57:25.000000000 -0600 +@@ -1576,6 +1576,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2370,6 +2375,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -2386,6 +2392,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -2400,6 +2407,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -2455,7 +2463,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -2512,6 +2522,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -2538,6 +2549,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -2592,6 +2604,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf + case "$endian" in + big) ;; +@@ -2616,7 +2629,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -2649,6 +2664,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.6/gas/configure.in binutils-2.14.90.0.6-uClibc/gas/configure.in +--- binutils-2.14.90.0.6/gas/configure.in 2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure.in 2004-01-06 21:57:26.000000000 -0600 +@@ -184,6 +184,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -200,6 +201,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -214,6 +216,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -269,7 +272,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -322,6 +327,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -348,6 +354,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -402,6 +409,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf + case "$endian" in + big) ;; +@@ -424,7 +432,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -457,6 +467,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.6/ld/configure binutils-2.14.90.0.6-uClibc/ld/configure +--- binutils-2.14.90.0.6/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure 2004-01-06 21:59:31.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/ld/configure.tgt binutils-2.14.90.0.6-uClibc/ld/configure.tgt +--- binutils-2.14.90.0.6/ld/configure.tgt 2003-08-21 10:28:48.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure.tgt 2004-01-06 22:09:40.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -124,7 +127,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -148,14 +151,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -250,10 +255,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -354,7 +362,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -370,9 +379,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -416,16 +425,20 @@ + mips*-*-rtems*) targ_emul=elf32ebmip ;; + mips*el-*-vxworks*) targ_emul=elf32elmip ;; + mips*-*-vxworks*) targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -447,6 +460,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.6/libtool.m4 binutils-2.14.90.0.6-uClibc/libtool.m4 +--- binutils-2.14.90.0.6/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/libtool.m4 2004-01-06 20:30:39.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.6/ltconfig binutils-2.14.90.0.6-uClibc/ltconfig +--- binutils-2.14.90.0.6/ltconfig 2003-07-23 10:08:08.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ltconfig 2004-01-06 21:05:11.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch b/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch new file mode 100644 index 0000000000..e9f8e75a89 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch b/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch new file mode 100644 index 0000000000..dc67d3c4e3 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch new file mode 100644 index 0000000000..1dd39a933d --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch @@ -0,0 +1,2394 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/ChangeLog binutils-2.14.90.0.7/bfd/ChangeLog +--- binutils-2.14.90.0.7.orig/bfd/ChangeLog 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/ChangeLog 2004-04-20 01:26:12.000000000 -0600 +@@ -1,3 +1,34 @@ ++2003-10-29 Daniel Jacobowitz ++ ++ * elf32-arm.h (elf32_arm_final_link_relocate): Move check for ++ SEC_ALLOC. ++ ++2003-10-29 Philip Blundell ++ ++ * elf32-arm.h (elf32_arm_plt0_entry, elf32_arm_plt_entry): New ++ code sequence. ++ (PLT_HEADER_SIZE): New. ++ (struct elf32_arm_pcrel_relocs_copied): Rename to ... ++ (struct elf32_arm_relocs_copied): ... this. Count both ++ pcrel and non-pcrel relocs. All uses updated. ++ (struct elf32_arm_link_hash_table): Add pointers to dynamic linker ++ sections and symbol/section mapping cache. ++ (create_got_section): New. ++ (elf32_arm_create_dynamic_sections): New. ++ (elf_backend_create_dynamic_sections): Use it. ++ (elf32_arm_final_link_relocate): Support garbage collection of relocs. ++ (elf32_arm_check_relocs): Likewise. ++ (elf32_arm_adjust_dynamic_symbol): Likewise. ++ (elf32_arm_copy_indirect_symbol): New. ++ (elf32_arm_link_hash_table_create): Initialise new fields. ++ (elf32_arm_gc_sweep_hook): Implement. ++ (elf32_arm_discard_copies): Delete. ++ (elf32_arm_finish_dynamic_symbol): Use new PLT code. ++ (elf32_arm_finish_dynamic_sections): Likewise. ++ (elf_backend_can_refcount): Define. ++ (elf_backend_copy_indirect_symbol): Likewise. ++ (elf_backend_plt_header_size): Set to PLT_HEADER_SIZE. ++ + 2003-10-29 Alan Modra + + * elf64-ppc.c (elf_backend_grok_prstatus): Define. +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-bfd.h binutils-2.14.90.0.7/bfd/elf-bfd.h +--- binutils-2.14.90.0.7.orig/bfd/elf-bfd.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf-bfd.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1303,7 +1303,7 @@ + extern enum elf_reloc_type_class _bfd_elf_reloc_type_class + (const Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rela_local_sym +- (bfd *, Elf_Internal_Sym *, asection *, Elf_Internal_Rela *); ++ (bfd *, Elf_Internal_Sym *, asection **, Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rel_local_sym + (bfd *, Elf_Internal_Sym *, asection **, bfd_vma); + extern bfd_vma _bfd_elf_section_offset +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-hppa.h binutils-2.14.90.0.7/bfd/elf-hppa.h +--- binutils-2.14.90.0.7.orig/bfd/elf-hppa.h 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-hppa.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1346,11 +1346,11 @@ + /* This is a local symbol. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1373,7 +1373,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1410,7 +1410,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1426,7 +1426,7 @@ + } + else if (h->root.type == bfd_link_hash_undefweak) + { +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10200.c binutils-2.14.90.0.7/bfd/elf-m10200.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10200.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10200.c 2004-04-20 01:26:12.000000000 -0600 +@@ -373,7 +373,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10300.c binutils-2.14.90.0.7/bfd/elf-m10300.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10300.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1574,7 +1574,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf.c binutils-2.14.90.0.7/bfd/elf.c +--- binutils-2.14.90.0.7.orig/bfd/elf.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7367,9 +7367,10 @@ + bfd_vma + _bfd_elf_rela_local_sym (bfd *abfd, + Elf_Internal_Sym *sym, +- asection *sec, ++ asection **psec, + Elf_Internal_Rela *rel) + { ++ asection *sec = *psec; + bfd_vma relocation; + + relocation = (sec->output_section->vma +@@ -7379,16 +7380,14 @@ + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sec->sec_info_type == ELF_INFO_TYPE_MERGE) + { +- asection *msec; +- +- msec = sec; + rel->r_addend = +- _bfd_merged_section_offset (abfd, &msec, ++ _bfd_merged_section_offset (abfd, psec, + elf_section_data (sec)->sec_info, + sym->st_value + rel->r_addend, +- 0) +- - relocation; +- rel->r_addend += msec->output_section->vma + msec->output_offset; ++ 0); ++ sec = *psec; ++ rel->r_addend -= relocation; ++ rel->r_addend += sec->output_section->vma + sec->output_offset; + } + return relocation; + } +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-arm.h binutils-2.14.90.0.7/bfd/elf32-arm.h +--- binutils-2.14.90.0.7.orig/bfd/elf32-arm.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-arm.h 2004-04-20 01:26:12.000000000 -0600 +@@ -84,6 +84,12 @@ + static void arm_add_to_rel + PARAMS ((bfd *, bfd_byte *, reloc_howto_type *, bfd_signed_vma)); + #endif ++static bfd_boolean allocate_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean create_got_section ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); ++static bfd_boolean elf32_arm_create_dynamic_sections ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static enum elf_reloc_type_class elf32_arm_reloc_type_class + PARAMS ((const Elf_Internal_Rela *)); + static bfd_boolean elf32_arm_object_p +@@ -119,6 +125,12 @@ + section. */ + #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" + ++#ifdef FOUR_WORD_PLT ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 16 ++ + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 16 + +@@ -126,23 +138,56 @@ + this. It is set up so that any shared library function that is + called before the relocation has been set up calls the dynamic + linker first. */ +-static const bfd_vma elf32_arm_plt0_entry [PLT_ENTRY_SIZE / 4] = ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = + { +- 0xe52de004, /* str lr, [sp, #-4]! */ +- 0xe59fe010, /* ldr lr, [pc, #16] */ +- 0xe08fe00e, /* add lr, pc, lr */ +- 0xe5bef008 /* ldr pc, [lr, #8]! */ ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe010, /* ldr lr, [pc, #16] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ + }; + + /* Subsequent entries in a procedure linkage table look like + this. */ + static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = +- { +- 0xe59fc004, /* ldr ip, [pc, #4] */ +- 0xe08fc00c, /* add ip, pc, ip */ +- 0xe59cf000, /* ldr pc, [ip] */ +- 0x00000000 /* offset to symbol in got */ +- }; ++ { ++ 0xe28fc600, /* add ip, pc, #NN */ ++ 0xe28cca00, /* add ip, ip, #NN */ ++ 0xe5bcf000, /* ldr pc, [ip, #NN]! */ ++ 0x00000000, /* unused */ ++ }; ++ ++#else ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 20 ++ ++/* The size in bytes of an entry in the procedure linkage table. */ ++#define PLT_ENTRY_SIZE 12 ++ ++/* The first entry in a procedure linkage table looks like ++ this. It is set up so that any shared library function that is ++ called before the relocation has been set up calls the dynamic ++ linker first. */ ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = ++ { ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe004, /* ldr lr, [pc, #4] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ ++ 0x00000000, /* &GOT[0] - . */ ++ }; ++ ++/* Subsequent entries in a procedure linkage table look like ++ this. */ ++static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = ++ { ++ 0xe28fc600, /* add ip, pc, #0xNN00000 */ ++ 0xe28cca00, /* add ip, ip, #0xNN000 */ ++ 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */ ++ }; ++ ++#endif + + /* The ARM linker needs to keep track of the number of relocs that it + decides to copy in check_relocs for each symbol. This is so that +@@ -152,14 +197,16 @@ + + /* This structure keeps track of the number of PC relative relocs we + have copied for a given symbol. */ +-struct elf32_arm_pcrel_relocs_copied ++struct elf32_arm_relocs_copied + { + /* Next section. */ +- struct elf32_arm_pcrel_relocs_copied * next; ++ struct elf32_arm_relocs_copied * next; + /* A section in dynobj. */ + asection * section; + /* Number of relocs copied in this section. */ + bfd_size_type count; ++ /* Number of relocs copied in this section. */ ++ bfd_size_type pc_count; + }; + + /* Arm ELF linker hash entry. */ +@@ -168,13 +215,9 @@ + struct elf_link_hash_entry root; + + /* Number of PC relative relocs copied for this symbol. */ +- struct elf32_arm_pcrel_relocs_copied * pcrel_relocs_copied; ++ struct elf32_arm_relocs_copied * relocs_copied; + }; + +-/* Declare this now that the above structures are defined. */ +-static bfd_boolean elf32_arm_discard_copies +- PARAMS ((struct elf32_arm_link_hash_entry *, PTR)); +- + /* Traverse an arm ELF linker hash table. */ + #define elf32_arm_link_hash_traverse(table, func, info) \ + (elf_link_hash_traverse \ +@@ -204,6 +247,18 @@ + /* A boolean indicating whether knowledge of the ARM's pipeline + length should be applied by the linker. */ + int no_pipeline_knowledge; ++ ++ /* Short-cuts to get to dynamic linker sections. */ ++ asection *sgot; ++ asection *sgotplt; ++ asection *srelgot; ++ asection *splt; ++ asection *srelplt; ++ asection *sdynbss; ++ asection *srelbss; ++ ++ /* Small local sym to section mapping cache. */ ++ struct sym_sec_cache sym_sec; + }; + + /* Create an entry in an ARM ELF linker hash table. */ +@@ -231,11 +286,121 @@ + _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, + table, string)); + if (ret != (struct elf32_arm_link_hash_entry *) NULL) +- ret->pcrel_relocs_copied = NULL; ++ ret->relocs_copied = NULL; + + return (struct bfd_hash_entry *) ret; + } + ++/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up ++ shortcuts to them in our hash table. */ ++ ++static bfd_boolean ++create_got_section (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ if (! _bfd_elf_create_got_section (dynobj, info)) ++ return FALSE; ++ ++ htab = elf32_arm_hash_table (info); ++ htab->sgot = bfd_get_section_by_name (dynobj, ".got"); ++ htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); ++ if (!htab->sgot || !htab->sgotplt) ++ abort (); ++ ++ htab->srelgot = bfd_make_section (dynobj, ".rel.got"); ++ if (htab->srelgot == NULL ++ || ! bfd_set_section_flags (dynobj, htab->srelgot, ++ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS ++ | SEC_IN_MEMORY | SEC_LINKER_CREATED ++ | SEC_READONLY)) ++ || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2)) ++ return FALSE; ++ return TRUE; ++} ++ ++/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and ++ .rel.bss sections in DYNOBJ, and set up shortcuts to them in our ++ hash table. */ ++ ++static bfd_boolean ++elf32_arm_create_dynamic_sections (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ htab = elf32_arm_hash_table (info); ++ if (!htab->sgot && !create_got_section (dynobj, info)) ++ return FALSE; ++ ++ if (!_bfd_elf_create_dynamic_sections (dynobj, info)) ++ return FALSE; ++ ++ htab->splt = bfd_get_section_by_name (dynobj, ".plt"); ++ htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt"); ++ htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); ++ if (!info->shared) ++ htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss"); ++ ++ if (!htab->splt || !htab->srelplt || !htab->sdynbss ++ || (!info->shared && !htab->srelbss)) ++ abort (); ++ ++ return TRUE; ++} ++ ++/* Copy the extra info we tack onto an elf_link_hash_entry. */ ++ ++static void ++elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed, ++ struct elf_link_hash_entry *dir, ++ struct elf_link_hash_entry *ind) ++{ ++ struct elf32_arm_link_hash_entry *edir, *eind; ++ ++ edir = (struct elf32_arm_link_hash_entry *) dir; ++ eind = (struct elf32_arm_link_hash_entry *) ind; ++ ++ if (eind->relocs_copied != NULL) ++ { ++ if (edir->relocs_copied != NULL) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (ind->root.type == bfd_link_hash_indirect) ++ abort (); ++ ++ /* Add reloc counts against the weak sym to the strong sym ++ list. Merge any entries against the same section. */ ++ for (pp = &eind->relocs_copied; (p = *pp) != NULL; ) ++ { ++ struct elf32_arm_relocs_copied *q; ++ ++ for (q = edir->relocs_copied; q != NULL; q = q->next) ++ if (q->section == p->section) ++ { ++ q->pc_count += p->pc_count; ++ q->count += p->count; ++ *pp = p->next; ++ break; ++ } ++ if (q == NULL) ++ pp = &p->next; ++ } ++ *pp = edir->relocs_copied; ++ } ++ ++ edir->relocs_copied = eind->relocs_copied; ++ eind->relocs_copied = NULL; ++ } ++ ++ _bfd_elf_link_hash_copy_indirect (bed, dir, ind); ++} ++ + /* Create an ARM elf linker hash table. */ + + static struct bfd_link_hash_table * +@@ -256,10 +421,18 @@ + return NULL; + } + ++ ret->sgot = NULL; ++ ret->sgotplt = NULL; ++ ret->srelgot = NULL; ++ ret->splt = NULL; ++ ret->srelplt = NULL; ++ ret->sdynbss = NULL; ++ ret->srelbss = NULL; + ret->thumb_glue_size = 0; + ret->arm_glue_size = 0; + ret->bfd_of_glue_owner = NULL; + ret->no_pipeline_knowledge = 0; ++ ret->sym_sec.abfd = NULL; + + return &ret->root.root; + } +@@ -1134,16 +1307,21 @@ + #ifndef OLD_ARM_ABI + case R_ARM_XPC25: + #endif ++ /* r_symndx will be zero only for relocs against symbols ++ from removed linkonce sections, or sections discarded by ++ a linker script. */ ++ if (r_symndx == 0) ++ return bfd_reloc_ok; ++ + /* When generating a shared object, these relocations are copied + into the output file to be resolved at run time. */ +- if (info->shared +- && r_symndx != 0 +- && (r_type != R_ARM_PC24 +- || (h != NULL +- && h->dynindx != -1 +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ if ((info->shared ++ && (input_section->flags & SEC_ALLOC) ++ && (h == NULL ++ || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (r_type != R_ARM_PC24 ++ || !SYMBOL_CALLS_LOCAL (info, h)))) + { + Elf_Internal_Rela outrel; + bfd_byte *loc; +@@ -1184,30 +1362,19 @@ + + if (skip) + memset (&outrel, 0, sizeof outrel); +- else if (r_type == R_ARM_PC24) +- { +- BFD_ASSERT (h != NULL && h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_PC24); +- } ++ else if (h != NULL ++ && h->dynindx != -1 ++ && (r_type == R_ARM_PC24 ++ || !info->shared ++ || !info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)) ++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); + else + { +- if (h == NULL +- || ((info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) != 0)) +- { +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); +- } +- else +- { +- BFD_ASSERT (h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_ABS32); +- } ++ /* This symbol is local, or marked to become local. */ ++ relocate = TRUE; ++ outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); + } + + loc = sreloc->contents; +@@ -1617,16 +1784,17 @@ + if (h != NULL) + { + bfd_vma off; +- bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; ++ bfd_boolean dyn; + + off = h->got.offset; + BFD_ASSERT (off != (bfd_vma) -1); ++ dyn = globals->root.dynamic_sections_created; + +- if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) ++ if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) + || (info->shared +- && (info->symbolic || h->dynindx == -1 +- || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ || (ELF_ST_VISIBILITY (h->other) ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This is actually a static link, or it is a -Bsymbolic link + and the symbol is defined locally. We must initialize this +@@ -1712,7 +1880,8 @@ + contents, rel->r_offset, value, + (bfd_vma) 0); + +- if (h->plt.offset == (bfd_vma) -1) ++ if (h->plt.offset == (bfd_vma) -1 ++ || globals->splt == NULL) + /* We didn't make a PLT entry for this symbol. This + happens when statically linking PIC code, or when + using -Bsymbolic. */ +@@ -1958,7 +2127,7 @@ + bfd_put_32 (input_bfd, value, contents + rel->r_offset); + } + #else +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #endif + } + else +@@ -1983,9 +2152,10 @@ + case R_ARM_THM_PC22: + if (info->shared + && ( +- (!info->symbolic && h->dynindx != -1) ++ (!info->symbolic && h->dynindx != -1) + || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 + ) ++ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && ((input_section->flags & SEC_ALLOC) != 0 + /* DWARF will emit R_ARM_ABS32 relocations in its + sections against symbols defined externally +@@ -2603,7 +2773,82 @@ + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; + { +- /* We don't support garbage collection of GOT and PLT relocs yet. */ ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes; ++ bfd_signed_vma *local_got_refcounts; ++ const Elf_Internal_Rela *rel, *relend; ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h; ++ ++ elf_section_data (sec)->local_dynrel = NULL; ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (abfd); ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ ++ relend = relocs + sec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ switch (ELF32_R_TYPE (rel->r_info)) ++ { ++ case R_ARM_GOT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->got.refcount > 0) ++ h->got.refcount -= 1; ++ } ++ else if (local_got_refcounts != NULL) ++ { ++ if (local_got_refcounts[r_symndx] > 0) ++ local_got_refcounts[r_symndx] -= 1; ++ } ++ break; ++ ++ case R_ARM_ABS32: ++ case R_ARM_REL32: ++ case R_ARM_PC24: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ ++ if (!info->shared && h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; pp = &p->next) ++ if (p->section == sec) ++ { ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count -= 1; ++ p->count -= 1; ++ if (p->count == 0) ++ *pp = p->next; ++ break; ++ } ++ } ++ break; ++ ++ case R_ARM_PLT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ + return TRUE; + } + +@@ -2622,13 +2867,15 @@ + const Elf_Internal_Rela *rel; + const Elf_Internal_Rela *rel_end; + bfd *dynobj; +- asection *sgot, *srelgot, *sreloc; ++ asection *sreloc; + bfd_vma *local_got_offsets; ++ struct elf32_arm_link_hash_table *htab; + + if (info->relocatable) + return TRUE; + +- sgot = srelgot = sreloc = NULL; ++ htab = elf32_arm_hash_table (info); ++ sreloc = NULL; + + dynobj = elf_hash_table (info)->dynobj; + local_got_offsets = elf_local_got_offsets (abfd); +@@ -2653,126 +2900,82 @@ + else + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + +- /* Some relocs require a global offset table. */ +- if (dynobj == NULL) +- { +- switch (ELF32_R_TYPE (rel->r_info)) +- { +- case R_ARM_GOT32: +- case R_ARM_GOTOFF: +- case R_ARM_GOTPC: +- elf_hash_table (info)->dynobj = dynobj = abfd; +- if (! _bfd_elf_create_got_section (dynobj, info)) +- return FALSE; +- break; +- +- default: +- break; +- } +- } +- + switch (ELF32_R_TYPE (rel->r_info)) + { +- case R_ARM_GOT32: +- /* This symbol requires a global offset table entry. */ +- if (sgot == NULL) +- { +- sgot = bfd_get_section_by_name (dynobj, ".got"); +- BFD_ASSERT (sgot != NULL); +- } ++ case R_ARM_PLT32: ++ /* This symbol requires a procedure linkage table entry. We ++ actually build the entry in adjust_dynamic_symbol, ++ because this might be a case of linking PIC code which is ++ never referenced by a dynamic object, in which case we ++ don't need to generate a procedure linkage table entry ++ after all. */ + +- /* Get the got relocation section if necessary. */ +- if (srelgot == NULL +- && (h != NULL || info->shared)) +- { +- srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); ++ /* If this is a local symbol, we resolve it directly without ++ creating a procedure linkage table entry. */ ++ if (h == NULL) ++ continue; + +- /* If no got relocation section, make one and initialize. */ +- if (srelgot == NULL) +- { +- srelgot = bfd_make_section (dynobj, ".rel.got"); +- if (srelgot == NULL +- || ! bfd_set_section_flags (dynobj, srelgot, +- (SEC_ALLOC +- | SEC_LOAD +- | SEC_HAS_CONTENTS +- | SEC_IN_MEMORY +- | SEC_LINKER_CREATED +- | SEC_READONLY)) +- || ! bfd_set_section_alignment (dynobj, srelgot, 2)) +- return FALSE; +- } +- } ++ h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ h->plt.refcount++; ++ break; + ++ case R_ARM_GOT32: ++ /* This symbol requires a global offset table entry. */ + if (h != NULL) + { +- if (h->got.offset != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- h->got.offset = sgot->_raw_size; +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; +- +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ h->got.refcount++; + } + else + { +- /* This is a global offset table entry for a local +- symbol. */ +- if (local_got_offsets == NULL) ++ bfd_signed_vma *local_got_refcounts; ++ ++ /* This is a global offset table entry for a local symbol. */ ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ if (local_got_refcounts == NULL) + { + bfd_size_type size; +- unsigned int i; + + size = symtab_hdr->sh_info; +- size *= sizeof (bfd_vma); +- local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); +- if (local_got_offsets == NULL) ++ size *= (sizeof (bfd_signed_vma) + sizeof(char)); ++ local_got_refcounts = ((bfd_signed_vma *) ++ bfd_zalloc (abfd, size)); ++ if (local_got_refcounts == NULL) + return FALSE; +- elf_local_got_offsets (abfd) = local_got_offsets; +- for (i = 0; i < symtab_hdr->sh_info; i++) +- local_got_offsets[i] = (bfd_vma) -1; ++ elf_local_got_refcounts (abfd) = local_got_refcounts; + } +- +- if (local_got_offsets[r_symndx] != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- local_got_offsets[r_symndx] = sgot->_raw_size; +- +- if (info->shared) +- /* If we are generating a shared object, we need to +- output a R_ARM_RELATIVE reloc so that the dynamic +- linker can adjust this GOT entry. */ +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ local_got_refcounts[r_symndx] += 1; + } +- +- sgot->_raw_size += 4; + break; + +- case R_ARM_PLT32: +- /* This symbol requires a procedure linkage table entry. We +- actually build the entry in adjust_dynamic_symbol, +- because this might be a case of linking PIC code which is +- never referenced by a dynamic object, in which case we +- don't need to generate a procedure linkage table entry +- after all. */ +- +- /* If this is a local symbol, we resolve it directly without +- creating a procedure linkage table entry. */ +- if (h == NULL) +- continue; +- +- h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ case R_ARM_GOTOFF: ++ case R_ARM_GOTPC: ++ if (htab->sgot == NULL) ++ { ++ if (htab->root.dynobj == NULL) ++ htab->root.dynobj = abfd; ++ if (!create_got_section (htab->root.dynobj, info)) ++ return FALSE; ++ } + break; + + case R_ARM_ABS32: + case R_ARM_REL32: + case R_ARM_PC24: ++ if (h != NULL && !info->shared) ++ { ++ /* If this reloc is in a read-only section, we might ++ need a copy reloc. We can't check reliably at this ++ stage whether the section is read-only, as input ++ sections have not yet been mapped to output sections. ++ Tentatively set the flag for now, and correct in ++ adjust_dynamic_symbol. */ ++ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; ++ ++ /* We may need a .plt entry if the function this reloc ++ refers to is in a shared lib. */ ++ h->plt.refcount += 1; ++ } ++ + /* If we are creating a shared library, and this is a reloc + against a global symbol, or a non PC relative reloc + against a local symbol, then we need to copy the reloc +@@ -2784,14 +2987,17 @@ + possible that DEF_REGULAR is not set now but will be set + later (it is never cleared). We account for that + possibility below by storing information in the +- pcrel_relocs_copied field of the hash table entry. */ ++ relocs_copied field of the hash table entry. */ + if (info->shared +- && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 +- || (h != NULL +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ && (sec->flags & SEC_ALLOC) != 0 ++ && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 ++ || (h != NULL ++ && (! info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)))) + { ++ struct elf32_arm_relocs_copied *p, **head; ++ + /* When creating a shared object, we must copy these + reloc types into the output file. We create a reloc + section in dynobj and make room for this reloc. */ +@@ -2825,45 +3031,49 @@ + || ! bfd_set_section_alignment (dynobj, sreloc, 2)) + return FALSE; + } +- if (sec->flags & SEC_READONLY) +- info->flags |= DF_TEXTREL; ++ ++ elf_section_data (sec)->sreloc = sreloc; + } + +- sreloc->_raw_size += sizeof (Elf32_External_Rel); +- /* If we are linking with -Bsymbolic, and this is a +- global symbol, we count the number of PC relative +- relocations we have entered for this symbol, so that +- we can discard them again if the symbol is later +- defined by a regular object. Note that this function +- is only called if we are using an elf_i386 linker +- hash table, which means that h is really a pointer to +- an elf_i386_link_hash_entry. */ +- if (h != NULL && info->symbolic +- && ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ /* If this is a global symbol, we count the number of ++ relocations we need for this symbol. */ ++ if (h != NULL) + { +- struct elf32_arm_link_hash_entry * eh; +- struct elf32_arm_pcrel_relocs_copied * p; +- +- eh = (struct elf32_arm_link_hash_entry *) h; +- +- for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) +- if (p->section == sreloc) +- break; +- ++ head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied; ++ } ++ else ++ { ++ /* Track dynamic relocs needed for local syms too. ++ We really need local syms available to do this ++ easily. Oh well. */ ++ ++ asection *s; ++ s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, ++ sec, r_symndx); ++ if (s == NULL) ++ return FALSE; ++ ++ head = ((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ } ++ ++ p = *head; ++ if (p == NULL || p->section != sec) ++ { ++ bfd_size_type amt = sizeof *p; ++ p = bfd_alloc (htab->root.dynobj, amt); + if (p == NULL) +- { +- p = ((struct elf32_arm_pcrel_relocs_copied *) +- bfd_alloc (dynobj, (bfd_size_type) sizeof * p)); +- if (p == NULL) +- return FALSE; +- p->next = eh->pcrel_relocs_copied; +- eh->pcrel_relocs_copied = p; +- p->section = sreloc; +- p->count = 0; +- } +- +- ++p->count; ++ return FALSE; ++ p->next = *head; ++ *head = p; ++ p->section = sec; ++ p->count = 0; ++ p->pc_count = 0; + } ++ ++ p->count += 1; ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count += 1; + } + break; + +@@ -3003,71 +3213,29 @@ + if (h->type == STT_FUNC + || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) + { +- /* If we link a program (not a DSO), we'll get rid of unnecessary +- PLT entries; we point to the actual symbols -- even for pic +- relocs, because a program built with -fpic should have the same +- result as one built without -fpic, specifically considering weak +- symbols. +- FIXME: m68k and i386 differ here, for unclear reasons. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0) ++ if (h->plt.refcount <= 0 ++ || SYMBOL_CALLS_LOCAL (info, h) ++ || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This case can occur if we saw a PLT32 reloc in an input +- file, but the symbol was not defined by a dynamic object. +- In such a case, we don't actually need to build a +- procedure linkage table, and we can just do a PC32 reloc +- instead. */ +- BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); ++ file, but the symbol was never referred to by a dynamic ++ object, or if all references were garbage collected. In ++ such a case, we don't actually need to build a procedure ++ linkage table, and we can just do a PC24 reloc instead. */ ++ h->plt.offset = (bfd_vma) -1; + h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; +- return TRUE; +- } +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- { +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; + } + +- s = bfd_get_section_by_name (dynobj, ".plt"); +- BFD_ASSERT (s != NULL); +- +- /* If this is the first .plt entry, make room for the special +- first entry. */ +- if (s->_raw_size == 0) +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* If this symbol is not defined in a regular file, and we are +- not generating a shared library, then set the symbol to this +- location in the .plt. This is required to make function +- pointers compare as equal between the normal executable and +- the shared library. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- { +- h->root.u.def.section = s; +- h->root.u.def.value = s->_raw_size; +- } +- +- h->plt.offset = s->_raw_size; +- +- /* Make room for this entry. */ +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* We also need to make an entry in the .got.plt section, which +- will be placed in the .got section by the linker script. */ +- s = bfd_get_section_by_name (dynobj, ".got.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += 4; +- +- /* We also need to make an entry in the .rel.plt section. */ +- +- s = bfd_get_section_by_name (dynobj, ".rel.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += sizeof (Elf32_External_Rel); +- + return TRUE; + } ++ else ++ /* It's possible that we incorrectly decided a .plt reloc was ++ needed for an R_ARM_PC24 reloc to a non-function sym in ++ check_relocs. We can't decide accurately between function and ++ non-function syms in check-relocs; Objects loaded later in ++ the link may change h->type. So fix it now. */ ++ h->plt.offset = (bfd_vma) -1; + + /* If this is a weak symbol, and there is a real definition, the + processor independent code will have arranged for us to see the +@@ -3142,6 +3310,198 @@ + return TRUE; + } + ++/* Allocate space in .plt, .got and associated reloc sections for ++ dynamic relocs. */ ++ ++static bfd_boolean ++allocate_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct bfd_link_info *info; ++ struct elf32_arm_link_hash_table *htab; ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_indirect) ++ return TRUE; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ /* When warning symbols are created, they **replace** the "real" ++ entry in the hash table, thus we never get to see the real ++ symbol in a hash traversal. So look at it now. */ ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ info = (struct bfd_link_info *) inf; ++ htab = elf32_arm_hash_table (info); ++ ++ if (htab->root.dynamic_sections_created ++ && h->plt.refcount > 0) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ if (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) ++ { ++ asection *s = htab->splt; ++ ++ /* If this is the first .plt entry, make room for the special ++ first entry. */ ++ if (s->_raw_size == 0) ++ s->_raw_size += PLT_HEADER_SIZE; ++ ++ h->plt.offset = s->_raw_size; ++ ++ /* If this symbol is not defined in a regular file, and we are ++ not generating a shared library, then set the symbol to this ++ location in the .plt. This is required to make function ++ pointers compare as equal between the normal executable and ++ the shared library. */ ++ if (! info->shared ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ { ++ h->root.u.def.section = s; ++ h->root.u.def.value = h->plt.offset; ++ } ++ ++ /* Make room for this entry. */ ++ s->_raw_size += PLT_ENTRY_SIZE; ++ ++ /* We also need to make an entry in the .got.plt section, which ++ will be placed in the .got section by the linker script. */ ++ htab->sgotplt->_raw_size += 4; ++ ++ /* We also need to make an entry in the .rel.plt section. */ ++ htab->srelplt->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ ++ if (h->got.refcount > 0) ++ { ++ asection *s; ++ bfd_boolean dyn; ++ ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ s = htab->sgot; ++ h->got.offset = s->_raw_size; ++ s->_raw_size += 4; ++ dyn = htab->root.dynamic_sections_created; ++ if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) ++ htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ h->got.offset = (bfd_vma) -1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ if (eh->relocs_copied == NULL) ++ return TRUE; ++ ++ /* In the shared -Bsymbolic case, discard space allocated for ++ dynamic pc-relative relocs against symbols which turn out to be ++ defined in regular objects. For the normal shared case, discard ++ space for pc-relative relocs that have become local due to symbol ++ visibility changes. */ ++ ++ if (info->shared) ++ { ++ /* The only reloc that uses pc_count is R_ARM_PC24, which will ++ appear on a call or on something like ".long foo - .". We ++ want calls to protected symbols to resolve directly to the ++ function rather than going via the plt. If people want ++ function pointer comparisons to work as expected then they ++ should avoid writing assembly like ".long foo - .". */ ++ if (SYMBOL_CALLS_LOCAL (info, h)) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; ) ++ { ++ p->count -= p->pc_count; ++ p->pc_count = 0; ++ if (p->count == 0) ++ *pp = p->next; ++ else ++ pp = &p->next; ++ } ++ } ++ ++ /* Also discard relocs on undefined weak syms with non-default ++ visibility. */ ++ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak) ++ eh->relocs_copied = NULL; ++ } ++ else ++ { ++ /* For the non-shared case, discard space for relocs against ++ symbols which turn out to need copy relocs or are not ++ dynamic. */ ++ ++ if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 ++ && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ || (htab->root.dynamic_sections_created ++ && (h->root.type == bfd_link_hash_undefweak ++ || h->root.type == bfd_link_hash_undefined)))) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ /* If that succeeded, we know we'll be keeping all the ++ relocs. */ ++ if (h->dynindx != -1) ++ goto keep; ++ } ++ ++ eh->relocs_copied = NULL; ++ ++ keep: ; ++ } ++ ++ /* Finally, allocate space. */ ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *sreloc = elf_section_data (p->section)->sreloc; ++ sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ } ++ ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3153,7 +3513,10 @@ + asection * s; + bfd_boolean plt; + bfd_boolean relocs; ++ bfd *ibfd; ++ struct elf32_arm_link_hash_table *htab; + ++ htab = elf32_arm_hash_table (info); + dynobj = elf_hash_table (info)->dynobj; + BFD_ASSERT (dynobj != NULL); + +@@ -3168,26 +3531,74 @@ + s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; + } + } +- else +- { +- /* We may have created entries in the .rel.got section. +- However, if we are not creating the dynamic sections, we will +- not actually use these entries. Reset the size of .rel.got, +- which will cause it to get stripped from the output file +- below. */ +- s = bfd_get_section_by_name (dynobj, ".rel.got"); +- if (s != NULL) +- s->_raw_size = 0; +- } +- +- /* If this is a -Bsymbolic shared link, then we need to discard all +- PC relative relocs against symbols defined in a regular object. +- We allocated space for them in the check_relocs routine, but we +- will not fill them in in the relocate_section routine. */ +- if (info->shared && info->symbolic) +- elf32_arm_link_hash_traverse (elf32_arm_hash_table (info), +- elf32_arm_discard_copies, +- (PTR) NULL); ++ ++ /* Set up .got offsets for local syms, and space for local dynamic ++ relocs. */ ++ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) ++ { ++ bfd_signed_vma *local_got; ++ bfd_signed_vma *end_local_got; ++ char *local_tls_type; ++ bfd_size_type locsymcount; ++ Elf_Internal_Shdr *symtab_hdr; ++ asection *srel; ++ ++ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) ++ continue; ++ ++ for (s = ibfd->sections; s != NULL; s = s->next) ++ { ++ struct elf32_arm_relocs_copied *p; ++ ++ for (p = *((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ p != NULL; ++ p = p->next) ++ { ++ if (!bfd_is_abs_section (p->section) ++ && bfd_is_abs_section (p->section->output_section)) ++ { ++ /* Input section has been discarded, either because ++ it is a copy of a linkonce section or due to ++ linker script /DISCARD/, so we'll be discarding ++ the relocs too. */ ++ } ++ else if (p->count != 0) ++ { ++ srel = elf_section_data (p->section)->sreloc; ++ srel->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ if ((p->section->output_section->flags & SEC_READONLY) != 0) ++ info->flags |= DF_TEXTREL; ++ } ++ } ++ } ++ ++ local_got = elf_local_got_refcounts (ibfd); ++ if (!local_got) ++ continue; ++ ++ symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; ++ locsymcount = symtab_hdr->sh_info; ++ end_local_got = local_got + locsymcount; ++ s = htab->sgot; ++ srel = htab->srelgot; ++ for (; local_got < end_local_got; ++local_got, ++local_tls_type) ++ { ++ if (*local_got > 0) ++ { ++ *local_got = s->_raw_size; ++ s->_raw_size += 4; ++ if (info->shared) ++ srel->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ *local_got = (bfd_vma) -1; ++ } ++ } ++ ++ /* Allocate global sym .plt and .got entries, and space for global ++ sym dynamic relocs. */ ++ elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info); + + /* The check_relocs and adjust_dynamic_symbol entry points have + determined the sizes of the various dynamic sections. Allocate +@@ -3312,33 +3723,6 @@ + return TRUE; + } + +-/* This function is called via elf32_arm_link_hash_traverse if we are +- creating a shared object with -Bsymbolic. It discards the space +- allocated to copy PC relative relocs against symbols which are +- defined in regular objects. We allocated space for them in the +- check_relocs routine, but we won't fill them in in the +- relocate_section routine. */ +- +-static bfd_boolean +-elf32_arm_discard_copies (h, ignore) +- struct elf32_arm_link_hash_entry * h; +- PTR ignore ATTRIBUTE_UNUSED; +-{ +- struct elf32_arm_pcrel_relocs_copied * s; +- +- if (h->root.root.type == bfd_link_hash_warning) +- h = (struct elf32_arm_link_hash_entry *) h->root.root.u.i.link; +- +- /* We only discard relocs for symbols defined in a regular object. */ +- if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- return TRUE; +- +- for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) +- s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel); +- +- return TRUE; +-} +- + /* Finish up dynamic symbol handling. We set the contents of various + dynamic sections here. */ + +@@ -3362,6 +3746,7 @@ + bfd_vma got_offset; + Elf_Internal_Rela rel; + bfd_byte *loc; ++ bfd_vma got_displacement; + + /* This symbol has an entry in the procedure linkage table. Set + it up. */ +@@ -3377,35 +3762,43 @@ + corresponds to this symbol. This is the index of this symbol + in all the symbols for which we are making plt entries. The + first entry in the procedure linkage table is reserved. */ +- plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; ++ plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE; + + /* Get the offset into the .got table of the entry that + corresponds to this function. Each .got entry is 4 bytes. + The first three are reserved. */ + got_offset = (plt_index + 3) * 4; + ++ /* Calculate the displacement between the PLT slot and the ++ entry in the GOT. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ + got_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - h->plt.offset ++ - 8); ++ ++ BFD_ASSERT ((got_displacement & 0xf0000000) == 0); ++ + /* Fill in the entry in the procedure linkage table. */ +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[0], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20), + splt->contents + h->plt.offset + 0); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[1], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12), + splt->contents + h->plt.offset + 4); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[2], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff), + splt->contents + h->plt.offset + 8); +- bfd_put_32 (output_bfd, +- (sgot->output_section->vma +- + sgot->output_offset +- + got_offset +- - splt->output_section->vma +- - splt->output_offset +- - h->plt.offset - 12), +- splt->contents + h->plt.offset + 12); ++#ifdef FOUR_WORD_PLT ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ++ splt->contents + h->plt.offset + 12); ++#endif + + /* Fill in the entry in the global offset table. */ + bfd_put_32 (output_bfd, + (splt->output_section->vma + + splt->output_offset), + sgot->contents + got_offset); +- ++ + /* Fill in the entry in the .rel.plt section. */ + rel.r_offset = (sgot->output_section->vma + + sgot->output_offset +@@ -3446,16 +3839,20 @@ + + sgot->output_offset + + (h->got.offset &~ (bfd_vma) 1)); + +- /* If this is a -Bsymbolic link, and the symbol is defined +- locally, we just want to emit a RELATIVE reloc. The entry in +- the global offset table will already have been initialized in +- the relocate_section function. */ ++ /* If this is a static link, or it is a -Bsymbolic link and the ++ symbol is defined locally or was forced to be local because ++ of a version file, we just want to emit a RELATIVE reloc. ++ The entry in the global offset table will already have been ++ initialized in the relocate_section function. */ + if (info->shared +- && (info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) +- rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ { ++ BFD_ASSERT((h->got.offset & 1) != 0); ++ rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ } + else + { ++ BFD_ASSERT((h->got.offset & 1) == 0); + bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); + rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT); + } +@@ -3609,10 +4006,26 @@ + /* Fill in the first entry in the procedure linkage table. */ + if (splt->_raw_size > 0) + { ++ bfd_vma got_displacement; ++ ++ /* Calculate the displacement between the PLT slot and &GOT[0]. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - 16); ++ + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12); ++#ifdef FOUR_WORD_PLT ++ /* The displacement value goes in the otherwise-unused last word of ++ the second entry. */ ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 28); ++#else ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 16); ++#endif + } + + /* UnixWare sets the entsize of .plt to 4, although that doesn't +@@ -3714,7 +4127,7 @@ + #define elf_backend_check_relocs elf32_arm_check_relocs + #define elf_backend_relocate_section elf32_arm_relocate_section + #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol +-#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections ++#define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections + #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol + #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections + #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections +@@ -3723,7 +4136,9 @@ + #define elf_backend_object_p elf32_arm_object_p + #define elf_backend_section_flags elf32_arm_section_flags + #define elf_backend_final_write_processing elf32_arm_final_write_processing ++#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol + ++#define elf_backend_can_refcount 1 + #define elf_backend_can_gc_sections 1 + #define elf_backend_plt_readonly 1 + #define elf_backend_want_got_plt 1 +@@ -3733,7 +4148,7 @@ + #endif + + #define elf_backend_got_header_size 12 +-#define elf_backend_plt_header_size PLT_ENTRY_SIZE ++#define elf_backend_plt_header_size PLT_HEADER_SIZE + + #include "elf32-target.h" + +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-avr.c binutils-2.14.90.0.7/bfd/elf32-avr.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-avr.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-avr.c 2004-04-20 01:26:12.000000000 -0600 +@@ -750,7 +750,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-cris.c binutils-2.14.90.0.7/bfd/elf32-cris.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-cris.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-cris.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,7 +847,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + symname = (bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name)); +@@ -1292,16 +1292,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c binutils-2.14.90.0.7/bfd/elf32-fr30.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-fr30.c 2004-04-20 01:26:12.000000000 -0600 +@@ -552,7 +552,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-frv.c binutils-2.14.90.0.7/bfd/elf32-frv.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-frv.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-frv.c 2004-04-20 01:26:12.000000000 -0600 +@@ -724,7 +724,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c binutils-2.14.90.0.7/bfd/elf32-h8300.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-h8300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -435,7 +435,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c binutils-2.14.90.0.7/bfd/elf32-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3408,7 +3408,7 @@ + /* This is a local symbol, h defaults to NULL. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i370.c binutils-2.14.90.0.7/bfd/elf32-i370.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i370.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-i370.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1210,7 +1210,7 @@ + sec = local_sections[r_symndx]; + sym_name = ""; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +@@ -1363,16 +1363,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i860.c binutils-2.14.90.0.7/bfd/elf32-i860.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i860.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-i860.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1104,7 +1104,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c binutils-2.14.90.0.7/bfd/elf32-m32r.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-m32r.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1107,7 +1107,7 @@ + sec = local_sections[r_symndx]; + sym_name = ""; + #if !USE_REL +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + #else + /* FIXME: This won't handle local relocations against SEC_MERGE +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c binutils-2.14.90.0.7/bfd/elf32-m68k.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-m68k.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1403,7 +1403,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1657,16 +1657,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c binutils-2.14.90.0.7/bfd/elf32-mcore.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-mcore.c 2004-04-20 01:26:12.000000000 -0600 +@@ -467,7 +467,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c binutils-2.14.90.0.7/bfd/elf32-msp430.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-msp430.c 2004-04-20 01:26:12.000000000 -0600 +@@ -449,7 +449,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c binutils-2.14.90.0.7/bfd/elf32-openrisc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-openrisc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -375,7 +375,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c binutils-2.14.90.0.7/bfd/elf32-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4727,7 +4727,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -5455,44 +5455,9 @@ + break; + + case R_PPC_RELAX32: +- { +- unsigned long r_symndx; +- Elf_Internal_Sym *sym; +- asection *sym_sec; +- bfd_byte *hit_addr = 0; +- bfd_vma value = 0; +- +- r_symndx = ELF32_R_SYM (rel->r_info); +- +- if (r_symndx < symtab_hdr->sh_info) +- { +- sym = local_syms + r_symndx; +- sym_sec = local_sections[r_symndx]; +- +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); +- } +- else +- { +- bfd_boolean warned; +- bfd_boolean unresolved_reloc; +- +- RELOC_FOR_GLOBAL_SYMBOL (h, elf_sym_hashes (input_bfd), +- r_symndx, symtab_hdr, +- value, sym_sec, +- unresolved_reloc, info, +- warned); +- if (warned) +- continue; +- } +- hit_addr = contents + rel->r_offset; +- value += rel->r_addend; +- +- r = ppc_elf_install_value (output_bfd, hit_addr, value, r_type); +- if (r != bfd_reloc_ok) +- break; +- else +- continue; +- } ++ ppc_elf_install_value (output_bfd, contents + rel->r_offset, ++ relocation + addend, r_type); ++ continue; + + /* Indirect .sdata relocation. */ + case R_PPC_EMB_SDAI16: +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-s390.c binutils-2.14.90.0.7/bfd/elf32-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-s390.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2327,7 +2327,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sh.c binutils-2.14.90.0.7/bfd/elf32-sh.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sh.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-sh.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4805,7 +4805,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c binutils-2.14.90.0.7/bfd/elf32-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2182,7 +2182,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2459,16 +2459,8 @@ + + if (is_plt) + sec = htab->splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-v850.c binutils-2.14.90.0.7/bfd/elf32-v850.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-v850.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-v850.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1681,7 +1681,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #if 0 + { + char * name; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-vax.c binutils-2.14.90.0.7/bfd/elf32-vax.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-vax.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-vax.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1483,7 +1483,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1737,16 +1737,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c binutils-2.14.90.0.7/bfd/elf32-xstormy16.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c 2003-07-23 09:08:09.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-xstormy16.c 2004-04-20 01:26:12.000000000 -0600 +@@ -845,7 +845,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c binutils-2.14.90.0.7/bfd/elf32-xtensa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-xtensa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2004,7 +2004,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c binutils-2.14.90.0.7/bfd/elf64-alpha.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-alpha.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4394,9 +4394,11 @@ + + if (r_symndx < symtab_hdr->sh_info) + { ++ asection *msec; + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ msec = sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + + /* If this is a tp-relative relocation against sym 0, + this is hackery from relax_section. Force the value to +@@ -4424,7 +4426,6 @@ + && !gotent->reloc_xlated) + { + struct alpha_elf_got_entry *ent; +- asection *msec; + + for (ent = gotent; ent; ent = ent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c binutils-2.14.90.0.7/bfd/elf64-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -173,7 +173,7 @@ + PTR info)); + + static const char *get_dyn_name +- PARAMS ((asection *, struct elf_link_hash_entry *, ++ PARAMS ((bfd *, struct elf_link_hash_entry *, + const Elf_Internal_Rela *, char **, size_t *)); + + /* This must follow the definitions of the various derived linker +@@ -446,13 +446,14 @@ + allocate memory as necessary, possibly reusing PBUF/PLEN. */ + + static const char * +-get_dyn_name (sec, h, rel, pbuf, plen) +- asection *sec; ++get_dyn_name (abfd, h, rel, pbuf, plen) ++ bfd *abfd; + struct elf_link_hash_entry *h; + const Elf_Internal_Rela *rel; + char **pbuf; + size_t *plen; + { ++ asection *sec = abfd->sections; + size_t nlen, tlen; + char *buf; + size_t len; +@@ -858,7 +859,7 @@ + continue; + + /* Collect a canonical name for this address. */ +- addr_name = get_dyn_name (sec, h, rel, &buf, &buf_len); ++ addr_name = get_dyn_name (abfd, h, rel, &buf, &buf_len); + + /* Collect the canonical entry data for this address. */ + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c binutils-2.14.90.0.7/bfd/elf64-mmix.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-mmix.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1472,7 +1472,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c binutils-2.14.90.0.7/bfd/elf64-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7385,7 +7385,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + sym_type = ELF64_ST_TYPE (sym->st_info); +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + if (elf_section_data (sec) != NULL) + { + long *opd_sym_adjust; +@@ -8178,7 +8178,9 @@ + relocation = TOCstart; + if (r_symndx == 0) + relocation += htab->stub_group[input_section->id].toc_off; +- else if (sec != NULL && !unresolved_reloc) ++ else if (unresolved_reloc) ++ ; ++ else if (sec != NULL && sec->id <= htab->top_id) + relocation += htab->stub_group[sec->id].toc_off; + else + unresolved_reloc = TRUE; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-s390.c binutils-2.14.90.0.7/bfd/elf64-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-s390.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2297,7 +2297,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c binutils-2.14.90.0.7/bfd/elf64-sh64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-sh64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1582,7 +1582,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + relocation |= ((sym->st_other & STO_SH5_ISA32) != 0); + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c binutils-2.14.90.0.7/bfd/elf64-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2070,7 +2070,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2247,16 +2247,8 @@ + + if (is_plt) + sec = splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c binutils-2.14.90.0.7/bfd/elf64-x86-64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-x86-64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1823,7 +1823,7 @@ + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2048,16 +2048,7 @@ + { + long sindx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + sindx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c binutils-2.14.90.0.7/bfd/elfxx-ia64.c +--- binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elfxx-ia64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3849,9 +3849,11 @@ + if (r_symndx < symtab_hdr->sh_info) + { + /* Reloc against local symbol. */ ++ asection *msec; + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ msec = sym_sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + if ((sym_sec->flags & SEC_MERGE) + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE) +@@ -3862,7 +3864,6 @@ + if (loc_h && ! loc_h->sec_merge_done) + { + struct elfNN_ia64_dyn_sym_info *dynent; +- asection *msec; + + for (dynent = loc_h->info; dynent; dynent = dynent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/opncls.c binutils-2.14.90.0.7/bfd/opncls.c +--- binutils-2.14.90.0.7.orig/bfd/opncls.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/opncls.c 2004-04-20 01:26:11.000000000 -0600 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.14.90.0.7.orig/binutils/objcopy.c binutils-2.14.90.0.7/binutils/objcopy.c +--- binutils-2.14.90.0.7.orig/binutils/objcopy.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/objcopy.c 2004-04-20 01:26:12.000000000 -0600 +@@ -27,6 +27,7 @@ + #include "libiberty.h" + #include "budbg.h" + #include "filenames.h" ++#include "elf-bfd.h" + #include + + /* A list of symbols to explicitly strip out, or to keep. A linked +@@ -385,6 +386,7 @@ + -g --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ + -N --strip-symbol Do not copy symbol \n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -K --keep-symbol Only copy symbol \n\ + -L --localize-symbol Force symbol to be marked as a local\n\ + -G --keep-global-symbol Localize all symbols except \n\ +@@ -457,6 +459,7 @@ + -s --strip-all Remove all symbol and relocation information\n\ + -g -S -d --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -N --strip-symbol= Do not copy symbol \n\ + -K --keep-symbol= Only copy symbol \n\ + -x --discard-all Remove all non-global symbols\n\ +@@ -734,7 +737,7 @@ + return FALSE; + } + +- return strip_symbols == STRIP_NONDEBUG ? TRUE : FALSE; ++ return FALSE; + } + + /* Choose which symbol entries to copy; put the result in OSYMS. +@@ -1806,6 +1809,13 @@ + + if (p != NULL && p->set_flags) + flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC)); ++ else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0) ++ { ++ flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD); ++ if (obfd->xvec->flavour == bfd_target_elf_flavour) ++ elf_section_type (osection) = SHT_NOBITS; ++ } ++ + if (!bfd_set_section_flags (obfd, osection, flags)) + { + err = _("flags"); +@@ -1926,6 +1936,8 @@ + } + + bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount); ++ if (relcount == 0) ++ free (relpp); + } + + isection->_cooked_size = isection->_raw_size; +diff -urN binutils-2.14.90.0.7.orig/binutils/readelf.c binutils-2.14.90.0.7/binutils/readelf.c +--- binutils-2.14.90.0.7.orig/binutils/readelf.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/readelf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -6055,7 +6055,7 @@ + + bytes = section->sh_size; + +- if (bytes == 0) ++ if (bytes == 0 || section->sh_type == SHT_NOBITS) + { + printf (_("\nSection '%s' has no data to dump.\n"), + SECTION_NAME (section)); +diff -urN binutils-2.14.90.0.7.orig/gprof/gprof.texi binutils-2.14.90.0.7/gprof/gprof.texi +--- binutils-2.14.90.0.7.orig/gprof/gprof.texi 2002-08-01 18:49:32.000000000 -0600 ++++ binutils-2.14.90.0.7/gprof/gprof.texi 2004-04-20 01:26:11.000000000 -0600 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -181,7 +185,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +@@ -267,6 +271,11 @@ + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: + ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. ++ + @example + cc -g -c myprog.c utils.c -pg + cc -o myprog myprog.o utils.o -pg +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.am binutils-2.14.90.0.7/ld/Makefile.am +--- binutils-2.14.90.0.7.orig/ld/Makefile.am 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.am 2004-04-20 01:26:11.000000000 -0600 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.in binutils-2.14.90.0.7/ld/Makefile.in +--- binutils-2.14.90.0.7.orig/ld/Makefile.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.in 2004-04-20 01:26:11.000000000 -0600 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em binutils-2.14.90.0.7/ld/emultempl/elf32.em +--- binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/emultempl/elf32.em 2004-04-20 01:26:11.000000000 -0600 +@@ -679,6 +679,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -855,6 +857,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.14.90.0.7.orig/ltmain.sh binutils-2.14.90.0.7/ltmain.sh +--- binutils-2.14.90.0.7.orig/ltmain.sh 2002-03-22 15:06:16.000000000 -0700 ++++ binutils-2.14.90.0.7/ltmain.sh 2004-04-20 01:26:12.000000000 -0600 +@@ -4413,6 +4413,10 @@ + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.am binutils-2.14.90.0.7/opcodes/Makefile.am +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.am 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.am 2004-04-20 01:26:12.000000000 -0600 +@@ -284,7 +284,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.in binutils-2.14.90.0.7/opcodes/Makefile.in +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.in 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.in 2004-04-20 01:26:12.000000000 -0600 +@@ -394,7 +394,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +@@ -593,7 +593,7 @@ + all-recursive install-data-recursive install-exec-recursive \ + installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ + check-recursive installcheck-recursive info-recursive dvi-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -613,7 +613,7 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ +diff -urN binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c binutils-2.14.90.0.7/opcodes/alpha-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c 2003-01-21 11:21:34.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/alpha-opc.c 2004-04-20 01:26:11.000000000 -0600 +@@ -1105,7 +1105,8 @@ + { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE }, + { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } }, + { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } }, +- { "rpcc", MFC(0x18,0xC000), BASE, { RA } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, ZB } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, RB } }, /* ev6 una */ + { "rc", MFC(0x18,0xE000), BASE, { RA } }, + { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */ + { "rs", MFC(0x18,0xF000), BASE, { RA } }, +diff -urN binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c binutils-2.14.90.0.7/opcodes/m68k-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/m68k-opc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,15 +847,15 @@ + {"fmoved", two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat }, ++/* FIXME: the next two variants should not permit moving an address ++ register to anything but the floating point instruction register. */ ++{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, ++{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat }, + /* Move the FP control registers */ + {"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat }, + {"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat }, +-/* FIXME: the next two variants should not permit moving an address +- register to anything but the floating point instruction register. */ +-{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, +-{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovep", two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat }, + {"fmovep", two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat }, + {"fmovep", two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat }, diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch new file mode 100644 index 0000000000..6e36af2298 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/config.bfd binutils-2.14.90.0.7/bfd/config.bfd +--- binutils-2.14.90.0.7.orig/bfd/config.bfd 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/config.bfd 2004-04-20 01:37:12.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-linux-uclibc* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -214,7 +214,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -222,7 +222,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm*-*-linux-uclibc* | arm-*-kfreebsd*-gnu) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -355,7 +355,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -366,7 +366,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -488,7 +488,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +502,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -662,7 +662,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -929,7 +929,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +962,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1111,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1157,7 +1158,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure binutils-2.14.90.0.7/bfd/configure +--- binutils-2.14.90.0.7.orig/bfd/configure 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure.in binutils-2.14.90.0.7/bfd/configure.in +--- binutils-2.14.90.0.7.orig/bfd/configure.in 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/config.sub binutils-2.14.90.0.7/config.sub +--- binutils-2.14.90.0.7.orig/config.sub 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/config.sub 2004-04-20 01:32:29.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.7.orig/configure binutils-2.14.90.0.7/configure +--- binutils-2.14.90.0.7.orig/configure 2003-10-29 10:38:23.000000000 -0700 ++++ binutils-2.14.90.0.7/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1276,6 +1276,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/configure.in binutils-2.14.90.0.7/configure.in +--- binutils-2.14.90.0.7.orig/configure.in 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -515,6 +515,19 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ build_modules= ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/demangler/configure binutils-2.14.90.0.7/demangler/configure +--- binutils-2.14.90.0.7.orig/demangler/configure 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/demangler/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1380,6 +1380,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/gas/configure binutils-2.14.90.0.7/gas/configure +--- binutils-2.14.90.0.7.orig/gas/configure 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure 2004-04-20 01:37:58.000000000 -0600 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4028,6 +4033,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4044,6 +4050,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4058,6 +4065,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4114,7 +4122,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4201,6 +4212,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -4257,7 +4269,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) { { echo "$as_me:$LINENO: error: GNU/Linux must be configured big endian" >&5 +@@ -4286,7 +4298,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4319,6 +4333,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/gas/configure.in binutils-2.14.90.0.7/gas/configure.in +--- binutils-2.14.90.0.7.orig/gas/configure.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure.in 2004-04-20 01:38:23.000000000 -0600 +@@ -192,6 +192,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -208,6 +209,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -222,6 +224,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -278,7 +281,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -358,6 +364,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -412,7 +419,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) AC_MSG_ERROR(GNU/Linux must be configured big endian) ;; +@@ -434,7 +441,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -467,6 +476,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/ld/configure binutils-2.14.90.0.7/ld/configure +--- binutils-2.14.90.0.7.orig/ld/configure 2003-05-05 15:46:49.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/ld/configure.tgt binutils-2.14.90.0.7/ld/configure.tgt +--- binutils-2.14.90.0.7.orig/ld/configure.tgt 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/configure.tgt 2004-04-20 01:32:29.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -125,7 +128,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -149,14 +152,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -256,10 +261,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -360,7 +368,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -376,9 +385,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -422,16 +431,20 @@ + mips*-*-rtems*) targ_emul=elf32ebmip ;; + mips*el-*-vxworks*) targ_emul=elf32elmip ;; + mips*-*-vxworks*) targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -454,6 +467,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.7.orig/libtool.m4 binutils-2.14.90.0.7/libtool.m4 +--- binutils-2.14.90.0.7.orig/libtool.m4 2003-05-05 15:46:46.000000000 -0600 ++++ binutils-2.14.90.0.7/libtool.m4 2004-04-20 01:32:29.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.7.orig/ltconfig binutils-2.14.90.0.7/ltconfig +--- binutils-2.14.90.0.7.orig/ltconfig 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/ltconfig 2004-04-20 01:32:29.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch b/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch new file mode 100644 index 0000000000..e9f8e75a89 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch b/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch new file mode 100644 index 0000000000..dc67d3c4e3 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch new file mode 100644 index 0000000000..780823542a --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch @@ -0,0 +1,142 @@ +diff -urN binutils-2.14.90.0.8-dist/bfd/elf64-alpha.c binutils-2.14.90.0.8/bfd/elf64-alpha.c +--- binutils-2.14.90.0.8-dist/bfd/elf64-alpha.c 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/elf64-alpha.c 2004-02-11 03:42:05.000000000 -0600 +@@ -4144,9 +4144,12 @@ + + loc = srel->contents; + loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); +- bfd_elf64_swap_reloca_out (abfd, &outrel, loc); +- BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count +- <= srel->_cooked_size); ++ if (loc) ++ { ++ bfd_elf64_swap_reloca_out (abfd, &outrel, loc); ++ BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count ++ <= srel->_cooked_size); ++ } + } + + /* Relocate an Alpha ELF section for a relocatable link. +diff -urN binutils-2.14.90.0.8-dist/bfd/opncls.c binutils-2.14.90.0.8/bfd/opncls.c +--- binutils-2.14.90.0.8-dist/bfd/opncls.c 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/opncls.c 2004-02-11 03:42:01.000000000 -0600 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.14.90.0.8-dist/gprof/gprof.texi binutils-2.14.90.0.8/gprof/gprof.texi +--- binutils-2.14.90.0.8-dist/gprof/gprof.texi 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.14.90.0.8/gprof/gprof.texi 2004-02-11 03:42:01.000000000 -0600 +@@ -138,6 +138,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -182,7 +186,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +@@ -268,6 +272,11 @@ + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: + ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. ++ + @example + cc -g -c myprog.c utils.c -pg + cc -o myprog myprog.o utils.o -pg +diff -urN binutils-2.14.90.0.8-dist/ld/Makefile.am binutils-2.14.90.0.8/ld/Makefile.am +--- binutils-2.14.90.0.8-dist/ld/Makefile.am 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/Makefile.am 2004-02-11 03:42:01.000000000 -0600 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.8-dist/ld/Makefile.in binutils-2.14.90.0.8/ld/Makefile.in +--- binutils-2.14.90.0.8-dist/ld/Makefile.in 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/Makefile.in 2004-02-11 03:42:01.000000000 -0600 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.8-dist/ld/emultempl/elf32.em binutils-2.14.90.0.8/ld/emultempl/elf32.em +--- binutils-2.14.90.0.8-dist/ld/emultempl/elf32.em 2004-01-14 15:07:53.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/emultempl/elf32.em 2004-02-11 03:42:01.000000000 -0600 +@@ -671,6 +671,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -850,6 +852,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.14.90.0.8-dist/ltmain.sh binutils-2.14.90.0.8/ltmain.sh +--- binutils-2.14.90.0.8-dist/ltmain.sh 2002-03-22 16:06:16.000000000 -0600 ++++ binutils-2.14.90.0.8/ltmain.sh 2004-02-11 03:42:05.000000000 -0600 +@@ -4413,6 +4413,10 @@ + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +diff -urN binutils-2.14.90.0.8-dist/opcodes/i386-dis.c binutils-2.14.90.0.8/opcodes/i386-dis.c +--- binutils-2.14.90.0.8-dist/opcodes/i386-dis.c 2004-01-14 15:07:55.000000000 -0600 ++++ binutils-2.14.90.0.8/opcodes/i386-dis.c 2004-02-11 03:42:01.000000000 -0600 +@@ -1879,7 +1879,7 @@ + * The function returns the length of this instruction in bytes. + */ + +-static char intel_syntax; ++static signed char intel_syntax; + static char open_char; + static char close_char; + static char separator_char; diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch new file mode 100644 index 0000000000..5cb516cd21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch @@ -0,0 +1,630 @@ +diff -urN binutils-2.14.90.0.8-001-debian/bfd/config.bfd binutils-2.14.90.0.8/bfd/config.bfd +--- binutils-2.14.90.0.8-001-debian/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/config.bfd 2004-02-12 14:18:14.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,8 +216,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.8-001-debian/bfd/configure binutils-2.14.90.0.8/bfd/configure +--- binutils-2.14.90.0.8-001-debian/bfd/configure 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.8-001-debian/bfd/configure.in binutils-2.14.90.0.8/bfd/configure.in +--- binutils-2.14.90.0.8-001-debian/bfd/configure.in 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/configure.in 2004-02-12 14:09:10.000000000 -0600 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.8-001-debian/config.sub binutils-2.14.90.0.8/config.sub +--- binutils-2.14.90.0.8-001-debian/config.sub 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/config.sub 2004-02-12 14:09:10.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.8-001-debian/configure binutils-2.14.90.0.8/configure +--- binutils-2.14.90.0.8-001-debian/configure 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1273,6 +1273,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.8-001-debian/configure.in binutils-2.14.90.0.8/configure.in +--- binutils-2.14.90.0.8-001-debian/configure.in 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/configure.in 2004-02-12 14:50:56.000000000 -0600 +@@ -512,6 +512,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.8-001-debian/gas/configure binutils-2.14.90.0.8/gas/configure +--- binutils-2.14.90.0.8-001-debian/gas/configure 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.14.90.0.8/gas/configure 2004-02-12 14:57:43.000000000 -0600 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4030,6 +4035,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4046,6 +4052,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4059,6 +4066,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4115,7 +4123,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4202,6 +4213,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4265,6 +4277,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4292,7 +4305,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4325,6 +4340,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.8-001-debian/gas/configure.in binutils-2.14.90.0.8/gas/configure.in +--- binutils-2.14.90.0.8-001-debian/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.14.90.0.8/gas/configure.in 2004-02-12 14:21:06.000000000 -0600 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.8-001-debian/ld/configure binutils-2.14.90.0.8/ld/configure +--- binutils-2.14.90.0.8-001-debian/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.14.90.0.8/ld/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.8-001-debian/ld/configure.tgt binutils-2.14.90.0.8/ld/configure.tgt +--- binutils-2.14.90.0.8-001-debian/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/configure.tgt 2004-02-12 14:14:12.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -128,7 +131,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +155,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +264,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +371,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +389,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -429,16 +438,20 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.8-001-debian/libtool.m4 binutils-2.14.90.0.8/libtool.m4 +--- binutils-2.14.90.0.8-001-debian/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.14.90.0.8/libtool.m4 2004-02-12 14:09:10.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.8-001-debian/ltconfig binutils-2.14.90.0.8/ltconfig +--- binutils-2.14.90.0.8-001-debian/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/ltconfig 2004-02-12 14:09:10.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..d47b6f0942 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.1.1-dist/bfd/config.bfd binutils-2.15.90.0.1.1/bfd/config.bfd +--- binutils-2.15.90.0.1.1-dist/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/config.bfd 2004-08-06 17:29:55.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1258,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.1.1-dist/bfd/configure binutils-2.15.90.0.1.1/bfd/configure +--- binutils-2.15.90.0.1.1-dist/bfd/configure 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5489,7 +5494,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1.1-dist/bfd/configure.in binutils-2.15.90.0.1.1/bfd/configure.in +--- binutils-2.15.90.0.1.1-dist/bfd/configure.in 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1.1-dist/binutils/configure binutils-2.15.90.0.1.1/binutils/configure +--- binutils-2.15.90.0.1.1-dist/binutils/configure 2004-01-14 15:07:44.000000000 -0600 ++++ binutils-2.15.90.0.1.1/binutils/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1574,6 +1574,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/configure binutils-2.15.90.0.1.1/configure +--- binutils-2.15.90.0.1.1-dist/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1.1/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1.1-dist/configure.in binutils-2.15.90.0.1.1/configure.in +--- binutils-2.15.90.0.1.1-dist/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1.1/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1.1-dist/gas/configure binutils-2.15.90.0.1.1/gas/configure +--- binutils-2.15.90.0.1.1-dist/gas/configure 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gas/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4461,6 +4473,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4488,7 +4501,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4521,6 +4536,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1.1-dist/gas/configure.in binutils-2.15.90.0.1.1/gas/configure.in +--- binutils-2.15.90.0.1.1-dist/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gas/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1.1-dist/gprof/configure binutils-2.15.90.0.1.1/gprof/configure +--- binutils-2.15.90.0.1.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gprof/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/ld/configure binutils-2.15.90.0.1.1/ld/configure +--- binutils-2.15.90.0.1.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.1.1/ld/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/ld/configure.tgt binutils-2.15.90.0.1.1/ld/configure.tgt +--- binutils-2.15.90.0.1.1-dist/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.15.90.0.1.1/ld/configure.tgt 2004-08-06 17:29:55.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +373,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +391,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -395,6 +406,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.1.1-dist/libtool.m4 binutils-2.15.90.0.1.1/libtool.m4 +--- binutils-2.15.90.0.1.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.1.1/libtool.m4 2004-08-06 17:29:55.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.1.1-dist/ltconfig binutils-2.15.90.0.1.1/ltconfig +--- binutils-2.15.90.0.1.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.1.1/ltconfig 2004-08-06 17:29:55.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.1.1-dist/opcodes/configure binutils-2.15.90.0.1.1/opcodes/configure +--- binutils-2.15.90.0.1.1-dist/opcodes/configure 2004-01-14 15:07:54.000000000 -0600 ++++ binutils-2.15.90.0.1.1/opcodes/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1689,6 +1689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..64aef4986e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.1-dist/bfd/config.bfd binutils-2.15.90.0.1/bfd/config.bfd +--- binutils-2.15.90.0.1-dist/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/config.bfd 2004-08-06 17:39:55.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1258,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.1-dist/bfd/configure binutils-2.15.90.0.1/bfd/configure +--- binutils-2.15.90.0.1-dist/bfd/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5489,7 +5494,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1-dist/bfd/configure.in binutils-2.15.90.0.1/bfd/configure.in +--- binutils-2.15.90.0.1-dist/bfd/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1-dist/binutils/configure binutils-2.15.90.0.1/binutils/configure +--- binutils-2.15.90.0.1-dist/binutils/configure 2004-01-14 15:07:44.000000000 -0600 ++++ binutils-2.15.90.0.1/binutils/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1574,6 +1574,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/configure binutils-2.15.90.0.1/configure +--- binutils-2.15.90.0.1-dist/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1-dist/configure.in binutils-2.15.90.0.1/configure.in +--- binutils-2.15.90.0.1-dist/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1-dist/gas/configure binutils-2.15.90.0.1/gas/configure +--- binutils-2.15.90.0.1-dist/gas/configure 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1/gas/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4030,6 +4035,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4046,6 +4052,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4059,6 +4066,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4115,7 +4123,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4202,6 +4213,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4265,6 +4277,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4292,7 +4305,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4325,6 +4340,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1-dist/gas/configure.in binutils-2.15.90.0.1/gas/configure.in +--- binutils-2.15.90.0.1-dist/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1/gas/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1-dist/gprof/configure binutils-2.15.90.0.1/gprof/configure +--- binutils-2.15.90.0.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.1/gprof/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/ld/configure binutils-2.15.90.0.1/ld/configure +--- binutils-2.15.90.0.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.1/ld/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/ld/configure.tgt binutils-2.15.90.0.1/ld/configure.tgt +--- binutils-2.15.90.0.1-dist/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.15.90.0.1/ld/configure.tgt 2004-08-06 17:39:55.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +373,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +391,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -395,6 +406,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.1-dist/libtool.m4 binutils-2.15.90.0.1/libtool.m4 +--- binutils-2.15.90.0.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.1/libtool.m4 2004-08-06 17:39:55.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.1-dist/ltconfig binutils-2.15.90.0.1/ltconfig +--- binutils-2.15.90.0.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.1/ltconfig 2004-08-06 17:39:55.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.1-dist/opcodes/configure binutils-2.15.90.0.1/opcodes/configure +--- binutils-2.15.90.0.1-dist/opcodes/configure 2004-01-14 15:07:54.000000000 -0600 ++++ binutils-2.15.90.0.1/opcodes/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1689,6 +1689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..28c5017ed2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.3-dist/bfd/config.bfd binutils-2.15.90.0.3/bfd/config.bfd +--- binutils-2.15.90.0.3-dist/bfd/config.bfd 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/config.bfd 2004-08-06 17:02:17.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.3-dist/bfd/configure binutils-2.15.90.0.3/bfd/configure +--- binutils-2.15.90.0.3-dist/bfd/configure 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/bfd/configure.in binutils-2.15.90.0.3/bfd/configure.in +--- binutils-2.15.90.0.3-dist/bfd/configure.in 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/binutils/configure binutils-2.15.90.0.3/binutils/configure +--- binutils-2.15.90.0.3-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/binutils/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/configure binutils-2.15.90.0.3/configure +--- binutils-2.15.90.0.3-dist/configure 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1298,6 +1298,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/configure.in binutils-2.15.90.0.3/configure.in +--- binutils-2.15.90.0.3-dist/configure.in 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/gas/configure binutils-2.15.90.0.3/gas/configure +--- binutils-2.15.90.0.3-dist/gas/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure 2004-08-06 17:04:29.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4460,6 +4472,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4487,7 +4500,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4520,6 +4535,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gas/configure.in binutils-2.15.90.0.3/gas/configure.in +--- binutils-2.15.90.0.3-dist/gas/configure.in 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure.in 2004-08-06 17:04:27.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -418,6 +425,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -438,7 +446,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -471,6 +481,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gprof/configure binutils-2.15.90.0.3/gprof/configure +--- binutils-2.15.90.0.3-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.3/gprof/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure binutils-2.15.90.0.3/ld/configure +--- binutils-2.15.90.0.3-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure.tgt binutils-2.15.90.0.3/ld/configure.tgt +--- binutils-2.15.90.0.3-dist/ld/configure.tgt 2004-04-12 14:56:35.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure.tgt 2004-08-06 17:02:17.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.3-dist/libtool.m4 binutils-2.15.90.0.3/libtool.m4 +--- binutils-2.15.90.0.3-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.3/libtool.m4 2004-08-06 17:02:17.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.3-dist/ltconfig binutils-2.15.90.0.3/ltconfig +--- binutils-2.15.90.0.3-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.3/ltconfig 2004-08-06 17:02:17.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.3-dist/opcodes/configure binutils-2.15.90.0.3/opcodes/configure +--- binutils-2.15.90.0.3-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.90.0.3/opcodes/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..28c5017ed2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.3-dist/bfd/config.bfd binutils-2.15.90.0.3/bfd/config.bfd +--- binutils-2.15.90.0.3-dist/bfd/config.bfd 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/config.bfd 2004-08-06 17:02:17.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.3-dist/bfd/configure binutils-2.15.90.0.3/bfd/configure +--- binutils-2.15.90.0.3-dist/bfd/configure 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/bfd/configure.in binutils-2.15.90.0.3/bfd/configure.in +--- binutils-2.15.90.0.3-dist/bfd/configure.in 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/binutils/configure binutils-2.15.90.0.3/binutils/configure +--- binutils-2.15.90.0.3-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/binutils/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/configure binutils-2.15.90.0.3/configure +--- binutils-2.15.90.0.3-dist/configure 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1298,6 +1298,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/configure.in binutils-2.15.90.0.3/configure.in +--- binutils-2.15.90.0.3-dist/configure.in 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/gas/configure binutils-2.15.90.0.3/gas/configure +--- binutils-2.15.90.0.3-dist/gas/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure 2004-08-06 17:04:29.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4460,6 +4472,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4487,7 +4500,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4520,6 +4535,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gas/configure.in binutils-2.15.90.0.3/gas/configure.in +--- binutils-2.15.90.0.3-dist/gas/configure.in 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure.in 2004-08-06 17:04:27.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -418,6 +425,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -438,7 +446,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -471,6 +481,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gprof/configure binutils-2.15.90.0.3/gprof/configure +--- binutils-2.15.90.0.3-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.3/gprof/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure binutils-2.15.90.0.3/ld/configure +--- binutils-2.15.90.0.3-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure.tgt binutils-2.15.90.0.3/ld/configure.tgt +--- binutils-2.15.90.0.3-dist/ld/configure.tgt 2004-04-12 14:56:35.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure.tgt 2004-08-06 17:02:17.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.3-dist/libtool.m4 binutils-2.15.90.0.3/libtool.m4 +--- binutils-2.15.90.0.3-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.3/libtool.m4 2004-08-06 17:02:17.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.3-dist/ltconfig binutils-2.15.90.0.3/ltconfig +--- binutils-2.15.90.0.3-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.3/ltconfig 2004-08-06 17:02:17.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.3-dist/opcodes/configure binutils-2.15.90.0.3/opcodes/configure +--- binutils-2.15.90.0.3-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.90.0.3/opcodes/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch b/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch new file mode 100644 index 0000000000..29bb5c18db --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -472,10 +472,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch b/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch new file mode 100644 index 0000000000..0bb1a4b4f6 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch @@ -0,0 +1,10 @@ +--- binutils-2.15.90.0.3/gas/config/tc-mips.c-dist 2004-08-19 12:56:20.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/config/tc-mips.c 2004-08-19 12:57:30.000000000 -0500 +@@ -2708,6 +2708,7 @@ + prev_insn_reloc_type[1] = BFD_RELOC_UNUSED; + prev_insn_reloc_type[2] = BFD_RELOC_UNUSED; + prev_insn_extended = 0; ++ prev_insn_is_delay_slot = 1; + } + else + { diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..57b86abca1 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.91.0.1-dist/bfd/config.bfd binutils-2.15.91.0.1/bfd/config.bfd +--- binutils-2.15.91.0.1-dist/bfd/config.bfd 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/config.bfd 2004-07-16 14:57:21.000000000 -0500 +@@ -128,7 +128,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -138,7 +138,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -215,7 +215,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -223,7 +223,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -367,7 +367,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -378,7 +378,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -501,7 +501,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -515,7 +515,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -690,7 +690,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -966,7 +966,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1003,8 +1004,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1165,7 +1166,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1212,7 +1213,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1281,7 +1282,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.91.0.1-dist/bfd/configure binutils-2.15.91.0.1/bfd/configure +--- binutils-2.15.91.0.1-dist/bfd/configure 2004-05-27 13:26:02.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1687,6 +1687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5266,7 +5271,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5326,7 +5331,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5364,7 +5369,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5468,7 +5473,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.1-dist/bfd/configure.in binutils-2.15.91.0.1/bfd/configure.in +--- binutils-2.15.91.0.1-dist/bfd/configure.in 2004-05-27 13:26:02.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -245,7 +245,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -374,7 +374,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.1-dist/binutils/configure binutils-2.15.91.0.1/binutils/configure +--- binutils-2.15.91.0.1-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.91.0.1/binutils/configure 2004-07-27 21:50:54.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/configure binutils-2.15.91.0.1/configure +--- binutils-2.15.91.0.1-dist/configure 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1365,6 +1365,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.1-dist/configure.in binutils-2.15.91.0.1/configure.in +--- binutils-2.15.91.0.1-dist/configure.in 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -551,6 +551,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.1-dist/gas/configure binutils-2.15.91.0.1/gas/configure +--- binutils-2.15.91.0.1-dist/gas/configure 2004-05-27 13:26:03.000000000 -0500 ++++ binutils-2.15.91.0.1/gas/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -3408,6 +3408,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4233,6 +4238,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4249,6 +4255,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4262,6 +4269,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4319,7 +4327,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4379,6 +4389,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4406,6 +4417,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4468,6 +4480,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4496,7 +4509,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4529,6 +4544,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.1-dist/gas/configure.in binutils-2.15.91.0.1/gas/configure.in +--- binutils-2.15.91.0.1-dist/gas/configure.in 2004-05-27 13:26:03.000000000 -0500 ++++ binutils-2.15.91.0.1/gas/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -440,7 +448,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -473,6 +483,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.1-dist/gprof/configure binutils-2.15.91.0.1/gprof/configure +--- binutils-2.15.91.0.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.91.0.1/gprof/configure 2004-07-27 21:53:11.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/ld/configure binutils-2.15.91.0.1/ld/configure +--- binutils-2.15.91.0.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.91.0.1/ld/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/ld/configure.tgt binutils-2.15.91.0.1/ld/configure.tgt +--- binutils-2.15.91.0.1-dist/ld/configure.tgt 2004-05-27 13:26:04.000000000 -0500 ++++ binutils-2.15.91.0.1/ld/configure.tgt 2004-07-16 14:57:21.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.91.0.1-dist/libtool.m4 binutils-2.15.91.0.1/libtool.m4 +--- binutils-2.15.91.0.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.91.0.1/libtool.m4 2004-07-16 14:57:21.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.91.0.1-dist/ltconfig binutils-2.15.91.0.1/ltconfig +--- binutils-2.15.91.0.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.91.0.1/ltconfig 2004-07-16 14:57:21.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.91.0.1-dist/opcodes/configure binutils-2.15.91.0.1/opcodes/configure +--- binutils-2.15.91.0.1-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.91.0.1/opcodes/configure 2004-07-27 21:55:25.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..911bef4ff1 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch @@ -0,0 +1,722 @@ +diff -urN binutils-2.15.91.0.2-dist/bfd/config.bfd binutils-2.15.91.0.2/bfd/config.bfd +--- binutils-2.15.91.0.2-dist/bfd/config.bfd 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/config.bfd 2004-09-28 14:33:13.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -696,7 +696,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -972,7 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1009,8 +1010,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1178,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1225,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1294,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.91.0.2-dist/bfd/configure binutils-2.15.91.0.2/bfd/configure +--- binutils-2.15.91.0.2-dist/bfd/configure 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1687,6 +1687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5266,7 +5271,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5330,7 +5335,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5368,7 +5373,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5472,7 +5477,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.2-dist/bfd/configure.in binutils-2.15.91.0.2/bfd/configure.in +--- binutils-2.15.91.0.2-dist/bfd/configure.in 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.2-dist/binutils/configure binutils-2.15.91.0.2/binutils/configure +--- binutils-2.15.91.0.2-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.91.0.2/binutils/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/configure binutils-2.15.91.0.2/configure +--- binutils-2.15.91.0.2-dist/configure 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1349,6 +1349,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.2-dist/configure.in binutils-2.15.91.0.2/configure.in +--- binutils-2.15.91.0.2-dist/configure.in 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -569,6 +569,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.2-dist/gas/configure binutils-2.15.91.0.2/gas/configure +--- binutils-2.15.91.0.2-dist/gas/configure 2004-07-27 23:36:09.000000000 -0500 ++++ binutils-2.15.91.0.2/gas/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -3408,6 +3408,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4234,6 +4239,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4250,6 +4256,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4263,6 +4270,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4322,7 +4330,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4382,6 +4392,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4409,6 +4420,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4471,6 +4483,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4498,7 +4511,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4538,6 +4553,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.2-dist/gas/configure.in binutils-2.15.91.0.2/gas/configure.in +--- binutils-2.15.91.0.2-dist/gas/configure.in 2004-07-27 23:36:09.000000000 -0500 ++++ binutils-2.15.91.0.2/gas/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -195,6 +195,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -211,6 +212,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -224,6 +226,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -283,7 +286,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -336,6 +341,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -363,6 +369,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -422,6 +429,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -442,7 +450,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -478,6 +488,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.2-dist/gprof/configure binutils-2.15.91.0.2/gprof/configure +--- binutils-2.15.91.0.2-dist/gprof/configure 2004-07-27 23:36:10.000000000 -0500 ++++ binutils-2.15.91.0.2/gprof/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/ld/configure binutils-2.15.91.0.2/ld/configure +--- binutils-2.15.91.0.2-dist/ld/configure 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/ld/configure.tgt binutils-2.15.91.0.2/ld/configure.tgt +--- binutils-2.15.91.0.2-dist/ld/configure.tgt 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/configure.tgt 2004-09-28 14:33:13.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -61,14 +62,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -120,7 +123,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -130,7 +135,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -154,14 +159,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -261,10 +268,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -369,7 +379,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -386,9 +397,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -401,6 +412,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -434,16 +446,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -466,6 +478,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.91.0.2-dist/ld/emultempl/elf32.em binutils-2.15.91.0.2/ld/emultempl/elf32.em +--- binutils-2.15.91.0.2-dist/ld/emultempl/elf32.em 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/emultempl/elf32.em 2004-09-28 14:33:54.000000000 -0500 +@@ -327,7 +327,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force)) + break; +diff -urN binutils-2.15.91.0.2-dist/libtool.m4 binutils-2.15.91.0.2/libtool.m4 +--- binutils-2.15.91.0.2-dist/libtool.m4 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/libtool.m4 2004-09-28 14:33:13.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.91.0.2-dist/ltconfig binutils-2.15.91.0.2/ltconfig +--- binutils-2.15.91.0.2-dist/ltconfig 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/ltconfig 2004-09-28 14:33:13.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.91.0.2-dist/opcodes/configure binutils-2.15.91.0.2/opcodes/configure +--- binutils-2.15.91.0.2-dist/opcodes/configure 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/opcodes/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch b/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch new file mode 100644 index 0000000000..0bb1a4b4f6 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch @@ -0,0 +1,10 @@ +--- binutils-2.15.90.0.3/gas/config/tc-mips.c-dist 2004-08-19 12:56:20.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/config/tc-mips.c 2004-08-19 12:57:30.000000000 -0500 +@@ -2708,6 +2708,7 @@ + prev_insn_reloc_type[1] = BFD_RELOC_UNUSED; + prev_insn_reloc_type[2] = BFD_RELOC_UNUSED; + prev_insn_extended = 0; ++ prev_insn_is_delay_slot = 1; + } + else + { diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch b/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch new file mode 100644 index 0000000000..97fa6eed60 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch b/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch new file mode 100644 index 0000000000..4e4934d8cf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch @@ -0,0 +1,68 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +[ rediffed against binutils-2.15.91.0.2, with some elbow grease ] + +2004-08-20 Daniel Jacobowitz + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. +--- binutils-2.15.91.0.2/bfd/elflink.c.old 2004-07-27 21:36:08.000000000 -0700 ++++ binutils-2.15.91.0.2/bfd/elflink.c 2004-08-26 06:38:07.000000000 -0700 +@@ -9359,6 +9359,35 @@ + (_("%s: %s: warning: duplicate section `%s' has different size\n"), + bfd_archive_filename (abfd), name); + break; ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename(l->sec->owner), l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ bfd_archive_filename (abfd), sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..7fcbd6227a --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch @@ -0,0 +1,724 @@ +diff -urN binutils-2.15.92.0.2-dist/bfd/config.bfd binutils-2.15.92.0.2/bfd/config.bfd +--- binutils-2.15.92.0.2-dist/bfd/config.bfd 2004-09-15 14:05:02.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/config.bfd 2004-09-28 14:11:57.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,8 +224,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -378,7 +378,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -389,7 +389,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -516,7 +516,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -530,7 +530,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -705,7 +705,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -981,7 +981,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1018,8 +1019,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1186,7 +1187,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1233,7 +1234,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1302,7 +1303,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.92.0.2-dist/bfd/configure binutils-2.15.92.0.2/bfd/configure +--- binutils-2.15.92.0.2-dist/bfd/configure 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.92.0.2-dist/bfd/configure.in binutils-2.15.92.0.2/bfd/configure.in +--- binutils-2.15.92.0.2-dist/bfd/configure.in 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.92.0.2-dist/binutils/configure binutils-2.15.92.0.2/binutils/configure +--- binutils-2.15.92.0.2-dist/binutils/configure 2004-09-15 14:05:03.000000000 -0500 ++++ binutils-2.15.92.0.2/binutils/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/configure binutils-2.15.92.0.2/configure +--- binutils-2.15.92.0.2-dist/configure 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1334,6 +1334,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.92.0.2-dist/configure.in binutils-2.15.92.0.2/configure.in +--- binutils-2.15.92.0.2-dist/configure.in 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -556,6 +556,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.92.0.2-dist/gas/configure binutils-2.15.92.0.2/gas/configure +--- binutils-2.15.92.0.2-dist/gas/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/gas/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4248,6 +4253,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4263,6 +4269,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4276,6 +4283,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4335,7 +4343,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4395,6 +4405,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4422,6 +4433,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4494,6 +4506,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4521,7 +4534,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4556,6 +4571,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.92.0.2-dist/gas/configure.in binutils-2.15.92.0.2/gas/configure.in +--- binutils-2.15.92.0.2-dist/gas/configure.in 2004-09-15 14:05:03.000000000 -0500 ++++ binutils-2.15.92.0.2/gas/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -197,6 +197,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -212,6 +213,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -225,6 +227,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -284,7 +287,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -337,6 +342,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -364,6 +370,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -433,6 +440,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -453,7 +461,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -484,6 +494,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.92.0.2-dist/gprof/configure binutils-2.15.92.0.2/gprof/configure +--- binutils-2.15.92.0.2-dist/gprof/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/gprof/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/ld/configure binutils-2.15.92.0.2/ld/configure +--- binutils-2.15.92.0.2-dist/ld/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/ld/configure.tgt binutils-2.15.92.0.2/ld/configure.tgt +--- binutils-2.15.92.0.2-dist/ld/configure.tgt 2004-09-15 14:05:04.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/configure.tgt 2004-09-28 14:09:03.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -61,14 +62,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -120,7 +123,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -130,7 +135,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -154,14 +159,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -262,10 +269,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -370,7 +380,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -387,9 +398,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -402,6 +413,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -435,16 +447,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -467,6 +479,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.92.0.2-dist/ld/emultempl/elf32.em binutils-2.15.92.0.2/ld/emultempl/elf32.em +--- binutils-2.15.92.0.2-dist/ld/emultempl/elf32.em 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/emultempl/elf32.em 2004-09-28 14:13:04.000000000 -0500 +@@ -327,7 +327,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force)) + break; +diff -urN binutils-2.15.92.0.2-dist/libtool.m4 binutils-2.15.92.0.2/libtool.m4 +--- binutils-2.15.92.0.2-dist/libtool.m4 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.92.0.2/libtool.m4 2004-09-28 14:09:03.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.92.0.2-dist/ltconfig binutils-2.15.92.0.2/ltconfig +--- binutils-2.15.92.0.2-dist/ltconfig 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.92.0.2/ltconfig 2004-09-28 14:09:03.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.92.0.2-dist/opcodes/configure binutils-2.15.92.0.2/opcodes/configure +--- binutils-2.15.92.0.2-dist/opcodes/configure 2004-09-27 15:46:08.000000000 -0500 ++++ binutils-2.15.92.0.2/opcodes/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch new file mode 100644 index 0000000000..f5a3199168 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch @@ -0,0 +1,42 @@ +#! /bin/sh -e +## 117_mips_symbolic_link.dpatch +## +## DP: Description: Handle symbolic multigot links. (#270619) +## DP: Author: Thiemo Seufer +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-08 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urpN binutils-2.15.orig/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- binutils-2.15.orig/bfd/elfxx-mips.c 2004-05-17 21:36:03.000000000 +0200 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-08-29 08:48:22.000000000 +0200 +@@ -3909,10 +3910,7 @@ mips_elf_create_dynamic_relocation (bfd + /* We must now calculate the dynamic symbol table index to use + in the relocation. */ + if (h != NULL +- && (! info->symbolic || !h->root.def_regular) +- /* h->root.dynindx may be -1 if this symbol was marked to +- become local. */ +- && h->root.dynindx != -1) ++ && (!h->root.def_regular || !h->root.forced_local)) + { + indx = h->root.dynindx; + if (SGI_COMPAT (output_bfd)) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..d234181608 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch @@ -0,0 +1,54 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..dda2b4ffa2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch @@ -0,0 +1,734 @@ +diff -ur binutils-2.15.94.0.1.orig/bfd/config.bfd binutils-2.15.94.0.1/bfd/config.bfd +--- binutils-2.15.94.0.1.orig/bfd/config.bfd 2004-11-22 21:29:57.791886144 -0500 ++++ binutils-2.15.94.0.1/bfd/config.bfd 2004-11-22 21:30:53.195463520 -0500 +@@ -140,7 +140,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -150,7 +150,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -227,7 +227,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -235,8 +235,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -381,7 +381,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -392,7 +392,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -525,7 +525,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -539,7 +539,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -715,7 +715,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -1001,7 +1001,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1038,8 +1039,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1206,7 +1207,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1253,7 +1254,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1322,7 +1323,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -ur binutils-2.15.94.0.1.orig/bfd/configure binutils-2.15.94.0.1/bfd/configure +--- binutils-2.15.94.0.1.orig/bfd/configure 2004-11-22 21:29:57.794885688 -0500 ++++ binutils-2.15.94.0.1/bfd/configure 2004-11-22 21:31:10.011907032 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.1.orig/bfd/configure.in binutils-2.15.94.0.1/bfd/configure.in +--- binutils-2.15.94.0.1.orig/bfd/configure.in 2004-11-22 21:29:57.794885688 -0500 ++++ binutils-2.15.94.0.1/bfd/configure.in 2004-11-22 21:31:23.225898200 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.1.orig/binutils/configure binutils-2.15.94.0.1/binutils/configure +--- binutils-2.15.94.0.1.orig/binutils/configure 2004-11-22 21:29:57.923866080 -0500 ++++ binutils-2.15.94.0.1/binutils/configure 2004-11-22 21:31:47.597193200 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/configure binutils-2.15.94.0.1/configure +--- binutils-2.15.94.0.1.orig/configure 2004-11-22 21:29:57.902869272 -0500 ++++ binutils-2.15.94.0.1/configure 2004-11-22 21:31:47.601192592 -0500 +@@ -1341,6 +1341,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.1.orig/configure.in binutils-2.15.94.0.1/configure.in +--- binutils-2.15.94.0.1.orig/configure.in 2004-11-22 21:29:57.902869272 -0500 ++++ binutils-2.15.94.0.1/configure.in 2004-11-22 21:31:47.606191832 -0500 +@@ -563,6 +563,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.1.orig/gas/configure binutils-2.15.94.0.1/gas/configure +--- binutils-2.15.94.0.1.orig/gas/configure 2004-11-22 21:29:58.078842520 -0500 ++++ binutils-2.15.94.0.1/gas/configure 2004-11-22 21:34:12.759125232 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4256,6 +4261,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4271,6 +4277,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4284,6 +4291,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4343,7 +4351,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4403,6 +4413,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4430,6 +4441,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4504,6 +4516,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4531,7 +4544,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4566,6 +4581,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.1.orig/gas/configure.in binutils-2.15.94.0.1/gas/configure.in +--- binutils-2.15.94.0.1.orig/gas/configure.in 2004-11-22 21:29:58.079842368 -0500 ++++ binutils-2.15.94.0.1/gas/configure.in 2004-11-22 21:34:12.763124624 -0500 +@@ -202,6 +202,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -217,6 +218,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -230,6 +232,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -289,7 +292,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -342,6 +347,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -369,6 +375,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -440,6 +447,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -460,7 +468,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -491,6 +501,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.1.orig/gprof/configure binutils-2.15.94.0.1/gprof/configure +--- binutils-2.15.94.0.1.orig/gprof/configure 2004-11-22 21:29:58.628758920 -0500 ++++ binutils-2.15.94.0.1/gprof/configure 2004-11-22 21:34:12.777122496 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/ld/configure binutils-2.15.94.0.1/ld/configure +--- binutils-2.15.94.0.1.orig/ld/configure 2004-11-22 21:29:58.752740072 -0500 ++++ binutils-2.15.94.0.1/ld/configure 2004-11-22 21:34:12.784121432 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/ld/configure.tgt binutils-2.15.94.0.1/ld/configure.tgt +--- binutils-2.15.94.0.1.orig/ld/configure.tgt 2004-11-22 21:29:58.753739920 -0500 ++++ binutils-2.15.94.0.1/ld/configure.tgt 2004-11-22 21:38:50.336926992 -0500 +@@ -32,6 +32,7 @@ + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu* | cris-*-linux-gnu*) + targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-* | crisv32-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -62,14 +63,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -121,7 +124,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -132,7 +137,7 @@ + m68*-apple-aux*) targ_emul=m68kaux ;; + maxq-*-coff) targ_emul=maxqcoff;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -156,14 +161,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -263,11 +270,14 @@ + arm-*-kaos*) targ_emul=armelf ;; + arm9e-*-elf) targ_emul=armelf ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnueabi) targ_emul=armelf_linux_eabi ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -371,7 +381,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -388,9 +399,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -403,6 +414,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -436,16 +448,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -468,6 +480,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -ur binutils-2.15.94.0.1.orig/ld/emultempl/elf32.em binutils-2.15.94.0.1/ld/emultempl/elf32.em +--- binutils-2.15.94.0.1.orig/ld/emultempl/elf32.em 2004-11-22 21:29:58.763738400 -0500 ++++ binutils-2.15.94.0.1/ld/emultempl/elf32.em 2004-11-22 21:38:50.338926688 -0500 +@@ -65,7 +65,7 @@ + + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c < + EOF +@@ -337,7 +337,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force)) + break; +diff -ur binutils-2.15.94.0.1.orig/libtool.m4 binutils-2.15.94.0.1/libtool.m4 +--- binutils-2.15.94.0.1.orig/libtool.m4 2004-11-22 21:29:57.000000000 -0500 ++++ binutils-2.15.94.0.1/libtool.m4 2004-11-22 21:38:50.339926536 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -ur binutils-2.15.94.0.1.orig/ltconfig binutils-2.15.94.0.1/ltconfig +--- binutils-2.15.94.0.1.orig/ltconfig 2004-11-22 21:29:57.000000000 -0500 ++++ binutils-2.15.94.0.1/ltconfig 2004-11-22 21:38:50.341926232 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -ur binutils-2.15.94.0.1.orig/opcodes/configure binutils-2.15.94.0.1/opcodes/configure +--- binutils-2.15.94.0.1.orig/opcodes/configure 2004-11-22 21:29:59.114685048 -0500 ++++ binutils-2.15.94.0.1/opcodes/configure 2004-11-22 21:38:50.354924256 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..dc21386f42 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch @@ -0,0 +1,749 @@ +diff -ur binutils-2.15.94.0.2.orig/bfd/config.bfd binutils-2.15.94.0.2/bfd/config.bfd +--- binutils-2.15.94.0.2.orig/bfd/config.bfd 2004-12-22 15:00:57.219024360 -0500 ++++ binutils-2.15.94.0.2/bfd/config.bfd 2004-12-22 15:01:18.982715776 -0500 +@@ -140,7 +140,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -150,7 +150,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -227,7 +227,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -235,8 +235,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -381,7 +381,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -392,7 +392,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -525,7 +525,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -539,7 +539,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -715,7 +715,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -1001,7 +1001,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1038,8 +1039,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1209,7 +1210,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1256,7 +1257,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1325,7 +1326,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -ur binutils-2.15.94.0.2.orig/bfd/configure binutils-2.15.94.0.2/bfd/configure +--- binutils-2.15.94.0.2.orig/bfd/configure 2004-12-22 15:00:57.221024056 -0500 ++++ binutils-2.15.94.0.2/bfd/configure 2004-12-22 15:01:18.996713648 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.2.orig/bfd/configure.in binutils-2.15.94.0.2/bfd/configure.in +--- binutils-2.15.94.0.2.orig/bfd/configure.in 2004-12-22 15:00:57.223023752 -0500 ++++ binutils-2.15.94.0.2/bfd/configure.in 2004-12-22 15:01:18.998713344 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.2.orig/binutils/configure binutils-2.15.94.0.2/binutils/configure +--- binutils-2.15.94.0.2.orig/binutils/configure 2004-12-22 15:00:57.351004296 -0500 ++++ binutils-2.15.94.0.2/binutils/configure 2004-12-22 15:01:19.002712736 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/configure binutils-2.15.94.0.2/configure +--- binutils-2.15.94.0.2.orig/configure 2004-12-22 15:00:57.321008856 -0500 ++++ binutils-2.15.94.0.2/configure 2004-12-22 15:01:19.007711976 -0500 +@@ -1352,6 +1352,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.2.orig/configure.in binutils-2.15.94.0.2/configure.in +--- binutils-2.15.94.0.2.orig/configure.in 2004-12-22 15:00:57.321008856 -0500 ++++ binutils-2.15.94.0.2/configure.in 2004-12-22 15:01:19.010711520 -0500 +@@ -561,6 +561,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.2.orig/gas/configure binutils-2.15.94.0.2/gas/configure +--- binutils-2.15.94.0.2.orig/gas/configure 2004-12-22 15:00:57.461987424 -0500 ++++ binutils-2.15.94.0.2/gas/configure 2004-12-22 15:01:19.019710152 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4256,6 +4261,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4272,6 +4278,7 @@ + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnueabi*) fmt=elf em=armlinuxeabi ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4285,6 +4292,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4344,7 +4352,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4404,6 +4414,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4431,6 +4442,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4505,6 +4517,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4532,7 +4545,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-tpf*) fmt=elf ;; + + sh*-*-linux*) fmt=elf em=linux +@@ -4568,6 +4583,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.2.orig/gas/configure.in binutils-2.15.94.0.2/gas/configure.in +--- binutils-2.15.94.0.2.orig/gas/configure.in 2004-12-22 15:00:57.461987424 -0500 ++++ binutils-2.15.94.0.2/gas/configure.in 2004-12-22 15:01:19.022709696 -0500 +@@ -202,6 +202,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -218,6 +219,7 @@ + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnueabi*) fmt=elf em=armlinuxeabi ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -231,6 +233,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -290,7 +293,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -343,6 +348,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -370,6 +376,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -441,6 +448,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -461,7 +469,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-tpf*) fmt=elf ;; + + sh*-*-linux*) fmt=elf em=linux +@@ -493,6 +503,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.2.orig/gprof/configure binutils-2.15.94.0.2/gprof/configure +--- binutils-2.15.94.0.2.orig/gprof/configure 2004-12-22 15:00:57.949913248 -0500 ++++ binutils-2.15.94.0.2/gprof/configure 2004-12-22 15:01:19.030708480 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/ld/configure binutils-2.15.94.0.2/ld/configure +--- binutils-2.15.94.0.2.orig/ld/configure 2004-12-22 15:00:58.032900632 -0500 ++++ binutils-2.15.94.0.2/ld/configure 2004-12-22 15:01:19.035707720 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/ld/configure.tgt binutils-2.15.94.0.2/ld/configure.tgt +--- binutils-2.15.94.0.2.orig/ld/configure.tgt 2004-12-22 15:00:58.033900480 -0500 ++++ binutils-2.15.94.0.2/ld/configure.tgt 2004-12-22 15:01:19.036707568 -0500 +@@ -32,6 +32,7 @@ + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu* | cris-*-linux-gnu*) + targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-* | crisv32-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -62,14 +63,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -121,7 +124,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -132,7 +137,7 @@ + m68*-apple-aux*) targ_emul=m68kaux ;; + maxq-*-coff) targ_emul=maxqcoff;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -156,14 +161,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -263,11 +270,14 @@ + arm-*-kaos*) targ_emul=armelf ;; + arm9e-*-elf) targ_emul=armelf ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnueabi) targ_emul=armelf_linux_eabi ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -371,7 +381,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -388,9 +399,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -403,6 +414,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -436,16 +448,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -468,6 +480,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -ur binutils-2.15.94.0.2.orig/ld/emultempl/elf32.em binutils-2.15.94.0.2/ld/emultempl/elf32.em +--- binutils-2.15.94.0.2.orig/ld/emultempl/elf32.em 2004-12-22 15:00:58.044898808 -0500 ++++ binutils-2.15.94.0.2/ld/emultempl/elf32.em 2004-12-22 15:01:19.038707264 -0500 +@@ -65,7 +65,7 @@ + + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c < + EOF +@@ -337,7 +337,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force)) + break; +diff -ur binutils-2.15.94.0.2.orig/libiberty/configure binutils-2.15.94.0.2/libiberty/configure +--- binutils-2.15.94.0.2.orig/libiberty/configure 2004-12-22 15:00:59.263713520 -0500 ++++ binutils-2.15.94.0.2/libiberty/configure 2004-12-22 15:03:55.744884304 -0500 +@@ -3682,6 +3682,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/libtool.m4 binutils-2.15.94.0.2/libtool.m4 +--- binutils-2.15.94.0.2.orig/libtool.m4 2004-12-22 15:00:57.329007640 -0500 ++++ binutils-2.15.94.0.2/libtool.m4 2004-12-22 15:01:19.039707112 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -ur binutils-2.15.94.0.2.orig/ltconfig binutils-2.15.94.0.2/ltconfig +--- binutils-2.15.94.0.2.orig/ltconfig 2004-12-22 15:00:57.330007488 -0500 ++++ binutils-2.15.94.0.2/ltconfig 2004-12-22 15:01:19.041706808 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -ur binutils-2.15.94.0.2.orig/opcodes/configure binutils-2.15.94.0.2/opcodes/configure +--- binutils-2.15.94.0.2.orig/opcodes/configure 2004-12-22 15:00:59.334702728 -0500 ++++ binutils-2.15.94.0.2/opcodes/configure 2004-12-22 15:01:19.053704984 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch new file mode 100644 index 0000000000..1c7fa4a400 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15-dist/bfd/config.bfd binutils-2.15/bfd/config.bfd +--- binutils-2.15-dist/bfd/config.bfd 2004-05-17 14:35:56.000000000 -0500 ++++ binutils-2.15/bfd/config.bfd 2004-08-04 12:01:44.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15-dist/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-dist/bfd/configure 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/bfd/configure.in binutils-2.15/bfd/configure.in +--- binutils-2.15-dist/bfd/configure.in 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/binutils/configure binutils-2.15/binutils/configure +--- binutils-2.15-dist/binutils/configure 2004-01-02 11:08:04.000000000 -0600 ++++ binutils-2.15/binutils/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1585,6 +1585,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/configure binutils-2.15/configure +--- binutils-2.15-dist/configure 2004-05-17 14:36:20.000000000 -0500 ++++ binutils-2.15/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/configure.in binutils-2.15/configure.in +--- binutils-2.15-dist/configure.in 2004-05-17 14:40:54.000000000 -0500 ++++ binutils-2.15/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/gas/configure binutils-2.15/gas/configure +--- binutils-2.15-dist/gas/configure 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure 2004-08-04 12:07:50.000000000 -0500 +@@ -3400,6 +3400,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4224,6 +4229,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4240,6 +4246,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4253,6 +4260,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4310,7 +4318,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4370,6 +4380,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4397,6 +4408,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4459,6 +4471,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4486,7 +4499,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4519,6 +4534,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gas/configure.in binutils-2.15/gas/configure.in +--- binutils-2.15-dist/gas/configure.in 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure.in 2004-08-04 12:07:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gprof/configure binutils-2.15/gprof/configure +--- binutils-2.15-dist/gprof/configure 2003-08-26 12:19:19.000000000 -0500 ++++ binutils-2.15/gprof/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1581,6 +1581,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure binutils-2.15/ld/configure +--- binutils-2.15-dist/ld/configure 2003-04-24 07:36:07.000000000 -0500 ++++ binutils-2.15/ld/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1589,6 +1589,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure.tgt binutils-2.15/ld/configure.tgt +--- binutils-2.15-dist/ld/configure.tgt 2004-05-17 14:36:15.000000000 -0500 ++++ binutils-2.15/ld/configure.tgt 2004-08-04 12:01:45.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -364,7 +374,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -381,9 +392,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -396,6 +407,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15-dist/libtool.m4 binutils-2.15/libtool.m4 +--- binutils-2.15-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ binutils-2.15/libtool.m4 2004-08-04 12:01:45.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15-dist/ltconfig binutils-2.15/ltconfig +--- binutils-2.15-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ binutils-2.15/ltconfig 2004-08-04 12:01:45.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15-dist/opcodes/configure binutils-2.15/opcodes/configure +--- binutils-2.15-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ binutils-2.15/opcodes/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/Config.in b/openwrt/toolchain/binutils/Config.in new file mode 100644 index 0000000000..d1d62955d8 --- /dev/null +++ b/openwrt/toolchain/binutils/Config.in @@ -0,0 +1,66 @@ +# Choose binutils version. + +comment "Binutils Options" + +choice + prompt "Binutils Version" + default BR2_BINUTILS_VERSION_2_15_91_0_2 + help + Select the version of binutils you wish to use. + + config BR2_BINUTILS_VERSION_2_14_90_0_6 + bool "binutils 2.14.90.0.6" + + config BR2_BINUTILS_VERSION_2_14_90_0_7 + bool "binutils 2.14.90.0.7" + + config BR2_BINUTILS_VERSION_2_14_90_0_8 + bool "binutils 2.14.90.0.8" + + config BR2_BINUTILS_VERSION_2_15 + bool "binutils 2.15" + + config BR2_BINUTILS_VERSION_2_15_90_0_1 + bool "binutils 2.15.90.0.1" + + config BR2_BINUTILS_VERSION_2_15_90_0_1_1 + bool "binutils 2.15.90.0.1.1" + + config BR2_BINUTILS_VERSION_2_15_90_0_2 + bool "binutils 2.15.90.0.2" + + config BR2_BINUTILS_VERSION_2_15_90_0_3 + bool "binutils 2.15.90.0.3" + + config BR2_BINUTILS_VERSION_2_15_91_0_1 + bool "binutils 2.15.91.0.1" + + config BR2_BINUTILS_VERSION_2_15_91_0_2 + bool "binutils 2.15.91.0.2" + + config BR2_BINUTILS_VERSION_2_15_92_0_2 + bool "binutils 2.15.92.0.2" + + config BR2_BINUTILS_VERSION_2_15_94_0_1 + bool "binutils 2.15.94.0.1" + + config BR2_BINUTILS_VERSION_2_15_94_0_2 + bool "binutils 2.15.94.0.2" + +endchoice + +config BR2_BINUTILS_VERSION + string + default "2.14.90.0.6" if BR2_BINUTILS_VERSION_2_14_90_0_6 + default "2.14.90.0.7" if BR2_BINUTILS_VERSION_2_14_90_0_7 + default "2.14.90.0.8" if BR2_BINUTILS_VERSION_2_14_90_0_8 + default "2.15" if BR2_BINUTILS_VERSION_2_15 + default "2.15.90.0.1" if BR2_BINUTILS_VERSION_2_15_90_0_1 + default "2.15.90.0.0.1.1" if BR2_BINUTILS_VERSION_2_15_90_0_1_1 + default "2.15.90.0.2" if BR2_BINUTILS_VERSION_2_15_90_0_2 + default "2.15.90.0.3" if BR2_BINUTILS_VERSION_2_15_90_0_3 + default "2.15.91.0.1" if BR2_BINUTILS_VERSION_2_15_91_0_1 + default "2.15.91.0.2" if BR2_BINUTILS_VERSION_2_15_91_0_2 + default "2.15.92.0.2" if BR2_BINUTILS_VERSION_2_15_92_0_2 + default "2.15.94.0.1" if BR2_BINUTILS_VERSION_2_15_94_0_1 + default "2.15.94.0.2" if BR2_BINUTILS_VERSION_2_15_94_0_2 diff --git a/openwrt/toolchain/binutils/Makefile.in b/openwrt/toolchain/binutils/Makefile.in new file mode 100644 index 0000000000..c6838bb053 --- /dev/null +++ b/openwrt/toolchain/binutils/Makefile.in @@ -0,0 +1 @@ +BINUTILS_VERSION:=$(strip $(subst ",, $(BR2_BINUTILS_VERSION))) diff --git a/openwrt/toolchain/binutils/binutils.mk b/openwrt/toolchain/binutils/binutils.mk new file mode 100644 index 0000000000..afbb63ac3e --- /dev/null +++ b/openwrt/toolchain/binutils/binutils.mk @@ -0,0 +1,134 @@ +############################################################# +# +# build binutils for use on the host system +# +############################################################# +BINUTILS_VERSION:=$(strip $(BINUTILS_VERSION)) + +BINUTILS_SITE:=http://ftp.kernel.org/pub/linux/devel/binutils +ifeq ($(BINUTILS_VERSION),2.15) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif +ifeq ($(BINUTILS_VERSION),2.14) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif +ifeq ($(BINUTILS_VERSION),2.13) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif + +BINUTILS_SOURCE:=binutils-$(BINUTILS_VERSION).tar.bz2 +BINUTILS_DIR:=$(TOOL_BUILD_DIR)/binutils-$(BINUTILS_VERSION) +BINUTILS_CAT:=bzcat + +BINUTILS_DIR1:=$(TOOL_BUILD_DIR)/binutils-$(BINUTILS_VERSION)-build + +$(DL_DIR)/$(BINUTILS_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(BINUTILS_SITE)/$(BINUTILS_SOURCE) + +$(BINUTILS_DIR)/.unpacked: $(DL_DIR)/$(BINUTILS_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(BINUTILS_CAT) $(DL_DIR)/$(BINUTILS_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(BINUTILS_DIR)/.unpacked + +$(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked + # Apply appropriate binutils patches. + toolchain/patch-kernel.sh $(BINUTILS_DIR) toolchain/binutils/$(BINUTILS_VERSION) \*.patch + touch $(BINUTILS_DIR)/.patched + +$(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR1) + (cd $(BINUTILS_DIR1); \ + $(BINUTILS_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR1)/.configured + +$(BINUTILS_DIR1)/binutils/objdump: $(BINUTILS_DIR1)/.configured + $(MAKE) -C $(BINUTILS_DIR1) all + +# Make install will put gettext data in staging_dir/share/locale. +# Unfortunatey, it isn't configureable. +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld: $(BINUTILS_DIR1)/binutils/objdump + $(MAKE) -C $(BINUTILS_DIR1) install + +binutils-dependancies: + @if ! which bison > /dev/null ; then \ + echo -e "\n\nYou must install 'bison' on your build machine\n"; \ + exit 1; \ + fi; + @if ! which flex > /dev/null ; then \ + echo -e "\n\nYou must install 'flex' on your build machine\n"; \ + exit 1; \ + fi; + @if ! which msgfmt > /dev/null ; then \ + echo -e "\n\nYou must install 'gettext' on your build machine\n"; \ + exit 1; \ + fi; + +binutils: binutils-dependancies $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld + +binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE) + +binutils-clean: + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR1) clean + +binutils-dirclean: + rm -rf $(BINUTILS_DIR1) + + + +############################################################# +# +# build binutils for use on the target system +# +############################################################# +BINUTILS_DIR2:=$(BUILD_DIR)/binutils-$(BINUTILS_VERSION)-target +$(BINUTILS_DIR2)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR2) + (cd $(BINUTILS_DIR2); \ + PATH=$(TARGET_PATH) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CFLAGS_FOR_BUILD="-O2 -g" \ + $(BINUTILS_DIR)/configure \ + --prefix=/usr \ + --exec-prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR2)/.configured + +$(BINUTILS_DIR2)/binutils/objdump: $(BINUTILS_DIR2)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) -C $(BINUTILS_DIR2) all + +$(TARGET_DIR)/usr/bin/ld: $(BINUTILS_DIR2)/binutils/objdump + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) \ + tooldir=/usr build_tooldir=/usr \ + -C $(BINUTILS_DIR2) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + -$(STRIP) $(TARGET_DIR)/usr/$(REAL_GNU_TARGET_NAME)/bin/* > /dev/null 2>&1 + -$(STRIP) $(TARGET_DIR)/usr/bin/* > /dev/null 2>&1 + +binutils_target: $(GCC_DEPENDANCY) $(TARGET_DIR)/usr/bin/ld + +binutils_target-clean: + (cd $(TARGET_DIR)/usr/bin; \ + rm -f addr2line ar as gprof ld nm objcopy \ + objdump ranlib readelf size strings strip) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR2) clean + +binutils_target-dirclean: + rm -rf $(BINUTILS_DIR2) diff --git a/openwrt/toolchain/ccache/Config.in b/openwrt/toolchain/ccache/Config.in new file mode 100644 index 0000000000..a265375c40 --- /dev/null +++ b/openwrt/toolchain/ccache/Config.in @@ -0,0 +1,10 @@ +# + +comment "Ccache Options" + +config BR2_CCACHE + bool "Enable ccache support?" + default y + help + Enable ccache support? + diff --git a/openwrt/toolchain/ccache/Config.in.2 b/openwrt/toolchain/ccache/Config.in.2 new file mode 100644 index 0000000000..7130374610 --- /dev/null +++ b/openwrt/toolchain/ccache/Config.in.2 @@ -0,0 +1,8 @@ +# + +config BR2_PACKAGE_CCACHE_TARGET + bool"ccache support in the target filesystem" + default n + help + Add help text here. + diff --git a/openwrt/toolchain/ccache/Makefile.in b/openwrt/toolchain/ccache/Makefile.in new file mode 100644 index 0000000000..fe859da303 --- /dev/null +++ b/openwrt/toolchain/ccache/Makefile.in @@ -0,0 +1,6 @@ +ifeq ($(strip $(BR2_CCACHE)),y) +TARGETS+=ccache +endif +ifeq ($(strip $(BR2_PACKAGE_CCACHE_TARGET)),y) +TARGETS+=ccache_target +endif diff --git a/openwrt/toolchain/ccache/ccache.mk b/openwrt/toolchain/ccache/ccache.mk new file mode 100644 index 0000000000..e2fdd71cc1 --- /dev/null +++ b/openwrt/toolchain/ccache/ccache.mk @@ -0,0 +1,151 @@ +############################################################# +# +# build ccache to make recompiles faster on the build system +# +############################################################# +CCACHE_VER:=2.3 +CCACHE_SITE:=http://ccache.samba.org/ftp/ccache +CCACHE_SOURCE:=ccache-$(CCACHE_VER).tar.gz +CCACHE_DIR1:=$(TOOL_BUILD_DIR)/ccache-$(CCACHE_VER) +CCACHE_DIR2:=$(BUILD_DIR)/ccache-$(CCACHE_VER) +CCACHE_CAT:=zcat +CCACHE_BINARY:=ccache +CCACHE_TARGET_BINARY:=usr/bin/ccache + +$(DL_DIR)/$(CCACHE_SOURCE): + $(WGET) -P $(DL_DIR) $(CCACHE_SITE)/$(CCACHE_SOURCE) + +$(CCACHE_DIR1)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(CCACHE_DIR1)/.unpacked + +$(CCACHE_DIR1)/.patched: $(CCACHE_DIR1)/.unpacked + # WARNING - this will break if the toolchain is moved. + # Should probably patch things to use a relative path. + $(SED) "s,getenv(\"CCACHE_PATH\"),\"$(STAGING_DIR)/bin-ccache\",g" \ + $(CCACHE_DIR1)/execute.c + # WARNING - this will break if the toolchain build dir is deleted. + $(SED) "s,getenv(\"CCACHE_DIR\"),\"$(CCACHE_DIR1)/cache\",g" \ + $(CCACHE_DIR1)/ccache.c + mkdir -p $(CCACHE_DIR1)/cache + touch $(CCACHE_DIR1)/.patched + +$(CCACHE_DIR1)/.configured: $(CCACHE_DIR1)/.patched + mkdir -p $(CCACHE_DIR1) + (cd $(CCACHE_DIR1); rm -rf config.cache; \ + CC=$(HOSTCC) \ + $(CCACHE_DIR1)/configure \ + --target=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + ); + touch $(CCACHE_DIR1)/.configured + +$(CCACHE_DIR1)/$(CCACHE_BINARY): $(CCACHE_DIR1)/.configured + $(MAKE) CC=$(HOSTCC) -C $(CCACHE_DIR1) + +$(STAGING_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR1)/$(CCACHE_BINARY) + mkdir -p $(STAGING_DIR)/usr/bin; + cp $(CCACHE_DIR1)/ccache $(STAGING_DIR)/usr/bin + # Keep the actual toolchain binaries in a directory at the same level. + # Otherwise, relative paths for include dirs break. + mkdir -p $(STAGING_DIR)/bin-ccache; + (cd $(STAGING_DIR)/bin-ccache; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-gcc; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-cc; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(REAL_GNU_TARGET_NAME)-cc); + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/bin-ccache/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-cc; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-gcc; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-cc; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-gcc); +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ $(STAGING_DIR)/bin-ccache/ + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++ ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++ $(STAGING_DIR)/bin-ccache/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-c++; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-g++;\ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-c++; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-g++); + (cd $(STAGING_DIR)/bin-ccache; \ + ln -fs $(REAL_GNU_TARGET_NAME)-c++ $(GNU_TARGET_NAME)-c++; \ + ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++); +endif + +ccache: gcc $(STAGING_DIR)/$(CCACHE_TARGET_BINARY) + +ccache-clean: + $(MAKE) -C $(CCACHE_DIR1) uninstall + -$(MAKE) -C $(CCACHE_DIR1) clean + +ccache-dirclean: + rm -rf $(CCACHE_DIR1) + + + + +############################################################# +# +# build ccache for use on the target system +# +############################################################# + +$(CCACHE_DIR2)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(CCACHE_DIR2)/.unpacked + +$(CCACHE_DIR2)/.patched: $(CCACHE_DIR2)/.unpacked + touch $(CCACHE_DIR2)/.patched + +$(CCACHE_DIR2)/.configured: $(CCACHE_DIR2)/.patched + mkdir -p $(CCACHE_DIR2) + (cd $(CCACHE_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + $(CCACHE_DIR2)/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(CCACHE_DIR2)/.configured + +$(CCACHE_DIR2)/$(CCACHE_BINARY): $(CCACHE_DIR2)/.configured + $(MAKE) -C $(CCACHE_DIR2) CFLAGS="$(TARGET_CFLAGS)" + +$(TARGET_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR2)/$(CCACHE_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # put a bunch of symlinks into /bin, since that is earlier + # in the default PATH than /usr/bin where gcc lives + (cd $(TARGET_DIR)/bin; \ + ln -fs /usr/bin/ccache cc; \ + ln -fs /usr/bin/ccache gcc; \ + ln -fs /usr/bin/ccache c++; \ + ln -fs /usr/bin/ccache g++;) + +ccache_target: uclibc $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) + +ccache_target-sources: $(DL_DIR)/$(CCACHE_SOURCE) + +ccache_target-clean: + rm -f $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) + -$(MAKE) -C $(CCACHE_DIR2) clean + +ccache_target-dirclean: + rm -rf $(CCACHE_DIR2) diff --git a/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 b/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6c2d518273b201e21e3dccc36e42e9aba09ab877 GIT binary patch literal 125295 zcmV(=K-s@ST4*^jL0KkKSv1!_^#aAXf589$|JDEh|NsC0|NsC0|NjC20RUpK{`=vf zZ@xFX?(UwMdF}VLpvhVq6~5!=eV$$GXUjZixO9*{v`C-~TW_}Wt={e)`_}*u7uc@4 zo{e7n?p}9#T;=doL{bWS7^q)GKIVqz7T&)2eeJi0*U%hV7qieeVu!ihK7ast`{!;g z+jo37xuR2UN+P!)>+i39Uox+|zPj@FbK5wo1pxECD%#rnHSe?Syf2x%4^#tebO8Hc zyAPwJ%kDkdR8c{o6!$~!525M4%KOdFZn_=V^7P~YaRUyl91-7pgYCUI6Y1@T*UxWT z>^IxwpcFox9^ZZ8>uk`kfB+JpB$QDED5Q}@Xcz>LbaVr@P-q&^0UdX(;h+*4Pz6YZ z>7<@>?zRB+TJZbaD55~n`|JVgk`joaKo4)c@EsCRQA@2}o9F;!3hdG%id6zb>W-X| z12Zycpprs>Du+*YsX;{m0004d1q=v4gc=y?wRXxRHZVvtHueHzTL#SQuKRayTz`7IH)`}1Jo@$b+DJQ{zQf;m_y7O}UFEk<-Nvol(DmHZ(v*T=Q2LMPzP{jg;1qYx2 z&=xPgyYG1NH>2*r99L}n10&Y6ec(ObK0B+ikb0x;`=2ju_IvE{yM1?$w+3h3-hgdu zyL;Wi&^mLhaW7{tYkg~XbkN(j?|pB5wcH&l|lTeeZYQce49A-P(6L_p{#h z>R#TRd{1=CGTTnw*@ct=YQ67tdoAhHd5$l>rs!5T-%#`2kG}6`tk~JPw|B~3dS2RH zX$rmTr*-ykMO1>Kk6rH^>r&63Ir7fiyWFwv`-7KT=RWqlGq#JVTASl_tyfnUcYWa9 z?!&Vjsoi|{j@q^88ZOrEbT-}h+wU*6JoY_beY*EMxv#zeT3=qNzTN9?Z@UWfTM?T# zg57&=-gjN(-P|`|ihB2(TiRyLzPUZU$r`Grd?v$p-gVa7?(%nyiub#`XS;OwI_}wB z@!Y+J(et;nzs8sz3)xe z-%mYyzRd2x_hGh1_d5GL0ifyWy`*-)y@r6jVx8HbIqU)6_TU3r1JS+bJ4^?lat`-7 z3Tk@Aljh$(0000!d(=c~lB<2&cHHgnZuMHvx8D2jQBMMZb)dV9W?O(CKzDufy?fU7 z&4y^3?>*xQ^va<#?^Q0wD_a)(-mecvs;LG>RWDEpW;*{=&sTPB{+^WY)-+UUQP4`XVjPth&zzolJg%7u#@{DKKyECkZZ?SD% zH{N7@?@rs|4wqNiQ@ukt+q6%!Yo3O$OxZi`J@38rJKfnheBx);m)>W#j@!qlZ259; zH9dK~^7qcQb8{Wrxwma%EE#?4ySz)L3U%)@IlKc-g#wpTXx_7y)tA}w`tzDfl>)N+ zJ!`jbcdu_`vRp{rvJ5RjNd+u)5_Zn21_p)8yH(v&|*tzKF zJ0@t-jfZna`^npTx?puwBvyOhUS7@dy{`9nGw(S0wT~)`ocq}C6^b|5diCq)OSpu= zLTMS9lX-V;H{S%MJ%9{>N36TB015zl^r1jK&h6i0Uv}%bc-77~oqM;F(0%R6=ef6c zV5B{1-%~xE=BdJaLKCtj{&>E7GE-S>x}0#if~0sw#l004l{06->~BPprq0zFL+RK}V~ z>Ux1GkU|j%f@GM038eBGOesG}>Sa8W(`ug8GHpNuK=nMMK=nOLgFurhNRWg9Ddy2r z@~7%*dYj5=Jx^&yo}*YmD; zrt+Ss$o#448V^zG9-uTD05StWg(N_LBR~*n8km|gCYlN9N&21wVoj!jPijvpey6HG zN*XgvX-0rVh=KwEGywntGyoGOhNBQCrineI%Acx#rBA?A_JK5;NFM*LW+fs&_By~H z!2hOy>;KC*tdNv}Bn1BWXqsZhEG|$12#Q=b3TQ$h3T6?ZVo`WAf{yrB@qBT@Kct*{79?n z6leq(Vd}(DR7BGZ&;$ag=Ez7mhcF4EBp2Im0ulh8a6ONYMMIt|ARP%53=TxX5-b3x z^FoP{K~taZ{8|5Pfy0I)ycxD-wzE(~n?sR5_>2C0Wci-Y9W`n8`H3!XoW{d0iw5`^PRZP)4_M=mg=~RYS4iXdTYu&kkQ42=DBC{hjBi z8HY?oL?NI=BZvHd;r|&23SZBY{oB8%^xLM?CN3=GIb%p@Sm;%kUG~~z!@n#EAAY1N zMno^`#BdD56EF}=h3ne~j-guCG@H=jAUlAOM`YZmov!kMu%2A>xCad5WO$J=NmD5h zjVMGlKtlyDoMb#3IN6JA58jGV|2v^5QkA(RLy0v(M%+Nk$>I(`Q!_+Vkra>x0P@%C zuyL@|P((t@*xL%41e0WbWLfr}o_#|`!kQhWLvmqu=VEcdp%CQ6-i#b@Xby3FWb79e z48w@VD?!^tPyS!-`}f!SR_h0}W}CSMVifRa?7Q|?_x|aMC>Eh4)jzwU>1%2KZxUty z(u9BT{#Jp}hyAPk^PLb_w>IH6qjmCQF@Em7KCaEpPi1Wm_#Z$0Y+N`Gh>#%t7%_5x z-Cw~w-k-Wp<(K?D)c7VcVyT~oB%e(2je-c1$h&g#wIQgih0@M|glZ%p5IA%uQ9;^G zrRz8cHX0$)lm_@>^mC8hK4jyzD8uvy#oZ)zI}#}DsXO}4+ysOa6c7+Y5W@q_h>MTE zH<=%42B^e;S~NJ{Pc*1Jul+Hk5=!=Qm?~Wros*5V+$n8Kuj}DB8Otrb1pyWA{A%j>k8Y(1d%z$&G>g3X> zD!86@-4@acNC=v2naRQ;Vnzt(o^iF%2*M+faET$gP$W{|EsjneCs^HDR@nhc+eGMs zXGJC$j&EWrs0u296+tlfga^M@hgMWP@#F10BZd_|z|ePSK-ktC3QjTqzy7=(Tr3i+ z{>Qi6J^^AP)N#(btAdZE05xS$<+lg~9gabnqGaL2X3}7eYvn({T~3l1(U6azq=+DZ ziYlQu!?CE)AikF4D`;Q-gj#yd!iR^}BMT%sS z1dk;s=l;?g%W|d|#g;ti=*Uxvc9N{~mA!Yj{|A)Z{sjyE`q;H(nI(Sz{+rreqKcjt z8Jp`|k5@DB+ZX3MXgeUEAvB%yvjbVDQ(RW3;I+JL{sRhe)-n+2aTbunw^9iLL+Z=^ z+KqBQ@Xp^7=`aw&1PBm<>d9QIkwe~^nGu#vE)KyIV?H#Oi1L$^Zdo%wmKJqQX~S%3 zAtswlNjenh<1H#|{-5le(*M28;JHaMk@Z(sDVNF<7d=>lxlXMnNjk+v*F;YYAh=U9 z@3X*dZJ)4*=HO@6{}1s04#FIw|140(pif;!W(U4=Y$vzF9t&DLOLNClv_uulQB6ce zebVh3>)g==5wUQ;ivAD$vvNYj3Xa?Ty3%f;w)b{Ua&;+6A|4dE`(;OVdQQB}XIbAh zM90hINBOUk3UfG!CQt2ii-CbD7J-nWL8VBIDpRK>KCwA4aJDQ`0V#T}xiFEA>D=2p zE)zHu>AWr-z=$RG;BAoL8zfq`6f#R=W}s<_)&?X-|S!BoAPYg!lQCc|L?eTEjT3bjcJls?LCPo>CVVRa@VgC-bt1Qh4{wDRJhtobb zGos3>DyB)63dIgTPwKe!>hI`h3NYANcXwso-Pw95!$k+ak)b4z&%}?}`vwF}_QDh( zQq@HMd~o0@!%PK)QRsiQh);Jv-M*OgkEsg@_P)wB0~zTcml{W_Z5 zepBazBzKma$0)8YCGr{WI{hy_}vM#(>GP5U6#Jh|JlucN|yJn z-ApL2@jLrGuhzO{d(Nah*i)5v?)&tnysY_Ub@iKe&DABStMJkmE5jY(dMc1MgRNxBQ%x$VeZ4A@_V%v-0#h75S~1q zg5E2FdG3pAKhY=g7i_nhPs7h;l`^u^j{U7-3S6PbU#V@?N1%LGoRM<9Qt87KU9q{~ zF);u!6K$>=W>gqWB2;teO!7Q>p{)PX$Yjtf(+So6UK~6}$?;ZSvxeW_$2FU7w|rGj zMstvmul#o>g68nx)df`lr&*qBQd4H-%HEw2@mU<#y*!Vz$Ge22n)4Aof-Zu?tJrA@ zmDtRHwF@-)zs=O)Da|M_{r@H9YfL6<$F3dS!6?+3f$UeFyX+Z)we}WdiaxFqFL$+I zF)sZdEea75q{Y9}Jkcck-DeX@E@nx8h1dI#(&!F)X3%!AMk-Q=3lp)OFM_a5J;4P= z_L<%JnW5#RJ>pyn<3o*S-GlA2yXOY9l^pJW5hasonuRFVONJQvBazN#*xD z5*aoMdmN%++Q^A}`OWiFFkYDnZFJyQb^xO z;IR+>&%9y>5&nohz#_qlm!{!&lpYDq7yh<%<&zPCCg~W%E%Gg?eI-{LOb2P$B$+d(&VL7l#dE@EWLA) z;82DYzE>?b8vobX!qx#iSXDJr!_{eeV67JgNdeN9zI!dPrZg==eyhkV&JxS22@1X} z7NapBRX_Vq%B*2Y6nASsHu^mECWn9Kwgy*Z&&Ze<=Pqk!S;uL!^?N$BxtOhnfX>%& zaLgtO97>>LN~Cfj!uujUY6JWCue4wmD(O7nA-lt2Ax55OE>;G%8tDpG2MS39491aL z(3NS2?^`}=kA=d>hTs{GHdr$Z9k6}lBj3{FiiB4PEkGw9Ql|U(UdOLzT>;<@+0A41 z&j5&Vhn~TXe6z}(SnGk?rIyMHBl#;8oc1T_kX{t}_R?)V96dgdev+C=A-|e&e71X` zA_M5}-}o_ph%4vVe0ZBqh;E*s1M$)C+dSMVimY|c%?omqw}uYDBxv84i8K0Rd?+H| z`7(*@tiFegA>eI`&O;J5++IEf7!{D@P#d3=k`iFS1ERT-mvkQ${w3x6{C+K7pDFrt z;(?CN4!cQH0<0XPf>g!*DXAh&$Mu=n6y68DO z-;f!w-neqOdJ}%?40vlRI##iDX#Ch+%Z^vHEK~f}?LQ=C9P70=;`D-)%|^&k%TRl2 zWn*TK|2&>z#;Y)UMUtFL5BFQxgKDKB-I~DvJG6@4QXl zKV2S;CBx-javoE*7K{hK|Hy0 zFxq;3jywL}hr+J=zI)_-CG_owSvRP<<(1FJGYGgwXUCF8?;CI!On`5pa#+YV)zfSl z+t+qYkg+w7nGYfBVoAB#1J7S4jEcxCuzdc#TUa=^G0tynPBx zte0;ucBvA!OMcudHQH9Wjj-37Z`o42X;ap5E{J|(#b<_$5{y;VqI8pc3a^$sxO4Eo zX1dn3ttpj^c-w~hKKNQCPEFg05=n9=Zbs`ZZN*x8j#8xzaZc*qu-T?3aD-?h9&F4+ zj!8#XX9-+)@7UWX$E3RVopJZ}cG`~aKLfmep1f!FL*p$G0MigT9=IKo1L%S!rjzzb z^;&7FhME#4CL!Fb3bP3HM_)gi|I2@c$G?|^>OB};tE#mM{*1JfNhnUt-uWQ0j%`?1 zc~*hn!103vahuXVJ=SwYHv&dN+{|Ma(*OM4((-W3FAHP7IqfOk+8l`o@`MA%1Eiq) zWqHA<27>&tI-^n{kReD1Ni|Z3#xT{jfx>F^;AHPVvlp@J`7nv+^l-4_{J6j4G~Tx> zGn96Y=Oa?lp>q)KfMj;~?W1B!p3MT%{yn?w7`Lg(f zgfS0nMJYi3F}3w=oz_qH*)$rrtzk=EHxGvRDpricr>m~VCnW6mzuiIWVDqeympTLV zb3c6Yyx+@#rln70xdkI~v+=t7aM_dLd!+Pz&M^V0&1$q`!_KAIyL7xUOn_(_`S*enqu0uDkgue%=Ok$cRR0FRn;s$ zG?|$xVu$c zYt+yQGci9HOth7Z+)&%oD*F#~5i}{dKD*zQYndKunwaa(eg5q~-Fi6X!#avJfsocs zR*RL^YF~68Cr8Mk-)1>Z=D~z3(8NIJ$TbT2(A=0Ts_x_`+~+t{lf0 zb#!vPk3?&HIi)x+f^`Qe*0Uy(hJmB<@h~}2JK0BO0&ok2@s!j&yZ`KI(wz2UdvF|* zzed4INd+u~RWwmEOi>C>%;}jXXID-)>D4R4|GUZje%FCcRu(W=-ir5ow)D`M83ot5 zFAw6I(q89kX)2};)d>ozoi~-qQNj)#lP6kFR=OwV+oQ*vuw3l6$gId{r{~S|9h#3f zj{3uMcpS5&O8ET!cs4k@*{pWD2&VAu((XmX`{C%tGw94_CL!J&iVDM=tpQEblD)lK zhVoGQaMo*mu_;4}9H24`iZ0m#;#@2G=rL^|R2L8`7k-OF*E^)&_M@0%i9)kf#rQT7 ziKc|j94)P~Dyvpxjtlh7*aWpHg|g@4;p?Uar0XKfdRdKsl+5Q;Aypb*=NsA!k=R@Z zzPawAZbK*uQ`YX4+=JFod29+7FeAUrcM3DJBW%Kg3M7I^gfLll2frA)=*E+oOP_Vz zDrRT;rSp2*#rrGGd`*k+Pn~(r{OZ*KiHz7kSc^li6t*R6RusqbfcPTq;lIpX=P zR<1ab|D!8a;m6;dOzW>y3w0@6Ywade*R)u*KKe6z`PE$Nc#U%Be5w2Vd42DF`@1^o zqN63Nxt0o>^0&C%U40n%w5NJy$1^5MTyw{L|1aPUUiQQ4q^3>1TW2JDDFV$gB@F8= z>-S_lh;i$qz0CddO5*Ip@AuE*yF6rIosO!vyULM#y~TFU>{H2=@d$WmjhGJ@R|YkH zt6<+d+SSQ7+i{_)XEdKHo$M_^DKkxQ{#h5wmfw~KLfo0ekygVS{)y*_RMf)A_-ds0 z&c$IVv1ZIQa!tHymX?+(&gHES)n|!#qpbWAqiRg)rS5CG+815sZl1Tk($#XBJMjyB zDZ38#C{~o-NxydnFFBDgyRptsYGSX{>1^k%_NMc{s_N}`@6n@7ztMgL!a@A(Y?N84 zS&*77!c;s|+(*$pR#JB<#?3WhNUK{G7E5G~44ho3n8HrEMj!JM^T`4j0_-KVjiUH$yoWi84tTdz(zetRD|i6@gb_^-!j_y;GC?tkKU38sW)g;Gzc6Y6>9mXFJVro-)={rbUb04?(wKa)E z`P|)ASAUU?y!p)~=+;-Yy56ci_ZpjRAd|1m?YAiH9bt6p*1Z^XyUsMw(6l$EGC)XV z2uM~)In~PLh_SuLz;VJONPQC6x^x|83dS(#vo z*-1J#JKd&uU~pI7^|rQ?d1r+O=GU$Ka97t{GdJDpjQ6&*a^7DaO!xaM3I*{@71~|Ak~jjuaa5VF7Xl{+NTMXJ@on`j|2$vMk(_If=0e(SaIqcySo@b^D>PW20>?Fj=* z2h}n5B6h8O9zwlBJon)jrOM@G`CBL-m~fu1jWh4%iklxSWZAw_j3`2~n!4p`ry=0k z&vWe0CFc{}Tg}>;^*%a?w{@hRl{t?WKyoJaCJ>GP!iV0Q!j7abE!yHjiE^uh%gs^C zdgbx7s2z8b?~+4IL&?s`yyVR1Uue{WL}IG53WJPt!Jpub640Vl8x>3%(Jetf3)&7^ zH@3;>XVvW$Gdh42!@E-yl3(v`5hqGV zYga=RV=7x(-zQfCgyS-Oo&iV2*iYs0x=0Q8;M9r5)=qVknP3D@>ix%n(JiOY&%t-fTFcGB2~}a z-yP4U$LRM{B(-(Hn`&}y?66up!8&T#XH`TyH!2urxC_46-BS<0z>`g~o${G9m(f3D z6lvMX-um11R7l2?i!2Fk}{qkeIp{-OFaRE$O`K zyZk;E^Y)LLxg;@?f9(WG7PqFiousD%Z!g3!=Dm2(->%7U-O*mz_iPSL9nqLfkU@|- zbF0to)muf)J9v{<6t>GAHCWmCR@-vEjQ$7UGOt2R4y)cYRB?=H+DPSk~aMg-K-?I)yNV_38%4Oe96zt zuV`;sHWcgizeX>qTWk1p%L#W28()9(^S`5gJase4U-HSm38rVl*Ov&>Rx>=fa|C|X z^e^!EU-ztZGX5KSuBq@B4{q*mP5mem>*D=P$C-dXVG4#+<$&Q1Q6PkQva~WSRV@J+ zxflB)kfBS2M~>R6N|(49`1qL^OhTJVD?pdSFUX zpht|OKqUc7!`H)9&{~!BZ@O}UNJvZ*NjB6!=XklKRjd&8OoHbM5amScNt5q=-tShF zBj(PvDu2j=w!*By^o*-Ek|aav+A8%$Q6r392QbH3E;>Z1-icr~ku zC0lMRV@M~T;?&bwg*cU_aL2J~^5&#@WWZw4HZV#t0|cY?H@4`K@r^M7N>o8aF-7f= z@^5j`so&d!_DQrHGaQyP9ppSLi}du?^&^OZAu&S`#^LAMe&1#qUY55MNemOV<*s9U z|HH)Y-V$P;c*Pcddh5lz<(y>H#SBTXs1C@#_!nKDWb2c%pAXCrL-~avDhc)Woyx#_SwZDGtV@(75gRcx00# zTRpS-qjAI@u-|&1#ns$us))TaPMT1EJUkSWRT&8I+&qOfGzH2@A)yY1_URE<>`dvx zvkLOJ4*d?57Xpj={J2FuPMHpw(e6%`kM{Q6?voZCcg+fFDyECkB%yH>h0ObUYYI2~ zBU}!RC%NP9M3Z}WydcrtM*A$jaP;emF+AlHLi8(+cunU)$)}g>togEgl@a4Z9wrIc)EnQ~J}_{Nqoi@4{Qlm+_`Ywy z>D#JDlqtdr5GYC#f|uun`lNn4{%s0yg`g8??uHOe0FZi63}Tq#i`S~VJLKO!_c7|% z^FHQ7r>-*PI(8vQMJ7_Emkh{=^2CMe#$<lge`?>Q%J+LN#2Rb=ktR$@B)+@Phz}EjDw&+tk$*KD$`7C7dCtW{ zUU8VJ`0YVDfD^0c&Yv4aE$*oNQBNT1wj*3}wQ-njK*AK&Cp`YC<)O#G3)i+2edr@l6#5?bO2 z*Yl(IE}m)!JJcaJsW;^7wS}?(O^j?~C?+&*j@^)+7=4J^tI|0&4ssOn7Nz0!iLUgQ>3Zy15 z+4UE5*FOd0*^Ok5Wh7LknacU_G#kQ_7~Q(1_1KVvB$)_85&5X#tE1^tk*$`_$x9UD zBreBm;M*2%d+%(MB9>J0M7XMQJBbOPNeGB%5bqil+2X#xCBJ5tV2oa47$y*a$J>-% ztgqOV_J==yT`6@?>y{fqUSe|IbVfz28H`>o_XI)_3MKpj=>0uE=kEAy(o+4?q4>ah zl9P~75hZqX!-}8l-Y+JfJJ%b{*~(Rg&O@K!`W{Lfp2&7gi4Ol!1&FYhQaYu9GII_m zhT7LFA|cOo*N<@6ogB5&`Mfle$=?Y);pMifZAhXfdBlB&>e7r^5d(d$?i?1t~{m}^a%(E@yRA;j*7eI){2 zoRXm`umPaf6-}}PonyOHOE0UKnfxAT=udim&qmvV!@II|(Y!^izI>ipNc_lvkHle? zoT%;Y?RajwMnh{b|7p?3-)MP{KkZwgnZuQnI({6nB3>9_$`&`ApdmNL??!fXgk1;W zPF%){g(wJd?oJ6L7jLnWv%T3@t|pszpc#mcN48wMyeKD(HDNI^hyi_~j-pMr=Pm zsZQx}m2H2bEW%OUd={KNv5cJ5TVBddw_(WzxVgx&#2_@*Q+}RHghEkCSHETCQI$J-qTW?bmd* zTWlr0U~?0Tr0(u2Cv0Ll>!#}84C0BKUX`nGM-7<+^~MB1OBpAC`~Eb+f8#{vcJ3Gn$vL4 zIS6sOBv}a_Flu^&lk-RTW1muta@Y?%hxT3FFdwc5=Bg!5F-M{k5tHV_1_2?E5kz_4 zmV*aU40&Oxacvvu>)US_`saBHsH@@M?&X{Gfz|@5i27oO!q1MXiDr0E_wuv6m_-1m z1y$EE*CGdB@BQsbVx}nD1Y|O1cuN3ii6kH*d5z4f{wE4b-{rTgsQXA0pQr2Sj+$!G zMhYl|xYMSUhtZHf+rQB+M`$mIGn#jg`I9Blmy1;hNUjQsacg!t8c`w3?b6bj1qwt7 zKvFcpczAK!d3|lL>~$GM;~7_ta$X8xW4VZdbHqdCJ^?6AsGNpO(=?{5pd{$wgKU^>{)0bhr3&H z3p;fi2#OIA6f8(m&?P+BttOHpiedN8r^Z7)(8(R z4js`rK^%F0@(M0Q7YW~Ba3F>*3BnjYpf21WnYu0GA07v6@V3i|9FUkLib%mX>F*PP z*hMHp!D-5?6&FzMTTso41qzxI=gJl)4^5w&iCU&&B#en5ae;Y~3!s7{jqWoY8^#bx zsp$Yd5IRy$f13p10&^sOiBp{OBk|d|NAAF$WE}%F!l*&8oCsTV2}V1uLl8_+P4Osk z72Sx|#>Ut#8}p<$iFJzw_GW~Tcted+?Y|2?c!GCkgia6S)8)fhDJ9)6EE8=iszPJv zNMAX3Y+lGI5{>DI&Ui3G6t0kL zJ@^0D;gn(whlaQI5%~KWbjEo)h=@CBcmS-%l1H_lz1j<@n2S;>&D|t5h;anc7*8q`>cSA>n^Zw7i0l{O(%AZ#Dty+ZKXIR;gg9laz4bkA@SR!A@;-G%k5oHF2fo z{G$=$BcxH65tTfcd2w23MDb`=QhetGOT1wS7~CMw1N_b{RD)EZ zMYcJbA%O)(d%QlqxO_jI_BHH-sEm&QA__j-*c90zNS0ZFAP`9d%OzkB;{><)XiOLH zvttYbNd+hpA*O;MX=X{!rujZQ39hXVw0p-n{;lDp^%_q3$=N$0N+0ihi2px*cnLS} zw0w77OhR*+8WlMTl%V!Xe^-C=XHB@Za(R3;M_fC^Z-^VrfsS?)y4$x<>LC;p?j3gf zgnFN%gE>N=7>aVARpM9xR8e|CN+8k?HXmuyEdxr@9D^GsgrI#L!^RN0h)3qises1P zAjyhT%zB<))d{XgwoXu{*!ZpSLU(HuySk#H3;S#1x---+C)+4A$hj>#bHZXX6cV9O zK0M>~i{1&rgJ4+Fn5K4fR9?A<)SYUM2K@pAaG;(tiEhUZ3an$xam1dw+k`U6L|n1Q z3ZSSU&Q7}>@z+=#V}1@eIQ%ZRQSXZ7Ey-Egl+ITQs4|di1{`AE((-OLWWvM|W{9>y zMSQUeJ7IarRSqb`>|`ieW}RZx$(o`Yo1B~wF5`oq?&qyQ$VO8gMqSh{6D(FxlY0{2 zFCIr7`|faJc;H$3Qk=&40_P=th;B+kd3kK*z-i6*x7LD@7RCTXcq zibRybYVK806%`d#RaI40RaI3{6;vXn4CX`@HfI&#s&_y1(m7$!ef3~ts7XQBp#aFN0tnC|^%()Gk79xtMGYzSxu zC{%0w=kByS;rTy_?eKpvG>uU%teb%7sTBec{IJn_bz7(SaXe&*5^TRVsk*vPm^c9A zum2I^#fB^ca9obGIrFrgj6s4m^wLQP{oOQwZ`FGJ7@DHrcK}w!<|pm_-_&bjm~o?D zd!}!Db{hkiE?df@NF(!uZ|SKpWEpG~(F%t`2MAAid^0`-xDN>(p&dbVK2{acqqYy{ zfsQ3L2UP6qu0ta=n&>m`oC}{aF!4DO8-eyo0Wja?0$w2|NE-nC0oM!#8sng1@aBUv zs2#eTltANQNs)<;#iGmlKAc}7zAxf}m_<1opc95r(8E~P1;aBh)#d2@zlY=3TGF$$ zqqwC?Q0g_Ry=EG$yB1E^xQ+k80T6Spn-qEvx;;nVwCootmhqZv=`=Bza5Gw!uf@f9 z4C6>q1F@ADICkPMJ#(N&h}9HR$k5(D2}1}k=IwqA0NQFbItwkZ;ORw;jWOG8-i#V*!0+Ky85rM$(wX;AnLU4g+h;duP?#g8kANO0 zcIP((^iKzo<}v0U#*f`06j5emd^Kj0n)$56R76osRs9?NJk(VmB|3yKUf(0!1%rqt zB8VN`y}iE7p}%<$@%wwi^XpUJR}Opit*IkWNDg1NioxB^g6~{wvC{dyN5D+sqhaN4$oeKji&-dY_gtgK5_Q`ZJeGuk)lJ~p%B!40% zfmfM&n;=lL#cweKSqH$o|JzT>TB@5@Fv&b^7_~I zocb=Eg2L;*t6i9$zYp0UZ#CpyCUG_?wFo^awS5Qhjd^YMxup4bkE8kHV{x!pyEe0l z#GP24FE(1^;m0YsD*JJ3d4>ZOXci_Zr_0P@Y|_K?RNd5!7LHcM9!Tt+MOjbtpr|%y}MEFcX`UPtI8fA zR>W$0K6=#YLG9M^N7{Ww-di-L^OB(ubA`~uZSZpc`$-cjf0=(!c2~4y79Z!Idm4QF z|B0KoFOcKfHa=}yx05Nv5)uQ5GH*x-hCoo!KpH6mhDITTpojt>m;o^1UD2jyI-O|O%`Cq z!5d;pQBUl@#lxReK3ID)a9bMCcNyrqVW39MM8fX@@VN zgAo+g9F3o|oW$JCyl%ze7z@63Nai>&dJ8q?1*d;BAI+t|zmGfPJ5;te9Pil&K8HLX z@8vpq(9Lg%wa>-2>XgiY?be7jjnFhoM4S0Wzi4KIfSWtnjah8;2n76%1&D|u3($27 zp*L&ZEGiE>@V`RU_q{o+PmCf=rdzYe3)lpYaAptDOvci z8J``je#&YZ&5=n;Qk1+cUndI~UJpCg*9oAj`RAF;E@toP*vv3$x1G+59lYh#8&Yp7 z3cQ%ZO}J>lEvYg>cX#|9<{Obyl=1`+t;E)HQ9ICFkDCzc*XQ^AU3E=Ip*JDoR|dSM zzt8=F_qrk^WGD$QoazX})uZL}{Xi$wWN+PM861tK*BVB|6WYw*JbV5euj#jzSTK)& zuhS+ZnS_JJ(G#obWnrl7<&RtV_!!uYXJ^0pjr&ow{MyeiX_2sM3~CQ(Y<72ccXKbZ z$7AU+zY`F+W!LUoqf03RO!AU849tGuHeC?q$A1XL!zquh145t8hbbmy; zKX1_}|B{R%Sz2Q$NyR3^S%Gdh*%5bCvct!k%Sqn$$^8#FsJZEfLHp=9K;8R8L2>i*&2)EAu-AzKh6WX>r~~0 zqR>(Sku?<1ifGuUQesmgI$mpm04>QI0-L%VuKvu2Anr1l@0(n3c`##DBq-)Cc{4Y#p#a6DGAMLnF1HWdYzFHj?qHZOewvDhYZICji24C~2w>6AT7TZ?mODY$(P++gxmSH+o1( zkfs2~${@Fmd9kuC5Y(85)@kMDSwG$MCx9cje@-`qNGZfK8sg4n(c^>F)1IDs{%gU5 zWcd61y#rVu69>bih|)~Iba4ygj?Z)0Q`K912H~j;Hb=5FmPpax0(Xh|{iKpf2{K7B z=j96afOUP1k!{!ezVg%Pzu#m6Ru~M(@@Y1LPtVV&?PHR@A4BW6)n3H&@sxd)_EOSd zQWaQAr|a*ar<5@!nsdrhiF}c^z-Gn4&B{>Dz&0Ccy8D)xyjaa&560W=Zf*{GI5098 z#QyC0!|x~i-NVj)E;I=U5(`Ex6NzjUieGfVAY2PvAmJy5Fw3Vc$sIygo1$Q`v|1 zPOtStzw~)&C^Z4-pVud>?>HWgPD(eb=VIgo_5Xa*NOmMDJl-HRqivrgekqTRS3+N! zw)YZ9ZVCqN9NiP*=B`Rg$DP*h*EZ|e`J)tC4D_;8$-+uL*QBMHC`Y`jwWv&+PSw}j z3JM>v>?GA=0c`j==q0B?M|N@@-e%Mpqa@a#+4emUXpB|&BKS4(SsW7=_PgfbB45vs zblOu`_d%}~r6`CpD7M_^)n1!MGDku?5ZaY3f86hq+?YrX8LRmYf- zQj|n>Pvb1;v~-q2Nx2Fb9gKY`eG`vC@ebCAvhC%wpQV+lFA}-Y_HEj|0FJJpplBLE zqzVau%_i(Y%$Oo2gIzqPP7hjX3AGkcE3{D*p$_k2qD=`lNSdAK30d*K#u@HG_kG_M zv#M%tP$a`gP7`leLu_dY!W(IbLn6Pd){iX9?idH@Ej4=RYaWrBhLiF5EEo~u^`8m; zp&!ZGl$YIPc}&w6=+BQ>g~H-q$qguxKe%u`X+uc7&lr zVoY4yB_yJeh>EP3l3=A0D6TVf(n1#7H_Z-Z6$T=*riYU$2|Vt5qkHmS6E2+j8=^e& z+>g%BH0Vhx)(Al~)1;wM{F}9F)W^98+cm$TN{FHxjh)dnTg>rEQr7+aj`Au_O~~w% zBgt&*^wv%HFn>tAEAeXIA9&I6H{a3H#i@julX!d*wWV)wCr-L@^-B&rd3yrGtDe*0 z+#E)$E71_0LWp$n5fj66TzT`cn2WRUdF`0n29ePAkni%Q{Mnbuxy;R=AFz~)4AVfQ z2lDSH%5?yR2!$@$@0bhz2drr6CJ7S3?{5;QbWY5O@S>wF*c4BZoHX-|genm+WWFA5XopbX) zYAEOj)|!X24*pDkR6@7=ux-rhN3)R#R&w=Oe4rEz*|n1T(!ZhG;{+JR;{!?KDCMAYlKZ z3Ca&{vFz%v_gSf3-{d{~pF!mKsO;U{z7^Zq`Z;}HpV9-~quB0yG1U6~JdE6|da3}5 zq^hbSsy=H6*Es@On=+z`0gye%`M-Da^8P+wHxu$R`t)XD&#G#>+nZg#sPB5?`{3}< zlOa(h1+buIySvTP+0XU(w)}JM_j`R8o)3@9@#fHbfIS(44={`n1r$;PQB%*4>3u@LZeET`(YmyY)AekhG@N65^2bWGH ze$nC_HNYiJ1iL$8MN#uRt3gb|U`rU>|2Z;JVVc8Vr1u9d<{5^>!`JdKQhx8*H7NM@ z?62QTMzXG6Nb-J5UAEnyvv#g_`J1bhH#e&TiTsVs+t4#@4V%~_+6C|Po575YY@gxZw~6;x?8iv(PJ9^6G*4lS zcbJPi#ZT*0Pi~65-+#03{9l*+{Pg=Dyc6-j3W^4rlVaI3)b&aR^?0pqPw=_?BUpG# zctVlK$>L^|n)IMW41z{wp|Ok?H>ccfJpQFa@J!!FcAkE>ZvQmbkRQwD^Le2}QsqBC zo$a!PFxNR!=dEJNN*!G2dJ;)VJOjCzTUwB%8%#;m;>@|kZMjoBdzn;rl@58S$#Rk~ z$7>lod;LFPpq~DabC8=?qs_3?n>=-D)q)sdoiWu+|3X0{)%?SAoJSm@|)kIKyAIm<$Z&*`ZCB_FH8&G%n-sH^;o<#6}&Zr{o0 zk5|Bb*YXwj4l$sC3%}X2-Rjc7U2UuCa3Pv|Il8e z!K1D$^V!ufpGViD&yN5(P2skL^EegCf{L=n#MMm%20Hs%f@IXqchi@i`-77X8aA^Q_#$-v&~pwiPtd@9 z<}@})v`j#Kj$OACky?*;c}8HG|$zQzuAyax?+7kNRWS zeYScx1pS${-=;BVL!kJ&FQDs9=`*w(sAOYsvBMB;8~Hx#t!LzhkFnP)(e5J{w}9Br z$qFQ|xX+P-g7?7pzv28^z6!fr8D=K$6mQzZS@gXrOm4?GYVM(_*o2hTSlvmDOerVi znPFzAVhWg&(s_2CZTw~z1=s&Vl5JA-HmeEp>^DiPp^mQ^z^8#TcIS=H#BD-+jmj)E z;Nfa%+KIs`7bfADhbn<3XI*+O-G1!c72O8&RZBTmfnsbf$ogF z2thVWeS_3%fsJbA=~zxDr{c)&srKvRhJ$#P!^dvAV?rJ5IguwnQ=7+Rd^OiftOvGZ za~9jR5Q}qR__x0~frh_L1PPsP(Cob2Aqj{A_3knH{krCC2O>?Nu256Ta-lRx8idwd z$&<6`-`k>TH-a3ZyFu;krpjYi4iC+m%uY7!d07emz9uY3zmbNPWJqjPWfW!pP@H*_EVnd=Uek`IqY3b(Z%ow^a1 z^B!oQ&4cD9L;BUF9JVsbejoAv;i!Jk7_7zmP;0(W%`d6SN~b^H{`s=`IY{NsZ(50$ z8I(*`I(n3?8g3(qr7F#umbXk>l4WJGW@i+)ND$m@7f#gM&AUn$Cz5Wiif~g)NLMve zZd-yW5nE{5cAA`$sfc+lZ-dHd25sv_YO9YeyT|x&F&DHhW%T7(z}_9Ujo44{uC2HJbb@deiC*{iJV{A+$+m} z;@H?vS?Dw$D&2azk##}}5~U^MzK6{%sNe7vw{FokBU}ohr5rBDoPqQ-N~2JeSXp2f z6_5BX7TiII_z>?rIomQu4jml8n}izMb>UDwQqhDOkE-Dt$yAiSNq>xnl7S1Ez@URS z6vk^o9|`&+e*{ZLkl*Z7Nlsds z!V^utjUTbu^@_b*pF|d+c(JL0A@alS%YX0avkM~CsrMuH1iwKaweKVci+dhQ?@g9R zEM@GR&HtHdX>qHtS?p|I!=$?#qe>C*0&J3DCK)w`O;ZxYQxb*xaB7+;Ac}~M{=K%_ zigoRm3iY@5YmXU1m}&xs5@{wJYn_=j(Z1PMm7sG}wSQYM(#CSKc|o38>Bq~Dr8tJn zXMQ&hP)xylVm0=upC4smuj}GR@4h4Z!QGy)C+v`-_J z%uDJyVn|JY_?h~qO>aYpW=I$#-ub>+=kLWwxtbz5crRTyYv1Q3VT1Bf4hf~jh61Tt z3MLqUii(LyBqAAzg-QxyA_$O)LP?|w3PK2`nkZr^NQ9YShKfj*A}T1RDu^axQXz}I z%3cNvua=V$U`T(n+ukp5-w~6Hkb&q0@Qg?L}joKk*Eoa&%173{cIfU zntLd2w9gF4Nsw=uT>S0>aTquLNkVOiLW9{oAl^pF-3sO}dXrAkSEa<{pTwqfOMSLN z8eoLWZod@C>Tow+%;ku5)9WT9A_``idsgWjMNkqF0VZXt@qy-*lNusT^?OwQpQWbN zufCD3&ACXZw({l9SyTMGX-U%itl~_)Hpt$X6e0e<2ZaTW&di)BA>|9dZy}@O!?=Dg z_@KOvCHwqGbejP(U7*tv7wVj)BJ|1_&l_F2y;`8!nv@rXq4WAu{GF3;lXR>Zn<8lA zmhYH7Y-|U;JM*WSjO=@> zV`4*muRd9g>nk=j_$O02@Z(pdXc-Ej=f=f=P@wiZu?U;P)G4mTbSqrLX?ceK1Ao8& zJ7}-=v(4`-^FW~pbmC@ABNTU_fUeAlAn8R>bN*a7W;3P_*CFtM>m+@!*7HqJRKUbQ ze<3(W#A@}OG^fB1V{i_cE*qS^$Yy6vVi-6gwl3WJ6E?Y9$!7L%rGwWVZ}91h0=10p z$?8CMSUJdTpCWDN4%!;! zG(?c;oI#+Qg5X}}yB*bQ<@%%$zheOVjzi?%LEP%{h^X_MFQdZ`5@0R&{$copN9MxB zQHYVwLCA=TqO5+{hY7&xl3S8$n^BXHGeT9%PmW~FKJ%6BmTQqhG}-ulM`oH{$ONyd zID>*5*6J+n#ZKGdX-3B#2+5rm^AShr`Iuj;H3|$GZLTi!E9KjVk-%rJ_~foTZck!c zaoLxFHI+uWH47MK6^dfEOf%8ESnXn{D$!Y0{|XjOne{5;FLdQ2jO6*@V@+NRjb#qf zh{ob%<%A^~%}vdrw~Zfdf4=i|O9=u@mi|H*vAAOTn0MM|3ezYcLc5vuB6ZcND?-P+ zeNIHrhc*?k)R~yk49F9*%p%{Rsqp`0ui~7QZ5UQNu#;`aYkl0U_0+S-N{N|A6S2f^ ze%t)kFvPnZU!Lj2C{CR^f0ms{Ns2V`;Q(Yn9P#g~GrDIQuk7@6?Z2vADD~_sB@VyE zqkXc!G9#Q#FIA`g_)V_V_W;R^L>wS;g~s>RC`Xl;H#OEI)-ze{_;1lkp2%!lz)o_G_TINNu#EhMfGD<38 z*(Q?-gqA#XJ(sm1&5D|hXw@r-Hjz-~Lv36n&NXWU3iYQG8^6imCdG~0=Z)W^fg5py zhP;|hfZwQ0#hAN3K*53ha46F6YSXHWuxzVc-k?8bkHJSrmAn9?p+RMW+c&F2R<=)}axFIrTg6Y9(W;IdxyN%U#q%mrt ziLAC^yl|vdIat1K_%qPD2}q+?%8HyF#$$Tu#&c3HjUlb*6s57~^4jtKR~}*fauiq? zCBm!<58bu^=|^Zm9AC8-hB(MdnWIPEVF%2q*&cGdJB198RYVmrsW9f~0p+h`qh18dyHADRuRSbc=No8+4hwV69VOywA>7VR z?qqLIigq}>T6avhMx9k%Tx zK}+(U+(XQ4)^PfwWeZ(>&SF@$&+qWV#S@1;a*N-ty}iDZlkJ#>X{3j5hDUY2&n>un4wZ3 zLFIAae$Vwi4_~8I$L*HiuwF{Lb;3HE)B7aJnQD@4QIQ|72!Q@HNgvvKe}g0(=nJgR zHw>5RZ}>TlTneW8UE*5oZ^CO)NdIvRF~6frJGRPPVfDhUwb1f{z?mScNCD3&GY&}^ zNTx>aOea!h8u))#!b39_Fi=dz1JE-AvB)AqFA(Q!Uvt^uJ2i%#pH&tf8_Nr)YqyKW z&UM34gl3WFd8SCa<0&Iv(Z_McNAi2+=e20mBx{GC(x&o;mJXAww$E*huO1dBo%T}; zpQ?9u>OCk*B6m4rZHLhh70fStQ8tV@v0xcbP+%0KvX^l}w;>ZW&Y zT&opY=JekY%>Pd#{%Pzi^S$?5@p$+@G+|FiA>~|;ez%qSXMXmfM1nNW<@L_<&&kEw z@6N7VlRoxI%J-VOQMBrExc)V*dPfC_Q*$@_?Rnp>cp5L0DCC`X%Pr%&_3CwcK5Xuq ze}~5UN3KTq>q1@Msn?$Q&My1DvYln_M)lIKTiiLl(S?~EU!C|;-u>^*ayqx8*PlOM z7ae!!JwJ+n9vk9`-LKb|OKTMKtC~XNbJb5wYMlDdsiJ${kECzbt2H9iiTZt+*M%cVnW>5Rr&exY#fI29&c0@? z?qhYq@c8%Ew3g>4cb@loWB6Cos^m`5RqJZX^M5-i`Kj?zN+WCC2=JKqZ+25Xs zN{^EL{X_p9n2GT?VsJ462BD@lhS10meEOdLZe=E!J-11Gx=){b$w15FnLcElIxj9U zN6@&7Ge0}l%fFu|haxW@;=TAj83g;E_zo_m7 zqK@6M__;MFjqP(a)gEZxdAF-OxqInq&rh2myL;i^RleVM^FF-d=v{Z@SDN)ZJe~7z z1Cq)>y4_QmZ=zcD)0*V*ZkFc7C1}o2>v1n8hg_2=s~lpVOmg-6zvZ1BGqgv7jjQLg z-X0j9=hD|)l5lKQCl7hqsn)bIEws1%`<vYwsOBv2z zuix(!uSzE>e6)NAT~v~Oy!@wm(a*j<#eE)gm3=P0|5FCJt|~(9RQCIio5>qA_2qxF zgxVoT5PpcPX`E1Yn_nU*$CEP*4qp@sArhKUK@jR4)Eb`scA7@Vn#w`ZWSTThVIgaV zagq^4;DjVV%!eqpen^<_-2HFul`1(slEiym%X3ZVx?;{yraRx0+NZhaTCAS4%T|>M zH5&D<3Nl2pYtxuS+H)D)d}#Tsx~0a=HS<_xBSk;vd_R%LRW`^_I;r4$T++* zWs;(tw%+~RD`k?58kD{DPOT^T@4qx0y~?e)=Df<@Z_OPl7n_~#$u?M{Woq2$Nkp%} zF7aoqHK}BsV4B1#U`GVw{)*YAghWoS0(#Q?KFB@8Z3gKJ2Kt>U1Q)5_sj6iqU&iTtqEOSwJd__NG-nVh5hpjrgtRb?qs|i!*;({GW~XYv-DWL7sslGbFHGM z(;U20Q}|S6YD0=|kY6%vr-G;J3SP%XRL)kc?r~OC%+hf`*afp3$>ok-3FR%f-Szgtc3QOxPKW4E`sYW?7%T5#v^!|`{RYGQ3lUo>( z4CA4a!+IV za>}8LIOTdmLQN3V8&JQckk-**#?ik`%sj*Ud6r^RlOLLhY6?sVFocwxe~3IQl|6QXOQ%Ij;(z3csb(%h;vANDV9`+KYvDo50q<7 zV*kg+QPMRok;ycsBlmXUx~^O@M$xOFCVTI7*e}UiyPnRAjp%whd17BzqZ(XLjd!Ug zT-`aTyHtg=b=DuhS-!FTDqGX|&BN>;ucZjPxAH1-Y<;T*j=Oh{C}H-`I&2TVOuoLq z#jn#nJQ_^uj4-j{cGcXxMpcfUieY2ird_mK>eLe}|h3(+rPBGkm4oaN!(WS1jv zEBgi9YoswD$Fkm4g{a&p%^RMWHH=jgHR{XG{O4A5e2Z6;wk*`oL}Bj~haD{mV*0q_ zlWVKe$VK|5*3OhR`71eRjhIhm*T|$3%6HN1RYX~rf}RX21=d($E?K!EW<;-+ zxxbF;*2)hr)|v~Lp1r=d`D^XF3O#Z(rQwb(8b~=u-bM)7vVVQP3);lC$>Q6gqmt$d z$0vQg3Jk}5&P+#lBRGYw#yu*ko(0|O!&VkyX(@EiBl;ORyO(Bhzs=G1>HSC#-Dt&|0QaLbCsk@lq&}tfa}TYSj`YB_!P4RFAb%BxWpbW!jf#2`IW%WR-BGT+2~P zEK&;Y>hh$r=P0yIOBD!}GREl=6H#a`)TJTdca%~kBRY0;SH&^UnR);;sjzr1zT{yy`z&%^6qL~VT~|+utg4IUK~o>}U-DPq82(d{FJ4^nBJCRq5YizA<+)sK$_S$V zeH{$Y-dxW~J%Nrz^07F5=YR44IbM$j?cWRNwN$n$y|m%Fy;M^^5+9#zp@D5WWqo@L zFSd8J$hUx7MX$zo^2%58s?VXC-sdN-uG-@7Y2RwvaKlko}TBscG58Ya04L{&X& z3{x@N1Yn?5wJOR(uNRf<$9!JC+bKO)P?q;JiAS;>2=);QIbzsO$hn2YF)MmDOJp;pyZi@0U;Ep&)ZqI`ckoJVTkeAf+2C-KdN=5|6r3X@}G{6Wgu;~ zH{B8@J23RKIe8~9WREnfT5FXAf**W&q2%oUF%LNgUT3*LbPD365?_wbt_+KCuPLkh zMtb*XsEf|;O^~y8Ia?`S@`LrtQcE-EB__yB+PMe88!^w%mB`n3k({H*$>H`Zu4n#l z_4Uq{iNOkDqxvWMsk(I1gz>^2TI|~otDS~4&Iwd^mkK=gni3mY3rANNa?6C8>?w=LnwDj+ohg3C6)hgv zvIDn5b)tg-Dq=QMzlk%0A)Q@<*|9>Fqn52?#8$M4rTSLgL*=S~t{%p}>?NwtQv)%o z#W0Yf-5h@VC|@$dJ#DW@n~KxRD%zQyog5RQAtw{ynk}1Hkss*c)@OPc_-#vmKH^uV{hN2aSL@oeaNkZ zx=r&E&s&pf8@@dt5_CNF;?JM5C%I3Zn!y3Jr0bpflqRFHW3M-MiY_v|=F4Ui8i<7& zUJBA#mOkHXpt)=F#oStKUz>(tcwBN0r-6b5Fn(eZ%$t_LTzFHPm%^Iv@NShX5xAvC z+EJqxY*MVJVB{lFys}iE=iGAw={oSH2tIUU$!4ONNY0o1za8FBcZM)N<2Vo zKJRNVKr-Lsy4(dQLmUtBHpQkBaC{}gQ;9XOPaB|gA#N6mIVT0i(%3{ByjgX|y=Dr1 z&aKWJY6?@7 zWiy;jF;|Oa$Ab!wky&p1Z%Ypt&fC$H&(%`Wc=#@c&Ujlnfi%xzdOlpTjw;S#>5kIf zjEFYOYwp*vEW5@dsV@n%N9k*(`f;1(e92nf6M|rBGj{?Cr4nr7(#!4)w zM6Xy{sdd+)RQlHK3vJitw9zXL8xN8!x9NvpsT#{)cFgU+bu}M%JPMy9@bNR_ei0{> zYRtE3W>+r#Y)oD@%9pi*3?1Nif(K|wcN!Ro5*m(vt_xHgL6X#b-#7O6$tAd-xB)5| z6I9T?sio3e|7Kl}Qy`WKsMX1ID^f%hD2geyRgLCYVu55hLWmWTNtX=7I=OiIs;a80 zs;a80y_pkZ5&j?P)<%>hpC|OA+KWg2gh1@2bSjx4%8`?$XNMn>Yu8J?h!q>FBDYbf z7k6=#X^Dx}V5J{Z((Srg8!u@)Zh*~^1zu}-GX!H3fPXZZF^x)J+_(sby1 zDD^=WZcYBz6f zEX=FLIN1a}X#m=#I9*3SwmNOatS+6{nr_+*MZJ}eTDYZR6Cw)mmeo5D$;aEBuzPcM z@_>OM`Q~)X3QNdLGimp7GY_U*`m3&(ZB1)lzM0FwJj1|z*%H0`UBf%zvvpz)C~-{E zJ#{KtBU5HG0tA=@$YFJi%y{j%RN;vblgZAc63Y0w_k^K0QEdxkC+@YcjOa>NmfK$g z8x_@UGd5jp?S*WqN>3QBVcaR!g&Gx)wsPf20Xh}Txr0-I*jEg+O?e*LVob;Sqldh~ zv43pDc68qyFSO7qI7A>Y@NTK&&3G?tt!w9nlGKH`qs3!2IWehLdCzqilS#!GGzva1 zg|B{(hPi{=B)CZ6qZd3#k$A;@wyn{gPh+J?L~N9_j=E~7@=0ZZv9zXVh608LVRqlH zm(Z?;thZ!9)fn6}1ZoR+&@CoK@b@_>I+C)VMOa=52rWPkr&|3XfnUsw#Jaa5ZP%u* zp)n#bLb=dU>d+y2B9qd?rLe#&DFUf!#6;ozCAP;V%8?@2TN+qM&T=^nBC^Bd`o@$J zh8O=x;0G}3WZ_bhBtQXb69B0X3R@($*{V`Q()!b)QT`m;l0r!&Ard4ksx6NGNls$W z5iv+)a#Yx;=80MK99BG9MumE6VVzqw$MoTcv7J zZge)vZq`$lb2pCVsnCt7yM?>T)4Ht50qQnZQc0Q6dHDw!y!zbvG3YHdu$L|TI!lCH zOGq{&Z0_dI4|zLP*4OmD9wleLwI1F-FHM=4&mnaV7?ZBdy_9L9dg)m=bl-cuvzyMm zYi_b|t>y6PT2k-rVakS%+5Sxri;3k=_FuJq-*u^r{l7QTt1znkVgf#*2JlF8eoA?N^jgs2nUFQv9H&vlc5>%ILO5kqR9x z>!L)VlZTE_jXIq!MS7Nb+q-1_>L;jN+E4L1Du2M9FGU^O_Ox+sgG<-n62J z)~7VggUTM6^*wR%ZG3NW9iis5HN2VH+ofCnTz$urg75Pb^L#$4<57>U^^~8glNZ_V z$P4=T=Fjm5h-`a_TtdiPQRl)}$fEHW4%U<55e`Cxu^qS{%7WxHfz?4WXg+0mOuBY({GM{sXB+Aa%m<*vYd#zTr-_4 z@LS4V)0>5*L$C1JHAiA`vPbw#_~!chU5{)|{au6mv=4H(~LylCJkReaR^-|0^jGC`$CflO!NfgR~WK zbUgRfHv>LdQ-avKugJbin&8_5^1IeeG769FCuMDj*sMDG8XLZNYt&>vmv--{@+5%; zRaI27!351!RaI40RK(3xM9f4*R76EpRaI0)Ra8Y)R&u|p4>(?Wy*GWAjJqrv3Gi&H zwPmaLZ$-7eTh57dDtjIB$@&ELDx@SU`rdi?Re12xg zwF#Q84xD_gmtN|Ie-XI0Mm#mj=0~AY9qvt9NJlHSA}x}vR2}}OHJ5r2ab+9(MP3@X z|A7vgz0cg|`|aN+>Hn(CeEZU}*cx$a9!PvGi#~~!pFC27%+8(}N>%QYvqOHPkF*zV zW27TvZ}j=!hjFoxgW*t;n3qg~+bhXQ3LAJhyru zJJb3CM}juk=NqV~IGf1|eqNsb2Df!n<%5xPbZEu)4yS9{()hV2S@T)6TV01hgcJ!> z)JsJbK{YS;+9hHMA^?aesHmApsA*D^s$xi{0)(Q52`RrE0i;Sq<)MgT83-hTs7gph zBmx8{6ODZG-ZG9f<_8L=jN1Q&nC}|nVo&|@aen*RJ?!kj}b{HeY0o39Vu-%GW@W$ zwP5UMQVudFYqA83>SOcVU1@1({@ETT15Fiz5Z)4p{*J7m@c5=yovK0BTdb7tivGU{2%^u{Y%Vdm9=7(2qpjUJk* zDJJt(tb@D#kkYK%$nx?0?oVr+-pyBM##c=G#=dm}kZGStpYe(y*5b0iE2S^4RaFk4 zp!_d+%7gXDosyi45LVF&Msgv66pH}A@MPj;+lc5g}9NY;#Li92t*iNlClT$;WAK2@LdkGf{9 zohq09kL%Cp%L?}~BXK0_ZENG>MC{F2Z9S;ZEFMXl_eKE0wtu zS%$mWqSrC5%-<8h+F>Qi?GqoVI~^&^41G{k`8}Mk@i_`anKZ`7n3u@%$XlFq*oTZ` zP36m5OMi8I7))(6*+;piV}q@`-I8fZ*yO6RQsq)=8s_R;OW>pYWyZVPvdpa?r*^{0 zZ=ungpE(_p@X9;zZ85DlmDhdy72~BXM*aKe!b&?J*lGZ2$DLe}p+?69?~D7E-5~&61`0@{vJJ5)Sryn((x4E&rB~p~Th8yTOaV$$lB^7BR2roivgAjeq*G+mc zaSSZ*P)bfMnY>ACN-~t|TAWH%s~~$j;EM9!%G0&1Drt1W2ZPAYXwqwLJvTSWe(x8# zvZUS23$KoPbg>R5D_Te>`;{j+hdB;+?Y8z&V?{@Xl=zM{hU7MMzRGNo1bkDP^qpi6y*fOjj;1gH@{Z0$n1I2q)t1C?5DduQD z^4&zdTkNfszB#X7KFb%ksK};85c^DJ!7@IoHnz&o>7?c%4B}NBg&cBc#xL_KSHT=Q zH&0dmbDyJy#WUNtQe0>$$bvf@%uU-7rc9GEjvAR`N=BHA7mSm*l^e&$0i9a;j~sYt&AYx(dQK z9%1IAom8@WZ5~@Rf(#b_!(4g_ERF}g_M*JOp4}yh-A9Zk_&vVs0$k+Un)Rl@< ztC54X>ShF1{?#LLZ*g_=*j&kAnq=n_3K=>qlyXWsgRW#0E#{DN-fWx7znsm!$!=5; zWX!j8JtsE-(+b0yI!~@AT3^(TeZGpd{r_lUnJvun4%`ZSqqCx=x9ah`ySvDAcZ=i^{C_SR zZ&{A(o8#dOl-PbQa7NWOMUGhXh)|f2KEQ$Jr643yEiK-XNhFs&0=yomvQ|7MVbHJY zgYqNw^Za<*tcEjY@XW(hbG2~`ae7%@g<=W`M9otuHG?fhB?^%53wXQCwjL<-yW5Bu zyH{7`0%Nm)p#6Kyo_agm0TUo-RQ%9n>gOh>zH&tnmk1LclV2GW#xM?GVfRZc)} zi<2Li$R~5Q%U>BfRwBfdsQ1YFZzQurq%7Q}jP0W2n>4w(I+T(!sGXAR73hOtjR^O6 z+~^iIRj!VFq70PEHrOgx<-pOP&2Q zbqT)ThP-8^UjpZIn<&EfD5O#{={H)=_{afW;85}ZAW^tMX#;17(M27y*I>rS@^R^ z*OGaQqr#MZF01-KGOO1+H(8%IigFNKxw*{KMBIJPGq-dS47 z*lZI=EjeJtF(ffq2QTVDVhlAnHLVWyD4iEg(j`lAk{64~#Q4SWE_h1q{S)^Q za~wa8tE)EVRaaANL#~J(97%xW658rn3}3KjtpQCAM$zh|X8h>!*yS%`vdS{H@}&t_ zQ5T@jl#a+8l}dATV?yGMi43jK##qVR9SI=_!Jy_xhG#r?*7;^Kq_XO`0+UJYh<%&k zpphabfZ8wV6*!EUEUT=af6d+>x2f{COIv? zW;=~GKp{2gpoYdyBnlKSV`(W{SK}F`84)OOe~8Gj;X%FEghgQDR;GAP)&ej@Pq!zR zL=_~-8K)*K;vW<|m`lD2dL%?XaZWPpT0@jLRkcRP*B3=^PHG!!gg?85E@_iAiv2E4 zT-si`%0pKXYd-sYk#|1fIZh5-)|Xc&t@d}l>;@xKIZaCZbrwpyNZji$G5;p-*6f$6 zW|Wb`JF&FZl1IWd7nAK`+11I6?)&HK`zxwvp)LFGv->it(@r#jWb1bkD_?g3GO}EM zcA2rYUvW<_e?9zWYB>`&$~Kh*+Df}|$xa$+W6G(=a!t?dcJ62Ya%NIO8D{_SjG7YT zbK3nYYVf-K=%rz5C&>RNztb#73zwQTC=kb4iT*1VasO&Le-piGT5LqvS4EL%TC0R` z)06b%;ZI+}WI7Zctk*m2#&o||F)Lj&`_UFtv3^hU>Cv;dGUU_Uj?K!FM7a+pSb?*;dhL(&D%LIipxf?xG2n(}k7Ju(hPlZbG0*AW1?t^aev*X!#%tlB!| zXzhCMX2tIP(vt`_+GpH{pQcNuAcdF@?VUe_U!K$oo{C$9a2_y`r7G7lh+Q;i7CR_((0#8_U?3L zeX5kR_P64<7t)|xMjea%1s!10$aZ-1wsagV#>}2g)nFWkoQ}@$?j|5;XnPwRFhTqk zR3}b;h0g2NqU1DBaS~5thv8bW`}^;%yB-C_6Ic%j25*NW1IVEHXS%}-OMP<49CvYt zeQd@hw)>{WxXO+Zjbvo0%q?p=-H&`TU9~YLG&D&-OK$4r&GgsG&83i*q%k9GHK>EU z%$UBW3Vn^7v+w9S>-O`N8&C9sv3S~lxPM+EH==XTwxP|$k2v5@|-hnvCc@B6h= z{0?aG@#i!uj1z1_raaF2E0M2;oZsH%JWe0800`=<9WA8-DK#b({|Ds*)~{iovL@L;w^m5_i>n*mLYou za?})vAsgH9TTKI4G8NWxzye01C_m0Kwsi^$3^BmW`1KKF(s0zoCWrDn7AE7W!O%ZL z9$UU^*nKx^rV6@|9yQzXJc@4F8u|HPkz5*>TJ1}{v40uGP^#vrf!WgX(?|PCFXp_QY zU4yqWziv5ky^3Fy19Z4aVRY`&SH{lE2eihIn!1T0aQal`vU-hO61CljzE|0)XrhCr zq;kX}s^n+IB$9u1Ja)Rzt{G9>V#WmG&B$^h5=wgAg&M%0Y2s z&dHKoPgLV?q)3FMqkoz|C#St79P#y)PU6Vx<{bXwFnQ0|%#}lJQO~S3`!ln8o$1_s zuQIGxhhVcg+#iyCIWXnv@k~DoTNb@6!ZlNAYg{Q3b5cBqqR4H#Ya`cn?Kd_1jI7N! zO)%Y4c3-ydun69NYx*RcQYx~=&dqIaGWFcBsGLqN!8o{iIRQkEof)RYm-rfq2>cAQ zq|dZR?5fam4BXR3RVR{cu4j4oYj~zZ?9QGYO}}pW6v8%mZrcm4!*$h~WEXyznSPqE z7!oXM%KHV7oLLFQk<5C%kEr?+zDib@qKNeHKFzq5Z^75q!{_e!{aZPd?=UfzCHGX4 zspHGXIe1Z^hN`l#)PKuu3+q3V8|Na9VCEYS8FxXc2?+?z3skJX9Z@E}miZi|FcwKw zjI{*^x>7^W0U9JLEKgiuh~46$Y2t3j@TG3%cQ0(`+CAe23a6l}3OkFijPpQI4#}6d z%}_i7=A@W2Ac%90hk3}g>$_hWKe7HJb$;cvFDV1f&TAynBazNYU&6=5G_QU_Z%d&6 z6JCkF#&FdWLLL)ewtUF0jD)+WCM<^vO6xyyuI~vRg*^W>nY{hg9E7GlNHqsfvSuV{ z`?NKCv@C-QQ(G+1nt?dv-uPK=Ep`T#n$1^vftJ@D2s`nzwqX&vEJVkgJ79@XT9ih; zRaCR3nzpOp^XiW|oX21DqVcYL);+cBKVARFy?XWEs$N!g&ozEe;dw855+C9~kyn-s_k?)BGN_<}7?X(bi$__(cZQu!cruq&LmNMlf!HS!1t{LRiZH`*aQzmw`H)hT( zf{iM-AHlx4Z*NoKpPmX@=FO&)nK_56DfiL-EzbJ>(fcl_)|aM~9TtH0ywVlY8QCu{ zj}KjKkoVzdQo3K=xS5M{c-j!T&WnzU-HfgmdyFmNYF`>Ibv}M;^bj|C!$V=%r<$nxodtmz4zqq#Zv)Yv`<4+5JlD@ z;p&I82NG6Aa(3XYF%{V3I}R^>(=<8*5m{M+zW4kHDx#N)Z|U}?vHJ)M13yf@<0JnH zdWh#W9|Z4|`X#kL9H-8--fXf=E+a1swDF4548D5BuA0pPyd}-^>B~vZnoDgPolc=S zf=zp}SM%je5$vUvvg)dd9n*`-O<7|LCUh~$5fxT&08v1$za^@k^){h)=pGppzh!l0 zV$_-S=S6!dxjb@7@5EKICSaXWSvZ>4i^!{)j-A_zZi%-0<+E&27D39u=R;X$QfFMn zn`;jUV?S?~d(YJSHSMuF{3<^kZcRSOkAN;I|EZE;RH{xp5fSa`LM!lPm_-`dF$dTB zbZS7Vj_@phjw944GLJF;YwcSyAlI!`?9f4ZlcK*BJ0KRRC8+_|%D zz7`V--v=k)aJ;(U+M8=4X_PO;L$+c*ThcK>Xg-rek%g@MK9uyfh8lVv7EB~d{=-^$ z?ou3f`hOigztWrX)Pdk}jfU=V(9@Gbmi+Ppmqt2VkqeIirfbf4dpYrir#vpX$W@^Ss+q&toBSO)8(t ze?PPG`ANimyYE#UGM(t%zZ(iH@Hp^Q^qt$nlL`| zWnT#1k-F97($vg`HL7n#I0=#>I&<<@Zyk0B@*%e~9+7}SvcpM|7>#_6N{HYHZWNgu zd;SWe!@@(;X>2GyaogRG2Z=_;X_NfP)|bS8wc1}9A^E)%Y1G7ii;AxlrVQQGL?>~K z((E!YnUBW1DAkm(T`BFwH?_VSQeoB_@t{!ke5Xw8jn0;B+_To2@(nvJViddZ20M5tId2vNzBzveaNzY zYt?I9{AQ{8`q#qC(vC}1Y~OfZJ_q|sl&s&=-FvHDPIY~JejHV5SFUpFE6%Lj|~aU#Vtih4xM&1}sh{vfJw@1%CdY zpM-ifusm@bJq1Iar{;@C)qBm|CAmst+QfWz^|{$)Urf-uMAKPytI6eNl)X%--FxOv z67{2VRlbP%5xw{2PL$U>=DOs`rNfb*M9IByNf#@M)Y^$ccSMs-LNQnyYg{p<)c<)>`o24@;tL>kmil zGRdzIsW-~b1>av2?uydqdqX(*KaH0<>NuU;+|3-cQ;HRK!pP9Sc=;< zJ6k;Q?+^K}f9_scPvd=c^YI?k9@KFR>$BXh%;SvfvUR8~)E)}nXI*X*H4~_K_mlHl z>iN53+VZ%%AY8hp^5?lwZEt1Xe!YFGtx4YRBYOJ_sl{F^T~4z4k2B9&b$qEa;^(EKG`cyHoEOaH zF89@GSDDtjJJ(B_W4NcP8PT!-mkwEr_dc$*x{_{`{ul9H7LEF@SbK?Ue;2#H_pGJG zlj={et5Ks@t@64rFVV~6;z+7w=}ExbCLWWV&PcW1s`A%O*0+?Nb6Gj*86*?bo#@Dp z4=v9&WQwDweG=zcip}Y+u<~jY>(WNgR%=BdltWgM2Q2GCqkc(qWl?a-!juF&o}}Da zRjoI*D_c%9{-%6*IkJiO`{ump^UKlY9{j&8h!S%yM;3}D$~P?QIqz_K?{H?go|k*=ch_k-U1`$p?Vf}}q>A|0SJv{%>$tZ) zH&?wzKBo1m|8IJ!ooo@LOA1=hjOQ0vS1hu+sy1UQ=WUM)ZDiu;e;_>s5Dwxwq7;c< zUV`rh6qV9DTeQLaMd3pbVgvj9Cab@<-z#fg-EYcM=X!bf$B#!BkYQ)4s6bFgO?xrzESECa_%ZSKS#}c9si^-00!RZ7VR-vHa)X%YV zefOzl#UWN557BrSd6k6Lsy@T-S~hej@Z3eK2J%c5bkA6E0qK-VjeIg`cfiFYlr>$9?M_h1hEByVM@6u@^Ptv&j`KYuror%&OV_Q}qfYQ5{S-q)3p3dre`uKNqc2v;U$ZMRtWJuq99k}^>hdlK~CL1f(N ztV38vHRhYJu*#Vtc5wUbjLIus@j-MvrivEATIJG1$tm!ws7#VEw}r-l|s0=1nRb`20wmrd9IFudnW}!rrh? zvOu1kR4y!6Q!y*H*Q}kbh`IdvT&-Zvy<#=rG;=BbzXe4drmrimS}V^y*CfAO`qdgC zYBSWzH|B}%N%NCk(bM5WLX9I zOtNihH9GU@w54o9qYri6)V|HM)xDl-5bD>%2q88CA>tzkzDUbgCoKxL*$<9)N>^W2 zgO&G`D2faGGJX;ZiwVv~hW&#{K_;6phBbuE9?FYFjVP#>geI<&DjTD6p=}(#!z}o2 zrb6779Y3V(*LE6PYo6V)8(uP_O=+Y;DD7IyUa(V$clfIjJEbj^UBBPg3|}dsdH#wSgvvDu{oesHwb=g#u5J<;!%GbYz*@)fwI~lpp%#PT9R1539Z0KjPP?e5B zh0n51b?PE=qsB?1+KV|ITHdqYSy+p)i{ksdaXOC8x6v!MPabzg^d~J&4)eh&&TV=$ zR6M|e^iJqB&ZV>*v`9rHJ4uP2W<4JFXc$8fBkB;;uC9B+?8G@--Z4^Xde3Twlx)~q zT(ZY0(oJIAXV;sFs*4I>Jp9~u zG5bHS$Fugk+l0+~sFWEDY8WJg(1Kwf=1qKVOiQij%Cb}{D!4@uR7DxRA*3btWlCcZ z)KU&QKQ12?{Wt#vy4LEv`^$++CBC^VUaZ!p30s`_!_L|t*y#fa9|{D7R6gb(tsvr8YzCRsQTS2$>H_wdZVg)6R4~;UH0Ah z)|GOod>o4&)oZ)Nry$sk4_zZ#rCocwDFlLv;n|#B3!}F^a@%bcq9hjKnG(>wcuO%G5Z}Cr)tKV|jNzP>H~yE!Y!u2KUWD!4ctg_jb>ba^z(^e0T=av^1U3fs{9_V8;5xFz2ZyEA=K8zKYN+Og~ zHB0zs&1A-qcQ5hZ|cjJ(!#g0Fw^ z)~+F+xwC2pLO(SkY47^FoEKPRLTgmyoSsS6QYVpg2B{USrH*m~7D=$lwt`H^7k@E) zOQC6%_;A@JgWXcO5?XAf*6fL~K{HfCI)+ku>K>hGr(rjL7Kgd{CQh(qTMaA&a#R2Zk+6QHC?ZbI;B;NgKe)msjj>wBP(fQ;&8a`CoXC0E?d0h z#9Njc>@l)CVr2B+BEG%Z-jet5<4C@_ltv)jLBC$Py)IoJ7kamL{{txdC@E&Av6*y= z6$jC;M*kfnyPmr0cl(`;PnddOH#EqH6{ZAH4lR8k@~-ZGn8w?cOC|hYRjaa_xH`F8 zjEcOpx^s#tm`vMW;bo-d*?cKqHt!;G!g&&d;bdg}t=UFl$*uiRN3}#V*SDHo24&lp zu5P(jWf(ZQT}3ddwC-}LG&*FSSvmd6c!;E7W5ts%mOaF^a@kWTG`j~+O9U>zsOI=} zp^v-C@_SD94%f&|(%}Ah9WO>H*$PhPbok7EXaQyuvgkYcZm*VamRXN^ccocoXQE5> zUUS6GETz^9Lu5f}(6pjroIi$A%r9D)Rc%0VUbnM)YzzOk8B86k;5YxUpe;Nv({>)1I5b2NOX-b|Ad z9A2Sw{?7^W{Jy!I;r2YI>V1Bbv+VmX?>v7;Q+YbV`?V+M%jRz-)z3WG#4Y40T%nKf zLwZr{VZ@n*Pn)TFLF_+vg}4a{DMElvYMF2;C?r3ZB*;+% z^>u^p8XuhV^<+L$Jv|hfe#)qMdOLP-ePS_Fm|oN$R}nMEpd7is83da~WDHtV+G-36 zcdcFCInYf{mEC_u)9k+k_W6I5H1Rs^+e^xC0VHpl6r>{p2}mBIaf9O;f%U;a|Dy2f z{!dqCyifGCAJ2^P+#2DJ8XNr9%bZPT(*pTwJ=0?X3NmN{3)>{4&EHZ_8Q9#l4Rg?wN1%qbR5MKD9}X?mD8OgqPp`s$}OhemK3Vg|!}I z$`VzH3M;7$3;cTy>h)Fl97~RuVTc%OzMmgib*$f&Bb)Sp4x47px``zOGVsfFvcI9( zvm8G}&fWpTy9Yc?3o-s2g8e}PNd7*StZnPS&>bNIm`f{2!bwF`fEXf@Aa^d} zrVH3Wm<%Ay%+Wxw5O?fG5zA{901`|CX_@|2#QMuM0|ur>27&7G`O3Bi&$~txxh^tj zykf(RmtiZ>W%lXx`)up8Q`}2Y=NK0HLjM5~{qPwF;Q`rR<(YfowdB#OJ?ACt#hKZn ze~Y6sXY%dCG7up$Ot$|DF1Wi7fgVEopa_`{{XO=Gzx0ac=m!_TK=BmZwWCg)_`Z+Q z?rZ5Q9IXzUp4S3zay!6q{>)!7AMp(_o5j9+dB1u^0N!ywjna(kn%e9Z8qle7d0A&*{gR0$itPmz5OTOB-qAD+KU z{WrDD%{t|3>|G{b71LbG2@+z5jMfL^5Pmx=^fLR8Wl8w5Nujyq`ztbf_;TyZ$n1mH)JGEHCd|L0lIVM&S$ zca0n?_g+0k;b#hib;Imq!J{z$5Um-#Zy~rU)S?ppsg1~xw($P5l#p>5sSobqJ3fjK z!5>5G6MVVrq@-E1`UP&ftZa|I-n!CpbOcyR1P}62o2ELb6m99dZLpuj{axE;j2wu6 z5hxiV0ZBq>Zv9<)@xLc}d)D|t!SA5>=<~1D+^Y6;%+)#AX5~XL$5+ddVZ8i2SaXra zZlyRTP4*KYGg+btKJsEAiIdP$3;g&WRhOrEgfpb&Sc5^!P9u9LS|Xs2>TGKX6CAWf zgK*=?w*JmT#Sn71*mh&g(mKza=Yw1RpPJJ8Y@_-6%dh2kNe9J7w68hGm7B%;e(qxv zoag)R<3={mm&4i5KE1S-Qj>XPKIZI}G-(&mD)-+K549g7An|{}#HE0=byqHr_B%UkLHK-npMjnn#2=WqXg41c-epMq|97w z``!q6{#_BL-^lzvuj}akxSq?LuiO@Ji6^4$MVZV(~+gUAK+PyHk-;UWKp?=n2J zBa!b?PnP-hfPDL*g{a14AmD~q@mu~|o-%kKJ1;we0y;4_2@}jD7v+v4^zk&BAR^V$ zG;M+H6m6-dm56*1MHmTaqmXjmICr(XmH(VPiW%_08bjQl1c&zlK^6wY8|=pu*w%lte91 zkRN?e1gaLG357qu{g@7fhX~}HgR*L$_v*X4aqBa)<+AwhPAKOb?Z_OIxSG(EQXhoq zBJ5ixBzprxr11}9veh)^?CFUPT!Wi23VN!lu4LO}C3I5q6A@KW5Rok~fu}?fOjMx{ z3hZ7bx?-t9ZdwWksE~a-Su!dJ^hc3bu26?N8EUE;V2kCAGSorizB^S_RH~|~s;a80 zs;a&RnP})phu-d0RY5r#St`a4s1Mo-e?i1LA{tYgG1{(_59-&-U z)RIXBkpF2lz#3SAkpdtkh1l2-2rGLN;>n{&Tvj#R7~e>N)EYFxU5MaZg?JE6fqVzz zKKTy8-TMH5#RWic0mTqd1VQsS%~o)^0yCsF1O{lxh@hj~cbYW>6+Q9L&p1wT=csPN_l~z)Ff60o|3mb{LApczl7X2SY2X5YTh52 zA!(U&Nr_dRC&}){=7}Hmt8vvZ+?vY65S#xOFf-ZYli8Xs3=GDK2?!wa^2fJ<4*MOi z*(g#q?M=gj^PXIp^>nbGA9W5RAFC~w14y0z3i@xCJ+Y%CI?LEY|20OGhE*U&1X@O68Wjta75H<_3$mSie8rn?+v+bVBV@toXNN-phS`9bHuF<8LA6BOQuO zwvr%;x>8B_-_d#?r-N#n zU7>E}>Gn_L;qq9qh1Z>B86HoQ%jofL*m%5H06_xeBOtA4}n z|8Jw;;{VtEKi7)g`#C@J)yd2+C&~X_-1u^Sjy`LzZ$gIuF0-X=t9SN(izbpe9mzk@ z+41@YGz{tSH?A%4&*$g(czUD#1s_WrEC$<1zkex6TnfcBC8YEtoCE50sHIM_uv zSLj|!^PB#!WXx}|a&-7UXzcU(G3)7KQLEJkF)k0`U&$BOU7UAbM8$Eh>D`szHFI|` z++@e0Z+T zU0Sf~dUN|bytml8DcoP3^S4%S7TvPfES26*U+Vm~@Vkw@FW0NM&l>plaE@&|x6XEP zmR<{;VUMcIN>J#(@YdO4cm-&d(R7wy+l;5l*B9;Z_k2A3K2g1Yqtie0%D)?bb|~pL z?D)$#N0YFxAJ-iI3J2w57{8SLA2*O6ul9ZbLsRvL6XuTyRg}jk;Vy}NIsQwEWF#*e z+TW|>oQZ9bB$^&VO-V`}%Ka2@I?U_!U%Rujf(YVG$dB~`5a55e=&?`imLOiRhxEUW zPuT|g&hSO-q4f|S`u>3T-}SX06BJI=kYIog2GM~D-3i(HvB+8jEQ$lVAId|NyFwqH zL+d0xGMyqMX~0lLG3yrI2*W&JdCyJyrHAVDQdCCbW7%t99;lDzi<@a_UieL=O{}^n zJVX7{{Je9{gMYeC_+}r1+=HPrW`NoJoDao+3d_G&o<3>-lUe0w6XQ$RcHoEVvIC@E ztUvPnHKWP_`A_&_VVEfWOae3@L=yr1q=X3{(0V=}nCLtui$8|)!Su{Ue?{j0-`R!a z7y3 zXiZC={Q;qS<%W$;NDv3R=IMg#oH3X9#6yO`Fli1=G(*VvdDjecE^k3xc>7#+qlKDH zpml;hky4_+?Z>|XGzESirvbZzq_l>RJ_P;JypV%<+K74BTqVSxqR2yX2ewKh#{uux z?a-$(A^`(|DroqaItUMu6yy9u^9TJ*d&ns11pj=x_{&w1g?;&zU(jGLkpO&PPq^8| z2xL_Bp(*vrT;cmYS^0qqyDPxh2SFl#^t|vyAN}J9iKQQve|6_H7!fQjAP=1L<<(h% z1VhE2{hNhTNAeuQq2Z3?L9q~e6o1-(=s7rl>tUp*Hx={kR%q}F!MC(xiA8k*jdXe!c`YZl;6d!UM*6~4psDb%E%lFzJ zqwl1AJn2u%1p?S17=zL&-94=AJ;gV%?sFo7k_rPtJ|M%+6i?AFR3INb4oM)A^Fr!v z3PnHn7WCjQ2xgjt2viUM2k;nxb)yOFA?XJRihx4~A*Pu@K4=x^dtf{WI^d;3A~BCp zf&S^YsnTfwmQGKY62mA4yyQo5!82C_|LfzjI+5huryyCfK&Cd^NT*)hiZp<5)O(Nb zJGT?^nor(BgZN*Ct!q!IPxQ!WU**0&`#TS+RMUEf79>2-CT zRK+o{ae4=wW2A78x^hP%)_=S>zurQh8}L7$U%`qu@7>k``pNc4KasW~opLWYU9mGI zbD3dDqE5IK{ZN~M2E?d5rF=$}`as4Hs>BY3Lj)nh6H0x#pc4|1#8V)UMG#O@6tsa< z1tRMXrsV)0fCf-rxpWXI^cOM%P>*1cCVv(V3@-*y_CfE8S|}>0I^%Zh<+rO*v_VuQ z3)VpJg@|HKs1W$`{v98tA7FbZG}GZ=g=!{&Sl=i*gi3-&D*e6H@u7xftwU~PQ83Pt ztM6cA`0{gqUyrEy{}YcIegNy zKlHBbX}>QD?pIi=_h{n+U-jF;ANLw3)fJ@#HvCy^k9M z$nk#t@#Q{0cTr)9y1)43=F@3N-lyr;Tc*c{i}WBDX8Ld^vO7uc>M)yYEDki^0L?{u zs@*0J3Q$~`v(d)Dq2MXiGrM1+2I7e~Yn^4=b?fSu(hh@NO5t~BP4=z9Fy=aqbk@v) zB-1s6u+DfLl4jW3Jvwp$1$q5b4qW#4_;j}A{JiIsMP^{qN;kmQ9!ug6_M_huK?1tm2@NGEBSCdEsyXE65 z@*v-1mRVH(9^we+v*_0^el2<0ve3ip^vlYdcI|7w{vQ_1+5N8F>A&HsjSBHz?usu8 zqxGCj&RJYPka!$tV1CiZ!uKeps#2)z>zK-+k0o&K)DPuFclS@_mBdl1!ZBbSM0S!Q z6N%k~B$y6=D{lHQsMcQXBVVRo0ytC8;_yanzu)9%k*xJwBk6OngHfI={RCq)!V8+3 zc{$}`PeBS7ZWXZ>=ad^ha)nL=bsS(F49p;GOb2E0dNyNo+ICppLi6O^tkZU)-*3sn zIBD`BB&F1>j>hPWwWFFJ{n*(i+0XHba$}EoA0B(}!SU2tPMkg~Z54Xm^>tZqx8alQhhTcqOpT(-}vgYtg`+2)vj=2z9)7OI?p`;T}uIaHWCT%VS8LZNO zf5urs2(7P_$)eSmCQ;+}l1eVV&Tp#TjF`63^AtO7#OUPd=?9ApA8 z35sAV;lkjg9_d^ihgrWUY`$3?fPlTpudO3o5lx29NfJ-we#JJd5Hf> zzn!*^jn*A*YQlUY?eFHlmy2@;7iKw_=`5IhP%$<`A2k@$@(7n%X$d0>6O{l`k8Zdg=(;(FWz%HvUw09(t z&EgAL2OV8|et#Bp!;{xrZqrk<6&aZ91ML_NK;9SaVY&9W{N)cOJVv*TwuY~XQsLzs zu0elp!t+?VQe3evl{TvO-8jud(vhVur-xlh?(#TkW)XiY)~?Tk^0NK+-d%MwmA95$6y`zEghW}DXW1_dQ1z6yWWH^!XLj7rng$lr4;x36&)%EhjW9hpa{#+}XMXE8`ZX5x zys`7_*?B;lTd%4LZ`HlIJRa|>Xk};4Z@1YHdoz~L1-}j(W0!V$U%>nKlb$VBD0DMY z;%5_)3>!F4Ld#F~ST)GM^T_cwzP_;@J<;z>YSwN(gTJe9?wEBIv+N?d!{GeqTe?KfJ&i{S&h7RCmO4ujzod;V366^6jagCd8IPUGej+9>` zFA3GK^eZe5w#_p4^|Q45fZ1JIs1pf3r3&)AnC@#RrN%_s!83>&%hoHm?;IuqwKJ=) z_DR*iiZg9POPR@729K~7i1jA==j6j|!NxxK@vO1t?dh7)^y!YOO3kfs;bU_q7Tszn zk;w8wHB!TjFCEorrAQ=#f) zsFTC&==lGRp1zq|dPyXSj9dleG&D3kt=MX+-PuNMOd%{?$UHxNe2(aG)5d#GU7a>H z`e-O0qL&4|Z0E*=G{%AL^VnUW8${WJZsic{A2+Fil0kS~W+BejurYUb^<3A7dtHs2 zj0EaMvKs^wy@GVyaI)MA8e9v<=e9*CX@Av@QYVK}tYQ~BcVSCPb=)&ZOU9`R0~AhUKtyS24&W0O82Bl*|0~O!_)2J+KkXkFNQ?JUa5A;rbyN2a}M+U zxa~SN^hNG4;K37}w3$X^$Z!$~M3d)q3Oa{65^YKj>#XSLK1-CXvhEb& zPJ0wu;&^oqx#a42Ey6FfaS6sMyi3Bj)G3UI4p+1%jO54ZQ_EC9fNanmRj~14&(m3? zTEq}?SVCi-U`M7m(tZ6FZfRW{);^499FSa)uj^|kQR;MFbYN+ID`UF8^251YPEj*tvsl1CkyI)UO*JcZAS4Wu zVu!uQ3OkI9z#F{a*KGtd5(Lc4mMbD#(K1uAlV&N;x>EMp<-?=oD{uce&k2#a{JfFZ zCi7rf$dXT}oo(oWPWXm`cJJr#oL<)P$iqn;P7YX`z^_L@faPv}t#_<3?dXeGl?T21 zS}e(0{}Q6?*7Xnc=x`kodzKsz<~~9;s}tS#Ul?n&5ZfF3RBT*nRohX#3H7K*Qb^E9R~Di8y3G|7|9@#GpUGZI`zqlK{!5xule!lv+xnbZ*W?a zEQl>EsFl17@)K8+LGM&G*^ay;Qp!^?LFwMI`1(GNqXRY`uqVFV|3@@Wmb_F?ou9L> z_hZj>Sl6bFi%EtjBKB@J*-LTLY)A{!;YmsC!iG4Z`D$2|uZymG`ugcfSGQR*S>e(8 zt(`koscz-fG!?H~$zjbM2x#XVZoz1hLd%ycwB)9CPq|iaCjn)4u4}j(*%l9R;kUD9 z51Zs#Q@QHNnp|D6sl`rOqdF3w)wzS1{}wX^7lVk>k5%@;=Z-g_#QjyFw`YnmN+~-o zPq0|m&Acg{?yNn{&K-Ygmq{bNt$ku+8;qc8kl@R?@{FynB@8A#tx*CTG*U)lZxzxt zVD{itf=iiI5^h|IR!=<$B;&aeAeB*?l1k#n89QJ1*%P?3yOVTwRlIBN^zYOlHg0;V zevgtWyZSs@7>j5GAi*;_9WanMnTZ8f^p_J?hYPE?##@gfo!Bbg;U-06#W<17K|AcS z}I$-i=<&#<76EHtdlkS%z3L83~{g{dtDA=9e#Q z&3*ssL)Iapy;+%kVLI*l`X8@%at~x72`JDZ^}=FCl7v1H>~~H?bOJ!khXgpsJFv&) zt9|$%XWj4mJl$HnyAQkBg8}=tLH{IBJSBt#_CQb~3MMoUuy7fP3Ini45K^*3_fPl` zYJYkiT8xtrG#vQh6S2^e31|k8h)cL#B66g3Ehy3yqyD)}MHC6C%7ke>5tj_YNBw8# zjcc#&>naE-5F|y7qfDc;N}AJ;{IbZ*WQixzV91y8VLmbK&~N~0G?ny#embO?-N#Mw zSnUe4hO2$!k3aQCy$&Z|;vu`XW?efPulaAb%6xwUBEO`vr2&YxT0o?#DH;R)5Cm_?2cFMC@^EV<%*g&#QKV&LC9JJq$o2p z6Mcjau?$JT#s?7iDG3>e;8Q6;86m}k{xmXptAVx-GqsSFOfP}a{y!hU^bzUd@&Ae{ zAV0r;(=ibjz?4A+djfB)3n7G97Lgucz-TLMN{c%hAP7o8r=2PSo#PMF>k2?$Ak*nA zR16U4msjfy3|vDBlmR2Z^?fs;MWN5AK=0lC)ZrelT;s&4wZ{7b$@Xu|W*NMiP_eXQ zFbKT-*OwX8rh@>UMCbMo0U7m+6QF}nne^* zG>Sa_-#-z4U*&{(_e{fE`Tb4=!z0Q_UZv`M=@BtFrvtmZG)sJmsyd`ndRY~v2NFuX zg|}u2h&>08nZs%2j(%T6T;85%@+J~VIr16$x7+2zrpncN$IwJTn$`G8)C+5LIT)f< zlPLxTpOqgn&GYG9-$e)8-Zsf=A>9&MHA^T_oB6dmSl$WSXO(TYHrksJ+=NEAc0{4% z2`(x6F7{{U)E$ROQ>g1XgRm$CyOlWPyFI}+F>I~qYb4Uc%L|ak@bHY`HVYXZ{--FL z(jk0A2uo_p`zQ}a@T(4oSbE&Emuqy{t5w5dAq=P!GyYoOl?Q(#7B5F!e+%q|rl4}; zaYpvb8Z>*K#G z*8{WS4wDJNN=8?j{8nql_SjxK>s3AMID)B zn0Wui-EZ~Qzll|TZ0`@tzeT{hFUyg9)#vpuIAeH6`h3v!;x*?)@c_RQ#e zed_!AmAqXaJvrd>>B$QIYkb}AQ=a%erk>hOf;gSK#VMC(zok35={Kg2N!?hZe-k22*e4GH_K4n@kG$)*!zE_8NX^_m*+g7{o3HD< z==lC$qj8cDo8=tzjE0IOqY8lG+7FRLe`5JT41^tHAZ^AZCEE&+fe184Fehzv$PAfglax?9xdNmKhSHi| z0%&f;;SSgr20-WCl8bQ+LBa-&~Oo(p28vH?L3VHt{P7^iQT|(g59~b9k(2!b~*hbLw|L1d0{$_t&AE8jRAHnK} zSGkm4VKrI2f5*Avu(5Kpm3lbz_Du6yOACA9s;jheuqT_mwWN?ITAfv3kUg4rI(5k5 znNKpBkL%TSZ<^Ne>#b?ll+RZAoUo$8#4p-Dge?LZT!!`(o-G^H&|XzFd0Gn9u4^_A z4v4)$I#Rcp27*N+=7?JFtzjC0z^7W8*}2oAQiUzJkXA`WlT`+llo$~LKwza(&aqn51x3@P=i`hAgl{{0cIl0y9b1AY)kWk5r zxAzzDM=P7(bH?XH&1tE*Z?4L{X$sD?w{^+do^zbjTXyGs_p!U><(pGZYg5g=X2Y9VimBxfbsUljlwf4kN9(Pc-em1=jOj*Qb(*W@@^?>D zn_T9y6B#_x3@0_}dfszz_gkBJqVBG;lDc+M+h$gBiBU-^1_lVj;q2Uac70y%H3see z)%ge7$HC#$zaL&6!4-+U?@*j{hHz$K#chPf9~IDZgp;<|Y_^?$Cde zZ$HU1xs}NI(K=aWmNkAxw$Q5zyGg-(Zc_S|2EHk{cz(Seh74|b&}bSs0|k52_(~x6 z1|JX8$1}e{l5>~p>$^5KVo=mrSnLL~`{k>g^_?g_!Hg{ZWRn7X7}SJ;2o%MrF)5_c z{C{a5iQD-@!rOq?9>^v8=v8WtxLEnbK4#ac$OY9h73-uoFS`sF4n2o+hZve)d z&UW4334>OGNJ=5w0zimE#DnoTDCqU+zbr~?kLF7OH+ni!C+;>M&;3EZBhv-Q=QNd3 zFc|V(w#Oi~GftA4E~YK0l&o&)8gP_=NEawH=u2Of z#S=)gWZD}RZK7j>2SAfB?2S2mU!A!ddxXw7Siboj(9XAyr&3qLI^_xOZ7~#T5IjJHUbL7KY0eYQN{p&AK&qZ+;yPvGxG)=COj+9ip67`x+#Z?ef^|+kwLR5G!YMQyDhckSZK|gEu=q0>l_! z>GRPalvF@7l-wZ|gL)lj!K%Fk$S%?vQYA5~Ls;6j_PE(;^7JJTA&`WUNhFsg_WWlS zyuS9<8~@l^Q;kZEst_GQCNo@3j);SpEhaVNZ9&`!q)U*89jtopYKm@}8@!{9IuMT~*)sQ}IXxQB-0{3F0H-tr?d(K{|MD8%z`VI&B(2hqh zi#~Ez+50~!cULR=bK%lhR|&APl%)1r+_20_D^FDAZw{(wW7en>$!w6fL@P*0sND5>%}VEStexud1PNacq`dA+k$lw^WUmU*T3S``Hx)XbG_kcopmGq^*r|fFE`H>{yv|VJ>FzOI@jde~CFbhz2Q2jM{@2Rf zdN7xQ3CH*KNBGLNnxmfD)86r&Ib{xSocd+Hugfwf?}l`p(T8SptsbvSFjF_Cr}xwC zsot+J&Sa7#*!$P!R zy^_w-R>wDni=U1XFRjp*JY6bxQWak${_JzFTd!T=@2IxjE-U3#-ZII~QTyxr>ZSkH z7gV;|+ef(yQ5Mcp*ZQRbr+BV+No^CJm( zCw!|pM4j!2wvJI}oleZ!q)@B9plZG#iINn){<%bvWxbZk#m}c}LepQl&flBrt)!X+ zm2z6o?$5l}_xAW0b)T0;7`-+&?bDwZDOJ=oKeLq+Uw!NGt&`85b?3zO-@jD++pH?r z^?2(>QKzrx74_?tf?oxamreJUX=~Y0^-5+Ets$4a>1}Fiu0jga81A*JetKs)Wn^*K zIH6wD%u+qENp#a)Wytlet!^S#QhPL|-#@36ef*PdrJfy3?SAW=^(Wz*CNmG=GwQD| zb(_cKV$+rWRr&hs3f!bf_iu*l_Lmo*$K*ciw9nm^li^4|Z>v$pTI`4p zLe93Bl@Y-+zoKS2QN{wFbg%nFo0n8xWzBG}N#!%I4}@6c$oTdhQ9|Me6g5x`-&|P(^ZaObCt+Jy?e+T-Kdut7hIwfhm7c zx&PT_KbOE=w=;bGU9zx0F#f3I?M2hE-Oz7C!=&&!L@2yWy!yj!fj@Y;AD&j{%d68W z*=+19J1mtgor-0K#cb}%g|=yjy=n8`0YsAn){>%KwKBEr%Nj*-eHn}&7HQJ^j3kV3 zvm0@x`LCJZvy%RK%HJ0!n>jC>b<69^%;-@*x+ZDdMrWOc(nfb#eYu)t3SlWUdu4uh z>7)}biz8L|)Yhtej3;rH)|zSCIJ$Kfzl*s2$5!2Zf%lo1>CQSmSu`;v$f=+btf(=u zhl(Thc&yF+9CmU|PKuPJHY#%%``nU46#mGozvh&pbtIzU`I=hW(rBgEf4_`v|e&3_l_O@rw1E({?uc&tH#xC&7#xiBjbDZ4WHXiKv zgpJC^ybK&gsvnHI&W2XkB*qNBvi*VJ5Zxyc6oLdjiVKS}nQMj5I?eSE9c%!` zKyuhWFE3XR!KM^+or$!9kLGuGc0!Y)Q4z)n;2hx^VShwGhv|1pCC<}N0!Kg9s}^s zY~S)h=l`1jq!ngDEp(sp^r)%dOMgFwScOGYOo}P+nJo_`e=Ev0ID$ozG%s^Rq#~J= znAA)lMMET(mYB%-O;jeGP0-|cRY+Tb!vcd#gc9=ARmfZ&f9wC&av2gS0zlqy zcC+|E{1+z}ME|$Bc#A|)CX7-O>%Bu*m=b0?K>B@$|I1rmztDJro9^cuzvP$6Ih9nh z0?Z{{-_c+A{)>N#Zj^ll#^Xi)t28iO^?1YjA1C<#V2}s>e}DA)&*jP<<^$(V+=g%O zGywR5#2?%O%7O3(1^z(wq3JvTGI+sG{=%xk*`k6)NrHwTQSADI0>T6cnhOEyi~qs= z!N}YFp^_%Xq18%(dG`@ZaVgMx|FYJF;zIVFKezO3Zhs}D`l1m;4in|_{0ggtIOI~{ z?(SQ4!XhH7DypiWAS%?7RY3$?Y(!O6RaI3gs-hw)h={7LK_1~n6j4P56jAO`T;)_9 z$6UENmn3pH+Tr7_5nSbSk@^fiFy1!^il~aHu1Ms#d54%|kwwZ}J>l`|;ScQ*0y$hD zs8l~4LX%8P$rJ*~&j)m7)dv9wY15@d#6(0zxOD`bV0Gv)bC7wkAL#>7KYhGrpcoO@ zKZ>8j)}MsmyG{0i=7CD32N)ZWEI%L|wn`50$Z|^x)3GlGFXK`ZTy8j~Y#EGDOb^t@ zN0q$c%48N9g9?#9TQ6Ls*&zH=5S#Ze`l9+br1?Lm@zS#WC{v*i6p>1mFidJq{mHaM z2y+J&UQqd_87+yOSw#YT*ZO4tJz)R}=F`NKY)>bm@+~$X``Gu7<@NIewuYkl_TJqJ z>LRZ5!&S9laPKaG%!j>FPCl6FGgo%8>OEa~bWW1$G6>w{b(=W`+%PW#zexN`z4M+^ z>7yb%-kl%oZX6FnG&Dr_xMFF0d^_@wtNIh?mVReEGwTYUULaV1zt-$vCKByTv2eK$ z2g@2DBGBI@yF4>E43h+WI0>c;!;ohR8|d7?3SU>T^%!7bh5?3DaplU81Stgzf_4nZ zIZ+sEc7fPd6>BXZL>t}+>A*W3m2uc76FTZZ9g zOH_?pguaJdyY@q^QQ>qC(7LG@NJ0+w8Lwv#lJO=%y8p{e`09wR9>Y;^2cL3kmPuO| zM7CGK19&()r`4WMK!f1vB%tu|`kA4W>9ClhqGFK=5>YWCsT72hDLA1-i)t+9UL`}Y z#R0>O=zSi#UN}!Rw1kpv=J4Z$h6@};vL%=-vJkuh2nH!WVcT43=K=q{WH?+_ix+)= zXI)hklvP&Y38p7^aSkRxovuvw)PYnm<~aF0k*-$5p0%3K?VtNRU2rwj|Eq*lr%dRt zy;oazNbh`}3EQnreEuJY&@rDA51!0sw&U@DxGHXO&hnGu*uOc`ohWYm8U?Cs)$t4(N~NNFqPc&l900l$Y#C zAnJlMdWU~L+FvvP1}-@a(FS;8?r9pRFj6r==3a4~uNRDc1RsuO3bb1wwrQy~*G+{3 z7{I6x2ne&SR=BK65Cp3yC8065EeKqIA;-(nA!ft{_3inAaA4?eW?SrvCX36AEI<+` zBX0WNhEI040TweSWp?zgTd{<-_0S8;AB(H)FZ#4~B6|`SM_ZoD8H__YbkdVLhgHK0 z2&B@zjA9ZrgRwuM*qwHdFvX zVt@!ebT9r>2eErIp&jyg1{>||Hqw*LXpcSk&ZE5Eaio)P7k+i{B5uRVg#qPXsch-4 zL^VVNrffD}AkZge595;j_|O!!wltX|v>&|(3uy{P#5Tjl6Y4)f+`l0XFwAoGonavz zggOKvl%gGwK|69R@Y#l)sGwGRG~uf({&4@tLXX~kO5lfz`oqiMZ66Ovi+G6;w0iKpx;s0b!ebgllL#=;i&hVXimt z=U+Prd#x!w;;`lL>+t;^(b16lUk@6tNN-M##xYL>rK2+%Ax`OqH*xr}mdy|SF`=p_ z8~c9>;81p-&XyppJbRb@xUX2jgiD5 zo4vc6`!}5F5RawYL2o__Qi~5Z?;hrZUhpbwguESOaZJv-geFM`6+w3^4#)3aAgKSL zGhE*z7NuX0Rbq34J*pt$GOCs7xrZAy`Rzn=OLun+~ z>>QMf6x*jYRW*Vu7$~5Hm5iN!ZPVg7(wH28R}u*#$cBh&#qQ0H$T_=*142#;mAQc5HPvPlxi6Q#$GbBL>#~8or#ti>A=6io%sGlPE9V=|EJyl(8Mh0#hq>#zp&=}`cLbmcOs?xjBl7kyou3?k9G>ua zvQnyR=)&^r=8s$Q|J+m8burz~U}VS-tQhejrV~VRxo?QE5%VtBcXz6S2r8fcxCH|qL~3Xux7*>fIGy_tt*Bqma?Mp(r+K|NQhP%WET z*Y+1)?f0wh7y*ZiCD5PTC*T9RP8x(~Ev%=cq7r>wmt(T8iy2$9L}0^g(b=2iCHKHx z$nNS>2LT)IE*JrgcxjyXfjyIy;!>F>Q(D2BP{=)4>0EQz0iaSS(56obD`y2K#%BkB zP8Yknb(llKRy;$j)BEKSof(bsc6|Io6!}z?K?rh!PI342VWhVeRfeZox z_UW91V+T4EuEtLx_PB{y&IynJ z_YfhfC@7dU9cLHwAGxslJ6VVQjCxBBj9x-j_dr4mNw z-fFqv?%U*<%pdZ^W6N`)H<>fRkkUY)8>!eK8+*ScRbv7{&+vw)vjM_zrK0`Rwqzz{ z7E};`IWS4X$bv-d(V-Fn+Q9>xP%*{|A#n~DNb#_Q$DH4ZJBFhUx&;`UO(5KJc|7^_ z?gy8hK5NS~`t2KR0tH4OhANuc(o~eQn%1t(d4-5?&Np{@T({>Q^)C6%mE`VM=if)f z0I^;v8!-Do&Jb>9H}lyu$L9JV?(nm=z6m6n#_SqR-~-OK7y+!<4jcYiIIIF2p@|nw z(?;W+eC>Y2O#^ZLvVOzlE>mXs6}%Bd;vflO1Viq9-Yldfpir81_qw0qe+#?;ejb5X znVl0vJ8QnWrF@OTs>+~b@b5@?PWirlk&tGXNLMh7Bf^C3BlwBz%U!#*6jl9xvbipMeAJoX~;cw=^JhCn5(W=c<;; zo#M@?%tgj5IvNqBh0>EqeR(v4>3cDrpx1KH*AZ~pjjKIL-96Ti2|9Zd<`~OJxNZpH zB<-qf8^(D``N%cvM+y|#iq4kje4c+n5R__*@bLW0>N*b-yz%4TmC2j8^%8xp14NKK zLll;AH*b|f{aT*3N>)i|N+j>EeZywcwgVNxVj>t=Wx@AprO#|xewGQul1z-<^LI&I zN+#K(HTO>|*`}SCQ9F}<=D_LCoal79jv6sLG_mB)$cHeB($@;!?loF3>CbG^rk7l5 zu7qV&obRU0?(A&XYkVfA=s?@%UzRVPISQoiaJOw!&e)jI13Qc?@yUjqoG5E35GwEMo(@0Ty?F=%l2&x}RxiEuOaFEhmY;D5ay zuE)RPwEW1#_XJ0OI(}+Ba{pg(2zG4Re05D6@%-DkO$5ei6YKJiBI0H0b5dYzE|f4; zz7che{?tN>jb_nIx46W3cMknwAazN*JC9}qe$)v9K<$TxOfXhMnX@-JsyO>2T?QLZ zApGwc53efU9@CX`@0WFR1~~f8(A|7WAxav?pd-%&Jyk`kiXNFbVRYk9;nn)J*fX_* zlx(-Ao5(pBx5_Il5pgXr#^(rTIma+AUUIiqO(CWZ-j+{$I6~C^px<`&#-VS9 z)4&hrYdBfR@d6Y?MxY({Qufo4*kceijI>ZBAr21hvs9H;W_2-%B1xMRu{GBGM8S?Y z^iF$x-B!|AcnmB(?xH|Rk zzdYd62B3bu$x9iSiLYYC46$nATk(q$cYgM%b~wccjIS!uDJOVnh`OdA$+LV@8DE|% z+jE{HWEmMlL)bn}*y1y1mDoj*EZArb7cFw#B2b2rVXCDgK>Ee2JS4=JvV@ipOnH@V+Fkd*DDflmjUaO1{S zO`qwz_jt?L>QWde%Q&$$y4;~9lfza{o6BPzXN=a>ELIj3CWM|;5$%6YLO~GJ-krmK zebsX3^mV*puTk<0FA5$z2yBLNs_ryBLXX(YgvSBo*Kn|E72n%y$1Y(d^IiSo_jVK? zgpo5OAt56vQr2r)jIJ!@ez(%*x-(esFM)6Ef^;grx$ynKa}*ee)P6$La0U`)VE(LH zSXj;9i7i|m*1j6wv}fN})IB18dw`9qFVDlNwRz@4SHET_3<+u()5 zuT{c3-%EMMjlbsS4r+cgs$Z0I%D&Ql5`J)n6$jk_#T|9u)cm*daJP4+?xr2?Q@0)V zwV4}gxxRpzh)50-$PwPm*;lVo%v3wijR~>{ZDM1U+%3)GVB};yhxlqJo?9Ng74uE@ zDjq$WZi+(hCT7{9ML*DzY08hrq9MNyjC4vRrVBE7mnZlC4E{LLw6n?i=~r*i^sth@ zY%B^@`hjJC4sp-%E~SSgR%T1cDtVE@p4Yz=tF zwXWN_kw~AJxI3h`t!lY7=p2HC|v2P*CbX@0Cpkn3}F2()d!>zDBY~GL{B5=z3O| zg&O+Q)+1Z6%1vpRC~O6^xZxG6xpN8GA;)cOi=~51OgDwoGQJpvc7`sABeuT`-1tga!!@Gy9L`Nv@mIHEq>QeRB)7P)g9wozN(yAn5CW@*g zWVmDd{B!N~RZBUho8iK0sG2IJzfHR=&rGEef{4g$alU%ynUzH&{**H3?@H{0U1B!u|O5u>3einobP2L|XA^pr0gp_Y^9%#__(cV^schE1-5O4$H4J`%d{@tLv|?aq1U@^2y}Hj^uApE~M#W8Tf1o(yy*kcM2$ zjnQ;$+?kePGb3!f*B3jj?|TH~Ok<@dN72XYbKf_~ndGTzWU9WkwcM_AoKndeV{x3- zPV0}Xn&GXnc`8RD=Wco`t7Y$UIJ;@`&oAFw%4@GmB2^J?2!|2sq^h_RI&OBad5mmn zr=MJC_h&F-U+=yXtFL={EnGkQUP;%swH=peuq|)4i>XsW**Z?#X#8vr(~d-1gG=c~ zx=!hkc@wzxhL4fe2>d@Ife>%Uk6y>p2j?P!s-l9bpoyl4BBCk^kg6$Rh=u}cB7z~J zqKMy|hyM)doc0IUdC!0{h=g>)<39hP_j4=nOgT5GCH42o{B_PNrqrt8nyS{N$;qjD z&Fh)YX7g%w*iH2&>Q>2Yw5lkAwi#_}n*g7b@R3~-<^-4q=8k!$m(?N5#iN6}c43!jyW_(v~-<_oLR^+fXJQ zlZYN=xMLGIwc&;@VNt;7w{;yY8%i7)5sw$WMQbfL;#@{nUPUb_+{O4`Txt`@hVS3G zS#Q@Se}&Q3^eG%(D5qs2hC-f;$<5 z^4^=R82MGByS`sOEP7cpyTuW|7A zofz}-{B(2vou2B8nb@nh-i=|wu|BT5)M&qb{so8;0HUMCF!=n~Yd>2CcM+xDf~dVs z_vUYLzMMhY-%KZ?(%7hiF#%~Co|gA`2FQr%5dowJ*Y!VH8s$#M=bn1y=LDrQgzDWu zkUL^k&V@g;sQfms&GRlrQ|{iOvXPf&e8-UeX}tahxtPNbpfG$hXl-dEv~C8XQb{4r z4kr=?bqSqpWIMmmp|nSzXb z`&FL<^q9qD;|L>;|eO*VLJ{(2H7ufvwN_%Fr~RLY78?2^2^x@XD? zd1sZH$29XqI9{5M?O(V=Y5dpDmbt9WY6?lKDyt$TK-5DBj0vK-xDw#q@(R}YOQ}|7 zlPjAo&Q~_Wc~cui7>MGIAlQ^Fy_T<)jjmNhq?H>}EI}2^oD>mi49S=#64lH~w@t@f z3dAHq#5IGoWyXVC-f%d&bw+KpL8L|O)**`uQk+jR<}{V2`GYsTYg`$#8v>C)T*pipO`}!CS5Q-5Y8Kx{6%xN>Dt|lekDbeP`GeY|MJOI)?pB;mn{QcNITd#{s-aVU8eVcv@4&H8^gqyPYK(%8FNzd|`Ra8G5Y`A?~ z3Rqe{$^D>>t`t<1MUkX=Vv)^b^UfgdO?9ti)A>_pvH1R%m)PaHSGD>6*O84@_mYm0 z!sDipY}W17)Hn+}nmQ8$?#5QVvCl7_ykV@hTWhok?0H1C(_tcNoS9Eo5BXCCJzcP9 zn+#dlh`RcdW*=MIE;`)Oad7Ne8HFTmO+?=G#Yk}`ZHb>Nw#&{>&O-*o&9MQ@bzNI9 zzSa!4;R-RdZ-d8%cgd&EPh?vO|GhM)Nk1VP9&rc%R~pojO{2QKI&|K3M9tS`kQDto}jJ|z89;wEbZ&8aY9)wwJ? zOjT}t;nH4&&ZW@Y{LXoG(Da!()ziy_ny76`O5`5o{t4FZ9OPSAF^ylCqx~41GB?9);c8*96yEq64iMQQK5oY=c^*e11Pabm+?`nDq?d9`7>Cyg(M z%GJBFT&0x4va#6N58HnD^U2a!!4sx8UtrV_k!7!0H-oE;N_WPN@^=!FW-(0Af?Oi( zODrw2V`Jy;iq7iy-)#2dTTCK$*?$>SNb;RDM1tshEgWuTifmMk{>bFhFE>4w#o622 z{&{bl!%98WeVWOPGi;aXT9t^npvCa)t%(bFCaN*99QQfLOaL!t2?50??tp$lQ{&6w zr&IL%E{ghQk3TItxCQ5i+=#3>3GT4G3VMSibO)|XEfG3za73_ETPt$qVDuF-Tccz{HT zB$6;qBFrG?zfOD_(@SYO+l@T6mG)}H%2>4~?K~nJv;PTDxfm9tYpt;dHSMkj=9K`w zG?)yCt5|I)!JIojF-g~7F3#;WTegkjXm(}{Iamh=AlgjVMgl>6<-o1#cbD1fQ`mlj z?VDAHDUYgCH+m30pr{fE63@k9V3#_dM;2kJN)XYl12#`sgQ9+XH2*+3FkY*QkW{Sn1dd{lzAxfw@5GEu& zy<4|Uh@ROwuxZ0OOs|QFcW%62%f<1*54Bp6d{1$YFk1`Yk?in;&vX8EhIOrGx5C#Z zDX78_Af9lSOK}Rw$kYb|K^)KDmr@&2ZIwQ_-`Z4h-n>qUX zaM}ZIX7eUL9M7lgjgVPD_+JXIp6|Lie8A%r1Nuy#4|V?Uf9%CuM~_Pj_2AGj5e|T3 zI#xp?BD%jk^#`he^n3uodU`Lzit3>MPx2vW%QxIBRlm37zo+K4?x2K~zpMD{nIeBN z#%90cS;A%f-pEId`xV0#iVXbzMc6D^8F|{y)9YykJ_4l*kx@BNT4QI33aZdS5cvqF z$iV$XLTtV0o*_UpYtKZs}l$oC1OO9BW{>-P*?E)1cgK8KaU8Bl%)5cE&=P?5(s7Q zFn*lU8X|zAk`gc2I{GZmYE@J}-ai|Af3B6xljXXy&vnE3vpAUjaR2l9=k-bW*_&z7 z5%dBkrC)3e&fhGLrAMU%X6MdThXj%m5~>{+G4dY%rZ}O3G9)z*OF03Llob!@|1BT~ z@G_rC?>Q={9zY}e4)eGu!8RZ?7;%7tO4ud;YQ=7UV1N4y>la~gSVZ{xx+TmrTQ2yd zk^b>fQ#BGt>_kNh;Z7igLVZ)@nhZD_CqG{Kn19#9`vd)?7ZI1<9q;-Dfa;`Jq~eDW znGg@=XgP=cT#y>+!IOvzfWt&6r~Y2ze1rjo}>uy z-~xv&Dx1^ zjq(nLJKVnziD~~fgMJig^=bPfkxoF@aCBYzFQN&kL)Z)37kVEr91cn4@dKsa_E6Lm zf9zvOf6M!6Uh^ORkNMefkR%DFjEo~?p{dMK&r5S6h@POt#1eW=W=LoK)lvWYP}y@NlMM2#LP1fM zf9ucxN_0%ziOiEGGCKwBjy~qX<)A>0nkGn(LO;py!vO;64ymaDmDw_iy~r7cN)ohw z0)rt(8*rf@-f}7wC~cC+=)5f%*Xa(Uv8k^d2LyCWE-{ z+jz{765HoCCQEC(CRwOK9-GohB$7(cgg})-tOyEu3Oz`XHgS<|RyBiJQiKEtlE8|R zC~P(!U<%C^h);+5l4cHR_UPztsnJZb40v!}-i}HuW~x1yHSN6`vo;UViekGm2Hk!} zkH|eNN)%iN?}#1|Gf3%sKcKc5Igg?;0(f{8Nn3KjcTTkN(-6Tfpqb+S!>gBfW*;q( zWN8XM3nWET5K6y^0p4xXod4}5Pubt(A|w9q8WaO!9+UNzw^v8J)EuYs1`1z(|FjfZ zBED97PhbHB<=;NP{`8nkyS3*L;-F?Clt3S_?Fs))MZkwB>#E?H@z8xA*Z<2v?hfu8 z1F!>Q4~Ru9!4g+sH&%=UivP_Mcab68MZg|sAX4xNVihoI2afo_1~Pkm|F1V29hsh6D-$Ry8Y0JikhbX{FVTLSgiuH)5e3twRLb;hsf@`| zdebNlWLh1dXiZF33Z0;0O8HPm$crHvAW!-Mk=JbpDr|*(oAr9uBrT+aEyd+>QJ1-D zohhn@=7>hRYFqsVJp_LgH?*J~76d^NMIW2yPm$)I(+94x#Xbj^!0ga$XprR+nY=E7 zWbpk=bC5a4%+lm>hipH|h&LNXp7DjPK2oUT;nCrF>IMGf`iqwF9Qxxi_ zRCbbrY*G`VdIlPu9YJh@BoQ0fMj-?G%pU4agHHgzE={1`1|Mk9!V9pT# z>XiH?x%$C7Z3=<|xIbA!a0iD1z%w(eV?8?4@xK2I`wAsFmanQqA;2>qWIrqc42+Ai7HV^gL>&Z%e;RSjfp5XA~@4K$J@Et|??hww2&^pfWWS9WHTJAlNk(g#!tF`uc?;1^IxZjJEntU`DU&d zKUI%duR(pE7GxucM4Mu1B-kb~lLChb%0EE*fHYZ0JHOCDFMu8#5I1xjSQB8N4p}Kg z0E|&^ZYkh01UqVjp~K_AIAIauj}YxTU^C2kZu1DkWU;3KMiGIG zbN0xQqc9u?QzjpXAlv{VY1AMQETO_EQvrY*hyg$hi52dUl#C>^NN-LpLB$e)<`1F? z|JMU5h$fUMP>HG%W*1TCaXBJr+KK{}k8gVez&a9f*@ZY0an@wA-@l;#ACKQn+g{ra z(e9p}I8RZ-6H}H;CdAUgazQR#JR;kxD(Tuc89mwTE z5`-5~b#+c`+i}yb+)=$un2qY5KprX*j#jVM`Ds!XYGY|ri&SSNTW(}%gojSNzv!ZF z9cjz;UL2%h-3ix4((UG7Fru4(ONZ-U3Sf08Y-ofPT?})N>W83(zb~Swp}WuQ*ubaoVwuGd=5=RQnxCH zQVK#QH*1fx6d13QBHT zdpdJHmhic_Fp+{1QK??|Rm;Kg^UidxOyRe^U_O0P}=w zVh{kC0c#;HR48@=9uadwaWV2C5#Y!n)IF83WE%UYgH*#Hjc9SoWN}2p`vKa*e*KD?{!dBVP+ zDON=!KFl})^+PZa*a)l!ZHfwryg}e$8$fhGimF&eL`{M6VEa9QcI&dnDDfu&-m~LE zhLFWfSr0`v2SMxybfcFwA?HL&H9O!NDiJssb$T1QQ_MOYK?-sX;CBWP?s`yAaWXx( z65!o!SL&?xn0P$+1IT~%!#+Dpo%E?J z-9yBi2NdQ1Z}|w?hprwTMAe{1Yt&s+QSet=3=|U`8dX7P!qK?=HR;saIi$tVYa>_?!DA>M@bF?APDBcb z83dFuLr@B8jcr;j&m*D2Q&|fd&(JQZ%4V;rx&gsfZz%sD?v~MO9BZ>7EBIN zl$I9AG`focF?4mWoI{`49^=0G$G!w+Q3)XifL!vwl zhQSIW&m#Cl6ao&z2NFZY31hxCH^mg|G>k`M)q&s>BzFqrY8!FLuOb5?k&rV0xN}`M zk}mQ%+1w5{K8ZU6WeE_Ng$~Ln4`oHFg<6*YT-lkL9wa76O*4Swds8!a<$deN=;?{s zGZ9NKu?mUcd1x8B%(AC^GlsSQfwhg1a6?D|{J6$pu2J#yG|#)k`3T^?4t9qAd7+@{REr;POJ2M@V27j1bM_B)gSK-hrS*H4u=} zhX^RQEDY@v4|vAUQD#^^KJ{_$)WiyK#=alAcK|UN^)-?Bl44m^hF+Em8V5V~69CZj zJCF|ygYS#lJ*pas?&u*wya>FIraYw*HZTsz3KWbL17d47tasO;s9-xsgWU1xbPGcZ z2EnoP8zH=X9zR*(uclM9;6Ax|M}2`+1r=2l6pQo>5cWhW#>G$18(HgbGXtL)#UjU9}r|u!up+aIm2{!LFl_iSl=$zs1BCmZ+wt zCg~W#098c+QpFI_RY5Z_kT9%CF-ugmv7|!jq%b0{(}=h=EKR)P7wL|<{2>aWp_Yb@ zN|}MSfpF?W#P*MH{5+bUGaexxJYzyGi36{vb-+D{xOD3nGm?iOfgn_gR}<@z4(KRl zZ~z`AiSYwwT>kD&tZgd=0o_7-&Z(TRWnvT%PM+80Mc?s23#^7$MXpNfIQ+|IhxHNoiRoQ>NmP8xB*V z=JmlapYo)=eGX2?Os&5G-sW_Kp9y5?)fVC)1saPO?F6n)zPON1mK8X*WQW2?<(JfSKRaz|VG-y{D;BC;WoZ5*Q9cEC9Adn%)BZrS( zwVu8=3qoG5-7GG$!GBJX$hnZ|wg@+H0U0y8VLLN%Psm0m)dlr!v1&L0*=bnJ`fdPx z`?xnUXyi2%u>8?T8v#%cAb!t4a^@t2eIKzN4;9lF6h#Ynh4#FlHfp8og-e`k+7!DGMLZSMK zQ~3zFcqWPI3_^hNYHaPF~<1I3bXQxd%iJp{b&{ApwaA0n>;Q6LP@j zW?5V?4{_VXn^=c@IWFg0=a`hFNRc-#W-5UYJ&^_m86%!Odh5-j=R9AGr6d$mR8bT5 z<4CZP6D>591W`oM3`I>TO))@F&LA``D58M50Y%UFN6Yc=VAXxmU3Dze3R2zNb<8;3 zNC^TJRF-IlYO1QM*nY3g^5AoXR7Vj7Df-6#q*wz1-xM|pBBU}cMAvz-{6FoVrXOd! zw*F$3^?JXX&p>>jbzrZqPOUjy?g}oQ2TxVkodiW-Ir zE5G}Y$^;1%utOKG(>X)l=Zn5|Rx7IE)7$cUn)fq_B^s~sV<#e*+Nh$Tq=>08AVVgp zrF_O6q_#xdOb-s?K?(AFLK)duquWeP4? zC`kLEgN%v7sD1AT94W!bPXog(+_Q^AiGclNaz#IWx0ZO(v_SFlHm1BkHTmO%Kypiz z9pVKt+k0P`5Sj3nM9q|O#LzB|wr`0;2>}X7@;i+f9~eGDG=#r+pii$Di6d%5)N=!e z5|jr#G(28oux-#T&?5WIxU6Q&HOy%YA$AaM$mST;&kh5Lnxfn}_w=8x%rgWjiGzdT zHj{xYktw0XsQSAp%-?gX(1Z+bKKc^JsMCmTt(>t?-!Vz4TbW#^2-kMpt%JXS8`#15 zg9Ad?P%_A2?q>8RY)=OQ>{3`qjvgfdvO{OA{h&-F8V=q!2x*#V*$ife1D?_t5Y(^c zp6_HS^5rS)Y+u)XR^=}yS;72aPV=;Tz)sWT)ENSFm!9Fd!3O~$Au%d$_2QGtjh5e31nQ$;3)MSv0&^ZSR`1bTWY&-*AcgOcHeJOiP-kH`ngXMc%E$$6QQ3vp9g! zeZ4LGkvqTndDwqET9Ibt9|6a|98g3(2t#*2K z!xZI^(jX))?t?i@5eh6+6<+j- zVDkdn!H5rnX!7w{+;MAZU>{~2%#scp{KSwIVU0jw8?0fTf0D8ti{AJ0IV?;?ZGb?A zR>F?LW(pyI&?y5r2L-%;!x8?7NCCs_0He~tD?-utlk^OlkMC!qbnH6t?(Nv&uSsF- zvCfh5Dy|o^MO>iM8H|G=V-qYAvPe^?swE2Xxm$7n5CjOTc3mn{v^5oWO)bVH{f7!h zzsA~>2^vrsnkz)WG$ZyFi7$>XtDLs#{YkK^lo+7jV~R#J*bl|&l$k#%OT*UmdEupC zb7YSm2>j(y@1x&F32BBER6bmOyahuEB!_((SlP~2L!ojGka9;)$`IgwQX*Xa>79m) zxk8qrf+xGHLmp@|9fWiwqrm_9{fL>US+?;;!t3aibxZ! zB|M?Q64(Vdg{I5{!M+6rq0|G{5HfU5!f2?Nl8GfkkV8fu0Ra+mjmb5bhU^*A6^f8e zoM4dQ2Z%&^0~JEd9!VxF97vTAq)e7&z~bnFoRIgi5*P31^t0n2cAeN{@kE$`2B;sF zHquoxd%G*95aje26kQ(hI+fk-26qCK4z`tMU<7QGh65BhxL~0Lq;o%i zvPz;JL(q*)sEptQXn`k71Bh&Tu233Jp3#3+HAK_>%Z&xgF+3$Icpra;*q-EURr}&| z_^GacH?Pn_Y>8S0N(%}Ir7~RUp3&IbQMr7`nvq_=Z!A36m~dUv0FZzrA3(-0!}Fm) zQ3SFxLX=XaG=#{+u>_375ladTz%&UEloX^?1tU<=5djoQGeLYU0~H}cL`KNs5GtrC z0wr0Ik`!V3k2kSV?AYlNdLTJYVHDdsGElvFu_8+H@=~e(e#^| zsXd|G5&)Ksf)YX!KE9|tYgs|3SOWX)G}Zu`yd-4EtCMdMGBK^W}Fc% z*aN$r1d;))0?UylE*L4m^2z>h@fEScenLq$^$H`XEFnc9w{g4YA2+&;c7vcquns)Y<{b1KJ!sfK zxI7+%pqV*Rl+wBLK!O~U>K%tOtLF&`4{Yilh9w@%g`l?-kyMVIEKAVsLkDR0s`j0r zb`BswJC_JT79E8Ed6pG80&JdhN}L7`{>l#gOs~Sqq>`ALYKS?rL`^p~K$1_Y2hA_b z2GvB5vwVDfLi}^H(_&lVdJk~g&@v?igiM44Gb1de0YH%=#Kh7CAqy%epuo4SsLq;` zuK5-#w~*Jv+hHqe-Hzx;Ra}r1mI9{`9&Vg->`csl7G04envZ5>ReBaiKs4c`HQ{|b zGy;XLpy!Z#S+~UN99{h2F5ceNc&Ki{0kVeR# zmoRr8e@sP*%f6V#Wk?BF_?gH>9MeUZW{}28hNKAnMFUK+*!T7Ht4;wn@-Qk%0Ob$~ z18gl~fRK9~1HD~?TN9{MH52{O*qzMY+dGsG#q(m(0|WrubnTq|f)P4&izjDll;~(7 zf%B+2rzwJA3`MNBUu3?*I9=`X0RT;EGFX_B^n7q1bQ4j5_#wh5bziHAiA{xge$WIt zd7B5~)8ep`G!!mC+Ek;#gN1wPJSv~I<=jRLFo7l5-DT1*ZfU_Pm8%midI+lWL1oq= zWZX_cY73#nk^|q7hzA&0n5^{Ek`n{P2pJk_rh#o7zPg>U?oi4QY z(p#aaK>ad?0rDgsx{xG8QAd}i#Gr}d#R@%?LzyvQoXa}IcN_}hKx5GrL?C!~@9Rhq zRFdtPlBVH|pHB?&utZ^q!r}BJZiWhj@c&GM149}Nr+j1`po_pmm`L+sNbBL> zgNA@7g{k!ShkW-2NF7Bw9aa=A?Qg{Lzr;?l}fJXjy#b z3}b|!3N&TD_qG%juxtkhk|E#dPNp#lBtwznt2P2zdOv`&aY6^obq*Qk!7a-M;lq#C zKpp|+gg*E)59@_!7s}774~VLP;STZW(U?)Zl1ZqZ=DGF0WZqC@B6{!YUA-lMrGBR+=E+ zLDDGtnJ{mw6TeKUEa=UYq-dRAli`s$6gKK^G`Q}GH32%4OCF>S(87Ex0eoF?Y7s_OrBVl-p6VwrLK=BB)O zg4gvXlqeOra2qGr@47xLlS-2cU6zK{&|8bf3wU8Ig9I;y9kS%;QU*|g&Iav`WeccQ zy~P*=myyyO`ndne{eVkV@AQBIbb!2>0RVIe{J?R@b7&cnF_w+skib;~8?y zN%vJe6WVHX4+`IKXw)L$FDm%uOVdF|1iN4+OAL#k>T!5}bE&PXIgRI&~hnYFMY7VeLu7@W$a$4R} zZOm8@1_2BR#Mj}W(`6_M-{~v^g@~1@9rV>51BXK(I{FgRmf8& zPjvfiU(C7J`TXZ`dkSL=Dblf(5_XG;gF|vbXG#Gm8b|ml6rMYp8sua>m^VEsWo-H( zqT6)JQyQqzD#TotqnIkNxU!YMwwg<&qinp=GF1E=;~E$6yN&;cXA8f+Q>qiQr8aXJ z*r2h8BhO%N<2$LK#Gr--7eT z9hKOU9h}_*2LPWEs)1*ox0SXO2a(&*1;j%ZTkw7;7{jl{ku=*S_nt2LO1UljbWW%b6OD z=ZOv;MiJKX52w^S#}YVhF%I;=`ZA|pi!yZzJ_3DzcL3<#Sir0xhF6Kof+QYX`%(~Q zItDjpJOm?s(3TsP1!TD#nC%Y1JN5_I8zshfW~)!Ww`>$ZT86BLN6l84Lrqz{&ZO zs~Vsf5CshOIxd28`SejyRr`!GG(1(}9l)#MvZsF_rU_7P&W^m!|1bkkcnE>I95_uh zRRs^b5UeS_+X}NhfOr6hupl0zhb6N*o|k`SS|f=cnu7^5O*R-U!;G;R2?IChoEjM` z?f2G57zmVi!^*=BgsbQ5JO`}vc8lQGn4%k2ZiZswA>v>tqrbeoskJof_XAc4Bw((E z0kC;H4>P0DcM754V5MQ1VooePbP+M(tmx3o1XS>(4@LvuaDX1o%m%_gfs9J{fec0x z`Cw%^jo`z|j&H)qwFE#NSd~c`H&7J>bnrqEC~8Qt(bTg-^?;RTY|%59SeK@aI>cvK z2?h)xP+I7D92zPKh$AC@7uK+W0s}PTP@=n>P<9buS(}0xFSKqG-t7;*1oTBG{5?NE z`M=9|)=9?y7%+s0sVYhPqY)!POqA0R3Ist+KoAg7RYP4P5(-MCf0o6ZC?GiUU?f~C zzIKv8)J1rMN<=iZ($W;t9Gz0vF_HCy6-32B5=;cd#AKJ}%|wwB71RMQkeu<`-C^}| zqR!J(WEH_)hdBzfZ^m&3jaP z`hhU!NL5W0P!Uws5~I+^3SLs_k=MlAtigKjucUaC+H5>eQRnQcswj}{KD11zzDo2X zV6X!vJYAID2BHC=h+-uqVF2tobU&IATxAjl%R%!No*ln9j~Kzs^g=5-eCQfN5b}57 z>#Q6@+!lx*!3Y|LOZoN#3~&zp0w)2$Km&=1D{2b(FAJ835!ghthFbc>FLi= zwvQ7%fQN#pZRgszNbd{Tprfl!2uI%(R^s85xKsa3-iW7kUap=e6MJ+pIx+2!D06Z` zi#y+722`Lja= zl?(3ZdOXl<#(J-_&}iLo!zwv6G{M^7(8iFS=zbh7WvL|`ZkP0bl1Vkere#T|eY>9Y zI_YW7G7BXKF`WZips=!@&7?7s3wKPJ!b2t9lt_VsG)9Rg9$mx~Ae)PVC_%>A{>NY_ zq=j_U(HdQ1QPqpYl_4Nq2D)=6J?Q7280_3b>`fzw;PPLQ28?Vm4Ana*f@Ena%3=Bt zS;1BW5V^~ZR2`r`StL+F z57WPL9!7XP2LNpgCMdxK&oQgUV=Te(k|o_zeCG=c#Pobc8WRcV*UmVoW^IiY-xq|; z!;aFp&rF7m6ct2F%5`dPeu^cqaWf6M)vw7sD*FbZnw&)7Q=XT?AUwhH)M=~B697}4}4EJ{~wBz7G0ReGlG28 z|19T25Mv`D`!&21<;hIa6(D}Pr%I#@nLK(S5ug=CNR59%{Rnx-hW122TnZFO0{m_1OfAmeeqF>!Dy7xhz@~&ODB$9rgI&EgSo7y()cgUBpZdVW{U^_eqzOBqXaRgulM} zM3OW_Dx>@V`*zFcd~$la9m^Aaa1=F7Ayk}$1S;q}|Dc1%RY%mr(rNt37bLQJsBu3N zouzKnI1reLufdZwss74wp(ekJB?u5N;d-MBVJZ`fkA2W0BD<4GaPWNv)41DyOaD?I z?GMG9{(peXAM5L_?(EDr&*1k5`iuwu;B#>Qrbpl=c}nBeslKSopz9W=LL5VmhY^6} zG)!VRoRA*oHtx>An==P_+2tF-)J$UJ2GHndLFDJu$LA*)dEGJ!JrYC&{gF|y#V?-y z$BF$1{Qr!Ys+1wO0}6h=Fi9jI>q#L%g_*D{D2O9`4j@UmT#hESWizm7hlUUSpRes3 z@NC;)Y_GkrV4F8*=E(^IvGDHlBqV>YE?wSM2WJ;BH#Q!hDKqwc`SO3$K4uB;p4s!+ zcWFAFc`4kik%=l_OMg?4f{B`mk7B2OGLOP;CM)`I=)Vfo6xwN`9<<6HQql?%Csl;0 zIu(BSIiQ!V`$p{s|BcSf2%zk9%(aQJ(16np$wh-PruRSi@LDtnDBx_s4=tyso^EGU zARU)QvG{*o7>nKI><)<`{v)4UVpscX5cI`Rl0{hoHiGSsFNJ7jq(gqRR^7B{Kk@XI za#tVx#_X-+%!H*erZ4?}?v`Ko9RJjH50TGoo_0xamNb8z)|ySc$?sm$UkaKCA<{x- zCu4?8G5>gXUg-zIZLBQR=JL&J+fvf*ozh)6q`4m26Lw;0tY2jw0V#feQPxahA5JJm&hlMvTh2~<=` zM;Cg@lxbZk0;=d6aLxOaqHoWC9O3IpAwo$mr}nFib+xWdvH2W^Kh*IDP&mio*&qFP z2b=&uy)Yyweatc(1pmYiq3#3wv;NKc?myEv-h%-T_d!(91d0g&C;LAer_@hL5B4wW z_&vriSFii@bJ%)~ZhdQ9)BX$9Qj9`u@4h*1%4R5}v$FuyA`t%R zZ?A_RPIl0ZKi>~jB2ZUpbVwciofH1!-2Snpq#$j>aNA?*5`tVfhPZXih&-~20}0ai zs7zp5Aj#ey2#UG%??-*a@baWO@uFGz@)8N$|J=fcmwi zk6@vT0c#JQ(%4CxUK!zKK_(K|U=b%mLP0xWC`@=Ah?p=+7yp^?i83lhI)C+u!encc zR75Zm3Qz$`XlC@sBEr^TS;aDIwYAPF0Br&!3an{4l`%OKsx=rwy@v!KaqJo!<8!$< zF;UKK;M$u}kZG98Z96OkX`qCj{2a|T9bAXzJ69n)pWDDYmQZ;w zEGC-C%rJVtcQXMDE1geSkjIdRY3?t(tK7E2aEru=G$>Kt42zsO>GH}XJFo2kDp9(5ta-V>BXFJUGbGIxoN*-a+Od+IUJ?mu(LYqM}(wh1nkoo$Sz4F%Bd<> zNkhLT@e0-Mssy+Y(FhhBQ@XTAYSR8mO&C-hIbo1!0FSCeID$OfHyt%LDB^9;XEP2+ zU}I!ziDOp8p4KwkWsYAOtdWUBQhjWzC1Sx8@LD}@M@@OQ;|taihi_gUufqRWp+OK* zZ1$*~1IT;3Q**G~i>_?2;|8kMSQ&;^RY3I~Xxq5vZX6XnNl&L#`V#T!n3D2GBbE|` zsl*f~{=@D~aL5(0U!PZr9_4#v{UD^VG=%RwuMDgP&Pd>tP>=*U< zmezB3HziD*Qw%6+dXVPz<{SgK>B45WR_$%P#`l`k(}%IzgFzW(9u#1?bEvm&4<4n&LaIa^2F zOChuKKPiHOb$FR;3xLzWSol)ofAPH}uOnFSPm0a3?SxqH2@k4ir>M&+R#x z$nkxTN5|N{d;#J~CY-%4qeSQd=@3vgfbqqziWozSao5E2g<@_=-g_*t=y-;@of4Qr zDoBXQ!2U(zhLHDe_dN0P;L+W2sy^yG6|T{UWqzoW|I6pjsbo&f}s?%TSBle`5uy_1iQz8;fNjIrTsnT7CZ~A2{f(nB_39b#~;(_7?=i z%h|yw3RC6zH%5w}D5^%b8b&M^$$AQ=roJ>9bSnT#F?L_q3F<7^@^Xq;cl=n{x$!`2 zG*_l~9@ILV2+f1Bq})9oJOK5GcdL@b4gs;@J=Q$`;iw_ke_xkSuW|D=O%+b#XgIqR zeCFqVg8-X>k^~90A&Y3Df&@d?|)lxP`2!8 z-6ShRVIhtR&=h+C@9+V27zPk%f}@G8hD&Ds**~El&ALIo=8s52eyUI%8io_NVNjhM z0YCsqhKGHpHFn5u227ec2Y!>5PjWhiZ}47e=wW?lHI&wpu=3FkXzCa>LCo91wLw5& zH<<=5*zyEi@b0!a*yXrcItWg~mpuT>S@B)YGKWmyr;x|R@-uGXx`vU`&@Dgl453?U zcqdOfXdwXK>mqe_z#WvX3j7869S6iY36cmx1JqwoJoVgU2?v6_kP}ox!3vIW>!5Ln zpQ9Wg(j{rOfvY^MCW2~a>Bb5uh?%)iVoh&_&RdD*4{}ItQVc;C2o9rC(_MiOhNmK$ zv7$9ZdM>cNe4bAF(a`mIggJ}SS z5GP_xVRCj-a;I0akR14Y`-de_4D`fRO;ABl(KR$h!UNAm#CH*Ze$~@yHqveH4e7kXDJY$>4kU2*{T=c{w_|fu zv*uMm48nmKl`SaEdQoI0WIht4@LRCWi}}8zK4d0B!Q+1Dk7R1HdsbF(}j#@ z%Lk#yP`+)!K&9}SdWhwynH@8TBgpGp;}jV}+(X2Wl0p_74n*S^BRC=o#C&{#8Yn^I z&#^iZ4@kPINLG%0Z#$xeL{($ay_?s~aw&z#iAqS-bmJOWm?8-kkcpwD3NBXRw{(lI zw#b=ea6QjXB)AHqAAQ;9PAn5Yiz^Ly$T1I+`3!lZ3x0 z+roNVW5CXf{(ByXv4fQk<8fbj#v^?SzZSE^M_wweG|Uo3JIEx)4URe zcTb~WVl<7Q_UK76M&aFUMtcg(oBEQ~-_;2{;Sl0+M#)F zA=JdHp9%dkEAHw@6~@5wfp4+Ue13|qRz>5$F5%*@ zLvDUXwEDZ~p@W0%7eaGS5GS}ev(VwfDvqenwHVnto{QW#d2%`oPF%#?GyyzJ?0a0& zfb8lH2lavH51;TMi3(^60+OjIA_;<)mWPp`rKH#6HOy#o6AI*=WStBvl}!dvTFaJl zEljeyk)c%6l4wS(*<4PMVHy&p)ru91IUGxve{^AJj*6!WFD8?6LZn5Uj5h9*ods$b z5S=-4H7w~Ig09mo5()w+v{05Qwp03!$8G?cWX6GKTzQ4lpTRKM00&`^T_)U?Dc zgKDTsDQH=m3JMm1m?%mHlBr5NI*1a2s3|Dv21LlxQ{BPrJUqAY+rK~$ZKMV1h=)mm z(|eU@Cnm16J7J~&Msdz21>)Doq3zOxfHjHU zz&3&#>qwj+X$b{8Wlxf%4tsLY>QyKUjtGCo5#9we16N7{;Ewmp$6{3{iw0RM{!Vujf9=;xhR_Lv0b#J=;zdg%3zI zc2-;pOwREjkt5OUeFbb6R!qkTIjB(rLGoRixYBKe;B^FDNfBE!pz|`MK+q-oQTN0< zgCgmRc(t}bKke#z9_Xg$UBZgii>qJz{s$z#&c71_z+=%^T*zb$HwuGe?dpBnD;Y^4oRM^ zEU2m&thl|RSv6!-hSZ7?t;|i-!1AV>;xQ821XmfO7~(V~3C1RyKx8yoj#SyJ?LP7E zexAqvTEq6joY_wk>9^%Rz4||+8)NrF$4hYD>!1xFlRty;gq=FSfJ3BR? zg@P0zKN3@<6)JLknDiVN|f zEPr9knue}szZZasgpx~Zh#*-_GgNTHm<+Vx6B`a6NNg4z0?wD0T8do zQrO!_N(^Q~awQa?}Yo;i*WHag_@2l3=WD$uKopAuw}Om10O&BUFOz zF;yC4lLZ-utkndqi;;TN!6@B0`>wb>Ty5RNTc8Rfp=d00;UZ6J+8P-|hB3q)QbR6u z;tFuUXyqz$PwS~%2~LQ5`uh{)wpaXQLthoPeL!IRZXY11F~~5#t^y>o_vP`jTV%|- z;P5mC$cDrH*C`-`rexuX$v*c-o_#pvQAGpM`3N~MyK)88g%w3!ti7f;__91gLgqbM zqeCW0I7+hzokr%<0Wy(8ig6G&=6ISWDypxn15|#Z5BJ8x2N+&=3zAVpO&`~couB0R zWIf681aX2?L>9k6FSnun*Ul7SjjL%2MIyBA)s-?Ns!S*4L)4oSw5{~)|6oN&$JRpdEZtWUc15}hAf?Xg` z6mW+}`QgxXgGXSYL*YGOdv;4;ZXt#LEFB-)JFBpGfTbv)IctoGRE~fs_k?~YjCaOT zfY*73k`z$WQc~H{q8V9q^PN9+{ zNEhGp_n{Y4YRSW@Sx+jQGcX9?A=$Q-^uz0lS9WzFj65eW@}vXP9f9n2G#cf|%m*a( zAx9wnwu7)xl$b`7!60}Wc`!3b*Rnh_2tz`tM(*!XT@#U@@v5@DiF7uAC&WO%nlu}W z>_hWG5xu$NVI^UXGL3hjat!k!qIwGCC+CCPJv_L7^G~Vt^)~D7l5j z6JO)7`o#7?kwrE*{ogc)VC5JdDhJo$#7|-MR1_!dK0}mK@_Trns1bR}U%{j3pG^Ag zjNOiqLvmpUhD{_1B*`3`e7(}`x{uI`+92aBuRZn(8Ur@}u-KPdX(+X0s^cbzsiFvm9_@}C=0E~GY) zpfbiOD4{8!^zzQg*h_^nWOFdlqvZa)qIx_C^zHl3E`l61F_DF7D^_w56jaKdVR^?% zMT#i(MKlWXQwU2rTG>F*Zzw%K=_x*$NM6rz*NPb+B%vTB3HKPirkI>0iJ52uOsH@} zE|KNfZhM66SJwPKZ4ZRFRI8%p-4`zCxpzg)P~x!gMJ{zi;*5al+L;UbnCGCr3x5dh_)tRObk8&yqFR@v!$(cppS`K1~Hl3=B2N*EFfN~DUF2|?X? z9Xk4m+A}&FF&W5*WlBTUq0(uBLMW6v?1Gfya!4R3G-;%u)7ymPK1tV)uip{t8)I5@ z1vIAz@}KEFK0(87`W|sWYRL+slYiPpBfj14@5Bj5zq}@%@0S7PO%y~-Y+$7dGyrjx zLzaWGG$jDUDcI1!LXiMdGD9Iyo-74w$q0%!hY1})kTe0hb52BQ<}o}A2O<7o_CY~G zLBz}o2?OgW-qN61wx-Fp=gK0mE-Bb69I0n=kf1760MY`lKZrfoUKVHM+PG*tEX1d1 z-J(aj*q`w@8j8(ucR~Fh)kcdDBT23k+o(5%IIzZ%bU6N%71CwJvPhlkT0$FYHp4R} z!z!Y>twovMXu|^Hg^&R=7vuA)l89p*xq*`A7R3rNxP?d;wkgFkJXuKL+&6~-P{!tx z1X>u!O{;)Ghf()?CI#%?a)NFQQ;H^_LWz|iI*{=<;%0YPsT%CjnTZ<7ttxpjGbE%Q zs^nLb3d2A0Q5V6-%ARwZtLFkqgsL=z^deAAJ9=cq+i+*c*;4SkscAeMOy}hhq9c6!r`UH27G7 z4}m5V2~yDb{{M15a9?sL9&s1IZqt#?ihE>!Yhyc3pDCuf@w)BPP=9fdzUnx_L_gi? z4{H(=UT=nK0H~Oiq-in?kfi0d#kK;FhLC7e_@o2vCDzh$2bV`Gzi}UcXo#kR@x)C^ zKzYZpCyd#}Sj;6;WIy=~H*Ccp;H+Z?|IxH`$9eh!(Ggwmo^!cquIzmO==@)}A&sA; z_5M@yMf=jc16XVC!%c4ra`+y-YhaT>2H&mP&i)|;x31mH8k1P}7@?XlW+Oo|+4-#t z(qsa&6fs0ufq5O!Bqeq}73g87;PgTA?2!-id{bp0O->4AI7-G=Eofva`Ie-R75cl{ zt?COHvfhG02+fx#9w7QoZ9L5A+7}W0XPELZPkA3~(?kP}oCmriN%FwdwxQe<7=vUV zm^MWdn0X}tNJA=ijvzaqg|I#3rTGph9N7coAlD@wF~P_hMulk_DMExTjR=)Mlp<1; ztH>!+NR+ez5I?@;@=D^L&;e*TiTa{F`UiE6U<82}qItP|k)x>>2uu@tfhbD3=Wq(a zsa!yl)AxCL-nIRL0TdxhAxS8Zz>Ey6Nyv#U zf6G3I*gvD#DdQBaDfKapk;JdfjX^;Y2i13(5{eoMCM2P$Xn?-B!Qm_IlMjMB_n6SV zE)eo59$gWWNFPbS1St!OI_p-82%J##L&#@6VO^5=@OLE&=sCpHu_&-m`Zu%PKlJ~l zTnP{T|M;TQF3X?INUEx>NUEr+vl*BbRaJNQ2xv~bqbdA8%=LGeGI2!M`#zthaeIT7 z=Hn80PrRl3tZ@%Q0r3d%I48UJ;q;yQYw_Q=y^*@;qDQj4xPd}_l~~Q$;D@`x`n7lf z9GXIvFpV_x2+~vK@PhV3P9CSy(0^fp3Of#?vO~kvcUe~1@9d!=itB9)z%T)j;5gjJ z@sL5|46z)Hdxm^ZKx9BlxNW5SjK)F$@{f?a#Xa(3zU$o}Zy`t>pn={Pk2w_V1!5Og zFae~Xr9pKh{tD1EM&>E+F_glN!wO5X)X;L@mk!3Fdd{N?v}!FFnNtx-F;Xy^ zua{73-6pi`Uv6Fj2`s$e(?Frg&HF&3bjievo#D3ltg5wP*({6%&P=GV8-SV6sH!4B>)G+05gsEum-E194JaO*qV^fr&r z@Brl~4>__=>YH8`(J&qo48g~CG~d;a zI0zsFWpb7X% z_kKUG?@z!tP+R+yW2}D)b`G)0+v4#%b;;SHKu$vu!j~u5=?dZCrQ@JrTTSAsgU&1H zU^fCmCkh9@6|bpURLQ;{W#;)6-MrOB6*5~!DHN?74@AA;)X*G$N0T)k4v{qiRY#1| ziYcOKDXUlt@7TmrLQ^`?C4ZMjgT_1gH~TFGPw0pAi964$pF-pi`{F z6i+_MuzAWXw)U@D0q|f*lDx!ICAPcuchJ4TSO`18jwyTrmIo0-mDh!ITMyl)&!(CD%(h1%gaIYX%P z@nq&}7w|9+C>(R2Sbd>L#dNR;B%E=6*$Qp&Jf7UFd!`tJv&tlnoIvWDr8hyGngD{D zXhV_cEAHX)ocWy!f|@c-wT3;8_(UT^5`1~>w2_zt^E1q@tE23gpY`?J^iViGIOj%dNmP zOR{k1D?i1~qCvB8pQUrNl=dKKMOCc2MuS$l^gd2W-pmHrQ^vbkZ3S&I(QrV0C5=T<@T;M!YXr z2tH|PC<>rB2+Cp%Vj?0Kh=L*_A|fIpA|fG(h=?Kxf*^>9LL?zn|CmbpLPKEc!1Y-# zWCl<-XKqu3l${->Oc($5DQtW4qO_clyqFmXMbITxDOE#3V;`^Y$8NoD&|{U~$-aMLbJ+;|rV~I_P*FkEJ#c+wn-NFE>%lV% z3%ctO)Wts>JC*Z8TkavGpdy{p;wH_ZF2kKO1(k9N{Gx}Mx)ftQ6;jhE8;4nE%lf06_HdSuUB zJ?^7SNfMtMBn2G9iDy*ZImo*X0iMxQ2`$mjGT@7p77jTRK=T+sUB*a9yBCT`fudRm zk{bg_wOEWpu*5Fi7B>m#Ly*WKb*E)1P>l$A#n4HR1#lpi8F3LfNgzzQ5K^4PGQ~+r z0AxU$zpJWMY^}QO;3n%Dlnh5RP0R^l`_WX~Tt8R-kk^1x-{5 z8EZhpX9p|dU|da|!;z^^>5-qX%5pu@>Ygt%$=4%<;19dldYyoXQj+!}4*`9nJ%QVM z{%tLMUjIjf={iG0Ux&cs>vAEqvH0NotZAUCDpuQP7z5+ragTW70v+d0N{Q=5$xE$$ zZ>s{HPY)}AIXz4Y+mtHhI9Srj3UruA{}lqN0n;QSPM1vw%=FcW|{TR8+xqvx1SY!a}u&WhPe}F6PmPPP21qMT!n_((#>xnQ|j* zXvi+|_P1b;u@)3W(S*XN3b5iwh(!-tj zEAJ|Dc@H^<%mJA6cridy4YCyz7qpMEKbaHh&`E!d@EwA2=* zMNuUvNUTVg7OK=tEJVU(H3(G?QcRdg@R7rmluW#fvc;HWkUhBIeT;7y;J&HZbl=h29+FwH0V_ag z(s+S!3WW+9G;FJVtphXM{ z#EGSurL-U20rDPK4}&(1h$^5~T0~0dkE=j>Hq5OhNs=idGv}>A1?nI$@Hpe6#te!| z4zTVq5OI%iT>&)^ltOB$NFtI``CJ$3j20$=qi9!!bqo%$uZ0kXfgvMyN>GIEQ*^-t zhfK-dUIdsIqRQSe-a^kgqLA_Nw@%~_6GO=~38#m!dkRswRjEO7muqFhk|jzG&^PHz zct{=?HD}{4lAw2O!49V)hhuQ6<}}fRBd$wE##XpRI$xdu>`~J3Iy9PSr7M<)M~SCN zT2SeD?BNE^R}jr2bEznz?hH*N9Uy%DyLW-pi^h5&3C9WV93qH{8Izw(3UJOxP?#I7 zxFZk{^?pQfEQ)s!;&;Q2&k9w$8e5@irHn!;9Cscpm_x9U&?W1Tgg6Jt&aiGn>bVo& zfrSq|E%+kbMH6sl#I|a0Ca#X6EMgx)*oFRx5IUpqfj+Epy1`0wCsDwBXy8vA}m;ND-W{x5Cl-PY4 zOFf}f2c{(-Yw3`n_N(hO(QMdr`>hY~$V>r9QhelY+JoIDi$W80*i6Y1Lq(L!&ws#6 z6GBc8>PI1II6I8rnhxenV40?Lu0jmS@rO;-A^FDT)VcQ6DW@z+SMrq++$3R%O}Lzq zDhlq1s-#3pFh(l9WY$E(QRnWIra}h7P>_U)B2ow-NNI$chN6a=Dr$@xfC)D;da?0F z`?u8!KSW@QP(1sIR6d+xzf&b4oJT}9uH09z!%w*o=rce7L@5%H2tfc50KyWB5}`tj zNHWMvyc*a(ZaQIQ=RTf1hK2Pinxq1$O~=$Ia)cK`gi3MW1B|F(hdpK*D%_c%KU2Kx z#IgrC+k_Jdqd;O%^({UDbug@ZdCne(8Rkvuan;=l5XeaQTW% zwYlWZ<0q7G9cNRt;y_Gd?lf@yoPME8j|>aA_gKLYWsy@EmSi4K_HzX8fS?|!KPhls zf{O>>L;5U}gas*zbpX7T@-yu^y8KfP0pxJNa$v(|geVdTVS-|6x8~rF02W3fngbFL zU$gpAN8)UEK8pvrkZOnKI|VmG&bwcVk4&XAgZGRSTg6h-a;HuZp&?0mvs~$Q6GzBE z`@6`WnNBAZECPZAA}EA4{>Geo*WI$3y$4g@FOD^M!-E7m)+Gfl$5EW5JwU?-=07(i zz&er($D*Y&Ow9P0;86sn0b>{u<~Qo;SK;oeI)8Q_Ub9iaq_WVmY6!6b!Fx~z;iZzv zS`vW{U?fv8#nE#Fi3+i7QmOGBl9H zerrO{YJ_z|!UUjc6JAOb1Mi4p3)=zeFu$j%zZX17^c2ETCus}HKL9#*&sbvUN(xZ> zfWbfkL;<)erm7S;BJ_=NUJFH+UKW_=jwVr)2}FtluQ1Dz7&@wyAW0FhblDY{L!$tB z?@l{+epm23FDgMm;=l(#Ma=3V+X2b?w+hF+S$jBxE*%P&nX$_P5UQCD34uHeMhgQX zsm}J8CQc}GI5@v8LD@`wp0J~~+oPuLe;z+!nLH)+e+MMxhXkTxF%h(U;-kMNuf=|KPCh9(iBZnn z`R5BUU>>QdUvza$J^PnFleyX)S@4V!k6#3v5N5t5V?&gCV(Sit5d@+Mw>Ua>NPVyC+3J=V!a&?807wv_26Z6N7fcSM`%de|b+#kW z;&%{!;X&jZH>@N#JE#;U5?MJyNXP*cR6-Es3BI~m1?s^e*Au+bhdl6=ivH$+GnQwQNw3{ zY=0g=MZ|khLAcIeaZIy5Ncl8ZO|1RFsHZ0j5( z+jqe0I#a^NhzY4mH5FwV(3f-_LkB}`2QZ1IuGSS1DxnAzB(05G9L4cS7@~}QBE%S( zfzAgV$}~u&5MB^nOj0J|6f|Uw3K79pFynz`p|-dSi<_fc-r={)6EK8ASMFj%+JYP) z#6)ypm^x{>08qP(+(bba*QjRq0lt|>9Mhy99kNBFplmj!2cCJ|0)=6u9SS4iQN}e2 zs$U0|K8vSP3ba5@k#ion?)C_1+zgNb=ze#0ct?&e zDkoVkJ`0l8<%Sf&G?GyrWvMleG1T2SC~jw|t!ut_T<~jacN383d)%%LKN`bC^`+u3;YCGjBe8x(+$(wkjdE)E$s`vxT%RLlII| z!c4JFNnuavm`uq~Ar**p_G`i_6+$1mBP995y+vY&3G^#9)siO_c=c zcZtZ)wE6I6_j@|Hh{r50hIEeJ1 zgNQiKM$Go6eItlI$wCtP>LagykCx(!TeH-?`@O}-w2WuA&996mW}FqH$&TRxTi{Q^ z`wlae^9z28l0FuZsTu1s3HFVnv~Ju$MT$QZA3K48(>Jo9?GYWeA1lNOyRP-|>mWLO znI%ISUt*51=M#i>;P+d&O*cDiUbA>Pk4Oc}vX31cb;M*cRo)jlQc^S>8OB<0_GO}V zV!b0!4usoY7t3*|yeW=j&yE9rcK&{SWE|-T(cjP1C3D4Pml+Y7*N!6m!cSV%mF=G~ zVC(183G^_uDLse-)KemqL7zD_f`s>{2rF_klsSMBR{Vvf)#`T;tekD+K$kJo0%i+{ zuN$JFp|dho!E4$*s3W}{U`U&Oqt9tyv{qc2q$ONnOb6Ip%AD*`}ie zDTX!m2;CbcQSXN5?Wq=yk?4DqWsl!wAZk2)#CL@n+20=wfhanSUQ}wIwOHp?1{pDv z-F=zPm6M7nU9I!Rxnx0C3TV-kFFuzF$B1^2Z1)g+ocS|VzIS%|YFUle`t?TiYp%NM zqrRuqM<=-o>y_;I)}!t0haDxi5TP4EC_SPn3_ZB1XWUr}As-hzuXKEhuaZ9!UGa`H zks1~9L*QFgEXKO$OrYJTA26foM#M)Eo={9OdAA)FBN-v{Bt*g1Ga~$nq?B2vvFINA z>PqKxt)s7dJ#XPb&MPfNdYYqY_UiAt^s#G=dv`3oFIyt}(SH!mMfTnGIq%55O@yM` ztKoFD5$PWIVAZEU#TvTRMc=TyE^I|gH8^uh$&_}0>!wGt9ljuVq6vydqXM1vfb%5; zZ5OnKQR8jyeOPYdfT8NB=e9F!FhwnPGf5jv5=eyy#6Y&Dy5hY5};DpqC}xuF8P#tUgx2BjE)mm4&tXSS z=I-xB%o?3Z$`ZTm+8FF1t#ro;(2zLuJ2gT^n<0+4?Zp^s_#L_UDUZJX?vLX zL?0Z&LOKv7W~mZo?2v2YF?^kaUR?X5y~oLqK`akS3Ovy<0BJ@b19%SIJFV%`r0W3E zBJD9{+0ThW@xv-13$a8NHkDh2tn+_f=CmG>ThjXxtwfmtpp6w#R0^#DR4~aoS7Fr^ zP}r0%t0Y<@pC4CU?Ak$#URHc(162JA{XwJA< za$R1|Ru+p>P7B5=zcpozyCr1jGPRR8J5XrxI;P~CsZLy0E;-KX(znx%xNg5f`EctRpo7))JBB>{hjmc zrCW$t8`YGR(PZ^ z`uLu{Bn3Y-c&;T_M#(Acof!$1SHLtfX#zA_HU)An!j{2;XFS_+gO?7&lG9!mcw%mA z3Zi7gorcnwk}D*JtDB`^k<&M{${nz7SVyxIY<9t-06}B{(g}*8#wFPBhLzur?R(G> zv>RB16;TiwaY!`1+R}I5v5tOZk%(-Mc>i&tunIb zt(Rgk*z!d#&irm`u8iLb0>ucKD$eIKBU1&rAXf_0Q63f4;n~xdZgvssHUN4 z^(@LCdBnnk+1qWPZ^|E4?ru|Hv_Sy%7+Z}bvIc|xsJ!Wf6;?~s<85Fa+iY(fv zK&v!I1?_1RuN8+*dTAg=a^EF{NHQGU))=&#oh1eHqK*mzkx8BuhP*JBn@p87~zv!CY%xb%{T{>ECPI}oluUnl?^}jTEqtxiu zdEU;=W%%!Ew&!VIFspelop(HvWmbjfRb9@Fbh75R0n5qD&W(!n%Dc8ZE1S@5^rn1o zt=gva&ewd=-0ix)qQ{@A0lt4dUrMN-rhM3cVkit_)*pl>_QO?92EfX+LC8%>swh~ zF{~FbD{#>=h84t8hf=4AD5fW7d=;uCJEmZ%;cAMes}Ph+OjMlP!j2_FSey!g$pM=M za5op2X8?Fj%C4#Xnu*hu0`$-~PmHhb)X)wpz-ZDoa7oaj78&-WUdZXI#n~@o2^TIG zrtVzYNj1vvm%P;9yM|sb2b>N7WHiGv9F0K=1A@C7#ETHk#FBL=H-ImQBLX0e5Oq zdczmKsID&nO~mGzK{f+kPZL0)qevfkeckrXkmsTD@5)z0T`FTFZsNyzVeVL7*#0>QY<`svJ zp9zG5K7kHC5cfN1M?wU`QnUq91;osH_#>ik#s5f7MDjXP^#5fl5(feWA%7P{%gqWL z6{W#pV~P)I3IE$c4@266&38Q?iTY13)d#yOs;a80s;a80s;a80s;a80s;a80is{#= zhagYUU)B8l8b7`YAHUbK!i2mPFg!#Kv5-bP!1f6Dk|-Jx6Vo7X21evSr}fL^7o|b~ z*2dECKgEOi@$d84KRr|@Y4%))LDXy*thC*Dtc&hTBplbV&8RXJ1%s${ml_ zGG7@5(xv!COYdrv%gLFNo%QMDW~W+8zG`BHNRv`1n68JUJ-(5wadyUIjj2W~+iSF9 z?=4-vXmRB{-igo&Z9dvTf?&npWD_|p4ABZ`31`aeZGEfA(wMd zKw*Ds&xhZp`y5Bg4}^G)DB6=Iyt!72`%llS&uS%-SkHD({4`%}Bk9Q3#XLQ1by7;} zr@Dw|A0-m?@<}_JbK{pLr$=dGe^-$?%5zI1T)FxbQAEs0mLnuBKutQ9vZR+Ts-mRNrsbHkvVEdAc7}WVtrmCRM#G4{-&<$L+8L#0zVA?4 z<>i$Amgv!yIH9&Tvz}+)V}fMeB*vU>$MjXmmq7sRl-nAL#{=`}NyP~S0zmqD@uV7i zQyNf8(uN4;hj!v3L>EKBMItFilb32ARo7NWMFy@D5V}onQ+;_Zw<$TynzilKmFl0z zb2*Mp{5YFz>144L@#mM3men(wDkD*muH>C(<)_M>l%C z8Y0kLoii?pN*2;a<$Pvwu(F0itcZ`0QCH9(6JIcJ)NFw70F8{*i1`x{1xH(rfwwOX zz~-qUhOS_cc2LJEH3VQ5nqh4{yYw8BrFM2RHAfMn4${7SPm@FCtLd-6R#QZl0 zUc(7V*r@6R{A5n(9EEZe^MSE=9?PR}7WP-IF` zS^*`cA|avzMFIoH6rmqDr`i7Pb_j43J`$)bLJ|Y4?KTy+qE)EsBn?85IJ7nNXn>NrV@y2clpi z@J1R?mtrY){tDyk3K}QnfxtbRo|{zkKzE36I;5wRKAZSsW+;dXu8Ze8knea$N;Z?T z-;T%||JPnN(jP3+#%4js`Y@Qn;ta(X`>`T$!{>Yk#2!eQ0r)EB3cT(FLnl%0geK-Y z3jL8cPid6WKC|*8=8S-%9Lnji;s1YGv3s(Ri|6hhv)jL&2f&}%Yg@bfkEqDBa9#?j z@xTIsEM@k=L&W_f-eL2?m`Gow&>GaC_>MWbOu5pvp_eLI#wly&r>^>3g zFx$s4e#?VQK@blTVpxEgh({=^p&SUHu#x7tUBrOJkc6>Dl?u{;PY7?X>pw=CQMED0Ow%bJO3eIbZY|yMHHLJQX);ke=V;>m&!S}4ceEZ`%B(lvidA#`N#~hB| zsANIw1I2^1KUqH{%`)*Be%J$!k1zs#B%8F!8Lv5HCD5mUd{6?Sph3wD#5B4z^2HS5 zax-VdJnTJ7$`Ff`iftt_<`9HY`2Luv9>1dR6#tTktpF*af{J27l%(~Z#UJxa?Fa;Ao@b%`4E3J#3anj` z*n`HwR0fR!LzS#W?&}fPOS*JWi% zmx7pS6zP!3?t!-R?u-A=;-I|fS#Yo*e1e(6)MM1I%t$-!`ScH2?O&Lp06M@vY?JT$ zfxhr&JiW$p4nZQ6bqXChiF`6>AnFQrAgr0t3c399pc|hV@>NlA(9ujtO(uNIpT$mb zNQj?-$vfFZqgwSPe?uP9iF#5Q47D=GOi2TXg6x0?1tOm2jkwfn5Y*|Q)M~{nE-=e; zO7K=pQ<_UE?~@K9K_v@98me%F2!WzylHpUv6B88*CiQf5pqN|8ViAqNg%W7x|1hG= zO8BHVYGSMl9=n)5`O(s0vI8WG0E8dOO&1-rd~=gm6uiD_iBNa2(46dZ7&DU-JZ zu9Ag9N~UBQE=8p%mXhKJtucNK5(!#EP$Xy;HsS<9=I64GOHhC@N`%^v6#@_?y7DR_ zi3GapoGuF8_@Rj)Uavjt2q7pJk$k9g1K`Mj>_I6elV%~q5;}vagG!)K8GR}eDqw~Z zG)QWqW*UfujA=0nT)?iiahVsWs$Od}91K@Xkv(vJ0lV(n6qvIXN9lq99Ji)rl;xkVy~?FKF=ik1UN zw8SH8*4}BxyoLX^jP|ZPS}A5&7sxGILvs`_6y_nD5LOUZU0ZkUhkodpRSIF4fcOVk ziYR1Lv7Z|ga!Zbou4fXV3gCUf{#c;-pfr@?LnN$8ii${wK#?MRpOJVBVk6ec)Nu4o z_=*ONo2&k~HOE7~&9yY#u>FOZ0OKh%6e5vOeNaG5nbRGkkWT>@{xB3twGU_}6VMw9 zK~NG)9gu78IBTsG_rd1O2#(pvG1;tuUV+TeMtYd zN(_Il+~)S6bB0hMFo1YI&)B+i_gd@QpT(Jr-)*P3&O0-mxbOaeTT8Cay7k}BXI!Lb zQg+V|zCk-Oc%eAX6@Z{ZD~m?vbuX`X9^a>~ZgPEf==J!mR&$@-ON9IK`<`Lz-(LsW zU&`~8d+TaFQR;itS1+mFll44mx-`yV>m!wzG4l%Ri$^PUx2oB7KRsP%Hy!2dG_SpT zuW0mrh;Kw|ds8vKd(l&Koq1%X%{ZBxpHr;&GqqV;>2yDR3p)I>BTuK;cjcG!dG>oq6))-D>K2DmTf>!@jxR-N?MJk=3TJD{qIbT3*Tc9$#Gi3Ix-{F!pMszR}jV&`!0}?kHRt?FYt#tn$)zQYkme%tUOcU9hmO%P-FevR1k=dPFa~i1e;Ku;<3E?k6{?<)-Nw_Xdvt z0FP)`AI!jG2WHo(3N;^S)cKms`c`Ef&0!f)N?oz|Pr%9`bbu_O|)HDYW z(e$58hK`%!j{Z*W-^Qwn-<)2ieQ73@ee~;IYDzvG?CAyvPE4kKPUO6?F0$Sje(g$b+%u5fDTe?&tqg0oF5hbX(z zD$#_sP|5pv^T%(Dv={DOVtj-K6tAIlSLsp5xVg=Oc zGt6_?*@4~<=G-1CDFGOA;YdbQAkI|e6=qU+0rBt$Arv4w?mKmel=wTu2Eh-y4le4!%|fw(FjJsd6JS>NC$S&4&W#sfg%MdNTpCjg2@2V6oN>qNC~0?@nKNY zSVDfQLGsrkbyMVRdw?HkDrS-osv$%4LC7<}?<#tjd!c^9g9Rf#!49ji9vZ()GORhG zmV-b1+qt2;lSq!(PHU{ z;D~QQIQAu}LcX(e)6hII zksHPofuLWbf}nz-fmVOjMMWf%r%`er803(lC&0Dv!R~W`501qOCNZ?17EcU3sE}xamWAFX zP+2f8R7r^~nv)4_Cy3BAfmBQd0dmbGKoFWmB$i7OY0gcQk){$xbc#7u*{z}o5eTKH z1R7gOL6R63HVP1iaKbLora)6?0+Co+EN(-I6Pd~0W!`x9sV16wCgw58mWh^uA)<<^ z60sQCAw%329@QpbEUNTv4~x#EfRUa}ffApSLv!ia~?K$4S! zC>kO09w+#YAOY}E>C`R^e=&jWBszfQHvk=Q!>9^nl7^LvumVKuX`&bcwMHV3bw24$ zo}9uoDY=^op?8tncXp$fG6H6Zjye%G+zutg@4kuY$$5=)d<^I+d@3OUOY)u>+4|yk ze)&#J6jU|fsC5vEr{Z_h z79q+SX<`&90+WPnNv=k;si|=u02i7?jqrrtB@R%gpxDGUfSnkABPeCJo~06N_ks8L z;*EeQ1H||fZ7@A|DCz(p$RG>e9oz;bh+~ZA*Z|P$1P=J7kw3L~QM(sd+d)heEEF7N zr_npFLkh;^Sbb;E@Y}j1N}LJ)h(>_tZWP=qm>jGvD$Hv!%(2oc_ax!-p|RwCV&Wds zQpKRCG8~TZt-oC#q#lP1ht+xSMs}Ea1r+4L`cB{#!?tJ|1KT{Oz?Bo!M)G7(e$1GE zU8<@SJ0N^vGzt^}qwc#1_5eEyG(LP*dmw8-KivYJAr26Mp~QmFL;}(wOjL+?EH693 zL60VgCQA3itm=t2$VuLO3>OCx8cfmkL$KJOKgAA1t0QS(r?$cM3eHU95SdBcGpEj` z*@zaVQv528e*q@kqujZ$!vPCVf}@uY7v6&+-sENJYE+Y@j< zf-pK0^z`6sPzO}Bk0?hWLoO)>!u+I4FsH~$FC_Z3S7za&&;>b!n1)JX{%7!2|6w3f zls_^G?yl&Z1NhIPR72&3c)h)FIsIz=JB##LNVwI!F~mKzk&K$Rb=N zaz=oqDQc6iV*^w7K;`PPpruIpu`;6|_D4^*rfVX(tC@m^*kpl_^#egjAEBRfKTv&& zkDNaLG3h-p zAdrWigCT+F!1;h6$L8Qn3B>lm4vr`sa_untA=;lJ{C=EIPXr!D3O)aQkq%z(C)<|< z1O%uQLxeRhA)a`=B~p}X@x*rMoKVt*G&Ch3p-nW?O*B(YG>k&fB{ZN=AtF!#ND{3I zBTY0EG-fp3?B;BGjz7G+(H#!+PMdeDi~iMnQE)f!A=hu0mFckYLNJQfHdr}LSL)az z3gni=-<$Jr>)e!zNhC_LJr1Lh^BTjfCZOf$Ff>RNLLbCSsweQt66j7wKk#fsdCI_~ zrt*}GOX=|KfT|CKov<2*P@UTZ?3-}FDk6aJoF!jYVi#^Br1@xa4n8x)zKHwD@P4Mn zv8;v_?uHw9kMOTUL%Se*PB(S~YqUE6HZl&dWHhwEd1ffkG@3Yv5aJvZO~Zd^r=WL& zoxl(t#Ow%@(n`{$E+IRp5OTgk1AEHX1Tri*0nkpg3ff3a=hD-_RW#9PQ78zYQYi$` z!SI2&9fp7b{9Fs)4?;*L)Hy{r%bzLeb>kFcLU_Nd)2WF!u)x$6XBvY8Yjz+#9sZYY zdxuz0AYeVA7pvuXoYk^vq?`z?$b*xKw7&BmcybY^NI6m!!@E7vi;ApVkbYk;JP4$L z0bs$3@~R(3$ItKMH&jC=N)rLa5eU$4vIwzJ7;eW06DP10`|sEJ2(QycRo#N-3>P*E z8th1fY&=Jg3W1?HBZR5jChGD@3UG-0v5=rDFB7^Oiw}tHH3StqI62M_7?Ox2ileUs zcRXY=0DySlr;jP{@!NzGiwXxIG%++$K?im!Zj|oE5Iehq5l5oP3K$SnmI@bvXpy3M z7`e=xB1l3oB$|MrrHis@sFsQ54o(*;b0WRb%8Ix_$__!xZgCV^xpCai2af|9>{v9S zkPC@Lu`H-th&Y&yOu)_aGIs2}Jxim=9#d`yaa>LecERx^8-zBgk$=;J0BI;lAV3Hz zoY11|5K=^hDQs*A1&ZulFVrF%r`Mh<&p<9Wej|~9odJpaRfCPf-BbG#0)RimZIJOD zfDyomI1+^)2iJ$B>c@C%u|Uo#p~wZkTzXGxpV0tN(9l&hD@qS!2|yu0X&O{129Zis zXc|Vc2i{s8YzTa3l!Fp{@D5Ao4zsXMU?Ivv2?{}^C{!p|f`*WwiK?X%iikoXB1UD1 zpe7cYYM7{6RwXDxDy0%&pb7$3A`z+zP$mSRS_Ek#i9n(%8d?%)mW62sg((t%DPme$ z3Zx<;C7Mr6zm{OkfjMu8~`5olI|fN5e-f(0oW0Hz@plnO|Z3Ka@U1StxlfeKnxDQGBG zC8Q__f|^2zB$*(Hk|ZK2q^2aGpn@5iLa3xXIHR~0^oNTq$Ov(1DXE}Bs9(6^2PqB) zMMuS(^nAjGj`+vQfxq=QOJS$NIuMh9^zdpT1l3MiW-QL z7>a49kZ@5tpf@&D-b1fnoH{^9ckH4t9h3`Dw>*iGApD9nmRmKF-wDK>-ReTW-reLg zD$?KccW{%gt`a2m*5pnZTPUh&M6**slu=Ct)Ka13aoix>40*U5CC|{BW=b~Z=9&xOc1!Yc>fr!OU%A=-= zClf#qR@%BDGzQd_7+vSnbaJ)35cZvV{MQ4{XMXN20RU`5q4jI^S<)FG!>XOGJUjx_tL?#1IEUQ* zOwzSP7PDrb#(tL{tABtZf&p?5Ul)jae?GhQ9{cIq3@`G>?;#G0BkxDJiDW&;l@dug zniNhqI0Q5b}m{wJp zW>yzuT~yOc1!&L~DyfF3u~jWeGn~@3DOFVzO*K_nN~u<;sfMb(8~iXl?-tP2O;pu0 zkY$FZN?M&c)tq3?YO12Ds-BXoAHfe){ABqe->BVM6S(#Edp&l3E6lZ zEdruQ!!(QRE~V1u+7ZyWNYGy6r9>tS3KE>LV(7|AL{St`H9s>`_9v$2R}MJ77&aVsqHkC0@4pd z3_@mxW||5KB!Y79+ zG6-nF{(|r+p_ryvXi#Su;9mebHuKZ)kdtHN?(uuf{VXGbe!({+JRG3`I6q0go^XE@ z3r_>L(KH*IKtWE^mUHKrL7~KMnkBd~*jTS;-bELW|w_(JwEgg+DQ~~2SqK2R9HWni3j717T43$$66hq=U9z5g0CV@24hh(Mf zc!RULTQ2t0e{0VHJ0AFiMaWU14_|T46hSp!GFW}NiJvX!aODvmAk^K5uyAT=m`V&s z2bpghdQUz_sSXkLhod0&m3H--RQ^elIi!o$%t7ezZ&zxrv9x2?cw#w0Ku*Sl@=42) z@)h_2ktChq{Z@%bPzEYMr)(hlph_BX0o(hjI+sbwBe@0AAd)Hsh#A#YRaI40RaI41 zZP5IAqMr`10P*#l@i?L(_e%Q|H%Y<|ps2_S0i+`Jfh7iJU7yhOM~R2++y3vYQRmKU zrG+d>?mDwrm}QxTc0Tadz9-E-m@=RkB0xe284)M(KkozX57KOmg(U_0`*q{VMDIK#JEH%2r<5Ii=T~e?%LM$S zC_w5YIKSqWyx=DakT`^q3D4__`h#HoL`a%WZ#Na7A-=i(t6hL`kGKQe8~8#{Ooaka z7Ld&B&aL(rplqSpC|lw?LEjq?x}5l821@E82%33FUZAo9sC+omX(e{_$Y6g_9{wxm zf#6^uiV}Kma|1Hc`IMP#nui$qTte<1&j?Cs&?ba+N@7#kh1|eV@RT$u*$jt_miR;` z0tCQH!R7aD&TxB7X`KM2(cYwt)(csq^MM6mp?U_mx?@l z%shkF{tJNQFE?k8EcL1v%oJ2QoO=w|rXjY)0hkx^LO?hVq#Q3zRS#qb?+V{R%n0(x zfV8b4`X%Ar+*&xUAjL>#?!{HxM#A-OAX^b+I2aDa2_Cz+M4}H!cyW`x1On;U(&{A@ z47eNa)COv(I_wquq&30%SrTY1)H^ zN(kn#2UY|M9g}p&J(KhI;Wq1v4~7xJD;OK7o~r<|pfG^lhu@(@n3Tc2P}>j*kdbF8 zk=xg|PvI_-HPK6#&t=aw&~ty5Q#1R!-|Kz!`R9N2$u{CR`u=!hYtc##T- zNTiICA)VyOTRb*%?&YD&w_Y*m-!-_c&X0H#Y@Pe?>djBvdiHZ&d_oKPsOot2g~YyB zX{~W~o9)9n?#EVe%Ch$@WH|HLB0SW24{yIy_9LzIYust_Ip)ggZaqG4H`IjjO!Z%F zO=rVQ0HAJ{9qSqi(HdQQ09VxM|CYxYjRPYrSrI@l9RAY)3Q_p(4XQdDk3h zRhm&(g+a;2te)gc7l_TOm^7`p;bFk|_$nc^>cT2%oh;)VbfrMiwMtjv zx}`$g#PW#gL3IHk@$2YU2Q>~tw$QQ~@1Ka!gF1Gj3wC~BgjrDcW# zV&5^yK4GFWB6{1B1E5i0gj`(7`+kEj-!B#z(f zjwBPlVesO?0MBS2xKu{DEB~+fX0Lf3{kunsesO)<+ z^p8NvX<}kH>q(azegIhU5RWn&0RNSZAP-nqm%@%I3hIYxx!zE8g~gF=ozp>vBU3@^ zS9D1j;u}EPIEkFuZOCv41Su7OqDlrqh|<9kXlEpnau`;eTq9_~9Rwhy0iqj4yC`6F zxe5lf9*BK-$uZU`_m7dH+Yw2fgfR#*Pk#0a<8SKy2BGIa>3SUAD1I6aqo{*-Mhf{) zbQGDG`=hi$29Uiba_Lc2IDY(B-fw-M)ez?d4fJ78f1V|-61``=VK_p2b zWA^0-Q3;{d3qUYQB?~0Upfge>6om<=5QInuAR;uhlrTWaBST7@HewNo1_+8!sFtB9 zX<(X2pojMox&{U%rX>lW9}sAv8Y+_R5uj64lr%IXOGN}gJ&`mdLnH+%TrwbN8brjP zJ%r`SGzm-MMA9rzE=$TFB0wmm3P7O}fM}p8YMB8fWH$TF2y;$fRsxE%JiwX;g90oc zzm&oE87{)ll%mA47`57axh#qj3Md<%XUP#@o*)N+K5xXmL137}f}`eG>CyRsiX&rX z7XdJlD1i_NW6~qz2G|CFMGM2!%)@;NfT4b6o5&gnlB$SEiAIH{I7TA!$kx@d6Ps_3{=4(0V+f>2}ulul@x^} z5D*e{fM^;33{wzQLTSM*F(PRK*ffDkVV5F`Ac#4wp-J%rfghP@X(ml`$JezuKK$vo zJ$+HH0Q{%5gQuv2)dfQpM4hl#pc(WwPhAPCN!WiOvTj8JcN#CT_*i^|MbHDF4`~Cl zQNBw4Si(Yqi9^C{pRfQ_;rV-mvYYNZ)QKcyGX)xLc7Y@yl{E--Q0LnBV_J-<9wQr} z!O8~_XXwO;3g~eGP@|r*8M!jdLeMXbl&4B^PDB+9WHbQry|YBLA}%l{NY=k+=b4bV z!MKn0d)g!2|)w^C zK93(t(_4fQhE@p@83h6ufha%6=XY3X1NRv5!F#j5j=T<*geXCwJd(VrSR^>h5(Ic8 z28|(s7YT9+d@x=xT6Vbb-i@%^wd_B8AL{=6!2KPbv->?l zfdbI6Bp%WfkU59EcVm57G>893xO?nQ8vucxEhd7hV#sWZ>AN1sG2@wi-{71f;MFM7 zLjj-<+Bio97b}p~5-o?@_vXFj_32P~4+QPd5cu6fA?k~c?_1m)$k7uL9ILu{ z%wXiH!q(6M#)EK>R0@i6&Fk46{UnJ$Pp2a1QY`E*G& zqiHA1QlEo#0se>M`=_6>hk@Ep;zA}oPjPZf3c6rLec~If$bdm2AiNrCVNH&R4#?+U zk}QY0PhPyi&KQm7=Bb;v@Li==;Fv_Lgg!7LiA^CUp$R=WI3>(pSUcU+sL)Jl%xLzn zLPwEg=h6yd=w`fouqZC(L_^NEo?J4fM|Z*D!XkJ;DpNBav4%N>JbJ^%svl#vdS`t+S#M~>|}YGNt~mZ;vi0goi)1G&iZJ1X`HU6nByLCBO8HQ0N8 zrjy`Dr&(bGk?XWp4Q%>g-`PzjnnDZtP=i6}kNdNauYeognH`On~Aui_Wk4uXmcV-{f2 zY!0)P&;?8}M*EG(g1G^JhwSGEh(gg)z>YPa(4EyiCu@4%29SB~>fU#p#6EGs*N<>` zM|D8K3zmCq?>yJ%uN)AnBJjxhnH()>H*}m$WKdBXK!NJFr(yOW*su zIehiR*)j%6-u4Py_}Zw+P`U=&gV{l%C{Ic)&e?C%F%DBZzsSK1hCEUwJxyb8aesu2m?d3e)F@oF{uc z06rw)=a+#Sr(Pe}2-01y=A`~t8c2YY0*4U*gciyX;BL*Y%#C8$i*pR9#)ju9cL7xJCkL*4pcF!z?islp_b z)Rj{+Ze3+N!Avo!2zH^!V}}qRaFhx`29T>r`-rsue{@&;#zqXTGr%a~lDMd`w z&gg2BLWR9bk;ElBnHy@; z9_}9BpBW%eP{+Z=?NLcYjH-%yF2Io#u1ZAA5i*3OCMHeA@gAA!;9>D{4&({}z{gF_ zI=hx8k!g322Jvp~A^d;yDdgaL3O}Xqp%ib(Vu5~S^hq8eEMh31AV-FUr7=fQy&EDw z*dCZY7K_q)NwoBfN)mt|MT3k4uzR3Y7%UtL!jMDx9`_7={fX9pVMS3YPpA&~1s|gR zZb8u(xQSIo6SPPu+7M2?hDb!Np!Z>D3a~9nlqm5C2pYPs&J5|GQs`2x88&t_CfZFm zq4iS5`xnJt_E|p3e%Kll`$<60LG@;u5UNTV7Wim8DIUZqmW()HBoxP#H@*a}zk|W2M z36FHA65>O&96f{V7{48!uzN`JAod<)oCr{tKzfuZ?QH$6z!T?i_YQI%fl609cR)yC%~RI)YCQ)i*H_ zFn1p*?INb?Hhb=jfvD>x8UX(2Urbbqr+qySI79+KQTV$6>4ilCry)$<8bCBSu|aa5nipP`Qs@UThL^8wQ85u~Ih zMv$R`QmF!-eVBB9Z>cNoB#69vW@A<-P06fuJ;kd-7NG6B$?3xIKX5YK_KVd(L20pSz7+CroUR|^Lv&3we?QxY^i94^x1vr0_-+3E z9O)7twz*F zPsCrC`o|{93L*?u-U;@fA??+EROSQyO!0t!P)H`?Q#(0>2nrQvz%c%-AF1qGFeZj5 zfrv}+LnMK-trADom8+0038@ooZGo}=!G5CuEPre9gRu4bo5W^%aD^tE=;sg)0eE^R zg6d!(AYc#)ixC{ZY*idE$)Q4kSW^8$cyqB*fd^py6QtpleB4sSHa0m68biw^>KTb^ zMG#D=XfDSgA18FixA+RZi$Yuqfp-dt0FWlB=WN?Y5SEQVs-H)i={K2xMGFeaiZ&Hx zucy=3KCDKn#$vAU6;=}!c*JU~Ys1~aFp=W{M|s*CEv#i8r8qbT2m*=<1fqbZfoOa> zjQownQcWk3qjh&d%y7?oF`S$fiVZVhd9YIEJH_2 z01Cp{FH?L2k<3FP4r+!9!B1EYFO#@QIz8cWGmkz|(gEwt=t%)F!dH~h83B)-8*i{J zI@dlmhe3tM%(8wa;qSo`j8}zjBHR)THm)iTD>CE~MxvBKCJHH0G{RSYi<&?Bq;MKS znmS&(9J=>|p4<*Qb6p}`-3KGYf#+kzbeEg!m@?APvE9wcI(9a~1R6%kYmr$TWLJSf@Jli5e5bf_lSfg?bR-zc6HzZKV zsR1BJQLu4M3K~V}iy)?92&hoInyZTp)e&@?@&%)W~7UWa+NwchQ6fPm0MvJw}$PM51C zRMLZ4wj3HnxQ1d>K({t!$%q)tBocwqsw}ES$e^oG%UGg9;RQ^&nS}@%qT_g89(!TA z;N=gKE8)atJ-g2~*be}Z9gsT3hE7T5KUhh{XR5K#z8x{I#-N{Dg_ zryQXi52M|;k9z1#a_LGZ2Kq##BqfFgg=s+#Y>k?ciJ0%F$7SpqRiePSj75=X zv_nA&IJHnB3MHYGAeuo)3R{Q^6{@&lR^f4N6EKh@kV9)}<~1h5G&<6Pv6v-#@#lBF zDjv6|VOl)GdmgfOuSJb6Ph3gJ4rv|n%dr5SRycl8@v#Z8VPnl_7VdQg{d5ac!r!fg- z5;~L<)aeHFG7^J}VuiB`<`-7_S27I5ktLbCKk5sr5Ol%&E%c}3&7yB0#2@VR3{_Py zQe)8W2!j#CKz9g;FjM58F8xz;FvkdJLkYrEFAgipd!uuEhpiy5^LFme*g++x$_u(# z1iLQe7)8k<>{k=jrY`Ekkt5j)+jzNjgqz^-?bEP_k2wtVN2fpCh3!IB+=P36Y&`P= z;vFD;vSNm7xdR4h{QJiP$p~@yM@ICG=7SNj#XKhSXqsqHJgGWFFhm>|ML@G_mP2y! zBno0=wIXaChhZVd^6|hYOT0>^X(*_9E@1Rn3?P+IhJrmJ49_N! z1K1i*QJ~jhIR~g60nb=D0TJ8N`wv4CaKx072f~>25*~5T_Z{d_{P2eV!EcP!2|`Dd z-piLc);P|DG<0%7O9tjhz4&R(R%H^#QL%p>0*C@>{YCUQQZHl{!%8Pj&My@(M^0o@ zbea?-3ZZh!(8hrS7zWD@Ix3iQoYx^qplWDK(SesKQe>E*fHxC_W>mt_92(G?9O7$a??Y9l44plqK!^c$wZ&z(_Idn1AjycP(~ zIWcB%#B`La$iTud#v&#hCj`X+M&X*pIy)!uC=(bjtj_IyS~|U7r;&H@JLPF2$-)Mb z5&+a6#D|~P{F7zEEw?cef2}>S(z$fuoN}cFex!P+jVfJXB%kbdsbdQx{xu9Zw$3al zkeczqS4!*7zBsiU5h@$NdjkayB2X5@`t+ypIrN&*N^R#s7$N9|#nH79-w1Oc177of z4-oZ$XsA+wBjN>!L?l5F3$c4((XH|dv=vC?UEN@ow&xwVW!sdR(+G3IZ`M1*m`&rk zQddY?u#s0U6L#Gk#Sl1rNn>bx_TJ7QL6V$FkN{)Hu+oNw#DU_(f<#b(BoP9;F+~mv zQbY;tLB{103E}|p1EhFHjRZl64#f$=A_JW_0#3uKP`a7yae?fiL7?oNIBxD2>w27d znGW|nIVsXKCxTV!J)R*hB;Z8Dr?!Tef|TsK5Ylib67!}+?!k62%nG4F4AI5=R!~<#Du~gBx`(%f`HK~QA|rwG_%hD z6fYk!5V0&eLA>D00eR_;Ap8+yorn?CvX;s7^a?qa{QA0|YznJ$L1UL#1F%dx&pF(I0C<*2hN&uc%6vUMjG+3P=Q}DG# zQZyAYRFzaMGCxR7E(o;HxFM@x)X^lsqQ;C+(2(Dvav$KZ)ILPmiGs+&VMvmciKv9A zfc7@@N0ftrLMI3m4;~)BMuecH!`HnOfXvChC|Q_U7@-_ZdLr9`$uLoF^OHprB{f0G z(n)I&D8nFVTvK2i;=Bip0TP8MKd$yH2RSJj$22K#YJL#E$~}K7Y`7nT5Zswy9i6@7 z^o|c{w9p-ZfMB|T5Q!)|7f`4}%ia6~8j$4&x-T>8qp1$UGyBp5MoGc}^N!R3yna_v zCi5l})7prO+uGzIP$U(BN+MPyLS+_^NSKvMQD_pDkr4L67$8b0K+-9p5h)R*rq?jK*n03!Tm?AGHSY!7(!@2HTi9l zDQs=Rj6pJo}n1=`$un*38lZYSJ zA%pE!qY{Cz@QNw;F9?VAlOIkGCsKiN7flHs%?5z`zFl(UAb*Ss_e6vXTjY%XXgTrj zIXS_3LHgtlVMhkwCn5-5)v;=^Fc^|FjU~!`e5b@t32)7l_|(656|NP z!t53E!%l-vgTx()J^5~Q3BoCYOdivN6dd=R*f|FXo^z%dc-zUb;$f)|9#v@NM%i@f zX`poJ)p;YZl!z$`F&p;3kdiF4;Bd1+10ZJ3rJN@rmIsQbdsOr~@HmeJKt94yq);8* z&)5(&A*nzcW&klj2onNR5J?qacHn$?JFBa&i8GuKG-4nsaapB&;bAUzYJk;k%_r3eut&{+XadGg>Q5buyo$Bd;sSrO^LOooRDoFr$%Ake{SX_?j}q@sedF!+YX!?E6m@ETbC3U{8k z3M#x5N<4j_Y@T!9hUByyWN1c&Xn%CCqq#AHz;^C@{D+mNd0YO3=3&k)*kxwyxXrIgK*!wgVQ-k#%KGCBOkSL-WZ}+s|2}is7 z%7E>a5)p~5B9(d-M8qoC!MR~Mtp^@F^~a|Y)mP|L8r=0!TLp+Df}|Y9&V~lc(J&d? z0@yDJKd#&%=n;}s%tREl&`2hf&^?vpr#+zF&>dP2c-=jS^#W%CS2~aq<01k{gAe>J z@x9;k&>94?(GYgL>90gY9;4WbC`ObVAVX|fhXQ=93rpXZQS%ovFi;ceS@;fXlWobP zq(b&EdYkC)S>7VPQ4=RC6KvEE^+cyu6NZF^rwHOHIcVr@VD-tQ0qcP=Be$|kR8ktA z{>n7e$bs1kdeE*|;sJnkZZ0{Mp%(r;lWvI*XyhQo7_39V!W0f7A8Qcy+IlB^&`OdJ z!Vpaf!&_2nIPf#+z+;}d2Mnkjm7zO!*9hl2l%zL};WL4eYS^Td3X7BmuuQ~wbXLDS<^l&c`D2Qk+Iam@Sieai-N&{?JN?jMY2py}ML~Mw=1Vt0! zr^Y{#vM>*jh<*RUzdR3gGYZZp@bz=t3c>N0xe{2DByfR1{zw;OIVcz*v4*$#&jaU5 zh^!yGd_3OB!XSzmAWDX#3S<@?WL&vWE&aPl0&+8)nN5|XXLHbUnu$qjnV4~c)9mDKc)d*0r2me&Ru;#?#Ali;19|cSp~$7vp7hFRA_Sn%o0(s z@jOk?*!g?F=MT_pN317p(1S^;s3RRuLF^woKLfB%Vz7c*B+0Bw2oNGrat=$C4w@w* zK?AzNlmgNfKtht#C|d&|^b#5dHfaEe2#iDo4v4T$$EAQLQviX;hLkd)Kq5gYP+}MA z@8E>NRFo9Hm<$m~Lg)mfhy*bT{s&PLm;z{J{|0iDtI|QlhN(>eQhhRFL^)W=*mMEH zq@YR=p*P=-!f+ZOAS6_v=ukjr6w{^uRDfwA@r=V0FaszaNF5puNV*;Zc#%yZ5DI7t z2v2sD^AxYpesY8Lu#VVLO(-*n6miGHgWuaAkUE9&0#_viv7?z}0|Ia)7qZeC5T)_q zH3%J%3M%D*eQd7*fiy}Fw#hsd?!(@{k8sRwrb=mW;&t zq{~ud6yYsg5jla@q2nsjqELWDsL(9{9b#RGVc!ZML+gJ37&A+zP~pX&C|dWX;Rl6=ga>TwBvX>m%4{TNUjp@mf7Iz;f-nQj%lS{GDV zS4rPPEVCIiJc3{DPXw$}3NwL>VW?lw>4OiiC;d|NB0-4C(4hrF3?OMk17}@THOgsa zkW(1+5tGZbG zPIWkVVibs0AU~mi!@#0>NBqyj{7w$ii7`UNP!f5Q0#YRj1YfM!27~;Ub5>{$RRtTs zWPD?-ZDQvc4+Zn7`df&_0O4&*Re;4NKqGUpwS$Y8AfM|Hi0T0LZ1qb^!atkihXMfJ zN*YL!{(s;v^cA6ZH_9nW7Mn49{K@emmXHZgxbtiq{io*mfu@Oqzcv#l^P&SG8t}$( z>1?G2y^#K~gpzQ>l#ctQA{e_{Huv6GkR~Q60+|9Kk_;!4xm0%jF(W}BDhR4MMHFc9 z3I-)NfBxM*UCaI$dU3R6tnb^Gbwkxd68hv3{o4<2*EXBk6OEptdg;s>t%n%qrkUh8` zyKGshCDpgAqQa=>f=LR&m7wxdN(>LQGMyrypYVNT&_sgJq=(P(j{rPm>?Qe23(f4X ze`gF{XmkgxJ;e9e=dW26I>oS(!44G7Q37?lr$jb~6sE;A^9HD@Bq4MqG{ksAe1|wA zhXX8uy>(>xm0$)FG=Tres8b*VuoJN#A_5{B5;0Ff0v>aj+t0j2|F2E`j1&j5GE~QTcY{l|K{`qcLW@^ET0jA0@vVnQaG0HazOA`4;DQ$)~GM2!V4AxlHIyeTfD(1tmt7vvDur92Ku(Gf{X zG%toaP{gU!u(Acw6g$APOUIw6d6G0ldLZ}@cW<~5(elR0)M@W&`Bh$)TsdaPxHj&N8tU3diN*B)=fCK$u(cU zMcA-?iR%P^wfjsFA9+%zt%iygFDogLG%&>E6cp}^{GN(d*ncxM1l&dn9!`V8;ywV% z5ehZ`12-m#q1YaA2}(#&3AQ{+_peH-q@^DaNBC%etwXf^rOC~=`<`c3n|g-ud7V$52tmeDJBSoL_&!&nFbs4 z52u;+0`vo{1(;CV$CIe+)5w%dBuwMtvoEd(_+nnv*1-}y3y)Gh+{8!3NcNw^tDO(v z6&V3`ZsrPIed^5$En_JOLJ&}>m=L7}Afh!Wc2jW1qFh)>q6c)kL!CqW6{H&IV;Ug% z`5XnHG}z@Kbc8uklT>rr%79C$>U%xMC$o+?hV~-ELL8TA5hM|)CL`_F&r@9i}3 zE<5tcdBJ7GR0pO|5C$)$5~{$_>mXoWK+qNtoCXLRD}ca2dHE#nhYT1w=7J&*NS=BU z63~SjAZS5=Xsf7kb{M}TJ0hLn4Dtkr)SQYChjrh=KhlL+}XvMd2h$0R(iSK>acfhz5p| zwJ3Ip@AV1?$ttu8K?d2M1cr^#_0)wcy1G4%2O+Xyfv~MGIKxDUSZZt;KNhZM7|==~ z{(?w=0Yh~?vrXqLG?Jb*VcMxkd|$Kd#8B?IcO8boYe%$v6+ORFU;><%-r<7q7IURjlQ5KD$vyU_nf=hN`j7dp0+8|Kqg4f8t9}EdTTKZ>zXb=4ssuf(}kzO7$@O zdPJ$fG4{;K5kY=!t+Z5APt^q+fT5u&8bgxkS{kkhGr}@^2h5&faAY*Q%>lb#M`uXRYEvpgf;SNEx;)k-Sas8Qp0NJu)b||n7XjfI5zz~m ziy4Mt7(@|=Ay4F$Df__Nhs=O`YE++Adf>t-pyFbqs+pZ2?tgfmZbz00)*i3&$z$3} z<1NL`fS@8*{SoK%m=66$J1^FEBZ&K{fRQzU>+496MD`|=fbT8{W%zx#`2s-pRqx@Q zUH>YnNlJ-GlOFFFXAHi5z$ z_wmioMke#WI|@NV!3g{cJW9iuN2=V*Gcc|bNKxPkC))R7cN|PzKFUPn3QsJ2A8`x2 zD*kE=U&70tW`;u2E-;ahQk(^deUs;^np1}Z?>HPzKHkkTKs?@nj`YL?DaCPJkCE}{ zub3OA(Mm*-I~XNl#>q$@#zitk2bkefIuPWu3O{Aq%<$?UB+&wartm4Fl{W0d6A*SD zP(MNPN}hwSe>If-n7XUxk5rnI-hU|sS1i?{i#DqPBWvUySNJ+UN5!#EM9&5Oi361e zWeN_5RYMRPVWBBnMWmoiAq9q3s2>Nw;D0^B>%9iqwQwFX^qxX!V%VF=JpRKY0{KZ? zilAMkIE(1=^mF}}smn6~e}4S(+!GAN#_oLWKUpbyF!Fa$$ve7E??NH|RO%%HO$icA zla`gXg;n826#PW6kq$WyZ--J9^$|)w6#SsTR>H~z3XkK1{FmtIj~?!Z8ZJhc$2Z67 z#sdblrZ0QBS)8bfI7c9;f_=T)qJ%=FikDT%t3Zac+n35_AiX^0@8KO#| zYNiT}AuTm9LoF*QKn->m{=#!bwol2aOG9?TV zBvM7PJ>wAUMhTa^F~?9suJ;!5 z#Ex=Z(i@Oh6&DQPr3wgzssNanf}y%36*A#)h1gy=(meB?H~5 z+ztCOW@X+0hu97vjInHmb9&5XMRLlF~|*#{x%(yz`T z4-&sWW1YFuAkzR)7d9z^h+--RB}sxJLWq*J86+MgU+Vgf z2Qc7A2-))#uL6iDg0JhbvfTKt;C*8*)afWBl>lR`5f&Qu>K8M9yEC;O6zC+Ff*lW! zZCSq?#orQ~H4IEy-ViAxN>3?x(_8%I+O-HY0Rw@rYROAqB*53Y0T48zdpQLcjYhIs zl>V3QSsp41UKxmB&u)z`-F$83#f)fM>&7tL| zqljc@liEdW+2kr<#^7d(rXGUP*2d;xA-ORyP)k5mP-r^*P3}8>ZjR-qsQKUu57TK{ zN~VCO=1k29Q%T7~7tQ&+(G|>xbRF?YlR|-p!$3fYa#sXSWi-s0Bj<0=jlAA|TUDyn zYJjLU7N{x;^LA6#@$U}<%F0*WcvGP61GxCYc#nX1@s~U++)m;*<4-@orx2;6@WqF` zH#~6S=JD*PN-D;f~A~BR_FhWCNB!J0<1^YmFbl{>b2}Z!RnGn&iD%*nC z#sQ+yLEzAa2?EeP;=r&8hMvO-6j z&Ga3z;QWW?RF+H~cr{I6*&}LeX5;2SJZ)nJgc)iI@cZ=pt`=LTW15=U*jrPpF1MT; zoCpJ=3~eV+^b`66(`*QQcp~^%>lYyhl8iBSMFPScQ&2%LhwQ_v{gB0sk0AqL6j16N zkkX2g_Ud3*7&(JtulAe&GqI?T0W^Rep;SUAo(17Rg&dS9X(!-T2UQ?V&|41;KuA^IZq-t22Z!WcVwjO7(+^c zadfi;!x#z>IR_U)xx_yc>7y_$J_9=xM#HinFWIVN>ivdI0Phe9@^$X?juFd2BuM(w zQNT|XH%_wv!}UjOJD2E+!yKZb4DJKYX?YV*>9|j*_p3z=6)*up8T=?dewBzxL?!ym zke4Qkl!AtvbT_+?4>=RU^OtzuC!Mv;p*s&}k`rJsp6(ydWSXg~{m+LU>HbQUrF zQ9Wt!nwR1DoPRH|n0^zlItyZtC)3`nGD;urV{MJTG6i|)lz){>M1l{w^K_@eFr6hW zIB*bEZkSKWaQ&9>e^x__-2G)RS7&=09P9`zR0l>H z4syJqrl~6 zmx!`eVF{3iDsD9nISS*^IY0oHl1h^w1M?>ElxgMD0Q)(r98~eb2&O^;nn)DZ7(_wH zIw`}}r_x|~;iGABmWYEu`VNvOvu^&}1B}H$#5BcC6r777q`ooR=>3uV_*8#zVLPLn zP)~?VZLoUL56wK{=LURmbVVKl!;#KO@igNk0q|o0 zgJskx?mECDpuftJs!&jX(&>GP^BfpV&&5a%P)C>~IiTbaHDa$m zLX;mNp;_6uSgn+(CWq=$B?dB^r8+@fYb9jGn^s_pWKWiig^D_$1Dq5%M-Ko3l@HQs zKfXdGTh<}A5suk-PniRzul4Zce2RQ`^oVV_1jNjc9Lx~!93g-+a0;DyG{z*svFJ{0 zo?%TKL$X8=q7b5ZL;b^gc#EY!*M}$4Z>;1C1OOp2gNYE$LWCzyt3-R0!gb`(~D!#59!<6v0I=khM%o6o^nzflQQ=R20&~5Kyp6O+--y zOAwI?r8KEQ1xV6Tr6~g=^cw+H5=~VSl*Hh}l7b|XA`&82Ara)h$NE8+z;lzME3c^v;6C>>wlYhU% z!jCh5VFaU5UT4oWoyW@+HU-cFQ1$ab3=5MYmqjaxsd&R`Bx-am3yT?>rL>9I49Yt3 z1IQDS9F9{^M7|*o@W8PN$aKUva8eweNZvQi_7upV!b5vf5c2#=3SZM1erXW;0#jeJ z!u08I)LXu&g}IuS_}BOaUmmCP;TiMatC z57y&+!UF<96Aw#C5Yws(5DW%mS`1026;wn-P^3S?Abf@4g3^pA)u24n@?6CdNK7ah zu#Y<8UAKU+8jSaF4sbkfzQFP-OcY`l38}Jj!s?6&ih=;po#wP0M}c`P3da4X>m=X~ zzTXbYaw97wSlTtKNenTkVl|zqE%yHa>%{TUIT+2yMx8|$glTmI?a4d6m?6h=34`vJ zFmg){Au|dJv`~m_zIM{2dsDCTzG|SE4p3p5kNjCD1(F^iQc;0up$Kv zX~MRHQo^i&`>XWNW_>OF2Iik;J#qJ01n`>?4p~3j;U1;GRkjS2QGHiG5T>L>XLM4@ zz>#lSC5=i6mbT_;B{a%ZFK$;9wtHH~YG?YjJE-CgYjR5X%hsM|uiJIYj6@xvz3TIv z%~+sO%`xkzcbt+cSt}HOhC3DIeW;5#_m4=Yf6*uSmDh6_cVg*87HccM7e}eRq^j$3 z-@CGHHTkpa>h~W*S38ZLCuo#Uh{CQ~c$JrIid&28E!Arpvy>MZmLJS680bh$Sip(T z8|3Yhl(Iin5}j;`in*ThK@2IwMGEsU%}Q5-nI@U{4(eopuzx+;+XNdd7317WWtj3y z3RdUcY%NXDQVTgA{2Z;!@x`A#8+*SCe&RAVYCx%rz zxZy}Ucl>UpoU=ctPM};7ksq|=VH4l8&}QgOCVgYHLr(U6^}-#h?OshK$WvWG{wHWw zQ8@exMn=Zde1lduT<|F^(}p92V^Q77#5nI=aN0WU_cgbM`OjI!jikz`X{sq_fZ@jl z0}3V;F6a;;>2j$1nq{a&Av6^ugoiF8`@aWsj&Vw%RcdEL0f=EvB?$=_f}urM;aa}@ zr#^1(iL2a)>t=UQl>N9&``ZZ82Tj6F42JZvO*WV$h)qSPVkI;m!RLI{By6ve8A!zG z()~Ks(~Lg2eRt_N>Th0#R5|N@-0A&MFjQ$fPEiw>n5g zBb+wn|y`Aq!gKBJdt$G)qtmnxC=Qe>SYh%SyN(FDpW zqoojuAGFt5WjYy74{lD~AG;kckskCB>t5WS|W3A9p1YCv4& zu;t#7fahp!0R^_qnXN z;7*>DhMkgfe;*lHfw$D1p!6x0_4&*aEk#VJaT039RcS4#u9ua$-WDJazX#LKMNd)0 zzaP&;p+tHw(mJGHlM~TOZ!4r&k;jtnNU3>eGN`j>!9Sfce(SElv zJonV1YU*^&hd(83w;D+E@(#`O$o(NmXtt~J-HC1X#d5&}9EF!= zktcTpavHL9MLkAUQ-0w4|f%nq43Z9&_msB{?EhTWYdgV*0MwJNR zr%ajL-V~+2l){S1ns?nFT)f7mIJ>xTBA85*orHM>1LT|?Z(jW2@*%@7afwGrgrTS? z#kp`aiJ{T(i8+#O0>UpMB(~peyjtp)-c?#j#V1ypuc6CQ#KR0R!3H?BBJA+7Nl3Wr zkZYl=&ifIiZW0q<$`;FT>94-#o_Esf6&Z03-`bfi;vrSc!h#b#nkb}RS%ax!m^oX< znuG~zQ6e;9Fu6g=mukE3cYMp|^0MD`b9Ud_)!T%HaM!(hLFkfVBKisqlYh;U7CW??KtrZQXQzlT7g0mA*@8GEoh}iQInGr zsj(}8YwY7$1xR@-$K@MS&ZZ<##2QgsxXSlzHu^G%N+EIWM11<)ZbXsSG)15-1!o|+ z2tH4&IJa}Ek7u@8w0sx_ON&{*ZQbQ@ImMGmN)X3-J$9HZUmw-D5fnI!QTzQ|#lwhCuZw*=BEEb_$o1D6J2RIxu@Z)&U%B}9 z_v;~Qr5i&v&1H{Fm|Y{%FP%xz_tbaRmUi-pxxG0qP8RxdUT(0dlfE+RE7F_=F?BXN zbs0mIKY3)z#qXM>eDrN^Q})pOypx^KOHcXMwvf=J@6(G>9ilNxFSo=5G4^Ev=^D0) zNKJUpm9$THFvc>X7W*F+KaWu36mdb*al{gWx}%i=t8Xr!qRgD<3Ye?-<~}8_R{In_ zn>LK*JZ$P|8?QRNU0B=NM;YlWtS$7K=~q<~+$rRDqQLltXDw0NEwnQqF55eXzwi|_0{ zA_QH9A+Eh$Lll$bWBiIoFY)AAg#(l0{*0)u*VReXa7H;I0Vw$(}tpi#Sk=f zy=COCu%HsgCSxbNH?|84M3PA@3z#n5FyJyE=KSi>LS1HVs8ON{pWaiyJDS8=;gWnP zt4UPJKGnLvH==4*yq4~@R;c^8A)KSu?h+-LPS)mpcsWBcWI+B!9w~TG*RW!(2SfzV$Se+$}Na4yQYQJ*2ND`^cWvA)2mHTR; zNa8;W&pz-dpF%*DHRSUkJDxS>9Gt_|Y1dxEwW)YO=F`(m-ki(_E!V=iVKZtSpt41= zUAqbnP{9+-QVN7hK#8yd5Kh9?<>j6vY$XHPd>E|=zX@n;o6;r9oU}MqRvLR40;wW9 z*|}Ux;pxmIek<%zlWXy)(w02#gY)04%%ef{ybkNm=PNF?rIW&L7{IWvJgzp^?G8e| zPfi_5=C~BCAiKh5SO}O%=_nP%i6hP(TF8`|H3v&F zUJr<#@SvLCaxp)W54suvkdXXm^b7TZUWh!+FK}Y8A^AUft7h=b3l&UJhxZ-5r|a-E zR@OVDG<|=k`TwXttu!aZa5x(P#c3u36i*xpR?)|*_ zh4gWEC!oqhmR131k8}6A-wwGw-%LN%2J2b94 zgR(@vb`w)}bX_BQNIjA}dw0j4nVI(3yPGXrC2Vm>mdh>cZID3plq&~ajx+UOA$s4><7&ri3G zjsdsyd_ek7;gs?uA4?A+h$V=mGmT$v!e|pjLH1`aEYc7Z#X~?oK_LaCqe5lgMQ3fI zrSw2=YG`SpJo1JSL{*S3LiZb$K=zPnABcM+OPTBX=(d78hI+RiF?jOL3MmmQQjR*3 z#4`{uT#ODwLUqh$0ZRa1HU>a=!QviR=X!Xcmim|!K%=C0e@_yY1BEC(CL*0qm~)+$ zPKY>RQOVRqH0ByzE*jnYPf6X|2D1i)ESC{Rl}jnn<*_BTK{YW6d|)*MMN-77eIJL1 zw@hF>*r)>6MKv~+6xjZ6DIk&{qGlqgn4(&+`!^F##F4|(&@+s@7?9&llfh8* zAkzDc8=mpu_(}FzX({g9KX0fxoIFel)H=hi}N&&wI6d(4pOsoV*3 zq>^b2Us?xDI(ksh%st_1pSBcflS~2Zmk_Y|{5Q*ap>YM*!i+~giwh)Vc79$sWtmE%gY#g}&o~^ZsD~gj zt2M4zudw!d$lb%#7%v%UK%stVUQavRLD)*f#<6hKgb?=0Oc4XQ=kCsNk+_E!eUygELB043XV7h*M~$41k3*M7@v~ zGTO02LJ(M^Dv=P;L>{;Tq7s^E z2D|m;X%lLbZDs8U!>z@`+kU8YTSiJkAL)M+^Ekj53kmsM!cW`*Y4m86p*^g$fk-dUrLcsb~=&wj>krQtxR9Jq20)f3uIv{NG+U zB8T6v-{y(&h2DkY2d?FN05!a#WB{|d@K7g<=6mQUlBjEO54;iBuo3t{QHe-|Nd6o zA3->=*r`8tvP=g}zP?^>FDyP@L(DyRXW4}cwkAQMCdqc~cU4~|poo?VkD_UOqK>oU z5ssifMC0vRXwI>)egnD4V+8F!l@HMr^dBedi3n5*Yl?HerxKf``ba$>wBp1u{Yz|5sCv3ScH; zNg#oeVJuG|1G5*KY>HwtiXF{bM1e`cIABzJ`#G9;KS*XF3dfmC!q^HtYw=At~QAJubHDO4%*Zi1kgSUo~vvZY_a*D&DyWg^2qhh)1)9Sgi zN-MmTe43oq7nbTRSB8eQq~}97to3k}z*GG_l|o&@h#~aje(96n9BkgEBOz)NFZ>_6 zaUc0$!?M)}LvfHS$n~(npd5(Bs?!#SMKNZ$B&jZKEz(yLLCG-?JUUgZ*KLzn-RCfi z!A2sDxeQ)|6$*<#m8OqZ7{s;EfWz;Cxm~R6TeCb9A_Ab#&`~}v zRmFCdt4&1#-7H8?$7qUzonmK8rHU!b zkxXRsm*S&fyoPoum#kRI-qZH0L8Jv5>&JQ0JrN@y+J9Dv8j!t*z6haxj_d;VGn|?HU+Z`M9>R zWW&_Pi@D3I-JWxk)7;jR=68MkA@$a_Z1I=ZPH$$Xje=Tzl)_X|zK7Mgi#6io92Jm; zPC10w(L1%c$7g@L2qADW!^L8B&HJd|gaR6}Yrg zw#jWmy|P5H?HP)sEM8dPM3CFCaN(#U*LRSxbfbmh`7*qYOXG>IIRSy=*H@F?3ah() z+ver^Beg0Hls{`;#YzHMuZ@(83f!qNLWs|c18&L#M_|~iOU-q>+s}hW8QF%CrL=>I za)^xzq7sOr3~2Z3)Y+UhRB}zncUSU}sg(4}QAc6nFlTl(xXabtG+ayLUg6%gIF6Lt z^)?goo(ekf6doEfQk4*TLqx?a1d#X}1gLjJg(O1m2}utLnLQoJ?zPO0M<%NHjwz{R zbw4&(rCZbDTQZ_$RxYyC!0*y4)gKXz zvr@F$3aIH3#nSi3jx{xx)Yi0g&Pph;OehkFjVmngMI+Q(U&`Jyyx&Je#*C1gP+~p= zK@_eoeNg?d3*O>QLX(E3P7hi--OV^NvKLdSgKbT+u~KSp2AY*Akc;lL;x*EcqqL1( zR4C&~&wX9r6IS22$kZxs4kl@or`Ke|p5ulOe;TDL%yo^3m0YGVIF)( z9?zImYQW(u3!+Imp-w_jcA|j^1*i_BxScU{h8vm9RnkUZxixVXOrcvMQirla)uuL^ zh>ThwTURB_UruzSmO=|$LPc^{GV*SU362b!ipe>6vYV{%te3x}&QG1UGvLIy6W$a~)^0wnv%=%F)jV<4} zViICYbjkrH8+^uX6$%OWY(eow$G<~S!NH{o6rmxlkxOjXD6^uYQQb2@h}k8RJl`ap z>Xs<7XQ~;>7$VEjh(^e_N@g@cJ#>@hkdjKsDe*>;7j@BWAB(SFq(=Wr!gLzX4}J6` zGKg>H_(sJAh3SnOz+3TXmXW~pAW`EV=tak)S!@D4APSKJL&{DB6DtYyRY;!{ zKh(s87udinZHb@%T%2Ov)6NmIxwL?+kJn1ybTi_4e<7evSCBdtz| z;vmGndV5-c=j9rRm_w)dS6VwIwp#r5JQw+NXqV3T6+NgR`6;*Vb&&7lhPjo)N!Ilq zRz>b7+reghNx9@nT{Dd>%oEcx2vO2MEDnROT$3U?RxNlqJrw;whv`09E|to>pbm~` z!GR8wvrHS^NNj9E9};T>>}&I4k{YH(ad`OV9pQl)7`4n;f-Fp7J#RbFm{*?crKHO< zbFI9pYwC~ITf#}+9Q}(dr8AjxV}@5*e}b96GUHyGw#%0|CgPvIqna2e8p7qPd3o10Ag$bsbBZ_ZV7z zVM3cZ3LKE)LAB|@T;Os=bkstPLY>4iqXGb1nV^JNz{p{w5INz+@-LW8-3-dHAg+jo zxG?I0B^bJ@2pJo+(Jit#a?p|CRkOCP9gX)WuxNXt7VHIX2tY0z6v08F6#|2U-X=ln z06ZCzAoEwa?hYY7NLc-kQq1ZVMCQ;WPTd<2zoC*{-W7HWkwlSIHiq4Y<@)^EJT#8H1OLlgGDss6AC>ad*VQysQE+AD^CGkZSgHn2pr-e z${+!{A=I@6Ef0M9$n!nP_^-~Vl5V?lz}!$g$f%s4h<5g#WKPUgRay#AEed#@s1LU> z3rkBtq%+`a7^p-_NF+c4ii#lQd#6tpzwSU zUm5C~NGAqyo}8Hc&WaEHRc6Owo5*%vB~#qtb+-$>WbdOAJo`WWdp+MyqRN z+*)E2#Li3o)I7|dm6ndw$2vE&bB2^!+Lhh2w7JLC61YNSDq=3G9rAGshW~Oiodh;b z17%Vp1dchO-2uI$HmZ_xG&~2rUK4by0|p2P)>g;}BDQUk(62E`~enJfX&yTQV5%~&UcJXQ2)i zGJ@gG=z-1Vfck|9J$%k3iNrvi)QM0)CwzGFAI6ICJgvUo&0$chC82SJ1#Lsw4t8sS zK5hyj!prwQ7x;nchyhOZJKWLGUbS}~9xf-qQVZLficwvFdf54)9R}wI$Ct7{+TwHU zgLgxr)2Ky)ak83E5@{)*h{-g7G|8CoFii+)d7vHAi{m1nqgV=vu92ajp#zqO)UJh~C|H1`0)l~|Kq&zAC}RN+=hUieef@k%DevnFJA*8{OHgXfvOwf;f`onEw`wSWoaC(#;6!m^-0XODm2H>K z;^+rg&6Ox^r)Y%hwNf!bhgXZi?!I-BB<>f)hiJ0zp zcKjru=gz#129X%g&L?PrKV66xf*@GWWDGH9aS8?BWVH%(p<*5h>=(h{A=k;|MLm`s z&IYW4=ooE5aTL^GYCK>s2Y{{dFQ)^h2}~%>O5bA1lO5*wl+;8t2Gl!A6Q*6*Ohu$K zc+8Thwj(b<(SN4iWLno*CeY(5R5dUc(Br|x^SNHm0x;~N2ocoT3Myq7BUw;c7fGH- z)h@^;1Rm}|cLWNYb7Ohd@0GnCctY-lb=9l1Pb7M-*K(Zh-X}5CM28!rw{gb_azewN zaxSCk<-&N*k38dpKV=@DH@krnq8eUZxhK&*fa+1%=I1D#qT7lxbVKmTxI%M;P=eGr zsBKj+X0A-a<%GFv-nqk=jtI2n8DV8F3rI zVg{p(KgQ!^j+0DvElA-h=hv^(Cg2A@La(?90X=NMnIoEGCQJ46hptU;;^mYk|B$&n+(J2va|wkz%YUD zCe;m0YA7nU`Pg?Y<%Il0#sKVIwn-nQBfyieWMiMyPlMEjxDK{ zk%$rrK;Y@c3R>QcyQoDbg;B}rGkd~Q zMJfdL6EUNgy@o_4b`DvI*%Gpd-~61cX^*TkY;46@Bv^{=qGWvyK>|$@9iw+kUu=7 zma+p(q7cxb$oe}w7{Of=ihPsv8WaHG_jwUrhoB!sP#o#<1o1n&%3_*$_LE&_C90%p z8mNdQv-Tc^TuXV+DoZ) z$^SId`h$>{sXbravGQ+Vu3o&v;7QvFgk@~yZTNv9nIDLcZWD5!)Xi+{Q-D5})Im7m z$RY5ut@uyXDl^0>3~Ds(Wi|Ge7F_zg!-9D1S7M>zk5)7gG^nT0W9ixuo}A?tz5o+U zI*?Gf2qwD7O3n@k+a(qUE${RjQ<5=N_EH>H(ufIXz)V-TB<69Xi6KSoA`}ai2O_Rx z&?nB3u$v?g$-%=yn*ai<^p&)GsbP5T`WW<#6%pFGlWfn;o zni@ff3KRpm01vE%^uOEe_}TNeTFq)BHEU6KAn^1`%#cA9K_9G9X@d!VJ3nmWl3?2g zW_A)GLSde*vAG)CfhPhYI6t!egZO( zh&Wk>luki$TG>Q2l?H^ON-sF98 z$cKP$N9doP=s6HKs$7sLmrs-X0|kbA)EhR5$an@5a|RWU%=}%2o`qDN_}d@NHyWk5 z_C(8YtbRnGIv<#>M1CIslaL(TjsbTeN=K)HiMNH_&znGeu!cyNSOP^m4%`6(m_sv( zXFD+)z|hbm1jPWMN*5Hkh^T%;AnG6)iRdA|-@wWKVD>(+3}=S>vCBn7+h0C(aw>zT zHatPq&sE?$S{h1A9kd<6|;&27#YCP^mI+;ent38c`431U>z zBDhr|ND(oi5wtp32M)lZxTKJx2!#fcQWyvsMiLlGVIoK3hKTtfr!ogRr2Y39==)>G zvEm!f@I`w>F!xUPS*;N89ahLCtIX(n&v~)L!Jw|(9nA2sAwMY|3jZtxArnXuB+82F zAtLfHo5BjSQ}~(y|0nN7r`iz)2kpiPl#!lBU{tN>a6Tjg9Zt!J5+VEB55X-bi=h+d zrj(?OygFe0-(M|~p}v3wbRkHU0Jb4(0jG7lO_RVMfcuO3NHmYqcHe$sOvVuDoC`Rn z0XT}Msk#+346uA_5XaVJ=(rR1pVLxELxr4vvFncC<)`is&j@eOhh5PqibK^eNNEa* zK%g303Mf(}T3u}MGCywHz|lZ;Sq7F(&L#`BmP|=XP`?G;dL|qZ+uD8c(9mt=W70Cv zd10i|Wm*dbI-vroX+o6moFNbB2gf}g<3pA>zK%l+|SQF_7$9n9?t-QMlsD~s~Nfcu$VpQv%R%a4M&I|}H z&b0_Y;f*mYgvvUDCOt=JbWR55=L$*n-1B2c#Sa1%43R9se7($+lAa{b`#l&bCRtWB5`rSZ*4P^mBCv<|(HBaC6) ztH97|8PSGd<|H6MPiS*PaY9su`E%NAhzCq`!V?#5F+=3jh#HU-5bm?*1G-Jd+4rFc1=+PAYjLwdi$d zGXSbSV~{>%0Kkde_4?&Q=Md{?2!(hm^iM(7bhdDnJ;1XeOV#!qLD>&naD@ku-c0;i za$O`lROW#HO|5~s1)SZ}QPSq?L)N>%SW4AiSalnOK@ z13(HCEhQcIl}dLCfB$!$mz9jfsYAGOmzsks<2_6%v`{oZ;UM7v(v+H%%kGiMDISUZ z{|bew&OtIm(sg-*5Kf8v;t7=W&$fzohpv0#xFLzqSJy%8iPEqor_CHOE7=~HU&`SZ z=fHSH6bb-*v*LM&1LRC{VC>hTXecnq*KyhK55j1x_-8nHWlvG#k-wUZk$eieaWEy&%Xz$E3LilIwdlp*({qdpDY*9m361>Z zCV-TM?#N2pz0`E7&6PpVtT&GA|URSw!%4vBHRcVLr3xdtHPB z;A|xz2d_}m-SoxqcliQ-n{;;p0KxJHkzgP_!bMY1aS9fHBAEF&S^o^( zSH}C!ZL=+)=*GzeaU>{`KQ-RF(#arPs6>Lh*@ems<0(NaNR*c1oZz7}n1mrIaDxzQ zD@Tu~hr@e*9KG^AYBAbhKC2`@Hgrru5Y;i+<%sp*_Tfg{MNEY6{e$y5GN(foQ z%?dq=2C_YfK%ilWnIJ?3TU2^tj0G!*K3gsVzo97$2j%2BSI z6eWV(T*Op2S3?CdHan>*8ZhIkh?NW_>KsXxb#2I$vXY6dq1{9U%g7j&DQ#6!lpJ=i zkCEu>?Cps$$&?28addoKoU9=IAd}CeaH5{66lD3=$FZ#f;D(xMALvIBdeOU@FHIaw zB?V?OV$wlyv$&b*T#S*uoVzI}Y%>IVfL3hD0GRaB5-gUtbX2S~CAe%Z{_@J^f>wK9R6qW%)B~VMq8STuGV5S@*W-+GJfx!y#f9*g- z0TAdN0QvKT-yq;{NteGP0Mw{$3I%N3f72oUKjb}0_grpYz!)3aaMiB!QPRSNh}RZ!JXwO3}6ZGC;H0hhijsRYbG zY=Tq=>Ii=Sh!CKJgfNV4uafUbfTz#0u_iv-ys=~s>&8cfpv)T3892iQm9$&QixIK| zf&wHUMjc2vwvU?XL^1`?Qx5IVL^D6sA>~7rK9UeH2_S43pr(}~B%E1xC=}M&6kUWB z8VGBT?+gilfZ!g~{YU!k(LLN@J(dy&sxmD%Ea3dt{Lpq&z6%2q6!H);N8^y-nn?*E zj84zxB1+b|!WB_!7t8Sfb47&5KU^qt*JYD7miWZcs@cXM2BFi(h>C`~^wE#@|aOVpnJ6 z?3CA*?Rd5n58I173M1uJIZvnbcdG${m-L6P>X01FCT83IZN{%zY?PwOP$a7PId}XW znDhn%h%Iv4PlHeCm<|^5B|=mWCc+A)1Tlri9W&-c3}tZkyDMSUIsF^;7Z2KU{mS`_ zCSpCZD4{(1QoY&plnI%ThG~DQxqDUQ*z}PY@YZXWhj+81J#XyBkG~FF7Gc%8{13$W UNB!fukN^0)k}1N3fu_0tsCBsZH~;_u literal 0 HcmV?d00001 diff --git a/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch b/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch new file mode 100644 index 0000000000..f244387cc9 --- /dev/null +++ b/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch @@ -0,0 +1,291 @@ +Warning! The powerpc patch (rs6000/linux.h) is hack-ish and would +definitely need to be improved to be acceptable upstream. Also, +this patch isn't complete as it only supports i386, arm, mips, and +powerpc (rs6000). +diff -urN gcc-20011006/config.sub gcc-20011006-new/config.sub +--- gcc-20011006/config.sub 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/config.sub 2004-01-10 11:09:35.000000000 -0600 +@@ -68,7 +68,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- linux-gnu*) ++ linux-gnu* | linux-uclibc*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -936,7 +936,8 @@ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* ) + # Remember, each alternative MUST END IN *, to match a version number. + ;; +diff -urN gcc-20011006/gcc/config/arm/linux-elf.h gcc-20011006-new/gcc/config/arm/linux-elf.h +--- gcc-20011006/gcc/config/arm/linux-elf.h 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/arm/linux-elf.h 2004-01-10 11:12:11.000000000 -0600 +@@ -90,6 +90,18 @@ + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -100,6 +112,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #undef CPP_PREDEFINES + #define CPP_PREDEFINES \ +diff -urN gcc-20011006/gcc/config/i386/linux.h gcc-20011006-new/gcc/config/i386/linux.h +--- gcc-20011006/gcc/config/i386/linux.h 2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/i386/linux.h 2004-01-10 11:15:38.000000000 -0600 +@@ -199,6 +199,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -207,6 +216,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* Get perform_* macros to build libgcc.a. */ + #include "i386/perform.h" +diff -urN gcc-20011006/gcc/config/mips/linux.h gcc-20011006-new/gcc/config/mips/linux.h +--- gcc-20011006/gcc/config/mips/linux.h 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/mips/linux.h 2004-01-10 11:16:39.000000000 -0600 +@@ -154,6 +154,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -163,6 +174,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + + #undef SUBTARGET_ASM_SPEC +diff -urN old/gcc-20011006/gcc/config/mips/t-linux-uclibc gcc-20011006/gcc/config/mips/t-linux-uclibc +--- old/gcc-20011006/gcc/config/mips/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006/gcc/config/mips/t-linux-uclibc 2004-01-14 02:51:10.000000000 -0600 +@@ -0,0 +1 @@ ++T_CFLAGS = -DUSE_UCLIBC +diff -urN gcc-20011006/gcc/config/rs6000/linux.h gcc-20011006-new/gcc/config/rs6000/linux.h +--- gcc-20011006/gcc/config/rs6000/linux.h 2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/rs6000/linux.h 2004-01-10 11:15:38.000000000 -0600 +@@ -36,12 +36,21 @@ + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}" ++#else + #define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}" ++#endif + + #undef LIB_DEFAULT_SPEC + #define LIB_DEFAULT_SPEC "%(lib_linux)" +diff -urN gcc-20011006/gcc/config/t-linux-uclibc gcc-20011006-new/gcc/config/t-linux-uclibc +--- gcc-20011006/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006-new/gcc/config/t-linux-uclibc 2004-01-10 11:18:46.000000000 -0600 +@@ -0,0 +1,18 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Don't install "assert.h" in gcc. We use the one in glibc. ++INSTALL_ASSERT_H = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Do not build libgcc1. Let gcc generate those functions. The GNU/Linux ++# C library can handle them. ++LIBGCC1 = ++CROSS_LIBGCC1 = ++LIBGCC1_TEST = +diff -urN gcc-20011006/gcc/configure gcc-20011006-new/gcc/configure +--- gcc-20011006/gcc/configure 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/configure 2004-01-10 11:28:54.000000000 -0600 +@@ -3219,6 +3219,24 @@ + ;; + esac + ;; ++ arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ xm_file=arm/xm-linux.h ++ xmake_file=x-linux ++ tm_file="arm/linux-elf.h" ++ case $machine in ++ armv2*-*-*) ++ tm_file="arm/linux-elf26.h $tm_file" ++ ;; ++ esac ++ tmake_file="t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-aout) + tm_file=arm/aout.h + tmake_file=arm/t-bare +@@ -3631,6 +3649,18 @@ + thread_file='single' + fi + ;; ++ i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ xmake_file=x-linux ++ tm_file=i386/linux.h ++ tmake_file="t-linux-uclibc i386/t-crtstuff" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ float_format=i386 ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; + i[34567]86-*-linux-gnu*) # Intel 80386's running GNU/Linux + # aka GNU/Linux C library 6 + xmake_file=x-linux +@@ -4696,7 +4726,19 @@ + # On NetBSD, the headers are already okay, except for math.h. + tmake_file=t-netbsd + ;; +- mips*-*-linux*) # Linux MIPS, either endian. ++ mips*-*-linux-uclibc*) # Linux (uclibc) MIPS, either endian. ++ tmake_file=mips/t-linux-uclibc ++ xmake_file=x-linux ++ xm_file="xm-siglist.h ${xm_file}" ++ case $machine in ++ mipsel-*) tm_file="mips/elfl.h mips/linux.h" ;; ++ *) tm_file="mips/elf.h mips/linux.h" ;; ++ esac ++ extra_parts="crtbegin.o crtend.o" ++ gnu_ld=yes ++ gas=yes ++ ;; ++ mips*-*-linux*) # Linux MIPS, either endian. + xmake_file=x-linux + xm_file="xm-siglist.h ${xm_file}" + case $machine in +@@ -5159,6 +5201,24 @@ + thread_file='posix' + fi + ;; ++ powerpc-*-linux-uclibc*) ++ tm_file=rs6000/linux.h ++ xm_file="xm-siglist.h rs6000/xm-sysv4.h" ++ xm_defines="USG ${xm_defines}" ++ out_file=rs6000/rs6000.c ++ if test x$gas = xyes ++ then ++ tmake_file="rs6000/t-ppcos t-linux-uclibc rs6000/t-ppccomm" ++ else ++ tmake_file="rs6000/t-ppc t-linux-uclibc rs6000/t-ppccomm" ++ fi ++ xmake_file=x-linux ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ extra_headers=ppc-asm.h ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; + powerpc-wrs-vxworks*) + cpu_type=rs6000 + xm_file="xm-siglist.h rs6000/xm-sysv4.h" +diff -urN gcc-20011006/ltconfig gcc-20011006-new/ltconfig +--- gcc-20011006/ltconfig 1999-06-21 21:35:12.000000000 -0500 ++++ gcc-20011006-new/ltconfig 2004-01-10 11:34:23.000000000 -0600 +@@ -436,6 +436,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case "$host_os" in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1773,6 +1774,22 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then diff --git a/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch b/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch new file mode 100644 index 0000000000..fee65f9200 --- /dev/null +++ b/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch @@ -0,0 +1,407 @@ +diff -urN STLport-4.5.3/Makefile STLport-4.5.3-devel/Makefile +--- STLport-4.5.3/Makefile Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/Makefile Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,44 @@ ++# Makefile to compile stlport with uClibc ++# ++# Copyright (C) 2002 Erik Andersen ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ ++ARCH:=i386 ++PREFIX:=/usr/$(ARCH)-linux-uclibc ++CROSS:= $(PREFIX)/../bin/$(ARCH)-linux-uclibc- ++CC=$(CROSS)gcc ++CXX=$(CROSS)g++ ++AR = $(CROSS)ar ++STRIP = $(CROSS)strip --remove-section=.comment --remove-section=.note --strip-unneeded ++.EXPORT_ALL_VARIABLES: ++ ++all: ++ rm -f lib/lib* ++ make -C src -f gcc-uClibc.mak all ++ (cd lib; rm -f libstdc++_debug.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so.0;) ++ $(STRIP) lib/libstdc++.so.4.5; ++ ++clean: ++ make -C src -f gcc-uClibc.mak clean ++ rm -rf lib/* ++ ++install: ++ (cd lib; \ ++ cp -a libstdc++.a $(PREFIX)/lib; \ ++ cp -a libstdc++.so libstdc++.so.0 libstdc++.so.4.5 $(PREFIX)/lib;) ++ cp -a stlport $(PREFIX)/include/c++ +diff -urN STLport-4.5.3/src/dll_main.cpp STLport-4.5.3-devel/src/dll_main.cpp +--- STLport-4.5.3/src/dll_main.cpp Sat Feb 2 16:11:56 2002 ++++ STLport-4.5.3-devel/src/dll_main.cpp Tue Jan 7 15:28:08 2003 +@@ -52,7 +52,7 @@ + # include + # endif + +-# if defined (_STLP_UNIX) ++# if defined (_STLP_UNIX) && defined (_STLP_PTHREADS) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_HAS_PERTHREAD_ALLOCATOR + # include + # endif +diff -urN STLport-4.5.3/src/gcc-uClibc.mak STLport-4.5.3-devel/src/gcc-uClibc.mak +--- STLport-4.5.3/src/gcc-uClibc.mak Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/src/gcc-uClibc.mak Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,61 @@ ++# ++# Basename for libraries ++# ++LIB_BASENAME:=libstdc++ ++LIB_SHAREDNAME:=$(LIB_BASENAME).so ++LIB_SHAREDNAME_FULL:=$(LIB_SHAREDNAME).0 ++ ++# ++# guts for common stuff ++# ++# ++LINK:=$(AR) -cr ++#DYN_LINK:=$(CC) -fno-exceptions -lpthread -lm -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++DYN_LINK:=$(CC) -fno-exceptions -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++ ++OBJEXT=o ++DYNEXT=so ++STEXT=a ++RM=rm -rf ++PATH_SEP=/ ++MKDIR=mkdir -p ++COMP=GCC$(ARCH) ++INSTALL_STEP = install_unix ++ ++all: release_dynamic release_static ++#all: all_dynamic all_static symbolic_links ++ ++include common_macros.mak ++STLDEBUG_NAME:=$(LIB_BASENAME).debug ++ ++# Lets disable exception support, since this saves over 200k... ++DEFINE_FLAGS:= -fno-exceptions ++#DEFINE_FLAGS:= -D_STLP_NO_EXCEPTIONS -fno-exceptions -DSTL_NO_EXCEPTIONS ++ ++#DEFINE_FLAGS+= -D_STLP_USE_UCLIBC -D_STLP_NO_WCHAR_T \ ++# -DUSE_SPRINTF_INSTEAD -D_ISOC99_SOURCE ++ ++WARNING_FLAGS:= -W -Wno-sign-compare -Wno-unused -Wno-uninitialized ++INCLUDE_FLAGS = -I${STLPORT_DIR} ++CXXFLAGS_COMMON = $(WARNING_FLAGS) $(DEFINE_FLAGS) $(INCLUDE_FLAGS) ++ ++CXXFLAGS_RELEASE_static = $(CXXFLAGS_COMMON) -Os ++CXXFLAGS_RELEASE_dynamic = $(CXXFLAGS_COMMON) -Os -fPIC ++ ++CXXFLAGS_DEBUG_static = $(CXXFLAGS_COMMON) -O -g ++CXXFLAGS_DEBUG_dynamic = $(CXXFLAGS_COMMON) -O -g -fPIC ++ ++CXXFLAGS_STLDEBUG_static = $(CXXFLAGS_DEBUG_static) -D_STLP_DEBUG ++CXXFLAGS_STLDEBUG_dynamic = $(CXXFLAGS_DEBUG_dynamic) -D_STLP_DEBUG -fPIC ++ ++include common_percent_rules.mak ++include common_rules.mak ++ ++ ++#install: all ++# cp -p $(LIB_TARGET) ${D_LIB_TARGET} ../lib ++ ++#%.s: %.cpp ++# $(CXX) $(CXXFLAGS) -O4 -S -pto $< -o $@ ++ ++ +diff -urN STLport-4.5.3/src/num_put_float.cpp STLport-4.5.3-devel/src/num_put_float.cpp +--- STLport-4.5.3/src/num_put_float.cpp Fri Jan 18 15:06:52 2002 ++++ STLport-4.5.3-devel/src/num_put_float.cpp Tue Jan 7 15:28:08 2003 +@@ -65,6 +65,12 @@ + + # endif + ++# if defined(_STLP_USE_UCLIBC) ++# define __USE_ISOC99 1 ++# include ++# include ++# endif ++ + # include + + #if defined (_MSC_VER) || defined (__MINGW32__) || defined (__BORLANDC__) || defined (__DJGPP) || defined (_STLP_SCO_OPENSERVER) || defined (__NCR_SVR) +@@ -209,7 +215,7 @@ + + #ifdef USE_SPRINTF_INSTEAD + +-#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) ++#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) || defined (_STLP_USE_UCLIBC) + # if defined (isfinite) + inline bool _Stl_is_nan_or_inf(double x) { return !isfinite(x); } + # else +@@ -238,7 +244,7 @@ + } + inline bool _Stl_is_neg_inf(double x) { return _fpclass(x) == _FPCLASS_NINF; } + inline bool _Stl_is_neg_nan(double x) { return _isnan(x) && _copysign(1., x) < 0 ; } +-#elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW ++#elif defined(__MRC__) || defined(__SC__) + bool _Stl_is_nan_or_inf(double x) { return isnan(x) || !isfinite(x); } + bool _Stl_is_inf(double x) { return !isfinite(x); } + bool _Stl_is_neg_inf(double x) { return !isfinite(x) && signbit(x); } +@@ -280,7 +286,7 @@ + inline char* _Stl_qfcvtR(long double x, int n, int* pt, int* sign, char* buf) + { return fcvtbuf(x, n, pt, sign, buf); } + # endif +-#elif defined (_STLP_USE_GLIBC) ++#elif defined (_STLP_USE_GLIBC) || defined(_STLP_USE_UCLIBC) + inline char* _Stl_ecvtR(double x, int n, int* pt, int* sign, char* buf) + { return buf + ecvt_r(x, n, pt, sign, buf, NDIG+2); } + inline char* _Stl_fcvtR(double x, int n, int* pt, int* sign, char* buf) +diff -urN STLport-4.5.3/src/stdio_streambuf.cpp STLport-4.5.3-devel/src/stdio_streambuf.cpp +--- STLport-4.5.3/src/stdio_streambuf.cpp Thu Jan 10 11:41:52 2002 ++++ STLport-4.5.3-devel/src/stdio_streambuf.cpp Tue Jan 7 15:28:08 2003 +@@ -82,7 +82,7 @@ + _STLP_VENDOR_CSTD::fgetpos(_M_file, &pos); + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if defined(_STLP_USE_UCLIBC) || (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + return pos_type((streamoff)pos.__pos); + #elif defined(__ISCPP__) || defined(__MVS__) || (__OS400__) + return pos_type(pos.__fpos_elem[ 0 ]); +@@ -101,13 +101,16 @@ + + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + fpos_t p; + p.__pos = pos; + memset( &(p.__state), 0, sizeof(p.__state) ); + #elif defined(__MVS__) || (__OS400__) + fpos_t p; + p.__fpos_elem[0] = pos; ++#elif defined(_STLP_USE_UCLIBC) ++ fpos_t p; ++ p.__pos = pos; + #else + fpos_t p(pos); + #endif +diff -urN STLport-4.5.3/stlport/config/_prolog.h STLport-4.5.3-devel/stlport/config/_prolog.h +--- STLport-4.5.3/stlport/config/_prolog.h Sun Oct 28 13:26:44 2001 ++++ STLport-4.5.3-devel/stlport/config/_prolog.h Tue Jan 7 15:28:08 2003 +@@ -1,3 +1,8 @@ ++/* Evil hack to make sure everything behaves itself */ ++#define _STLP_USE_UCLIBC ++//#define _STLP_NO_WCHAR_T ++//#define _ISOC99_SOURCE ++//#define USE_SPRINTF_INSTEAD + + #if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__) + +diff -urN STLport-4.5.3/stlport/config/stl_gcc.h STLport-4.5.3-devel/stlport/config/stl_gcc.h +--- STLport-4.5.3/stlport/config/stl_gcc.h Thu Jan 10 11:41:58 2002 ++++ STLport-4.5.3-devel/stlport/config/stl_gcc.h Tue Jan 7 15:28:08 2003 +@@ -3,7 +3,7 @@ + */ + + /* Systems having GLIBC installed have different traits */ +-#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) ++#if ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) + # define _STLP_USE_GLIBC + #endif + +diff -urN STLport-4.5.3/stlport/cstdlib STLport-4.5.3-devel/stlport/cstdlib +--- STLport-4.5.3/stlport/cstdlib Thu Aug 23 15:51:54 2001 ++++ STLport-4.5.3-devel/stlport/cstdlib Tue Jan 7 15:28:08 2003 +@@ -55,9 +55,11 @@ + using _STLP_VENDOR_CSTD::atof; + using _STLP_VENDOR_CSTD::atoi; + using _STLP_VENDOR_CSTD::atol; ++# ifndef _STLP_USE_UCLIBC + using _STLP_VENDOR_CSTD::mblen; + using _STLP_VENDOR_CSTD::mbstowcs; + using _STLP_VENDOR_CSTD::mbtowc; ++# endif + using _STLP_VENDOR_CSTD::strtod; + using _STLP_VENDOR_CSTD::strtol; + using _STLP_VENDOR_CSTD::strtoul; +diff -urN STLport-4.5.3/stlport/stl/_config.h STLport-4.5.3-devel/stlport/stl/_config.h +--- STLport-4.5.3/stlport/stl/_config.h Fri Jan 18 15:08:36 2002 ++++ STLport-4.5.3-devel/stlport/stl/_config.h Tue Jan 7 15:28:08 2003 +@@ -26,6 +26,16 @@ + #ifndef _STLP_CONFIG_H + # define _STLP_CONFIG_H + ++/* Make the STLport headers provide uClibc support by default */ ++#define _STLP_NO_EXCEPTIONS 1 ++#define STL_NO_EXCEPTIONS 1 ++#define _STLP_USE_UCLIBC 1 ++//#define _STLP_NO_WCHAR_T 1 ++#define _STLP_NO_LONG_DOUBLE 1 ++#define USE_SPRINTF_INSTEAD 1 ++#define _ISOC99_SOURCE 1 ++#define _STLP_NO_ANACHRONISMS 1 ++ + /* + * Purpose of this file : + * +@@ -164,7 +174,7 @@ + /* Operating system recognition (basic) */ + # if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX) || defined (__NetBSD__) || defined (__Lynx__) + # define _STLP_UNIX 1 +-# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) ++# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_USE_GLIBC 1 + # endif + # elif defined(macintosh) || defined (_MAC) +diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/stl/_stdio_file.h +--- STLport-4.5.3/stlport/stl/_stdio_file.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/_stdio_file.h Tue Jan 7 15:28:08 2003 +@@ -634,6 +634,112 @@ + } + # define _STLP_FILE_I_O_IDENTICAL + ++#elif defined(_STLP_USE_UCLIBC) ++ ++#if defined(__MASK_READING) ++ ++inline int _FILE_fd(const FILE *__f) { return __f->__filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->__bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->__bufgetc_u - __f->__bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->__bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->__bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->__bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->__bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->__bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->__bufstart = (unsigned char*)__begin; ++ __f->__bufpos = (unsigned char*)__next; ++ __f->__bufend = (unsigned char*)__end; ++ __f->__bufgetc_u = (unsigned char*)__begin; ++ __f->__bufputc_u = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#else // Support old stdio for a little while. ++ ++inline int _FILE_fd(const FILE *__f) { return __f->filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->bufgetc - __f->bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->bufstart = (unsigned char*)__begin; ++ __f->bufpos = (unsigned char*)__next; ++ __f->bufend = (unsigned char*)__end; ++ __f->bufgetc = (unsigned char*)__begin; ++ __f->bufputc = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#endif ++ + #else /* A C library that we don't have an implementation for. */ + + # error The C++ I/O library is not configured for this compiler +diff -urN STLport-4.5.3/stlport/stl/c_locale.h STLport-4.5.3-devel/stlport/stl/c_locale.h +--- STLport-4.5.3/stlport/stl/c_locale.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/c_locale.h Wed Jan 8 10:58:10 2003 +@@ -401,6 +401,21 @@ + # define _Locale_SPACE _S + # define _Locale_PRINT (_P | _U | _L | _N | _B) + # define _Locale_ALPHA (_U | _L) ++ ++# elif defined(_STLP_USE_UCLIBC) /* linux, using the gnu compiler */ ++ ++# define _Locale_CNTRL _IScntrl ++# define _Locale_UPPER _ISupper ++# define _Locale_LOWER _ISlower ++# define _Locale_DIGIT _ISdigit ++# define _Locale_XDIGIT _ISxdigit ++# define _Locale_PUNCT _ISpunct ++# define _Locale_SPACE _ISspace ++# define _Locale_PRINT _ISprint ++# define _Locale_ALPHA _ISalpha ++ ++#else ++# error Unknown Locale + #endif + + # endif /* _STLP_C_LOCALE_H */ diff --git a/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext < ++ #include ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use . ++ ++// Written by Benjamin Kosnik ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__int_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__ext_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.3/500-loop.patch b/openwrt/toolchain/gcc/3.3.3/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext < ++ #include ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use . ++ ++// Written by Benjamin Kosnik ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__int_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__ext_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.4/500-loop.patch b/openwrt/toolchain/gcc/3.3.4/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float new file mode 100644 index 0000000000..d692174aab --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float @@ -0,0 +1,124 @@ +*asm: +%{mbig-endian:-EB} %{mlittle-endian:-EL} %{mcpu=*:-mcpu=%*} %{march=*:-march=%*} %{mapcs-*:-mapcs-%*} %(subtarget_asm_float_spec) %{mthumb-interwork:-mthumb-interwork} %(subtarget_extra_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: + + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(cpp_cpu_arch) %(subtarget_cpp_spec) %{mapcs-32:%{mapcs-26: %e-mapcs-26 and -mapcs-32 may not be used together}} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{mbig-endian:%{mlittle-endian: %e-mbig-endian and -mlittle-endian may not be used together}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{h*} %{version:-v} %{b} %{Wl,*:%*} %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} -X %{mbig-endian:-EB} -m armelf_linux -p + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{!mhard-float:-lfloat} %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:-lgcc_s%M}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +marm mlittle-endian msoft-float mapcs-32 mno-thumb-interwork + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_cpu_arch: +%{march=arm2:-D__ARM_ARCH_2__} %{march=arm250:-D__ARM_ARCH_2__} %{march=arm3:-D__ARM_ARCH_2__} %{march=arm6:-D__ARM_ARCH_3__} %{march=arm600:-D__ARM_ARCH_3__} %{march=arm610:-D__ARM_ARCH_3__} %{march=arm7:-D__ARM_ARCH_3__} %{march=arm700:-D__ARM_ARCH_3__} %{march=arm710:-D__ARM_ARCH_3__} %{march=arm720:-D__ARM_ARCH_3__} %{march=arm7100:-D__ARM_ARCH_3__} %{march=arm7500:-D__ARM_ARCH_3__} %{march=arm7500fe:-D__ARM_ARCH_3__} %{march=arm7m:-D__ARM_ARCH_3M__} %{march=arm7dm:-D__ARM_ARCH_3M__} %{march=arm7dmi:-D__ARM_ARCH_3M__} %{march=arm7tdmi:-D__ARM_ARCH_4T__} %{march=arm8:-D__ARM_ARCH_4__} %{march=arm810:-D__ARM_ARCH_4__} %{march=arm9:-D__ARM_ARCH_4T__} %{march=arm920:-D__ARM_ARCH_4__} %{march=arm920t:-D__ARM_ARCH_4T__} %{march=arm9tdmi:-D__ARM_ARCH_4T__} %{march=strongarm:-D__ARM_ARCH_4__} %{march=strongarm110:-D__ARM_ARCH_4__} %{march=strongarm1100:-D__ARM_ARCH_4__} %{march=xscale:-D__ARM_ARCH_5TE__} %{march=xscale:-D__XSCALE__} %{march=armv2:-D__ARM_ARCH_2__} %{march=armv2a:-D__ARM_ARCH_2__} %{march=armv3:-D__ARM_ARCH_3__} %{march=armv3m:-D__ARM_ARCH_3M__} %{march=armv4:-D__ARM_ARCH_4__} %{march=armv4t:-D__ARM_ARCH_4T__} %{march=armv5:-D__ARM_ARCH_5__} %{march=armv5t:-D__ARM_ARCH_5T__} %{march=armv5e:-D__ARM_ARCH_5E__} %{march=armv5te:-D__ARM_ARCH_5TE__} %{!march=*: %{mcpu=arm2:-D__ARM_ARCH_2__} %{mcpu=arm250:-D__ARM_ARCH_2__} %{mcpu=arm3:-D__ARM_ARCH_2__} %{mcpu=arm6:-D__ARM_ARCH_3__} %{mcpu=arm600:-D__ARM_ARCH_3__} %{mcpu=arm610:-D__ARM_ARCH_3__} %{mcpu=arm7:-D__ARM_ARCH_3__} %{mcpu=arm700:-D__ARM_ARCH_3__} %{mcpu=arm710:-D__ARM_ARCH_3__} %{mcpu=arm720:-D__ARM_ARCH_3__} %{mcpu=arm7100:-D__ARM_ARCH_3__} %{mcpu=arm7500:-D__ARM_ARCH_3__} %{mcpu=arm7500fe:-D__ARM_ARCH_3__} %{mcpu=arm7m:-D__ARM_ARCH_3M__} %{mcpu=arm7dm:-D__ARM_ARCH_3M__} %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} %{mcpu=arm8:-D__ARM_ARCH_4__} %{mcpu=arm810:-D__ARM_ARCH_4__} %{mcpu=arm9:-D__ARM_ARCH_4T__} %{mcpu=arm920:-D__ARM_ARCH_4__} %{mcpu=arm920t:-D__ARM_ARCH_4T__} %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} %{mcpu=strongarm:-D__ARM_ARCH_4__} %{mcpu=strongarm110:-D__ARM_ARCH_4__} %{mcpu=strongarm1100:-D__ARM_ARCH_4__} %{mcpu=xscale:-D__ARM_ARCH_5TE__} %{mcpu=xscale:-D__XSCALE__} %{!mcpu*:%(cpp_cpu_arch_default)}} + +*cpp_cpu_arch_default: +-D__ARM_ARCH_4T__ + +*subtarget_cpp_spec: +%{posix:-D_POSIX_SOURCE} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} + +*subtarget_extra_asm_spec: + + +*subtarget_asm_float_spec: +%{mapcs-float:-mfloat} %{!mhard-float:-mno-fpu} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float new file mode 100644 index 0000000000..2a4240012b --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EB mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EL:%{!mel:-EB}} %{EL|mel:-EL} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float new file mode 100644 index 0000000000..481bf5a395 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EB:%{!meb:-EL}} %{EB|meb:-EB} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float new file mode 100644 index 0000000000..8a546ac8ec --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float @@ -0,0 +1,352 @@ +*asm: +%(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-freebsd: -mbig} %{mcall-i960-old: -mlittle} %{mcall-linux: -mbig} %{mcall-gnu: -mbig} %{mcall-netbsd: -mbig} }}}} + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %{mads: %(cpp_os_ads) } %{myellowknife: %(cpp_os_yellowknife) } %{mmvme: %(cpp_os_mvme) } %{msim: %(cpp_os_sim) } %{mwindiss: %(cpp_os_windiss) } %{mcall-freebsd: %(cpp_os_freebsd) } %{mcall-linux: %(cpp_os_linux) } %{mcall-gnu: %(cpp_os_gnu) } %{mcall-netbsd: %(cpp_os_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{G*} %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-aixdesc: -mbig %(cc1_endian_big) } %{mcall-freebsd: -mbig %(cc1_endian_big) } %{mcall-i960-old: -mlittle %(cc1_endian_little) } %{mcall-linux: -mbig %(cc1_endian_big) } %{mcall-gnu: -mbig %(cc1_endian_big) } %{mcall-netbsd: -mbig %(cc1_endian_big) } %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cc1_endian_default) }}}}}} }}}} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{mads: crtsavres.o%s %(endfile_ads)} %{myellowknife: crtsavres.o%s %(endfile_yellowknife)} %{mmvme: crtsavres.o%s %(endfile_mvme)} %{msim: crtsavres.o%s %(endfile_sim)} %{mwindiss: %(endfile_windiss)} %{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } %{mcall-linux: crtsavres.o%s %(endfile_linux) } %{mcall-gnu: crtsavres.o%s %(endfile_gnu) } %{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } %{mvxworks: crtsavres.o%s %(endfile_vxworks) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) %(endfile_default) }}}}}}}}}} + +*link: +%{!static:--eh-frame-hdr} %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os) + +*lib: +%{mads: %(lib_ads) } %{myellowknife: %(lib_yellowknife) } %{mmvme: %(lib_mvme) } %{msim: %(lib_sim) } %{mwindiss: %(lib_windiss) } %{mcall-freebsd: %(lib_freebsd) } %{mcall-linux: %(lib_linux) } %{mcall-gnu: %(lib_gnu) } %{mcall-netbsd: %(lib_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{mads: %(startfile_ads) } %{myellowknife: %(startfile_yellowknife) } %{mmvme: %(startfile_mvme) } %{msim: %(startfile_sim) } %{mwindiss: %(startfile_windiss) } %{mcall-freebsd: %(startfile_freebsd) } %{mcall-linux: %(startfile_linux) } %{mcall-gnu: %(startfile_gnu) } %{mcall-netbsd: %(startfile_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. mhard-float;nof !mhard-float; + +*multilib_defaults: +mbig mcall-sysv + +*multilib_extra: +fPIC mstrict-align + +*multilib_matches: +mcpu=401 msoft-float;mcpu=403 msoft-float;mcpu=405 msoft-float;mcpu=ec603e msoft-float;mcpu=801 msoft-float;mcpu=821 msoft-float;mcpu=823 msoft-float;mcpu=860 msoft-float;msoft-float msoft-float; + +*multilib_exclusions: + + +*multilib_options: +msoft-float + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_default: + + +*asm_cpu: +%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=750: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=8540: -me500} %{maltivec: -maltivec} + +*asm_default: +-mppc + +*cpp_sysv: +%{mrelocatable*: -D_RELOCATABLE} %{fpic: -D__PIC__=1 -D__pic__=1} %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} + +*crtsavres_default: +crtsavres.o%s + +*lib_ads: +--start-group -lads -lc --end-group + +*lib_yellowknife: +--start-group -lyk -lc --end-group + +*lib_mvme: +--start-group -lmvme -lc --end-group + +*lib_sim: +--start-group -lsim -lc --end-group + +*lib_freebsd: + %{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} } + +*lib_gnu: +%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_linux: +%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} %{!shared: %{profile:-lc_p} %{!profile:-lc}}} + +*lib_netbsd: +%{profile:-lgmon -lc_p} %{!profile:-lc} + +*lib_vxworks: + + +*lib_windiss: +--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group + +*lib_default: +%(lib_linux) + +*startfile_ads: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_yellowknife: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_mvme: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_sim: +ecrti.o%s sim-crt0.o%s crtbegin.o%s + +*startfile_freebsd: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_gnu: +%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_linux: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*startfile_netbsd: +ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_vxworks: + + +*startfile_windiss: +crt0.o%s crtbegin.o%s + +*startfile_default: +%(startfile_linux) + +*endfile_ads: +crtend.o%s ecrtn.o%s + +*endfile_yellowknife: +crtend.o%s ecrtn.o%s + +*endfile_mvme: +crtend.o%s ecrtn.o%s + +*endfile_sim: +crtend.o%s ecrtn.o%s + +*endfile_freebsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*endfile_gnu: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_linux: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_netbsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s + +*endfile_vxworks: + + +*endfile_windiss: +crtend.o%s + +*endfile_default: +%(endfile_linux) + +*link_path: + + +*link_shlib: +%{shared:-shared} %{!shared: %{static:-static}} + +*link_target: +%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}} + +*link_start: +%{mads: %(link_start_ads) } %{myellowknife: %(link_start_yellowknife) } %{mmvme: %(link_start_mvme) } %{msim: %(link_start_sim) } %{mwindiss: %(link_start_windiss) } %{mcall-freebsd: %(link_start_freebsd) } %{mcall-linux: %(link_start_linux) } %{mcall-gnu: %(link_start_gnu) } %{mcall-netbsd: %(link_start_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}} + +*link_start_ads: +-T ads.ld%s + +*link_start_yellowknife: +-T yellowknife.ld%s + +*link_start_mvme: +-Ttext 0x40000 + +*link_start_sim: + + +*link_start_freebsd: + + +*link_start_gnu: + + +*link_start_linux: + + +*link_start_netbsd: + + +*link_start_vxworks: + + +*link_start_windiss: + + +*link_start_default: +%(link_start_linux) + +*link_os: +%{mads: %(link_os_ads) } %{myellowknife: %(link_os_yellowknife) } %{mmvme: %(link_os_mvme) } %{msim: %(link_os_sim) } %{mwindiss: %(link_os_windiss) } %{mcall-freebsd: %(link_os_freebsd) } %{mcall-linux: %(link_os_linux) } %{mcall-gnu: %(link_os_gnu) } %{mcall-netbsd: %(link_os_netbsd) } %{mcall-uclibc: %(link_os_linux_uclibc) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-uclibc: %(link_os_default) }}}}}}}}}} + +*link_os_ads: + + +*link_os_yellowknife: + + +*link_os_mvme: + + +*link_os_sim: +-m elf32ppcsim + +*link_os_freebsd: + %{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} %{static:-Bstatic}} %{symbolic:-Bsymbolic} + +*link_os_linux: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_gnu: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_netbsd: +%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}} + +*link_os_vxworks: +-r + +*link_os_windiss: + + +*link_os_linux_uclibc: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} + +*link_os_default: +%(link_os_linux_uclibc) + +*cc1_endian_big: + + +*cc1_endian_little: +%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }} + +*cc1_endian_default: +%(cc1_endian_big) + +*cpp_os_ads: + + +*cpp_os_yellowknife: + + +*cpp_os_mvme: + + +*cpp_os_sim: + + +*cpp_os_freebsd: + -D__ELF__ -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc + +*cpp_os_gnu: +-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_linux: +-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_netbsd: +-D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ + +*cpp_os_rtems: +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } + +*cpp_os_vxworks: +-DCPU_FAMILY=PPC %{!mcpu*: %{mpowerpc*: -DCPU=PPC603} %{!mno-powerpc: -DCPU=PPC603}} %{mcpu=powerpc: -DCPU=PPC603} %{mcpu=401: -DCPU=PPC403} %{mcpu=403: -DCPU=PPC403} %{mcpu=405: -DCPU=PPC405} %{mcpu=601: -DCPU=PPC601} %{mcpu=602: -DCPU=PPC603} %{mcpu=603: -DCPU=PPC603} %{mcpu=603e: -DCPU=PPC603} %{mcpu=ec603e: -DCPU=PPC603} %{mcpu=604: -DCPU=PPC604} %{mcpu=604e: -DCPU=PPC604} %{mcpu=620: -DCPU=PPC604} %{mcpu=740: -DCPU=PPC603} %{mcpu=7450: -DCPU=PPC603} %{mcpu=750: -DCPU=PPC603} %{mcpu=801: -DCPU=PPC603} %{mcpu=821: -DCPU=PPC603} %{mcpu=823: -DCPU=PPC603} %{mcpu=860: -DCPU=PPC603} + +*cpp_os_windiss: +-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp} + +*cpp_os_default: +%(cpp_os_linux) + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext < ++ #include ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use . ++ ++// Written by Benjamin Kosnik ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__int_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__ext_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.5/500-loop.patch b/openwrt/toolchain/gcc/3.3.5/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float new file mode 100644 index 0000000000..d692174aab --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float @@ -0,0 +1,124 @@ +*asm: +%{mbig-endian:-EB} %{mlittle-endian:-EL} %{mcpu=*:-mcpu=%*} %{march=*:-march=%*} %{mapcs-*:-mapcs-%*} %(subtarget_asm_float_spec) %{mthumb-interwork:-mthumb-interwork} %(subtarget_extra_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: + + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(cpp_cpu_arch) %(subtarget_cpp_spec) %{mapcs-32:%{mapcs-26: %e-mapcs-26 and -mapcs-32 may not be used together}} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{mbig-endian:%{mlittle-endian: %e-mbig-endian and -mlittle-endian may not be used together}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{h*} %{version:-v} %{b} %{Wl,*:%*} %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} -X %{mbig-endian:-EB} -m armelf_linux -p + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{!mhard-float:-lfloat} %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:-lgcc_s%M}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +marm mlittle-endian msoft-float mapcs-32 mno-thumb-interwork + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_cpu_arch: +%{march=arm2:-D__ARM_ARCH_2__} %{march=arm250:-D__ARM_ARCH_2__} %{march=arm3:-D__ARM_ARCH_2__} %{march=arm6:-D__ARM_ARCH_3__} %{march=arm600:-D__ARM_ARCH_3__} %{march=arm610:-D__ARM_ARCH_3__} %{march=arm7:-D__ARM_ARCH_3__} %{march=arm700:-D__ARM_ARCH_3__} %{march=arm710:-D__ARM_ARCH_3__} %{march=arm720:-D__ARM_ARCH_3__} %{march=arm7100:-D__ARM_ARCH_3__} %{march=arm7500:-D__ARM_ARCH_3__} %{march=arm7500fe:-D__ARM_ARCH_3__} %{march=arm7m:-D__ARM_ARCH_3M__} %{march=arm7dm:-D__ARM_ARCH_3M__} %{march=arm7dmi:-D__ARM_ARCH_3M__} %{march=arm7tdmi:-D__ARM_ARCH_4T__} %{march=arm8:-D__ARM_ARCH_4__} %{march=arm810:-D__ARM_ARCH_4__} %{march=arm9:-D__ARM_ARCH_4T__} %{march=arm920:-D__ARM_ARCH_4__} %{march=arm920t:-D__ARM_ARCH_4T__} %{march=arm9tdmi:-D__ARM_ARCH_4T__} %{march=strongarm:-D__ARM_ARCH_4__} %{march=strongarm110:-D__ARM_ARCH_4__} %{march=strongarm1100:-D__ARM_ARCH_4__} %{march=xscale:-D__ARM_ARCH_5TE__} %{march=xscale:-D__XSCALE__} %{march=armv2:-D__ARM_ARCH_2__} %{march=armv2a:-D__ARM_ARCH_2__} %{march=armv3:-D__ARM_ARCH_3__} %{march=armv3m:-D__ARM_ARCH_3M__} %{march=armv4:-D__ARM_ARCH_4__} %{march=armv4t:-D__ARM_ARCH_4T__} %{march=armv5:-D__ARM_ARCH_5__} %{march=armv5t:-D__ARM_ARCH_5T__} %{march=armv5e:-D__ARM_ARCH_5E__} %{march=armv5te:-D__ARM_ARCH_5TE__} %{!march=*: %{mcpu=arm2:-D__ARM_ARCH_2__} %{mcpu=arm250:-D__ARM_ARCH_2__} %{mcpu=arm3:-D__ARM_ARCH_2__} %{mcpu=arm6:-D__ARM_ARCH_3__} %{mcpu=arm600:-D__ARM_ARCH_3__} %{mcpu=arm610:-D__ARM_ARCH_3__} %{mcpu=arm7:-D__ARM_ARCH_3__} %{mcpu=arm700:-D__ARM_ARCH_3__} %{mcpu=arm710:-D__ARM_ARCH_3__} %{mcpu=arm720:-D__ARM_ARCH_3__} %{mcpu=arm7100:-D__ARM_ARCH_3__} %{mcpu=arm7500:-D__ARM_ARCH_3__} %{mcpu=arm7500fe:-D__ARM_ARCH_3__} %{mcpu=arm7m:-D__ARM_ARCH_3M__} %{mcpu=arm7dm:-D__ARM_ARCH_3M__} %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} %{mcpu=arm8:-D__ARM_ARCH_4__} %{mcpu=arm810:-D__ARM_ARCH_4__} %{mcpu=arm9:-D__ARM_ARCH_4T__} %{mcpu=arm920:-D__ARM_ARCH_4__} %{mcpu=arm920t:-D__ARM_ARCH_4T__} %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} %{mcpu=strongarm:-D__ARM_ARCH_4__} %{mcpu=strongarm110:-D__ARM_ARCH_4__} %{mcpu=strongarm1100:-D__ARM_ARCH_4__} %{mcpu=xscale:-D__ARM_ARCH_5TE__} %{mcpu=xscale:-D__XSCALE__} %{!mcpu*:%(cpp_cpu_arch_default)}} + +*cpp_cpu_arch_default: +-D__ARM_ARCH_4T__ + +*subtarget_cpp_spec: +%{posix:-D_POSIX_SOURCE} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} + +*subtarget_extra_asm_spec: + + +*subtarget_asm_float_spec: +%{mapcs-float:-mfloat} %{!mhard-float:-mno-fpu} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float new file mode 100644 index 0000000000..2a4240012b --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EB mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EL:%{!mel:-EB}} %{EL|mel:-EL} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float new file mode 100644 index 0000000000..481bf5a395 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EB:%{!meb:-EL}} %{EB|meb:-EB} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float new file mode 100644 index 0000000000..8a546ac8ec --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float @@ -0,0 +1,352 @@ +*asm: +%(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-freebsd: -mbig} %{mcall-i960-old: -mlittle} %{mcall-linux: -mbig} %{mcall-gnu: -mbig} %{mcall-netbsd: -mbig} }}}} + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %{mads: %(cpp_os_ads) } %{myellowknife: %(cpp_os_yellowknife) } %{mmvme: %(cpp_os_mvme) } %{msim: %(cpp_os_sim) } %{mwindiss: %(cpp_os_windiss) } %{mcall-freebsd: %(cpp_os_freebsd) } %{mcall-linux: %(cpp_os_linux) } %{mcall-gnu: %(cpp_os_gnu) } %{mcall-netbsd: %(cpp_os_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{G*} %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-aixdesc: -mbig %(cc1_endian_big) } %{mcall-freebsd: -mbig %(cc1_endian_big) } %{mcall-i960-old: -mlittle %(cc1_endian_little) } %{mcall-linux: -mbig %(cc1_endian_big) } %{mcall-gnu: -mbig %(cc1_endian_big) } %{mcall-netbsd: -mbig %(cc1_endian_big) } %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cc1_endian_default) }}}}}} }}}} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{mads: crtsavres.o%s %(endfile_ads)} %{myellowknife: crtsavres.o%s %(endfile_yellowknife)} %{mmvme: crtsavres.o%s %(endfile_mvme)} %{msim: crtsavres.o%s %(endfile_sim)} %{mwindiss: %(endfile_windiss)} %{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } %{mcall-linux: crtsavres.o%s %(endfile_linux) } %{mcall-gnu: crtsavres.o%s %(endfile_gnu) } %{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } %{mvxworks: crtsavres.o%s %(endfile_vxworks) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) %(endfile_default) }}}}}}}}}} + +*link: +%{!static:--eh-frame-hdr} %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os) + +*lib: +%{mads: %(lib_ads) } %{myellowknife: %(lib_yellowknife) } %{mmvme: %(lib_mvme) } %{msim: %(lib_sim) } %{mwindiss: %(lib_windiss) } %{mcall-freebsd: %(lib_freebsd) } %{mcall-linux: %(lib_linux) } %{mcall-gnu: %(lib_gnu) } %{mcall-netbsd: %(lib_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{mads: %(startfile_ads) } %{myellowknife: %(startfile_yellowknife) } %{mmvme: %(startfile_mvme) } %{msim: %(startfile_sim) } %{mwindiss: %(startfile_windiss) } %{mcall-freebsd: %(startfile_freebsd) } %{mcall-linux: %(startfile_linux) } %{mcall-gnu: %(startfile_gnu) } %{mcall-netbsd: %(startfile_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. mhard-float;nof !mhard-float; + +*multilib_defaults: +mbig mcall-sysv + +*multilib_extra: +fPIC mstrict-align + +*multilib_matches: +mcpu=401 msoft-float;mcpu=403 msoft-float;mcpu=405 msoft-float;mcpu=ec603e msoft-float;mcpu=801 msoft-float;mcpu=821 msoft-float;mcpu=823 msoft-float;mcpu=860 msoft-float;msoft-float msoft-float; + +*multilib_exclusions: + + +*multilib_options: +msoft-float + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_default: + + +*asm_cpu: +%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=750: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=8540: -me500} %{maltivec: -maltivec} + +*asm_default: +-mppc + +*cpp_sysv: +%{mrelocatable*: -D_RELOCATABLE} %{fpic: -D__PIC__=1 -D__pic__=1} %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} + +*crtsavres_default: +crtsavres.o%s + +*lib_ads: +--start-group -lads -lc --end-group + +*lib_yellowknife: +--start-group -lyk -lc --end-group + +*lib_mvme: +--start-group -lmvme -lc --end-group + +*lib_sim: +--start-group -lsim -lc --end-group + +*lib_freebsd: + %{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} } + +*lib_gnu: +%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_linux: +%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} %{!shared: %{profile:-lc_p} %{!profile:-lc}}} + +*lib_netbsd: +%{profile:-lgmon -lc_p} %{!profile:-lc} + +*lib_vxworks: + + +*lib_windiss: +--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group + +*lib_default: +%(lib_linux) + +*startfile_ads: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_yellowknife: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_mvme: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_sim: +ecrti.o%s sim-crt0.o%s crtbegin.o%s + +*startfile_freebsd: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_gnu: +%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_linux: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*startfile_netbsd: +ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_vxworks: + + +*startfile_windiss: +crt0.o%s crtbegin.o%s + +*startfile_default: +%(startfile_linux) + +*endfile_ads: +crtend.o%s ecrtn.o%s + +*endfile_yellowknife: +crtend.o%s ecrtn.o%s + +*endfile_mvme: +crtend.o%s ecrtn.o%s + +*endfile_sim: +crtend.o%s ecrtn.o%s + +*endfile_freebsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*endfile_gnu: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_linux: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_netbsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s + +*endfile_vxworks: + + +*endfile_windiss: +crtend.o%s + +*endfile_default: +%(endfile_linux) + +*link_path: + + +*link_shlib: +%{shared:-shared} %{!shared: %{static:-static}} + +*link_target: +%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}} + +*link_start: +%{mads: %(link_start_ads) } %{myellowknife: %(link_start_yellowknife) } %{mmvme: %(link_start_mvme) } %{msim: %(link_start_sim) } %{mwindiss: %(link_start_windiss) } %{mcall-freebsd: %(link_start_freebsd) } %{mcall-linux: %(link_start_linux) } %{mcall-gnu: %(link_start_gnu) } %{mcall-netbsd: %(link_start_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}} + +*link_start_ads: +-T ads.ld%s + +*link_start_yellowknife: +-T yellowknife.ld%s + +*link_start_mvme: +-Ttext 0x40000 + +*link_start_sim: + + +*link_start_freebsd: + + +*link_start_gnu: + + +*link_start_linux: + + +*link_start_netbsd: + + +*link_start_vxworks: + + +*link_start_windiss: + + +*link_start_default: +%(link_start_linux) + +*link_os: +%{mads: %(link_os_ads) } %{myellowknife: %(link_os_yellowknife) } %{mmvme: %(link_os_mvme) } %{msim: %(link_os_sim) } %{mwindiss: %(link_os_windiss) } %{mcall-freebsd: %(link_os_freebsd) } %{mcall-linux: %(link_os_linux) } %{mcall-gnu: %(link_os_gnu) } %{mcall-netbsd: %(link_os_netbsd) } %{mcall-uclibc: %(link_os_linux_uclibc) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-uclibc: %(link_os_default) }}}}}}}}}} + +*link_os_ads: + + +*link_os_yellowknife: + + +*link_os_mvme: + + +*link_os_sim: +-m elf32ppcsim + +*link_os_freebsd: + %{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} %{static:-Bstatic}} %{symbolic:-Bsymbolic} + +*link_os_linux: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_gnu: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_netbsd: +%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}} + +*link_os_vxworks: +-r + +*link_os_windiss: + + +*link_os_linux_uclibc: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} + +*link_os_default: +%(link_os_linux_uclibc) + +*cc1_endian_big: + + +*cc1_endian_little: +%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }} + +*cc1_endian_default: +%(cc1_endian_big) + +*cpp_os_ads: + + +*cpp_os_yellowknife: + + +*cpp_os_mvme: + + +*cpp_os_sim: + + +*cpp_os_freebsd: + -D__ELF__ -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc + +*cpp_os_gnu: +-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_linux: +-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_netbsd: +-D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ + +*cpp_os_rtems: +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } + +*cpp_os_vxworks: +-DCPU_FAMILY=PPC %{!mcpu*: %{mpowerpc*: -DCPU=PPC603} %{!mno-powerpc: -DCPU=PPC603}} %{mcpu=powerpc: -DCPU=PPC603} %{mcpu=401: -DCPU=PPC403} %{mcpu=403: -DCPU=PPC403} %{mcpu=405: -DCPU=PPC405} %{mcpu=601: -DCPU=PPC601} %{mcpu=602: -DCPU=PPC603} %{mcpu=603: -DCPU=PPC603} %{mcpu=603e: -DCPU=PPC603} %{mcpu=ec603e: -DCPU=PPC603} %{mcpu=604: -DCPU=PPC604} %{mcpu=604e: -DCPU=PPC604} %{mcpu=620: -DCPU=PPC604} %{mcpu=740: -DCPU=PPC603} %{mcpu=7450: -DCPU=PPC603} %{mcpu=750: -DCPU=PPC603} %{mcpu=801: -DCPU=PPC603} %{mcpu=821: -DCPU=PPC603} %{mcpu=823: -DCPU=PPC603} %{mcpu=860: -DCPU=PPC603} + +*cpp_os_windiss: +-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp} + +*cpp_os_default: +%(cpp_os_linux) + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch new file mode 100644 index 0000000000..ad03345bd1 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.0-dist/boehm-gc/configure gcc-3.4.0/boehm-gc/configure +--- gcc-3.4.0-dist/boehm-gc/configure 2004-04-18 21:23:04.000000000 -0500 ++++ gcc-3.4.0/boehm-gc/configure 2004-08-12 16:51:15.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.0-dist/boehm-gc/ltconfig gcc-3.4.0/boehm-gc/ltconfig +--- gcc-3.4.0-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.0/boehm-gc/ltconfig 2004-08-12 16:51:15.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.0-dist/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-08-12 16:51:15.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.0-dist/gcc/config/cris/linux.h gcc-3.4.0/gcc/config/cris/linux.h +--- gcc-3.4.0-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.0/gcc/config/cris/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.0-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.0/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/cris/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.0-dist/gcc/config/i386/linux.h gcc-3.4.0/gcc/config/i386/linux.h +--- gcc-3.4.0-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.0/gcc/config/i386/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.0-dist/gcc/config/mips/linux.h gcc-3.4.0/gcc/config/mips/linux.h +--- gcc-3.4.0-dist/gcc/config/mips/linux.h 2004-02-19 15:45:21.000000000 -0600 ++++ gcc-3.4.0/gcc/config/mips/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.0-dist/gcc/config/rs6000/linux.h gcc-3.4.0/gcc/config/rs6000/linux.h +--- gcc-3.4.0-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.0/gcc/config/rs6000/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.0-dist/gcc/config/rs6000/sysv4.h gcc-3.4.0/gcc/config/rs6000/sysv4.h +--- gcc-3.4.0-dist/gcc/config/rs6000/sysv4.h 2004-03-02 16:34:58.000000000 -0600 ++++ gcc-3.4.0/gcc/config/rs6000/sysv4.h 2004-08-12 16:51:15.000000000 -0500 +@@ -952,6 +952,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1129,6 +1130,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1295,6 +1300,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.0-dist/gcc/config/sh/linux.h gcc-3.4.0/gcc/config/sh/linux.h +--- gcc-3.4.0-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.0-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.0/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.0-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.0/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.0-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/t-sh64-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.0-dist/gcc/config/t-linux-uclibc gcc-3.4.0/gcc/config/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.0-dist/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0-dist/gcc/config.gcc 2004-04-16 21:28:24.000000000 -0500 ++++ gcc-3.4.0/gcc/config.gcc 2004-08-12 16:51:15.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.0-dist/libtool.m4 gcc-3.4.0/libtool.m4 +--- gcc-3.4.0-dist/libtool.m4 2003-11-18 23:29:32.000000000 -0600 ++++ gcc-3.4.0/libtool.m4 2004-08-12 16:51:15.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.0-dist/ltconfig gcc-3.4.0/ltconfig +--- gcc-3.4.0-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.0/ltconfig 2004-08-12 16:51:15.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch new file mode 100644 index 0000000000..27e047eb73 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.0-dist/libstdc++-v3/acinclude.m4 gcc-3.4.0/libstdc++-v3/acinclude.m4 +--- gcc-3.4.0-dist/libstdc++-v3/acinclude.m4 2004-03-18 11:35:22.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/acinclude.m4 2004-08-12 17:08:19.000000000 -0500 +@@ -995,7 +995,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1011,6 +1011,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1137,6 +1140,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/aclocal.m4 gcc-3.4.0/libstdc++-v3/aclocal.m4 +--- gcc-3.4.0-dist/libstdc++-v3/aclocal.m4 2004-03-18 11:35:23.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/aclocal.m4 2004-08-12 17:13:42.000000000 -0500 +@@ -1024,6 +1024,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1150,6 +1153,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,119 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = std::snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __i = 0; ++ __i < sizeof(_M_widen) / sizeof(wint_t); ++__i) ++ _M_widen[__i] = btowc(__i); ++ ++ for (size_t __i = 0; __i <= 11; ++__i) ++ { ++ _M_bit[__i] = static_cast(_ISbit(__i)); ++ _M_wmask[__i] = _M_convert_to_wmask(_M_bit[__i]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,109 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs) ++ { ++ _M_c_locale_messages = _S_get_c_locale(); ++ } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s __attribute__ ((__unused__)), ++ size_t __refs) ++ : facet(__refs) ++ { ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ _S_destroy_c_locale(this->_M_c_locale_messages); ++ _S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-08-12 17:15:14.000000000 -0500 +@@ -0,0 +1,181 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) ++ _M_data->_M_atoms_in[__i] = __num_base::_S_atoms_in[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) ++ { ++ uc = static_cast(__num_base::_S_atoms_in[__i]); ++ _M_data->_M_atoms_in[__i] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,347 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "July"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"July"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ _M_name_timepunct = _S_get_c_name(); ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ _M_name_timepunct = _S_get_c_name(); ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s __attribute__ ((__unused__)), ++ size_t __refs) ++ : facet(__refs), _M_data(NULL) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++#endif ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,96 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::ctype(__c_locale __cloc, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_c_locale_ctype = _S_clone_c_locale(__cloc); ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ _M_widen_ok = 0; ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ _M_narrow_ok = 0; ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_c_locale_ctype = _S_get_c_locale(); ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ _M_widen_ok = 0; ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ _M_narrow_ok = 0; ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/os_defines.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.0-dist/libstdc++-v3/configure gcc-3.4.0/libstdc++-v3/configure +--- gcc-3.4.0-dist/libstdc++-v3/configure 2004-03-18 11:35:25.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/configure 2004-08-12 17:08:58.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/configure.host gcc-3.4.0/libstdc++-v3/configure.host +--- gcc-3.4.0-dist/libstdc++-v3/configure.host 2004-03-18 11:36:12.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/configure.host 2004-08-12 17:08:19.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.0-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.0/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.0-dist/libstdc++-v3/crossconfig.m4 2004-02-09 01:17:55.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/crossconfig.m4 2004-08-12 17:08:19.000000000 -0500 +@@ -122,6 +122,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -136,7 +229,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.0-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.0/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.0-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/include/c_compatibility/wchar.h 2004-08-12 17:14:36.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if __GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.0-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.0/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.0-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-12-08 21:44:35.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 17:08:19.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..f53d64b374 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional @@ -0,0 +1,256 @@ +# +# Submitted: +# +# Dimitry Andric , 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/coff.h gcc-3.4.0/gcc/config/arm/coff.h +--- gcc-3.4.0-orig/gcc/config/arm/coff.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/coff.h 2004-05-01 19:07:06.059409600 +0200 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urNd gcc-3.4.0-orig/gcc/config/arm/elf.h gcc-3.4.0/gcc/config/arm/elf.h +--- gcc-3.4.0-orig/gcc/config/arm/elf.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/elf.h 2004-05-01 19:12:16.976486400 +0200 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -30,9 +30,27 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ ++ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -40,7 +58,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urNd gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h gcc-3.4.0/gcc/config/arm/unknown-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/unknown-elf.h 2004-05-01 19:09:09.016212800 +0200 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urNd gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h gcc-3.4.0/gcc/config/arm/xscale-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h 2003-07-02 01:26:43.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/xscale-elf.h 2004-05-01 20:15:36.620105600 +0200 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..28449e7c82 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch new file mode 100644 index 0000000000..51cd7fc2e1 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch @@ -0,0 +1,3241 @@ +diff -urN gcc-3.4.1-dist/libstdc++-v3/acinclude.m4 gcc-3.4.1/libstdc++-v3/acinclude.m4 +--- gcc-3.4.1-dist/libstdc++-v3/acinclude.m4 2004-05-14 05:53:11.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/acinclude.m4 2004-08-12 15:54:48.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/aclocal.m4 gcc-3.4.1/libstdc++-v3/aclocal.m4 +--- gcc-3.4.1-dist/libstdc++-v3/aclocal.m4 2004-05-15 15:43:59.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/aclocal.m4 2004-08-12 16:14:37.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,119 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = std::snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-08-12 16:13:31.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,347 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/os_defines.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.1-dist/libstdc++-v3/configure gcc-3.4.1/libstdc++-v3/configure +--- gcc-3.4.1-dist/libstdc++-v3/configure 2004-06-25 17:02:47.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/configure 2004-08-12 16:20:43.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/configure.host gcc-3.4.1/libstdc++-v3/configure.host +--- gcc-3.4.1-dist/libstdc++-v3/configure.host 2004-03-18 11:36:12.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/configure.host 2004-08-12 15:54:48.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.1-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.1/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.1-dist/libstdc++-v3/crossconfig.m4 2004-06-10 12:12:14.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/crossconfig.m4 2004-08-12 15:54:48.000000000 -0500 +@@ -122,6 +122,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -136,7 +229,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.1-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.1/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.1-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/include/c_compatibility/wchar.h 2004-08-12 16:14:07.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.1-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.1/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.1-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-12-08 21:44:35.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 15:54:48.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch b/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch new file mode 100644 index 0000000000..8111dba185 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch @@ -0,0 +1,46 @@ +http://www.linux-mips.org/archives/linux-mips/2004-09/msg00000.html + +Atsushi Nemoto writes: +>/ Is this a get_user's problem or gcc's?/ + +The latter. gcc is putting the empty asm: + + __asm__ ("":"=r" (__gu_val)); + +into the delay slot of the call. + +Part of the problem is that gcc estimates the length of an asm to be the +number of instruction separators + 1. This means that it estimates the +asm above to be one instruction long, which is perhaps a little silly +for an empty string. + +But the real problem is that gcc should never trust this estimate anyway, +since each "instruction" could obviously be a multi-instruction macro. +gcc should certainly never put asms into delay slots. + +FWIW, I don't think the bug is specific to 3.3 or 3.4. It could +probably trigger for other gcc versions too. It is highly dependent +on scheduling though. + +The attached 3.4.x patch fixes the problem there, but if you want to work +around it for old versions, just avoid using empty asms if you can, +or make them volatile if you can't. + +Of course, the problem isn't confined to empty asms. If you have an asm +with a single, multi-instruction macro, gcc might try putting that in a +delay slot too. You should at least get an assembler warning in that case. + +Richard + + +--- gcc-3.4.1/gcc/config/mips/mips.md-orig 2004-09-02 10:38:36.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/mips.md 2004-09-02 10:38:42.000000000 -0500 +@@ -251,7 +251,7 @@ + + ;; Can the instruction be put into a delay slot? + (define_attr "can_delay" "no,yes" +- (if_then_else (and (eq_attr "type" "!branch,call,jump") ++ (if_then_else (and (eq_attr "type" "!branch,call,jump,multi") + (and (eq_attr "hazard" "none") + (eq_attr "single_insn" "yes"))) + (const_string "yes") diff --git a/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric , 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..29e4c802e2 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++#SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch new file mode 100644 index 0000000000..3fc4900b06 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 +--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 +--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 +@@ -0,0 +1,356 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure +--- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host +--- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -138,6 +138,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -152,7 +245,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch b/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch new file mode 100644 index 0000000000..c030ba6205 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch @@ -0,0 +1,47 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am~ 2003-02-28 09:21:05.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.am 2003-02-28 09:28:50.000000000 +0100 +@@ -224,6 +224,10 @@ + @OPT_LDFLAGS@ @SECTION_LDFLAGS@ $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCPP_BUILD_DEBUG + all-local: build_debug + +--- gcc/libstdc++-v3/src/Makefile.in~ 2004-02-21 09:55:48.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.in 2004-02-21 09:59:34.000000000 +0100 +@@ -585,7 +585,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -618,6 +618,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -707,6 +708,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch b/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch new file mode 100644 index 0000000000..f01c59f114 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch @@ -0,0 +1,53 @@ +# DP: 2004-09-26 Roger Sayle +# DP: +# DP: PR other/15526 +# DP: Backport from mainline +# DP: 2004-05-20 Falk Hueffner +# DP: * libgcc2.c (__mulvsi3): Fix overflow test. + +diff -u -r1.170.6.1 -r1.170.6.2 +--- gcc/gcc/libgcc2.c 2004/07/17 21:18:47 1.170.6.1 ++++ gcc/gcc/libgcc2.c 2004/09/26 20:47:14 1.170.6.2 +@@ -130,9 +130,7 @@ + { + const DWtype w = (DWtype) a * (DWtype) b; + +- if (((a >= 0) == (b >= 0)) +- ? (UDWtype) w > (UDWtype) (((DWtype) 1 << (WORD_SIZE - 1)) - 1) +- : (UDWtype) w < (UDWtype) ((DWtype) -1 << (WORD_SIZE - 1))) ++ if ((Wtype) (w >> WORD_SIZE) != (Wtype) w >> (WORD_SIZE - 1)) + abort (); + + return w; + +/cvs/gcc/gcc/gcc/testsuite/gcc.dg/ftrapv-1.c,v --> standard output +revision 1.1.22.1 +--- gcc/gcc/testsuite/gcc.dg/ftrapv-1.c ++++ /dev/null 2004-10-15 06:22:06.980596000 +0000 +@@ -0,0 +1,25 @@ ++/* Copyright (C) 2004 Free Software Foundation. ++ ++ PR other/15526 ++ Verify correct overflow checking with -ftrapv. ++ ++ Written by Falk Hueffner, 20th May 2004. */ ++ ++/* { dg-do run } */ ++/* { dg-options "-ftrapv" } */ ++ ++__attribute__((noinline)) int ++mulv(int a, int b) ++{ ++ return a * b; ++} ++ ++int ++main() ++{ ++ mulv( 0, 0); ++ mulv( 0, -1); ++ mulv(-1, 0); ++ mulv(-1, -1); ++ return 0; ++} + diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch b/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch new file mode 100644 index 0000000000..ca5fa09abb --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch @@ -0,0 +1,234 @@ +# DP: 2004-09-21 Bud Davis +# DP: +# DP: PR fortran/17541 +# DP: * bld.c (ffebld_constant_new_real2_val): Fix typo, +# DP: +# DP: PR fortran/17541 +# DP: * g77.f-torture/execute/pr17541.f: New test. + +Index: gcc/gcc/f/bld.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/f/Attic/bld.c,v +retrieving revision 1.16.14.1 +retrieving revision 1.16.14.2 +diff -u -r1.16.14.1 -r1.16.14.2 +--- gcc/gcc/f/bld.c 12 Jul 2004 17:58:36 -0000 1.16.14.1 ++++ gcc/gcc/f/bld.c 21 Sep 2004 12:54:27 -0000 1.16.14.2 +@@ -1333,7 +1333,7 @@ + nc = malloc_new_kp (ffebld_constant_pool(), + "FFEBLD_constREAL2", + sizeof (*nc)); +- nc->consttype = FFEBLD_constREAL1; ++ nc->consttype = FFEBLD_constREAL2; + nc->u.real2 = val; + nc->hook = FFECOM_constantNULL; + nc->llink = NULL; +Index: gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +=================================================================== +RCS file: gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +diff -N gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f 21 Sep 2004 12:54:35 -0000 1.1.2.1 +@@ -0,0 +1,202 @@ ++ program test ++ implicit none ++! check all types of data statements ++! pr 17541 ++ real r(2) ++ double precision s(2) ++ integer*1 ib(2) ++ integer*2 ih(2) ++ integer*4 iw(2) ++ integer*8 id(3) ++ logical*1 lb(2) ++ logical*2 lh(2) ++ logical*4 lw(2) ++ logical*8 ld(2) ++ character*1 a(2) ++ character*5 b(2) ++ complex c1(2) ++ complex*8 c2(2) ++ data r / 1.0,2.0 / ++ data s / 2.d0,1.d0/ ++ data ib / 1,-1 / ++ data ih / 2,100/ ++ data iw / 4,3560000 / ++ data id / 8,Z'ABCDEF01',Z'5555AAAA' / ++ data a / 'a', 'z' / ++ data b / 'xyz','abc'/ ++ data c1 /(1.0,2.0),(-1.0,-2.0)/ ++ data c2 /(1.d0,2.d0),(-1.d0,-2.d0)/ ++ data lb / .TRUE.,.FALSE. / ++ data lh / .TRUE.,.FALSE. / ++ data lw / .TRUE.,.FALSE. / ++ data ld / .TRUE.,.FALSE. / ++ logical dbug ++ data dbug /.FALSE./ ++! check the reals first ++ if (r(1).ne.1.0) then ++ if (dbug) then ++ print*,r(1), ' should be 1.0 ' ++ else ++ call abort ++ endif ++ endif ++ if (r(2).ne.2.0) then ++ if (dbug) then ++ print*,r(2), ' should be 2.0 ' ++ else ++ call abort ++ endif ++ endif ++ if (s(1).ne.2.d0) then ++ if (dbug) then ++ print*,s(1), ' xxshould be 2.d0 ' ++ else ++ call abort ++ endif ++ endif ++ if (s(2).ne.1.d0) then ++ if (dbug) then ++ print*,s(2), ' should be 1.d0 ' ++ else ++ call abort ++ endif ++ endif ++! now the integers ++ if (ib(1).ne.1) then ++ if (dbug) then ++ print*,ib(1), ' should be 1 ' ++ else ++ call abort ++ endif ++ endif ++ if (ib(2).ne.-1) then ++ if (dbug) then ++ print*,ib(2), ' should be -1 ' ++ else ++ call abort ++ endif ++ endif ++ if (ih(1).ne.2) then ++ if (dbug) then ++ print*,ih(2), ' should be 2 ' ++ else ++ call abort ++ endif ++ endif ++ if (ih(2).ne.100) then ++ if (dbug) then ++ print*,ih(2), ' should be 100 ' ++ else ++ call abort ++ endif ++ endif ++ if (iw(1).ne.4) then ++ if (dbug) then ++ print*,iw(1), ' should be 4 ' ++ else ++ call abort ++ endif ++ endif ++ if (iw(2).ne.3560000) then ++ if (dbug) then ++ print*,iw(2), ' should be 3560000 ' ++ else ++ call abort ++ endif ++ endif ++ if (id(1).ne.8) then ++ if (dbug) print*,id(1), ' should be 8 ' ++ call abort ++ endif ++ if (id(2).ne.Z'ABCDEF01') then ++ if (dbug) print*,id(2), " should be Z'ABCDEF01' " ++ call abort ++ endif ++ if (id(3).ne.Z'5555AAAA') then ++ if (dbug) print*,id(2), " should be Z'5555AAAA' " ++ call abort ++ endif ++! complex ++ if (c1(1).ne.(1.0,2.0)) then ++ if (dbug) then ++ print*,c1(1), ' should be (1.0,2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c1(2).ne.(-1.0,-2.0)) then ++ if (dbug) then ++ print*,c1(2), ' should be (-1.0,-2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c2(1).ne.(1.d0,2.d0)) then ++ if (dbug) then ++ print*,c2(1), ' should be (1.0,2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c2(2).ne.(-1.d0,-2.d0)) then ++ if (dbug) then ++ print*,c2(2), ' should be (-1.0,-2.0) ' ++ else ++ call abort ++ endif ++ endif ++! character ++ if (a(1).ne.'a') then ++ if (dbug) then ++ print*,a(1), ' should be a ' ++ else ++ call abort ++ endif ++ endif ++ if (b(1).ne.'xyz') then ++ if (dbug) then ++ print*,b(1), ' should be xyz ' ++ else ++ call abort ++ endif ++ endif ++!logicals ++ if (.NOT.lb(1)) then ++ if (dbug) print*,lb(1), ' should be .T. ' ++ call abort ++ endif ++ if (lb(2)) then ++ if (dbug) print*,lb(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.lh(1)) then ++ if (dbug) print*,lh(1), ' should be .T. ' ++ call abort ++ endif ++ if (lh(2)) then ++ if (dbug) print*,lh(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.lw(1)) then ++ if (dbug) print*,lw(1), ' should be .T. ' ++ call abort ++ endif ++ if (lw(2)) then ++ if (dbug) print*,lw(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.ld(1)) then ++ if (dbug) then ++ print*,ld(1), ' should be .T. ' ++ else ++ call abort ++ endif ++ endif ++ if (ld(2)) then ++ if (dbug) then ++ print*,ld(2), ' should be .F. ' ++ else ++ call abort ++ endif ++ endif ++ end diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch b/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch new file mode 100644 index 0000000000..78bb3559ff --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch @@ -0,0 +1,106 @@ +From: Mark Mitchell +Sender: gcc-patches-owner@gcc.gnu.org +To: gcc-patches@gcc.gnu.org +Subject: C++ PATCH: PR 17976 +Date: Thu, 14 Oct 2004 21:24:41 -0700 + + +This was a case where we generated multiple destructor calls for the +same global variable, in the (probably rare) situation that an +"extern" declaration followed the definition. + +Tested on i686-pc-linux-gnu, applied on the mainline and on the 3.4 +branch. + +-- +Mark Mitchell +CodeSourcery, LLC +mark@codesourcery.com + +# DP: 2004-10-14 Mark Mitchell +# DP: +# DP: PR c++/17976 +# DP: * decl.c (cp_finish_decl): Do not call expand_static_init more +# DP: than once for a single variable. +# DP: +# DP: 2004-10-14 Mark Mitchell +# DP: +# DP: PR c++/17976 +# DP: * g++.dg/init/dtor3.C: New test. + +Index: testsuite/g++.dg/init/dtor3.C +=================================================================== +RCS file: testsuite/g++.dg/init/dtor3.C +diff -N testsuite/g++.dg/init/dtor3.C +*** /dev/null 1 Jan 1970 00:00:00 -0000 +--- gcc/gcc/testsuite/g++.dg/init/dtor3.C 15 Oct 2004 04:02:22 -0000 +*************** +*** 0 **** +--- 1,21 ---- ++ // PR c++/17976 ++ // { dg-do run } ++ ++ extern "C" void abort(); ++ struct A ++ { ++ static int i; ++ A(){} ++ ~A(){i++;if(i>1)abort();} ++ }; ++ ++ int A::i = 0; ++ ++ A a; ++ extern A a; ++ ++ int main() ++ { ++ return 0; ++ } ++ +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v +retrieving revision 1.1174.2.26 +retrieving revision 1.1174.2.27 +diff -u -r1.1174.2.26 -r1.1174.2.27 +--- gcc/gcc/cp/decl.c 2004/10/10 21:54:59 1.1174.2.26 ++++ gcc/gcc/cp/decl.c 2004/10/15 04:23:46 1.1174.2.27 +@@ -4778,6 +4778,7 @@ + tree cleanup; + const char *asmspec = NULL; + int was_readonly = 0; ++ bool var_definition_p = false; + + if (decl == error_mark_node) + return; +@@ -4930,6 +4931,11 @@ + /* Remember that the initialization for this variable has + taken place. */ + DECL_INITIALIZED_P (decl) = 1; ++ /* This declaration is the definition of this variable, ++ unless we are initializing a static data member within ++ the class specifier. */ ++ if (!DECL_EXTERNAL (decl)) ++ var_definition_p = true; + } + /* If the variable has an array type, lay out the type, even if + there is no initializer. It is valid to index through the +@@ -5004,8 +5010,16 @@ + initialize_local_var (decl, init); + } + +- if (TREE_STATIC (decl)) +- expand_static_init (decl, init); ++ /* If a variable is defined, and then a subsequent ++ definintion with external linkage is encountered, we will ++ get here twice for the same variable. We want to avoid ++ calling expand_static_init more than once. For variables ++ that are not static data members, we can call ++ expand_static_init only when we actually process the ++ initializer. It is not legal to redeclare a static data ++ member, so this issue does not arise in that case. */ ++ if (var_definition_p && TREE_STATIC (decl)) ++ expand_static_init (decl, init); + } + finish_end0: + diff --git a/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch b/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch new file mode 100644 index 0000000000..7ae6aa56f6 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch @@ -0,0 +1,102 @@ +[committed] Fix target/17565: asms in delay slots + + * From: Richard Sandiford + * To: gcc-patches at gcc dot gnu dot org + * Date: Mon, 20 Sep 2004 07:55:58 +0100 + * Subject: [committed] Fix target/17565: asms in delay slots + +The MIPS port was allowing asms to be put into delay slots if the +compiler guesses they are only one instruction long. This is wrong +because of the possibility of it containing macros. + +The problem can be reproduced as an assembler warning +in the following testcase: + +int foo (int n) +{ + register int k asm ("$16") = n; + if (k > 0) + { + bar (); + asm ("li %0,0x12345678" : "=r" (k)); + } + return k; +} + +because the multi-instruction asm statement goes into the delay +slot of the call to bar(). + +This is reduced from a much more serious linux problem. Linux is fond +of using empty asm statements, and since gcc estimates empty asms to be +one instruction long, they too might be put into delay slots. This +actually has the effect of putting the following instruction into the +delay slot instead. Since there's no assembler warning, the problem was +only detected as a run-time failure. + +The fix is simple: set the asm value of "can_delay" to "no". +Tested on mipsisa64-elf, applied to mainline. + +This problem goes back to at least 2.95, so it isn't technically a +regression. On the other hand, it's the kind of bug that could trigger +for different types of code in different releases, so I'm sure there's +a testcase that fails (say) in 3.4 and not in 2.95. Will probably ask +Mark for permission to backport to 3.4. + +Richard + + + PR target/17565 + * config/mips/mips.md (define_asm_attributes): Set can_delay to no. + +testsuite/ + * gcc.target/mips/asm-1.c: New test. + +Index: config/mips/mips.md +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.md,v +retrieving revision 1.306 +diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.306 mips.md +*** gcc/gcc/config/mips/mips.md 13 Sep 2004 19:32:05 -0000 1.306 +--- gcc/gcc/config/mips/mips.md 20 Sep 2004 06:52:31 -0000 +*************** (define_attr "may_clobber_hilo" "no,yes" +*** 266,272 **** + + ;; Describe a user's asm statement. + (define_asm_attributes +! [(set_attr "type" "multi")]) + + ;; ......................... + ;; +--- 266,273 ---- + + ;; Describe a user's asm statement. + (define_asm_attributes +! [(set_attr "type" "multi") +! (set_attr "can_delay" "no")]) + + ;; ......................... + ;; +Index: testsuite/gcc.target/mips/asm-1.c +=================================================================== +RCS file: testsuite/gcc.target/mips/asm-1.c +diff -N testsuite/gcc.target/mips/asm-1.c +*** gcc/gcc/testsuite/gcc.target/mips/asm-1.c 1 Jan 1970 00:00:00 -0000 +--- gcc/gcc/testsuite/gcc.target/mips/asm-1.c 20 Sep 2004 06:52:31 -0000 +*************** +*** 0 **** +--- 1,14 ---- ++ /* PR target/17565. GCC used to put the asm into the delay slot ++ of the call. */ ++ /* { dg-do assemble } */ ++ /* { dg-options "-O" } */ ++ int foo (int n) ++ { ++ register int k asm ("$16") = n; ++ if (k > 0) ++ { ++ bar (); ++ asm ("li %0,0x12345678" : "=r" (k)); ++ } ++ return k; ++ } + diff --git a/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch b/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch new file mode 100644 index 0000000000..dbb856868d --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch @@ -0,0 +1,20 @@ +revision 1.12 +date: 2004/07/16 15:13:40; author: segher; state: Exp; lines: +1 -1 + * config/rs6000/eabi.asm (__eabi_convert): Fix typo (cmpi vs. cmpwi). +Index: gcc/config/rs6000/eabi.asm +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/rs6000/eabi.asm,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -b -B -w -p -r1.11 -r1.12 +--- gcc/gcc/config/rs6000/eabi.asm 20 Sep 2002 23:46:58 -0000 1.11 ++++ gcc/gcc/config/rs6000/eabi.asm 16 Jul 2004 15:13:40 -0000 1.12 +@@ -252,7 +252,7 @@ FUNC_START(__eabi_convert) + + .Lcvt: + lwzu 6,4(3) /* pointer to convert */ +- cmpi 0,6,0 ++ cmpwi 0,6,0 + beq- .Lcvt2 /* if pointer is null, don't convert */ + + add 6,6,12 /* convert pointer */ diff --git a/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch b/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch new file mode 100644 index 0000000000..87d603023c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch @@ -0,0 +1,12 @@ +--- gcc-3.4.2/gcc/config/mips/mips.md 2004-06-25 02:35:30.000000000 -0500 ++++ gcc-3.4-cvs/gcc/config/mips/mips.md 2004-10-26 01:54:56.000000000 -0500 +@@ -4073,8 +4073,7 @@ + "!TARGET_MIPS16" + "lwl\t%0,%2" + [(set_attr "type" "load") +- (set_attr "mode" "SI") +- (set_attr "hazard" "none")]) ++ (set_attr "mode" "SI")]) + + (define_insn "mov_lwr" + [(set (match_operand:SI 0 "register_operand" "=d") diff --git a/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch b/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch new file mode 100644 index 0000000000..fb317e1537 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch @@ -0,0 +1,79 @@ +--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 +@@ -8810,13 +8810,16 @@ + (set_attr "length" "4,8,8")] + ) + ++; Try to convert LDR+LDR+arith into [add+]LDM+arith ++; On XScale, LDM is always slower than two LDRs, so only do this if ++; optimising for size. + (define_insn "*arith_adjacentmem" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "shiftable_operator" + [(match_operand:SI 2 "memory_operand" "m") + (match_operand:SI 3 "memory_operand" "m")])) + (clobber (match_scratch:SI 4 "=r"))] +- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" ++ "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" + "* + { + rtx ldm[3]; +@@ -8851,6 +8854,8 @@ + } + if (val1 && val2) + { ++ /* This would be a loss on a Harvard core, but adjacent_mem_locations() ++ will prevent it from happening. */ + rtx ops[3]; + ldm[0] = ops[0] = operands[4]; + ops[1] = XEXP (XEXP (operands[2], 0), 0); +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 +@@ -4593,8 +4593,11 @@ + arith_adjacentmem pattern to output an overlong sequence. */ + if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) + return 0; +- +- return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); ++ ++ /* For Harvard cores, only accept pairs where one offset is zero. ++ See comment in load_multiple_sequence. */ ++ return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4) ++ && (!arm_ld_sched || val0 == 0 || val1 == 0); + } + return 0; + } +@@ -4838,6 +4841,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* ldmia */ + +@@ -5064,6 +5072,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* stmia */ + +--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 ++++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 +@@ -381,6 +381,7 @@ + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n\n"); + printf ("#include \"function.h\"\n\n"); ++ printf ("#include \"flags.h\"\n\n"); + + printf ("#ifdef HAVE_peephole\n"); + printf ("extern rtx peep_operand[];\n\n"); diff --git a/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch b/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch new file mode 100644 index 0000000000..142052fdf0 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch @@ -0,0 +1,119 @@ +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 +@@ -8520,6 +8520,26 @@ + return_used_this_function = 0; + } + ++/* Return the number (counting from 0) of ++ the least significant set bit in MASK. */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static int ++number_of_first_bit_set (mask) ++ int mask; ++{ ++ int bit; ++ ++ for (bit = 0; ++ (mask & (1 << bit)) == 0; ++ ++bit) ++ continue; ++ ++ return bit; ++} ++ + const char * + arm_output_epilogue (rtx sibling) + { +@@ -8753,27 +8773,47 @@ + saved_regs_mask |= (1 << PC_REGNUM); + } + +- /* Load the registers off the stack. If we only have one register +- to load use the LDR instruction - it is faster. */ +- if (saved_regs_mask == (1 << LR_REGNUM)) +- { +- /* The exception handler ignores the LR, so we do +- not really need to load it off the stack. */ +- if (eh_ofs) +- asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); +- else +- asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); +- } +- else if (saved_regs_mask) ++ if (saved_regs_mask) + { +- if (saved_regs_mask & (1 << SP_REGNUM)) +- /* Note - write back to the stack register is not enabled +- (ie "ldmfd sp!..."). We know that the stack pointer is +- in the list of registers and if we add writeback the +- instruction becomes UNPREDICTABLE. */ +- print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ /* Load the registers off the stack. If we only have one register ++ to load use the LDR instruction - it is faster. */ ++ if (bit_count (saved_regs_mask) == 1) ++ { ++ int reg = number_of_first_bit_set (saved_regs_mask); ++ ++ switch (reg) ++ { ++ case SP_REGNUM: ++ /* Mustn't use base writeback when loading SP. */ ++ asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); ++ break; ++ ++ case LR_REGNUM: ++ if (eh_ofs) ++ { ++ /* The exception handler ignores the LR, so we do ++ not really need to load it off the stack. */ ++ asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); ++ break; ++ } ++ /* else fall through */ ++ ++ default: ++ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); ++ break; ++ } ++ } + else +- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ { ++ if (saved_regs_mask & (1 << SP_REGNUM)) ++ /* Note - write back to the stack register is not enabled ++ (ie "ldmfd sp!..."). We know that the stack pointer is ++ in the list of registers and if we add writeback the ++ instruction becomes UNPREDICTABLE. */ ++ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ else ++ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ } + } + + if (current_function_pretend_args_size) +@@ -11401,22 +11441,6 @@ + } + } + +-/* Return the number (counting from 0) of +- the least significant set bit in MASK. */ +- +-inline static int +-number_of_first_bit_set (int mask) +-{ +- int bit; +- +- for (bit = 0; +- (mask & (1 << bit)) == 0; +- ++bit) +- continue; +- +- return bit; +-} +- + /* Generate code to return from a thumb function. + If 'reg_containing_return_addr' is -1, then the return address is + actually on the stack, at the stack pointer. */ diff --git a/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch b/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch new file mode 100644 index 0000000000..4377c2143b --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 ++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC +--- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 ++++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 +@@ -18,7 +18,7 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + + + diff --git a/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch b/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch new file mode 100644 index 0000000000..2977765c5f --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric , 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..29e4c802e2 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++#SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch new file mode 100644 index 0000000000..3fc4900b06 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 +--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 +--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include // For errno ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include // get std::strlen ++#include // get std::snprintf or std::sprintf ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast(-1) ++ || __conv == static_cast(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast(__c)]; } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 +@@ -0,0 +1,356 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure +--- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host +--- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -138,6 +138,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -152,7 +245,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch b/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch new file mode 100644 index 0000000000..c030ba6205 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch @@ -0,0 +1,47 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am~ 2003-02-28 09:21:05.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.am 2003-02-28 09:28:50.000000000 +0100 +@@ -224,6 +224,10 @@ + @OPT_LDFLAGS@ @SECTION_LDFLAGS@ $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCPP_BUILD_DEBUG + all-local: build_debug + +--- gcc/libstdc++-v3/src/Makefile.in~ 2004-02-21 09:55:48.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.in 2004-02-21 09:59:34.000000000 +0100 +@@ -585,7 +585,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -618,6 +618,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -707,6 +708,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch b/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch new file mode 100644 index 0000000000..fb317e1537 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch @@ -0,0 +1,79 @@ +--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 +@@ -8810,13 +8810,16 @@ + (set_attr "length" "4,8,8")] + ) + ++; Try to convert LDR+LDR+arith into [add+]LDM+arith ++; On XScale, LDM is always slower than two LDRs, so only do this if ++; optimising for size. + (define_insn "*arith_adjacentmem" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "shiftable_operator" + [(match_operand:SI 2 "memory_operand" "m") + (match_operand:SI 3 "memory_operand" "m")])) + (clobber (match_scratch:SI 4 "=r"))] +- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" ++ "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" + "* + { + rtx ldm[3]; +@@ -8851,6 +8854,8 @@ + } + if (val1 && val2) + { ++ /* This would be a loss on a Harvard core, but adjacent_mem_locations() ++ will prevent it from happening. */ + rtx ops[3]; + ldm[0] = ops[0] = operands[4]; + ops[1] = XEXP (XEXP (operands[2], 0), 0); +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 +@@ -4593,8 +4593,11 @@ + arith_adjacentmem pattern to output an overlong sequence. */ + if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) + return 0; +- +- return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); ++ ++ /* For Harvard cores, only accept pairs where one offset is zero. ++ See comment in load_multiple_sequence. */ ++ return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4) ++ && (!arm_ld_sched || val0 == 0 || val1 == 0); + } + return 0; + } +@@ -4838,6 +4841,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* ldmia */ + +@@ -5064,6 +5072,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* stmia */ + +--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 ++++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 +@@ -381,6 +381,7 @@ + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n\n"); + printf ("#include \"function.h\"\n\n"); ++ printf ("#include \"flags.h\"\n\n"); + + printf ("#ifdef HAVE_peephole\n"); + printf ("extern rtx peep_operand[];\n\n"); diff --git a/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch b/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch new file mode 100644 index 0000000000..142052fdf0 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch @@ -0,0 +1,119 @@ +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 +@@ -8520,6 +8520,26 @@ + return_used_this_function = 0; + } + ++/* Return the number (counting from 0) of ++ the least significant set bit in MASK. */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static int ++number_of_first_bit_set (mask) ++ int mask; ++{ ++ int bit; ++ ++ for (bit = 0; ++ (mask & (1 << bit)) == 0; ++ ++bit) ++ continue; ++ ++ return bit; ++} ++ + const char * + arm_output_epilogue (rtx sibling) + { +@@ -8753,27 +8773,47 @@ + saved_regs_mask |= (1 << PC_REGNUM); + } + +- /* Load the registers off the stack. If we only have one register +- to load use the LDR instruction - it is faster. */ +- if (saved_regs_mask == (1 << LR_REGNUM)) +- { +- /* The exception handler ignores the LR, so we do +- not really need to load it off the stack. */ +- if (eh_ofs) +- asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); +- else +- asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); +- } +- else if (saved_regs_mask) ++ if (saved_regs_mask) + { +- if (saved_regs_mask & (1 << SP_REGNUM)) +- /* Note - write back to the stack register is not enabled +- (ie "ldmfd sp!..."). We know that the stack pointer is +- in the list of registers and if we add writeback the +- instruction becomes UNPREDICTABLE. */ +- print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ /* Load the registers off the stack. If we only have one register ++ to load use the LDR instruction - it is faster. */ ++ if (bit_count (saved_regs_mask) == 1) ++ { ++ int reg = number_of_first_bit_set (saved_regs_mask); ++ ++ switch (reg) ++ { ++ case SP_REGNUM: ++ /* Mustn't use base writeback when loading SP. */ ++ asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); ++ break; ++ ++ case LR_REGNUM: ++ if (eh_ofs) ++ { ++ /* The exception handler ignores the LR, so we do ++ not really need to load it off the stack. */ ++ asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); ++ break; ++ } ++ /* else fall through */ ++ ++ default: ++ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); ++ break; ++ } ++ } + else +- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ { ++ if (saved_regs_mask & (1 << SP_REGNUM)) ++ /* Note - write back to the stack register is not enabled ++ (ie "ldmfd sp!..."). We know that the stack pointer is ++ in the list of registers and if we add writeback the ++ instruction becomes UNPREDICTABLE. */ ++ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ else ++ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ } + } + + if (current_function_pretend_args_size) +@@ -11401,22 +11441,6 @@ + } + } + +-/* Return the number (counting from 0) of +- the least significant set bit in MASK. */ +- +-inline static int +-number_of_first_bit_set (int mask) +-{ +- int bit; +- +- for (bit = 0; +- (mask & (1 << bit)) == 0; +- ++bit) +- continue; +- +- return bit; +-} +- + /* Generate code to return from a thumb function. + If 'reg_containing_return_addr' is -1, then the return address is + actually on the stack, at the stack pointer. */ diff --git a/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch b/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch new file mode 100644 index 0000000000..4377c2143b --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 ++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC +--- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 ++++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 +@@ -18,7 +18,7 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + + + diff --git a/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch b/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch new file mode 100644 index 0000000000..2977765c5f --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric , 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/Config.in b/openwrt/toolchain/gcc/Config.in new file mode 100644 index 0000000000..9403aba278 --- /dev/null +++ b/openwrt/toolchain/gcc/Config.in @@ -0,0 +1,76 @@ +# Choose gcc version. +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. + +comment "Gcc Options" + +choice + prompt "GCC compiler Version" + default BR2_GCC_VERSION_3_4_2 + help + Select the version of gcc you wish to use. + + config BR2_GCC_VERSION_2_95 + bool "gcc 2.95" + depends on BR2_arm || BR2_i386 || BR2_mips || BR2_powerpc + + config BR2_GCC_VERSION_3_3_3 + bool "gcc 3.3.3" + + config BR2_GCC_VERSION_3_3_4 + bool "gcc 3.3.4" + + config BR2_GCC_VERSION_3_3_5 + bool "gcc 3.3.5" + + config BR2_GCC_VERSION_3_4_0 + bool "gcc 3.4.0" + + config BR2_GCC_VERSION_3_4_1 + bool "gcc 3.4.1" + + config BR2_GCC_VERSION_3_4_2 + bool "gcc 3.4.2" + + config BR2_GCC_VERSION_3_4_3 + bool "gcc 3.4.3" + +endchoice + +config BR2_GCC_VERSION + string + default "2.95" if BR2_GCC_VERSION_2_95 + default "3.3.3" if BR2_GCC_VERSION_3_3_3 + default "3.3.4" if BR2_GCC_VERSION_3_3_4 + default "3.3.5" if BR2_GCC_VERSION_3_3_5 + default "3.4.0" if BR2_GCC_VERSION_3_4_0 + default "3.4.1" if BR2_GCC_VERSION_3_4_1 + default "3.4.2" if BR2_GCC_VERSION_3_4_2 + default "3.4.3" if BR2_GCC_VERSION_3_4_3 + + +config BR2_GCC_USE_SJLJ_EXCEPTIONS + string + default "--enable-sjlj-exceptions" + help + Currently the unwind stuff seems to work for staticly linked apps + but not dynamic. So use setjmp/longjmp exceptions by default. + +config BR2_EXTRA_GCC_CONFIG_OPTIONS + string "Additional gcc options" + default "" + help + Any additional gcc options you may want to include.... + +config BR2_INSTALL_LIBSTDCPP + bool "Build/install c++ compiler and libstdc++?" + default n + help + Build/install c++ compiler and libstdc++? + +config BR2_INSTALL_LIBGCJ + bool "Build/install java compiler and libgcj?" + default n + depends on BR2_INSTALL_LIBSTDCPP + help + Build/install java compiler and libgcj? diff --git a/openwrt/toolchain/gcc/Config.in.2 b/openwrt/toolchain/gcc/Config.in.2 new file mode 100644 index 0000000000..c523b97051 --- /dev/null +++ b/openwrt/toolchain/gcc/Config.in.2 @@ -0,0 +1,6 @@ +config BR2_PACKAGE_GCC_TARGET + bool "native toolchain in the target filesystem" + default n + help + If you want the target system to be able to run + binutils/gcc and compile native code, say Y here. diff --git a/openwrt/toolchain/gcc/Makefile.in b/openwrt/toolchain/gcc/Makefile.in new file mode 100644 index 0000000000..2963ffbe3c --- /dev/null +++ b/openwrt/toolchain/gcc/Makefile.in @@ -0,0 +1,26 @@ +GCC_VERSION:=$(strip $(subst ",, $(BR2_GCC_VERSION))) +#" +GCC_USE_SJLJ_EXCEPTIONS:=$(strip $(subst ",, $(BR2_GCC_USE_SJLJ_EXCEPTIONS))) +#" +TARGET_OPTIMIZATION:=$(strip $(subst ",, $(BR2_TARGET_OPTIMIZATION))) +#"" + + +ifeq ($(BR2_SOFT_FLOAT),y) +# gcc 3.4.x soft float configuration is different than previous versions. +ifeq ($(findstring 3.4.,$(GCC_VERSION)),3.4.) +SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft +else +SOFT_FLOAT_CONFIG_OPTION:=--without-float +endif +TARGET_SOFT_FLOAT:=-msoft-float +ARCH_FPU_SUFFIX:=_nofpu +else +SOFT_FLOAT_CONFIG_OPTION:= +TARGET_SOFT_FLOAT:= +ARCH_FPU_SUFFIX:= +endif + +ifeq ($(strip $(BR2_PACKAGE_GCC_TARGET)),y) +TARGETS+=gcc_target +endif diff --git a/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk b/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk new file mode 100644 index 0000000000..e5a36e4ccb --- /dev/null +++ b/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk @@ -0,0 +1,277 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen +# Copyright (C) 2004 Manuel Novoa III +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifeq ($(findstring 2.95,$(GCC_VERSION)),2.95) +GCC_VERSION:=$(strip $(GCC_VERSION)) + +GCC_SITE:=http://www.uclibc.org/downloads/toolchain +GCC_SOURCE:=gcc-20011006.tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-20011006 +GCC_CAT:=bzcat + +STLPORT_SITE=http://www.stlport.org/archive +STLPORT_SOURCE=STLport-4.5.3.tar.gz +STLPORT_DIR=$(TOOL_BUILD_DIR)/STLport-4.5.3 +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) +TARGET_LANGUAGES:=c,c++ +STLPORT_TARGET=stlport +else +TARGET_LANGUAGES:=c +STLPORT_TARGET= +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-initial + +$(DL_DIR)/$(GCC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch\* + # + # We do not wish to build the libstdc++ library provided with gcc, + # since it doesn't seem to work at all with uClibc plus gcc 2.95... + # + mv $(GCC_DIR)/libstdc++ $(GCC_DIR)/libstdc++.orig + mv $(GCC_DIR)/libio $(GCC_DIR)/libio.orig + # + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + -mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include + # Important! Required for limits.h to be fixed. + ln -sf include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ + --with-headers=$(TOOL_BUILD_DIR)/uClibc_dev/usr/include \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# STLport -- an alternative C++ library +# +############################################################# +STLPORT_PATCH=toolchain/gcc/2.95/STLport-4.5.3.patch + +$(DL_DIR)/$(STLPORT_SOURCE): + $(WGET) -P $(DL_DIR) $(STLPORT_SITE)/$(STLPORT_SOURCE) + +$(STLPORT_DIR)/Makefile: $(DL_DIR)/$(STLPORT_SOURCE) $(STLPORT_PATCH) + zcat $(DL_DIR)/$(STLPORT_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + cat $(STLPORT_PATCH) | patch -d $(STLPORT_DIR) -p1 + +$(STLPORT_DIR)/lib/libstdc++.a: $(STLPORT_DIR)/Makefile + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a: $(STLPORT_DIR)/lib/libstdc++.a + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) install + +stlport: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a + +stlport-source: $(DL_DIR)/$(STLPORT_SOURCE) + +stlport-clean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++* + -$(MAKE) -C $(STLPORT_DIR) clean + +stlport-dirclean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/g++-v3* + rm -rf $(STLPORT_DIR) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-final + +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); + touch $(GCC_BUILD_DIR2)/.installed + +gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \ + $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) $(STLPORT_TARGET) + +gcc-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk b/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk new file mode 100644 index 0000000000..3457b4a69b --- /dev/null +++ b/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk @@ -0,0 +1,321 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen +# Copyright (C) 2004 Manuel Novoa III +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifneq ($(findstring 2.95,$(GCC_VERSION)),2.95) +GCC_VERSION:=$(strip $(GCC_VERSION)) + +#GCC_SITE:=ftp://ftp.gnu.org/gnu/gcc/releases/gcc-$(GCC_VERSION) +GCC_SITE:=http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(GCC_VERSION) + +# +# snapshots.... +#GCC_VERSION:=3.3-20031013 +#GCC_SITE:=http://gcc.get-software.com/snapshots/$(GCC_VERSION) +# +GCC_SOURCE:=gcc-$(GCC_VERSION).tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION) +GCC_CAT:=bzcat +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(BR2_INSTALL_LIBGCJ),y) +TARGET_LANGUAGES:=c,c++,java +else +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) +TARGET_LANGUAGES:=c,c++ +else +TARGET_LANGUAGES:=c +endif +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-initial + +$(DL_DIR)/$(GCC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch + # Note: The soft float situation has improved considerably with gcc 3.4.x. + # We can dispense with the custom spec files, as well as libfloat for the arm case. + # However, we still need a patch for arm. There's a similar patch for gcc 3.3.x + # which needs to be integrated so we can kill of libfloat for good, except for + # anyone (?) who might still be using gcc 2.95. mjn3 +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ("$(strip $(ARCH))","arm") + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional +endif +ifeq ("$(strip $(ARCH))","armeb") + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional +endif + # Not yet updated to 3.4.1. + #ifeq ("$(strip $(ARCH))","i386") + #toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc i386-gcc-soft-float.patch + #endif +endif + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... + +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --with-sysroot=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +# +# Sigh... I had to rework things because using --with-gxx-include-dir +# causes issues with include dir search order for g++. This seems to +# have something to do with "path translations" and possibly doesn't +# affect gcc-target. However, I haven't tested gcc-target yet so no +# guarantees. mjn3 + +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-final +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + # Important! Required for limits.h to be fixed. + ln -sf ../include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); + # + # Now for the ugly 3.3.x soft float hack... + # +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.) + # Make sure we have a soft float specs file for this arch + if [ ! -f toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float ] ; then \ + echo soft float configured but no specs file for this arch ; \ + /bin/false ; \ + fi; + # Replace specs file with one that defaults to soft float mode. + if [ ! -f $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs ] ; then \ + echo staging dir specs file is missing ; \ + /bin/false ; \ + fi; + cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif +endif + # + # Ok... that's enough of that. + # + touch $(GCC_BUILD_DIR2)/.installed + +$(TARGET_DIR)/lib/libgcc_s.so.1: $(GCC_BUILD_DIR2)/.installed + # These are in /lib, so... + rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + -$(STRIP) $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s.so.1 + -cp -a $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s* $(TARGET_DIR)/lib/ + +gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \ + $(TARGET_DIR)/lib/libgcc_s.so.1 $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) + +gcc-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +# +# gcc-lib dir changes names to gcc with 3.4.mumble +# +ifeq ($(findstring 3.4.,$(GCC_VERSION)),3.4.) +GCC_LIB_SUBDIR=lib/gcc/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION) +else +GCC_LIB_SUBDIR=lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION) +endif + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/specs + # + # Now for the ugly 3.3.x soft float hack... + # +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.) + # Add a specs file that defaults to soft float mode. + cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + # Make sure gcc does not think we are cross compiling + $(SED) "s/^1/0/;" $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif +endif + # + # Ok... that's enough of that. + # + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + @if [ ! -f $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/include/syslimits.h ] ; then \ + echo "warning: working around missing syslimits.h" ; \ + cp -f $(STAGING_DIR)/$(GCC_LIB_SUBDIR)/include/syslimits.h \ + $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/include/ ; \ + fi + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/openwrt/toolchain/gcc/i386-gcc-soft-float.patch b/openwrt/toolchain/gcc/i386-gcc-soft-float.patch new file mode 100644 index 0000000000..97501087e2 --- /dev/null +++ b/openwrt/toolchain/gcc/i386-gcc-soft-float.patch @@ -0,0 +1,61 @@ +diff -urN gcc-3.3.2-orig/gcc/config/i386/i386.h gcc-3.3.2/gcc/config/i386/i386.h +--- gcc-3.3.2-orig/gcc/config/i386/i386.h 2003-06-25 16:18:31.000000000 -0500 ++++ gcc-3.3.2/gcc/config/i386/i386.h 2003-10-22 01:46:57.000000000 -0500 +@@ -653,6 +653,7 @@ + /* Define for XFmode or TFmode extended real floating point support. + The XFmode is specified by i386 ABI, while TFmode may be faster + due to alignment and simplifications in the address calculations. */ ++#if 0 + #define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : 96) + #define MAX_LONG_DOUBLE_TYPE_SIZE 128 + #ifdef __x86_64__ +@@ -660,6 +661,17 @@ + #else + #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96 + #endif ++#else ++ /* Set up for x86 soft float with 64-bit long doubles, since that's ++ * all the soft float emulation supports. */ ++#define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : (TARGET_80387 ? 96 : 64)) ++#define MAX_LONG_DOUBLE_TYPE_SIZE 128 ++#ifdef __x86_64__ ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 ++#else ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE (TARGET_80387 ? 96 : 64) ++#endif ++#endif + + /* Set the value of FLT_EVAL_METHOD in float.h. When using only the + FPU, assume that the fpcw is set to extended precision; when using +diff -urN gcc-3.3.2-orig/gcc/config/t-linux gcc-3.3.2/gcc/config/t-linux +--- gcc-3.3.2-orig/gcc/config/t-linux-uclibc 2003-06-04 11:56:11.000000000 -0500 ++++ gcc-3.3.2/gcc/config/t-linux-uclibc 2003-10-22 01:46:39.000000000 -0500 +@@ -21,3 +21,28 @@ + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c + LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h ++ ++############################################## ++# We want fine grained libraries, so use the new code to build the ++# floating point emulation libraries. ++FPBIT = fp-bit.c ++DPBIT = dp-bit.c ++ ++#LIB2FUNCS_EXTRA = xp-bit.c ++ ++dp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c ++ echo '#endif' >> dp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> dp-bit.c ++ ++fp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#define FLOAT' > fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c ++ echo '#endif' >> fp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c ++ ++#MULTILIB_OPTIONS = msoft-float ++#MULTILIB_DIRNAMES = soft-float ++ diff --git a/openwrt/toolchain/gdb/5.3/050-debian-subset.patch b/openwrt/toolchain/gdb/5.3/050-debian-subset.patch new file mode 100644 index 0000000000..e44b15ccdf --- /dev/null +++ b/openwrt/toolchain/gdb/5.3/050-debian-subset.patch @@ -0,0 +1,633 @@ +Patch pending upstream, probably acceptable. +-------------------------------------------- + + + +Daniel Jacobowitz writes: +> I like this. The way func_frame_chain_valid should really be used is +> by something like: +> +> /* NOTE: tm-i386nw.h and tm-i386v4.h override this. */ +> set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); +> +> (copied from i386-tdep.c). +> +> Does this patch work for you? + +Yes, thanks. I've included a revised version of my patch below. + +> I'm curious as to why we can't just set this universally, or at least a +> little more globally. Most things that have a main () use it as a +> normal main (). I'd propose that we set it as the default frame chain, +> and provide/document an option to ignore inside_main_func. + +Well, gdbarch is never supposed to change the default behavior of +macros; this helps us convert pre-gdbarch targets incrementally. +Simply turning on gdbarch for one's target ideally wouldn't change its +behavior at all. + + +[Patch revised for Debian snapshot] +--- snap/gdb/i386-linux-tdep.c.orig 2002-08-18 19:53:57.000000000 -0400 ++++ snap/gdb/i386-linux-tdep.c 2002-08-18 19:54:31.000000000 -0400 +@@ -452,6 +452,9 @@ + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + i386_linux_svr4_fetch_link_map_offsets); ++ ++ set_gdbarch_frame_chain_valid (gdbarch, ++ generic_func_frame_chain_valid); + } + + /* Provide a prototype to silence -Wmissing-prototypes. */ +[Hurd needs 6. Take 8, since it does no real harm.] + + +Package: gdb +Severity: normal +Tags: patch, sid + +Hello, + +GDB will crash on the Hurd after issuing the 'show' and hitting enter +a few times: + +../../gdb/ui-out.c:130: gdb-internal-error: push_level: Assertion +`uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS' failed. + +the problem is that MAX_UI_OUT_LEVELS is not high enough for the extra +option we have on the Hurd, it should be rised to 6 then, which works +fine: + +--- gdb-5.2.cvs20020401/gdb/ui-out.c~ Fri May 3 02:19:20 2002 ++++ gdb-5.2.cvs20020401/gdb/ui-out.c Fri May 3 02:19:32 2002 +@@ -45,7 +45,7 @@ + is always available. Stack/nested level 0 is reserved for the + top-level result. */ + +-enum { MAX_UI_OUT_LEVELS = 5 }; ++enum { MAX_UI_OUT_LEVELS = 8 }; + + struct ui_out_level + { + +-- +Robert Millan + +"5 years from now everyone will be running +free GNU on their 200 MIPS, 64M SPARCstation-5" + + Andrew S. Tanenbaum, 30 Jan 1992 + + +Submitted upstream, not liked very much. It's a hack, but it will do for +now. + +2002-07-31 Daniel Jacobowitz + + Fix PR gdb/568 + * thread-db.c (lwp_from_thread): Only warn if unable to find + the thread. + +Index: thread-db.c +=================================================================== +RCS file: /cvs/src/src/gdb/thread-db.c,v +retrieving revision 1.22 +diff -u -p -r1.22 thread-db.c +--- gdb/gdb/thread-db.c 23 Mar 2002 17:38:13 -0000 1.22 ++++ gdb/gdb/thread-db.c 31 Jul 2002 16:29:52 -0000 +@@ -260,6 +260,12 @@ lwp_from_thread (ptid_t ptid) + return ptid; + + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); ++ if (err == TD_ERR) ++ { ++ warning ("Cannot find thread %ld: %s", ++ (long) GET_THREAD (ptid), thread_db_err_str (err)); ++ return ptid; ++ } + if (err != TD_OK) + error ("Cannot find thread %ld: %s", + (long) GET_THREAD (ptid), thread_db_err_str (err)); +From Michael Fedrowitz . Not submitted to FSF yet. + + Hi, + +gdb fails to build from source on m68k because some definitions have +been removed from tm-m68k.h. The patch below readds them. + +-Michael + + +diff -urN gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h +--- gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h 2002-07-10 19:01:38.000000000 +0200 ++++ gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h 2002-10-06 18:01:59.000000000 +0200 +@@ -26,8 +26,11 @@ + /* Generic 68000 stuff, to be included by other tm-*.h files. */ + + /* D0_REGNM and A0_REGNUM must be defined here because they are +- used by the monitor. */ ++ used by the monitor. FPC_REGNUM, FPS_REGNUM and FPI_REGNUM are ++ defined here because they are used by m68klinux-nat.c. */ + + #define D0_REGNUM 0 + #define A0_REGNUM 8 +- ++#define FPC_REGNUM 26 ++#define FPS_REGNUM 27 ++#define FPI_REGNUM 28 + + +2002-11-24 Daniel Jacobowitz + + * doublest.c (convert_floatformat_to_doublest): Cast exp_bias to int. + * config/alpha/alpha-linux.mh (MH_CFLAGS): Add -mieee. + +--- gdb-5.2.debian90.cvs20021120/gdb/doublest.c.orig 2002-11-24 17:48:16.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/doublest.c 2002-11-24 17:48:25.000000000 -0500 +@@ -177,7 +177,7 @@ + if (!special_exponent) + exponent -= fmt->exp_bias; + else if (exponent == 0) +- exponent = 1 - fmt->exp_bias; ++ exponent = 1 - (int)fmt->exp_bias; + + /* Build the result algebraically. Might go infinite, underflow, etc; + who cares. */ +--- gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh.orig 2002-11-24 17:50:30.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh 2002-11-24 17:50:41.000000000 -0500 +@@ -8,3 +8,5 @@ + + MMALLOC = + MMALLOC_CFLAGS = -DNO_MMALLOC ++ ++MH_CFLAGS = -mieee +In CVS but not in 5.3 branch... + +2002-10-23 Daniel Jacobowitz + + * lin-lwp.c (lin_lwp_resume): Remove resume_all test for !step. + +Index: lin-lwp.c +=================================================================== +RCS file: /cvs/src/src/gdb/lin-lwp.c,v +retrieving revision 1.35 +diff -u -p -r1.35 lin-lwp.c +--- gdb-5.2.90/gdb/lin-lwp.c 27 Aug 2002 22:37:06 -0000 1.35 ++++ gdb-5.2.90/gdb/lin-lwp.c 23 Oct 2002 04:23:13 -0000 +@@ -579,11 +579,8 @@ lin_lwp_resume (ptid_t ptid, int step, e + struct lwp_info *lp; + int resume_all; + +- /* Apparently the interpretation of PID is dependent on STEP: If +- STEP is non-zero, a specific PID means `step only this process +- id'. But if STEP is zero, then PID means `continue *all* +- processes, but give the signal only to this one'. */ +- resume_all = (PIDGET (ptid) == -1) || !step; ++ /* A specific PTID means `step only this process id'. */ ++ resume_all = (PIDGET (ptid) == -1); + + if (resume_all) + iterate_over_lwps (resume_set_callback, NULL); + +Not submitted yet, testing. + +--- gdb-5.2.90/gdb/alpha-tdep.c.orig Sun Nov 24 21:42:53 2002 ++++ gdb-5.2.90/gdb/alpha-tdep.c Sun Nov 24 21:48:26 2002 +@@ -99,10 +99,12 @@ + + static alpha_extra_func_info_t heuristic_proc_desc (CORE_ADDR, + CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + static alpha_extra_func_info_t find_proc_desc (CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + #if 0 + static int alpha_in_lenient_prologue (CORE_ADDR, CORE_ADDR); +@@ -512,7 +514,7 @@ + if (tmp != 0) + pc = tmp; + +- proc_desc = find_proc_desc (pc, frame->next); ++ proc_desc = find_proc_desc (pc, frame->next, 1); + pcreg = proc_desc ? PROC_PC_REG (proc_desc) : ALPHA_RA_REGNUM; + + if (frame->signal_handler_caller) +@@ -596,10 +598,10 @@ + + static alpha_extra_func_info_t + heuristic_proc_desc (CORE_ADDR start_pc, CORE_ADDR limit_pc, +- struct frame_info *next_frame) ++ struct frame_info *next_frame, int read_sp_p) + { +- CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM); +- CORE_ADDR vfp = sp; ++ CORE_ADDR sp; ++ CORE_ADDR vfp; + CORE_ADDR cur_pc; + int frame_size; + int has_frame_reg = 0; +@@ -607,6 +609,11 @@ + int pcreg = -1; + int regno; + ++ if (read_sp_p) ++ vfp = sp = read_next_frame_reg (next_frame, SP_REGNUM); ++ else ++ vfp = sp = 0; ++ + if (start_pc == 0) + return NULL; + memset (&temp_proc_desc, '\0', sizeof (temp_proc_desc)); +@@ -761,7 +768,7 @@ + CORE_ADDR func_addr, func_end; + + if (!proc_desc) +- proc_desc = find_proc_desc (pc, NULL); ++ proc_desc = find_proc_desc (pc, NULL, 0); + + if (proc_desc) + { +@@ -807,7 +814,7 @@ + } + + static alpha_extra_func_info_t +-find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame) ++find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int read_sp_p) + { + alpha_extra_func_info_t proc_desc; + struct block *b; +@@ -879,7 +886,7 @@ + { + alpha_extra_func_info_t found_heuristic = + heuristic_proc_desc (PROC_LOW_ADDR (proc_desc), +- pc, next_frame); ++ pc, next_frame, read_sp_p); + if (found_heuristic) + { + PROC_LOCALOFF (found_heuristic) = +@@ -921,7 +928,7 @@ + startaddr = heuristic_proc_start (pc); + + proc_desc = +- heuristic_proc_desc (startaddr, pc, next_frame); ++ heuristic_proc_desc (startaddr, pc, next_frame, read_sp_p); + } + return proc_desc; + } +@@ -937,7 +944,7 @@ + if (saved_pc == 0 || inside_entry_file (saved_pc)) + return 0; + +- proc_desc = find_proc_desc (saved_pc, frame); ++ proc_desc = find_proc_desc (saved_pc, frame, 1); + if (!proc_desc) + return 0; + +@@ -979,7 +986,7 @@ + { + /* Use proc_desc calculated in frame_chain */ + alpha_extra_func_info_t proc_desc = +- frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next); ++ frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next, 1); + + frame->extra_info = (struct frame_extra_info *) + frame_obstack_alloc (sizeof (struct frame_extra_info)); +@@ -1291,7 +1298,7 @@ + /* we need proc_desc to know how to restore the registers; + if it is NULL, construct (a temporary) one */ + if (proc_desc == NULL) +- proc_desc = find_proc_desc (frame->pc, frame->next); ++ proc_desc = find_proc_desc (frame->pc, frame->next, 1); + + /* Question: should we copy this proc_desc and save it in + frame->proc_desc? If we do, who will free it? +Not yet submitted upstream. This requires some serious thinking about. +If the target stack worked in any logical way, this wouldn't be necessary... +ending up with roughly: + thread_stratum: thread-db (silent reference to lin-lwp) + core_stratum: corelow + exec_stratum: exec + dummy_stratum: dummy +just makes no sense. + +This patch fixes debugging threaded applications which are statically linked +without breaking debugging threaded core files. It also fixes the PIDs in +generate-core-file'd corefiles. Mostly. + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c gdb-5.2.debian90.cvs20021120/gdb/corelow.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-09-18 13:23:15.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-12-03 14:03:32.000000000 -0500 +@@ -350,7 +350,7 @@ + bfd_map_over_sections (core_bfd, add_to_thread_list, + bfd_get_section_by_name (core_bfd, ".reg")); + +- if (ontop) ++ if (ontop || 1) + { + /* Fetch all registers from core file. */ + target_fetch_registers (-1); +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 14:13:52.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 13:56:34.000000000 -0500 +@@ -177,7 +177,7 @@ + #ifdef FILL_FPXREGSET + gdb_fpxregset_t fpxregs; + #endif +- unsigned long merged_pid = ptid_get_tid (ptid) << 16 | ptid_get_pid (ptid); ++ unsigned long merged_pid = ptid_get_tid (ptid) << 16; /* | ptid_get_pid (ptid); */ + + fill_gregset (&gregs, -1); + note_data = (char *) elfcore_write_prstatus (obfd, +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/target.c gdb-5.2.debian90.cvs20021120/gdb/target.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-09-18 13:23:22.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-12-03 14:06:07.000000000 -0500 +@@ -1589,6 +1589,7 @@ + dummy_target.to_find_memory_regions = dummy_find_memory_regions; + dummy_target.to_make_corefile_notes = dummy_make_corefile_notes; + dummy_target.to_magic = OPS_MAGIC; ++ cleanup_target (&dummy_target); + } + + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c gdb-5.2.debian90.cvs20021120/gdb/thread-db.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 14:13:50.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 13:39:54.000000000 -0500 +@@ -57,6 +57,31 @@ + /* Non-zero if we're using this module's target vector. */ + static int using_thread_db; + ++/* Macros to pass an event to the next target if we should not be handling it ++ here in the thread_stratum. */ ++#define FIND_NEXT_TARGET(METHOD_NAME) \ ++ struct target_ops *next_target = &thread_db_ops; \ ++ while (1) \ ++ { \ ++ next_target = find_target_beneath (next_target); \ ++ if (next_target->METHOD_NAME != NULL) \ ++ break; \ ++ } ++ ++#define MAYBE_HAND_DOWN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ (*next_target->METHOD_NAME) ARGS; \ ++ return; \ ++ } ++#define MAYBE_HAND_DOWN_RETURN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ return (*next_target->METHOD_NAME) ARGS; \ ++ } ++ + /* Non-zero if we have to keep this module's target vector active + across re-runs. */ + static int keep_thread_db; +@@ -489,9 +514,7 @@ + { + td_err_e err; + +- /* Don't attempt to use thread_db on targets which can not run +- (core files). */ +- if (objfile == NULL || !target_has_execution) ++ if (objfile == NULL) + { + /* All symbols have been discarded. If the thread_db target is + active, deactivate it now. */ +@@ -515,7 +538,10 @@ + /* Initialize the structure that identifies the child process. Note + that at this point there is no guarantee that we actually have a + child process. */ +- proc_handle.pid = GET_PID (inferior_ptid); ++ if (target_has_execution) ++ proc_handle.pid = GET_PID (inferior_ptid); ++ else ++ proc_handle.pid = 0; + + /* Now attempt to open a connection to the thread library. */ + err = td_ta_new_p (&proc_handle, &thread_agent); +@@ -758,6 +784,9 @@ + struct cleanup *old_chain = save_inferior_ptid (); + int xfer; + ++ MAYBE_HAND_DOWN_RETURN (to_xfer_memory, (memaddr, myaddr, len, write, ++ attrib, target)); ++ + if (is_thread (inferior_ptid)) + { + /* FIXME: This seems to be necessary to make sure breakpoints +@@ -782,6 +811,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_fetch_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -819,6 +850,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_store_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -908,6 +941,8 @@ + td_thrinfo_t ti; + td_err_e err; + ++ MAYBE_HAND_DOWN_RETURN (to_thread_alive, (ptid)); ++ + if (is_thread (ptid)) + { + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); +@@ -961,6 +996,8 @@ + { + td_err_e err; + ++ MAYBE_HAND_DOWN (to_find_new_threads, ()); ++ + /* Iterate over all user-space threads to discover new threads. */ + err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL, + TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, +@@ -972,6 +1009,8 @@ + static char * + thread_db_pid_to_str (ptid_t ptid) + { ++ MAYBE_HAND_DOWN_RETURN (to_pid_to_str, (ptid)); ++ + if (is_thread (ptid)) + { + static char buf[64]; +Trivial. Need to submit this. + +--- gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c.orig 2002-12-03 14:35:44.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c 2002-12-03 14:43:02.000000000 -0500 +@@ -861,6 +861,8 @@ + else + line = gdb_readline (0); + ++ if (line == NULL || *line == EOF) ++ break; + linetype = validate_actionline (&line, t); + if (linetype == BADLINE) + continue; /* already warned -- collect another line */ +Fix build on Sparc. + +--- gdb-5.3/gdb/sparc-nat.c.orig 2003-01-04 00:11:28.000000000 -0500 ++++ gdb-5.3/gdb/sparc-nat.c 2003-01-04 00:12:42.000000000 -0500 +@@ -33,6 +33,13 @@ + #include + #include + #ifdef __linux__ ++/* Sadly, conflicts with on Linux. And ++ -D_GNU_SOURCE brings in implicitly with . ++ Hack around this. */ ++#undef FPU_REGS_TYPE ++#define fpu asm_reg_fpu ++#define fq asm_reg_fq ++#define fpq asm_reg_fpq + #include + #else + #include +diff -urN gdb-5.3/gdb/gdbserver.orig/gdbreplay.c gdb-5.3/gdb/gdbserver/gdbreplay.c +--- gdb-5.3/gdb/gdbserver.orig/gdbreplay.c 2002-07-09 11:38:58.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/gdbreplay.c 2003-08-20 08:44:20.000000000 -0600 +@@ -54,14 +54,15 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; + extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- err = (errno < sys_nerr) ? sys_errlist[errno] : "unknown error"; ++ err = strerror (errno); ++ if (err == NULL) ++ err = "unknown error"; + combined = (char *) alloca (strlen (err) + strlen (string) + 3); + strcpy (combined, string); + strcat (combined, ": "); +diff -urN gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c gdb-5.3/gdb/gdbserver/low-hppabsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-hppabsd.c 2003-08-20 08:46:04.000000000 -0600 +@@ -61,7 +61,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-lynx.c gdb-5.3/gdb/gdbserver/low-lynx.c +--- gdb-5.3/gdb/gdbserver.orig/low-lynx.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-lynx.c 2003-08-20 08:46:18.000000000 -0600 +@@ -79,7 +79,7 @@ + + fprintf (stderr, "GDBserver (process %d): Cannot exec %s: %s.\n", + getpid (), program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-nbsd.c gdb-5.3/gdb/gdbserver/low-nbsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-nbsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-nbsd.c 2003-08-20 08:46:27.000000000 -0600 +@@ -137,7 +137,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sparc.c gdb-5.3/gdb/gdbserver/low-sparc.c +--- gdb-5.3/gdb/gdbserver.orig/low-sparc.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sparc.c 2003-08-20 08:46:38.000000000 -0600 +@@ -44,7 +44,6 @@ + #include + #include + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -67,7 +66,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sun3.c gdb-5.3/gdb/gdbserver/low-sun3.c +--- gdb-5.3/gdb/gdbserver.orig/low-sun3.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sun3.c 2003-08-20 08:46:51.000000000 -0600 +@@ -41,7 +41,6 @@ + #include + #include + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -64,7 +63,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/utils.c gdb-5.3/gdb/gdbserver/utils.c +--- gdb-5.3/gdb/gdbserver.orig/utils.c 2003-08-20 08:47:56.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/utils.c 2003-08-20 08:48:15.000000000 -0600 +@@ -33,16 +33,13 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; +- extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- if (errno < sys_nerr) +- err = sys_errlist[errno]; +- else ++ err = strerror (errno); ++ if (err == NULL) + err = "unknown error"; + + combined = (char *) alloca (strlen (err) + strlen (string) + 3); +diff -urN gdb-5.3/gdb/gdbserver.orig/linux-low.c.orig gdb-5.3/gdb/gdbserver/linux-low.c.orig +--- gdb-5.3/gdb/gdbserver.orig/linux-low.c 2003-08-20 08:40:27.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/linux-low.c 2003-08-20 08:44:54.000000000 -0600 +@@ -175,8 +175,7 @@ + if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0) + { + fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error", +- errno); ++ strerror (errno), errno); + fflush (stderr); + + /* If we fail to attach to an LWP, just return. */ + diff --git a/openwrt/toolchain/gdb/5.3/100-uclibc.patch b/openwrt/toolchain/gdb/5.3/100-uclibc.patch new file mode 100644 index 0000000000..f9853035e3 --- /dev/null +++ b/openwrt/toolchain/gdb/5.3/100-uclibc.patch @@ -0,0 +1,154 @@ +diff -urN gdb-5.3/bfd/config.bfd gdb-5.3-new/bfd/config.bfd +--- gdb-5.3/bfd/config.bfd 2002-09-05 15:34:35.000000000 -0500 ++++ gdb-5.3-new/bfd/config.bfd 2004-01-11 06:25:31.000000000 -0600 +@@ -83,7 +83,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -97,7 +97,8 @@ + targ_defvec=bfd_elf64_ia64_aix_little_vec + targ_selvecs="bfd_elf64_ia64_aix_big_vec bfd_efi_app_ia64_vec" + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++ ia64*-*-linux-uclibc* | ia64*-*-elf*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -176,11 +177,12 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux*) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -313,7 +315,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -324,7 +326,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -424,7 +426,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -438,7 +440,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -589,7 +591,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -865,7 +867,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -887,8 +890,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcqnx_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1038,7 +1041,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1081,7 +1084,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN gdb-5.3/bfd/configure gdb-5.3-new/bfd/configure +--- gdb-5.3/bfd/configure 2002-08-28 05:38:44.000000000 -0500 ++++ gdb-5.3-new/bfd/configure 2004-01-11 06:27:15.000000000 -0600 +@@ -1677,6 +1677,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5067,7 +5072,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5126,7 +5131,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; diff --git a/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..8dbd347637 --- /dev/null +++ b/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.1.1-dist/bfd/config.bfd gdb-6.1.1/bfd/config.bfd +--- gdb-6.1.1-dist/bfd/config.bfd 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/config.bfd 2004-08-08 05:01:47.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -667,7 +667,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -952,8 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -984,8 +984,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1141,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1188,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1257,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.1.1-dist/bfd/configure gdb-6.1.1/bfd/configure +--- gdb-6.1.1-dist/bfd/configure 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/configure 2004-08-08 05:01:47.000000000 -0500 +@@ -1710,6 +1710,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5276,7 +5281,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5336,7 +5341,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5386,7 +5391,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5487,7 +5492,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.1.1-dist/bfd/configure.in gdb-6.1.1/bfd/configure.in +--- gdb-6.1.1-dist/bfd/configure.in 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/configure.in 2004-08-08 05:01:47.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.1.1-dist/libtool.m4 gdb-6.1.1/libtool.m4 +--- gdb-6.1.1-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.1.1/libtool.m4 2004-08-08 05:01:47.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.1.1-dist/ltconfig gdb-6.1.1/ltconfig +--- gdb-6.1.1-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.1.1/ltconfig 2004-08-08 05:01:47.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.1.1-dist/opcodes/configure gdb-6.1.1/opcodes/configure +--- gdb-6.1.1-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ gdb-6.1.1/opcodes/configure 2004-08-08 05:01:47.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..d3645bfeaa --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.2-dist/bfd/config.bfd gdb-6.2/bfd/config.bfd +--- gdb-6.2-dist/bfd/config.bfd 2004-07-09 07:32:35.000000000 -0500 ++++ gdb-6.2/bfd/config.bfd 2004-08-08 04:23:19.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -691,7 +691,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -972,8 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1009,8 +1009,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1177,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1224,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1293,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.2-dist/bfd/configure gdb-6.2/bfd/configure +--- gdb-6.2-dist/bfd/configure 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure 2004-08-08 04:27:01.000000000 -0500 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5264,7 +5269,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5328,7 +5333,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5366,7 +5371,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5470,7 +5475,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/bfd/configure.in gdb-6.2/bfd/configure.in +--- gdb-6.2-dist/bfd/configure.in 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure.in 2004-08-08 04:28:07.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/libtool.m4 gdb-6.2/libtool.m4 +--- gdb-6.2-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.2/libtool.m4 2004-08-08 03:48:33.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.2-dist/ltconfig gdb-6.2/ltconfig +--- gdb-6.2-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.2/ltconfig 2004-08-08 03:48:33.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.2-dist/opcodes/configure gdb-6.2/opcodes/configure +--- gdb-6.2-dist/opcodes/configure 2004-07-07 12:28:53.000000000 -0500 ++++ gdb-6.2/opcodes/configure 2004-08-08 04:53:55.000000000 -0500 +@@ -1701,6 +1701,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch b/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch new file mode 100644 index 0000000000..4e17ba7bea --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch @@ -0,0 +1,28 @@ +Sometime around 2.4.22-23, the mips pt_regs.h fields were reordered, breaking +coredump handling by gdb for current kernels. Update the hardcoded constants +to reflect the change. +--- gdb-6.2.1/gdb/mips-linux-tdep.c-orig 2004-10-29 14:23:55.000000000 -0500 ++++ gdb-6.2.1/gdb/mips-linux-tdep.c 2004-10-29 14:26:44.000000000 -0500 +@@ -53,12 +53,22 @@ + + #define EF_REG0 6 + #define EF_REG31 37 ++ ++#if 0 + #define EF_LO 38 + #define EF_HI 39 + #define EF_CP0_EPC 40 + #define EF_CP0_BADVADDR 41 + #define EF_CP0_STATUS 42 + #define EF_CP0_CAUSE 43 ++#else ++#define EF_CP0_STATUS 38 ++#define EF_LO 39 ++#define EF_HI 40 ++#define EF_CP0_BADVADDR 41 ++#define EF_CP0_CAUSE 42 ++#define EF_CP0_EPC 43 ++#endif + + #define EF_SIZE 180 + diff --git a/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..d3645bfeaa --- /dev/null +++ b/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.2-dist/bfd/config.bfd gdb-6.2/bfd/config.bfd +--- gdb-6.2-dist/bfd/config.bfd 2004-07-09 07:32:35.000000000 -0500 ++++ gdb-6.2/bfd/config.bfd 2004-08-08 04:23:19.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -691,7 +691,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -972,8 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1009,8 +1009,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1177,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1224,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1293,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.2-dist/bfd/configure gdb-6.2/bfd/configure +--- gdb-6.2-dist/bfd/configure 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure 2004-08-08 04:27:01.000000000 -0500 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5264,7 +5269,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5328,7 +5333,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5366,7 +5371,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5470,7 +5475,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/bfd/configure.in gdb-6.2/bfd/configure.in +--- gdb-6.2-dist/bfd/configure.in 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure.in 2004-08-08 04:28:07.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/libtool.m4 gdb-6.2/libtool.m4 +--- gdb-6.2-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.2/libtool.m4 2004-08-08 03:48:33.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.2-dist/ltconfig gdb-6.2/ltconfig +--- gdb-6.2-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.2/ltconfig 2004-08-08 03:48:33.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.2-dist/opcodes/configure gdb-6.2/opcodes/configure +--- gdb-6.2-dist/opcodes/configure 2004-07-07 12:28:53.000000000 -0500 ++++ gdb-6.2/opcodes/configure 2004-08-08 04:53:55.000000000 -0500 +@@ -1701,6 +1701,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/Config.in b/openwrt/toolchain/gdb/Config.in new file mode 100644 index 0000000000..a17b736dc6 --- /dev/null +++ b/openwrt/toolchain/gdb/Config.in @@ -0,0 +1,49 @@ +# Choose gcc version. +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. + +comment "Gdb Options" + +config BR2_PACKAGE_GDB + bool "Build gdb debugger for the Target" + default n + select BR2_PACKAGE_NCURSES + help + Enable the gdb debugger. + +config BR2_PACKAGE_GDB_SERVER + bool "Build gdb server for the Target" + default n + select BR2_PACKAGE_NCURSES + help + Enable the gdb debugger. + +choice + prompt "GDB debuger Version" + default BR2_GDB_VERSION_5_3 + depends on BR2_PACKAGE_GDB || BR2_PACKAGE_GDB_SERVER || BR2_HOST_GDB + help + Select the version of gcc you wish to use. + + config BR2_GDB_VERSION_5.3 + bool "gdb 5.3" + + config BR2_GDB_VERSION_6_1_1 + bool "gdb 6.1.1" + + config BR2_GDB_VERSION_6_2 + bool "gdb 6.2" + + config BR2_GDB_VERSION_6_2_1 + bool "gdb 6.2.1" + +endchoice + +config BR2_GDB_VERSION + string + default "5.3" if BR2_GDB_VERSION_5.3 + default "6.1.1" if BR2_GDB_VERSION_6_1_1 + default "6.2" if BR2_GDB_VERSION_6_2 + default "6.2.1" if BR2_GDB_VERSION_6_2_1 + + diff --git a/openwrt/toolchain/gdb/Makefile.in b/openwrt/toolchain/gdb/Makefile.in new file mode 100644 index 0000000000..51a2ddb3d0 --- /dev/null +++ b/openwrt/toolchain/gdb/Makefile.in @@ -0,0 +1,10 @@ +GDB_VERSION:=$(strip $(subst ",, $(BR2_GDB_VERSION))) +#" + +ifeq ($(strip $(BR2_PACKAGE_GDB)),y) +TARGETS+=gdb_target +endif + +ifeq ($(strip $(BR2_PACKAGE_GDB_SERVER)),y) +TARGETS+=gdbserver gdbclient +endif diff --git a/openwrt/toolchain/gdb/gdb.mk b/openwrt/toolchain/gdb/gdb.mk new file mode 100644 index 0000000000..862f84d7f5 --- /dev/null +++ b/openwrt/toolchain/gdb/gdb.mk @@ -0,0 +1,189 @@ +###################################################################### +# +# gdb +# +###################################################################### +GDB_VERSION:=$(strip $(GDB_VERSION)) + +GDB_SITE:=http://ftp.gnu.org/gnu/gdb + +ifeq ($(GDB_VERSION),5.3) +GDB_SOURCE:=gdb-$(GDB_VERSION).tar.gz +GDB_CAT:=zcat +else +GDB_SOURCE:=gdb-$(GDB_VERSION).tar.bz2 +GDB_CAT:=bzcat +endif + +GDB_DIR:=$(TOOL_BUILD_DIR)/gdb-$(GDB_VERSION) + +$(DL_DIR)/$(GDB_SOURCE): + $(WGET) -P $(DL_DIR) $(GDB_SITE)/$(GDB_SOURCE) + +$(GDB_DIR)/.unpacked: $(DL_DIR)/$(GDB_SOURCE) + $(GDB_CAT) $(DL_DIR)/$(GDB_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(GDB_DIR) toolchain/gdb/$(GDB_VERSION) \*.patch + # Copy a config.sub from gcc. This is only necessary until + # gdb's config.sub supports -linux-uclibc tuples. + # Should probably integrate this into the patch. +ifeq ($(GDB_VERSION),5.3) + chmod u+x $(GDB_DIR)/gdb/gdbserver/configure + cp $(GCC_DIR)/config.sub $(GDB_DIR) + cp $(GCC_DIR)/config.sub $(GDB_DIR)/readline/support/ +endif + touch $(GDB_DIR)/.unpacked + +###################################################################### +# +# gdb target +# +###################################################################### + +GDB_TARGET_DIR:=$(BUILD_DIR)/gdb-$(GDB_VERSION)-target + +GDB_TARGET_CONFIGURE_VARS:= \ + ac_cv_type_uintptr_t=yes \ + gt_cv_func_gettext_libintl=yes \ + ac_cv_func_dcgettext=yes \ + gdb_cv_func_sigsetjmp=yes \ + bash_cv_func_strcoll_broken=no \ + bash_cv_must_reinstall_sighandlers=no \ + bash_cv_func_sigsetjmp=present \ + bash_cv_have_mbstate_t=yes + +$(GDB_TARGET_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_TARGET_DIR) + (cd $(GDB_TARGET_DIR); \ + gdb_cv_func_sigsetjmp=yes \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ + $(GDB_TARGET_CONFIGURE_VARS) \ + $(GDB_DIR)/configure \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --prefix=/usr \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --disable-sim --enable-gdbserver \ + --without-included-gettext \ + ); +ifeq ($(ENABLE_LOCALE),true) + -$(SED) "s,^INTL *=.*,INTL = -lintl,g;" $(GDB_DIR)/gdb/Makefile +endif + touch $(GDB_TARGET_DIR)/.configured + +$(GDB_TARGET_DIR)/gdb/gdb: $(GDB_TARGET_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) MT_CFLAGS="$(TARGET_CFLAGS)" \ + -C $(GDB_TARGET_DIR) + $(STRIP) $(GDB_TARGET_DIR)/gdb/gdb + +$(TARGET_DIR)/usr/bin/gdb: $(GDB_TARGET_DIR)/gdb/gdb + install -c $(GDB_TARGET_DIR)/gdb/gdb $(TARGET_DIR)/usr/bin/gdb + +gdb_target: ncurses-headers $(TARGET_DIR)/usr/bin/gdb + +gdb_target-source: $(DL_DIR)/$(GDB_SOURCE) + +gdb_target-clean: + $(MAKE) -C $(GDB_DIR) clean + +gdb_target-dirclean: + rm -rf $(GDB_DIR) + +###################################################################### +# +# gdbserver +# +###################################################################### + +GDB_SERVER_DIR:=$(BUILD_DIR)/gdbserver-$(GDB_VERSION) + +$(GDB_SERVER_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_SERVER_DIR) + (cd $(GDB_SERVER_DIR); \ + $(TARGET_CONFIGURE_OPTS) \ + gdb_cv_func_sigsetjmp=yes \ + $(GDB_DIR)/gdb/gdbserver/configure \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --includedir=$(STAGING_DIR)/include \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --without-included-gettext \ + ); + touch $(GDB_SERVER_DIR)/.configured + +$(GDB_SERVER_DIR)/gdbserver: $(GDB_SERVER_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) MT_CFLAGS="$(TARGET_CFLAGS)" \ + -C $(GDB_SERVER_DIR) + $(STRIP) $(GDB_SERVER_DIR)/gdbserver + +$(TARGET_DIR)/usr/bin/gdbserver: $(GDB_SERVER_DIR)/gdbserver + install -c $(GDB_SERVER_DIR)/gdbserver $(TARGET_DIR)/usr/bin/gdbserver + +gdbserver: ncurses-headers $(TARGET_DIR)/usr/bin/gdbserver + +gdbserver-clean: + $(MAKE) -C $(GDB_SERVER_DIR) clean + +gdbserver-dirclean: + rm -rf $(GDB_SERVER_DIR) + +###################################################################### +# +# gdb client +# +###################################################################### + +GDB_CLIENT_DIR:=$(TOOL_BUILD_DIR)/gdbclient-$(GDB_VERSION) + +$(GDB_CLIENT_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_CLIENT_DIR) + (cd $(GDB_CLIENT_DIR); \ + gdb_cv_func_sigsetjmp=yes \ + $(GDB_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --without-included-gettext \ + --enable-threads \ + ); + touch $(GDB_CLIENT_DIR)/.configured + +$(GDB_CLIENT_DIR)/gdb/gdb: $(GDB_CLIENT_DIR)/.configured + $(MAKE) -C $(GDB_CLIENT_DIR) + strip $(GDB_CLIENT_DIR)/gdb/gdb + +$(TARGET_CROSS)gdb: $(GDB_CLIENT_DIR)/gdb/gdb + install -c $(GDB_CLIENT_DIR)/gdb/gdb $(TARGET_CROSS)gdb + ln -s ../../bin/$(REAL_GNU_TARGET_NAME)-gdb \ + $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/gdb + +gdbclient: $(TARGET_CROSS)gdb + +gdbclient-clean: + $(MAKE) -C $(GDB_CLIENT_DIR) clean + +gdbclient-dirclean: + rm -rf $(GDB_CLIENT_DIR) + + + diff --git a/openwrt/toolchain/patch-kernel.sh b/openwrt/toolchain/patch-kernel.sh new file mode 100755 index 0000000000..79401c2a74 --- /dev/null +++ b/openwrt/toolchain/patch-kernel.sh @@ -0,0 +1,53 @@ +#! /bin/sh +# A little script I whipped up to make it easy to +# patch source trees and have sane error handling +# -Erik +# +# (c) 2002 Erik Andersen + +# Set directories from arguments, or use defaults. +targetdir=${1-.} +patchdir=${2-../kernel-patches} +patchpattern=${3-*} + +if [ ! -d "${targetdir}" ] ; then + echo "Aborting. '${targetdir}' is not a directory." + exit 1 +fi +if [ ! -d "${patchdir}" ] ; then + echo "Aborting. '${patchdir}' is not a directory." + exit 1 +fi + +for i in ${patchdir}/${patchpattern} ; do + case "$i" in + *.gz) + type="gzip"; uncomp="gunzip -dc"; ;; + *.bz) + type="bzip"; uncomp="bunzip -dc"; ;; + *.bz2) + type="bzip2"; uncomp="bunzip2 -dc"; ;; + *.zip) + type="zip"; uncomp="unzip -d"; ;; + *.Z) + type="compress"; uncomp="uncompress -c"; ;; + *) + type="plaintext"; uncomp="cat"; ;; + esac + echo "" + echo "Applying ${i} using ${type}: " + ${uncomp} ${i} | patch -p1 -E -d ${targetdir} + if [ $? != 0 ] ; then + echo "Patch failed! Please fix $i!" + exit 1 + fi +done + +# Check for rejects... +if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then + echo "Aborting. Reject files found." + exit 1 +fi + +# Remove backup files +find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; diff --git a/openwrt/toolchain/uClibc/Config.in b/openwrt/toolchain/uClibc/Config.in new file mode 100644 index 0000000000..335cab2455 --- /dev/null +++ b/openwrt/toolchain/uClibc/Config.in @@ -0,0 +1,23 @@ +# Choose uClibc options +# + +comment "uClibc Options" + +config BR2_UCLIBC_VERSION_SNAPSHOT + bool "Use the daily snapshot of uClibc?" + default y + help + Would you like to use the latest daily snapshot? + +config BR2_USE_UCLIBC_SNAPSHOT + string + default "snapshot" + depends on BR2_UCLIBC_VERSION_SNAPSHOT + +config BR2_ENABLE_LOCALE + bool "Enable locale/gettext/i18n support?" + default n + help + Enable locale/gettext/i18n support? + + diff --git a/openwrt/toolchain/uClibc/uClibc.config b/openwrt/toolchain/uClibc/uClibc.config new file mode 100644 index 0000000000..4c3c5a1792 --- /dev/null +++ b/openwrt/toolchain/uClibc/uClibc.config @@ -0,0 +1,150 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +TARGET_mips=y +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="mips" +ARCH_CFLAGS="-mno-split-addresses" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_MIPS_ISA_1 is not set +# CONFIG_MIPS_ISA_2 is not set +# CONFIG_MIPS_ISA_3 is not set +# CONFIG_MIPS_ISA_4 is not set +CONFIG_MIPS_ISA_MIPS32=y +# CONFIG_MIPS_ISA_MIPS64 is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/cvs/new/buildroot/toolchain_build_mipsel/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +# UCLIBC_HAS_WORDEXP is not set +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/" +DEVEL_PREFIX="/usr/" + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/openwrt/toolchain/uClibc/uClibc.config-locale b/openwrt/toolchain/uClibc/uClibc.config-locale new file mode 100644 index 0000000000..95a4983fc5 --- /dev/null +++ b/openwrt/toolchain/uClibc/uClibc.config-locale @@ -0,0 +1,142 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +TARGET_ARCH="none" +# ARCH_HAS_NO_MMU is not set +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/linux" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +HAVE_SHARED=y +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# UCLIBC_PROFILING is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +UCLIBC_HAS_LOCALE=y +UCLIBC_PREGENERATED_LOCALE_DATA=y +UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA=y +UCLIBC_HAS_XLOCALE=y +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_DIGIT_GROUPING=y +UCLIBC_HAS_SCANF_LENIENT_DIGIT_GROUPING=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GETTEXT_AWARENESS=y +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/" +DEVEL_PREFIX="/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/openwrt/toolchain/uClibc/uclibc.mk b/openwrt/toolchain/uClibc/uclibc.mk new file mode 100644 index 0000000000..d104ce145c --- /dev/null +++ b/openwrt/toolchain/uClibc/uclibc.mk @@ -0,0 +1,167 @@ +############################################################# +# +# uClibc (the C library) +# +############################################################# + +ifeq ($(BR2_UCLIBC_VERSION_SNAPSHOT),y) +# Be aware that this changes daily.... +UCLIBC_DIR:=$(TOOL_BUILD_DIR)/uClibc +UCLIBC_SOURCE:=uClibc-$(strip $(subst ",, $(BR2_USE_UCLIBC_SNAPSHOT))).tar.bz2 +#" +UCLIBC_SITE:=http://www.uclibc.org/downloads/snapshots +else +# Note: 0.9.26 has known problems. So best use a snapshot until .27 is out. +# Anticipate the change. +UCLIBC_DIR:=$(TOOL_BUILD_DIR)/uClibc-0.9.27 +UCLIBC_SOURCE:=uClibc-0.9.27.tar.bz2 +UCLIBC_SITE:=http://www.uclibc.org/downloads +endif + +UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \ + -e 's/i.86/i386/' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh64/sh/' \ + -e 's/sh[234].*/sh/' \ + -e 's/mips.*/mips/' \ + -e 's/mipsel.*/mips/' \ + -e 's/cris.*/cris/' \ +) + + +$(DL_DIR)/$(UCLIBC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(UCLIBC_SITE)/$(UCLIBC_SOURCE) + +$(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(UCLIBC_DIR)/.unpacked + +$(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked + $(SED) 's,^CROSS=.*,CROSS=$(TARGET_CROSS),g' $(UCLIBC_DIR)/Rules.mak +ifeq ($(BR2_ENABLE_LOCALE),y) + cp toolchain/uClibc/uClibc.config-locale $(UCLIBC_DIR)/.config +else + cp toolchain/uClibc/uClibc.config $(UCLIBC_DIR)/.config +endif + $(SED) 's,^.*TARGET_$(UCLIBC_TARGET_ARCH).*,TARGET_$(UCLIBC_TARGET_ARCH)=y,g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^TARGET_ARCH.*,TARGET_ARCH=\"$(UCLIBC_TARGET_ARCH)\",g' $(UCLIBC_DIR)/.config + $(SED) 's,^KERNEL_SOURCE=.*,KERNEL_SOURCE=\"$(LINUX_HEADERS_DIR)\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^RUNTIME_PREFIX=.*,RUNTIME_PREFIX=\"/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^DEVEL_PREFIX=.*,DEVEL_PREFIX=\"/usr/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^SHARED_LIB_LOADER_PREFIX=.*,SHARED_LIB_LOADER_PREFIX=\"/lib\",g' \ + $(UCLIBC_DIR)/.config +ifeq ($(BR2_LARGEFILE),y) + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=y,g' $(UCLIBC_DIR)/.config +else + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=n,g' $(UCLIBC_DIR)/.config +endif + $(SED) 's,.*UCLIBC_HAS_WCHAR.*,UCLIBC_HAS_WCHAR=y,g' $(UCLIBC_DIR)/.config +ifeq ($(BR2_SOFT_FLOAT),y) + $(SED) 's,.*HAS_FPU.*,HAS_FPU=n\nUCLIBC_HAS_FLOATS=y\nUCLIBC_HAS_SOFT_FLOAT=y,g' $(UCLIBC_DIR)/.config +endif + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/include + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/lib + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/lib + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + HOSTCC="$(HOSTCC)" \ + pregen install_dev; + touch $(UCLIBC_DIR)/.configured + +$(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/.configured $(LIBFLOAT_TARGET) + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX= \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + HOSTCC="$(HOSTCC)" \ + all + touch -c $(UCLIBC_DIR)/lib/libc.a + +$(STAGING_DIR)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + install_runtime + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + install_dev + # Build the host utils. Need to add an install target... + $(MAKE1) -C $(UCLIBC_DIR)/utils \ + PREFIX=$(STAGING_DIR) \ + HOSTCC="$(HOSTCC)" \ + hostutils + touch -c $(STAGING_DIR)/lib/libc.a + +ifneq ($(TARGET_DIR),) +$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_runtime + touch -c $(TARGET_DIR)/lib/libc.so.0 + +$(TARGET_DIR)/usr/bin/ldd: + $(MAKE1) -C $(UCLIBC_DIR) $(TARGET_CONFIGURE_OPTS) \ + PREFIX=$(TARGET_DIR) utils install_utils + touch -c $(TARGET_DIR)/usr/bin/ldd + +UCLIBC_TARGETS=$(TARGET_DIR)/lib/libc.so.0 +endif + +uclibc-configured: $(UCLIBC_DIR)/.configured + +uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/lib/libc.a \ + $(UCLIBC_TARGETS) + +uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) + +uclibc-configured-source: uclibc-source + +uclibc-clean: + -$(MAKE1) -C $(UCLIBC_DIR) clean + rm -f $(UCLIBC_DIR)/.config + +uclibc-dirclean: + rm -rf $(UCLIBC_DIR) + +uclibc-target-utils: $(TARGET_DIR)/usr/bin/ldd + +############################################################# +# +# uClibc for the target just needs its header files +# and whatnot installed. +# +############################################################# + +$(TARGET_DIR)/usr/lib/libc.a: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_dev + touch -c $(TARGET_DIR)/usr/lib/libc.a + +uclibc_target: gcc uclibc $(TARGET_DIR)/usr/lib/libc.a $(TARGET_DIR)/usr/bin/ldd + +uclibc_target-clean: + rm -f $(TARGET_DIR)/include + +uclibc_target-dirclean: + rm -f $(TARGET_DIR)/include +