From ea30b6c3a76b0ad8e8f8efc4cd483bc98d99e191 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sun, 7 May 2006 23:13:24 +0000 Subject: [PATCH] *** empty log message *** --- build-devkit.sh | 2 +- dkarm/patches/gcc-4.1.0.patch | 94 +- dkpsp/patches/binutils-2.16.1.patch | 3122 ++++++++--- dkpsp/patches/gcc-4.1.0.patch | 924 +++ dkpsp/patches/newlib-1.14.0.patch | 8016 +++++++++++++++++++++++++++ dkpsp/scripts/build-gcc.sh | 1 + 6 files changed, 11397 insertions(+), 762 deletions(-) create mode 100644 dkpsp/patches/gcc-4.1.0.patch create mode 100644 dkpsp/patches/newlib-1.14.0.patch diff --git a/build-devkit.sh b/build-devkit.sh index 44ac4fb..cad1033 100644 --- a/build-devkit.sh +++ b/build-devkit.sh @@ -12,7 +12,7 @@ NEWLIB_VER=1.14.0 LIBOGC_VER=20050812 LIBGBA_VER=20060410 LIBNDS_VER=20060410 -ELF2FLT_VER=20060412 +ELF2FLT_VER=20060506 BINUTILS="binutils-$BINUTILS_VER.tar.bz2" GCC_CORE="gcc-core-$GCC_VER.tar.bz2" diff --git a/dkarm/patches/gcc-4.1.0.patch b/dkarm/patches/gcc-4.1.0.patch index aa228f2..bb9c0bf 100644 --- a/dkarm/patches/gcc-4.1.0.patch +++ b/dkarm/patches/gcc-4.1.0.patch @@ -1,6 +1,6 @@ -diff -Naurb gcc-4.1.0-20060219/gcc/c-incpath.c gcc-4.1.0-20060219-arm/gcc/c-incpath.c ---- gcc-4.1.0-20060219/gcc/c-incpath.c Sat Jun 25 03:02:01 2005 -+++ gcc-4.1.0-20060219-arm/gcc/c-incpath.c Mon Feb 20 13:44:13 2006 +diff -Naurb gcc-4.1.0/gcc/c-incpath.c gcc-4.1.0-arm/gcc/c-incpath.c +--- gcc-4.1.0/gcc/c-incpath.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.0-arm/gcc/c-incpath.c Wed Apr 12 16:00:30 2006 @@ -331,13 +331,18 @@ cpp_dir *p; @@ -27,9 +27,9 @@ diff -Naurb gcc-4.1.0-20060219/gcc/c-incpath.c gcc-4.1.0-20060219-arm/gcc/c-incp #endif p = xmalloc (sizeof (cpp_dir)); -diff -Naurb gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf gcc-4.1.0-20060219-arm/gcc/config/arm/t-arm-elf ---- gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf Wed Sep 1 12:14:21 2004 -+++ gcc-4.1.0-20060219-arm/gcc/config/arm/t-arm-elf Mon Feb 20 13:44:13 2006 +diff -Naurb gcc-4.1.0/gcc/config/arm/t-arm-elf gcc-4.1.0-arm/gcc/config/arm/t-arm-elf +--- gcc-4.1.0/gcc/config/arm/t-arm-elf Wed Sep 1 12:14:21 2004 ++++ gcc-4.1.0-arm/gcc/config/arm/t-arm-elf Wed Apr 12 16:00:30 2006 @@ -23,8 +23,8 @@ # MULTILIB_DIRNAMES += fpu soft # MULTILIB_EXCEPTIONS += *mthumb/*mhard-float* @@ -41,9 +41,85 @@ diff -Naurb gcc-4.1.0-20060219/gcc/config/arm/t-arm-elf gcc-4.1.0-20060219-arm/g # # MULTILIB_OPTIONS += fno-leading-underscore/fleading-underscore # MULTILIB_DIRNAMES += elf under -diff -Naurb gcc-4.1.0-20060219/gcc/version.c gcc-4.1.0-20060219-arm/gcc/version.c ---- gcc-4.1.0-20060219/gcc/version.c Wed Mar 16 06:04:10 2005 -+++ gcc-4.1.0-20060219-arm/gcc/version.c Mon Feb 20 13:47:44 2006 +diff -Naurb gcc-4.1.0/gcc/gcc.c gcc-4.1.0-arm/gcc/gcc.c +--- gcc-4.1.0/gcc/gcc.c Sat Jan 21 18:29:08 2006 ++++ gcc-4.1.0-arm/gcc/gcc.c Fri May 5 10:18:31 2006 +@@ -3250,8 +3250,6 @@ + gcc_libexec_prefix = make_relative_prefix (argv[0], + standard_bindir_prefix, + standard_libexec_prefix); +- if (gcc_exec_prefix) +- putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL)); + } + else + gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix, +@@ -6148,10 +6146,10 @@ + + /* We need to check standard_exec_prefix/just_machine_suffix/specs + for any override of as, ld and libraries. */ +- specs_file = alloca (strlen (standard_exec_prefix) ++ specs_file = alloca (strlen (gcc_exec_prefix) + + strlen (just_machine_suffix) + sizeof ("specs")); + +- strcpy (specs_file, standard_exec_prefix); ++ strcpy (specs_file, gcc_exec_prefix); + strcat (specs_file, just_machine_suffix); + strcat (specs_file, "specs"); + if (access (specs_file, R_OK) == 0) +diff -Naurb gcc-4.1.0/gcc/prefix.c gcc-4.1.0-arm/gcc/prefix.c +--- gcc-4.1.0/gcc/prefix.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.0-arm/gcc/prefix.c Fri May 5 10:18:51 2006 +@@ -246,13 +246,16 @@ + The returned string is always malloc-ed, and the caller is + responsible for freeing it. */ + ++ ++static const char *old_prefix = PREFIX; ++ + char * + update_path (const char *path, const char *key) + { + char *result, *p; +- const int len = strlen (std_prefix); ++ const int len = strlen (old_prefix); + +- if (! strncmp (path, std_prefix, len) ++ if (! strncmp (path, old_prefix, len) + && (IS_DIR_SEPARATOR(path[len]) + || path[len] == '\0') + && key != 0) +@@ -354,4 +357,6 @@ + set_std_prefix (const char *prefix, int len) + { + std_prefix = save_string (prefix, len); ++ ++ putenv (concat ("GCC_EXEC_PREFIX=", std_prefix, NULL)); + } +diff -Naurb gcc-4.1.0/gcc/toplev.c gcc-4.1.0-arm/gcc/toplev.c +--- gcc-4.1.0/gcc/toplev.c Sat Feb 4 22:13:20 2006 ++++ gcc-4.1.0-arm/gcc/toplev.c Wed Apr 26 16:49:36 2006 +@@ -82,6 +82,7 @@ + #include "value-prof.h" + #include "alloc-pool.h" + #include "tree-mudflap.h" ++#include "prefix.h" + + #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) + #include "dwarf2out.h" +@@ -1434,6 +1435,10 @@ + progname = p; + + xmalloc_set_program_name (progname); ++ ++ p = getenv("GCC_EXEC_PREFIX"); ++ set_std_prefix (p, strlen(p)); ++ + + hex_init (); + +diff -Naurb gcc-4.1.0/gcc/version.c gcc-4.1.0-arm/gcc/version.c +--- gcc-4.1.0/gcc/version.c Wed Mar 16 06:04:10 2005 ++++ gcc-4.1.0-arm/gcc/version.c Wed Apr 12 16:00:30 2006 @@ -8,7 +8,7 @@ in parentheses. You may also wish to include a number indicating the revision of your modified compiler. */ diff --git a/dkpsp/patches/binutils-2.16.1.patch b/dkpsp/patches/binutils-2.16.1.patch index 87e0104..35fd3dd 100644 --- a/dkpsp/patches/binutils-2.16.1.patch +++ b/dkpsp/patches/binutils-2.16.1.patch @@ -1,27 +1,6 @@ ---- binutils-2.16.1.orig/bfd/Makefile.am 2005-05-02 12:45:42.000000000 -0700 -+++ binutils-psp/bfd/Makefile.am 2005-07-22 22:17:36.000000000 -0700 -@@ -3,7 +3,7 @@ - AUTOMAKE_OPTIONS = 1.9 cygnus - - # Uncomment the following line when doing a release. --RELEASE=y -+#RELEASE=y - - INCDIR = $(srcdir)/../include - CSEARCH = -I. -I$(srcdir) -I$(INCDIR) ---- binutils-2.16.1.orig/bfd/Makefile.in 2005-05-02 12:45:46.000000000 -0700 -+++ binutils-psp/bfd/Makefile.in 2005-07-22 22:17:46.000000000 -0700 -@@ -250,7 +250,7 @@ - AUTOMAKE_OPTIONS = 1.9 cygnus - - # Uncomment the following line when doing a release. --RELEASE=y -+#RELEASE=y - INCDIR = $(srcdir)/../include - CSEARCH = -I. -I$(srcdir) -I$(INCDIR) - MKDEP = gcc -MM ---- binutils-2.16.1.orig/bfd/archures.c 2005-01-17 06:08:03.000000000 -0800 -+++ binutils-psp/bfd/archures.c 2005-06-19 18:09:32.000000000 -0700 +diff -burN binutils-2.16.1/bfd/archures.c binutils-psp/bfd/archures.c +--- binutils-2.16.1/bfd/archures.c 2005-01-17 14:08:03.000000000 +0000 ++++ binutils-psp/bfd/archures.c 2006-01-10 23:31:50.000000000 +0000 @@ -155,6 +155,7 @@ .#define bfd_mach_mips16 16 .#define bfd_mach_mips5 5 @@ -30,8 +9,9 @@ .#define bfd_mach_mipsisa32 32 .#define bfd_mach_mipsisa32r2 33 .#define bfd_mach_mipsisa64 64 ---- binutils-2.16.1.orig/bfd/bfd-in2.h 2005-03-02 13:23:20.000000000 -0800 -+++ binutils-psp/bfd/bfd-in2.h 2005-06-19 18:09:32.000000000 -0700 +diff -burN binutils-2.16.1/bfd/bfd-in2.h binutils-psp/bfd/bfd-in2.h +--- binutils-2.16.1/bfd/bfd-in2.h 2005-03-02 21:23:20.000000000 +0000 ++++ binutils-psp/bfd/bfd-in2.h 2006-01-10 23:31:50.000000000 +0000 @@ -1600,6 +1600,7 @@ #define bfd_mach_mips16 16 #define bfd_mach_mips5 5 @@ -40,8 +20,9 @@ #define bfd_mach_mipsisa32 32 #define bfd_mach_mipsisa32r2 33 #define bfd_mach_mipsisa64 64 ---- binutils-2.16.1.orig/bfd/cpu-mips.c 2005-03-03 03:40:58.000000000 -0800 -+++ binutils-psp/bfd/cpu-mips.c 2005-06-19 18:09:32.000000000 -0700 +diff -burN binutils-2.16.1/bfd/cpu-mips.c binutils-psp/bfd/cpu-mips.c +--- binutils-2.16.1/bfd/cpu-mips.c 2005-03-03 11:40:58.000000000 +0000 ++++ binutils-psp/bfd/cpu-mips.c 2006-01-10 23:31:50.000000000 +0000 @@ -86,6 +86,7 @@ I_mipsisa64, I_mipsisa64r2, @@ -60,9 +41,10 @@ }; /* The default architecture is mips:3000, but with a machine number of ---- binutils-2.16.1.orig/bfd/elfxx-mips.c 2005-10-22 15:36:24.000000000 -0700 -+++ binutils-psp/bfd/elfxx-mips.c 2005-10-22 15:38:52.000000000 -0700 -@@ -4669,6 +4669,9 @@ _bfd_elf_mips_mach (flagword flags) +diff -burN binutils-2.16.1/bfd/elfxx-mips.c binutils-psp/bfd/elfxx-mips.c +--- binutils-2.16.1/bfd/elfxx-mips.c 2005-05-28 22:58:29.000000000 +0100 ++++ binutils-psp/bfd/elfxx-mips.c 2006-01-10 23:31:51.000000000 +0000 +@@ -4669,6 +4669,9 @@ case E_MIPS_MACH_SB1: return bfd_mach_mips_sb1; @@ -72,7 +54,7 @@ default: switch (flags & EF_MIPS_ARCH) { -@@ -7941,6 +7944,10 @@ mips_set_isa_flags (bfd *abfd) +@@ -7941,6 +7944,10 @@ val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1; break; @@ -83,113 +65,24 @@ case bfd_mach_mipsisa32: val = E_MIPS_ARCH_32; break; -@@ -8422,56 +8429,59 @@ _bfd_mips_elf_hide_symbol (struct bfd_li +@@ -8422,6 +8429,8 @@ if (dynobj != NULL && force_local && h->root.type != STT_TLS) { got = mips_elf_got_section (dynobj, FALSE); -- g = mips_elf_section_data (got)->u.got_info; -- -- if (g->next) -- { -- struct mips_got_entry e; -- struct mips_got_info *gg = g; -- -- /* Since we're turning what used to be a global symbol into a -- local one, bump up the number of local entries of each GOT -- that had an entry for it. This will automatically decrease -- the number of global entries, since global_gotno is actually -- the upper limit of global entries. */ -- e.abfd = dynobj; -- e.symndx = -1; -- e.d.h = h; -- e.tls_type = 0; + if (got) + { -+ g = mips_elf_section_data (got)->u.got_info; + g = mips_elf_section_data (got)->u.got_info; -- for (g = g->next; g != gg; g = g->next) -- if (htab_find (g->got_entries, &e)) -- { -- BFD_ASSERT (g->global_gotno > 0); -- g->local_gotno++; -- g->global_gotno--; -- } -+ if (g->next) -+ { -+ struct mips_got_entry e; -+ struct mips_got_info *gg = g; - -- /* If this was a global symbol forced into the primary GOT, we -- no longer need an entry for it. We can't release the entry -- at this point, but we must at least stop counting it as one -- of the symbols that required a forced got entry. */ -- if (h->root.got.offset == 2) -- { -- BFD_ASSERT (gg->assigned_gotno > 0); -- gg->assigned_gotno--; -- } -- } -- else if (g->global_gotno == 0 && g->global_gotsym == NULL) -- /* If we haven't got through GOT allocation yet, just bump up the -- number of local entries, as this symbol won't be counted as -- global. */ -- g->local_gotno++; -- else if (h->root.got.offset == 1) -- { -- /* If we're past non-multi-GOT allocation and this symbol had -- been marked for a global got entry, give it a local entry -+ /* Since we're turning what used to be a global symbol into a -+ local one, bump up the number of local entries of each GOT -+ that had an entry for it. This will automatically decrease -+ the number of global entries, since global_gotno is actually -+ the upper limit of global entries. */ -+ e.abfd = dynobj; -+ e.symndx = -1; -+ e.d.h = h; -+ e.tls_type = 0; -+ -+ for (g = g->next; g != gg; g = g->next) -+ if (htab_find (g->got_entries, &e)) -+ { -+ BFD_ASSERT (g->global_gotno > 0); -+ g->local_gotno++; -+ g->global_gotno--; -+ } -+ -+ /* If this was a global symbol forced into the primary GOT, we -+ no longer need an entry for it. We can't release the entry -+ at this point, but we must at least stop counting it as one -+ of the symbols that required a forced got entry. */ -+ if (h->root.got.offset == 2) -+ { -+ BFD_ASSERT (gg->assigned_gotno > 0); -+ gg->assigned_gotno--; -+ } -+ } -+ else if (g->global_gotno == 0 && g->global_gotsym == NULL) -+ /* If we haven't got through GOT allocation yet, just bump up the -+ number of local entries, as this symbol won't be counted as -+ global. */ -+ g->local_gotno++; -+ else if (h->root.got.offset == 1) -+ { -+ /* If we're past non-multi-GOT allocation and this symbol had -+ been marked for a global got entry, give it a local entry - instead. */ -- BFD_ASSERT (g->global_gotno > 0); -- g->local_gotno++; -- g->global_gotno--; -+ BFD_ASSERT (g->global_gotno > 0); -+ g->local_gotno++; -+ g->global_gotno--; -+ } + if (g->next) +@@ -8472,6 +8481,7 @@ + g->global_gotno--; } -- } + } + } _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local); } -@@ -9641,6 +9651,7 @@ static const struct mips_mach_extension +@@ -9641,6 +9651,7 @@ /* MIPS II extensions. */ { bfd_mach_mips4000, bfd_mach_mips6000 }, { bfd_mach_mipsisa32, bfd_mach_mips6000 }, @@ -197,15 +90,41 @@ /* MIPS I extensions. */ { bfd_mach_mips6000, bfd_mach_mips3000 }, ---- binutils-2.16.1.orig/bfd/version.h 2005-10-22 15:36:25.000000000 -0700 -+++ binutils-psp/bfd/version.h 2005-10-22 15:42:13.000000000 -0700 +diff -burN binutils-2.16.1/bfd/Makefile.am binutils-psp/bfd/Makefile.am +--- binutils-2.16.1/bfd/Makefile.am 2005-06-12 19:58:52.000000000 +0100 ++++ binutils-psp/bfd/Makefile.am 2006-01-10 23:31:50.000000000 +0000 +@@ -3,7 +3,7 @@ + AUTOMAKE_OPTIONS = 1.9 cygnus + + # Uncomment the following line when doing a release. +-RELEASE=y ++#RELEASE=y + + INCDIR = $(srcdir)/../include + CSEARCH = -I. -I$(srcdir) -I$(INCDIR) +diff -burN binutils-2.16.1/bfd/Makefile.in binutils-psp/bfd/Makefile.in +--- binutils-2.16.1/bfd/Makefile.in 2005-06-12 19:58:55.000000000 +0100 ++++ binutils-psp/bfd/Makefile.in 2006-01-10 23:31:50.000000000 +0000 +@@ -250,7 +250,7 @@ + AUTOMAKE_OPTIONS = 1.9 cygnus + + # Uncomment the following line when doing a release. +-RELEASE=y ++#RELEASE=y + INCDIR = $(srcdir)/../include + CSEARCH = -I. -I$(srcdir) -I$(INCDIR) + MKDEP = gcc -MM +diff -burN binutils-2.16.1/bfd/version.h binutils-psp/bfd/version.h +--- binutils-2.16.1/bfd/version.h 2005-06-12 18:37:59.000000000 +0100 ++++ binutils-psp/bfd/version.h 2006-01-10 23:31:51.000000000 +0000 @@ -1,3 +1,3 @@ -#define BFD_VERSION_DATE 20050612 -+#define BFD_VERSION_DATE (PSPDEV 20051022) ++#define BFD_VERSION_DATE (PSPDEV 20060116) #define BFD_VERSION @bfd_version@ #define BFD_VERSION_STRING @bfd_version_string@ ---- binutils-2.16.1.orig/binutils/readelf.c 2005-04-20 11:43:36.000000000 -0700 -+++ binutils-psp/binutils/readelf.c 2005-06-19 18:09:27.000000000 -0700 +diff -burN binutils-2.16.1/binutils/readelf.c binutils-psp/binutils/readelf.c +--- binutils-2.16.1/binutils/readelf.c 2005-04-20 19:43:36.000000000 +0100 ++++ binutils-psp/binutils/readelf.c 2006-01-10 23:31:51.000000000 +0000 @@ -2043,6 +2043,7 @@ case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break; case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break; @@ -214,8 +133,9 @@ case 0: /* We simply ignore the field in this case to avoid confusion: MIPS ELF does not specify EF_MIPS_MACH, it is a GNU ---- binutils-2.16.1.orig/config.sub 2005-01-18 16:34:56.000000000 -0800 -+++ binutils-psp/config.sub 2005-06-24 17:01:46.000000000 -0700 +diff -burN binutils-2.16.1/config.sub binutils-psp/config.sub +--- binutils-2.16.1/config.sub 2005-01-19 00:34:56.000000000 +0000 ++++ binutils-psp/config.sub 2006-01-10 23:31:51.000000000 +0000 @@ -253,6 +253,7 @@ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ @@ -243,9 +163,43 @@ mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; ---- binutils-2.16.1.orig/gas/config/tc-mips.c 2005-10-22 15:36:25.000000000 -0700 -+++ binutils-psp/gas/config/tc-mips.c 2005-10-22 15:38:52.000000000 -0700 -@@ -365,11 +365,15 @@ +diff -burN binutils-2.16.1/gas/config/tc-mips.c binutils-psp/gas/config/tc-mips.c +--- binutils-2.16.1/gas/config/tc-mips.c 2005-06-12 19:07:03.000000000 +0100 ++++ binutils-psp/gas/config/tc-mips.c 2006-01-16 20:05:23.000000000 +0000 +@@ -92,6 +92,32 @@ + + #define ZERO 0 + #define AT 1 ++#define V0 2 ++#define V1 3 ++#define A0 4 ++#define A1 5 ++#define A2 6 ++#define A3 7 ++#define T0 8 ++#define T1 9 ++#define T2 10 ++#define T3 11 ++#define T4 12 ++#define T5 13 ++#define T6 14 ++#define T7 15 ++#define S0 16 ++#define S1 17 ++#define S2 18 ++#define S3 19 ++#define S4 20 ++#define S5 21 ++#define S6 22 ++#define S7 23 ++#define T8 24 ++#define T9 25 ++#define K0 26 ++#define K1 27 + #define TREG 24 + #define PIC_CALL_REG 25 + #define KT0 26 +@@ -365,11 +391,15 @@ #define CPU_HAS_MDMX(cpu) (FALSE \ ) @@ -262,7 +216,7 @@ /* True if mflo and mfhi can be immediately followed by instructions which write to the HI and LO registers. -@@ -393,6 +397,7 @@ +@@ -393,6 +423,7 @@ || mips_opts.arch == CPU_R12000 \ || mips_opts.arch == CPU_RM7000 \ || mips_opts.arch == CPU_VR5500 \ @@ -270,28 +224,32 @@ ) /* Whether the processor uses hardware interlocks to protect reads -@@ -1161,6 +1166,20 @@ - static segT pdr_seg; - #endif - -+/* Expressions saved for use in VFPU immediate mode macros. */ -+ +@@ -1142,6 +1173,8 @@ + static expressionS imm_expr; + static expressionS imm2_expr; + static expressionS offset_expr; +static expressionS vimm_expr[4]; +static expressionS voffset_expr[4]; -+ -+/* VFPU instruction prefixes to apply to the current VFPU instruction. */ -+ -+static int vfpu_has_dprefix; -+static int vfpu_has_sprefix; -+static int vfpu_has_tprefix; -+static char vfpu_dprefix_operands[64]; -+static char vfpu_sprefix_operands[64]; -+static char vfpu_tprefix_operands[64]; -+ - /* The default target format to use. */ - const char * -@@ -1641,6 +1660,58 @@ + /* Relocs associated with imm_expr and offset_expr. */ + +@@ -1150,6 +1183,15 @@ + static bfd_reloc_code_real_type offset_reloc[3] + = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED}; + ++/* set by vfpu code for prefix instructions */ ++ ++static bfd_boolean vfpu_dprefix; ++static char vfpu_dprefix_str[64]; ++static bfd_boolean vfpu_sprefix; ++static char vfpu_sprefix_str[64]; ++static bfd_boolean vfpu_tprefix; ++static char vfpu_tprefix_str[64]; ++ + /* These are set by mips16_ip if an explicit extension is used. */ + + static bfd_boolean mips16_small, mips16_ext; +@@ -1641,6 +1683,62 @@ return; } @@ -300,606 +258,1839 @@ + instruction it prefixes. Note that in mips_ip prefix operands do not + cause any side effects with imm_expr or offset_expr. If they did + we'd have to save and restore them here. */ -+ if (CPU_IS_ALLEGREX (mips_opts.arch) -+ && (vfpu_has_dprefix || vfpu_has_sprefix || vfpu_has_tprefix)) ++ if (CPU_IS_ALLEGREX (mips_opts.arch) && ((vfpu_dprefix || vfpu_sprefix || vfpu_tprefix))) + { -+ if (mips_opts.noreorder && -+ (history[0].insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY -+ | INSN_COND_BRANCH_DELAY -+ | INSN_COND_BRANCH_LIKELY))) -+ as_bad (_("VFPU instruction with prefix can't be used in a branch delay slot")); + -+ if (vfpu_has_dprefix) -+ { -+ struct mips_cl_insn dprefix_insn; -+ bfd_reloc_code_real_type dprefix_unused_reloc[3] ++ if (mips_opts.noreorder ++ && ( history[0].insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY ++ | INSN_COND_BRANCH_DELAY ++ | INSN_COND_BRANCH_LIKELY))) ++ { ++ as_bad (_("instruction with prefix cannot be used in branch delay slot")); ++ } ++ ++ if (vfpu_dprefix) ++ { ++ struct mips_cl_insn prefix; ++ bfd_reloc_code_real_type unused_reloc[3] + = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED}; -+ char dprefix_str[80]; ++ char buf[256]; + -+ sprintf (dprefix_str, "vpfxd %s", vfpu_dprefix_operands); -+ mips_ip (str, &dprefix_insn); -+ append_insn (&dprefix_insn, NULL, dprefix_unused_reloc); -+ vfpu_has_dprefix = 0; -+ } -+ if (vfpu_has_sprefix) -+ { -+ struct mips_cl_insn sprefix_insn; -+ bfd_reloc_code_real_type sprefix_unused_reloc[3] ++ sprintf (buf, "vpfxd %s", vfpu_dprefix_str); ++ mips_ip (buf, &prefix); ++ append_insn (&prefix, NULL, unused_reloc); ++ vfpu_dprefix = FALSE; ++ } ++ ++ if (vfpu_sprefix) ++ { ++ struct mips_cl_insn prefix; ++ bfd_reloc_code_real_type unused_reloc[3] + = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED}; -+ char sprefix_str[80]; ++ char buf[256]; + -+ sprintf (sprefix_str, "vpfxs %s", vfpu_sprefix_operands); -+ mips_ip (str, &sprefix_insn); -+ append_insn (&sprefix_insn, NULL, sprefix_unused_reloc); -+ vfpu_has_sprefix = 0; -+ } -+ if (vfpu_has_tprefix) -+ { -+ struct mips_cl_insn tprefix_insn; -+ bfd_reloc_code_real_type tprefix_unused_reloc[3] ++ sprintf (buf, "vpfxs %s", vfpu_sprefix_str); ++ mips_ip (buf, &prefix); ++ append_insn ( &prefix, NULL, unused_reloc); ++ vfpu_sprefix = FALSE; ++ } ++ ++ if (vfpu_tprefix) ++ { ++ struct mips_cl_insn prefix; ++ bfd_reloc_code_real_type unused_reloc[3] + = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED}; -+ char tprefix_str[80]; ++ char buf[256]; + -+ sprintf (tprefix_str, "vpfxt %s", vfpu_tprefix_operands); -+ mips_ip (str, &tprefix_insn); -+ append_insn (&tprefix_insn, NULL, tprefix_unused_reloc); -+ vfpu_has_tprefix = 0; -+ } ++ sprintf (buf, "vpfxt %s", vfpu_tprefix_str); ++ mips_ip (buf, &prefix); ++ append_insn (&prefix, NULL, unused_reloc); ++ vfpu_tprefix = FALSE; ++ } + } + if (insn.insn_mo->pinfo == INSN_MACRO) { macro_start (); -@@ -7817,6 +7888,30 @@ +@@ -3128,6 +3226,55 @@ + insn.insn_opcode |= va_arg (args, unsigned long); + continue; + ++ /* VFPU fields */ ++ case '?': ++ switch (*fmt++) ++ { ++ case 'o': ++ *r = (bfd_reloc_code_real_type) va_arg (args, int); ++ assert (*r == BFD_RELOC_GPREL16 ++ || *r == BFD_RELOC_MIPS_LITERAL ++ || *r == BFD_RELOC_MIPS_HIGHER ++ || *r == BFD_RELOC_HI16_S ++ || *r == BFD_RELOC_LO16 ++ || *r == BFD_RELOC_MIPS_GOT16 ++ || *r == BFD_RELOC_MIPS_CALL16 ++ || *r == BFD_RELOC_MIPS_GOT_DISP ++ || *r == BFD_RELOC_MIPS_GOT_PAGE ++ || *r == BFD_RELOC_MIPS_GOT_OFST ++ || *r == BFD_RELOC_MIPS_GOT_LO16 ++ || *r == BFD_RELOC_MIPS_CALL_LO16); ++ break; ++ case 'd': ++ insn.insn_opcode |= va_arg (args, int) << VF_SH_VD; ++ fmt += 2; ++ break; ++ case 's': ++ insn.insn_opcode |= va_arg (args, int) << VF_SH_VS; ++ fmt += 2; ++ break; ++ case 'm': ++ { ++ int vtreg = va_arg (args, int); ++ insn.insn_opcode |= (vtreg & VF_MASK_VML) << VF_SH_VML; ++ insn.insn_opcode |= ((vtreg >> 5) & VF_MASK_VMH) << VF_SH_VMH; ++ fmt += 2; ++ } ++ break; ++ case 'n': ++ { ++ int vtreg = va_arg (args, int); ++ insn.insn_opcode |= (vtreg & VF_MASK_VNL) << VF_SH_VNL; ++ insn.insn_opcode |= ((vtreg >> 5) & VF_MASK_VNH) << VF_SH_VNH; ++ fmt += 2; ++ } ++ break; ++ case 'e': ++ insn.insn_opcode |= va_arg (args, int) << VF_SH_MCOND; ++ break; ++ } ++ continue; ++ + default: + internalError (); + } +@@ -4103,6 +4250,7 @@ + macro (struct mips_cl_insn *ip) + { + register int treg, sreg, dreg, breg; ++ int vsreg, vtreg, vdreg, vmreg, vwb; + int tempreg; + int mask; + int used_at = 0; +@@ -4128,6 +4276,13 @@ + sreg = breg = (ip->insn_opcode >> 21) & 0x1f; + mask = ip->insn_mo->mask; + ++ vmreg = ((ip->insn_opcode >> 16) & 0x1f) ++ | ((ip->insn_opcode << 5) & 0x60); ++ vtreg = (ip->insn_opcode >> 16) & 0x7f; ++ vsreg = (ip->insn_opcode >> 8) & 0x7f; ++ vdreg = (ip->insn_opcode >> 0) & 0x7f; ++ vwb = (ip->insn_opcode >> 1) & 0x1; ++ + expr1.X_op = O_constant; + expr1.X_op_symbol = NULL; + expr1.X_add_symbol = NULL; +@@ -5654,6 +5809,26 @@ + /* Itbl support may require additional care here. */ + coproc = 1; + goto ld; ++ case M_LV_S_AB: ++ s = "lv.s"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto ld; ++ case M_LV_Q_AB: ++ s = "lv.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto ld; ++ case M_LVL_Q_AB: ++ s = "lvl.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto ld; ++ case M_LVR_Q_AB: ++ s = "lvr.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto ld; + case M_LWL_AB: + s = "lwl"; + lr = 1; +@@ -5738,6 +5913,29 @@ + /* Itbl support may require additional care here. */ + coproc = 1; + goto st; ++ case M_SV_S_AB: ++ s = "sv.s"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto st; ++ case M_SV_Q_AB: ++ if (vwb) ++ s = "vwb.q"; ++ else ++ s = "sv.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto st; ++ case M_SVL_Q_AB: ++ s = "svl.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto st; ++ case M_SVR_Q_AB: ++ s = "svr.q"; ++ /* Itbl support may require additional care here. */ ++ coproc = 1; ++ goto st; + case M_SWL_AB: + s = "swl"; + goto st; +@@ -5787,6 +5985,22 @@ + || mask == M_L_DAB + || mask == M_S_DAB) + fmt = "T,o(b)"; ++ else if (mask == M_LV_S_AB ++ || mask == M_SV_S_AB) ++ { ++ fmt = "?m0x,?o(b)"; ++ treg = vmreg; ++ } ++ else if (mask == M_LV_Q_AB ++ || mask == M_SV_Q_AB ++ || mask == M_LVL_Q_AB ++ || mask == M_LVR_Q_AB ++ || mask == M_SVL_Q_AB ++ || mask == M_SVR_Q_AB) ++ { ++ fmt = "?n3x,?o(b)"; ++ treg = vmreg; ++ } + else if (coproc) + fmt = "E,o(b)"; + else +@@ -6150,6 +6364,138 @@ + break; + } + ++ case M_LVI_S_SS: ++ case M_LVI_P_SS: ++ case M_LVI_T_SS: ++ case M_LVI_Q_SS: ++ { ++ int mtx = (vtreg >> VF_SH_MR_MTX) & VF_MASK_MR_MTX; ++ int idx = (vtreg >> VF_SH_MR_IDX) & VF_MASK_MR_IDX; ++ int fsl = 0; ++ int rxc = 0; ++ int vtreg_s = 0; ++ int vnum = 0; ++ int vat = 0; ++ int i; ++ ++ switch (mask) ++ { ++ case M_LVI_S_SS: ++ vnum = 1; ++ fsl = (vtreg >> VF_SH_MR_FSL) & VF_MASK_MR_FSL; ++ rxc = 0; ++ break; ++ case M_LVI_P_SS: ++ vnum = 2; ++ fsl = ((vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL) << 1; ++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ break; ++ case M_LVI_T_SS: ++ vnum = 3; ++ fsl = (vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL; ++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ break; ++ case M_LVI_Q_SS: ++ vnum = 4; ++ fsl = 0; ++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ break; ++ } ++ if (rxc) ++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_FSL) ++ | (fsl << VF_SH_MR_IDX); ++ else ++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_IDX) ++ | (fsl << VF_SH_MR_FSL); ++ ++ for (i = 0; i < vnum; i++) { ++ imm_expr = vimm_expr[i]; ++ offset_expr = voffset_expr[i]; ++ ++ if (imm_expr.X_op == O_constant) ++ { ++ load_register (AT, &imm_expr, 0); ++ macro_build ((expressionS *) NULL, ++ "mtv", "t,?d0z", AT, vtreg_s); ++ vat = 1; ++ } ++ else ++ { ++ assert (offset_expr.X_op == O_symbol ++ && strcmp (segment_name (S_GET_SEGMENT ++ (offset_expr.X_add_symbol)), ++ ".lit4") == 0 ++ && offset_expr.X_add_number == 0); ++ macro_build (&offset_expr, ++ "lv.s", "?m0x,?o(b)", vtreg_s, ++ (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register); ++ } ++ ++ if (rxc) ++ vtreg_s += (1 << VF_SH_MR_IDX); ++ else ++ vtreg_s += (1 << VF_SH_MR_FSL); ++ } ++ ++ if (vat) ++ break; ++ else ++ return; ++ } ++ ++ case M_LVHI_S_SS: ++ case M_LVHI_P_SS: ++ { ++ int mtx = (vtreg >> VF_SH_MR_MTX) & VF_MASK_MR_MTX; ++ int idx = (vtreg >> VF_SH_MR_IDX) & VF_MASK_MR_IDX; ++ int fsl = 0; ++ int rxc = 0; ++ int vtreg_s = 0; ++ int vnum = 0; ++ int i; ++ unsigned int f16v; ++ char f16v_str[16]; ++ ++ switch (mask) ++ { ++ case M_LVHI_S_SS: ++ vnum = 2; ++ fsl = (vtreg >> VF_SH_MR_FSL) & VF_MASK_MR_FSL; ++ rxc = 0; ++ break; ++ case M_LVHI_P_SS: ++ vnum = 4; ++ fsl = ((vtreg >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL) << 1; ++ rxc = (vtreg >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ break; ++ } ++ if (rxc) ++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_FSL) ++ | (fsl << VF_SH_MR_IDX); ++ else ++ vtreg_s = (mtx << VF_SH_MR_MTX) | (idx << VF_SH_MR_IDX) ++ | (fsl << VF_SH_MR_FSL); ++ ++ ++ for (i = 0; i < vnum; i += 2) { ++ f16v = ((vimm_expr[i + 1].X_add_number & 0xffff) << 16) ++ | (vimm_expr[i].X_add_number & 0xffff); ++ sprintf(f16v_str, "0x%08x", f16v); ++ my_getExpression (&imm_expr, f16v_str); ++ ++ load_register (AT, &imm_expr, 0); ++ macro_build ((expressionS *) NULL, ++ "mtv", "t,?d0z", AT, vtreg_s); ++ ++ if (rxc) ++ vtreg_s += (1 << VF_SH_MR_IDX); ++ else ++ vtreg_s += (1 << VF_SH_MR_FSL); ++ } ++ ++ break; ++ } ++ + case M_LI_D: + /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits + wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high +@@ -6672,6 +7018,27 @@ + move_register (dreg, sreg); + break; + ++ case M_VCMOV_S: ++ s = "vcmovt.s"; ++ fmt = "?d0d,?s0s,?e"; ++ goto vcmov; ++ case M_VCMOV_P: ++ s = "vcmovt.p"; ++ fmt = "?d1d,?s1s,?e"; ++ goto vcmov; ++ case M_VCMOV_T: ++ s = "vcmovt.t"; ++ fmt = "?d2d,?s2s,?e"; ++ goto vcmov; ++ case M_VCMOV_Q: ++ s = "vcmovt.q"; ++ fmt = "?d3d,?s3s,?e"; ++ vcmov: ++ macro_build ((expressionS *) NULL, s, fmt, ++ vdreg, vsreg, ++ (ip->insn_opcode >> VF_SH_MCOND) & VF_MASK_MCOND); ++ return; ++ + #ifdef LOSING_COMPILER + default: + /* Try and see if this is a new itbl instruction. +@@ -7348,6 +7715,39 @@ + move_register (treg, tempreg); + break; + ++ case M_ULV_S: ++ if (mips_opts.arch == CPU_ALLEGREX) ++ as_bad (_("opcode not supported on this processor")); ++ off = 3; ++ if (offset_expr.X_add_number >= 0x8000 - off) ++ as_bad (_("operand overflow")); ++ if (! target_big_endian) ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "lwl", "t,o(b)", ++ AT, (int) BFD_RELOC_LO16, breg); ++ if (! target_big_endian) ++ offset_expr.X_add_number -= off; ++ else ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "lwr", "t,o(b)", ++ AT, (int) BFD_RELOC_LO16, breg); ++ ++ macro_build ((expressionS *) NULL, "mtv", "t,?d0z", ++ AT, vmreg); ++ break; ++ ++ case M_ULV_Q: ++ off = 12; ++ if (offset_expr.X_add_number >= 0x8000 - off) ++ as_bad (_("operand overflow")); ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "lvl.q", "?n3x,?o(b)", ++ vmreg, (int) BFD_RELOC_LO16, breg); ++ offset_expr.X_add_number -= off; ++ macro_build (&offset_expr, "lvr.q", "?n3x,?o(b)", ++ vmreg, (int) BFD_RELOC_LO16, breg); ++ return; ++ + case M_ULD_A: + s = "ldl"; + s2 = "ldr"; +@@ -7430,6 +7830,55 @@ + macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg); + break; + ++ case M_USV_S: ++ off = 3; ++ if (offset_expr.X_add_number >= 0x8000 - off) ++ as_bad (_("operand overflow")); ++ macro_build ((expressionS *) NULL, "mfv", "t,?d0z", ++ AT, vmreg); ++ if (mips_opts.arch != CPU_ALLEGREX) ++ { ++ if (! target_big_endian) ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "swl", "t,o(b)", ++ AT, (int) BFD_RELOC_LO16, breg); ++ if (! target_big_endian) ++ offset_expr.X_add_number -= off; ++ else ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "swr", "t,o(b)", ++ AT, (int) BFD_RELOC_LO16, breg); ++ } ++ else ++ { ++ if (target_big_endian) ++ offset_expr.X_add_number += off; ++ while (off-- >= 0) ++ { ++ macro_build (&offset_expr, "sb", "t,o(b)", ++ AT, (int) BFD_RELOC_LO16, breg); ++ macro_build ((expressionS *) NULL, "ror", ++ "d,w,<", AT, AT, 8); ++ if (target_big_endian) ++ --offset_expr.X_add_number; ++ else ++ ++offset_expr.X_add_number; ++ } ++ } ++ break; ++ ++ case M_USV_Q: ++ off = 12; ++ if (offset_expr.X_add_number >= 0x8000 - off) ++ as_bad (_("operand overflow")); ++ offset_expr.X_add_number += off; ++ macro_build (&offset_expr, "svl.q", "?n3x,?o(b)", ++ vmreg, (int) BFD_RELOC_LO16, breg); ++ offset_expr.X_add_number -= off; ++ macro_build (&offset_expr, "svr.q", "?n3x,?o(b)", ++ vmreg, (int) BFD_RELOC_LO16, breg); ++ return; ++ + case M_USD_A: + s = "sdl"; + s2 = "sdr"; +@@ -7817,6 +8266,103 @@ case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break; case '[': break; case ']': break; ++ ++ /* VFPU fields */ + case '?': -+ /* MRB TODO: Fix this for the VFPU extensions. */ + switch (c = *p++) + { -+ case 'f': -+ /* MRB HACK: Skip the next character. */ -+ p++; ++ case '[': break; ++ case ']': break; ++ case 'y': ++ { ++ if ((*p != '0') && (*p != '1') && (*p != '2') && (*p != '3')) ++ { ++ as_bad (_("internal: bad mips opcode : %s %s"), ++ opc->name, opc->args); ++ return 0; ++ } ++ p++; ++ } + break; -+ case 'd': -+ case 'm': -+ case 'n': ++ ++ case 'o': USE_BITS (VF_MASK_OFFSET, VF_SH_OFFSET); break; ++ + case 's': + case 't': ++ case 'd': + case 'v': + case 'x': -+ /* MRB HACK: Skip the next two characters. */ -+ p++; -+ p++; ++ case 'm': ++ case 'n': ++ { ++ if ((*p != '0') && (*p != '1') && (*p != '2') && (*p != '3') ++ && (*p != '5') && (*p != '6') && (*p != '7')) ++ { ++ as_bad (_("internal: bad mips opcode (vreg type `?%c'): %s %s"), ++ *p, opc->name, opc->args); ++ return 0; ++ } ++ p++; ++ ++ if ((*p != 's') && (*p != 't') && (*p != 'd') ++ && (*p != 'y') && (*p != 'x') && (*p != 'z') ++ && (*p != 'w') && (*p != 'm')) ++ { ++ as_bad (_("internal: bad mips opcode (vreg type `?%c'): %s %s"), ++ *(p - 1), opc->name, opc->args); ++ } ++ p++; ++ ++ switch (c) ++ { ++ case 's': USE_BITS (VF_MASK_VS, VF_SH_VS); break; ++ case 't': USE_BITS (VF_MASK_VT, VF_SH_VT); break; ++ case 'd': ++ case 'v': ++ case 'x': USE_BITS (VF_MASK_VD, VF_SH_VD); break; ++ case 'm': USE_BITS (VF_MASK_VML, VF_SH_VML); ++ USE_BITS (VF_MASK_VMH, VF_SH_VMH); break; ++ case 'n': USE_BITS (VF_MASK_VNL, VF_SH_VNL); ++ USE_BITS (VF_MASK_VNH, VF_SH_VNH); break; ++ } ++ } + break; -+ default: break; ++ ++ case 'f': USE_BITS (VF_MASK_CC, VF_SH_CC); ++ p++; break; ++ ++ case 'a': USE_BITS (VF_MASK_CONST, VF_SH_CONST); break; ++ case 'b': USE_BITS (VF_MASK_SCALE, VF_SH_SCALE); break; ++ case 'c': USE_BITS (VF_MASK_BCOND, VF_SH_BCOND); break; ++ case 'e': USE_BITS (VF_MASK_MCOND, VF_SH_MCOND); break; ++ ++ case 'i': USE_BITS (VF_MASK_WRAP, VF_SH_WRAP); break; ++ ++ case 'q': USE_BITS (VF_MASK_VCD, VF_SH_VCD); break; ++ case 'r': USE_BITS (VF_MASK_VCS, VF_SH_VCS); break; ++ ++ case 'u': USE_BITS (VF_MASK_HFLOAT, VF_SH_HFLOAT); break; ++ ++ case 'w': USE_BITS (VF_MASK_ROT, VF_SH_ROT); break; ++ case 'z': USE_BITS (VF_MASK_RWB, VF_SH_RWB); break; ++ ++ case '0': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '1': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '2': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '3': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '4': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '5': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '6': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ case '7': USE_BITS (VF_MASK_PFX, VF_SH_PFX); break; ++ ++ default: ++ as_bad (_("internal: bad mips opcode (unknown extension operand type `?%c'): %s %s"), ++ c, opc->name, opc->args); ++ return 0; ++ + } -+ /* MRB HACK: Set all used bits. */ -+ used_bits = 0xffffffff; + break; ++ default: as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"), c, opc->name, opc->args); -@@ -8125,6 +8220,517 @@ - } - break; +@@ -7845,12 +8391,15 @@ + char c = 0; + struct mips_opcode *insn; + char *argsStart; +- unsigned int regno; ++ unsigned int regno = 0; + unsigned int lastregno = 0; + unsigned int lastpos = 0; + unsigned int limlo, limhi; + char *s_reset; + char save_c = 0; ++ unsigned int vdregno = 0xffff; ++ char vdregt = 0; ++ char vdregl = 0; -+ case '?': /* VFPU extension character. */ -+ switch (*++args) -+ { -+ case '[': /* these must match exactly */ -+ case ']': -+ if (*s++ == *args) + insn_error = NULL; + +@@ -8238,26 +8787,1171 @@ + s = expr_end; + continue; + +- case 'b': /* base register */ +- case 'd': /* destination register */ +- case 's': /* source register */ +- case 't': /* target register */ +- case 'r': /* both target and source */ +- case 'v': /* both dest and source */ +- case 'w': /* both dest and target */ +- case 'E': /* coprocessor target register */ +- case 'G': /* coprocessor destination register */ +- case 'K': /* 'rdhwr' destination register */ +- case 'x': /* ignore register name */ +- case 'z': /* must be zero register */ +- case 'U': /* destination register (clo/clz). */ +- s_reset = s; +- if (s[0] == '$') ++ /* VFPU fields */ ++ case '?': ++ switch (*++args) + { ++ case '[': ++ case ']': ++ if (*s++ == *args) ++ continue; ++ break; + +- if (ISDIGIT (s[1])) +- { +- ++s; ++ case 'y': /* immediate separator */ ++ ++args; ++ vimm_expr[*args - '0'] = imm_expr; ++ voffset_expr[*args - '0'] = offset_expr; ++ ++ imm_expr.X_op = O_absent; ++ offset_expr.X_op = O_absent; ++ imm_reloc[0] = BFD_RELOC_UNUSED; ++ imm_reloc[1] = BFD_RELOC_UNUSED; ++ imm_reloc[2] = BFD_RELOC_UNUSED; ++ offset_reloc[0] = BFD_RELOC_UNUSED; ++ offset_reloc[1] = BFD_RELOC_UNUSED; ++ offset_reloc[2] = BFD_RELOC_UNUSED; ++ ++ continue; ++ ++ case 'o': /* 16 bit offset */ ++ /* Check whether there is only a single bracketed expression ++ left. If so, it must be the base register and the ++ constant must be zero. */ ++ if (*s == '(' && strchr (s + 1, '(') == 0) ++ { ++ offset_expr.X_op = O_constant; ++ offset_expr.X_add_number = 0; + continue; ++ } ++ ++ /* If this value won't fit into a 16 bit offset, then go ++ find a macro that will generate the 32 bit offset ++ code pattern. */ ++ if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0 ++ && (offset_expr.X_op != O_constant ++ || offset_expr.X_add_number >= 0x8000 ++ || offset_expr.X_add_number < -0x8000)) + break; + -+ case '0': /* Source or target prefix. */ -+ case '1': -+ case '2': -+ case '3': -+ { -+ char *orig_s = s; -+ int pos = *args - '0'; -+ int negation = 0; -+ int is_constant = 0; -+ int abs_consthi = 0; -+ int swz_constlo = 0; -+ int constant_code = 0; -+ int bad_format = 0; -+ unsigned int operand; ++ s = expr_end; ++ continue; + -+ if (*s == '-') -+ { -+ negation = 1; -+ ++s; -+ } -+ if (ISDIGIT (*s)) -+ { -+ is_constant = 1; -+ if (*s == '0') -+ constant_code = 0; -+ else if (*s == '1') -+ { -+ if (s[1] == '/') -+ { -+ s += 2; -+ if (*s == '2') -+ constant_code = 3; -+ else if (*s == '3') -+ constant_code = 5; -+ else if (*s == '4') -+ constant_code = 6; -+ else if (*s == '6') -+ constant_code = 7; -+ else -+ bad_format = 1; -+ } -+ else -+ constant_code = 1; -+ } -+ else if (*s == '2') -+ constant_code = 2; -+ else if (*s == '3') -+ constant_code = 4; -+ else -+ bad_format = 1; ++ case 's': /* VFPU source register */ ++ case 't': /* VFPU target register */ ++ case 'd': /* VFPU destination register */ ++ case 'v': /* VFPU destination register */ ++ case 'x': /* VFPU destination register */ ++ case 'm': /* VFPU target regsiter (load/store) */ ++ case 'n': /* VFPU target regsiter (load/store) */ ++ { ++ int dtype_err = 0; ++ int dnum_err = 0; ++ int dlen = 0; ++ char dtype = s[0]; ++ char regtype = *(args + 1); + -+ /* Bits 0-1 of the constant code are stored in the -+ SWZ/CST[1:0] field, and bit 2 is stored in the -+ ABS/CST[2] field. */ -+ swz_constlo = constant_code & VFPU_MASK_PFX_SWZ_CSTLO; -+ abs_consthi = constant_code >> 2; -+ } -+ else -+ { -+ if (*s == '|') -+ { -+ abs_consthi = 1; -+ ++s; -+ } -+ if (*s == 'x' || *s == 'X') -+ { -+ swz_constlo = 0; -+ ++s; -+ } -+ else if (*s == 'y' || *s == 'Y') -+ { -+ swz_constlo = 1; -+ ++s; -+ } -+ else if (*s == 'z' || *s == 'Z') -+ { -+ swz_constlo = 2; -+ ++s; -+ } -+ else if (*s == 'w' || *s == 'W') -+ { -+ swz_constlo = 3; -+ ++s; -+ } -+ else if (*s != ',' && *s != '|' -+ && ! IS_SPACE_OR_NUL (*s)) -+ bad_format = 1; -+ if (! bad_format) -+ { -+ /* Make sure the abs value was written properly. */ -+ if (*s == '|') -+ { -+ ++s; -+ if (! abs_consthi) -+ bad_format = 1; -+ } -+ else if (abs_consthi) -+ bad_format = 1; -+ } -+ } ++ int mtx = 0; ++ int idx = 0; ++ int rxc = 0; ++ int fsl = 0; ++ int vidx = 0; ++ int vfsl = 0; + -+ if (bad_format -+ || (*s != ',' && ! IS_SPACE_OR_NUL (*s))) -+ as_bad (_("Invalid prefix format (%s)"), orig_s); -+ -+ /* The bit positions of each field vary depending on the -+ position of our operand. We can't use INSERT_OPERAND() -+ as it would mask out the values set by other operands. */ -+ operand = (((negation & VFPU_MASK_PFX_NEG) -+ << (VFPU_SH_PFX_NEG + pos)) -+ || ((is_constant & VFPU_MASK_PFX_CST) -+ << (VFPU_SH_PFX_CST + pos)) -+ || ((abs_consthi & VFPU_MASK_PFX_ABS_CSTHI) -+ << (VFPU_SH_PFX_ABS_CSTHI + pos)) -+ || ((swz_constlo & VFPU_MASK_PFX_SWZ_CSTLO) -+ << (VFPU_SH_PFX_SWZ_CSTLO + pos * 2))); -+ ip->insn_opcode |= operand; -+ } -+ continue; -+ -+ case '4': /* Destination prefix. */ -+ case '5': -+ case '6': -+ case '7': -+ { -+ char *orig_s = s; -+ int mask = 0; -+ int saturation = 0; -+ int pos = *args - '4'; -+ unsigned int operand; -+ -+ if (*s == '[') -+ ++s; -+ if (*s == '-') -+ ++s; -+ if (*s == 'm' || *s == 'M') -+ { -+ mask = 1; -+ ++s; -+ } -+ else if (*s == '0') -+ { -+ saturation = 1; -+ ++s; -+ } -+ else if (*s == '1') -+ { -+ saturation = 3; -+ ++s; -+ } -+ if (*s == ':') -+ { -+ ++s; -+ if (*s == '+') -+ ++s; -+ if (*s == '1') -+ ++s; -+ } -+ if (*s == ']') -+ ++s; -+ if (*s != ',' && ! IS_SPACE_OR_NUL (*s)) -+ as_bad (_("Invalid prefix format (%s)"), orig_s); -+ -+ /* The position of the stored mask and saturation code -+ depend on the position of the prefix operand. Because -+ the bits aren't consecutive, we have to be careful to -+ insert them without masking out any other operands. */ -+ operand = (((mask & VFPU_MASK_PFX_MASK) -+ << (VFPU_SH_PFX_MASK + pos)) -+ || ((saturation & VFPU_MASK_PFX_SAT) -+ << (VFPU_SH_PFX_SAT + pos * 2))); -+ ip->insn_opcode |= operand; -+ } -+ continue; -+ -+ case 'a': /* Constant. */ -+ { -+ static const char * const vfpu_const_names[20] = { -+ "", "VFPU_HUGE", "VFPU_SQRT2", "VFPU_SQRT1_2", -+ "VFPU_2_SQRTPI", "VFPU_2_PI", "VFPU_1_PI", "VFPU_PI_4", -+ "VFPU_PI_2", "VFPU_PI", "VFPU_E", "VFPU_LOG2E", -+ "VFPU_LOG10E", "VFPU_LN2", "VFPU_LN10", "VFPU_2PI", -+ "VFPU_PI_6", "VFPU_LOG10TWO", "VFPU_LOG2TEN", "VFPU_SQRT3_2" -+ }; -+ const int vfpu_num_constants = ARRAY_SIZE (vfpu_const_names) - 1; -+ int i; -+ -+ if (!ISDIGIT (*s)) -+ { -+ /* Try to match one of the predefined constants. */ -+ for (i = 1; i <= vfpu_num_constants; i++) -+ if (!strcasecmp (s, vfpu_const_names[i])) -+ break; -+ if (i <= vfpu_num_constants) -+ s += strlen (vfpu_const_names[i]); -+ else -+ as_bad (_("Invalid constant code (%s)"), s); -+ INSERT_OPERAND (VFPU_CONST, *ip, i); -+ } -+ else -+ { -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if (imm_expr.X_add_number == 0 -+ || imm_expr.X_add_number > vfpu_num_constants) -+ as_bad (_("Improper constant code (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_CONST, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ } -+ } -+ continue; -+ -+ case 'b': -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 31) -+ as_bad (_("Improper scale (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_IMM5, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ continue; -+ -+ case 'c': /* Condition code bit. */ -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 5) -+ as_bad (_("Improper condition bit (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_CC, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ continue; -+ -+ case 'e': /* Condition code bit for conditional moves. */ -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 6) -+ as_bad (_("Improper condition bit (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_IMM3, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ continue; -+ -+ case 'f': /* Condition code. */ -+ { -+ static const char * const vfpu_cond_names[16] = { -+ "FL", "EQ", "LT", "LE", "TR", "NE", "GE", "GT", -+ "EZ", "EN", "EI", "ES", "NZ", "NN", "NI", "NS" -+ }; -+ unsigned long cond; -+ int i, arg_count; -+ -+ if (!ISDIGIT (*s)) -+ { -+ for (i = 0; i < VFPU_NUM_CONDS; i++) -+ if (!strncasecmp (s, vfpu_cond_names[i], 2)) -+ break; -+ if (i < VFPU_NUM_CONDS) -+ s += 2; -+ else -+ as_bad (_("Invalid VFPU condition code (%s)"), s); -+ cond = i; -+ } -+ else -+ { -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ cond = imm_expr.X_add_number; -+ if (cond >= VFPU_NUM_CONDS) -+ as_bad (_("Invalid VFPU condition code (%lu)"), cond); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ } -+ -+ /* Verify that the right number of arguments were passed -+ for the selected condition code. */ -+ arg_count = *++args - '0'; -+ if (cond != VFPU_COND_FL && cond != VFPU_COND_TR -+ && ((cond >= VFPU_COND_EZ && arg_count < 1) -+ || (arg_count <= 1))) -+ as_bad (_("Invalid VFPU condition operation")); -+ INSERT_OPERAND (VFPU_COND, *ip, cond); -+ } -+ continue; -+ -+ case 'i': /* Wrap. */ -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 255) -+ as_bad (_("Improper wrap (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_IMM8, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ continue; -+ -+ case 'o': /* VFPU 16-bit offset. */ -+ /* Check whether there is only a single bracketed expression -+ left. If so, it must be the base register and the -+ constant must be zero. */ -+ if (*s == '(' && strchr (s + 1, '(') == 0) ++ if (ISDIGIT (s[1])) + { -+ offset_expr.X_op = O_constant; -+ offset_expr.X_add_number = 0; -+ continue; ++ int num = 0; ++ s++; ++ do ++ { ++ num *= 10; ++ num += *s - '0'; ++ dlen++; ++ s++; ++ } ++ while (ISDIGIT (*s)); ++ ++ if ((s[0] == '.') ++ && (s[1] == 's' || s[1] == 'p' ++ || s[1] == 't' || s[1] == 'q')) ++ s += 2; ++ ++ if (ISUPPER(dtype)) ++ dtype -= 'A' - 'a'; ++ ++ if (dtype == '$') ++ { ++ regno = num; ++ if (regno > VF_MAX_MR) ++ as_bad (_("Invalid VFPU register number (%d)"), ++ regno); ++ ++ idx = (num >> VF_SH_MR_IDX) & VF_MASK_MR_IDX; ++ vfsl = (num >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL; ++ switch (regtype) ++ { ++ case '0': /* single word */ ++ break; ++ case '1': /* pare word */ ++ dnum_err = (vfsl & 0x1); ++ break; ++ case '2': /* triple word */ ++ dnum_err = (vfsl > 1); ++ break; ++ case '3': /* quad word */ ++ dnum_err = (vfsl > 0); ++ break; ++ case '5': /* 2x2 word */ ++ dnum_err = (vfsl & 0x1) || (idx & 0x1); ++ break; ++ case '6': /* 3x3 word */ ++ dnum_err = (vfsl > 1) || (idx > 1); ++ break; ++ case '7': /* 4x4 word */ ++ dnum_err = (vfsl > 0) || (idx > 0); ++ break; ++ } ++ ++ if (dnum_err) ++ as_bad (_("Improper VFPU register number (%d)"), ++ regno); ++ ++ } ++ else if ((dlen == 3) ++ && ((dtype == 's') ++ || (dtype == 'c') || (dtype == 'r') ++ || (dtype == 'm') || (dtype == 'e'))) ++ { ++ mtx = num / 100; ++ if ((dtype == 'r') || (dtype == 'e')) ++ { ++ vfsl = (num / 10) % 10; ++ vidx = num % 10; ++ rxc = 1; ++ } ++ else ++ { ++ vidx = (num / 10) % 10; ++ vfsl = num % 10; ++ rxc = 0; ++ } ++ ++ switch (regtype) ++ { ++ case '0': /* single word */ ++ idx = vidx; ++ fsl = vfsl; ++ dtype_err = (dtype != 's'); ++ break; ++ case '1': /* pare word */ ++ idx = vidx; ++ fsl = (vfsl & 0x2) | rxc; ++ dnum_err = (vfsl & 0x1); ++ dtype_err = (dtype != 'c') && (dtype != 'r'); ++ break; ++ case '2': /* triple word */ ++ idx = vidx; ++ fsl = ((vfsl & 0x1) << 1) | rxc; ++ dnum_err = (vfsl > 1); ++ dtype_err = (dtype != 'c') && (dtype != 'r'); ++ break; ++ case '3': /* quad word */ ++ idx = vidx; ++ fsl = rxc; ++ dnum_err = (vfsl > 0); ++ dtype_err = (dtype != 'c') && (dtype != 'r'); ++ break; ++ case '5': /* 2x2 word */ ++ idx = vidx & 0x2; ++ fsl = (vfsl & 0x2) | rxc; ++ dnum_err = (vfsl & 0x1) || (vidx & 0x1); ++ dtype_err = (dtype != 'm') && (dtype != 'e'); ++ break; ++ case '6': /* 3x3 word */ ++ idx = vidx & 0x1; ++ fsl = ((vfsl & 0x1) << 1) | rxc; ++ dnum_err = (vfsl > 1) || (vidx > 1); ++ dtype_err = (dtype != 'm') && (dtype != 'e'); ++ break; ++ case '7': /* 4x4 word */ ++ idx = 0; ++ fsl = rxc; ++ dnum_err = (vfsl > 0) || (vidx > 0); ++ dtype_err = (dtype != 'm') && (dtype != 'e'); ++ break; ++ } ++ ++ if (dtype_err) ++ as_bad (_("Improper VFPU register prefix '%c'"), ++ dtype); ++ if (dnum_err) ++ as_bad (_("Improper VFPU register number (%03d)"), ++ num); ++ ++ if (mtx > VF_MAX_MR_MTX) ++ as_bad (_("VFPU matrix range over %d"), mtx); ++ if (vidx > VF_MAX_MR_IDX) ++ as_bad (_("VFPU index range over %d"), idx); ++ if (vfsl > VF_MAX_MR_FSL) ++ as_bad (_("VFPU field select range over %d"), fsl); ++ ++ regno = ((fsl & VF_MASK_MR_FSL) << VF_SH_MR_FSL) ++ | ((mtx & VF_MASK_MR_MTX) << VF_SH_MR_MTX) ++ | ((idx & VF_MASK_MR_IDX) << VF_SH_MR_IDX); ++ } ++ else ++ { ++ as_bad (_("Improper VFPU register prefix '%c'"), ++ dtype); ++ } ++ } ++ else ++ { ++ as_bad (_("bad operand %s"), s); + } + -+ /* If this value won't fit into a 16 bit offset, then go -+ find a macro that will generate the 32 bit offset -+ code pattern. */ -+ if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0 -+ && (offset_expr.X_op != O_constant -+ || offset_expr.X_add_number >= 0x8000 -+ || offset_expr.X_add_number < -0x8000)) -+ break; ++ if ((*args == 'v') || (*args == 'x')) ++ { ++ vdregno = regno; ++ vdregt = regtype; ++ vdregl = (*args == 'v'); ++ } ++ else if (vdregno <= VF_MAX_MR) ++ { ++ static unsigned short used_vreg[8][16] = { ++ { 0x0001, 0x0010, 0x0100, 0x1000, ++ 0x0002, 0x0020, 0x0200, 0x2000, ++ 0x0004, 0x0040, 0x0400, 0x4000, ++ 0x0008, 0x0080, 0x0800, 0x8000 }, ++ { 0x0003, 0x0030, 0x0300, 0x3000, ++ 0x0011, 0x0022, 0x0044, 0x0088, ++ 0x000c, 0x00c0, 0x0c00, 0xc000, ++ 0x1100, 0x2200, 0x4400, 0x8800 }, ++ { 0x0007, 0x0070, 0x0700, 0x7000, ++ 0x0111, 0x0222, 0x0444, 0x0888, ++ 0x000e, 0x00e0, 0x0e00, 0xe000, ++ 0x1110, 0x2220, 0x4440, 0x8880 }, ++ { 0x000f, 0x00f0, 0x0f00, 0xf000, ++ 0x1111, 0x2222, 0x4444, 0x8888, ++ 0x000f, 0x00f0, 0x0f00, 0xf000, ++ 0x1111, 0x2222, 0x4444, 0x8888 }, ++ { 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000, ++ 0x0000, 0x0000, 0x0000, 0x0000 }, ++ { 0x0033, 0x0033, 0x3300, 0x3300, ++ 0x0033, 0x0033, 0x00cc, 0x00cc, ++ 0x00cc, 0x00cc, 0xcc00, 0xcc00, ++ 0x3300, 0x3300, 0xcc00, 0xcc00 }, ++ { 0x0777, 0x7770, 0x0777, 0x7770, ++ 0x0777, 0x0eee, 0x0777, 0x0eee, ++ 0x0eee, 0xeee0, 0x0eee, 0xeee0, ++ 0x7770, 0xeee0, 0x7770, 0xeee0 }, ++ { 0xffff, 0xffff, 0xffff, 0xffff, ++ 0xffff, 0xffff, 0xffff, 0xffff, ++ 0xffff, 0xffff, 0xffff, 0xffff, ++ 0xffff, 0xffff, 0xffff, 0xffff }, ++ }; ++ int dmtx, smtx; ++ int dfsl, sfsl; ++ int didx, sidx; ++ int drxc, srxc; ++ ++ dmtx = (vdregno >> VF_SH_MR_MTX) & VF_MASK_MR_MTX; ++ smtx = (regno >> VF_SH_MR_MTX) & VF_MASK_MR_MTX; ++ ++ if (dmtx == smtx) ++ { ++ unsigned short dused, sused; ++ int dtype, stype; ++ ++ dfsl = (vdregno >> VF_SH_MR_FSL) & VF_MASK_MR_FSL; ++ didx = (vdregno >> VF_SH_MR_IDX) & VF_MASK_MR_IDX; ++ drxc = (vdregno >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ sfsl = (regno >> VF_SH_MR_FSL) & VF_MASK_MR_FSL; ++ sidx = (regno >> VF_SH_MR_IDX) & VF_MASK_MR_IDX; ++ srxc = (regno >> VF_SH_MR_RXC) & VF_MASK_MR_RXC; ++ ++ dtype = vdregt - '0'; ++ stype = regtype - '0'; ++ dused = used_vreg[dtype][(dfsl << 2) + didx]; ++ sused = used_vreg[stype][(sfsl << 2) + sidx]; ++ ++ if ((dused & sused) ++ && (vdregl || (dused ^ sused) || (drxc != srxc))) ++ { ++ int dvfsl; ++ dvfsl = (vdregno >> VF_SH_MR_VFSL) & VF_MASK_MR_VFSL; ++ switch (vdregt) ++ { ++ case '1': ++ dvfsl <<= 1; ++ case '2': ++ case '3': ++ if (drxc) ++ as_bad (_("VFPU register conflict(R%d%d%d)"), ++ dmtx, dvfsl, didx); ++ else ++ as_bad (_("VFPU register conflict(C%d%d%d)"), ++ dmtx, didx, dvfsl); ++ break; ++ case '5': ++ dvfsl <<= 1; ++ case '6': ++ case '7': ++ if (drxc) ++ as_bad (_("VFPU register conflict(E%d%d%d)"), ++ dmtx, dvfsl, didx); ++ else ++ as_bad (_("VFPU register conflict(M%d%d%d)"), ++ dmtx, didx, dvfsl); ++ break; ++ } ++ } ++ } ++ } ++ ++ switch (*args++) ++ { ++ case 's': ++ if ( ++ (ip->insn_opcode ++ & VFPU_MASK_RPT_MMUL) == VFPU_INST_RPT_MMUL) ++ { ++ if (regno & (VF_MASK_MR_RXC << VF_SH_MR_RXC)) ++ regno &= ~(VF_MASK_MR_RXC << VF_SH_MR_RXC); ++ else ++ regno |= (VF_MASK_MR_RXC << VF_SH_MR_RXC); ++ } ++ ip->insn_opcode |= (regno & VF_MASK_VS) << VF_SH_VS; ++ break; ++ case 't': ++ ip->insn_opcode |= (regno & VF_MASK_VT) << VF_SH_VT; ++ break; ++ case 'd': ++ case 'v': ++ case 'x': ++ ip->insn_opcode |= (regno & VF_MASK_VD) << VF_SH_VD; ++ break; ++ case 'm': ++ { ++ int vmregL = (regno >> 0) & VF_MASK_VML; ++ int vmregH = (regno >> 5) & VF_MASK_VMH; ++ ip->insn_opcode |= (vmregL << VF_SH_VML) ++ | (vmregH << VF_SH_VMH); ++ } ++ break; ++ case 'n': ++ { ++ int vmregL = (regno >> 0) & VF_MASK_VNL; ++ int vmregH = (regno >> 5) & VF_MASK_VNH; ++ ip->insn_opcode |= (vmregL << VF_SH_VNL) ++ | (vmregH << VF_SH_VNH); ++ } ++ break; ++ } ++ args++; ++ ++ /* now check for vfpu prefixes if necessary */ ++ if (*s == '[') ++ { ++ char *prefix_out = NULL; ++ bfd_boolean *prefix_bool = NULL; ++ char *prefix_type = NULL; ++ int num_args = 0; ++ char *ob = ++s; ++ bfd_boolean has_w = FALSE; ++ bfd_boolean has_z = FALSE; ++ bfd_boolean has_y = FALSE; ++ bfd_boolean has_operator = FALSE; ++ bfd_boolean has_saturater = FALSE; ++ ++ switch (*args) ++ { ++ case 'w': /* only swizzle */ ++ case 's': /* source prefix */ ++ prefix_bool = &vfpu_sprefix; ++ prefix_out = vfpu_sprefix_str; ++ prefix_type = "source"; ++ break; ++ case 't': /* target prefix */ ++ prefix_bool = &vfpu_tprefix; ++ prefix_out = vfpu_tprefix_str; ++ prefix_type = "target"; ++ break; ++ case 'm': /* only write mask */ ++ case 'd': /* destination prefix */ ++ prefix_bool = &vfpu_dprefix; ++ prefix_out = vfpu_dprefix_str; ++ prefix_type = "destination"; ++ break; ++ case 'y': /* inhibit */ ++ prefix_bool = NULL; ++ prefix_type = "source"; ++ break; ++ case 'x': /* inhibit */ ++ prefix_bool = NULL; ++ prefix_type = "target"; ++ break; ++ case 'z': /* inhibit */ ++ prefix_bool = NULL; ++ prefix_type = "destination"; ++ break; ++ } ++ ++ for ( ; *s != '\0' && *s != ']'; s++) ++ { ++ switch (*s) ++ { ++ case ',': ++ /* count no. of params for syntax check */ ++ num_args++; ++ break; ++ case ' ': ++ case '\t': ++ break; ++ case 'm': ++ case 'M': ++ case 'x': ++ case 'X': ++ break; ++ case 'y': ++ case 'Y': ++ has_y = TRUE; ++ break; ++ case 'z': ++ case 'Z': ++ has_z = TRUE; ++ break; ++ case 'w': ++ case 'W': ++ has_w = TRUE; ++ break; ++ default: ++ if (*args == 'w') ++ has_operator = TRUE; ++ if (*args == 'm') ++ has_saturater = TRUE; ++ } ++ } ++ ++ if (*s == ']') ++ { ++ if (prefix_bool) ++ { ++ *prefix_bool = TRUE; ++ strncpy (prefix_out, ob, s - ob); ++ prefix_out[s - ob] = '\0'; ++ s++; ++ } ++ else ++ { ++ as_bad (_("%s cannot use %s prefix"), ++ insn->name, prefix_type); ++ s++; ++ continue; ++ } ++ } ++ else ++ { ++ as_bad (_("parse error (%s)"), ob - 1); ++ return; ++ } ++ ++ if (num_args != regtype - '0') ++ { ++ as_bad (_("%s prefix specification requires %d parameters - [%s]"), ++ prefix_type, regtype - '0' + 1, ++ prefix_out); ++ } ++ else ++ { ++ int i = 8 - ((3 - num_args) * 2); ++ char dummy_d[] = " m,m,m,m"; ++ char dummy_st[] = " x,y,z,w"; ++ ++ if (*args == 'd' || *args == 'm') ++ { ++ strcat (prefix_out, dummy_d + i); ++ if (has_saturater) ++ { ++ as_bad (_("%s is restricted to mask destination prefixes only"), ++ insn->name); ++ } ++ } ++ else ++ { ++ strcat (prefix_out, dummy_st + i); ++ if (has_operator) ++ { ++ as_bad (_("%s is restricted to swizzle %s prefixes only"), ++ insn->name, prefix_type); ++ } ++ /* semantic check, w can't be specified for ++ s, p, or t instructions same goes for ++ z for p and s, and y for scalars */ ++ if ((has_y && num_args == 0) ++ || (has_z && num_args < 2) ++ || (has_w && num_args < 3)) ++ { ++ as_bad (_("%s swizzle operand is out of range in [%s]"), ++ prefix_type, prefix_out); ++ } ++ } ++ } ++ } + -+ s = expr_end; + continue; ++ } ++ break; + -+ case 'q': -+ case 'r': /* VFPU control register. */ -+ if (s[0] != '$' || !ISDIGIT (s[1])) ++ case 'q': /* VFPU destination control register */ ++ case 'r': /* VFPU source control register */ ++ { ++ if ((s[0] == '$') && ISDIGIT (s[1])) ++ { ++ s++; ++ regno = 0; ++ do ++ { ++ regno *= 10; ++ regno += *s - '0'; ++ ++s; ++ } ++ while (ISDIGIT (*s)); ++ ++ if ((regno < VF_MIN_CR) || (regno > VF_MAX_CR)) ++ as_bad (_("Invalid VFPU control register number (%d)"), ++ regno); ++ ++ else if (!((regno >= VF_MIN_VCR) && (regno <= VF_MAX_VCR))) ++ as_bad (_("Improper VFPU control register number (%d)"), ++ regno); ++ ++ switch (*args) ++ { ++ case 'q': ++ ip->insn_opcode |= (regno & VF_MASK_VCD) << VF_SH_VCD; ++ break; ++ case 'r': ++ ip->insn_opcode |= (regno & VF_MASK_VCS) << VF_SH_VCS; ++ break; ++ } ++ } ++ else + { + as_bad (_("Invalid VFPU control register name (%s)"), s); -+ continue; + } + -+ ++s; -+ regno = 0; -+ do ++ continue; ++ } ++ break; ++ ++ case 'f': /* condition code */ ++ { ++ int cond = 0; ++ if (ISDIGIT (s[0])) + { -+ regno *= 10; -+ regno += *s - '0'; -+ ++s; ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ cond = imm_expr.X_add_number; ++ if ((cond < VF_MIN_CC) || (cond > VF_MAX_CC)) ++ as_bad (_("Invalid VFPU condition code (%d)"), cond); ++ imm_expr.X_op = O_absent; ++ s = expr_end; + } -+ while (ISDIGIT (*s)); -+ if (regno < 128 || regno > 143) -+ as_bad (_("Invalid VFPU control register number (%d)"), regno); -+ else if (regno == 133 || regno == 134) -+ as_bad (_("Improper VFPU control register number (%d)"), regno); -+ if (*args == 'q') -+ INSERT_OPERAND (VFPU_VMTVC, *ip, regno); + else -+ INSERT_OPERAND (VFPU_VMFVC, *ip, regno); -+ continue; ++ { ++ static const char * const vfpu_cond_names[] = { ++ "FL", "EQ", "LT", "LE", ++ "TR", "NE", "GE", "GT", ++ "EZ", "EN", "EI", "ES", ++ "NZ", "NN", "NI", "NS" }; ++ for (cond = VF_MIN_CC; cond <= VF_MAX_CC; cond++) ++ { ++ if (strncasecmp(vfpu_cond_names[cond], s, 2) == 0) ++ break; ++ } ++ if ((cond < VF_MIN_CC) || (cond > VF_MAX_CC)) ++ as_bad (_("Invalid VFPU condition code (%s)"), s); + -+ case 'u': /* 16-bit floating point constant. */ ++ s += 2; ++ } ++ ++ args++; ++ if ((cond == 0) || (cond == 4)) ++ { ++ } ++ else if (cond & 0x8) ++ { ++ if (*args - '0' < 1) ++ as_bad (_("Invalid VFPU condition oparetion")); ++ } ++ else ++ { ++ if (*args - '0' < 2) ++ as_bad (_("Invalid VFPU condition oparetion")); ++ } ++ ++ ip->insn_opcode |= (cond & VF_MASK_CC) << VF_SH_CC; ++ continue; ++ } ++ break; ++ ++ case 'a': /* constant code */ ++ { ++ int cst = 0; ++ if (ISDIGIT (s[0])) ++ { ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ cst = imm_expr.X_add_number; ++ if ((cst < VF_MIN_CONST) || (cst > VF_MAX_CONST)) ++ { ++ as_bad (_("Improper constant code (%d)"), cst); ++ cst &= VF_MASK_CONST; ++ } ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ } ++ else ++ { ++ static const char * const vfpu_const_names[] = { ++ "", "VFPU_HUGE", "VFPU_SQRT2", "VFPU_SQRT1_2", ++ "VFPU_2_SQRTPI", "VFPU_2_PI", "VFPU_1_PI", "VFPU_PI_4", ++ "VFPU_PI_2", "VFPU_PI", "VFPU_E", "VFPU_LOG2E", ++ "VFPU_LOG10E", "VFPU_LN2", "VFPU_LN10", "VFPU_2PI", ++ "VFPU_PI_6", "VFPU_LOG10TWO", "VFPU_LOG2TEN", ++ "VFPU_SQRT3_2"}; ++ for (cst = VF_MIN_CONST; cst <= VF_MAX_CONST; cst++) ++ { ++ if (strcasecmp(vfpu_const_names[cst], s) == 0) ++ break; ++ } ++ if ((cst < VF_MIN_CONST) || (cst > VF_MAX_CONST)) ++ as_bad (_("Invalid constant code (%s)"), s); ++ else ++ s += strlen(vfpu_const_names[cst]); ++ } ++ ++ ip->insn_opcode |= cst << VF_SH_CONST; ++ } ++ continue; ++ ++ case 'b': /* scale exponent */ ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_SCALE) + { -+ if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) -+ { -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 0xffff) -+ as_bad (_("Improper half floating point constant: (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_FLOAT16, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ } ++ as_bad (_("Improper scale (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_SCALE; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_SCALE; ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ continue; ++ ++ case 'c': /* branch condition code bit */ ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_BCOND) ++ { ++ as_bad (_("Improper condition bit (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_BCOND; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_BCOND; ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ continue; ++ ++ case 'e': /* move condition code bit */ ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_MCOND) ++ { ++ as_bad (_("Improper condition bit (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_MCOND; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_MCOND; ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ continue; ++ ++ case 'i': /* wrap exponent */ ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_WRAP) ++ { ++ as_bad (_("Improper wrap (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_WRAP; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_WRAP; ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ continue; ++ ++ case 'w': /* rotation code */ ++ if (s[0] == '[') ++ { ++ char *rot_str = s; ++ int rot_idx = 0; ++ int rot_neg = 0; ++ int rot_sin = 3; ++ int rot_cos = 3; ++ int rot_err = 0; ++ int rot_n; ++ int rot_neg_n = 0; ++ int rot_sin_n = 0; ++ int rot_cos_n = 0; ++ int rot_code; ++ ++ if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_PAIR) ++ rot_n = 2; ++ else if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_TRIPLE) ++ rot_n = 3; ++ else if ((ip->insn_opcode & VFPU_MASK_DTYPE) == VFPU_QUAD) ++ rot_n = 4; + else ++ rot_n = 0; ++ ++ s++; ++ while ((s[0] != ']') && (s[0] != '\0')) + { -+ union flt2int { -+ unsigned long i; -+ float f; -+ } flt2int; -+ unsigned char temp[8]; -+ char *save_in; -+ char *err; -+ int len; -+ int sign, exponent, fraction, exponent16; -+ unsigned int float16 = 0; -+ -+ save_in = input_line_pointer; -+ input_line_pointer = s; -+ err = md_atof ('f', (char *) temp, &len); -+ s = input_line_pointer; -+ input_line_pointer = save_in; -+ if (err != NULL && *err != '\0') ++ if (s[0] == '-') + { -+ as_bad (_("Bad half floating point constant: %s"), err); -+ memset (temp, '\0', sizeof temp); ++ if ((s[1] != 's') && (s[1] != 'S')) ++ { ++ rot_err = 1; ++ break; ++ } ++ rot_neg = 1; ++ rot_neg_n++; ++ s++; + } + -+ /* Convert the 32-bit IEEE754 float into the VFPU -+ 16-bit float format. */ -+ if (! target_big_endian) -+ flt2int.i = bfd_getl32 (temp); -+ else -+ flt2int.i = bfd_getb32 (temp); -+ /* TODO: There must be constants for these somewhere... */ -+ sign = (flt2int.i >> 31) & 0x1; -+ exponent = (flt2int.i >> 23) & 0xff; -+ fraction = flt2int.i & 0x7fffff; -+ exponent16 = exponent - 112; -+ if (exponent16 >= 0) ++ if (s[0] == ',') ++ rot_idx++; ++ else if ((s[0] == 'c') || (s[0] == 'C')) + { -+ if (exponent16 > VFPU_FLOAT16_EXP_MAX -+ && exponent != 0xff) -+ { -+ as_warn (_("Half floating point overflow: %g"), -+ flt2int.f); -+ exponent16 = VFPU_FLOAT16_EXP_MAX; -+ fraction = 0; -+ } -+ else if (exponent16 <= VFPU_FLOAT16_EXP_MAX) -+ fraction = (flt2int.i >> 13) & VFPU_MASK_FLOAT16_FRAC; -+ else if (exponent == 0xff) -+ { -+ exponent16 = VFPU_FLOAT16_EXP_MAX; -+ if (! fraction) -+ fraction = 0; -+ else -+ fraction = 1; -+ } ++ rot_cos = rot_idx; ++ rot_cos_n++; + } ++ else if ((s[0] == 's') || (s[0] == 'S')) ++ { ++ rot_sin = rot_idx; ++ rot_sin_n++; ++ } ++ else if (ISSPACE(s[0]) || (s[0] == '0')) ++ ; + else + { -+ if (exponent != 0 || fraction != 0) -+ as_warn (_("Half floating point underflow: %g"), -+ flt2int.f); -+ exponent16 = 0; -+ fraction = 0; ++ rot_err = 1; ++ break; + } -+ INSERT_BITS (float16, sign, VFPU_MASK_FLOAT16_SIGN, -+ VFPU_SH_FLOAT16_SIGN); -+ INSERT_BITS (float16, exponent16, VFPU_MASK_FLOAT16_EXP, -+ VFPU_SH_FLOAT16_EXP); -+ INSERT_BITS (float16, fraction, VFPU_MASK_FLOAT16_FRAC, -+ VFPU_SH_FLOAT16_FRAC); -+ INSERT_OPERAND (VFPU_FLOAT16, *ip, float16); -+ /* Parse the 16-bit constant. */ -+ sprintf ((char *) temp, "0x%04x", float16); -+ my_getExpression (&imm_expr, (char *) temp); ++ ++ s++; + } -+ } -+ continue; + -+ case 'w': /* Rotation code. */ -+ { -+ int bad_code = 0; -+ int opsize; ++ if (s[0] == ']') ++ rot_idx++; ++ else ++ rot_err = 1; ++ s++; + -+ if (*s != '[') ++ if ((rot_sin_n == 0) && (rot_cos_n == 0)) + { -+ my_getExpression (&imm_expr, s); -+ check_absolute_expr (ip, &imm_expr); -+ if ((unsigned long) imm_expr.X_add_number > 31) -+ as_bad (_("Improper rotation code (%lu)"), -+ (unsigned long) imm_expr.X_add_number); -+ INSERT_OPERAND (VFPU_ROT, *ip, imm_expr.X_add_number); -+ imm_expr.X_op = O_absent; -+ s = expr_end; -+ continue; ++ if (rot_n == 2) ++ rot_sin = 2; ++ else if ((rot_n == 4) || (rot_n == 3)) ++ rot_err = 1; + } + ++ if (rot_cos_n > 1) ++ rot_err = 1; + ++ if (rot_sin_n > 1) ++ { ++ if (((rot_sin_n + rot_cos_n) != rot_n) ++ || ((rot_n == 4) && (rot_cos_n == 0))) ++ rot_err = 1; ++ } ++ ++ if (rot_neg && (rot_neg_n != rot_sin_n)) ++ rot_err = 1; ++ ++ if (rot_sin_n > 1) ++ rot_sin = rot_cos; ++ ++ if (rot_err || (rot_n != rot_idx)) ++ as_bad (_("Invalid rotation code (%s)"), rot_str); ++ ++ rot_code = ((rot_neg & VF_MASK_ROT_NEG) << VF_SH_ROT_NEG) ++ | ((rot_cos & VF_MASK_ROT_COS) << VF_SH_ROT_COS) ++ | ((rot_sin & VF_MASK_ROT_SIN) << VF_SH_ROT_SIN); ++ ip->insn_opcode |= rot_code << VF_SH_ROT; + } -+ continue; -+ -+ case 'y': -+ /* Save the current immediate and offset expressions for -+ the lvi macro. */ ++ else + { -+ int slot = *++args - '0'; -+ -+ assert (slot >= 0 && slot < 4); -+ -+ memcpy (&vimm_expr[slot], &imm_expr, sizeof (imm_expr)); -+ memcpy (&voffset_expr[slot], &offset_expr, sizeof (offset_expr)); ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_ROT) ++ { ++ as_bad (_("Improper rotation code (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_ROT; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_ROT; + imm_expr.X_op = O_absent; -+ offset_expr.X_op = O_absent; -+ imm_reloc[0] = BFD_RELOC_UNUSED; -+ imm_reloc[1] = BFD_RELOC_UNUSED; -+ imm_reloc[2] = BFD_RELOC_UNUSED; -+ offset_reloc[0] = BFD_RELOC_UNUSED; -+ offset_reloc[1] = BFD_RELOC_UNUSED; -+ offset_reloc[2] = BFD_RELOC_UNUSED; ++ s = expr_end; + } -+ continue; ++ continue; + -+ case 'z': /* Store to write buffer. */ ++ case 'u': /* half float */ ++ if ((s[0] == '0') && ((s[1] == 'x') || (s[1] == 'X'))) + { -+ int wb = 0; -+ -+ if (strncasecmp (s, "WT", 2) == 0) -+ wb = 0; -+ else if (strncasecmp (s, "WB", 2) == 0) -+ wb = 1; -+ else -+ as_bad (_("Invalid memory access type (%s)"), s); -+ s += 2; -+ INSERT_OPERAND (VFPU_RWB, *ip, wb); ++ my_getExpression (&imm_expr, s); ++ check_absolute_expr (ip, &imm_expr); ++ if ((unsigned long) imm_expr.X_add_number > VF_MAX_HFLOAT) ++ { ++ as_bad (_("Improper half floating point constant: (%lu)"), ++ (unsigned long) imm_expr.X_add_number); ++ imm_expr.X_add_number &= VF_MASK_HFLOAT; ++ } ++ ip->insn_opcode |= imm_expr.X_add_number << VF_SH_HFLOAT; ++ imm_expr.X_op = O_absent; ++ s = expr_end; ++ continue; + } -+ continue; ++ else ++ { ++ char *save_in; ++ char *err; ++ int len; ++ unsigned int length; ++ unsigned char temp[8]; ++ unsigned int f32, f16; ++ int exponent32, exponent16; ++ int fraction32, fraction16; ++ int sign; ++ char f16_str[8]; + -+ } ++ save_in = input_line_pointer; ++ input_line_pointer = s; ++ err = md_atof ('f', (char *) temp, &len); ++ length = len; ++ s = input_line_pointer; ++ input_line_pointer = save_in; ++ if (err != NULL && *err != '\0') ++ { ++ as_bad (_("Bad half floating point constant: %s"), err); ++ memset (temp, '\0', sizeof temp); ++ length = 4; ++ } ++ ++ if (! target_big_endian) ++ f32 = bfd_getl32 (temp); ++ else ++ f32 = bfd_getb32 (temp); ++ ++ sign = (f32 >> VF_SH_F32_SIGN) & VF_MASK_F32_SIGN; ++ exponent32 = (f32 >> VF_SH_F32_EXP) & VF_MASK_F32_EXP; ++ fraction32 = (f32 >> VF_SH_F32_FRA) & VF_MASK_F32_FRA; ++ exponent16 = exponent32 ++ - VF_BIAS_F32_EXP + VF_BIAS_F16_EXP; ++ ++ if (exponent16 < VF_MIN_F16_EXP) ++ { ++ if ((exponent32 == VF_MIN_F32_EXP) ++ && (fraction32 == 0)) ++ { // zero ++ exponent16 = VF_MIN_F16_EXP; ++ fraction16 = 0; ++ } ++ else ++ { // underflow ++ float* p; ++ p = (float*) &f32; ++ as_warn (_("Half floating point underflow: %g"), ++ *p); ++ exponent16 = VF_MIN_F16_EXP; ++ fraction16 = 0; ++ } ++ } ++ else if (exponent16 > VF_MAX_F16_EXP) ++ { ++ if (exponent32 != VF_MAX_F32_EXP) ++ { // overflow ++ as_warn (_("Half floating point overflow: %g"), ++ *(float *)&f32); ++ exponent16 = VF_MAX_F16_EXP; ++ fraction16 = 0; ++ } ++ else ++ { ++ if (fraction32 == 0) ++ { // infinity ++ exponent16 = VF_MAX_F16_EXP; ++ fraction16 = 0; ++ } ++ else ++ { // NaN ++ exponent16 = VF_MAX_F16_EXP; ++ fraction16 = 1; ++ } ++ } ++ } ++ else ++ { ++ fraction16 = (f32 >> (VF_SH_F32_EXP - VF_SH_F16_EXP)) ++ & VF_MASK_F16_FRA; ++ } ++ ++ f16 = (sign << VF_SH_F16_SIGN) ++ | (exponent16 << VF_SH_F16_EXP) ++ | (fraction16 << VF_SH_F16_FRA); ++ ip->insn_opcode |= (f16 & VF_MASK_HFLOAT) << VF_SH_HFLOAT; ++ ++ sprintf(f16_str, "0x%04x", f16); ++ my_getExpression (&imm_expr, f16_str); ++ ++ continue; ++ } ++ break; ++ ++ case 'z': /* read/write access code */ ++ { ++ int rwb = 0; ++ ++ if (strncasecmp (s, "WT", 2) == 0) ++ rwb = 0x0; ++ else if (strncasecmp (s, "WB", 2) == 0) ++ rwb = 0x1; ++ else ++ as_bad (_("Invalid memory access type (%s)"), s); ++ ++ s += 2; ++ ip->insn_opcode |= (rwb & VF_MASK_RWB) << VF_SH_RWB; ++ ++ continue; ++ } ++ ++ case '0': /* source or target prefix code (X) */ ++ case '1': /* source or target prefix code (Y) */ ++ case '2': /* source or target prefix code (Z) */ ++ case '3': /* source or target prefix code (W) */ ++ { ++ int operand; ++ int shift; ++ ++ int pfx_neg = 0; ++ int pfx_cst = 0; ++ int pfx_abs = 0; ++ int pfx_swz = 0; ++ int pfx_err = 0; ++ int cst = 0; ++ char *pfx_str = s; ++ ++ if (s[0] == '-') ++ { // sign code ++ pfx_neg = 1; ++ s++; ++ } ++ ++ if (ISDIGIT (s[0])) ++ { // constant ++ pfx_cst = 1; ++ ++ if (s[0] == '0') ++ cst = 0; ++ else if (s[0] == '1') ++ { ++ if (s[1] == '/') ++ { ++ s += 2; ++ if (s[0] == '2') ++ cst = 3; ++ else if (s[0] == '3') ++ cst = 5; ++ else if (s[0] == '4') ++ cst = 6; ++ else if (s[0] == '6') ++ cst = 7; ++ else ++ pfx_err = 1; ++ } ++ else ++ { ++ cst = 1; ++ } ++ } ++ else if (s[0] == '2') ++ cst = 2; ++ else if (s[0] == '3') ++ cst = 4; ++ else ++ pfx_err = 1; ++ ++ pfx_abs = (cst >> 2) & 0x1; ++ pfx_swz = (cst >> 0) & 0x3; ++ s++; ++ } ++ else ++ { // variable ++ ++ if (s[0] == '|') ++ { // abs ++ pfx_abs = 1; ++ s++; ++ } ++ ++ if ((s[0] == 'X') || (s[0] == 'x')) ++ { ++ pfx_swz = 0; ++ s++; ++ } ++ else if ((s[0] == 'Y') || (s[0] == 'y')) ++ { ++ pfx_swz = 1; ++ s++; ++ } ++ else if ((s[0] == 'Z') || (s[0] == 'z')) ++ { ++ pfx_swz = 2; ++ s++; ++ } ++ else if ((s[0] == 'W') || (s[0] == 'w')) ++ { ++ pfx_swz = 3; ++ s++; ++ } ++ else if ((s[0] == ',') || IS_SPACE_OR_NUL (s[0]) ++ || (s[0] == '|')) ++ { ++ pfx_swz = *args - '0'; ++ } ++ else ++ pfx_err = 1; ++ ++ if (pfx_err == 0) ++ { ++ if (s[0] == '|') ++ { ++ s++; ++ if (pfx_abs == 0) ++ pfx_err = 1; ++ } ++ else ++ { ++ if (pfx_abs == 1) ++ pfx_err = 1; ++ } ++ } ++ } ++ ++ if (! ((s[0] == ',') || IS_SPACE_OR_NUL (s[0]))) ++ pfx_err = 1; ++ ++ if (pfx_err) ++ as_bad (_("Invalid prefix format (%s)"), pfx_str); ++ ++ shift = *args - '0'; ++ ++ operand = (pfx_neg << (VF_SH_PFX_NEG + shift)) ++ | (pfx_cst << (VF_SH_PFX_CST + shift)) ++ | (pfx_abs << (VF_SH_PFX_ABS + shift)) ++ | (pfx_swz << (VF_SH_PFX_SWZ + shift * 2)); ++ ++ ip->insn_opcode |= operand; ++ continue; ++ } ++ ++ case '4': /* destination prefix code (X) */ ++ case '5': /* destination prefix code (Y) */ ++ case '6': /* destination prefix code (Z) */ ++ case '7': /* destination prefix code (W) */ ++ { ++ int operand; ++ int shift; ++ static const char order[] = "xyzwXYZW"; ++ ++ int pfx_msk = 0; ++ int pfx_sat = 0; ++ char *pfx_str = s; ++ ++ if (s[0] == '[') ++ s++; ++ if (s[0] == '-') /* -1:1, skip the minus symbol */ ++ s++; ++ ++ if ((s[0] == 'm') || (s[0] == 'M')) ++ { ++ pfx_msk = 1; ++ s++; ++ } ++ else if (s[0] == '0') /* 0:1 */ ++ { ++ pfx_sat = 1; ++ s++; ++ } ++ else if (s[0] == '1') /* -1:1 or -1:+1 */ ++ { ++ pfx_sat = 3; ++ s++; ++ } ++ else if ((s[0] == order[(*args) - '4']) ++ || (s[0] == order[(*args) - '4' + 4])) ++ { ++ pfx_sat = 0; ++ s++; ++ } ++ ++ if (s[0] == ':') /* skip the :1 or :+1 part of the expression */ ++ { ++ s++; ++ if (s[0] == '+') ++ s++; ++ if (s[0] == '1') ++ s++; ++ } ++ if (s[0] == ']') ++ s++; ++ ++ if (! ((s[0] == ',') || IS_SPACE_OR_NUL (s[0]))) ++ as_bad (_("Invalid prefix format (%s)"), pfx_str); ++ ++ shift = *args - '4'; ++ operand = (pfx_msk << (VF_SH_PFX_MSK + shift)) ++ | (pfx_sat << (VF_SH_PFX_SAT + shift * 2)); ++ ++ ip->insn_opcode |= operand; ++ continue; ++ } ++ } + break; + - case '<': /* must be at least one digit */ - /* - * According to the manual, if the shift amount is greater -@@ -8485,6 +9091,7 @@ ++ case 'b': /* base register */ ++ case 'd': /* destination register */ ++ case 's': /* source register */ ++ case 't': /* target register */ ++ case 'r': /* both target and source */ ++ case 'v': /* both dest and source */ ++ case 'w': /* both dest and target */ ++ case 'E': /* coprocessor target register */ ++ case 'G': /* coprocessor destination register */ ++ case 'K': /* 'rdhwr' destination register */ ++ case 'x': /* ignore register name */ ++ case 'z': /* must be zero register */ ++ case 'U': /* destination register (clo/clz). */ ++ s_reset = s; ++ if (s[0] == '$') ++ { ++ ++ if (ISDIGIT (s[1])) ++ { ++ ++s; + regno = 0; + do + { +@@ -8273,30 +9967,27 @@ + goto notreg; + else + { +- if (s[1] == 'r' && s[2] == 'a') ++ const char regName[32][5] = + { +- s += 3; +- regno = RA; +- } +- else if (s[1] == 'f' && s[2] == 'p') ++ "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", ++ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", ++ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", ++ "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra" ++ }; ++ int i; ++ ++ for(i = 0; i < 32; i++) + { +- s += 3; +- regno = FP; +- } +- else if (s[1] == 's' && s[2] == 'p') ++ if(strncmp(&s[1], regName[i], strlen(regName[i])) == 0) + { +- s += 3; +- regno = SP; ++ break; + } +- else if (s[1] == 'g' && s[2] == 'p') +- { +- s += 3; +- regno = GP; + } +- else if (s[1] == 'a' && s[2] == 't') ++ ++ if(i < 32) + { +- s += 3; +- regno = AT; ++ s += strlen(regName[i]) + 1; ++ regno = i; + } + else if (s[1] == 'k' && s[2] == 't' && s[3] == '0') + { +@@ -8485,6 +10176,7 @@ if ((regno & 1) != 0 && HAVE_32BIT_FPRS @@ -907,7 +2098,7 @@ && ! (strcmp (str, "mtc1") == 0 || strcmp (str, "mfc1") == 0 || strcmp (str, "lwc1") == 0 -@@ -13743,6 +14350,8 @@ +@@ -13743,6 +15435,8 @@ /* MIPS II */ { "r6000", 0, ISA_MIPS2, CPU_R6000 }, @@ -916,8 +2107,9 @@ /* MIPS III */ { "r4000", 0, ISA_MIPS3, CPU_R4000 }, ---- binutils-2.16.1.orig/gas/configure 2005-02-28 16:43:51.000000000 -0800 -+++ binutils-psp/gas/configure 2005-06-19 18:09:30.000000000 -0700 +diff -burN binutils-2.16.1/gas/configure binutils-psp/gas/configure +--- binutils-2.16.1/gas/configure 2005-03-01 00:43:51.000000000 +0000 ++++ binutils-psp/gas/configure 2006-01-10 23:31:51.000000000 +0000 @@ -4537,6 +4537,9 @@ mips64vr | mips64vrel) mips_cpu=vr4100 @@ -928,8 +2120,9 @@ mipsisa32r2* | mipsisa64r2*) mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'` ;; ---- binutils-2.16.1.orig/gas/configure.in 2005-02-28 16:43:57.000000000 -0800 -+++ binutils-psp/gas/configure.in 2005-06-19 18:09:30.000000000 -0700 +diff -burN binutils-2.16.1/gas/configure.in binutils-psp/gas/configure.in +--- binutils-2.16.1/gas/configure.in 2005-03-01 00:43:57.000000000 +0000 ++++ binutils-psp/gas/configure.in 2006-01-10 23:31:51.000000000 +0000 @@ -222,6 +222,9 @@ mips64vr | mips64vrel) mips_cpu=vr4100 @@ -940,8 +2133,9 @@ mipsisa32r2* | mipsisa64r2*) changequote(,)dnl mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'` ---- binutils-2.16.1.orig/gas/testsuite/gas/mips/mips.exp 2005-04-19 10:09:45.000000000 -0700 -+++ binutils-psp/gas/testsuite/gas/mips/mips.exp 2005-08-29 11:45:56.000000000 -0700 +diff -burN binutils-2.16.1/gas/testsuite/gas/mips/mips.exp binutils-psp/gas/testsuite/gas/mips/mips.exp +--- binutils-2.16.1/gas/testsuite/gas/mips/mips.exp 2005-04-19 18:09:45.000000000 +0100 ++++ binutils-psp/gas/testsuite/gas/mips/mips.exp 2006-01-10 23:31:51.000000000 +0000 @@ -382,6 +382,9 @@ mips_arch_create sb1 64 mips64 { mips3d } \ { -march=sb1 -mtune=sb1 } { -mmips:sb1 } \ @@ -952,15 +2146,17 @@ # ---- binutils-2.16.1.orig/include/bin-bugs.h 2004-07-23 08:40:19.000000000 -0700 -+++ binutils-psp/include/bin-bugs.h 2005-07-22 22:38:52.000000000 -0700 +diff -burN binutils-2.16.1/include/bin-bugs.h binutils-psp/include/bin-bugs.h +--- binutils-2.16.1/include/bin-bugs.h 2004-07-23 16:40:19.000000000 +0100 ++++ binutils-psp/include/bin-bugs.h 2006-01-10 23:31:51.000000000 +0000 @@ -1,3 +1,3 @@ #ifndef REPORT_BUGS_TO -#define REPORT_BUGS_TO "" +#define REPORT_BUGS_TO "" #endif ---- binutils-2.16.1.orig/include/elf/common.h 2004-10-08 06:55:08.000000000 -0700 -+++ binutils-psp/include/elf/common.h 2005-06-19 18:09:25.000000000 -0700 +diff -burN binutils-2.16.1/include/elf/common.h binutils-psp/include/elf/common.h +--- binutils-2.16.1/include/elf/common.h 2004-10-08 14:55:08.000000000 +0100 ++++ binutils-psp/include/elf/common.h 2006-01-10 23:31:51.000000000 +0000 @@ -93,6 +93,7 @@ #define ET_HIOS 0xFEFF /* Operating system-specific */ #define ET_LOPROC 0xFF00 /* Processor-specific */ @@ -969,8 +2165,9 @@ /* Values for e_machine, which identifies the architecture. These numbers are officially assigned by registry@caldera.com. See below for a list of ---- binutils-2.16.1.orig/include/elf/mips.h 2005-03-03 03:58:06.000000000 -0800 -+++ binutils-psp/include/elf/mips.h 2005-06-19 18:09:25.000000000 -0700 +diff -burN binutils-2.16.1/include/elf/mips.h binutils-psp/include/elf/mips.h +--- binutils-2.16.1/include/elf/mips.h 2005-03-03 11:58:06.000000000 +0000 ++++ binutils-psp/include/elf/mips.h 2006-01-10 23:31:51.000000000 +0000 @@ -212,6 +212,7 @@ #define E_MIPS_MACH_5400 0x00910000 #define E_MIPS_MACH_5500 0x00980000 @@ -979,12 +2176,144 @@ /* Processor specific section indices. These sections do not actually exist. Symbols with a st_shndx field corresponding to one of these ---- binutils-2.16.1.orig/include/opcode/mips.h 2005-03-03 03:58:10.000000000 -0800 -+++ binutils-psp/include/opcode/mips.h 2005-08-28 23:39:00.000000000 -0700 -@@ -171,6 +171,97 @@ +diff -burN binutils-2.16.1/include/opcode/mips.h binutils-psp/include/opcode/mips.h +--- binutils-2.16.1/include/opcode/mips.h 2005-03-03 11:58:10.000000000 +0000 ++++ binutils-psp/include/opcode/mips.h 2006-01-15 21:51:17.000000000 +0000 +@@ -171,6 +171,228 @@ #define MDMX_FMTSEL_VEC_QH 0x15 #define MDMX_FMTSEL_VEC_OB 0x16 ++#include "vfpu.h" ++ ++#define VF_MASK_VT 0x7f ++#define VF_SH_VT 16 ++#define VF_MASK_VS 0x7f ++#define VF_SH_VS 8 ++#define VF_MASK_VD 0x7f ++#define VF_SH_VD 0 ++#define VF_MASK_VML 0x1f ++#define VF_SH_VML 16 ++#define VF_MASK_VMH 0x3 ++#define VF_SH_VMH 0 ++#define VF_MASK_VNL 0x1f ++#define VF_SH_VNL 16 ++#define VF_MASK_VNH 0x1 ++#define VF_SH_VNH 0 ++#define VF_MASK_OFFSET 0x3fff ++#define VF_SH_OFFSET 2 ++#define VF_MASK_CC 0xf ++#define VF_SH_CC 0 ++#define VF_MASK_CONST 0x1f ++#define VF_SH_CONST 16 ++#define VF_MASK_SCALE 0x1f ++#define VF_SH_SCALE 16 ++#define VF_MASK_BCOND 0x7 ++#define VF_SH_BCOND 18 ++#define VF_MASK_MCOND 0x7 ++#define VF_SH_MCOND 16 ++#define VF_MASK_VCD 0xff ++#define VF_SH_VCD 0 ++#define VF_MASK_VCS 0xff ++#define VF_SH_VCS 8 ++#define VF_MASK_ROT 0x1f ++#define VF_SH_ROT 16 ++#define VF_MASK_WRAP 0xff ++#define VF_SH_WRAP 16 ++#define VF_MASK_TSIGN 0x1 ++#define VF_SH_TSIGN 5 ++#define VF_MASK_BMCOND 0x1f ++#define VF_SH_BMCOND 0 ++#define VF_MASK_HFLOAT 0xffff ++#define VF_SH_HFLOAT 0 ++#define VF_MASK_PFX 0xffffff ++#define VF_SH_PFX 0 ++#define VF_MASK_RWB 0x1 ++#define VF_SH_RWB 1 ++ ++#define VF_MASK_PFX_SWZ 0x3 ++#define VF_SH_PFX_SWZ 0 ++#define VF_MASK_PFX_ABS 0x1 ++#define VF_SH_PFX_ABS 8 ++#define VF_MASK_PFX_CST 0x1 ++#define VF_SH_PFX_CST 12 ++#define VF_MASK_PFX_NEG 0x1 ++#define VF_SH_PFX_NEG 16 ++#define VF_MASK_PFX_SAT 0x3 ++#define VF_SH_PFX_SAT 0 ++#define VF_MASK_PFX_MSK 0x1 ++#define VF_SH_PFX_MSK 8 ++ ++#define VF_MASK_ROT_COS 0x3 ++#define VF_SH_ROT_COS 0 ++#define VF_MASK_ROT_SIN 0x3 ++#define VF_SH_ROT_SIN 2 ++#define VF_MASK_ROT_NEG 0x1 ++#define VF_SH_ROT_NEG 4 ++ ++#define VF_MASK_MR_MTX 0x7 ++#define VF_SH_MR_MTX 2 ++#define VF_MASK_MR_IDX 0x3 ++#define VF_SH_MR_IDX 0 ++#define VF_MASK_MR_FSL 0x3 ++#define VF_SH_MR_FSL 5 ++#define VF_MASK_MR_RXC 0x1 ++#define VF_SH_MR_RXC 5 ++#define VF_MASK_MR_VFSL 0x1 ++#define VF_SH_MR_VFSL 6 ++ ++#define VF_MAX_MR_MTX 7 ++#define VF_MAX_MR_IDX 3 ++#define VF_MAX_MR_FSL 3 ++#define VF_MAX_MR_VIDX 1 ++#define VF_MAX_MR_VFSL 1 ++ ++#define VF_MIN_MR 0 ++#define VF_MAX_MR 127 ++#define VF_MIN_CR 128 ++#define VF_MAX_CR 255 ++#define VF_MIN_VCR 128 ++#define VF_MAX_VCR 143 ++#define VF_MIN_CC 0 ++#define VF_MAX_CC 15 ++#define VF_MIN_CONST 1 ++#define VF_MAX_CONST 19 ++#define VF_MIN_SCALE 0 ++#define VF_MAX_SCALE 31 ++#define VF_MIN_BCOND 0 ++#define VF_MAX_BCOND 5 ++#define VF_MIN_MCOND 0 ++#define VF_MAX_MCOND 6 ++#define VF_MIN_WRAP 0 ++#define VF_MAX_WRAP 255 ++#define VF_MIN_ROT 0 ++#define VF_MAX_ROT 31 ++#define VF_MIN_TSIGN 0 ++#define VF_MAX_TSIGN 1 ++#define VF_MIN_BMCOND 0 ++#define VF_MAX_BMCOND 31 ++#define VF_MIN_HFLOAT 0 ++#define VF_MAX_HFLOAT 0xffff ++ ++#define VF_MASK_F32_SIGN 0x1 ++#define VF_SH_F32_SIGN 31 ++#define VF_MASK_F32_EXP 0xff ++#define VF_SH_F32_EXP 23 ++#define VF_MASK_F32_FRA 0x7fffff ++#define VF_SH_F32_FRA 0 ++#define VF_MASK_F16_SIGN 0x1 ++#define VF_SH_F16_SIGN 15 ++#define VF_MASK_F16_EXP 0x1f ++#define VF_SH_F16_EXP 10 ++#define VF_MASK_F16_FRA 0x3ff ++#define VF_SH_F16_FRA 0 ++ ++#define VF_MIN_F32_EXP 0 ++#define VF_MAX_F32_EXP 255 ++#define VF_BIAS_F32_EXP 127 ++#define VF_MIN_F16_EXP 0 ++#define VF_MAX_F16_EXP 31 ++#define VF_BIAS_F16_EXP 15 ++ +#define OP_SH_VFPU_DELTA 0 +#define OP_MASK_VFPU_DELTA 0xfffc +#define OP_SH_VFPU_IMM3 16 @@ -1079,7 +2408,7 @@ /* This structure holds information for a particular instruction. */ struct mips_opcode -@@ -258,6 +349,29 @@ +@@ -258,6 +480,29 @@ Requires that "+A" or "+E" occur first to set position. Enforces: 32 < (pos+size) <= 64. @@ -1109,7 +2438,7 @@ Floating point instructions: "D" 5 bit destination register (OP_*_FD) "M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up) -@@ -442,6 +556,8 @@ +@@ -442,6 +687,8 @@ #define INSN_5400 0x01000000 /* NEC VR5500 instruction. */ #define INSN_5500 0x02000000 @@ -1118,7 +2447,7 @@ /* MIPS ISA defines, use instead of hardcoding ISA level. */ -@@ -489,6 +605,7 @@ +@@ -489,6 +736,7 @@ #define CPU_MIPS64 64 #define CPU_MIPS64R2 65 #define CPU_SB1 12310201 /* octal 'SB', 01. */ @@ -1126,7 +2455,7 @@ /* Test for membership in an ISA including chip specific ISAs. INSN is pointer to an element of the opcode table; ISA is the specified -@@ -510,6 +627,7 @@ +@@ -510,6 +758,7 @@ || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \ || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \ || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \ @@ -1134,7 +2463,16 @@ || 0) /* Please keep this term for easier source merging. */ /* This is a list of macro expanded instructions. -@@ -625,6 +743,16 @@ +@@ -622,9 +871,25 @@ + M_LI_DD, + M_LI_S, + M_LI_SS, ++ M_LVHI_S_SS, ++ M_LVHI_P_SS, ++ M_LVI_S_SS, ++ M_LVI_P_SS, ++ M_LVI_T_SS, ++ M_LVI_Q_SS, M_LL_AB, M_LLD_AB, M_LS_A, @@ -1151,7 +2489,15 @@ M_LW_A, M_LW_AB, M_LWC0_A, -@@ -714,6 +842,10 @@ +@@ -635,6 +900,7 @@ + M_LWC2_AB, + M_LWC3_A, + M_LWC3_AB, ++ M_LV_S_AB, + M_LWL_A, + M_LWL_AB, + M_LWR_A, +@@ -714,6 +980,10 @@ M_SUB_I, M_SUBU_I, M_SUBU_I_2, @@ -1162,7 +2508,7 @@ M_TEQ_I, M_TGE_I, M_TGEU_I, -@@ -728,14 +860,24 @@ +@@ -728,14 +998,24 @@ M_ULH_A, M_ULHU, M_ULHU_A, @@ -1187,48 +2533,274 @@ M_XOR_I, M_COP0, M_COP1, ---- binutils-2.16.1.orig/ld/Makefile.am 2005-01-20 11:37:49.000000000 -0800 -+++ binutils-psp/ld/Makefile.am 2005-06-25 02:44:52.000000000 -0700 -@@ -190,6 +190,7 @@ - eelf_i386_chaos.o \ - eelf_i386_fbsd.o \ - eelf_i386_ldso.o \ -+ eelf_mipsallegrexel_psp.o \ - eelf_s390.o \ - egld960.o \ - egld960coff.o \ -@@ -864,6 +865,9 @@ - eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} - ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" -+eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ -+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} -+ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" - eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} - ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" ---- binutils-2.16.1.orig/ld/Makefile.in 2005-01-22 21:36:37.000000000 -0800 -+++ binutils-psp/ld/Makefile.in 2005-06-25 02:47:12.000000000 -0700 -@@ -315,6 +315,7 @@ - eelf_i386_chaos.o \ - eelf_i386_fbsd.o \ - eelf_i386_ldso.o \ -+ eelf_mipsallegrexel_psp.o \ - eelf_s390.o \ - egld960.o \ - egld960coff.o \ -@@ -1601,6 +1602,9 @@ - eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} - ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" -+eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ -+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} -+ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" - eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} - ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" ---- binutils-2.16.1.orig/ld/configure.tgt 2005-02-08 11:54:27.000000000 -0800 -+++ binutils-psp/ld/configure.tgt 2005-06-25 03:20:06.000000000 -0700 +diff -burN binutils-2.16.1/include/opcode/vfpu.h binutils-psp/include/opcode/vfpu.h +--- binutils-2.16.1/include/opcode/vfpu.h 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-psp/include/opcode/vfpu.h 2006-01-15 21:51:21.000000000 +0000 +@@ -0,0 +1,261 @@ ++#ifndef _VFPU_H_ ++#define _VFPU_H_ ++ ++//////////////////////////////////// ++// data type ++#define VFPU_MASK_DTYPE 0x8080 ++#define VFPU_QUAD 0x8080 ++#define VFPU_TRIPLE 0x8000 ++#define VFPU_PAIR 0x0080 ++#define VFPU_SINGLE 0x0000 ++ ++//////////////////////////////////// ++// register index ++#define VFPU_MASK_VT 0x7f0000 ++#define VFPU_MASK_VS 0x007f00 ++#define VFPU_MASK_VD 0x00007f ++ ++//////////////////////////////////// ++// condition and comapre inst ++#define VFPU_PADD_BIN_CMP 0x70 ++ ++//////////////////////////////////// ++// load/store left/right ++#define VFPU_MASK_LDST_LR 0x2 ++#define VFPU_LDST_L 0x0 ++#define VFPU_LDST_R 0x2 ++ ++//////////////////////////////////// ++// load/store memory/buffer ++#define VFPU_MASK_LDST_MB 0x2 ++#define VFPU_LDST_M 0x0 ++#define VFPU_LDST_B 0x2 ++ ++//////////////////////////////////// ++// coprocessor move ++#define VFPU_MASK_COP_MV 0xff80 ++#define VFPU_MASK_COP_MVC 0xff00 ++ ++//////////////////////////////////// ++// sync code ++#define VFPU_MASK_SYNC_CODE 0xffff ++#define VFPU_SYNC_CODE_DEFAULT 0x0320 ++#define VFPU_SYNC_CODE_NOP 0x0000 ++#define VFPU_SYNC_CODE_FLUSH 0x040d ++ ++//////////////////////////////////// ++#define VFPU_INST_BR_F 0x49000000 ++#define VFPU_MASK_BR_F 0xffe30000 ++#define VFPU_INST_BR_FL 0x49020000 ++#define VFPU_MASK_BR_FL 0xffe30000 ++#define VFPU_INST_BR_T 0x49010000 ++#define VFPU_MASK_BR_T 0xffe30000 ++#define VFPU_INST_BR_TL 0x49030000 ++#define VFPU_MASK_BR_TL 0xffe30000 ++ ++#define VFPU_INST_COP_LD_S 0xc8000000 ++#define VFPU_MASK_COP_LD_S 0xfc000000 ++#define VFPU_INST_COP_ST_S 0xe8000000 ++#define VFPU_MASK_COP_ST_S 0xfc000000 ++#define VFPU_INST_COP_LD_Q 0xd8000000 ++#define VFPU_MASK_COP_LD_Q 0xfc000000 ++#define VFPU_INST_COP_ST_Q 0xf8000000 ++#define VFPU_MASK_COP_ST_Q 0xfc000000 ++#define VFPU_INST_COP_LD_U 0xd4000000 ++#define VFPU_MASK_COP_LD_U 0xfc000000 ++#define VFPU_INST_COP_ST_U 0xf4000000 ++#define VFPU_MASK_COP_ST_U 0xfc000000 ++#define VFPU_INST_COP_MF 0x48600000 ++#define VFPU_MASK_COP_MF 0xffe00000 ++#define VFPU_INST_COP_MT 0x48e00000 ++#define VFPU_MASK_COP_MT 0xffe00000 ++ ++#define VFPU_INST_BIN_ADD 0x60000000 ++#define VFPU_MASK_BIN_ADD 0xff800000 ++#define VFPU_INST_BIN_SUB 0x60800000 ++#define VFPU_MASK_BIN_SUB 0xff800000 ++#define VFPU_INST_BIN_SBN 0x61000000 ++#define VFPU_MASK_BIN_SBN 0xff800000 ++#define VFPU_INST_BIN_DIV 0x63800000 ++#define VFPU_MASK_BIN_DIV 0xff800000 ++#define VFPU_INST_BIN_MUL 0x64000000 ++#define VFPU_MASK_BIN_MUL 0xff800000 ++#define VFPU_INST_BIN_DOT 0x64800000 ++#define VFPU_MASK_BIN_DOT 0xff800000 ++#define VFPU_INST_BIN_SCL 0x65000000 ++#define VFPU_MASK_BIN_SCL 0xff800000 ++#define VFPU_INST_BIN_HDP 0x66000000 ++#define VFPU_MASK_BIN_HDP 0xff800000 ++#define VFPU_INST_BIN_CRS 0x66800000 ++#define VFPU_MASK_BIN_CRS 0xff800000 ++#define VFPU_INST_BIN_DET 0x67000000 ++#define VFPU_MASK_BIN_DET 0xff800000 ++#define VFPU_INST_BIN_CMP 0x6c000000 ++#define VFPU_MASK_BIN_CMP 0xff800000 ++#define VFPU_INST_BIN_MIN 0x6d000000 ++#define VFPU_MASK_BIN_MIN 0xff800000 ++#define VFPU_INST_BIN_MAX 0x6d800000 ++#define VFPU_MASK_BIN_MAX 0xff800000 ++#define VFPU_INST_BIN_SCMP 0x6e800000 ++#define VFPU_MASK_BIN_SCMP 0xff800000 ++#define VFPU_INST_BIN_SGE 0x6f000000 ++#define VFPU_MASK_BIN_SGE 0xff800000 ++#define VFPU_INST_BIN_SLT 0x6f800000 ++#define VFPU_MASK_BIN_SLT 0xff800000 ++ ++#define VFPU_INST_UNR_MOV 0xd0000000 ++#define VFPU_MASK_UNR_MOV 0xffff0000 ++#define VFPU_INST_UNR_ABS 0xd0010000 ++#define VFPU_MASK_UNR_ABS 0xffff0000 ++#define VFPU_INST_UNR_NEG 0xd0020000 ++#define VFPU_MASK_UNR_NEG 0xffff0000 ++#define VFPU_INST_UNR_IDT 0xd0030000 ++#define VFPU_MASK_UNR_IDT 0xffff0000 ++#define VFPU_INST_UNR_SAT0 0xd0040000 ++#define VFPU_MASK_UNR_SAT0 0xffff0000 ++#define VFPU_INST_UNR_SAT1 0xd0050000 ++#define VFPU_MASK_UNR_SAT1 0xffff0000 ++#define VFPU_INST_UNR_ZERO 0xd0060000 ++#define VFPU_MASK_UNR_ZERO 0xffff0000 ++#define VFPU_INST_UNR_ONE 0xd0070000 ++#define VFPU_MASK_UNR_ONE 0xffff0000 ++#define VFPU_INST_UNR_RCP 0xd0100000 ++#define VFPU_MASK_UNR_RCP 0xffff0000 ++#define VFPU_INST_UNR_RSQ 0xd0110000 ++#define VFPU_MASK_UNR_RSQ 0xffff0000 ++#define VFPU_INST_UNR_SIN 0xd0120000 ++#define VFPU_MASK_UNR_SIN 0xffff0000 ++#define VFPU_INST_UNR_COS 0xd0130000 ++#define VFPU_MASK_UNR_COS 0xffff0000 ++#define VFPU_INST_UNR_EXP2 0xd0140000 ++#define VFPU_MASK_UNR_EXP2 0xffff0000 ++#define VFPU_INST_UNR_LOG2 0xd0150000 ++#define VFPU_MASK_UNR_LOG2 0xffff0000 ++#define VFPU_INST_UNR_SQR 0xd0160000 ++#define VFPU_MASK_UNR_SQR 0xffff0000 ++#define VFPU_INST_UNR_ASIN 0xd0170000 ++#define VFPU_MASK_UNR_ASIN 0xffff0000 ++#define VFPU_INST_UNR_NRCP 0xd0180000 ++#define VFPU_MASK_UNR_NRCP 0xffff0000 ++#define VFPU_INST_UNR_NSIN 0xd01a0000 ++#define VFPU_MASK_UNR_NSIN 0xffff0000 ++#define VFPU_INST_UNR_REXP2 0xd01c0000 ++#define VFPU_MASK_UNR_REXP2 0xffff0000 ++#define VFPU_INST_UNR_RNDS 0xd0200000 ++#define VFPU_MASK_UNR_RNDS 0xffff0000 ++#define VFPU_INST_UNR_RNDI 0xd0210000 ++#define VFPU_MASK_UNR_RNDI 0xffff0000 ++#define VFPU_INST_UNR_RNDF1 0xd0220000 ++#define VFPU_MASK_UNR_RNDF1 0xffff0000 ++#define VFPU_INST_UNR_RNDF2 0xd0230000 ++#define VFPU_MASK_UNR_RNDF2 0xffff0000 ++#define VFPU_INST_UNR_F2H 0xd0320000 ++#define VFPU_MASK_UNR_F2H 0xffff0000 ++#define VFPU_INST_UNR_H2F 0xd0330000 ++#define VFPU_MASK_UNR_H2F 0xffff0000 ++#define VFPU_INST_UNR_SBZ 0xd0360000 ++#define VFPU_MASK_UNR_SBZ 0xffff0000 ++#define VFPU_INST_UNR_LGB 0xd0370000 ++#define VFPU_MASK_UNR_LGB 0xffff0000 ++#define VFPU_INST_UNR_US2I 0xd03a0000 ++#define VFPU_MASK_UNR_US2I 0xffff0000 ++#define VFPU_INST_UNR_S2I 0xd03b0000 ++#define VFPU_MASK_UNR_S2I 0xffff0000 ++#define VFPU_INST_UNR_I2UC 0xd03c0000 ++#define VFPU_MASK_UNR_I2UC 0xffff0000 ++#define VFPU_INST_UNR_I2C 0xd03d0000 ++#define VFPU_MASK_UNR_I2C 0xffff0000 ++#define VFPU_INST_UNR_I2US 0xd03e0000 ++#define VFPU_MASK_UNR_I2US 0xffff0000 ++#define VFPU_INST_UNR_I2S 0xd03f0000 ++#define VFPU_MASK_UNR_I2S 0xffff0000 ++#define VFPU_INST_UNR_SRT1 0xd0400000 ++#define VFPU_MASK_UNR_SRT1 0xffff0000 ++#define VFPU_INST_UNR_SRT2 0xd0410000 ++#define VFPU_MASK_UNR_SRT2 0xffff0000 ++#define VFPU_INST_UNR_BFY1 0xd0420000 ++#define VFPU_MASK_UNR_BFY1 0xffff0000 ++#define VFPU_INST_UNR_BFY2 0xd0430000 ++#define VFPU_MASK_UNR_BFY2 0xffff0000 ++#define VFPU_INST_UNR_OCP 0xd0440000 ++#define VFPU_MASK_UNR_OCP 0xffff0000 ++#define VFPU_INST_UNR_SOCP 0xd0450000 ++#define VFPU_MASK_UNR_SOCP 0xffff0000 ++#define VFPU_INST_UNR_FAD 0xd0460000 ++#define VFPU_MASK_UNR_FAD 0xffff0000 ++#define VFPU_INST_UNR_AVG 0xd0470000 ++#define VFPU_MASK_UNR_AVG 0xffff0000 ++#define VFPU_INST_UNR_SRT3 0xd0480000 ++#define VFPU_MASK_UNR_SRT3 0xffff0000 ++#define VFPU_INST_UNR_SRT4 0xd0490000 ++#define VFPU_MASK_UNR_SRT4 0xffff0000 ++#define VFPU_INST_UNR_SGN 0xd04a0000 ++#define VFPU_MASK_UNR_SGN 0xffff0000 ++#define VFPU_INST_UNR_CF 0xd0500000 ++#define VFPU_MASK_UNR_CF 0xffff0080 ++#define VFPU_INST_UNR_CT 0xd0510000 ++#define VFPU_MASK_UNR_CT 0xffff8000 ++#define VFPU_INST_UNR_T4444 0xd0590000 ++#define VFPU_MASK_UNR_T4444 0xffff0000 ++#define VFPU_INST_UNR_T5551 0xd05a0000 ++#define VFPU_MASK_UNR_T5551 0xffff0000 ++#define VFPU_INST_UNR_T5650 0xd05b0000 ++#define VFPU_MASK_UNR_T5650 0xffff0000 ++#define VFPU_INST_UNR_CST 0xd0600000 ++#define VFPU_MASK_UNR_CST 0xffe00000 ++ ++#define VFPU_INST_UNRI_F2I_N 0xd2000000 ++#define VFPU_MASK_UNRI_F2I_N 0xffe00000 ++#define VFPU_INST_UNRI_F2I_Z 0xd2200000 ++#define VFPU_MASK_UNRI_F2I_Z 0xffe00000 ++#define VFPU_INST_UNRI_F2I_U 0xd2400000 ++#define VFPU_MASK_UNRI_F2I_U 0xffe00000 ++#define VFPU_INST_UNRI_F2I_D 0xd2600000 ++#define VFPU_MASK_UNRI_F2I_D 0xffe00000 ++#define VFPU_INST_UNRI_I2F 0xd2800000 ++#define VFPU_MASK_UNRI_I2F 0xffe00000 ++#define VFPU_INST_UNRI_CMOV_T 0xd2a00000 ++#define VFPU_MASK_UNRI_CMOV_T 0xfff80000 ++#define VFPU_INST_UNRI_CMOV_F 0xd2a80000 ++#define VFPU_MASK_UNRI_CMOV_F 0xfff80000 ++#define VFPU_INST_UNRI_WBN 0xd3000000 ++#define VFPU_MASK_UNRI_WBN 0xff000000 ++ ++#define VFPU_INST_PFX_RA 0xdc000000 ++#define VFPU_MASK_PFX_RA 0xff000000 ++#define VFPU_INST_PFX_RB 0xdd000000 ++#define VFPU_MASK_PFX_RB 0xff000000 ++#define VFPU_INST_PFX_W 0xde000000 ++#define VFPU_MASK_PFX_W 0xff000000 ++#define VFPU_INST_IIM 0xdf000000 ++#define VFPU_MASK_IIM 0xff800000 ++#define VFPU_INST_FIM 0xdf800000 ++#define VFPU_MASK_FIM 0xff800000 ++ ++#define VFPU_INST_RPT_MMUL 0xf0000000 ++#define VFPU_MASK_RPT_MMUL 0xff800000 ++#define VFPU_INST_RPT_TFM2 0xf0800000 ++#define VFPU_MASK_RPT_TFM2 0xff800000 ++#define VFPU_INST_RPT_TFM3 0xf1000000 ++#define VFPU_MASK_RPT_TFM3 0xff800000 ++#define VFPU_INST_RPT_TFM4 0xf1800000 ++#define VFPU_MASK_RPT_TFM4 0xff800000 ++#define VFPU_INST_RPT_MSCL 0xf2000000 ++#define VFPU_MASK_RPT_MSCL 0xff800000 ++#define VFPU_INST_RPT_QMUL 0xf2800000 ++#define VFPU_MASK_RPT_QMUL 0xff800000 ++#define VFPU_INST_RPT_MMOV 0xf3800000 ++#define VFPU_MASK_RPT_MMOV 0xffff0000 ++#define VFPU_INST_RPT_MIDT 0xf3830000 ++#define VFPU_MASK_RPT_MIDT 0xffff0000 ++#define VFPU_INST_RPT_MZERO 0xf3860000 ++#define VFPU_MASK_RPT_MZERO 0xffff0000 ++#define VFPU_INST_RPT_MONE 0xf3870000 ++#define VFPU_MASK_RPT_MONE 0xffff0000 ++#define VFPU_INST_RPT_ROT 0xf3a00000 ++#define VFPU_MASK_RPT_ROT 0xffe00000 ++ ++#define VFPU_INST_SYNC 0xffff0000 ++#define VFPU_MASK_SYNC 0xffff0000 ++ ++#endif /* _VFPU_H_ */ +diff -burN binutils-2.16.1/ld/configure.tgt binutils-psp/ld/configure.tgt +--- binutils-2.16.1/ld/configure.tgt 2005-02-08 19:54:27.000000000 +0000 ++++ binutils-psp/ld/configure.tgt 2006-01-10 23:31:51.000000000 +0000 @@ -428,6 +428,8 @@ mips*vr4100-*-elf*) targ_emul=elf32b4300 ;; mips*vr5000el-*-elf*) targ_emul=elf32l4300 ;; @@ -1238,8 +2810,9 @@ mips*el-*-elf*) targ_emul=elf32elmip ;; mips*-*-elf*) targ_emul=elf32ebmip ;; mips*el-*-rtems*) targ_emul=elf32elmip ;; ---- binutils-2.16.1.orig/ld/emulparams/elf_mipsallegrexel_psp.sh 1969-12-31 16:00:00.000000000 -0800 -+++ binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh 2005-07-12 03:44:26.000000000 -0700 +diff -burN binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh +--- binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-psp/ld/emulparams/elf_mipsallegrexel_psp.sh 2006-01-10 23:31:51.000000000 +0000 @@ -0,0 +1,22 @@ +# Based off of the default elf32 MIPS target. However, we use a seperate +# script template because the PSP architecture defines sections that normally @@ -1263,8 +2836,51 @@ + +# Discard the .comment and .pdr sections. +OTHER_SECTIONS="/DISCARD/ : { *(.comment) *(.pdr) }" ---- binutils-2.16.1.orig/ld/scripttempl/elf_psp.sc 1969-12-31 16:00:00.000000000 -0800 -+++ binutils-psp/ld/scripttempl/elf_psp.sc 2005-06-25 03:12:02.000000000 -0700 +diff -burN binutils-2.16.1/ld/Makefile.am binutils-psp/ld/Makefile.am +--- binutils-2.16.1/ld/Makefile.am 2005-01-20 19:37:49.000000000 +0000 ++++ binutils-psp/ld/Makefile.am 2006-01-10 23:31:51.000000000 +0000 +@@ -190,6 +190,7 @@ + eelf_i386_chaos.o \ + eelf_i386_fbsd.o \ + eelf_i386_ldso.o \ ++ eelf_mipsallegrexel_psp.o \ + eelf_s390.o \ + egld960.o \ + egld960coff.o \ +@@ -864,6 +865,9 @@ + eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" ++eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" + eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" +diff -burN binutils-2.16.1/ld/Makefile.in binutils-psp/ld/Makefile.in +--- binutils-2.16.1/ld/Makefile.in 2005-01-23 05:36:37.000000000 +0000 ++++ binutils-psp/ld/Makefile.in 2006-01-10 23:31:51.000000000 +0000 +@@ -315,6 +315,7 @@ + eelf_i386_chaos.o \ + eelf_i386_fbsd.o \ + eelf_i386_ldso.o \ ++ eelf_mipsallegrexel_psp.o \ + eelf_s390.o \ + egld960.o \ + egld960coff.o \ +@@ -1601,6 +1602,9 @@ + eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" ++eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" + eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" +diff -burN binutils-2.16.1/ld/scripttempl/elf_psp.sc binutils-psp/ld/scripttempl/elf_psp.sc +--- binutils-2.16.1/ld/scripttempl/elf_psp.sc 1970-01-01 01:00:00.000000000 +0100 ++++ binutils-psp/ld/scripttempl/elf_psp.sc 2006-01-10 23:31:51.000000000 +0000 @@ -0,0 +1,496 @@ +# +# Unusual variables checked by this code: @@ -1762,8 +3378,9 @@ + ${RELOCATING+${STACKNOTE}} +} +EOF ---- binutils-2.16.1.orig/opcodes/mips-dis.c 2005-03-03 03:49:50.000000000 -0800 -+++ binutils-psp/opcodes/mips-dis.c 2005-08-28 16:25:27.000000000 -0700 +diff -burN binutils-2.16.1/opcodes/mips-dis.c binutils-psp/opcodes/mips-dis.c +--- binutils-2.16.1/opcodes/mips-dis.c 2005-03-03 11:49:50.000000000 +0000 ++++ binutils-psp/opcodes/mips-dis.c 2006-01-10 23:31:51.000000000 +0000 @@ -140,6 +140,139 @@ "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave", }; @@ -2318,8 +3935,9 @@ default: /* xgettext:c-format */ (*info->fprintf_func) (info->stream, ---- binutils-2.16.1.orig/opcodes/mips-opc.c 2005-03-03 03:49:50.000000000 -0800 -+++ binutils-psp/opcodes/mips-opc.c 2005-10-20 08:13:56.000000000 -0700 +diff -burN binutils-2.16.1/opcodes/mips-opc.c binutils-psp/opcodes/mips-opc.c +--- binutils-2.16.1/opcodes/mips-opc.c 2005-03-03 11:49:50.000000000 +0000 ++++ binutils-psp/opcodes/mips-opc.c 2006-01-10 23:31:51.000000000 +0000 @@ -109,6 +109,7 @@ #define N5 (INSN_5400 | INSN_5500) #define N54 INSN_5400 diff --git a/dkpsp/patches/gcc-4.1.0.patch b/dkpsp/patches/gcc-4.1.0.patch new file mode 100644 index 0000000..a372493 --- /dev/null +++ b/dkpsp/patches/gcc-4.1.0.patch @@ -0,0 +1,924 @@ +diff -Nbaur gcc-4.1.0/config.sub gcc-4.1.0-psp/config.sub +--- gcc-4.1.0/config.sub Fri Dec 16 12:57:40 2005 ++++ gcc-4.1.0-psp/config.sub Sun May 7 22:34:17 2006 +@@ -264,6 +264,7 @@ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ ++ | mipsallegrex | mipsallegrexel \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ +@@ -346,6 +347,7 @@ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ ++ | mipsallegrex-* | mipsallegrexel-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ +@@ -688,6 +690,10 @@ + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint ++ ;; ++ psp) ++ basic_machine=mipsallegrexel-psp ++ os=-elf + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` +diff -Nbaur gcc-4.1.0/gcc/c-incpath.c gcc-4.1.0-psp/gcc/c-incpath.c +--- gcc-4.1.0/gcc/c-incpath.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.0-psp/gcc/c-incpath.c Sun May 7 22:34:29 2006 +@@ -331,13 +331,18 @@ + cpp_dir *p; + + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) +- /* Convert all backslashes to slashes. The native CRT stat() +- function does not recognize a directory that ends in a backslash +- (unless it is a drive root dir, such "c:\"). Forward slashes, +- trailing or otherwise, cause no problems for stat(). */ +- char* c; +- for (c = path; *c; c++) +- if (*c == '\\') *c = '/'; ++ /* Remove unnecessary trailing slashes. On some versions of MS ++ Windows, trailing _forward_ slashes cause no problems for stat(). ++ On newer versions, stat() does not recognise a directory that ends ++ in a '\\' or '/', unless it is a drive root dir, such as "c:/", ++ where it is obligatory. */ ++ int pathlen = strlen (path); ++ char* end = path + pathlen - 1; ++ /* Preserve the lead '/' or lead "c:/". */ ++ char* start = path + (pathlen > 2 && path[1] == ':' ? 3 : 1); ++ ++ for (; end > start && IS_DIR_SEPARATOR (*end); end--) ++ *end = 0; + #endif + + p = xmalloc (sizeof (cpp_dir)); +diff -Nbaur gcc-4.1.0/gcc/config/mips/allegrex.md gcc-4.1.0-psp/gcc/config/mips/allegrex.md +--- gcc-4.1.0/gcc/config/mips/allegrex.md Thu Jan 1 00:00:00 1970 ++++ gcc-4.1.0-psp/gcc/config/mips/allegrex.md Sun May 7 22:34:17 2006 +@@ -0,0 +1,183 @@ ++;; Sony ALLEGREX instructions. ++;; Copyright (C) 2005 Free Software Foundation, Inc. ++;; ++;; This file is part of GCC. ++;; ++;; GCC 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. ++;; ++;; GCC 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 GCC; see the file COPYING. If not, write to ++;; the Free Software Foundation, 59 Temple Place - Suite 330, ++;; Boston, MA 02111-1307, USA. ++ ++; Multiply Add and Subtract. ++ ++(define_insn "allegrex_madd" ++ [(set (match_operand:SI 0 "register_operand" "+l") ++ (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "d") ++ (match_operand:SI 2 "register_operand" "d")) ++ (match_dup 0))) ++ (clobber (match_scratch:SI 3 "=h"))] ++ "TARGET_ALLEGREX" ++ "madd\t%1,%2" ++ [(set_attr "type" "imadd") ++ (set_attr "mode" "SI")]) ++ ++(define_insn "allegrex_msub" ++ [(set (match_operand:SI 0 "register_operand" "+l") ++ (minus:SI (match_dup 0) ++ (mult:SI (match_operand:SI 1 "register_operand" "d") ++ (match_operand:SI 2 "register_operand" "d")))) ++ (clobber (match_scratch:SI 3 "=h"))] ++ "TARGET_ALLEGREX" ++ "msub\t%1,%2" ++ [(set_attr "type" "imadd") ++ (set_attr "mode" "SI")]) ++ ++ ++; Min and max. ++ ++(define_insn "sminsi3" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (smin:SI (match_operand:SI 1 "register_operand" "d") ++ (match_operand:SI 2 "register_operand" "d")))] ++ "TARGET_ALLEGREX" ++ "min\t%0,%1,%2" ++ [(set_attr "type" "arith") ++ (set_attr "mode" "SI")]) ++ ++(define_insn "smaxsi3" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (smax:SI (match_operand:SI 1 "register_operand" "d") ++ (match_operand:SI 2 "register_operand" "d")))] ++ "TARGET_ALLEGREX" ++ "max\t%0,%1,%2" ++ [(set_attr "type" "arith") ++ (set_attr "mode" "SI")]) ++ ++ ++; Extended shift instructions. ++ ++(define_insn "allegrex_bitrev" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")] ++ UNSPEC_BITREV))] ++ "TARGET_ALLEGREX" ++ "bitrev\t%0,%1" ++ [(set_attr "type" "arith") ++ (set_attr "mode" "SI")]) ++ ++(define_insn "allegrex_wsbh" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")] ++ UNSPEC_WSBH))] ++ "TARGET_ALLEGREX" ++ "wsbh\t%0,%1" ++ [(set_attr "type" "arith") ++ (set_attr "mode" "SI")]) ++ ++(define_insn "allegrex_wsbw" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")] ++ UNSPEC_WSBW))] ++ "TARGET_ALLEGREX" ++ "wsbw\t%0,%1" ++ [(set_attr "type" "arith") ++ (set_attr "mode" "SI")]) ++ ++ ++; Count leading ones, count trailing zeros, and count trailing ones (clz is ++; already defined). ++ ++(define_insn "allegrex_clo" ++ [(set (match_operand:SI 0 "register_operand" "=d") ++ (unspec:SI [(match_operand:SI 1 "register_operand" "d")] ++ UNSPEC_CLO))] ++ "TARGET_ALLEGREX" ++ "clo\t%0,%1" ++ [(set_attr "type" "clz") ++ (set_attr "mode" "SI")]) ++ ++(define_expand "ctzsi2" ++ [(set (match_operand:SI 0 "register_operand") ++ (ctz:SI (match_operand:SI 1 "register_operand")))] ++ "TARGET_ALLEGREX" ++{ ++ rtx r1; ++ ++ r1 = gen_reg_rtx (SImode); ++ emit_insn (gen_allegrex_bitrev (r1, operands[1])); ++ emit_insn (gen_clzsi2 (operands[0], r1)); ++ DONE; ++}) ++ ++(define_expand "allegrex_cto" ++ [(set (match_operand:SI 0 "register_operand") ++ (unspec:SI [(match_operand:SI 1 "register_operand")] ++ UNSPEC_CTO))] ++ "TARGET_ALLEGREX" ++{ ++ rtx r1; ++ ++ r1 = gen_reg_rtx (SImode); ++ emit_insn (gen_allegrex_bitrev (r1, operands[1])); ++ emit_insn (gen_allegrex_clo (operands[0], r1)); ++ DONE; ++}) ++ ++ ++; Misc. ++ ++(define_insn "allegrex_sync" ++ [(unspec_volatile [(const_int 0)] UNSPEC_SYNC)] ++ "TARGET_ALLEGREX" ++ "sync" ++ [(set_attr "type" "unknown") ++ (set_attr "mode" "none")]) ++ ++(define_insn "allegrex_cache" ++ [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "") ++ (match_operand:SI 1 "register_operand" "d")] ++ UNSPEC_CACHE)] ++ "TARGET_ALLEGREX" ++ "cache\t%0,0(%1)" ++ [(set_attr "type" "unknown") ++ (set_attr "mode" "none")]) ++ ++ ++; Floating-point builtins. ++ ++(define_insn "allegrex_ceil_w_s" ++ [(set (match_operand:SI 0 "register_operand" "=f") ++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")] ++ UNSPEC_CEIL_W_S))] ++ "TARGET_ALLEGREX" ++ "ceil.w.s\t%0,%1" ++ [(set_attr "type" "fcvt") ++ (set_attr "mode" "SF")]) ++ ++(define_insn "allegrex_floor_w_s" ++ [(set (match_operand:SI 0 "register_operand" "=f") ++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")] ++ UNSPEC_FLOOR_W_S))] ++ "TARGET_ALLEGREX" ++ "floor.w.s\t%0,%1" ++ [(set_attr "type" "fcvt") ++ (set_attr "mode" "SF")]) ++ ++(define_insn "allegrex_round_w_s" ++ [(set (match_operand:SI 0 "register_operand" "=f") ++ (unspec:SI [(match_operand:SF 1 "register_operand" "f")] ++ UNSPEC_ROUND_W_S))] ++ "TARGET_ALLEGREX" ++ "round.w.s\t%0,%1" ++ [(set_attr "type" "fcvt") ++ (set_attr "mode" "SF")]) +diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.c gcc-4.1.0-psp/gcc/config/mips/mips.c +--- gcc-4.1.0/gcc/config/mips/mips.c Fri Dec 9 08:15:58 2005 ++++ gcc-4.1.0-psp/gcc/config/mips/mips.c Sun May 7 22:34:17 2006 +@@ -179,6 +179,12 @@ + MIPS_VOID_FTYPE_V2HI_V2HI, + MIPS_VOID_FTYPE_V4QI_V4QI, + ++ /* For the Sony ALLEGREX. */ ++ MIPS_SI_FTYPE_QI, ++ MIPS_SI_FTYPE_HI, ++ MIPS_VOID_FTYPE_VOID, ++ MIPS_SI_FTYPE_SF, ++ + /* The last type. */ + MIPS_MAX_FTYPE_MAX + }; +@@ -220,6 +226,11 @@ + /* As above, but the instruction only sets a single $fcc register. */ + MIPS_BUILTIN_CMP_SINGLE, + ++ /* The builtin corresponds to the ALLEGREX cache instruction. Operand 0 ++ is the function code (must be less than 32) and operand 1 is the base ++ address. */ ++ MIPS_BUILTIN_CACHE, ++ + /* For generating bposge32 branch instructions in MIPS32 DSP ASE. */ + MIPS_BUILTIN_BPOSGE32 + }; +@@ -405,6 +416,7 @@ + static rtx mips_expand_builtin_compare (enum mips_builtin_type, + enum insn_code, enum mips_fp_condition, + rtx, tree); ++static rtx mips_expand_builtin_cache (enum insn_code icode, rtx, tree); + static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx); + static void mips_encode_section_info (tree, rtx, int); + +@@ -721,6 +733,7 @@ + + /* MIPS II */ + { "r6000", PROCESSOR_R6000, 2 }, ++ { "allegrex", PROCESSOR_ALLEGREX, 2 }, + + /* MIPS III */ + { "r4000", PROCESSOR_R4000, 3 }, +@@ -10169,6 +10182,67 @@ + BPOSGE_BUILTIN (32, MASK_DSP) + }; + ++/* Builtin functions for the Sony ALLEGREX processor. ++ ++ These have the `__builtin_allgrex_' prefix instead of `__builtin_mips_' ++ to maintain compatibility with Sony's ALLEGREX GCC port. ++ ++ Some of the builtins may seem redundant, but they are the same as the ++ builtins defined in the Sony compiler. I chose to map redundant and ++ trivial builtins to the original instruction instead of creating ++ duplicate patterns specifically for the ALLEGREX (as Sony does). */ ++ ++/* Define a MIPS_BUILTIN_DIRECT function for instruction CODE_FOR_allegrex_. ++ FUNCTION_TYPE and TARGET_FLAGS are builtin_description fields. */ ++#define DIRECT_ALLEGREX_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \ ++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \ ++ MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS } ++ ++/* Same as the above, but mapped to an instruction that doesn't share the ++ NAME. NAME is the name of the builtin without the builtin prefix. */ ++#define DIRECT_ALLEGREX_NAMED_BUILTIN(NAME, INSN, FUNCTION_TYPE, TARGET_FLAGS) \ ++ { CODE_FOR_ ## INSN, 0, "__builtin_allegrex_" #NAME, \ ++ MIPS_BUILTIN_DIRECT, FUNCTION_TYPE, TARGET_FLAGS } ++ ++/* Define a MIPS_BUILTIN_DIRECT_NO_TARGET function for instruction ++ CODE_FOR_allegrex_. FUNCTION_TYPE and TARGET_FLAGS are ++ builtin_description fields. */ ++#define DIRECT_ALLEGREX_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, TARGET_FLAGS) \ ++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \ ++ MIPS_BUILTIN_DIRECT_NO_TARGET, FUNCTION_TYPE, TARGET_FLAGS } ++ ++/* Define a builtin with a specific function TYPE. */ ++#define SPECIAL_ALLEGREX_BUILTIN(TYPE, INSN, FUNCTION_TYPE, TARGET_FLAGS) \ ++ { CODE_FOR_allegrex_ ## INSN, 0, "__builtin_allegrex_" #INSN, \ ++ MIPS_BUILTIN_ ## TYPE, FUNCTION_TYPE, TARGET_FLAGS } ++ ++static const struct builtin_description allegrex_bdesc[] = ++{ ++ DIRECT_ALLEGREX_BUILTIN(bitrev, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_BUILTIN(wsbh, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_BUILTIN(wsbw, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(clz, clzsi2, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_BUILTIN(clo, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(ctz, ctzsi2, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_BUILTIN(cto, MIPS_SI_FTYPE_SI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(rotr, rotrsi3, MIPS_SI_FTYPE_SI_SI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(rotl, rotlsi3, MIPS_SI_FTYPE_SI_SI, 0), ++ ++ DIRECT_ALLEGREX_NAMED_BUILTIN(seb, extendqisi2, MIPS_SI_FTYPE_QI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(seh, extendhisi2, MIPS_SI_FTYPE_HI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(max, smaxsi3, MIPS_SI_FTYPE_SI_SI, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(min, sminsi3, MIPS_SI_FTYPE_SI_SI, 0), ++ ++ DIRECT_ALLEGREX_NO_TARGET_BUILTIN(sync, MIPS_VOID_FTYPE_VOID, 0), ++ SPECIAL_ALLEGREX_BUILTIN(CACHE, cache, MIPS_VOID_FTYPE_SI_SI, 0), ++ ++ DIRECT_ALLEGREX_NAMED_BUILTIN(sqrt_s, sqrtsf2, MIPS_SF_FTYPE_SF, 0), ++ DIRECT_ALLEGREX_BUILTIN(ceil_w_s, MIPS_SI_FTYPE_SF, 0), ++ DIRECT_ALLEGREX_BUILTIN(floor_w_s, MIPS_SI_FTYPE_SF, 0), ++ DIRECT_ALLEGREX_BUILTIN(round_w_s, MIPS_SI_FTYPE_SF, 0), ++ DIRECT_ALLEGREX_NAMED_BUILTIN(trunc_w_s, fix_truncsfsi2_insn, MIPS_SI_FTYPE_SF, 0) ++}; ++ + /* This helps provide a mapping from builtin function codes to bdesc + arrays. */ + +@@ -10189,6 +10263,7 @@ + { + { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX }, + { sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1 }, ++ { allegrex_bdesc, ARRAY_SIZE (allegrex_bdesc), PROCESSOR_ALLEGREX }, + { dsp_bdesc, ARRAY_SIZE (dsp_bdesc), PROCESSOR_MAX } + }; + +@@ -10292,6 +10367,9 @@ + case MIPS_BUILTIN_BPOSGE32: + return mips_expand_builtin_bposge (type, target); + ++ case MIPS_BUILTIN_CACHE: ++ return mips_expand_builtin_cache (icode, target, arglist); ++ + default: + return 0; + } +@@ -10310,8 +10388,8 @@ + tree V4QI_type_node; + unsigned int offset; + +- /* We have only builtins for -mpaired-single, -mips3d and -mdsp. */ +- if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP) ++ /* We have only builtins for -mpaired-single, -mips3d and -mdsp and the Sony ALLEGREX. */ ++ if (!TARGET_PAIRED_SINGLE_FLOAT && !TARGET_DSP && !TARGET_ALLEGREX) + return; + + if (TARGET_PAIRED_SINGLE_FLOAT) +@@ -10376,6 +10454,44 @@ + double_type_node, double_type_node, NULL_TREE); + } + ++ if (TARGET_ALLEGREX) ++ { ++ types[MIPS_SI_FTYPE_QI] ++ = build_function_type_list (intSI_type_node, ++ intQI_type_node, ++ NULL_TREE); ++ ++ types[MIPS_SI_FTYPE_HI] ++ = build_function_type_list (intSI_type_node, ++ intHI_type_node, ++ NULL_TREE); ++ ++ types[MIPS_SI_FTYPE_SI] ++ = build_function_type_list (intSI_type_node, ++ intSI_type_node, ++ NULL_TREE); ++ ++ types[MIPS_SI_FTYPE_SI_SI] ++ = build_function_type_list (intSI_type_node, ++ intSI_type_node, intSI_type_node, ++ NULL_TREE); ++ ++ types[MIPS_VOID_FTYPE_VOID] ++ = build_function_type_list (void_type_node, void_type_node, NULL_TREE); ++ ++ types[MIPS_VOID_FTYPE_SI_SI] ++ = build_function_type_list (void_type_node, ++ intSI_type_node, intSI_type_node, NULL_TREE); ++ ++ types[MIPS_SF_FTYPE_SF] ++ = build_function_type_list (float_type_node, ++ float_type_node, NULL_TREE); ++ ++ types[MIPS_SI_FTYPE_SF] ++ = build_function_type_list (intSI_type_node, ++ float_type_node, NULL_TREE); ++ } ++ + if (TARGET_DSP) + { + V2HI_type_node = build_vector_type_for_mode (intHI_type_node, V2HImode); +@@ -10557,6 +10673,10 @@ + + switch (i) + { ++ case 0: ++ emit_insn (GEN_FCN (icode) (0)); ++ break; ++ + case 2: + emit_insn (GEN_FCN (icode) (ops[0], ops[1])); + break; +@@ -10765,6 +10885,28 @@ + rtx symbol = XEXP (rtl, 0); + SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL; + } ++} ++ ++/* Expand a __builtin_allegrex_cache() function. Make sure the passed ++ cache function code is less than 32. */ ++ ++static rtx ++mips_expand_builtin_cache (enum insn_code icode, rtx target, tree arglist) ++{ ++ rtx op0, op1; ++ ++ op0 = mips_prepare_builtin_arg (icode, 0, &arglist); ++ op1 = mips_prepare_builtin_arg (icode, 1, &arglist); ++ ++ if (GET_CODE (op0) == CONST_INT) ++ if (INTVAL (op0) < 0 || INTVAL (op0) > 0x1f) ++ { ++ error ("invalid function code '%d'", INTVAL (op0)); ++ return const0_rtx; ++ } ++ ++ emit_insn (GEN_FCN (icode) (op0, op1)); ++ return target; + } + + #include "gt-mips.h" +diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.h gcc-4.1.0-psp/gcc/config/mips/mips.h +--- gcc-4.1.0/gcc/config/mips/mips.h Fri Feb 17 21:38:59 2006 ++++ gcc-4.1.0-psp/gcc/config/mips/mips.h Sun May 7 22:34:17 2006 +@@ -59,6 +59,7 @@ + PROCESSOR_R9000, + PROCESSOR_SB1, + PROCESSOR_SR71000, ++ PROCESSOR_ALLEGREX, + PROCESSOR_MAX + }; + +@@ -194,6 +195,7 @@ + #define TARGET_MIPS9000 (mips_arch == PROCESSOR_R9000) + #define TARGET_SB1 (mips_arch == PROCESSOR_SB1) + #define TARGET_SR71K (mips_arch == PROCESSOR_SR71000) ++#define TARGET_ALLEGREX (mips_arch == PROCESSOR_ALLEGREX) + + /* Scheduling target defines. */ + #define TUNE_MIPS3000 (mips_tune == PROCESSOR_R3000) +@@ -208,6 +210,7 @@ + #define TUNE_MIPS7000 (mips_tune == PROCESSOR_R7000) + #define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000) + #define TUNE_SB1 (mips_tune == PROCESSOR_SB1) ++#define TUNE_ALLEGREX (mips_tune == PROCESSOR_ALLEGREX) + + /* True if the pre-reload scheduler should try to create chains of + multiply-add or multiply-subtract instructions. For example, +@@ -578,6 +581,9 @@ + && !TARGET_MIPS5500 \ + && !TARGET_MIPS16) + ++/* ISA has just the integer condition move instructions (movn,movz) */ ++#define ISA_HAS_INT_CONDMOVE (TARGET_ALLEGREX) ++ + /* ISA has the mips4 FP condition code instructions: FP-compare to CC, + branch on CC, and move (both FP and non-FP) on CC. */ + #define ISA_HAS_8CC (ISA_MIPS4 \ +@@ -594,7 +600,8 @@ + + /* ISA has conditional trap instructions. */ + #define ISA_HAS_COND_TRAP (!ISA_MIPS1 \ +- && !TARGET_MIPS16) ++ && !TARGET_MIPS16 \ ++ && !TARGET_ALLEGREX) + + /* ISA has integer multiply-accumulate instructions, madd and msub. */ + #define ISA_HAS_MADD_MSUB ((ISA_MIPS32 \ +@@ -612,6 +619,7 @@ + #define ISA_HAS_CLZ_CLO ((ISA_MIPS32 \ + || ISA_MIPS32R2 \ + || ISA_MIPS64 \ ++ || TARGET_ALLEGREX \ + ) && !TARGET_MIPS16) + + /* ISA has double-word count leading zeroes/ones instruction (not +@@ -659,6 +667,7 @@ + || TARGET_MIPS5400 \ + || TARGET_MIPS5500 \ + || TARGET_SR71K \ ++ || TARGET_ALLEGREX \ + )) + + /* ISA has 64-bit rotate right instruction. */ +@@ -692,11 +701,13 @@ + /* ISA includes the MIPS32r2 seb and seh instructions. */ + #define ISA_HAS_SEB_SEH (!TARGET_MIPS16 \ + && (ISA_MIPS32R2 \ ++ || TARGET_ALLEGREX \ + )) + + /* ISA includes the MIPS32/64 rev 2 ext and ins instructions. */ + #define ISA_HAS_EXT_INS (!TARGET_MIPS16 \ + && (ISA_MIPS32R2 \ ++ || TARGET_ALLEGREX \ + )) + + /* True if the result of a load is not available to the next instruction. +@@ -727,7 +738,8 @@ + #define ISA_HAS_HILO_INTERLOCKS (ISA_MIPS32 \ + || ISA_MIPS32R2 \ + || ISA_MIPS64 \ +- || TARGET_MIPS5500) ++ || TARGET_MIPS5500 \ ++ || TARGET_ALLEGREX) + + /* Add -G xx support. */ + +@@ -1138,6 +1150,11 @@ + /* Define if loading short immediate values into registers sign extends. */ + #define SHORT_IMMEDIATES_SIGN_EXTEND + ++/* The [d]clz instructions have the natural values at 0. */ ++ ++#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \ ++ ((VALUE) = GET_MODE_BITSIZE (MODE), true) ++ + /* The [d]clz instructions have the natural values at 0. */ + + #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \ +diff -Nbaur gcc-4.1.0/gcc/config/mips/mips.md gcc-4.1.0-psp/gcc/config/mips/mips.md +--- gcc-4.1.0/gcc/config/mips/mips.md Fri Jul 29 18:25:27 2005 ++++ gcc-4.1.0-psp/gcc/config/mips/mips.md Sun May 7 22:34:17 2006 +@@ -142,6 +142,21 @@ + (UNSPEC_MTHLIP 365) + (UNSPEC_WRDSP 366) + (UNSPEC_RDDSP 367) ++ ++ ;; Sony ALLEGREX instructions ++ (UNSPEC_WSBH 401) ++ (UNSPEC_WSBW 402) ++ ++ (UNSPEC_CLO 403) ++ (UNSPEC_CTO 404) ++ ++ (UNSPEC_CACHE 405) ++ (UNSPEC_SYNC 406) ++ ++ (UNSPEC_CEIL_W_S 407) ++ (UNSPEC_FLOOR_W_S 408) ++ (UNSPEC_ROUND_W_S 409) ++ + ] + ) + +@@ -1601,9 +1616,9 @@ + (mult:DI + (any_extend:DI (match_operand:SI 1 "register_operand" "d")) + (any_extend:DI (match_operand:SI 2 "register_operand" "d")))))] +- "!TARGET_64BIT && ISA_HAS_MSAC" ++ "!TARGET_64BIT && (ISA_HAS_MSAC || TARGET_ALLEGREX)" + { +- if (TARGET_MIPS5500) ++ if (TARGET_MIPS5500 || TARGET_ALLEGREX) + return "msub\t%1,%2"; + else + return "msac\t$0,%1,%2"; +@@ -1718,12 +1733,12 @@ + (mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d")) + (any_extend:DI (match_operand:SI 2 "register_operand" "d"))) + (match_operand:DI 3 "register_operand" "0")))] +- "(TARGET_MAD || ISA_HAS_MACC) ++ "(TARGET_MAD || ISA_HAS_MACC || TARGET_ALLEGREX) + && !TARGET_64BIT" + { + if (TARGET_MAD) + return "mad\t%1,%2"; +- else if (TARGET_MIPS5500) ++ else if (TARGET_MIPS5500 || TARGET_ALLEGREX) + return "madd\t%1,%2"; + else + /* See comment in *macc. */ +@@ -1995,6 +2010,32 @@ + ;; + ;; .................... + ;; ++;; FIND FIRST BIT INSTRUCTION ++;; ++;; .................... ++;; ++ ++(define_expand "ffs2" ++ [(set (match_operand:GPR 0 "register_operand" "") ++ (ffs:GPR (match_operand:GPR 1 "register_operand" "")))] ++ "ISA_HAS_CLZ_CLO" ++{ ++ rtx r1, r2, r3, r4; ++ ++ r1 = gen_reg_rtx (mode); ++ r2 = gen_reg_rtx (mode); ++ r3 = gen_reg_rtx (mode); ++ r4 = gen_reg_rtx (mode); ++ emit_insn (gen_neg2 (r1, operands[1])); ++ emit_insn (gen_and3 (r2, operands[1], r1)); ++ emit_insn (gen_clz2 (r3, r2)); ++ emit_move_insn (r4, GEN_INT (GET_MODE_BITSIZE (mode))); ++ emit_insn (gen_sub3 (operands[0], r4, r3)); ++ DONE; ++}) ++;; ++;; .................... ++;; + ;; NEGATION and ONE'S COMPLEMENT + ;; + ;; .................... +@@ -4193,6 +4234,25 @@ + [(set_attr "type" "shift") + (set_attr "mode" "")]) + ++(define_expand "rotl3" ++ [(set (match_operand:GPR 0 "register_operand") ++ (rotate:GPR (match_operand:GPR 1 "register_operand") ++ (match_operand:SI 2 "arith_operand")))] ++ "ISA_HAS_ROTR_" ++{ ++ rtx temp; ++ ++ if (GET_CODE (operands[2]) == CONST_INT) ++ temp = GEN_INT (GET_MODE_BITSIZE (mode) - INTVAL (operands[2])); ++ else ++ { ++ temp = gen_reg_rtx (mode); ++ emit_insn (gen_neg2 (temp, operands[2])); ++ } ++ emit_insn (gen_rotr3 (operands[0], operands[1], temp)); ++ DONE; ++}) ++ + ;; + ;; .................... + ;; +@@ -5306,7 +5366,7 @@ + (const_int 0)]) + (match_operand:GPR 2 "reg_or_0_operand" "dJ,0") + (match_operand:GPR 3 "reg_or_0_operand" "0,dJ")))] +- "ISA_HAS_CONDMOVE" ++ "ISA_HAS_CONDMOVE || ISA_HAS_INT_CONDMOVE" + "@ + mov%T4\t%0,%z2,%1 + mov%t4\t%0,%z3,%1" +@@ -5336,8 +5396,12 @@ + (if_then_else:GPR (match_dup 5) + (match_operand:GPR 2 "reg_or_0_operand") + (match_operand:GPR 3 "reg_or_0_operand")))] +- "ISA_HAS_CONDMOVE" ++ "ISA_HAS_CONDMOVE || ISA_HAS_INT_CONDMOVE" + { ++ if (ISA_HAS_INT_CONDMOVE ++ && GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_FLOAT) ++ FAIL; ++ + gen_conditional_move (operands); + DONE; + }) +@@ -5428,3 +5492,6 @@ + ; The MIPS DSP Instructions. + + (include "mips-dsp.md") ++ ++; Sony ALLEGREX instructions. ++(include "allegrex.md") +diff -Nbaur gcc-4.1.0/gcc/config/mips/psp.h gcc-4.1.0-psp/gcc/config/mips/psp.h +--- gcc-4.1.0/gcc/config/mips/psp.h Thu Jan 1 00:00:00 1970 ++++ gcc-4.1.0-psp/gcc/config/mips/psp.h Sun May 7 22:34:17 2006 +@@ -0,0 +1,31 @@ ++/* Support for Sony's Playstation Portable (PSP). ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ Contributed by Marcus R. Brown ++ ++This file is part of GCC. ++ ++GCC 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. ++ ++GCC 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 GCC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* Override the startfile spec to include crt0.o. */ ++#undef STARTFILE_SPEC ++#define STARTFILE_SPEC "crt0%O%s crti%O%s crtbegin%O%s" ++ ++#undef SUBTARGET_CPP_SPEC ++#define SUBTARGET_CPP_SPEC "-DPSP=1 -D__psp__=1 -D_PSP=1" ++ ++/* Get rid of the .pdr section. */ ++#undef SUBTARGET_ASM_SPEC ++#define SUBTARGET_ASM_SPEC "-mno-pdr" +diff -Nbaur gcc-4.1.0/gcc/config/mips/t-allegrex gcc-4.1.0-psp/gcc/config/mips/t-allegrex +--- gcc-4.1.0/gcc/config/mips/t-allegrex Thu Jan 1 00:00:00 1970 ++++ gcc-4.1.0-psp/gcc/config/mips/t-allegrex Sun May 7 22:34:17 2006 +@@ -0,0 +1,29 @@ ++# Suppress building libgcc1.a, since the MIPS compiler port is complete ++# and does not need anything from libgcc1.a. ++LIBGCC1 = ++CROSS_LIBGCC1 = ++ ++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o ++# Don't let CTOR_LIST end up in sdata section. ++CRTSTUFF_T_CFLAGS = -G 0 ++ ++# Assemble startup files. ++$(T)crti.o: $(srcdir)/config/mips/crti.asm $(GCC_PASSES) ++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ ++ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/mips/crti.asm ++ ++$(T)crtn.o: $(srcdir)/config/mips/crtn.asm $(GCC_PASSES) ++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ ++ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/mips/crtn.asm ++ ++# We must build libgcc2.a with -G 0, in case the user wants to link ++# without the $gp register. ++TARGET_LIBGCC2_CFLAGS = -G 0 ++ ++# Build the libraries for both hard and soft floating point ++ ++MULTILIB_OPTIONS = ++MULTILIB_DIRNAMES = ++ ++LIBGCC = stmp-multilib ++INSTALL_LIBGCC = install-multilib +diff -Nbaur gcc-4.1.0/gcc/config.gcc gcc-4.1.0-psp/gcc/config.gcc +--- gcc-4.1.0/gcc/config.gcc Mon Feb 6 16:07:46 2006 ++++ gcc-4.1.0-psp/gcc/config.gcc Sun May 7 22:34:17 2006 +@@ -406,12 +406,6 @@ + tm_defines="${tm_defines} FBSD_MAJOR=5" ;; + *-*-freebsd6 | *-*-freebsd[6].*) + tm_defines="${tm_defines} FBSD_MAJOR=6" ;; +- *-*-freebsd7 | *-*-freebsd[7].*) +- tm_defines="${tm_defines} FBSD_MAJOR=7" ;; +- *-*-freebsd8 | *-*-freebsd[8].*) +- tm_defines="${tm_defines} FBSD_MAJOR=8" ;; +- *-*-freebsd9 | *-*-freebsd[9].*) +- tm_defines="${tm_defines} FBSD_MAJOR=9" ;; + *) + echo 'Please update *-*-freebsd* in gcc/config.gcc' + exit 1 +@@ -756,11 +750,6 @@ + tmake_file=bfin/t-bfin-elf + use_collect2=no + ;; +-bfin*-uclinux*) +- tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h bfin/uclinux.h" +- tmake_file=bfin/t-bfin-elf +- use_collect2=no +- ;; + bfin*-*) + tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h" + tmake_file=bfin/t-bfin +@@ -1582,6 +1571,18 @@ + mipstx39-*-elf* | mipstx39el-*-elf*) + tm_file="elfos.h ${tm_file} mips/r3900.h mips/elf.h" + tmake_file=mips/t-r3900 ++ use_fixproto=yes ++ ;; ++mipsallegrex-*-elf* | mipsallegrexel-*-elf*) ++ tm_file="elfos.h ${tm_file} mips/elf.h" ++ tmake_file=mips/t-allegrex ++ target_cpu_default="MASK_SINGLE_FLOAT|MASK_DIVIDE_BREAKS" ++ tm_defines="MIPS_ISA_DEFAULT=2 MIPS_CPU_STRING_DEFAULT=\\\"allegrex\\\" MIPS_ABI_DEFAULT=ABI_EABI" ++ case ${target} in ++ mipsallegrex*-psp-elf*) ++ tm_file="${tm_file} mips/psp.h" ++ ;; ++ esac + use_fixproto=yes + ;; + mmix-knuth-mmixware) +diff -Nbaur gcc-4.1.0/gcc/gcc.c gcc-4.1.0-psp/gcc/gcc.c +--- gcc-4.1.0/gcc/gcc.c Sat Jan 21 18:29:08 2006 ++++ gcc-4.1.0-psp/gcc/gcc.c Sun May 7 22:34:29 2006 +@@ -3250,8 +3250,6 @@ + gcc_libexec_prefix = make_relative_prefix (argv[0], + standard_bindir_prefix, + standard_libexec_prefix); +- if (gcc_exec_prefix) +- putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL)); + } + else + gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix, +@@ -6148,10 +6146,10 @@ + + /* We need to check standard_exec_prefix/just_machine_suffix/specs + for any override of as, ld and libraries. */ +- specs_file = alloca (strlen (standard_exec_prefix) ++ specs_file = alloca (strlen (gcc_exec_prefix) + + strlen (just_machine_suffix) + sizeof ("specs")); + +- strcpy (specs_file, standard_exec_prefix); ++ strcpy (specs_file, gcc_exec_prefix); + strcat (specs_file, just_machine_suffix); + strcat (specs_file, "specs"); + if (access (specs_file, R_OK) == 0) +diff -Nbaur gcc-4.1.0/gcc/prefix.c gcc-4.1.0-psp/gcc/prefix.c +--- gcc-4.1.0/gcc/prefix.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.0-psp/gcc/prefix.c Sun May 7 22:34:29 2006 +@@ -246,13 +246,16 @@ + The returned string is always malloc-ed, and the caller is + responsible for freeing it. */ + ++ ++static const char *old_prefix = PREFIX; ++ + char * + update_path (const char *path, const char *key) + { + char *result, *p; +- const int len = strlen (std_prefix); ++ const int len = strlen (old_prefix); + +- if (! strncmp (path, std_prefix, len) ++ if (! strncmp (path, old_prefix, len) + && (IS_DIR_SEPARATOR(path[len]) + || path[len] == '\0') + && key != 0) +@@ -354,4 +357,6 @@ + set_std_prefix (const char *prefix, int len) + { + std_prefix = save_string (prefix, len); ++ ++ putenv (concat ("GCC_EXEC_PREFIX=", std_prefix, NULL)); + } +diff -Nbaur gcc-4.1.0/gcc/toplev.c gcc-4.1.0-psp/gcc/toplev.c +--- gcc-4.1.0/gcc/toplev.c Sat Feb 4 22:13:20 2006 ++++ gcc-4.1.0-psp/gcc/toplev.c Sun May 7 22:34:29 2006 +@@ -82,6 +82,7 @@ + #include "value-prof.h" + #include "alloc-pool.h" + #include "tree-mudflap.h" ++#include "prefix.h" + + #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) + #include "dwarf2out.h" +@@ -1434,6 +1435,10 @@ + progname = p; + + xmalloc_set_program_name (progname); ++ ++ p = getenv("GCC_EXEC_PREFIX"); ++ set_std_prefix (p, strlen(p)); ++ + + hex_init (); + +diff -Nbaur gcc-4.1.0/gcc/version.c gcc-4.1.0-psp/gcc/version.c +--- gcc-4.1.0/gcc/version.c Wed Mar 16 06:04:10 2005 ++++ gcc-4.1.0-psp/gcc/version.c Sun May 7 22:37:23 2006 +@@ -8,7 +8,7 @@ + in parentheses. You may also wish to include a number indicating + the revision of your modified compiler. */ + +-#define VERSUFFIX "" ++#define VERSUFFIX " (PSPDEV 20060507)" + + /* This is the location of the online document giving instructions for + reporting bugs. If you distribute a modified version of GCC, +@@ -17,7 +17,7 @@ + forward us bugs reported to you, if you determine that they are + not bugs in your modifications.) */ + +-const char bug_report_url[] = ""; ++const char bug_report_url[] = ""; + + /* The complete version string, assembled from several pieces. + BASEVER, DATESTAMP, and DEVPHASE are defined by the Makefile. */ diff --git a/dkpsp/patches/newlib-1.14.0.patch b/dkpsp/patches/newlib-1.14.0.patch new file mode 100644 index 0000000..1227057 --- /dev/null +++ b/dkpsp/patches/newlib-1.14.0.patch @@ -0,0 +1,8016 @@ +--- newlib-1.13.0/config.sub 2004-11-15 20:18:39.000000000 -0500 ++++ newlib-psp/config.sub 2005-07-24 01:06:05.000000000 -0400 +@@ -253,6 +253,7 @@ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ ++ | mipsallegrex | mipsallegrexel \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ +@@ -326,6 +327,7 @@ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ ++ | mipsallegrex-* | mipsallegrexel-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ +@@ -665,6 +667,10 @@ + basic_machine=m68k-atari + os=-mint + ;; ++ psp) ++ basic_machine=mipsallegrexel-psp ++ os=-elf ++ ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; +--- newlib-1.13.0/configure 2004-12-16 14:51:28.000000000 -0500 ++++ newlib-psp/configure 2005-07-24 01:06:05.000000000 -0400 +@@ -1507,6 +1507,9 @@ + mips*-*-linux*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ mipsallegrex*-*-*) ++ noconfigdirs="$noconfigdirs target-libgloss" ++ ;; + mips*-*-*) + noconfigdirs="$noconfigdirs gprof ${libgcj}" + ;; +--- newlib-1.13.0/configure.in 2004-12-16 14:51:28.000000000 -0500 ++++ newlib-psp/configure.in 2005-07-24 01:06:05.000000000 -0400 +@@ -716,6 +716,9 @@ + mips*-*-linux*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ mipsallegrex*-*-*) ++ noconfigdirs="$noconfigdirs target-libgloss" ++ ;; + mips*-*-*) + noconfigdirs="$noconfigdirs gprof ${libgcj}" + ;; +--- newlib-1.13.0/newlib/Makefile.am 2004-12-03 18:46:28.000000000 -0500 ++++ newlib-psp/newlib/Makefile.am 2005-12-12 19:16:32.000000000 -0500 +@@ -251,6 +251,18 @@ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/machine/`basename $$i`; \ + else true; fi ; \ + done; \ ++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \ ++ for i in $(srcdir)/libc/sys/$(sys_dir)/netinet/*.h; do \ ++ if [ -f $$i ]; then \ ++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ ++ else true; fi ; \ ++ done ; \ ++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \ ++ for i in $(srcdir)/libc/sys/$(sys_dir)/arpa/*.h; do \ ++ if [ -f $$i ]; then \ ++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \ ++ else true; fi ; \ ++ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/sys; \ + for i in $(srcdir)/libc/include/sys/*.h; do \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/sys/`basename $$i`; \ +--- newlib-1.13.0/newlib/Makefile.in 2004-12-03 18:46:28.000000000 -0500 ++++ newlib-psp/newlib/Makefile.in 2005-12-12 19:16:32.000000000 -0500 +@@ -214,7 +214,7 @@ + + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +-TAR = gtar ++TAR = tar + GZIP_ENV = --best + DIST_SUBDIRS = libc libm doc . @EXTRA_DIRS@ + EXPECT = `if test -f $(top_builddir)/../expect/expect; then echo $(top_builddir)/../expect/expect; else echo expect; fi` +@@ -472,7 +472,7 @@ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)newlib.hin$$unique$(LISP)$$tags" \ +- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags newlib.hin $$unique $(LISP) -o $$here/TAGS) ++ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags newlib.hin $$unique $(LISP)) + + mostlyclean-tags: + +@@ -756,6 +756,18 @@ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/machine/`basename $$i`; \ + else true; fi ; \ + done; \ ++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \ ++ for i in $(srcdir)/libc/sys/$(sys_dir)/netinet/*.h; do \ ++ if [ -f $$i ]; then \ ++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ ++ else true; fi ; \ ++ done ; \ ++ $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \ ++ for i in $(srcdir)/libc/sys/$(sys_dir)/arpa/*.h; do \ ++ if [ -f $$i ]; then \ ++ $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \ ++ else true; fi ; \ ++ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/sys; \ + for i in $(srcdir)/libc/include/sys/*.h; do \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/sys/`basename $$i`; \ +--- newlib-1.13.0/newlib/configure.host 2004-10-05 15:44:24.000000000 -0400 ++++ newlib-psp/newlib/configure.host 2006-04-28 09:34:11.000000000 -0400 +@@ -570,7 +570,14 @@ + ;; + mips*-*-elf*) + default_newlib_io_long_long="yes" +- newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES" ++ case "${host}" in ++ mipsallegrex*-psp-*) ++ sys_dir=psp ++ syscall_dir=syscalls ++ newlib_cflags="${newlib_cflags} -G0 -mno-explicit-relocs -DCOMPACT_CTYPE -DCLOCK_PROVIDED -DHAVE_FCNTL -DMALLOC_ALIGNMENT=16 -I${prefix}/psp/sdk/include" ;; ++ *) ++ newlib_cflags="${newlib_cflags} -DMISSING_SYSCALL_NAMES" ;; ++ esac + ;; + mmix-*) + syscall_dir=syscalls +--- newlib-1.13.0/newlib/libc/include/machine/time.h 2000-12-04 14:06:37.000000000 -0500 ++++ newlib-psp/newlib/libc/include/machine/time.h 2005-10-28 12:26:33.000000000 -0400 +@@ -9,6 +9,10 @@ + #endif + #endif /* !__rtems__ */ + ++#if defined(__psp__) ++#define _CLOCKS_PER_SEC_ 1000000 ++#endif ++ + #endif /* _MACHTIME_H_ */ + + +--- newlib-1.13.0/newlib/libc/include/sys/config.h 2004-06-22 17:54:51.000000000 -0400 ++++ newlib-psp/newlib/libc/include/sys/config.h 2005-09-07 13:04:52.000000000 -0400 +@@ -94,6 +94,12 @@ + #endif + #endif + ++/* We compile newlib with -G0 for PSP, but if we're compiling an app with $gp enabled, ++ then _impure_ptr is expected to live in .sdata. */ ++#if defined(__psp__) ++#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) ++#endif ++ + #ifdef __xstormy16__ + #define __SMALL_BITFIELDS + #undef INT_MAX +--- newlib-1.13.0/newlib/libc/include/sys/types.h 2003-07-02 16:32:07.000000000 -0400 ++++ newlib-psp/newlib/libc/include/sys/types.h 2005-12-12 19:16:32.000000000 -0500 +@@ -188,52 +188,6 @@ + + typedef unsigned short nlink_t; + +-/* We don't define fd_set and friends if we are compiling POSIX +- source, or if we have included (or may include as indicated +- by __USE_W32_SOCKETS) the W32api winsock[2].h header which +- defines Windows versions of them. Note that a program which +- includes the W32api winsock[2].h header must know what it is doing; +- it must not call the cygwin32 select function. +-*/ +-# if !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS)) +-# define _SYS_TYPES_FD_SET +-# define NBBY 8 /* number of bits in a byte */ +-/* +- * Select uses bit masks of file descriptors in longs. +- * These macros manipulate such bit fields (the filesystem macros use chars). +- * FD_SETSIZE may be defined by the user, but the default here +- * should be >= NOFILE (param.h). +- */ +-# ifndef FD_SETSIZE +-# define FD_SETSIZE 64 +-# endif +- +-typedef long fd_mask; +-# define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ +-# ifndef howmany +-# define howmany(x,y) (((x)+((y)-1))/(y)) +-# endif +- +-/* We use a macro for fd_set so that including Sockets.h afterwards +- can work. */ +-typedef struct _types_fd_set { +- fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +-} _types_fd_set; +- +-#define fd_set _types_fd_set +- +-# define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) +-# define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS))) +-# define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS))) +-# define FD_ZERO(p) (__extension__ (void)({ \ +- size_t __i; \ +- char *__tmp = (char *)p; \ +- for (__i = 0; __i < sizeof (*(p)); ++__i) \ +- *__tmp++ = 0; \ +-})) +- +-# endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS)) */ +- + #undef __MS_types__ + #undef _ST_INT32 + +--- newlib-1.13.0/newlib/libc/sys/psp/Makefile.am 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/Makefile.am 2006-04-28 15:21:57.000000000 -0400 +@@ -0,0 +1,65 @@ ++## Process this file with automake to generate Makefile.in ++ ++AUTOMAKE_OPTIONS = cygnus ++ ++INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) ++ ++noinst_LIBRARIES = lib.a ++ ++LIBCGLUE_MULT_OBJS = _close.o _exit.o _fork.o _fstat.o _getpid.o \ ++ _gettimeofday.o _kill.o _lseek.o _open.o _read.o \ ++ _sbrk.o _wait.o _write.o clock.o isatty.o time.o \ ++ _link.o _unlink.o sleep.o opendir.o readdir.o \ ++ closedir.o getcwd.o chdir.o mkdir.o rmdir.o \ ++ realpath.o _stat.o truncate.o access.o tzset.o \ ++ __psp_set_errno.o mlock.o _fcntl.o ++ ++SOCKET_MULT_OBJS = socket.o accept.o bind.o connect.o getsockopt.o \ ++ listen.o recv.o recvfrom.o send.o sendto.o \ ++ setsockopt.o shutdown.o getsockname.o getpeername.o \ ++ inet_ntoa.o ++ ++PIPE_OBJS = pipe.o ++ ++FDMAN_OBJS = fdman.o ++ ++SELECT_OBJS = select.o ++ ++INTERRUPT_OBJS = interrupt.o ++ ++XPRINTF_MULT_OBJS = vxprintf.o _xprintf.o __sout.o vsnprintf.o snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o _sprintf_r.o ++ ++NETDB_MULT_OBJS = h_errno.o gethostbyaddr.o gethostbyname.o ++ ++lib_a_SOURCES = libcglue.c socket.c pspcwd.c xprintf.c netdb.c pipe.c fdman.c select.c interrupt.S ++lib_a_LIBADD = $(LIBCGLUE_MULT_OBJS) $(SOCKET_MULT_OBJS) $(XPRINTF_MULT_OBJS) \ ++ $(NETDB_MULT_OBJS) $(PIPE_OBJS) $(FDMAN_OBJS) $(SELECT_OBJS) $(INTERRUPT_OBJS) ++ ++all: crt0.o ++ ++$(LIBCGLUE_MULT_OBJS): libcglue.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(SOCKET_MULT_OBJS): socket.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(XPRINTF_MULT_OBJS): xprintf.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(NETDB_MULT_OBJS): netdb.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(PIPE_OBJS): pipe.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(FDMAN_OBJS): fdman.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(SELECT_OBJS): select.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(INTERRUPT_OBJS): interrupt.S ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++ACLOCAL_AMFLAGS = -I ../../.. ++CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host +--- newlib-1.13.0/newlib/libc/sys/psp/Makefile.in 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/Makefile.in 2006-04-28 15:22:03.000000000 -0400 +@@ -0,0 +1,389 @@ ++# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am ++ ++# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++ ++SHELL = @SHELL@ ++ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++prefix = @prefix@ ++exec_prefix = @exec_prefix@ ++ ++bindir = @bindir@ ++sbindir = @sbindir@ ++libexecdir = @libexecdir@ ++datadir = @datadir@ ++sysconfdir = @sysconfdir@ ++sharedstatedir = @sharedstatedir@ ++localstatedir = @localstatedir@ ++libdir = @libdir@ ++infodir = @infodir@ ++mandir = @mandir@ ++includedir = @includedir@ ++oldincludedir = /usr/include ++ ++DESTDIR = ++ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++ ++top_builddir = . ++ ++ACLOCAL = @ACLOCAL@ ++AUTOCONF = @AUTOCONF@ ++AUTOMAKE = @AUTOMAKE@ ++AUTOHEADER = @AUTOHEADER@ ++ ++INSTALL = @INSTALL@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++transform = @program_transform_name@ ++ ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_alias = @build_alias@ ++build_triplet = @build@ ++host_alias = @host_alias@ ++host_triplet = @host@ ++target_alias = @target_alias@ ++target_triplet = @target@ ++AR = @AR@ ++AS = @AS@ ++CC = @CC@ ++CPP = @CPP@ ++EXEEXT = @EXEEXT@ ++HAVE_LIB = @HAVE_LIB@ ++LDFLAGS = @LDFLAGS@ ++LIB = @LIB@ ++LTLIB = @LTLIB@ ++MAINT = @MAINT@ ++MAKEINFO = @MAKEINFO@ ++NEWLIB_CFLAGS = @NEWLIB_CFLAGS@ ++OBJEXT = @OBJEXT@ ++PACKAGE = @PACKAGE@ ++RANLIB = @RANLIB@ ++VERSION = @VERSION@ ++aext = @aext@ ++libm_machine_dir = @libm_machine_dir@ ++machine_dir = @machine_dir@ ++newlib_basedir = @newlib_basedir@ ++oext = @oext@ ++sys_dir = @sys_dir@ ++ ++AUTOMAKE_OPTIONS = cygnus ++ ++INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) ++ ++noinst_LIBRARIES = lib.a ++ ++LIBCGLUE_MULT_OBJS = _close.o _exit.o _fork.o _fstat.o _getpid.o _gettimeofday.o _kill.o _lseek.o _open.o _read.o _sbrk.o _wait.o _write.o clock.o isatty.o time.o _link.o _unlink.o sleep.o opendir.o readdir.o closedir.o getcwd.o chdir.o mkdir.o rmdir.o realpath.o _stat.o truncate.o access.o tzset.o __psp_set_errno.o mlock.o _fcntl.o ++ ++ ++SOCKET_MULT_OBJS = socket.o accept.o bind.o connect.o getsockopt.o listen.o recv.o recvfrom.o send.o sendto.o setsockopt.o shutdown.o getsockname.o getpeername.o inet_ntoa.o ++ ++ ++PIPE_OBJS = pipe.o ++ ++FDMAN_OBJS = fdman.o ++ ++SELECT_OBJS = select.o ++ ++INTERRUPT_OBJS = interrupt.o ++ ++XPRINTF_MULT_OBJS = vxprintf.o _xprintf.o __sout.o vsnprintf.o snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o _sprintf_r.o ++ ++NETDB_MULT_OBJS = h_errno.o gethostbyaddr.o gethostbyname.o ++ ++lib_a_SOURCES = libcglue.c socket.c pspcwd.c xprintf.c netdb.c pipe.c fdman.c select.c interrupt.S ++lib_a_LIBADD = $(LIBCGLUE_MULT_OBJS) $(SOCKET_MULT_OBJS) $(XPRINTF_MULT_OBJS) $(NETDB_MULT_OBJS) $(PIPE_OBJS) $(FDMAN_OBJS) $(SELECT_OBJS) $(INTERRUPT_OBJS) ++ ++ ++ACLOCAL_AMFLAGS = -I ../../.. ++CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++mkinstalldirs = $(SHELL) $(top_srcdir)/../../../../mkinstalldirs ++CONFIG_CLEAN_FILES = ++LIBRARIES = $(noinst_LIBRARIES) ++ ++ ++DEFS = @DEFS@ -I. -I$(srcdir) ++CPPFLAGS = @CPPFLAGS@ ++LIBS = @LIBS@ ++lib_a_DEPENDENCIES = _close.o _exit.o _fork.o _fstat.o _getpid.o \ ++_gettimeofday.o _kill.o _lseek.o _open.o _read.o _sbrk.o _wait.o \ ++_write.o clock.o isatty.o time.o _link.o _unlink.o sleep.o opendir.o \ ++readdir.o closedir.o getcwd.o chdir.o mkdir.o rmdir.o realpath.o \ ++_stat.o truncate.o access.o tzset.o __psp_set_errno.o mlock.o _fcntl.o \ ++socket.o accept.o bind.o connect.o getsockopt.o listen.o recv.o \ ++recvfrom.o send.o sendto.o setsockopt.o shutdown.o getsockname.o \ ++getpeername.o inet_ntoa.o vxprintf.o _xprintf.o __sout.o vsnprintf.o \ ++snprintf.o vsprintf.o sprintf.o __mout.o mprintf.o vmprintf.o \ ++asprintf.o vasprintf.o __fout.o fprintf.o vfprintf.o printf.o vprintf.o \ ++_sprintf_r.o h_errno.o gethostbyaddr.o gethostbyname.o pipe.o fdman.o \ ++select.o interrupt.o ++lib_a_OBJECTS = libcglue.o socket.o pspcwd.o xprintf.o netdb.o pipe.o \ ++fdman.o select.o interrupt.o ++CFLAGS = @CFLAGS@ ++COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ ++DIST_COMMON = README Makefile.am Makefile.in aclocal.m4 configure \ ++configure.in ++ ++ ++DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ++ ++TAR = tar ++GZIP_ENV = --best ++SOURCES = $(lib_a_SOURCES) ++OBJECTS = $(lib_a_OBJECTS) ++ ++all: all-redirect ++.SUFFIXES: ++.SUFFIXES: .S .c .o .s ++$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) ++ cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile ++ ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ cd $(top_builddir) \ ++ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ++ ++$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in \ ++ ../../../acinclude.m4 ../../../aclocal.m4 \ ++ ../../../libtool.m4 ++ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) ++ ++config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ $(SHELL) ./config.status --recheck ++$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) ++ cd $(srcdir) && $(AUTOCONF) ++ ++mostlyclean-noinstLIBRARIES: ++ ++clean-noinstLIBRARIES: ++ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ++ ++distclean-noinstLIBRARIES: ++ ++maintainer-clean-noinstLIBRARIES: ++ ++.c.o: ++ $(COMPILE) -c $< ++ ++.s.o: ++ $(COMPILE) -c $< ++ ++.S.o: ++ $(COMPILE) -c $< ++ ++mostlyclean-compile: ++ -rm -f *.o core *.core ++ ++clean-compile: ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++maintainer-clean-compile: ++ ++lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES) ++ -rm -f lib.a ++ $(AR) cru lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD) ++ $(RANLIB) lib.a ++ ++tags: TAGS ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) ++ list='$(SOURCES) $(HEADERS)'; \ ++ unique=`for i in $$list; do echo $$i; done | \ ++ awk ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ here=`pwd` && cd $(srcdir) \ ++ && mkid -f$$here/ID $$unique $(LISP) ++ ++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS)'; \ ++ unique=`for i in $$list; do echo $$i; done | \ ++ awk ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ ++ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) ++ ++mostlyclean-tags: ++ ++clean-tags: ++ ++distclean-tags: ++ -rm -f TAGS ID ++ ++maintainer-clean-tags: ++ ++distdir = $(PACKAGE)-$(VERSION) ++top_distdir = $(distdir) ++ ++# This target untars the dist file and tries a VPATH configuration. Then ++# it guarantees that the distribution is self-contained by making another ++# tarfile. ++distcheck: dist ++ -rm -rf $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz ++ mkdir $(distdir)/=build ++ mkdir $(distdir)/=inst ++ dc_install_base=`cd $(distdir)/=inst && pwd`; \ ++ cd $(distdir)/=build \ ++ && ../configure --srcdir=.. --prefix=$$dc_install_base \ ++ && $(MAKE) $(AM_MAKEFLAGS) \ ++ && $(MAKE) $(AM_MAKEFLAGS) dvi \ ++ && $(MAKE) $(AM_MAKEFLAGS) check \ ++ && $(MAKE) $(AM_MAKEFLAGS) install \ ++ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ ++ && $(MAKE) $(AM_MAKEFLAGS) dist ++ -rm -rf $(distdir) ++ @banner="$(distdir).tar.gz is ready for distribution"; \ ++ dashes=`echo "$$banner" | sed s/./=/g`; \ ++ echo "$$dashes"; \ ++ echo "$$banner"; \ ++ echo "$$dashes" ++dist: distdir ++ -chmod -R a+r $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) ++ -rm -rf $(distdir) ++dist-all: distdir ++ -chmod -R a+r $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) ++ -rm -rf $(distdir) ++distdir: $(DISTFILES) ++ -rm -rf $(distdir) ++ mkdir $(distdir) ++ -chmod 777 $(distdir) ++ @for file in $(DISTFILES); do \ ++ if test -f $$file; then d=.; else d=$(srcdir); fi; \ ++ if test -d $$d/$$file; then \ ++ cp -pr $$d/$$file $(distdir)/$$file; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ ++ || cp -p $$d/$$file $(distdir)/$$file || :; \ ++ fi; \ ++ done ++info-am: ++info: info-am ++dvi-am: ++dvi: dvi-am ++check-am: ++check: check-am ++installcheck-am: ++installcheck: installcheck-am ++install-info-am: ++install-info: install-info-am ++install-exec-am: ++install-exec: install-exec-am ++ ++install-data-am: ++install-data: install-data-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++install: install-am ++uninstall-am: ++uninstall: uninstall-am ++all-am: Makefile $(LIBRARIES) ++all-redirect: all-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install ++installdirs: ++ ++ ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f config.cache config.log stamp-h stamp-h[0-9]* ++ ++maintainer-clean-generic: ++mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ ++ mostlyclean-tags mostlyclean-generic ++ ++mostlyclean: mostlyclean-am ++ ++clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ ++ mostlyclean-am ++ ++clean: clean-am ++ ++distclean-am: distclean-noinstLIBRARIES distclean-compile \ ++ distclean-tags distclean-generic clean-am ++ ++distclean: distclean-am ++ -rm -f config.status ++ ++maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ ++ maintainer-clean-compile maintainer-clean-tags \ ++ maintainer-clean-generic distclean-am ++ @echo "This command is intended for maintainers to use;" ++ @echo "it deletes files that may require special tools to rebuild." ++ ++maintainer-clean: maintainer-clean-am ++ -rm -f config.status ++ ++.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ ++clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ ++mostlyclean-compile distclean-compile clean-compile \ ++maintainer-clean-compile tags mostlyclean-tags distclean-tags \ ++clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ ++check-am installcheck-am installcheck install-info-am install-info \ ++install-exec-am install-exec install-data-am install-data install-am \ ++install uninstall-am uninstall all-redirect all-am all installdirs \ ++mostlyclean-generic distclean-generic clean-generic \ ++maintainer-clean-generic clean mostlyclean distclean maintainer-clean ++ ++ ++all: crt0.o ++ ++$(LIBCGLUE_MULT_OBJS): libcglue.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(SOCKET_MULT_OBJS): socket.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(XPRINTF_MULT_OBJS): xprintf.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(NETDB_MULT_OBJS): netdb.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(PIPE_OBJS): pipe.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(FDMAN_OBJS): fdman.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(SELECT_OBJS): select.c ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++$(INTERRUPT_OBJS): interrupt.S ++ $(COMPILE) -DF_$* $< -c -o $@ ++ ++# 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: +--- newlib-1.13.0/newlib/libc/sys/psp/README 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/README 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,16 @@ ++Newlib for PSP ++-- ++ ++This sys/psp directory depends on PSPSDK headers. It expects them to live in ++${prefix}/psp/sdk/include (see newlib/configure.host). ++ ++I used automake 1.4-p6 to generate aclocal.m4 and Makefile.in: ++ ++ aclocal -I ../../.. ++ automake --cygnus ++ ++Autoconf refused to work for me, so I copied configure from sys/sh and modified ++$ac_unique_file to point libcglue.c. ++ ++-- ++Marcus R. Brown +--- newlib-1.13.0/newlib/libc/sys/psp/aclocal.m4 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/aclocal.m4 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,1185 @@ ++dnl aclocal.m4 generated automatically by aclocal 1.4-p6 ++ ++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++dnl PARTICULAR PURPOSE. ++ ++# lib-prefix.m4 serial 4 (gettext-0.14.2) ++dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl From Bruno Haible. ++ ++dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and ++dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't ++dnl require excessive bracketing. ++ifdef([AC_HELP_STRING], ++[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], ++[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) ++ ++dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed ++dnl to access previously installed libraries. The basic assumption is that ++dnl a user will want packages to use other packages he previously installed ++dnl with the same --prefix option. ++dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate ++dnl libraries, but is otherwise very convenient. ++AC_DEFUN([AC_LIB_PREFIX], ++[ ++ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) ++ AC_REQUIRE([AC_PROG_CC]) ++ AC_REQUIRE([AC_CANONICAL_HOST]) ++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) ++ dnl By default, look in $includedir and $libdir. ++ use_additional=yes ++ AC_LIB_WITH_FINAL_PREFIX([ ++ eval additional_includedir=\"$includedir\" ++ eval additional_libdir=\"$libdir\" ++ ]) ++ AC_LIB_ARG_WITH([lib-prefix], ++[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib ++ --without-lib-prefix don't search for libraries in includedir and libdir], ++[ ++ if test "X$withval" = "Xno"; then ++ use_additional=no ++ else ++ if test "X$withval" = "X"; then ++ AC_LIB_WITH_FINAL_PREFIX([ ++ eval additional_includedir=\"$includedir\" ++ eval additional_libdir=\"$libdir\" ++ ]) ++ else ++ additional_includedir="$withval/include" ++ additional_libdir="$withval/lib" ++ fi ++ fi ++]) ++ if test $use_additional = yes; then ++ dnl Potentially add $additional_includedir to $CPPFLAGS. ++ dnl But don't add it ++ dnl 1. if it's the standard /usr/include, ++ dnl 2. if it's already present in $CPPFLAGS, ++ dnl 3. if it's /usr/local/include and we are using GCC on Linux, ++ dnl 4. if it doesn't exist as a directory. ++ if test "X$additional_includedir" != "X/usr/include"; then ++ haveit= ++ for x in $CPPFLAGS; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-I$additional_includedir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ if test "X$additional_includedir" = "X/usr/local/include"; then ++ if test -n "$GCC"; then ++ case $host_os in ++ linux* | gnu* | k*bsd*-gnu) haveit=yes;; ++ esac ++ fi ++ fi ++ if test -z "$haveit"; then ++ if test -d "$additional_includedir"; then ++ dnl Really add $additional_includedir to $CPPFLAGS. ++ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" ++ fi ++ fi ++ fi ++ fi ++ dnl Potentially add $additional_libdir to $LDFLAGS. ++ dnl But don't add it ++ dnl 1. if it's the standard /usr/lib, ++ dnl 2. if it's already present in $LDFLAGS, ++ dnl 3. if it's /usr/local/lib and we are using GCC on Linux, ++ dnl 4. if it doesn't exist as a directory. ++ if test "X$additional_libdir" != "X/usr/lib"; then ++ haveit= ++ for x in $LDFLAGS; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-L$additional_libdir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ if test "X$additional_libdir" = "X/usr/local/lib"; then ++ if test -n "$GCC"; then ++ case $host_os in ++ linux*) haveit=yes;; ++ esac ++ fi ++ fi ++ if test -z "$haveit"; then ++ if test -d "$additional_libdir"; then ++ dnl Really add $additional_libdir to $LDFLAGS. ++ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" ++ fi ++ fi ++ fi ++ fi ++ fi ++]) ++ ++dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, ++dnl acl_final_exec_prefix, containing the values to which $prefix and ++dnl $exec_prefix will expand at the end of the configure script. ++AC_DEFUN([AC_LIB_PREPARE_PREFIX], ++[ ++ dnl Unfortunately, prefix and exec_prefix get only finally determined ++ dnl at the end of configure. ++ if test "X$prefix" = "XNONE"; then ++ acl_final_prefix="$ac_default_prefix" ++ else ++ acl_final_prefix="$prefix" ++ fi ++ if test "X$exec_prefix" = "XNONE"; then ++ acl_final_exec_prefix='${prefix}' ++ else ++ acl_final_exec_prefix="$exec_prefix" ++ fi ++ acl_save_prefix="$prefix" ++ prefix="$acl_final_prefix" ++ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" ++ prefix="$acl_save_prefix" ++]) ++ ++dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the ++dnl variables prefix and exec_prefix bound to the values they will have ++dnl at the end of the configure script. ++AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], ++[ ++ acl_save_prefix="$prefix" ++ prefix="$acl_final_prefix" ++ acl_save_exec_prefix="$exec_prefix" ++ exec_prefix="$acl_final_exec_prefix" ++ $1 ++ exec_prefix="$acl_save_exec_prefix" ++ prefix="$acl_save_prefix" ++]) ++ ++# lib-link.m4 serial 6 (gettext-0.14.3) ++dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl From Bruno Haible. ++ ++AC_PREREQ(2.50) ++ ++dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and ++dnl the libraries corresponding to explicit and implicit dependencies. ++dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and ++dnl augments the CPPFLAGS variable. ++AC_DEFUN([AC_LIB_LINKFLAGS], ++[ ++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) ++ AC_REQUIRE([AC_LIB_RPATH]) ++ define([Name],[translit([$1],[./-], [___])]) ++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], ++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) ++ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ ++ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ++ ac_cv_lib[]Name[]_libs="$LIB[]NAME" ++ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ++ ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ++ ]) ++ LIB[]NAME="$ac_cv_lib[]Name[]_libs" ++ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" ++ INC[]NAME="$ac_cv_lib[]Name[]_cppflags" ++ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) ++ AC_SUBST([LIB]NAME) ++ AC_SUBST([LTLIB]NAME) ++ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the ++ dnl results of this search when this library appears as a dependency. ++ HAVE_LIB[]NAME=yes ++ undefine([Name]) ++ undefine([NAME]) ++]) ++ ++dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) ++dnl searches for libname and the libraries corresponding to explicit and ++dnl implicit dependencies, together with the specified include files and ++dnl the ability to compile and link the specified testcode. If found, it ++dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and ++dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and ++dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs ++dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. ++AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], ++[ ++ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) ++ AC_REQUIRE([AC_LIB_RPATH]) ++ define([Name],[translit([$1],[./-], [___])]) ++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], ++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) ++ ++ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME ++ dnl accordingly. ++ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ++ ++ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, ++ dnl because if the user has installed lib[]Name and not disabled its use ++ dnl via --without-lib[]Name-prefix, he wants to use it. ++ ac_save_CPPFLAGS="$CPPFLAGS" ++ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) ++ ++ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $LIB[]NAME" ++ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) ++ LIBS="$ac_save_LIBS" ++ ]) ++ if test "$ac_cv_lib[]Name" = yes; then ++ HAVE_LIB[]NAME=yes ++ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) ++ AC_MSG_CHECKING([how to link with lib[]$1]) ++ AC_MSG_RESULT([$LIB[]NAME]) ++ else ++ HAVE_LIB[]NAME=no ++ dnl If $LIB[]NAME didn't lead to a usable library, we don't need ++ dnl $INC[]NAME either. ++ CPPFLAGS="$ac_save_CPPFLAGS" ++ LIB[]NAME= ++ LTLIB[]NAME= ++ fi ++ AC_SUBST([HAVE_LIB]NAME) ++ AC_SUBST([LIB]NAME) ++ AC_SUBST([LTLIB]NAME) ++ undefine([Name]) ++ undefine([NAME]) ++]) ++ ++dnl Determine the platform dependent parameters needed to use rpath: ++dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, ++dnl hardcode_direct, hardcode_minus_L. ++AC_DEFUN([AC_LIB_RPATH], ++[ ++ dnl Tell automake >= 1.10 to complain if config.rpath is missing. ++ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) ++ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS ++ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld ++ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host ++ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir ++ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ ++ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ++ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh ++ . ./conftest.sh ++ rm -f ./conftest.sh ++ acl_cv_rpath=done ++ ]) ++ wl="$acl_cv_wl" ++ libext="$acl_cv_libext" ++ shlibext="$acl_cv_shlibext" ++ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" ++ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" ++ hardcode_direct="$acl_cv_hardcode_direct" ++ hardcode_minus_L="$acl_cv_hardcode_minus_L" ++ dnl Determine whether the user wants rpath handling at all. ++ AC_ARG_ENABLE(rpath, ++ [ --disable-rpath do not hardcode runtime library paths], ++ :, enable_rpath=yes) ++]) ++ ++dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and ++dnl the libraries corresponding to explicit and implicit dependencies. ++dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. ++AC_DEFUN([AC_LIB_LINKFLAGS_BODY], ++[ ++ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], ++ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) ++ dnl By default, look in $includedir and $libdir. ++ use_additional=yes ++ AC_LIB_WITH_FINAL_PREFIX([ ++ eval additional_includedir=\"$includedir\" ++ eval additional_libdir=\"$libdir\" ++ ]) ++ AC_LIB_ARG_WITH([lib$1-prefix], ++[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib ++ --without-lib$1-prefix don't search for lib$1 in includedir and libdir], ++[ ++ if test "X$withval" = "Xno"; then ++ use_additional=no ++ else ++ if test "X$withval" = "X"; then ++ AC_LIB_WITH_FINAL_PREFIX([ ++ eval additional_includedir=\"$includedir\" ++ eval additional_libdir=\"$libdir\" ++ ]) ++ else ++ additional_includedir="$withval/include" ++ additional_libdir="$withval/lib" ++ fi ++ fi ++]) ++ dnl Search the library and its dependencies in $additional_libdir and ++ dnl $LDFLAGS. Using breadth-first-seach. ++ LIB[]NAME= ++ LTLIB[]NAME= ++ INC[]NAME= ++ rpathdirs= ++ ltrpathdirs= ++ names_already_handled= ++ names_next_round='$1 $2' ++ while test -n "$names_next_round"; do ++ names_this_round="$names_next_round" ++ names_next_round= ++ for name in $names_this_round; do ++ already_handled= ++ for n in $names_already_handled; do ++ if test "$n" = "$name"; then ++ already_handled=yes ++ break ++ fi ++ done ++ if test -z "$already_handled"; then ++ names_already_handled="$names_already_handled $name" ++ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS ++ dnl or AC_LIB_HAVE_LINKFLAGS call. ++ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` ++ eval value=\"\$HAVE_LIB$uppername\" ++ if test -n "$value"; then ++ if test "$value" = yes; then ++ eval value=\"\$LIB$uppername\" ++ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" ++ eval value=\"\$LTLIB$uppername\" ++ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" ++ else ++ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined ++ dnl that this library doesn't exist. So just drop it. ++ : ++ fi ++ else ++ dnl Search the library lib$name in $additional_libdir and $LDFLAGS ++ dnl and the already constructed $LIBNAME/$LTLIBNAME. ++ found_dir= ++ found_la= ++ found_so= ++ found_a= ++ if test $use_additional = yes; then ++ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then ++ found_dir="$additional_libdir" ++ found_so="$additional_libdir/lib$name.$shlibext" ++ if test -f "$additional_libdir/lib$name.la"; then ++ found_la="$additional_libdir/lib$name.la" ++ fi ++ else ++ if test -f "$additional_libdir/lib$name.$libext"; then ++ found_dir="$additional_libdir" ++ found_a="$additional_libdir/lib$name.$libext" ++ if test -f "$additional_libdir/lib$name.la"; then ++ found_la="$additional_libdir/lib$name.la" ++ fi ++ fi ++ fi ++ fi ++ if test "X$found_dir" = "X"; then ++ for x in $LDFLAGS $LTLIB[]NAME; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ case "$x" in ++ -L*) ++ dir=`echo "X$x" | sed -e 's/^X-L//'` ++ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then ++ found_dir="$dir" ++ found_so="$dir/lib$name.$shlibext" ++ if test -f "$dir/lib$name.la"; then ++ found_la="$dir/lib$name.la" ++ fi ++ else ++ if test -f "$dir/lib$name.$libext"; then ++ found_dir="$dir" ++ found_a="$dir/lib$name.$libext" ++ if test -f "$dir/lib$name.la"; then ++ found_la="$dir/lib$name.la" ++ fi ++ fi ++ fi ++ ;; ++ esac ++ if test "X$found_dir" != "X"; then ++ break ++ fi ++ done ++ fi ++ if test "X$found_dir" != "X"; then ++ dnl Found the library. ++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" ++ if test "X$found_so" != "X"; then ++ dnl Linking with a shared library. We attempt to hardcode its ++ dnl directory into the executable's runpath, unless it's the ++ dnl standard /usr/lib. ++ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then ++ dnl No hardcoding is needed. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" ++ else ++ dnl Use an explicit option to hardcode DIR into the resulting ++ dnl binary. ++ dnl Potentially add DIR to ltrpathdirs. ++ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. ++ haveit= ++ for x in $ltrpathdirs; do ++ if test "X$x" = "X$found_dir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ ltrpathdirs="$ltrpathdirs $found_dir" ++ fi ++ dnl The hardcoding into $LIBNAME is system dependent. ++ if test "$hardcode_direct" = yes; then ++ dnl Using DIR/libNAME.so during linking hardcodes DIR into the ++ dnl resulting binary. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" ++ else ++ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then ++ dnl Use an explicit option to hardcode DIR into the resulting ++ dnl binary. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" ++ dnl Potentially add DIR to rpathdirs. ++ dnl The rpathdirs will be appended to $LIBNAME at the end. ++ haveit= ++ for x in $rpathdirs; do ++ if test "X$x" = "X$found_dir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ rpathdirs="$rpathdirs $found_dir" ++ fi ++ else ++ dnl Rely on "-L$found_dir". ++ dnl But don't add it if it's already contained in the LDFLAGS ++ dnl or the already constructed $LIBNAME ++ haveit= ++ for x in $LDFLAGS $LIB[]NAME; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-L$found_dir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" ++ fi ++ if test "$hardcode_minus_L" != no; then ++ dnl FIXME: Not sure whether we should use ++ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" ++ dnl here. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" ++ else ++ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH ++ dnl here, because this doesn't fit in flags passed to the ++ dnl compiler. So give up. No hardcoding. This affects only ++ dnl very old systems. ++ dnl FIXME: Not sure whether we should use ++ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" ++ dnl here. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" ++ fi ++ fi ++ fi ++ fi ++ else ++ if test "X$found_a" != "X"; then ++ dnl Linking with a static library. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" ++ else ++ dnl We shouldn't come here, but anyway it's good to have a ++ dnl fallback. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" ++ fi ++ fi ++ dnl Assume the include files are nearby. ++ additional_includedir= ++ case "$found_dir" in ++ */lib | */lib/) ++ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` ++ additional_includedir="$basedir/include" ++ ;; ++ esac ++ if test "X$additional_includedir" != "X"; then ++ dnl Potentially add $additional_includedir to $INCNAME. ++ dnl But don't add it ++ dnl 1. if it's the standard /usr/include, ++ dnl 2. if it's /usr/local/include and we are using GCC on Linux, ++ dnl 3. if it's already present in $CPPFLAGS or the already ++ dnl constructed $INCNAME, ++ dnl 4. if it doesn't exist as a directory. ++ if test "X$additional_includedir" != "X/usr/include"; then ++ haveit= ++ if test "X$additional_includedir" = "X/usr/local/include"; then ++ if test -n "$GCC"; then ++ case $host_os in ++ linux* | gnu* | k*bsd*-gnu) haveit=yes;; ++ esac ++ fi ++ fi ++ if test -z "$haveit"; then ++ for x in $CPPFLAGS $INC[]NAME; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-I$additional_includedir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ if test -d "$additional_includedir"; then ++ dnl Really add $additional_includedir to $INCNAME. ++ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" ++ fi ++ fi ++ fi ++ fi ++ fi ++ dnl Look for dependencies. ++ if test -n "$found_la"; then ++ dnl Read the .la file. It defines the variables ++ dnl dlname, library_names, old_library, dependency_libs, current, ++ dnl age, revision, installed, dlopen, dlpreopen, libdir. ++ save_libdir="$libdir" ++ case "$found_la" in ++ */* | *\\*) . "$found_la" ;; ++ *) . "./$found_la" ;; ++ esac ++ libdir="$save_libdir" ++ dnl We use only dependency_libs. ++ for dep in $dependency_libs; do ++ case "$dep" in ++ -L*) ++ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` ++ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. ++ dnl But don't add it ++ dnl 1. if it's the standard /usr/lib, ++ dnl 2. if it's /usr/local/lib and we are using GCC on Linux, ++ dnl 3. if it's already present in $LDFLAGS or the already ++ dnl constructed $LIBNAME, ++ dnl 4. if it doesn't exist as a directory. ++ if test "X$additional_libdir" != "X/usr/lib"; then ++ haveit= ++ if test "X$additional_libdir" = "X/usr/local/lib"; then ++ if test -n "$GCC"; then ++ case $host_os in ++ linux* | gnu* | k*bsd*-gnu) haveit=yes;; ++ esac ++ fi ++ fi ++ if test -z "$haveit"; then ++ haveit= ++ for x in $LDFLAGS $LIB[]NAME; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-L$additional_libdir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ if test -d "$additional_libdir"; then ++ dnl Really add $additional_libdir to $LIBNAME. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" ++ fi ++ fi ++ haveit= ++ for x in $LDFLAGS $LTLIB[]NAME; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X-L$additional_libdir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ if test -d "$additional_libdir"; then ++ dnl Really add $additional_libdir to $LTLIBNAME. ++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" ++ fi ++ fi ++ fi ++ fi ++ ;; ++ -R*) ++ dir=`echo "X$dep" | sed -e 's/^X-R//'` ++ if test "$enable_rpath" != no; then ++ dnl Potentially add DIR to rpathdirs. ++ dnl The rpathdirs will be appended to $LIBNAME at the end. ++ haveit= ++ for x in $rpathdirs; do ++ if test "X$x" = "X$dir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ rpathdirs="$rpathdirs $dir" ++ fi ++ dnl Potentially add DIR to ltrpathdirs. ++ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. ++ haveit= ++ for x in $ltrpathdirs; do ++ if test "X$x" = "X$dir"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ ltrpathdirs="$ltrpathdirs $dir" ++ fi ++ fi ++ ;; ++ -l*) ++ dnl Handle this in the next round. ++ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ++ ;; ++ *.la) ++ dnl Handle this in the next round. Throw away the .la's ++ dnl directory; it is already contained in a preceding -L ++ dnl option. ++ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ++ ;; ++ *) ++ dnl Most likely an immediate library name. ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" ++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ++ ;; ++ esac ++ done ++ fi ++ else ++ dnl Didn't find the library; assume it is in the system directories ++ dnl known to the linker and runtime loader. (All the system ++ dnl directories known to the linker should also be known to the ++ dnl runtime loader, otherwise the system is severely misconfigured.) ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" ++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" ++ fi ++ fi ++ fi ++ done ++ done ++ if test "X$rpathdirs" != "X"; then ++ if test -n "$hardcode_libdir_separator"; then ++ dnl Weird platform: only the last -rpath option counts, the user must ++ dnl pass all path elements in one option. We can arrange that for a ++ dnl single library, but not when more than one $LIBNAMEs are used. ++ alldirs= ++ for found_dir in $rpathdirs; do ++ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" ++ done ++ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. ++ acl_save_libdir="$libdir" ++ libdir="$alldirs" ++ eval flag=\"$hardcode_libdir_flag_spec\" ++ libdir="$acl_save_libdir" ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" ++ else ++ dnl The -rpath options are cumulative. ++ for found_dir in $rpathdirs; do ++ acl_save_libdir="$libdir" ++ libdir="$found_dir" ++ eval flag=\"$hardcode_libdir_flag_spec\" ++ libdir="$acl_save_libdir" ++ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" ++ done ++ fi ++ fi ++ if test "X$ltrpathdirs" != "X"; then ++ dnl When using libtool, the option that works for both libraries and ++ dnl executables is -R. The -R options are cumulative. ++ for found_dir in $ltrpathdirs; do ++ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" ++ done ++ fi ++]) ++ ++dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, ++dnl unless already present in VAR. ++dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes ++dnl contains two or three consecutive elements that belong together. ++AC_DEFUN([AC_LIB_APPENDTOVAR], ++[ ++ for element in [$2]; do ++ haveit= ++ for x in $[$1]; do ++ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) ++ if test "X$x" = "X$element"; then ++ haveit=yes ++ break ++ fi ++ done ++ if test -z "$haveit"; then ++ [$1]="${[$1]}${[$1]:+ }$element" ++ fi ++ done ++]) ++ ++# lib-ld.m4 serial 3 (gettext-0.13) ++dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl Subroutines of libtool.m4, ++dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision ++dnl with libtool.m4. ++ ++dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. ++AC_DEFUN([AC_LIB_PROG_LD_GNU], ++[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, ++[# I'd rather use --version here, but apparently some GNU ld's only accept -v. ++case `$LD -v 2>&1 conf$$.sh ++ echo "exit 0" >>conf$$.sh ++ chmod +x conf$$.sh ++ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then ++ PATH_SEPARATOR=';' ++ else ++ PATH_SEPARATOR=: ++ fi ++ rm -f conf$$.sh ++fi ++ac_prog=ld ++if test "$GCC" = yes; then ++ # Check if gcc -print-prog-name=ld gives a path. ++ AC_MSG_CHECKING([for ld used by GCC]) ++ case $host in ++ *-*-mingw*) ++ # gcc leaves a trailing carriage return which upsets mingw ++ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; ++ *) ++ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; ++ esac ++ case $ac_prog in ++ # Accept absolute paths. ++ [[\\/]* | [A-Za-z]:[\\/]*)] ++ [re_direlt='/[^/][^/]*/\.\./'] ++ # Canonicalize the path of ld ++ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` ++ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ++ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` ++ done ++ test -z "$LD" && LD="$ac_prog" ++ ;; ++ "") ++ # If it fails, then pretend we aren't using GCC. ++ ac_prog=ld ++ ;; ++ *) ++ # If it is relative, then search for the first ld in PATH. ++ with_gnu_ld=unknown ++ ;; ++ esac ++elif test "$with_gnu_ld" = yes; then ++ AC_MSG_CHECKING([for GNU ld]) ++else ++ AC_MSG_CHECKING([for non-GNU ld]) ++fi ++AC_CACHE_VAL(acl_cv_path_LD, ++[if test -z "$LD"; then ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" ++ for ac_dir in $PATH; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then ++ acl_cv_path_LD="$ac_dir/$ac_prog" ++ # Check to see if the program is GNU ld. I'd rather use --version, ++ # but apparently some GNU ld's only accept -v. ++ # Break only if it was the GNU/non-GNU ld that we prefer. ++ case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in ++ *GNU* | *'with BFD'*) ++ test "$with_gnu_ld" != no && break ;; ++ *) ++ test "$with_gnu_ld" != yes && break ;; ++ esac ++ fi ++ done ++ IFS="$ac_save_ifs" ++else ++ acl_cv_path_LD="$LD" # Let the user override the test with a path. ++fi]) ++LD="$acl_cv_path_LD" ++if test -n "$LD"; then ++ AC_MSG_RESULT($LD) ++else ++ AC_MSG_RESULT(no) ++fi ++test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) ++AC_LIB_PROG_LD_GNU ++]) ++ ++dnl This provides configure definitions used by all the newlib ++dnl configure.in files. ++ ++dnl Basic newlib configury. This calls basic introductory stuff, ++dnl including AM_INIT_AUTOMAKE and AC_CANONICAL_HOST. It also runs ++dnl configure.host. The only argument is the relative path to the top ++dnl newlib directory. ++ ++AC_DEFUN(NEWLIB_CONFIGURE, ++[ ++dnl Default to --enable-multilib ++AC_ARG_ENABLE(multilib, ++[ --enable-multilib build many library versions (default)], ++[case "${enableval}" in ++ yes) multilib=yes ;; ++ no) multilib=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; ++ esac], [multilib=yes])dnl ++ ++dnl Support --enable-target-optspace ++AC_ARG_ENABLE(target-optspace, ++[ --enable-target-optspace optimize for space], ++[case "${enableval}" in ++ yes) target_optspace=yes ;; ++ no) target_optspace=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for target-optspace option) ;; ++ esac], [target_optspace=])dnl ++ ++dnl Support --enable-malloc-debugging - currently only supported for Cygwin ++AC_ARG_ENABLE(malloc-debugging, ++[ --enable-malloc-debugging indicate malloc debugging requested], ++[case "${enableval}" in ++ yes) malloc_debugging=yes ;; ++ no) malloc_debugging=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for malloc-debugging option) ;; ++ esac], [malloc_debugging=])dnl ++ ++dnl Support --enable-newlib-multithread ++AC_ARG_ENABLE(newlib-multithread, ++[ --enable-newlib-multithread enable support for multiple threads], ++[case "${enableval}" in ++ yes) newlib_multithread=yes ;; ++ no) newlib_multithread=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-multithread option) ;; ++ esac], [newlib_multithread=yes])dnl ++ ++dnl Support --enable-newlib-iconv ++AC_ARG_ENABLE(newlib-iconv, ++[ --enable-newlib-iconv enable iconv library support], ++[if test "${newlib_iconv+set}" != set; then ++ case "${enableval}" in ++ yes) newlib_iconv=yes ;; ++ no) newlib_iconv=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-iconv option) ;; ++ esac ++ fi], [newlib_iconv=${newlib_iconv}])dnl ++ ++dnl Support --enable-newlib-elix-level ++AC_ARG_ENABLE(newlib-elix-level, ++[ --enable-newlib-elix-level supply desired elix library level (1-4)], ++[case "${enableval}" in ++ 0) newlib_elix_level=0 ;; ++ 1) newlib_elix_level=1 ;; ++ 2) newlib_elix_level=2 ;; ++ 3) newlib_elix_level=3 ;; ++ 4) newlib_elix_level=4 ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-elix-level option) ;; ++ esac], [newlib_elix_level=0])dnl ++ ++dnl Support --disable-newlib-io-float ++AC_ARG_ENABLE(newlib-io-float, ++[ --disable-newlib-io-float disable printf/scanf family float support], ++[case "${enableval}" in ++ yes) newlib_io_float=yes ;; ++ no) newlib_io_float=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-io-float option) ;; ++ esac], [newlib_io_float=yes])dnl ++ ++dnl Support --disable-newlib-supplied-syscalls ++AC_ARG_ENABLE(newlib-supplied-syscalls, ++[ --disable-newlib-supplied-syscalls disable newlib from supplying syscalls], ++[case "${enableval}" in ++ yes) newlib_may_supply_syscalls=yes ;; ++ no) newlib_may_supply_syscalls=no ;; ++ *) AC_MSG_ERROR(bad value ${enableval} for newlib-supplied-syscalls option) ;; ++ esac], [newlib_may_supply_syscalls=yes])dnl ++ ++AM_CONDITIONAL(MAY_SUPPLY_SYSCALLS, test x[$]{newlib_may_supply_syscalls} = xyes) ++ ++dnl We may get other options which we don't document: ++dnl --with-target-subdir, --with-multisrctop, --with-multisubdir ++ ++test -z "[$]{with_target_subdir}" && with_target_subdir=. ++ ++if test "[$]{srcdir}" = "."; then ++ if test "[$]{with_target_subdir}" != "."; then ++ newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" ++ else ++ newlib_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" ++ fi ++else ++ newlib_basedir="[$]{srcdir}/$1" ++fi ++AC_SUBST(newlib_basedir) ++ ++AC_CANONICAL_SYSTEM ++ ++AM_INIT_AUTOMAKE(newlib, 1.13.0) ++ ++# FIXME: We temporarily define our own version of AC_PROG_CC. This is ++# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We ++# are probably using a cross compiler, which will not be able to fully ++# link an executable. This should really be fixed in autoconf ++# itself. ++ ++AC_DEFUN(LIB_AC_PROG_CC, ++[AC_BEFORE([$0], [AC_PROG_CPP])dnl ++AC_CHECK_PROG(CC, gcc, gcc) ++if test -z "$CC"; then ++ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) ++ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) ++fi ++ ++AC_PROG_CC_GNU ++ ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++dnl Check whether -g works, even if CFLAGS is set, in case the package ++dnl plays around with CFLAGS (such as to build both debugging and ++dnl normal versions of a library), tasteless as that idea is. ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS= ++ AC_PROG_CC_G ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ elif test $ac_cv_prog_cc_g = yes; then ++ CFLAGS="-g -O2" ++ else ++ CFLAGS="-O2" ++ fi ++else ++ GCC= ++ test "${CFLAGS+set}" = set || CFLAGS="-g" ++fi ++]) ++ ++LIB_AC_PROG_CC ++ ++AC_CHECK_TOOL(AS, as) ++AC_CHECK_TOOL(AR, ar) ++AC_CHECK_TOOL(RANLIB, ranlib, :) ++ ++AC_PROG_INSTALL ++ ++AM_MAINTAINER_MODE ++ ++# We need AC_EXEEXT to keep automake happy in cygnus mode. However, ++# at least currently, we never actually build a program, so we never ++# need to use $(EXEEXT). Moreover, the test for EXEEXT normally ++# fails, because we are probably configuring with a cross compiler ++# which can't create executables. So we include AC_EXEEXT to keep ++# automake happy, but we don't execute it, since we don't care about ++# the result. ++if false; then ++ AC_EXEEXT ++fi ++ ++. [$]{newlib_basedir}/configure.host ++ ++newlib_cflags="[$]{newlib_cflags} -fno-builtin" ++ ++NEWLIB_CFLAGS=${newlib_cflags} ++AC_SUBST(NEWLIB_CFLAGS) ++ ++LDFLAGS=${ldflags} ++AC_SUBST(LDFLAGS) ++ ++AM_CONDITIONAL(ELIX_LEVEL_0, test x[$]{newlib_elix_level} = x0) ++AM_CONDITIONAL(ELIX_LEVEL_1, test x[$]{newlib_elix_level} = x1) ++AM_CONDITIONAL(ELIX_LEVEL_2, test x[$]{newlib_elix_level} = x2) ++AM_CONDITIONAL(ELIX_LEVEL_3, test x[$]{newlib_elix_level} = x3) ++AM_CONDITIONAL(ELIX_LEVEL_4, test x[$]{newlib_elix_level} = x4) ++ ++AM_CONDITIONAL(USE_LIBTOOL, test x[$]{use_libtool} = xyes) ++ ++# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we ++# use oext, which is set in configure.host based on the target platform. ++OBJEXT=${oext} ++ ++AC_SUBST(OBJEXT) ++AC_SUBST(oext) ++AC_SUBST(aext) ++ ++AC_SUBST(libm_machine_dir) ++AC_SUBST(machine_dir) ++AC_SUBST(sys_dir) ++]) ++ ++# Do all the work for Automake. This macro actually does too much -- ++# some checks are only needed if your package does certain things. ++# But this isn't really a big deal. ++ ++# serial 1 ++ ++dnl Usage: ++dnl AM_INIT_AUTOMAKE(package,version, [no-define]) ++ ++AC_DEFUN([AM_INIT_AUTOMAKE], ++[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl ++AC_REQUIRE([AC_PROG_INSTALL]) ++PACKAGE=[$1] ++AC_SUBST(PACKAGE) ++VERSION=[$2] ++AC_SUBST(VERSION) ++dnl test to see if srcdir already configured ++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then ++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) ++fi ++ifelse([$3],, ++AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) ++AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) ++AC_REQUIRE([AM_SANITY_CHECK]) ++AC_REQUIRE([AC_ARG_PROGRAM]) ++dnl FIXME This is truly gross. ++missing_dir=`cd $ac_aux_dir && pwd` ++AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}, $missing_dir) ++AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) ++AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}, $missing_dir) ++AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) ++AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) ++AC_REQUIRE([AC_PROG_MAKE_SET])]) ++ ++# Copyright 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 ++ ++# AM_AUTOMAKE_VERSION(VERSION) ++# ---------------------------- ++# Automake X.Y traces this macro to ensure aclocal.m4 has been ++# generated from the m4 files accompanying Automake X.Y. ++AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.4"]) ++ ++# AM_SET_CURRENT_AUTOMAKE_VERSION ++# ------------------------------- ++# Call AM_AUTOMAKE_VERSION so it can be traced. ++# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. ++AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], ++ [AM_AUTOMAKE_VERSION([1.4-p6])]) ++ ++# ++# Check to make sure that the build environment is sane. ++# ++ ++AC_DEFUN([AM_SANITY_CHECK], ++[AC_MSG_CHECKING([whether build environment is sane]) ++# Just in case ++sleep 1 ++echo timestamp > conftestfile ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` ++ if test "[$]*" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftestfile` ++ fi ++ if test "[$]*" != "X $srcdir/configure conftestfile" \ ++ && test "[$]*" != "X conftestfile $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken ++alias in your environment]) ++ fi ++ ++ test "[$]2" = conftestfile ++ ) ++then ++ # Ok. ++ : ++else ++ AC_MSG_ERROR([newly created file is older than distributed files! ++Check your system clock]) ++fi ++rm -f conftest* ++AC_MSG_RESULT(yes)]) ++ ++dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) ++dnl The program must properly implement --version. ++AC_DEFUN([AM_MISSING_PROG], ++[AC_MSG_CHECKING(for working $2) ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if ($2 --version) < /dev/null > /dev/null 2>&1; then ++ $1=$2 ++ AC_MSG_RESULT(found) ++else ++ $1="$3/missing $2" ++ AC_MSG_RESULT(missing) ++fi ++AC_SUBST($1)]) ++ ++# Define a conditional. ++ ++AC_DEFUN([AM_CONDITIONAL], ++[AC_SUBST($1_TRUE) ++AC_SUBST($1_FALSE) ++if $2; then ++ $1_TRUE= ++ $1_FALSE='#' ++else ++ $1_TRUE='#' ++ $1_FALSE= ++fi]) ++ ++# Add --enable-maintainer-mode option to configure. ++# From Jim Meyering ++ ++# serial 1 ++ ++AC_DEFUN([AM_MAINTAINER_MODE], ++[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) ++ dnl maintainer-mode is disabled by default ++ AC_ARG_ENABLE(maintainer-mode, ++[ --enable-maintainer-mode enable make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer], ++ USE_MAINTAINER_MODE=$enableval, ++ USE_MAINTAINER_MODE=no) ++ AC_MSG_RESULT($USE_MAINTAINER_MODE) ++ AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) ++ MAINT=$MAINTAINER_MODE_TRUE ++ AC_SUBST(MAINT)dnl ++] ++) ++ +--- newlib-1.13.0/newlib/libc/sys/psp/arpa/inet.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/arpa/inet.h 2006-05-02 11:27:30.000000000 -0400 +@@ -0,0 +1,26 @@ ++/* arpa/inet.h - Functions for converting IP addresses between strings and numbers */ ++ ++#ifndef _ARPA_INET_H_ ++#define _ARPA_INET_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++in_addr_t sceNetInetInetAddr(const char *ip); ++int sceNetInetInetAton(const char *ip, struct in_addr *in); ++const char* sceNetInetInetNtop(int af, const void *src, char *dst, socklen_t cnt); ++int sceNetInetInetPton(int af, const char *src, void *dst); ++ ++char *inet_ntoa(struct in_addr in); ++#define inet_addr sceNetInetInetAddr ++#define inet_aton sceNetInetInetAton ++#define inet_ntop sceNetInetInetNtop ++#define inet_pton sceNetInetInetPton ++ ++#ifdef __cplusplus ++} ++#endif ++#endif /* _ARPA_INET_H_ */ +--- newlib-1.13.0/newlib/libc/sys/psp/confdefs.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/confdefs.h 2005-10-12 15:36:20.000000000 -0400 +@@ -0,0 +1 @@ ++ +--- newlib-1.13.0/newlib/libc/sys/psp/configure 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/configure 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,1880 @@ ++#! /bin/sh ++ ++# Guess values for system-dependent variables and create Makefiles. ++# Generated automatically using autoconf version 2.13 ++# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. ++# ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++ ++# Defaults: ++ac_help= ++ac_default_prefix=/usr/local ++# Any additions from configure.in: ++ac_help="$ac_help ++ --enable-multilib build many library versions (default)" ++ac_help="$ac_help ++ --enable-target-optspace optimize for space" ++ac_help="$ac_help ++ --enable-malloc-debugging indicate malloc debugging requested" ++ac_help="$ac_help ++ --enable-newlib-multithread enable support for multiple threads" ++ac_help="$ac_help ++ --enable-newlib-iconv enable iconv library support" ++ac_help="$ac_help ++ --enable-newlib-elix-level supply desired elix library level (1-4)" ++ac_help="$ac_help ++ --disable-newlib-io-float disable printf/scanf family float support" ++ac_help="$ac_help ++ --disable-newlib-supplied-syscalls disable newlib from supplying syscalls" ++ac_help="$ac_help ++ --enable-maintainer-mode enable make rules and dependencies not useful ++ (and sometimes confusing) to the casual installer" ++ ++# Initialize some variables set by options. ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++build=NONE ++cache_file=./config.cache ++exec_prefix=NONE ++host=NONE ++no_create= ++nonopt=NONE ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++target=NONE ++verbose= ++x_includes=NONE ++x_libraries=NONE ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datadir='${prefix}/share' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++libdir='${exec_prefix}/lib' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++infodir='${prefix}/info' ++mandir='${prefix}/man' ++ ++# Initialize some other variables. ++subdirs= ++MFLAGS= MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++# Maximum number of lines to put in a shell here document. ++ac_max_here_lines=12 ++ ++ac_prev= ++for ac_option ++do ++ ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval "$ac_prev=\$ac_option" ++ ac_prev= ++ continue ++ fi ++ ++ case "$ac_option" in ++ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; ++ *) ac_optarg= ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case "$ac_option" in ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir="$ac_optarg" ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build="$ac_optarg" ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file="$ac_optarg" ;; ++ ++ -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ ++ | --da=*) ++ datadir="$ac_optarg" ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ eval "enable_${ac_feature}=no" ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "enable_${ac_feature}='$ac_optarg'" ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix="$ac_optarg" ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he) ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat << EOF ++Usage: configure [options] [host] ++Options: [defaults in brackets after descriptions] ++Configuration: ++ --cache-file=FILE cache test results in FILE ++ --help print this message ++ --no-create do not create output files ++ --quiet, --silent do not print \`checking...' messages ++ --version print the version of autoconf that created configure ++Directory and file names: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [same as prefix] ++ --bindir=DIR user executables in DIR [EPREFIX/bin] ++ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] ++ --libexecdir=DIR program executables in DIR [EPREFIX/libexec] ++ --datadir=DIR read-only architecture-independent data in DIR ++ [PREFIX/share] ++ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data in DIR ++ [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] ++ --libdir=DIR object code libraries in DIR [EPREFIX/lib] ++ --includedir=DIR C header files in DIR [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] ++ --infodir=DIR info documentation in DIR [PREFIX/info] ++ --mandir=DIR man documentation in DIR [PREFIX/man] ++ --srcdir=DIR find the sources in DIR [configure dir or ..] ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM ++ run sed PROGRAM on installed program names ++EOF ++ cat << EOF ++Host type: ++ --build=BUILD configure for building on BUILD [BUILD=HOST] ++ --host=HOST configure for HOST [guessed] ++ --target=TARGET configure for TARGET [TARGET=HOST] ++Features and packages: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --x-includes=DIR X include files are in DIR ++ --x-libraries=DIR X library files are in DIR ++EOF ++ if test -n "$ac_help"; then ++ echo "--enable and --with options recognized:$ac_help" ++ fi ++ exit 0 ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host="$ac_optarg" ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir="$ac_optarg" ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir="$ac_optarg" ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir="$ac_optarg" ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir="$ac_optarg" ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst \ ++ | --locals | --local | --loca | --loc | --lo) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ ++ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) ++ localstatedir="$ac_optarg" ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir="$ac_optarg" ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir="$ac_optarg" ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix="$ac_optarg" ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix="$ac_optarg" ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix="$ac_optarg" ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name="$ac_optarg" ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir="$ac_optarg" ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir="$ac_optarg" ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site="$ac_optarg" ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir="$ac_optarg" ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir="$ac_optarg" ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target="$ac_optarg" ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers) ++ echo "configure generated by autoconf version 2.13" ++ exit 0 ;; ++ ++ -with-* | --with-*) ++ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "with_${ac_package}='$ac_optarg'" ;; ++ ++ -without-* | --without-*) ++ ac_package=`echo $ac_option|sed -e 's/-*without-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ eval "with_${ac_package}=no" ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes="$ac_optarg" ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries="$ac_optarg" ;; ++ ++ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ++ ;; ++ ++ *) ++ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then ++ echo "configure: warning: $ac_option: invalid host type" 1>&2 ++ fi ++ if test "x$nonopt" != xNONE; then ++ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ++ fi ++ nonopt="$ac_option" ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } ++fi ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++# File descriptor usage: ++# 0 standard input ++# 1 file creation ++# 2 errors and warnings ++# 3 some systems may open it to /dev/tty ++# 4 used on the Kubota Titan ++# 6 checking for... messages and results ++# 5 compiler messages saved in config.log ++if test "$silent" = yes; then ++ exec 6>/dev/null ++else ++ exec 6>&1 ++fi ++exec 5>./config.log ++ ++echo "\ ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++" 1>&5 ++ ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Also quote any args containing shell metacharacters. ++ac_configure_args= ++for ac_arg ++do ++ case "$ac_arg" in ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ;; ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ++ ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ *) ac_configure_args="$ac_configure_args $ac_arg" ;; ++ esac ++done ++ ++# NLS nuisances. ++# Only set these to C if already set. These must not be set unconditionally ++# because not all systems understand e.g. LANG=C (notably SCO). ++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ++# Non-C LC_CTYPE values break the ctype check. ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi ++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -rf conftest* confdefs.h ++# AIX cpp loses on an empty file, so make sure it contains at least a newline. ++echo > confdefs.h ++ ++# A filename unique to this package, relative to the directory that ++# configure is in, which we can look for to find out if srcdir is correct. ++ac_unique_file=libcglue.c ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then its parent. ++ ac_prog=$0 ++ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` ++ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. ++ srcdir=$ac_confdir ++ if test ! -r $srcdir/$ac_unique_file; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r $srcdir/$ac_unique_file; then ++ if test "$ac_srcdir_defaulted" = yes; then ++ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } ++ else ++ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } ++ fi ++fi ++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` ++ ++# Prefer explicitly selected file to automatically selected ones. ++if test -z "$CONFIG_SITE"; then ++ if test "x$prefix" != xNONE; then ++ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ++ else ++ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ++ fi ++fi ++for ac_site_file in $CONFIG_SITE; do ++ if test -r "$ac_site_file"; then ++ echo "loading site script $ac_site_file" ++ . "$ac_site_file" ++ fi ++done ++ ++if test -r "$cache_file"; then ++ echo "loading cache $cache_file" ++ . $cache_file ++else ++ echo "creating cache $cache_file" ++ > $cache_file ++fi ++ ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cc_cross ++ ++ac_exeext= ++ac_objext=o ++if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then ++ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. ++ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ++ ac_n= ac_c=' ++' ac_t=' ' ++ else ++ ac_n=-n ac_c= ac_t= ++ fi ++else ++ ac_n= ac_c='\c' ac_t= ++fi ++ ++ ++ ++ac_aux_dir= ++for ac_dir in ../../../.. $srcdir/../../../..; do ++ if test -f $ac_dir/install-sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f $ac_dir/install.sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ fi ++done ++if test -z "$ac_aux_dir"; then ++ { echo "configure: error: can not find install-sh or install.sh in ../../../.. $srcdir/../../../.." 1>&2; exit 1; } ++fi ++ac_config_guess=$ac_aux_dir/config.guess ++ac_config_sub=$ac_aux_dir/config.sub ++ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. ++ ++ ++am__api_version="1.4" ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# ./install, which can be erroneously created by make from ./install.sh. ++echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ++echo "configure:578: checking for a BSD compatible install" >&5 ++if test -z "$INSTALL"; then ++if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" ++ for ac_dir in $PATH; do ++ # Account for people who put trailing slashes in PATH elements. ++ case "$ac_dir/" in ++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ if test -f $ac_dir/$ac_prog; then ++ if test $ac_prog = install && ++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ else ++ ac_cv_path_install="$ac_dir/$ac_prog -c" ++ break 2 ++ fi ++ fi ++ done ++ ;; ++ esac ++ done ++ IFS="$ac_save_IFS" ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL="$ac_cv_path_install" ++ else ++ # As a last resort, use the slow shell script. We don't cache a ++ # path for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the path is relative. ++ INSTALL="$ac_install_sh" ++ fi ++fi ++echo "$ac_t""$INSTALL" 1>&6 ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ++echo "configure:631: checking whether build environment is sane" >&5 ++# Just in case ++sleep 1 ++echo timestamp > conftestfile ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` ++ if test "$*" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftestfile` ++ fi ++ if test "$*" != "X $srcdir/configure conftestfile" \ ++ && test "$*" != "X conftestfile $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" 1>&2; exit 1; } ++ fi ++ ++ test "$2" = conftestfile ++ ) ++then ++ # Ok. ++ : ++else ++ { echo "configure: error: newly created file is older than distributed files! ++Check your system clock" 1>&2; exit 1; } ++fi ++rm -f conftest* ++echo "$ac_t""yes" 1>&6 ++if test "$program_transform_name" = s,x,x,; then ++ program_transform_name= ++else ++ # Double any \ or $. echo might interpret backslashes. ++ cat <<\EOF_SED > conftestsed ++s,\\,\\\\,g; s,\$,$$,g ++EOF_SED ++ program_transform_name="`echo $program_transform_name|sed -f conftestsed`" ++ rm -f conftestsed ++fi ++test "$program_prefix" != NONE && ++ program_transform_name="s,^,${program_prefix},; $program_transform_name" ++# Use a double $ so make ignores it. ++test "$program_suffix" != NONE && ++ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" ++ ++# sed with no file args requires a program. ++test "$program_transform_name" = "" && program_transform_name="s,x,x," ++ ++echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ++echo "configure:688: checking whether ${MAKE-make} sets \${MAKE}" >&5 ++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftestmake <<\EOF ++all: ++ @echo 'ac_maketemp="${MAKE}"' ++EOF ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` ++if test -n "$ac_maketemp"; then ++ eval ac_cv_prog_make_${ac_make}_set=yes ++else ++ eval ac_cv_prog_make_${ac_make}_set=no ++fi ++rm -f conftestmake ++fi ++if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ SET_MAKE= ++else ++ echo "$ac_t""no" 1>&6 ++ SET_MAKE="MAKE=${MAKE-make}" ++fi ++ ++if test $host != $build; then ++ ac_tool_prefix=${host_alias}- ++else ++ ac_tool_prefix= ++fi ++ ++echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 ++echo "configure:721: checking for Cygwin environment" >&5 ++if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_cygwin=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ ac_cv_cygwin=no ++fi ++rm -f conftest* ++rm -f conftest* ++fi ++ ++echo "$ac_t""$ac_cv_cygwin" 1>&6 ++CYGWIN= ++test "$ac_cv_cygwin" = yes && CYGWIN=yes ++echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ++echo "configure:754: checking for mingw32 environment" >&5 ++if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ ac_cv_mingw32=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ ac_cv_mingw32=no ++fi ++rm -f conftest* ++rm -f conftest* ++fi ++ ++echo "$ac_t""$ac_cv_mingw32" 1>&6 ++MINGW32= ++test "$ac_cv_mingw32" = yes && MINGW32=yes ++ ++# Check whether --enable-multilib or --disable-multilib was given. ++if test "${enable_multilib+set}" = set; then ++ enableval="$enable_multilib" ++ case "${enableval}" in ++ yes) multilib=yes ;; ++ no) multilib=no ;; ++ *) { echo "configure: error: bad value ${enableval} for multilib option" 1>&2; exit 1; } ;; ++ esac ++else ++ multilib=yes ++fi ++ ++# Check whether --enable-target-optspace or --disable-target-optspace was given. ++if test "${enable_target_optspace+set}" = set; then ++ enableval="$enable_target_optspace" ++ case "${enableval}" in ++ yes) target_optspace=yes ;; ++ no) target_optspace=no ;; ++ *) { echo "configure: error: bad value ${enableval} for target-optspace option" 1>&2; exit 1; } ;; ++ esac ++else ++ target_optspace= ++fi ++ ++# Check whether --enable-malloc-debugging or --disable-malloc-debugging was given. ++if test "${enable_malloc_debugging+set}" = set; then ++ enableval="$enable_malloc_debugging" ++ case "${enableval}" in ++ yes) malloc_debugging=yes ;; ++ no) malloc_debugging=no ;; ++ *) { echo "configure: error: bad value ${enableval} for malloc-debugging option" 1>&2; exit 1; } ;; ++ esac ++else ++ malloc_debugging= ++fi ++ ++# Check whether --enable-newlib-multithread or --disable-newlib-multithread was given. ++if test "${enable_newlib_multithread+set}" = set; then ++ enableval="$enable_newlib_multithread" ++ case "${enableval}" in ++ yes) newlib_multithread=yes ;; ++ no) newlib_multithread=no ;; ++ *) { echo "configure: error: bad value ${enableval} for newlib-multithread option" 1>&2; exit 1; } ;; ++ esac ++else ++ newlib_multithread=yes ++fi ++ ++# Check whether --enable-newlib-iconv or --disable-newlib-iconv was given. ++if test "${enable_newlib_iconv+set}" = set; then ++ enableval="$enable_newlib_iconv" ++ if test "${newlib_iconv+set}" != set; then ++ case "${enableval}" in ++ yes) newlib_iconv=yes ;; ++ no) newlib_iconv=no ;; ++ *) { echo "configure: error: bad value ${enableval} for newlib-iconv option" 1>&2; exit 1; } ;; ++ esac ++ fi ++else ++ newlib_iconv=${newlib_iconv} ++fi ++ ++# Check whether --enable-newlib-elix-level or --disable-newlib-elix-level was given. ++if test "${enable_newlib_elix_level+set}" = set; then ++ enableval="$enable_newlib_elix_level" ++ case "${enableval}" in ++ 0) newlib_elix_level=0 ;; ++ 1) newlib_elix_level=1 ;; ++ 2) newlib_elix_level=2 ;; ++ 3) newlib_elix_level=3 ;; ++ 4) newlib_elix_level=4 ;; ++ *) { echo "configure: error: bad value ${enableval} for newlib-elix-level option" 1>&2; exit 1; } ;; ++ esac ++else ++ newlib_elix_level=0 ++fi ++ ++# Check whether --enable-newlib-io-float or --disable-newlib-io-float was given. ++if test "${enable_newlib_io_float+set}" = set; then ++ enableval="$enable_newlib_io_float" ++ case "${enableval}" in ++ yes) newlib_io_float=yes ;; ++ no) newlib_io_float=no ;; ++ *) { echo "configure: error: bad value ${enableval} for newlib-io-float option" 1>&2; exit 1; } ;; ++ esac ++else ++ newlib_io_float=yes ++fi ++ ++# Check whether --enable-newlib-supplied-syscalls or --disable-newlib-supplied-syscalls was given. ++if test "${enable_newlib_supplied_syscalls+set}" = set; then ++ enableval="$enable_newlib_supplied_syscalls" ++ case "${enableval}" in ++ yes) newlib_may_supply_syscalls=yes ;; ++ no) newlib_may_supply_syscalls=no ;; ++ *) { echo "configure: error: bad value ${enableval} for newlib-supplied-syscalls option" 1>&2; exit 1; } ;; ++ esac ++else ++ newlib_may_supply_syscalls=yes ++fi ++ ++ ++ ++if test x${newlib_may_supply_syscalls} = xyes; then ++ MAY_SUPPLY_SYSCALLS_TRUE= ++ MAY_SUPPLY_SYSCALLS_FALSE='#' ++else ++ MAY_SUPPLY_SYSCALLS_TRUE='#' ++ MAY_SUPPLY_SYSCALLS_FALSE= ++fi ++ ++ ++test -z "${with_target_subdir}" && with_target_subdir=. ++ ++if test "${srcdir}" = "."; then ++ if test "${with_target_subdir}" != "."; then ++ newlib_basedir="${srcdir}/${with_multisrctop}../../../.." ++ else ++ newlib_basedir="${srcdir}/${with_multisrctop}../../.." ++ fi ++else ++ newlib_basedir="${srcdir}/../../.." ++fi ++ ++ ++ ++# Do some error checking and defaulting for the host and target type. ++# The inputs are: ++# configure --host=HOST --target=TARGET --build=BUILD NONOPT ++# ++# The rules are: ++# 1. You are not allowed to specify --host, --target, and nonopt at the ++# same time. ++# 2. Host defaults to nonopt. ++# 3. If nonopt is not specified, then host defaults to the current host, ++# as determined by config.guess. ++# 4. Target and build default to nonopt. ++# 5. If nonopt is not specified, then target and build default to host. ++ ++# The aliases save the names the user supplied, while $host etc. ++# will get canonicalized. ++case $host---$target---$nonopt in ++NONE---*---* | *---NONE---* | *---*---NONE) ;; ++*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; ++esac ++ ++ ++# Make sure we can run config.sub. ++if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : ++else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } ++fi ++ ++echo $ac_n "checking host system type""... $ac_c" 1>&6 ++echo "configure:936: checking host system type" >&5 ++ ++host_alias=$host ++case "$host_alias" in ++NONE) ++ case $nonopt in ++ NONE) ++ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : ++ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } ++ fi ;; ++ *) host_alias=$nonopt ;; ++ esac ;; ++esac ++ ++host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` ++host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++echo "$ac_t""$host" 1>&6 ++ ++echo $ac_n "checking target system type""... $ac_c" 1>&6 ++echo "configure:957: checking target system type" >&5 ++ ++target_alias=$target ++case "$target_alias" in ++NONE) ++ case $nonopt in ++ NONE) target_alias=$host_alias ;; ++ *) target_alias=$nonopt ;; ++ esac ;; ++esac ++ ++target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` ++target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++echo "$ac_t""$target" 1>&6 ++ ++echo $ac_n "checking build system type""... $ac_c" 1>&6 ++echo "configure:975: checking build system type" >&5 ++ ++build_alias=$build ++case "$build_alias" in ++NONE) ++ case $nonopt in ++ NONE) build_alias=$host_alias ;; ++ *) build_alias=$nonopt ;; ++ esac ;; ++esac ++ ++build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` ++build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++echo "$ac_t""$build" 1>&6 ++ ++test "$host_alias" != "$target_alias" && ++ test "$program_prefix$program_suffix$program_transform_name" = \ ++ NONENONEs,x,x, && ++ program_prefix=${target_alias}- ++ ++ ++ ++PACKAGE=newlib ++ ++VERSION=1.13.0 ++ ++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then ++ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } ++fi ++cat >> confdefs.h <> confdefs.h <&6 ++echo "configure:1018: checking for working aclocal-${am__api_version}" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (aclocal-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then ++ ACLOCAL=aclocal-${am__api_version} ++ echo "$ac_t""found" 1>&6 ++else ++ ACLOCAL="$missing_dir/missing aclocal-${am__api_version}" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ++echo "configure:1031: checking for working autoconf" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (autoconf --version) < /dev/null > /dev/null 2>&1; then ++ AUTOCONF=autoconf ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOCONF="$missing_dir/missing autoconf" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working automake-${am__api_version}""... $ac_c" 1>&6 ++echo "configure:1044: checking for working automake-${am__api_version}" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (automake-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then ++ AUTOMAKE=automake-${am__api_version} ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOMAKE="$missing_dir/missing automake-${am__api_version}" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ++echo "configure:1057: checking for working autoheader" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (autoheader --version) < /dev/null > /dev/null 2>&1; then ++ AUTOHEADER=autoheader ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOHEADER="$missing_dir/missing autoheader" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ++echo "configure:1070: checking for working makeinfo" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (makeinfo --version) < /dev/null > /dev/null 2>&1; then ++ MAKEINFO=makeinfo ++ echo "$ac_t""found" 1>&6 ++else ++ MAKEINFO="$missing_dir/missing makeinfo" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++ ++ ++# FIXME: We temporarily define our own version of AC_PROG_CC. This is ++# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We ++# are probably using a cross compiler, which will not be able to fully ++# link an executable. This should really be fixed in autoconf ++# itself. ++ ++ ++ ++# Extract the first word of "gcc", so it can be a program name with args. ++set dummy gcc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1095: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # 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_CC="gcc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++if test -z "$CC"; then ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1125: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_prog_rejected=no ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++ ac_cv_prog_CC="cc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++if test $ac_prog_rejected = yes; then ++ # We found a bogon in the path, so make sure we never use it. ++ set dummy $ac_cv_prog_CC ++ shift ++ if test $# -gt 0; then ++ # We chose a different compiler from the bogus one. ++ # However, it has the same basename, so the bogon will be chosen ++ # first if we set CC to just the basename; use the full file name. ++ shift ++ set dummy "$ac_dir/$ac_word" "$@" ++ shift ++ ac_cv_prog_CC="$@" ++ fi ++fi ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } ++fi ++ ++echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ++echo "configure:1174: checking whether we are using GNU C" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++ ac_cv_prog_gcc=yes ++else ++ ac_cv_prog_gcc=no ++fi ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc" 1>&6 ++ ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS= ++ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ++echo "configure:1198: checking whether ${CC-cc} accepts -g" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ echo 'void f(){}' > conftest.c ++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ac_cv_prog_cc_g=yes ++else ++ ac_cv_prog_cc_g=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ elif test $ac_cv_prog_cc_g = yes; then ++ CFLAGS="-g -O2" ++ else ++ CFLAGS="-O2" ++ fi ++else ++ GCC= ++ test "${CFLAGS+set}" = set || CFLAGS="-g" ++fi ++ ++ ++# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. ++set dummy ${ac_tool_prefix}as; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1229: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$AS"; then ++ ac_cv_prog_AS="$AS" # 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_AS="${ac_tool_prefix}as" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as" ++fi ++fi ++AS="$ac_cv_prog_AS" ++if test -n "$AS"; then ++ echo "$ac_t""$AS" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ++ ++# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. ++set dummy ${ac_tool_prefix}ar; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1261: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$AR"; then ++ ac_cv_prog_AR="$AR" # 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_AR="${ac_tool_prefix}ar" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" ++fi ++fi ++AR="$ac_cv_prog_AR" ++if test -n "$AR"; then ++ echo "$ac_t""$AR" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ++ ++# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. ++set dummy ${ac_tool_prefix}ranlib; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1293: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="${ac_tool_prefix}ranlib" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++RANLIB="$ac_cv_prog_RANLIB" ++if test -n "$RANLIB"; then ++ echo "$ac_t""$RANLIB" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ++if test -z "$ac_cv_prog_RANLIB"; then ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "ranlib", so it can be a program name with args. ++set dummy ranlib; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1325: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="ranlib" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" ++fi ++fi ++RANLIB="$ac_cv_prog_RANLIB" ++if test -n "$RANLIB"; then ++ echo "$ac_t""$RANLIB" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++else ++ RANLIB=":" ++fi ++fi ++ ++ ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# ./install, which can be erroneously created by make from ./install.sh. ++echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ++echo "configure:1370: checking for a BSD compatible install" >&5 ++if test -z "$INSTALL"; then ++if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" ++ for ac_dir in $PATH; do ++ # Account for people who put trailing slashes in PATH elements. ++ case "$ac_dir/" in ++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ if test -f $ac_dir/$ac_prog; then ++ if test $ac_prog = install && ++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ else ++ ac_cv_path_install="$ac_dir/$ac_prog -c" ++ break 2 ++ fi ++ fi ++ done ++ ;; ++ esac ++ done ++ IFS="$ac_save_IFS" ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL="$ac_cv_path_install" ++ else ++ # As a last resort, use the slow shell script. We don't cache a ++ # path for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the path is relative. ++ INSTALL="$ac_install_sh" ++ fi ++fi ++echo "$ac_t""$INSTALL" 1>&6 ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++ ++echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ++echo "configure:1424: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. ++if test "${enable_maintainer_mode+set}" = set; then ++ enableval="$enable_maintainer_mode" ++ USE_MAINTAINER_MODE=$enableval ++else ++ USE_MAINTAINER_MODE=no ++fi ++ ++ echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 ++ ++ ++if test $USE_MAINTAINER_MODE = yes; then ++ MAINTAINER_MODE_TRUE= ++ MAINTAINER_MODE_FALSE='#' ++else ++ MAINTAINER_MODE_TRUE='#' ++ MAINTAINER_MODE_FALSE= ++fi ++ MAINT=$MAINTAINER_MODE_TRUE ++ ++ ++ ++# We need AC_EXEEXT to keep automake happy in cygnus mode. However, ++# at least currently, we never actually build a program, so we never ++# need to use $(EXEEXT). Moreover, the test for EXEEXT normally ++# fails, because we are probably configuring with a cross compiler ++# which can't create executables. So we include AC_EXEEXT to keep ++# automake happy, but we don't execute it, since we don't care about ++# the result. ++if false; then ++ ++ ++echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ++echo "configure:1458: checking for executable suffix" >&5 ++if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then ++ ac_cv_exeext=.exe ++else ++ rm -f conftest* ++ echo 'int main () { return 0; }' > conftest.$ac_ext ++ ac_cv_exeext= ++ if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ for file in conftest.*; do ++ case $file in ++ *.c | *.o | *.obj) ;; ++ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; ++ esac ++ done ++ else ++ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } ++ fi ++ rm -f conftest* ++ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no ++fi ++fi ++ ++EXEEXT="" ++test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} ++echo "$ac_t""${ac_cv_exeext}" 1>&6 ++ac_exeext=$EXEEXT ++ ++fi ++ ++. ${newlib_basedir}/configure.host ++ ++newlib_cflags="${newlib_cflags} -fno-builtin" ++ ++NEWLIB_CFLAGS=${newlib_cflags} ++ ++ ++LDFLAGS=${ldflags} ++ ++ ++ ++ ++if test x${newlib_elix_level} = x0; then ++ ELIX_LEVEL_0_TRUE= ++ ELIX_LEVEL_0_FALSE='#' ++else ++ ELIX_LEVEL_0_TRUE='#' ++ ELIX_LEVEL_0_FALSE= ++fi ++ ++ ++if test x${newlib_elix_level} = x1; then ++ ELIX_LEVEL_1_TRUE= ++ ELIX_LEVEL_1_FALSE='#' ++else ++ ELIX_LEVEL_1_TRUE='#' ++ ELIX_LEVEL_1_FALSE= ++fi ++ ++ ++if test x${newlib_elix_level} = x2; then ++ ELIX_LEVEL_2_TRUE= ++ ELIX_LEVEL_2_FALSE='#' ++else ++ ELIX_LEVEL_2_TRUE='#' ++ ELIX_LEVEL_2_FALSE= ++fi ++ ++ ++if test x${newlib_elix_level} = x3; then ++ ELIX_LEVEL_3_TRUE= ++ ELIX_LEVEL_3_FALSE='#' ++else ++ ELIX_LEVEL_3_TRUE='#' ++ ELIX_LEVEL_3_FALSE= ++fi ++ ++ ++if test x${newlib_elix_level} = x4; then ++ ELIX_LEVEL_4_TRUE= ++ ELIX_LEVEL_4_FALSE='#' ++else ++ ELIX_LEVEL_4_TRUE='#' ++ ELIX_LEVEL_4_FALSE= ++fi ++ ++ ++ ++if test x${use_libtool} = xyes; then ++ USE_LIBTOOL_TRUE= ++ USE_LIBTOOL_FALSE='#' ++else ++ USE_LIBTOOL_TRUE='#' ++ USE_LIBTOOL_FALSE= ++fi ++ ++# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we ++# use oext, which is set in configure.host based on the target platform. ++OBJEXT=${oext} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++trap '' 1 2 15 ++cat > confcache <<\EOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs. It is not useful on other systems. ++# If it contains results you don't want to keep, you may remove or edit it. ++# ++# By default, configure uses ./config.cache as the cache file, ++# creating it if it does not exist already. You can give configure ++# the --cache-file=FILE option to use a different cache file; that is ++# what configure does when it calls configure scripts in ++# subdirectories, so they share the cache. ++# Giving --cache-file=/dev/null disables caching, for debugging configure. ++# config.status only pays attention to the cache file if you give it the ++# --recheck option to rerun configure. ++# ++EOF ++# The following way of writing the cache mishandles newlines in values, ++# but we know of no workaround that is simple, portable, and efficient. ++# So, don't put newlines in cache variables' values. ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++(set) 2>&1 | ++ case `(ac_space=' '; set | grep ac_space) 2>&1` in ++ *ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote substitution ++ # turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ -e "s/'/'\\\\''/g" \ ++ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ++ ;; ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ++ ;; ++ esac >> confcache ++if cmp -s $cache_file confcache; then ++ : ++else ++ if test -w $cache_file; then ++ echo "updating cache $cache_file" ++ cat confcache > $cache_file ++ else ++ echo "not updating unwritable cache $cache_file" ++ fi ++fi ++rm -f confcache ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Any assignment to VPATH causes Sun make to only execute ++# the first set of double-colon rules, so remove it if not needed. ++# If there is a colon in the path, we need to keep it. ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++fi ++ ++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 ++ ++# Transform confdefs.h into DEFS. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++cat > conftest.defs <<\EOF ++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g ++s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g ++s%\[%\\&%g ++s%\]%\\&%g ++s%\$%$$%g ++EOF ++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` ++rm -f conftest.defs ++ ++ ++# Without the "./", some shells look in PATH for config.status. ++: ${CONFIG_STATUS=./config.status} ++ ++echo creating $CONFIG_STATUS ++rm -f $CONFIG_STATUS ++cat > $CONFIG_STATUS </dev/null | sed 1q`: ++# ++# $0 $ac_configure_args ++# ++# Compiler output produced by configure, useful for debugging ++# configure, is in ./config.log if it exists. ++ ++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" ++for ac_option ++do ++ case "\$ac_option" in ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" ++ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; ++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ++ echo "$CONFIG_STATUS generated by autoconf version 2.13" ++ exit 0 ;; ++ -help | --help | --hel | --he | --h) ++ echo "\$ac_cs_usage"; exit 0 ;; ++ *) echo "\$ac_cs_usage"; exit 1 ;; ++ esac ++done ++ ++ac_given_srcdir=$srcdir ++ac_given_INSTALL="$INSTALL" ++ ++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 ++EOF ++cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF ++$ac_vpsub ++$extrasub ++s%@SHELL@%$SHELL%g ++s%@CFLAGS@%$CFLAGS%g ++s%@CPPFLAGS@%$CPPFLAGS%g ++s%@CXXFLAGS@%$CXXFLAGS%g ++s%@FFLAGS@%$FFLAGS%g ++s%@DEFS@%$DEFS%g ++s%@LDFLAGS@%$LDFLAGS%g ++s%@LIBS@%$LIBS%g ++s%@exec_prefix@%$exec_prefix%g ++s%@prefix@%$prefix%g ++s%@program_transform_name@%$program_transform_name%g ++s%@bindir@%$bindir%g ++s%@sbindir@%$sbindir%g ++s%@libexecdir@%$libexecdir%g ++s%@datadir@%$datadir%g ++s%@sysconfdir@%$sysconfdir%g ++s%@sharedstatedir@%$sharedstatedir%g ++s%@localstatedir@%$localstatedir%g ++s%@libdir@%$libdir%g ++s%@includedir@%$includedir%g ++s%@oldincludedir@%$oldincludedir%g ++s%@infodir@%$infodir%g ++s%@mandir@%$mandir%g ++s%@MAY_SUPPLY_SYSCALLS_TRUE@%$MAY_SUPPLY_SYSCALLS_TRUE%g ++s%@MAY_SUPPLY_SYSCALLS_FALSE@%$MAY_SUPPLY_SYSCALLS_FALSE%g ++s%@newlib_basedir@%$newlib_basedir%g ++s%@host@%$host%g ++s%@host_alias@%$host_alias%g ++s%@host_cpu@%$host_cpu%g ++s%@host_vendor@%$host_vendor%g ++s%@host_os@%$host_os%g ++s%@target@%$target%g ++s%@target_alias@%$target_alias%g ++s%@target_cpu@%$target_cpu%g ++s%@target_vendor@%$target_vendor%g ++s%@target_os@%$target_os%g ++s%@build@%$build%g ++s%@build_alias@%$build_alias%g ++s%@build_cpu@%$build_cpu%g ++s%@build_vendor@%$build_vendor%g ++s%@build_os@%$build_os%g ++s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g ++s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g ++s%@INSTALL_DATA@%$INSTALL_DATA%g ++s%@PACKAGE@%$PACKAGE%g ++s%@VERSION@%$VERSION%g ++s%@ACLOCAL@%$ACLOCAL%g ++s%@AUTOCONF@%$AUTOCONF%g ++s%@AUTOMAKE@%$AUTOMAKE%g ++s%@AUTOHEADER@%$AUTOHEADER%g ++s%@MAKEINFO@%$MAKEINFO%g ++s%@SET_MAKE@%$SET_MAKE%g ++s%@CC@%$CC%g ++s%@AS@%$AS%g ++s%@AR@%$AR%g ++s%@RANLIB@%$RANLIB%g ++s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g ++s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g ++s%@MAINT@%$MAINT%g ++s%@EXEEXT@%$EXEEXT%g ++s%@NEWLIB_CFLAGS@%$NEWLIB_CFLAGS%g ++s%@ELIX_LEVEL_0_TRUE@%$ELIX_LEVEL_0_TRUE%g ++s%@ELIX_LEVEL_0_FALSE@%$ELIX_LEVEL_0_FALSE%g ++s%@ELIX_LEVEL_1_TRUE@%$ELIX_LEVEL_1_TRUE%g ++s%@ELIX_LEVEL_1_FALSE@%$ELIX_LEVEL_1_FALSE%g ++s%@ELIX_LEVEL_2_TRUE@%$ELIX_LEVEL_2_TRUE%g ++s%@ELIX_LEVEL_2_FALSE@%$ELIX_LEVEL_2_FALSE%g ++s%@ELIX_LEVEL_3_TRUE@%$ELIX_LEVEL_3_TRUE%g ++s%@ELIX_LEVEL_3_FALSE@%$ELIX_LEVEL_3_FALSE%g ++s%@ELIX_LEVEL_4_TRUE@%$ELIX_LEVEL_4_TRUE%g ++s%@ELIX_LEVEL_4_FALSE@%$ELIX_LEVEL_4_FALSE%g ++s%@USE_LIBTOOL_TRUE@%$USE_LIBTOOL_TRUE%g ++s%@USE_LIBTOOL_FALSE@%$USE_LIBTOOL_FALSE%g ++s%@OBJEXT@%$OBJEXT%g ++s%@oext@%$oext%g ++s%@aext@%$aext%g ++s%@libm_machine_dir@%$libm_machine_dir%g ++s%@machine_dir@%$machine_dir%g ++s%@sys_dir@%$sys_dir%g ++ ++CEOF ++EOF ++ ++cat >> $CONFIG_STATUS <<\EOF ++ ++# Split the substitutions into bite-sized pieces for seds with ++# small command number limits, like on Digital OSF/1 and HP-UX. ++ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ++ac_file=1 # Number of current file. ++ac_beg=1 # First line for current file. ++ac_end=$ac_max_sed_cmds # Line after last line for current file. ++ac_more_lines=: ++ac_sed_cmds="" ++while $ac_more_lines; do ++ if test $ac_beg -gt 1; then ++ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file ++ else ++ sed "${ac_end}q" conftest.subs > conftest.s$ac_file ++ fi ++ if test ! -s conftest.s$ac_file; then ++ ac_more_lines=false ++ rm -f conftest.s$ac_file ++ else ++ if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds="sed -f conftest.s$ac_file" ++ else ++ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" ++ fi ++ ac_file=`expr $ac_file + 1` ++ ac_beg=$ac_end ++ ac_end=`expr $ac_end + $ac_max_sed_cmds` ++ fi ++done ++if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds=cat ++fi ++EOF ++ ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++ ++ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. ++ ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` ++ else ++ ac_dir_suffix= ac_dots= ++ fi ++ ++ case "$ac_given_srcdir" in ++ .) srcdir=. ++ if test -z "$ac_dots"; then top_srcdir=. ++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; ++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ *) # Relative path. ++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" ++ top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ esac ++ ++ case "$ac_given_INSTALL" in ++ [/$]*) INSTALL="$ac_given_INSTALL" ;; ++ *) INSTALL="$ac_dots$ac_given_INSTALL" ;; ++ esac ++ ++ echo creating "$ac_file" ++ rm -f "$ac_file" ++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." ++ case "$ac_file" in ++ *Makefile*) ac_comsub="1i\\ ++# $configure_input" ;; ++ *) ac_comsub= ;; ++ esac ++ ++ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` ++ sed -e "$ac_comsub ++s%@configure_input@%$configure_input%g ++s%@srcdir@%$srcdir%g ++s%@top_srcdir@%$top_srcdir%g ++s%@INSTALL@%$INSTALL%g ++" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file ++fi; done ++rm -f conftest.s* ++ ++EOF ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++ ++exit 0 ++EOF ++chmod +x $CONFIG_STATUS ++rm -fr confdefs* $ac_clean_files ++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++ +--- newlib-1.13.0/newlib/libc/sys/psp/configure.in 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/configure.in 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,12 @@ ++dnl This is the newlib/libc/sys/psp configure.in file. ++dnl Process this file with autoconf to produce a configure script. ++ ++AC_PREREQ(2.5) ++AC_INIT(libcglue.c) ++ ++dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake. ++AC_CONFIG_AUX_DIR(../../../..) ++ ++NEWLIB_CONFIGURE(../../..) ++ ++AC_OUTPUT(Makefile) +--- newlib-1.13.0/newlib/libc/sys/psp/crt0.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/crt0.c 2006-03-13 00:00:00.000000000 -0500 +@@ -0,0 +1,3 @@ ++/* The real crt0.c lives in PSPSDK. */ ++ ++void _start() { } +--- newlib-1.13.0/newlib/libc/sys/psp/fdman.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/fdman.c 2006-05-02 11:02:56.000000000 -0400 +@@ -0,0 +1,115 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * fdman.c - File descriptor management. ++ * ++ * Copyright (c) 2006 Rafael Cabezas ++ */ ++#include ++#include ++#include "fdman.h" ++ ++extern int pspDisableInterrupts(); ++extern void pspEnableInterrupts(int); ++ ++static __psp_descriptormap_type __psp_descriptor_data_pool[__PSP_FILENO_MAX]; ++__psp_descriptormap_type *__psp_descriptormap [__PSP_FILENO_MAX]; ++ ++void __psp_fdman_init() ++{ ++ int scefd; ++ ++ /* Initialize descriptor data*/ ++ memset(__psp_descriptor_data_pool, 0, sizeof(__psp_descriptormap_type) *__PSP_FILENO_MAX); ++ /* Initialize descriptor map*/ ++ memset(__psp_descriptormap, 0, sizeof(__psp_descriptormap_type*)*__PSP_FILENO_MAX); ++ ++ scefd = sceKernelStdin(); ++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) { ++ __psp_descriptormap[0] = &__psp_descriptor_data_pool[0]; ++ __psp_descriptormap[0]->sce_descriptor = scefd; ++ __psp_descriptormap[0]->type = __PSP_DESCRIPTOR_TYPE_TTY; ++ } ++ scefd = sceKernelStdout(); ++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) { ++ __psp_descriptormap[1] = &__psp_descriptor_data_pool[1]; ++ __psp_descriptormap[1]->sce_descriptor = scefd; ++ __psp_descriptormap[1]->type = __PSP_DESCRIPTOR_TYPE_TTY; ++ } ++ scefd = sceKernelStderr(); ++ if ((scefd >= 0) && (scefd < __PSP_FILENO_MAX)) { ++ __psp_descriptormap[2] = &__psp_descriptor_data_pool[2]; ++ __psp_descriptormap[2]->sce_descriptor = scefd; ++ __psp_descriptormap[2]->type = __PSP_DESCRIPTOR_TYPE_TTY; ++ } ++} ++ ++int __psp_fdman_get_new_descriptor() ++{ ++ int i = 0; ++ int inten; ++ ++ inten = pspDisableInterrupts(); /* lock here to make thread safe */ ++ for (i = 0; i < __PSP_FILENO_MAX; i++) { ++ if (__psp_descriptormap[i] == NULL) { ++ __psp_descriptormap[i] = &__psp_descriptor_data_pool[i]; ++ __psp_descriptormap[i]->ref_count++; ++ pspEnableInterrupts(inten); /* release lock */ ++ return i; ++ } ++ } ++ pspEnableInterrupts(inten); /* release lock */ ++ ++ errno = ENOMEM; ++ return -1; ++} ++ ++int __psp_fdman_get_dup_descriptor(int fd) ++{ ++ int i = 0; ++ int inten; ++ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ inten = pspDisableInterrupts(); /* lock here to make thread safe */ ++ for (i = 0; i < __PSP_FILENO_MAX; i++) { ++ if (__psp_descriptormap[i] == NULL) { ++ __psp_descriptormap[i] = &__psp_descriptor_data_pool[fd]; ++ __psp_descriptormap[i]->ref_count++; ++ pspEnableInterrupts(inten); /* release lock */ ++ return i; ++ } ++ } ++ pspEnableInterrupts(inten); /* release lock */ ++ ++ errno = ENOMEM; ++ return -1; ++} ++ ++void __psp_fdman_release_descriptor(int fd) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return; ++ } ++ ++ __psp_descriptormap[fd]->ref_count--; ++ ++ if (__psp_descriptormap[fd]->ref_count == 0) { ++ ++ if (__psp_descriptormap[fd]->filename != NULL) { ++ free(__psp_descriptormap[fd]->filename); ++ } ++ __psp_descriptormap[fd]->filename = NULL; ++ __psp_descriptormap[fd]->sce_descriptor = 0; ++ __psp_descriptormap[fd]->type = 0; ++ __psp_descriptormap[fd]->flags = 0; ++ ++ } ++ __psp_descriptormap[fd] = NULL; ++} +--- newlib-1.13.0/newlib/libc/sys/psp/fdman.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/fdman.h 2006-04-28 10:06:39.000000000 -0400 +@@ -0,0 +1,44 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * fdman.h - File descriptor management. ++ * ++ * Copyright (c) 2006 Rafael Cabezas ++ */ ++ ++#ifndef _FDMAN_H_ ++ #define _FDMAN_H_ ++ ++ #define __PSP_FILENO_MAX 1024 ++ ++ #define __PSP_IS_FD_VALID(FD) \ ++ ( (FD >= 0) && (FD < __PSP_FILENO_MAX) && (__psp_descriptormap[FD] != NULL) ) ++ ++ #define __PSP_IS_FD_OF_TYPE(FD, TYPE) \ ++ ( (__PSP_IS_FD_VALID(FD)) && (__psp_descriptormap[FD]->type == TYPE) ) ++ ++ typedef enum { ++ __PSP_DESCRIPTOR_TYPE_FILE , ++ __PSP_DESCRIPTOR_TYPE_PIPE , ++ __PSP_DESCRIPTOR_TYPE_SOCKET, ++ __PSP_DESCRIPTOR_TYPE_TTY ++ } __psp_fdman_fd_types; ++ ++ typedef struct { ++ char * filename; ++ u8 type; ++ u32 sce_descriptor; ++ u32 flags; ++ u32 ref_count; ++ } __psp_descriptormap_type; ++ ++ extern __psp_descriptormap_type *__psp_descriptormap[__PSP_FILENO_MAX]; ++ ++ void __psp_fdman_init(); ++ int __psp_fdman_get_new_descriptor(); ++ int __psp_fdman_get_dup_descriptor(int fd); ++ void __psp_fdman_release_descriptor(int fd); ++ ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/include/netdb.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/include/netdb.h 2006-05-02 11:27:30.000000000 -0400 +@@ -0,0 +1,36 @@ ++/* Simple gethostbyname and gethostbyaddr replacements, note not thread safe */ ++#ifndef __NETDB_H__ ++#define __NETDB_H__ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#define NETDB_INTERNAL -1 /* see errno */ ++#define NETDB_SUCCESS 0 /* no problem */ ++#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ ++#define TRY_AGAIN 2 /* Non-Authoritative Host not found, or SERVERFAIL */ ++#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ ++#define NO_DATA 4 /* Valid name, no data record of requested type */ ++#define NO_ADDRESS NO_DATA /* no address, look for MX record */ ++ ++extern int h_errno; ++ ++struct hostent ++{ ++ char *h_name; ++ char **h_aliases; ++ int h_addrtype; ++ int h_length; ++ char **h_addr_list; ++ char *h_addr; ++}; ++ ++struct hostent *gethostbyaddr(const void *addr, int len, int type); ++struct hostent *gethostbyname(const char *name); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/interrupt.S 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/interrupt.S 2006-05-02 11:28:43.000000000 -0400 +@@ -0,0 +1,66 @@ ++ ++ .set noreorder ++ .set noat ++ ++ .global pspDisableInterrupts ++ .ent pspDisableInterrupts ++ ++pspDisableInterrupts: ++ mfic $v0, $0 ++ mtic $0, $0 ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ jr $ra ++ nop ++ ++ .end pspDisableInterrupts ++ ++ .global pspEnableInterrupts ++ .ent pspEnableInterrupts ++ ++pspEnableInterrupts: ++ mtic $a0, $0 ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ nop ++ jr $ra ++ nop ++ ++ .end pspEnableInterrupts +--- newlib-1.13.0/newlib/libc/sys/psp/libcglue.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/libcglue.c 2006-05-02 11:03:27.000000000 -0400 +@@ -0,0 +1,898 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * libcglue.c - Newlib-compatible system calls. ++ * ++ * Copyright (c) 2005 Marcus R. Brown ++ * Copyright (c) 2005 James Forshaw ++ * Copyright (c) 2005 John Kelley ++ * Copyright (c) 2005 Jim Paris ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "fdman.h" ++ ++extern char __psp_cwd[MAXPATHLEN + 1]; ++extern void __psp_init_cwd(char *argv_0); ++extern int __psp_path_absolute(const char *in, char *out, int len); ++extern int pspDisableInterrupts(); ++extern void pspEnableInterrupts(int); ++ ++/* The following functions are defined in socket.c. They have weak linkage so ++ that the user doesn't have to link against the PSP network libraries if they ++ don't use the sockets API. */ ++extern int __psp_socket_close(int s) __attribute__((weak)); ++extern ssize_t __psp_socket_recv(int s, void *buf, size_t len, int flags) __attribute__((weak)); ++extern ssize_t __psp_socket_send(int s, const void *buf, size_t len, int flags) __attribute__((weak)); ++ ++extern int pipe(int fildes[2]); ++extern int __psp_pipe_close(int filedes); ++extern int __psp_pipe_nonblocking_read(int fd, void *buf, size_t len); ++extern int __psp_pipe_read(int fd, void *buf, size_t len); ++extern int __psp_pipe_write(int fd, const void *buf, size_t size); ++extern int __psp_pipe_nonblocking_write(int fd, const void *buf, size_t len); ++ ++int __psp_set_errno(int code); ++ ++#ifdef F___psp_set_errno ++int __psp_set_errno(int code) ++{ ++ if ((code & 0x80010000) == 0x80010000) { ++ errno = code & 0xFFFF; ++ return -1; ++ } ++ return code; ++} ++#endif ++ ++#ifdef F_getcwd ++char *getcwd(char *buf, size_t size) ++{ ++ if(!buf) { ++ errno = EINVAL; ++ return NULL; ++ } ++ ++ if(strlen(__psp_cwd) >= size) { ++ errno = ERANGE; ++ return NULL; ++ } ++ ++ strcpy(buf, __psp_cwd); ++ return buf; ++} ++#endif ++ ++#ifdef F_chdir ++int chdir(const char *path) ++{ ++ char dest[MAXPATHLEN + 1]; ++ SceUID uid; ++ ++ if(__psp_path_absolute(path, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ /* sceIoChdir doesn't give an indication of whether it worked, ++ so test for existence by attempting to open the dir */ ++ uid = sceIoDopen(dest); ++ if(uid < 0) { ++ errno = ENOTDIR; ++ return -1; ++ } ++ sceIoDclose(uid); ++ ++ sceIoChdir(dest); ++ strcpy(__psp_cwd, dest); ++ return 0; ++} ++#endif ++ ++#ifdef F_mkdir ++int mkdir(const char *pathname, mode_t mode) ++{ ++ char dest[MAXPATHLEN + 1]; ++ ++ if(__psp_path_absolute(pathname, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ return __psp_set_errno(sceIoMkdir(dest, mode)); ++} ++#endif ++ ++#ifdef F_rmdir ++int rmdir(const char *pathname) ++{ ++ char dest[MAXPATHLEN + 1]; ++ ++ if(__psp_path_absolute(pathname, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ return __psp_set_errno(sceIoRmdir(dest)); ++} ++#endif ++ ++#ifdef F_realpath ++char *realpath(const char *path, char *resolved_path) ++{ ++ if(!path || !resolved_path) { ++ errno = EINVAL; ++ return NULL; ++ } ++ if(__psp_path_absolute(path, resolved_path, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return NULL; ++ } ++ if(access(resolved_path, F_OK) < 0) { ++ errno = ENOENT; ++ return NULL; ++ } ++ return resolved_path; ++} ++#endif ++ ++/* Wrappers of the standard open(), close(), read(), write(), unlink() and lseek() routines. */ ++#ifdef F__open ++int _open(const char *name, int flags, int mode) ++{ ++ int scefd, fd; ++ int sce_flags; ++ char dest[MAXPATHLEN + 1]; ++ ++ if(__psp_path_absolute(name, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ /* O_RDONLY starts at 0, where PSP_O_RDONLY starts at 1, so remap the read/write ++ flags by adding 1. */ ++ sce_flags = (flags & O_ACCMODE) + 1; ++ ++ /* Translate standard open flags into the flags understood by the PSP kernel. */ ++ if (flags & O_APPEND) { ++ sce_flags |= PSP_O_APPEND; ++ } ++ if (flags & O_CREAT) { ++ sce_flags |= PSP_O_CREAT; ++ } ++ if (flags & O_TRUNC) { ++ sce_flags |= PSP_O_TRUNC; ++ } ++ if (flags & O_EXCL) { ++ sce_flags |= PSP_O_EXCL; ++ } ++ if (flags & O_NONBLOCK) { ++ sce_flags |= PSP_O_NBLOCK; ++ } ++ ++ scefd = sceIoOpen(dest, sce_flags, mode); ++ if (scefd >= 0) { ++ fd = __psp_fdman_get_new_descriptor(); ++ if (fd != -1) { ++ __psp_descriptormap[fd]->sce_descriptor = scefd; ++ __psp_descriptormap[fd]->type = __PSP_DESCRIPTOR_TYPE_FILE; ++ __psp_descriptormap[fd]->flags = flags; ++ __psp_descriptormap[fd]->filename = strdup(dest); ++ return fd; ++ } ++ else { ++ sceIoClose(scefd); ++ errno = ENOMEM; ++ return -1; ++ } ++ } ++ else { ++ return __psp_set_errno(scefd); ++ } ++ ++} ++#endif ++ ++#ifdef F__close ++int _close(int fd) ++{ ++ int ret = 0; ++ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ case __PSP_DESCRIPTOR_TYPE_TTY: ++ if (__psp_descriptormap[fd]->ref_count == 1) { ++ ret = __psp_set_errno(sceIoClose(__psp_descriptormap[fd]->sce_descriptor)); ++ } ++ __psp_fdman_release_descriptor(fd); ++ return ret; ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ return __psp_pipe_close(fd); ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ if (__psp_socket_close != NULL) { ++ ret = __psp_socket_close(fd); ++ return ret; ++ } ++ break; ++ default: ++ break; ++ } ++ ++ errno = EBADF; ++ return -1; ++} ++#endif ++ ++#ifdef F__read ++int _read(int fd, void *buf, size_t size) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ case __PSP_DESCRIPTOR_TYPE_TTY: ++ return __psp_set_errno(sceIoRead(__psp_descriptormap[fd]->sce_descriptor, buf, size)); ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ if (__psp_descriptormap[fd]->flags & O_NONBLOCK) { ++ return __psp_pipe_nonblocking_read(fd, buf, size); ++ } ++ else { ++ return __psp_pipe_read(fd, buf, size); ++ } ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ if (__psp_socket_recv != NULL) { ++ return __psp_socket_recv(fd, buf, size, 0); ++ } ++ break; ++ default: ++ break; ++ } ++ ++ errno = EBADF; ++ return -1; ++ ++} ++#endif ++ ++#ifdef F__write ++int _write(int fd, const void *buf, size_t size) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ case __PSP_DESCRIPTOR_TYPE_TTY: ++ return __psp_set_errno(sceIoWrite(__psp_descriptormap[fd]->sce_descriptor, buf, size)); ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ if (__psp_descriptormap[fd]->flags & O_NONBLOCK) { ++ return __psp_pipe_nonblocking_write(fd, buf, size); ++ } ++ else { ++ return __psp_pipe_write(fd, buf, size); ++ } ++ break; ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ if (__psp_socket_send != NULL) { ++ return __psp_socket_send(fd, buf, size, 0); ++ } ++ break; ++ default: ++ break; ++ } ++ ++ errno = EBADF; ++ return -1; ++} ++#endif ++ ++#ifdef F__lseek ++off_t _lseek(int fd, off_t offset, int whence) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ /* We don't have to do anything with the whence argument because SEEK_* == PSP_SEEK_*. */ ++ return (off_t) __psp_set_errno(sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, offset, whence)); ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ break; ++ default: ++ break; ++ } ++ ++ errno = EBADF; ++ return -1; ++ ++} ++#endif ++ ++#ifdef F__unlink ++int _unlink(const char *path) ++{ ++ char dest[MAXPATHLEN + 1]; ++ ++ if(__psp_path_absolute(path, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ return __psp_set_errno(sceIoRemove(dest)); ++} ++#endif ++ ++#ifdef F__link ++int _link(const char *name1, const char *name2) ++{ ++ errno = ENOSYS; ++ return -1; /* not supported */ ++} ++#endif ++ ++#ifdef F_opendir ++DIR *opendir(const char *filename) ++{ ++ char dest[MAXPATHLEN + 1]; ++ DIR *dirp; ++ SceUID uid; ++ ++ /* Normalize pathname so that opendir(".") works */ ++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) { ++ errno = ENOENT; ++ return NULL; ++ } ++ ++ dirp = (DIR *)malloc(sizeof(DIR)); ++ ++ uid = sceIoDopen(dest); ++ ++ if (uid < 0) ++ { ++ free(dirp); ++ (void) __psp_set_errno(uid); ++ return NULL; ++ } ++ ++ dirp->uid = uid; ++ ++ return dirp; ++} ++#endif ++ ++#ifdef F_readdir ++struct dirent *readdir(DIR *dirp) ++{ ++ int ret; ++ ++ /* Zero the dirent, to avoid possible problems with sceIoDread */ ++ memset(&dirp->de, 0, sizeof(struct dirent)); ++ ++ ret = sceIoDread(dirp->uid, (SceIoDirent *)&dirp->de); ++ if (ret == 0) { ++ /* EOF */ ++ errno = 0; ++ return NULL; ++ } ++ if (ret < 0) { ++ (void) __psp_set_errno(ret); ++ return NULL; ++ } ++ ++ return &dirp->de; ++} ++#endif ++ ++#ifdef F_closedir ++int closedir(DIR *dirp) ++{ ++ if (dirp != NULL) ++ { ++ int uid; ++ uid = dirp->uid; ++ free (dirp); ++ return __psp_set_errno(sceIoDclose(uid)); ++ } ++ errno = EBADF; ++ return -1; ++} ++#endif ++ ++/* Time routines. These wrap around the routines provided by the kernel. */ ++#ifdef F__gettimeofday ++int _gettimeofday(struct timeval *tp, struct timezone *tzp) ++{ ++ return __psp_set_errno(sceKernelLibcGettimeofday(tp, tzp)); ++} ++ ++#endif ++ ++#if defined(F_clock) ++clock_t clock(void) ++{ ++ return sceKernelLibcClock(); ++} ++#endif ++ ++#if defined(F_time) ++time_t time(time_t *t) ++{ ++ return __psp_set_errno(sceKernelLibcTime(t)); ++} ++#endif ++ ++#if defined(F_sleep) ++unsigned int sleep(unsigned int secs) { ++ while(secs--) { ++ sceKernelDelayThreadCB(1000000); ++ } ++ return 0; ++} ++#endif ++ ++/* PSP-compatible sbrk(). */ ++#if defined(F__sbrk) || defined(F_glue__sbrk) ++/* TODO: Currently our default heap is set to the maximum available block size ++ when sbrk() is first called. Sony seems to always use a default of 64KB, ++ with the expectation that user programs will override the default size with ++ their own desired size. The only reason I can think of them doing this is ++ to allow each PRX to have their own seperate heap. I think that their ++ method is overkill for most user programs. ++ ++ What I'd like to do instead is to use the default of 64KB for PRXes as Sony ++ does, but use the maximum available block size for executables. This avoids ++ the requirement of specifying the heap size manually in user programs. ++ However, we currently don't have a clean way to distinguish PRXes and normal ++ executables, so this code needs to be revisited once we do come up with a ++ way. */ ++#define DEFAULT_PRX_HEAP_SIZE_KB 64 ++ ++/* If defined it specifies the desired size of the heap, in KB. */ ++extern unsigned int sce_newlib_heap_kb_size __attribute__((weak)); ++extern int __pspsdk_is_prx __attribute__((weak)); ++ ++/* UID of the memory block that represents the heap. */ ++static SceUID __psp_heap_blockid; ++ ++void * _sbrk(ptrdiff_t incr) ++{ ++ static void * heap_bottom = NULL; ++ static void * heap_top = NULL; ++ static void * heap_ptr = NULL; ++ ++ /* Has our heap been initialized? */ ++ if (heap_bottom == NULL) { ++ /* No, initialize the heap. */ ++ SceSize heap_size; ++ ++ if (&sce_newlib_heap_kb_size != NULL) { ++ heap_size = sce_newlib_heap_kb_size * 1024; ++ } else { ++ if (&__pspsdk_is_prx != NULL) { ++ heap_size = DEFAULT_PRX_HEAP_SIZE_KB * 1024; ++ } else { ++ heap_size = sceKernelMaxFreeMemSize(); ++ } ++ } ++ ++ __psp_heap_blockid = sceKernelAllocPartitionMemory(2, "block", PSP_SMEM_Low, heap_size, NULL); ++ if (__psp_heap_blockid > 0) { ++ heap_bottom = sceKernelGetBlockHeadAddr(__psp_heap_blockid); ++ heap_ptr = heap_bottom; ++ heap_top = (unsigned char *) heap_bottom + heap_size; ++ } ++ } ++ ++ void * heap_addr = (void *) -1; ++ void * next_heap_ptr = (void *) ((ptrdiff_t) heap_ptr + incr); ++ if ((heap_bottom != NULL) && (next_heap_ptr >= heap_bottom) && (next_heap_ptr < heap_top)) { ++ heap_addr = heap_ptr; ++ heap_ptr = next_heap_ptr; ++ } ++ ++ return heap_addr; ++} ++ ++/* Free the heap. */ ++int __psp_free_heap(void) ++{ ++ if (__psp_heap_blockid > 0) { ++ return sceKernelFreePartitionMemory(__psp_heap_blockid); ++ } ++ ++ return __psp_heap_blockid; ++} ++#endif ++ ++/* Other POSIX routines that must be defined. */ ++#ifdef F__fstat ++int _fstat(int fd, struct stat *sbuf) ++{ ++ int ret; ++ SceOff oldpos; ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_TTY: ++ memset(sbuf, '\0', sizeof(struct stat)); ++ sbuf->st_mode = S_IFCHR; ++ return 0; ++ break; ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ if (__psp_descriptormap[fd]->filename != NULL) { ++ ret = stat(__psp_descriptormap[fd]->filename, sbuf); ++ ++ /* Find true size of the open file */ ++ oldpos = sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, 0, SEEK_CUR); ++ if (oldpos != (off_t) -1) { ++ sbuf->st_size = (off_t) sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, 0, SEEK_END); ++ sceIoLseek(__psp_descriptormap[fd]->sce_descriptor, oldpos, SEEK_SET); ++ } ++ return ret; ++ } ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ default: ++ break; ++ } ++ ++ errno = EBADF; ++ return -1; ++} ++#endif ++ ++#ifdef F_isatty ++int isatty(int fd) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return 0; ++ } ++ ++ if (__psp_descriptormap[fd]->type == __PSP_DESCRIPTOR_TYPE_TTY) { ++ return 1; ++ } ++ else { ++ return 0; ++ } ++} ++#endif ++ ++#ifdef F__stat ++static time_t psp_to_epoch_time(ScePspDateTime psp_time) ++{ ++ struct tm conv_time; ++ conv_time.tm_year = psp_time.year; ++ conv_time.tm_mon = psp_time.month; ++ conv_time.tm_mday = psp_time.day; ++ conv_time.tm_hour = psp_time.hour; ++ conv_time.tm_min = psp_time.minute; ++ conv_time.tm_sec = psp_time.second; ++ conv_time.tm_isdst = -1; ++ return mktime(&conv_time); ++} ++ ++int _stat(const char *filename, struct stat *buf) ++{ ++ SceIoStat psp_stat; ++ char dest[MAXPATHLEN + 1]; ++ int ret; ++ ++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ memset(buf, '\0', sizeof(struct stat)); ++ ret = sceIoGetstat(dest, &psp_stat); ++ if (ret < 0) { ++ return __psp_set_errno(ret); ++ } ++ ++ buf->st_ctime = psp_to_epoch_time(psp_stat.st_ctime); ++ buf->st_atime = psp_to_epoch_time(psp_stat.st_atime); ++ buf->st_mtime = psp_to_epoch_time(psp_stat.st_mtime); ++ ++ buf->st_mode = (psp_stat.st_mode & 0xfff) | ++ ((FIO_S_ISLNK(psp_stat.st_mode))?(S_IFLNK):(0)) | ++ ((FIO_S_ISREG(psp_stat.st_mode))?(S_IFREG):(0)) | ++ ((FIO_S_ISDIR(psp_stat.st_mode))?(S_IFDIR):(0)); ++ buf->st_size = psp_stat.st_size; ++ return 0; ++} ++#endif ++ ++/* from stat.h in ps2sdk, this function may be correct */ ++#define FIO_CST_SIZE 0x0004 ++ ++#ifdef F_truncate ++int truncate(const char *filename, off_t length) ++{ ++ SceIoStat psp_stat; ++ char dest[MAXPATHLEN + 1]; ++ ++ if(__psp_path_absolute(filename, dest, MAXPATHLEN) < 0) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ psp_stat.st_size = length; ++ if(length < 0) ++ { ++ errno = EINVAL; ++ return -1; ++ } ++ return __psp_set_errno(sceIoChstat(dest, &psp_stat, FIO_CST_SIZE)); ++} ++#endif ++ ++/* Unsupported newlib system calls. */ ++#ifdef F__fork ++pid_t fork(void) ++{ ++ errno = ENOSYS; ++ return (pid_t) -1; ++} ++#endif ++ ++#ifdef F__getpid ++pid_t _getpid(void) ++{ ++ errno = ENOSYS; ++ return (pid_t) -1; ++} ++#endif ++ ++#ifdef F__kill ++int _kill(int unused, int unused2) ++{ ++ errno = ENOSYS; ++ return -1; ++} ++#endif ++ ++#ifdef F__wait ++pid_t _wait(int *unused) ++{ ++ errno = ENOSYS; ++ return (pid_t) -1; ++} ++#endif ++ ++#ifdef F_access ++int access(const char *fn, int flags) ++{ ++ struct stat s; ++ if (stat(fn, &s)) ++ return -1; ++ if (s.st_mode & S_IFDIR) ++ return 0; ++ if (flags & W_OK) ++ { ++ if (s.st_mode & S_IWRITE) ++ return 0; ++ errno = EACCES; ++ return -1; ++ } ++ return 0; ++} ++#endif ++ ++#ifdef F__fcntl ++int _fcntl(int fd, int cmd, ...) ++{ ++ if (!__PSP_IS_FD_VALID(fd)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ switch (cmd) ++ { ++ case F_DUPFD: ++ { ++ return __psp_fdman_get_dup_descriptor(fd); ++ break; ++ } ++ case F_GETFL: ++ { ++ return __psp_descriptormap[fd]->flags; ++ break; ++ } ++ case F_SETFL: ++ { ++ int newfl; ++ va_list args; ++ ++ va_start (args, cmd); /* Initialize the argument list. */ ++ newfl = va_arg(args, int); ++ va_end (args); /* Clean up. */ ++ ++ __psp_descriptormap[fd]->flags = newfl; ++ ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ break; ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ if (newfl & O_NONBLOCK) ++ { ++ int one = 1; ++ return setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, (char *)&one, sizeof(one)); ++ } ++ else ++ { ++ int zero = 0; ++ return setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, (char *)&zero, sizeof(zero)); ++ } ++ break; ++ default: ++ break; ++ } ++ return 0; ++ break; ++ } ++ } ++ ++ errno = EBADF; ++ return -1; ++} ++#endif /* F__fcntl */ ++ ++#ifdef F_tzset ++void tzset(void) ++{ ++ static int initialized = 0; ++ ++ if (!initialized) ++ { ++ initialized = 1; ++ ++ /* Don't init if TZ has already been set once, this probably means the user ++ wanted to override what we would set below. */ ++ if (getenv("TZ") == NULL) ++ { ++ /* Initialize timezone from PSP configuration */ ++ int tzOffset = 0; ++ sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_TIMEZONE, &tzOffset); ++ int tzOffsetAbs = tzOffset < 0 ? -tzOffset : tzOffset; ++ int hours = tzOffsetAbs / 60; ++ int minutes = tzOffsetAbs - hours * 60; ++ int pspDaylight = 0; ++ sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS, &pspDaylight); ++ static char tz[18]; ++ sprintf(tz, "GMT%s%02i:%02i%s", tzOffset < 0 ? "+" : "-", hours, minutes, pspDaylight ? "daylight" : ""); ++ setenv("TZ", tz, 1); ++ } ++ } ++ ++ _tzset_r(_REENT); ++} ++#endif ++ ++#ifdef F_mlock ++static unsigned int lock_count = 0; ++static unsigned int intr_flags = 0; ++ ++void __malloc_lock(struct _reent *ptr) ++{ ++ unsigned int flags = pspDisableInterrupts(); ++ ++ if (lock_count == 0) { ++ intr_flags = flags; ++ } ++ ++ lock_count++; ++} ++ ++void __malloc_unlock(struct _reent *ptr) ++{ ++ if (--lock_count == 0) { ++ pspEnableInterrupts(intr_flags); ++ } ++} ++#endif ++ ++/* Exit. */ ++#if defined(F__exit) || defined(F_glue__exit) ++extern int sce_newlib_nocreate_thread_in_start __attribute__((weak)); ++ ++extern int __psp_free_heap(void); ++ ++void _exit(int status) ++{ ++ if (&sce_newlib_nocreate_thread_in_start == NULL) { ++ /* Free the heap created by _sbrk(). */ ++ __psp_free_heap(); ++ ++ sceKernelSelfStopUnloadModule(1, 0, NULL); ++ } else { ++ if (status == 0) { ++ /* Free the heap created by _sbrk(). */ ++ __psp_free_heap(); ++ } ++ ++ sceKernelExitThread(status); ++ } ++ ++ while (1) ; ++} ++ ++/* Note: This function is being linked into _exit.o. ++ ++ Because __psp_libc_init is a weak import in crt0.c, the linker ++ chooses to ignore an object file in libc.a that contains just this ++ function, since it's not necessary for successful compilation. ++ ++ By putting it instead in _exit.o, which is already used by crt0.c, ++ the linker sees __psp_libc_init and resolves the symbol properly. ++*/ ++void __psp_libc_init(int argc, char *argv[]) ++{ ++ (void) argc; ++ ++ /* Initialize cwd from this program's path */ ++ __psp_init_cwd(argv[0]); ++ ++ /* Initialize filedescriptor management */ ++ __psp_fdman_init(); ++} ++ ++#endif /* F__exit */ ++ +--- newlib-1.13.0/newlib/libc/sys/psp/netdb.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/netdb.c 2006-03-13 00:00:00.000000000 -0500 +@@ -0,0 +1,101 @@ ++/* Simple gethostbyname and gethostbyaddr replacements using the resolver lib */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define MAX_NAME 512 ++ ++#ifdef F_h_errno ++int h_errno = NETDB_SUCCESS; ++#endif ++ ++#ifdef F_gethostbyaddr ++struct hostent *gethostbyaddr(const void *addr, int len, int type) ++{ ++ static struct hostent ent; ++ char buf[1024]; ++ static char sname[MAX_NAME] = ""; ++ static struct in_addr saddr = { 0 }; ++ static char *addrlist[2] = { (char *) &saddr, NULL }; ++ int rid; ++ int err; ++ ++ if((len != sizeof(struct in_addr)) || (type != AF_INET) || (addr == NULL)) ++ { ++ h_errno = HOST_NOT_FOUND; ++ return NULL; ++ } ++ ++ memcpy(&saddr, addr, len); ++ ++ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0) ++ { ++ h_errno = NO_RECOVERY; ++ return NULL; ++ } ++ ++ err = sceNetResolverStartAtoN(rid, &saddr, sname, sizeof(sname), 2, 3); ++ sceNetResolverDelete(rid); ++ if(err < 0) ++ { ++ h_errno = HOST_NOT_FOUND; ++ return NULL; ++ } ++ ++ ent.h_name = sname; ++ ent.h_aliases = 0; ++ ent.h_addrtype = AF_INET; ++ ent.h_length = sizeof(struct in_addr); ++ ent.h_addr_list = addrlist; ++ ent.h_addr = (char *) &saddr; ++ ++ return &ent; ++} ++#endif ++ ++#ifdef F_gethostbyname ++struct hostent *gethostbyname(const char *name) ++{ ++ static struct hostent ent; ++ char buf[1024]; ++ static char sname[MAX_NAME] = ""; ++ static struct in_addr saddr = { 0 }; ++ static char *addrlist[2] = { (char *) &saddr, NULL }; ++ int rid; ++ ++ if(sceNetInetInetAton(name, &saddr) == 0) ++ { ++ int err; ++ ++ if(sceNetResolverCreate(&rid, buf, sizeof(buf)) < 0) ++ { ++ h_errno = NO_RECOVERY; ++ return NULL; ++ } ++ ++ err = sceNetResolverStartNtoA(rid, name, &saddr, 2, 3); ++ sceNetResolverDelete(rid); ++ if(err < 0) ++ { ++ h_errno = HOST_NOT_FOUND; ++ return NULL; ++ } ++ ++ } ++ ++ snprintf(sname, MAX_NAME, "%s", name); ++ ent.h_name = sname; ++ ent.h_aliases = 0; ++ ent.h_addrtype = AF_INET; ++ ent.h_length = sizeof(struct in_addr); ++ ent.h_addr_list = addrlist; ++ ent.h_addr = (char *) &saddr; ++ ++ return &ent; ++} ++ ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/netinet/in.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/netinet/in.h 2006-05-02 11:27:30.000000000 -0400 +@@ -0,0 +1,271 @@ ++/* $NetBSD: in.h,v 1.71 2005/08/05 09:21:25 elad Exp $ */ ++ ++/* ++ * Copyright (c) 1982, 1986, 1990, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * ++ * @(#)in.h 8.3 (Berkeley) 1/3/94 ++ */ ++ ++/* ++ * Constants and structures defined by the internet system, ++ * Per RFC 790, September 1981, and numerous additions. ++ */ ++ ++#ifndef _NETINET_IN_H_ ++#define _NETINET_IN_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++typedef uint32_t in_addr_t; ++typedef uint16_t in_port_t; ++ ++/* ++ * Protocols ++ */ ++#define IPPROTO_IP 0 /* dummy for IP */ ++#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */ ++#define IPPROTO_ICMP 1 /* control message protocol */ ++#define IPPROTO_IGMP 2 /* group mgmt protocol */ ++#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ ++#define IPPROTO_IPV4 4 /* IP header */ ++#define IPPROTO_IPIP 4 /* IP inside IP */ ++#define IPPROTO_TCP 6 /* tcp */ ++#define IPPROTO_EGP 8 /* exterior gateway protocol */ ++#define IPPROTO_PUP 12 /* pup */ ++#define IPPROTO_UDP 17 /* user datagram protocol */ ++#define IPPROTO_IDP 22 /* xns idp */ ++#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ ++#define IPPROTO_IPV6 41 /* IP6 header */ ++#define IPPROTO_ROUTING 43 /* IP6 routing header */ ++#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */ ++#define IPPROTO_RSVP 46 /* resource reservation */ ++#define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */ ++#define IPPROTO_ESP 50 /* encap. security payload */ ++#define IPPROTO_AH 51 /* authentication header */ ++#define IPPROTO_MOBILE 55 /* IP Mobility RFC 2004 */ ++#define IPPROTO_IPV6_ICMP 58 /* IPv6 ICMP */ ++#define IPPROTO_ICMPV6 58 /* ICMP6 */ ++#define IPPROTO_NONE 59 /* IP6 no next header */ ++#define IPPROTO_DSTOPTS 60 /* IP6 destination option */ ++#define IPPROTO_EON 80 /* ISO cnlp */ ++#define IPPROTO_ETHERIP 97 /* Ethernet-in-IP */ ++#define IPPROTO_ENCAP 98 /* encapsulation header */ ++#define IPPROTO_PIM 103 /* Protocol indep. multicast */ ++#define IPPROTO_IPCOMP 108 /* IP Payload Comp. Protocol */ ++#define IPPROTO_VRRP 112 /* VRRP RFC 2338 */ ++ ++#define IPPROTO_RAW 255 /* raw IP packet */ ++#define IPPROTO_MAX 256 ++ ++/* last return value of *_input(), meaning "all job for this pkt is done". */ ++#define IPPROTO_DONE 257 ++ ++/* sysctl placeholder for (FAST_)IPSEC */ ++#define CTL_IPPROTO_IPSEC 258 ++ ++ ++/* ++ * Local port number conventions: ++ * ++ * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root), ++ * unless a kernel is compiled with IPNOPRIVPORTS defined. ++ * ++ * When a user does a bind(2) or connect(2) with a port number of zero, ++ * a non-conflicting local port address is chosen. ++ * ++ * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although ++ * that is settable by sysctl(3); net.inet.ip.anonportmin and ++ * net.inet.ip.anonportmax respectively. ++ * ++ * A user may set the IPPROTO_IP option IP_PORTRANGE to change this ++ * default assignment range. ++ * ++ * The value IP_PORTRANGE_DEFAULT causes the default behavior. ++ * ++ * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT, ++ * and exists only for FreeBSD compatibility purposes. ++ * ++ * The value IP_PORTRANGE_LOW changes the range to the "low" are ++ * that is (by convention) restricted to privileged processes. ++ * This convention is based on "vouchsafe" principles only. ++ * It is only secure if you trust the remote host to restrict these ports. ++ * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX. ++ */ ++ ++#define IPPORT_RESERVED 1024 ++#define IPPORT_ANONMIN 49152 ++#define IPPORT_ANONMAX 65535 ++#define IPPORT_RESERVEDMIN 600 ++#define IPPORT_RESERVEDMAX (IPPORT_RESERVED-1) ++ ++/* ++ * Internet address (a structure for historical reasons) ++ */ ++struct in_addr { ++ in_addr_t s_addr; ++} __attribute__((__packed__)); ++ ++#define __IPADDR(x) ((uint32_t)(x)) ++ ++#define IN_CLASSA(i) (((uint32_t)(i) & __IPADDR(0x80000000)) == \ ++ __IPADDR(0x00000000)) ++#define IN_CLASSA_NET __IPADDR(0xff000000) ++#define IN_CLASSA_NSHIFT 24 ++#define IN_CLASSA_HOST __IPADDR(0x00ffffff) ++#define IN_CLASSA_MAX 128 ++ ++#define IN_CLASSB(i) (((uint32_t)(i) & __IPADDR(0xc0000000)) == \ ++ __IPADDR(0x80000000)) ++#define IN_CLASSB_NET __IPADDR(0xffff0000) ++#define IN_CLASSB_NSHIFT 16 ++#define IN_CLASSB_HOST __IPADDR(0x0000ffff) ++#define IN_CLASSB_MAX 65536 ++ ++#define IN_CLASSC(i) (((uint32_t)(i) & __IPADDR(0xe0000000)) == \ ++ __IPADDR(0xc0000000)) ++#define IN_CLASSC_NET __IPADDR(0xffffff00) ++#define IN_CLASSC_NSHIFT 8 ++#define IN_CLASSC_HOST __IPADDR(0x000000ff) ++ ++#define IN_CLASSD(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ ++ __IPADDR(0xe0000000)) ++/* These ones aren't really net and host fields, but routing needn't know. */ ++#define IN_CLASSD_NET __IPADDR(0xf0000000) ++#define IN_CLASSD_NSHIFT 28 ++#define IN_CLASSD_HOST __IPADDR(0x0fffffff) ++#define IN_MULTICAST(i) IN_CLASSD(i) ++ ++#define IN_EXPERIMENTAL(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ ++ __IPADDR(0xf0000000)) ++#define IN_BADCLASS(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ ++ __IPADDR(0xf0000000)) ++ ++#define IN_LOCAL_GROUP(i) (((uint32_t)(i) & __IPADDR(0xffffff00)) == \ ++ __IPADDR(0xe0000000)) ++ ++#define INADDR_ANY __IPADDR(0x00000000) ++#define INADDR_LOOPBACK __IPADDR(0x7f000001) ++#define INADDR_BROADCAST __IPADDR(0xffffffff) /* must be masked */ ++ ++#define INADDR_UNSPEC_GROUP __IPADDR(0xe0000000) /* 224.0.0.0 */ ++#define INADDR_ALLHOSTS_GROUP __IPADDR(0xe0000001) /* 224.0.0.1 */ ++#define INADDR_ALLRTRS_GROUP __IPADDR(0xe0000002) /* 224.0.0.2 */ ++#define INADDR_MAX_LOCAL_GROUP __IPADDR(0xe00000ff) /* 224.0.0.255 */ ++ ++#define IN_LOOPBACKNET 127 /* official! */ ++ ++/* ++ * Socket address, internet style. ++ */ ++struct sockaddr_in { ++ uint8_t sin_len; ++ sa_family_t sin_family; ++ in_port_t sin_port; ++ struct in_addr sin_addr; ++ int8_t sin_zero[8]; ++}; ++ ++#define INET_ADDRSTRLEN 16 ++ ++/* ++ * Structure used to describe IP options. ++ * Used to store options internally, to pass them to a process, ++ * or to restore options retrieved earlier. ++ * The ip_dst is used for the first-hop gateway when using a source route ++ * (this gets put into the header proper). ++ */ ++struct ip_opts { ++ struct in_addr ip_dst; /* first hop, 0 w/o src rt */ ++#if defined(__cplusplus) ++ int8_t Ip_opts[40]; /* actually variable in size */ ++#else ++ int8_t ip_opts[40]; /* actually variable in size */ ++#endif ++}; ++ ++/* ++ * Options for use with [gs]etsockopt at the IP level. ++ * First word of comment is data type; bool is stored in int. ++ */ ++#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ ++#define IP_HDRINCL 2 /* int; header is included with data */ ++#define IP_TOS 3 /* int; IP type of service and preced. */ ++#define IP_TTL 4 /* int; IP time to live */ ++#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ ++#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ ++#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ ++#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ ++#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */ ++#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ ++#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ ++#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ ++#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ ++#define IP_PORTRANGE 19 /* int; range to use for ephemeral port */ ++#define IP_RECVIF 20 /* bool; receive reception if w/dgram */ ++#define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */ ++#if 1 /*IPSEC*/ ++#define IP_IPSEC_POLICY 22 /* struct; get/set security policy */ ++#endif ++ ++/* ++ * Defaults and limits for options ++ */ ++#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ ++#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ ++#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */ ++ ++/* ++ * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. ++ */ ++struct ip_mreq { ++ struct in_addr imr_multiaddr; /* IP multicast address of group */ ++ struct in_addr imr_interface; /* local IP address of interface */ ++}; ++ ++/* ++ * Argument for IP_PORTRANGE: ++ * - which range to search when port is unspecified at bind() or connect() ++ */ ++#define IP_PORTRANGE_DEFAULT 0 /* default range */ ++#define IP_PORTRANGE_HIGH 1 /* same as DEFAULT (FreeBSD compat) */ ++#define IP_PORTRANGE_LOW 2 /* use privileged range */ ++ ++#define ntohs(x) __builtin_allegrex_wsbh(x) ++#define ntohl(x) __builtin_allegrex_wsbw(x) ++#define htons(x) __builtin_allegrex_wsbh(x) ++#define htonl(x) __builtin_allegrex_wsbw(x) ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* !_NETINET_IN_H_ */ +--- newlib-1.13.0/newlib/libc/sys/psp/netinet/tcp.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/netinet/tcp.h 2006-05-02 11:27:30.000000000 -0400 +@@ -0,0 +1,12 @@ ++#ifndef __NETINET_TCP_H__ ++#define __NETINET_TCP_H__ ++ ++#include ++ ++#define SOL_TCP IPPROTO_TCP ++ ++/* Socket options */ ++#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ ++#define TCP_MAXSEG 0x02 /* set maximum segment size */ ++ ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/pipe.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/pipe.c 2006-04-28 10:08:50.000000000 -0400 +@@ -0,0 +1,271 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * pipe.c - Socket wrappers to provide similar functions to normal unix ++ * ++ * Copyright (c) 2006 Rafael Cabezas ++ * ++ */ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include "fdman.h" ++ ++/* Pipe functions */ ++/* Returns how many bytes are in the pipe -- waiting to be read */ ++size_t __psp_pipe_peekmsgsize(int fd) ++{ ++ SceKernelMppInfo info; ++ info.size = sizeof(info); ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) { ++ return (info.bufSize - info.freeSize); ++ } ++ else { ++ return -1; ++ } ++} ++ ++int pipe(int fildes[2]) ++{ ++ static int iIndex = 0; ++ char name[32]; ++ iIndex++; ++ ++ sprintf(name, "__psp_pipe_%02d", iIndex); ++ ++ SceUID uid = sceKernelCreateMsgPipe(name, PSP_MEMORY_PARTITION_USER, 0, (void *)PIPE_BUF, NULL); ++ ++ if (uid >= 0) { ++ fildes[0] = __psp_fdman_get_new_descriptor(); ++ if (fildes[0] != -1) { ++ __psp_descriptormap[fildes[0]]->sce_descriptor = uid; ++ __psp_descriptormap[fildes[0]]->type = __PSP_DESCRIPTOR_TYPE_PIPE; ++ } ++ else { ++ sceKernelDeleteMsgPipe(uid); ++ errno = EFAULT; ++ return -1; ++ } ++ ++ fildes[1] = __psp_fdman_get_dup_descriptor(fildes[0]); ++ if (fildes[1] != -1) { ++ __psp_descriptormap[fildes[1]]->sce_descriptor = uid; ++ return 0; ++ } ++ else { ++ sceKernelDeleteMsgPipe(uid); ++ errno = EFAULT; ++ return -1; ++ } ++ ++ } ++ else { ++ errno = EFAULT; ++ return -1; ++ } ++} ++ ++int __psp_pipe_close(int fd) ++{ ++ int ret = 0; ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ++ if ( __psp_descriptormap[fd]->ref_count == 1 ) { ++ /** ++ * Delete a message pipe ++ * ++ * @param uid - The UID of the pipe ++ * ++ * @return 0 on success, < 0 on error ++ */ ++ ret = sceKernelDeleteMsgPipe(__psp_descriptormap[fd]->sce_descriptor); ++ } ++ ++ __psp_fdman_release_descriptor(fd); ++ ++ if(ret < 0) { ++ return __psp_set_errno(ret); ++ } ++ ++ return 0; ++} ++ ++int __psp_pipe_nonblocking_read(int fd, void *buf, size_t len) ++{ ++ int ret; ++ int sceuid; ++ int size; ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ sceuid = __psp_descriptormap[fd]->sce_descriptor; ++ ++ size = __psp_pipe_peekmsgsize(fd); ++ if (size > 0) { ++ if (size < len) { ++ len = size; ++ } ++ } ++ else { ++ errno = EBADF; ++ return -1; ++ } ++ ++ /** ++ * Receive a message from a pipe ++ * ++ * @param uid - The UID of the pipe ++ * @param message - Pointer to the message ++ * @param size - Size of the message ++ * @param unk1 - Unknown ++ * @param unk2 - Unknown ++ * @param timeout - Timeout for receive ++ * ++ * @return 0 on success, < 0 on error ++ */ ++ ret = sceKernelTryReceiveMsgPipe(sceuid, buf, len, 0, 0); ++ ++ if (ret == 0) {/* Success - Data */ ++ return len; ++ } ++ else if (ret == SCE_KERNEL_ERROR_MPP_EMPTY) {/* No data */ ++ errno = EAGAIN; ++ return -1; ++ } ++ else {/* Error */ ++ return __psp_set_errno(ret); ++ } ++} ++ ++int __psp_pipe_read(int fd, void *buf, size_t len) ++{ ++ int ret; ++ int sceuid; ++ int size; ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ sceuid = __psp_descriptormap[fd]->sce_descriptor; ++ ++ size = __psp_pipe_peekmsgsize(fd); ++ if (size > 0) { ++ if (size < len) { ++ len = size; ++ } ++ } ++ else { ++ errno = EBADF; ++ return -1; ++ } ++ ++ /** ++ * Receive a message from a pipe ++ * ++ * @param uid - The UID of the pipe ++ * @param message - Pointer to the message ++ * @param size - Size of the message ++ * @param unk1 - Unknown ++ * @param unk2 - Unknown ++ * @param timeout - Timeout for receive ++ * ++ * @return 0 on success, < 0 on error ++ */ ++ ret = sceKernelReceiveMsgPipe(sceuid, buf, len, 0, NULL, NULL); ++ ++ if (ret == 0) {/* Success - Data */ ++ return len; ++ } ++ else {/* Error */ ++ return __psp_set_errno(ret); ++ } ++} ++ ++int __psp_pipe_write(int fd, const void *buf, size_t len) ++{ ++ int ret; ++ int sceuid; ++ char *cbuf; ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ sceuid = __psp_descriptormap[fd]->sce_descriptor; ++ ++ /** ++ * Send a message to a pipe ++ * ++ * @param uid - The UID of the pipe ++ * @param message - Pointer to the message ++ * @param size - Size of the message ++ * @param unk1 - Unknown ++ * @param unk2 - Unknown ++ * @param timeout - Timeout for send ++ * ++ * @return 0 on success, < 0 on error ++ */ ++ cbuf = (char *)buf; ++ ret = sceKernelSendMsgPipe(sceuid, cbuf, len, 0, NULL, NULL); ++ ++ if (ret == 0) {/* Success - Data */ ++ return len; ++ } ++ else {/* Error */ ++ return __psp_set_errno(ret); ++ } ++} ++ ++int __psp_pipe_nonblocking_write(int fd, const void *buf, size_t len) ++{ ++ int ret; ++ int sceuid; ++ char *cbuf; ++ ++ if (!__PSP_IS_FD_OF_TYPE(fd, __PSP_DESCRIPTOR_TYPE_PIPE)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ sceuid = __psp_descriptormap[fd]->sce_descriptor; ++ ++ cbuf = (char *)buf; ++ ret = sceKernelTrySendMsgPipe(sceuid, cbuf, len, 0, 0); ++ ++ if (ret == 0) {/* Success - Data */ ++ return len; ++ } ++ else if (ret == SCE_KERNEL_ERROR_MPP_FULL) { ++ errno = EAGAIN; ++ return -1; ++ } ++ else {/* Error */ ++ return __psp_set_errno(ret); ++ } ++} ++ +--- newlib-1.13.0/newlib/libc/sys/psp/pspcwd.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/pspcwd.c 2006-04-26 10:50:46.000000000 -0400 +@@ -0,0 +1,166 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * pspcwd.c - Current working directory emulation helper functions ++ * ++ * Copyright (c) 2005 Marcus R. Brown ++ * Copyright (c) 2005 James Forshaw ++ * Copyright (c) 2005 John Kelley ++ * Copyright (c) 2005 Jim Paris ++ * ++ */ ++#include ++#include ++#include ++ ++#include ++#include ++ ++char __psp_cwd[MAXPATHLEN + 1] = { 0 }; ++ ++/* Set the current working directory (CWD) to the path where the module was launched. */ ++void __psp_init_cwd(char *argv_0) ++{ ++ if (argv_0 != NULL) { ++ char base_path[MAXPATHLEN + 1]; ++ char *end; ++ ++ strncpy(base_path, argv_0, sizeof(base_path) - 1); ++ base_path[sizeof(base_path) - 1] = '\0'; ++ end = strrchr(base_path, '/'); ++ if (end != NULL) { ++ *(end + 1) = '\0'; ++ chdir(base_path); ++ } ++ } ++} ++ ++/* Return the number of bytes taken up by the "drive:" prefix, ++ or -1 if it's not found */ ++int __psp_get_drive(const char *d) ++{ ++ int i; ++ for(i=0; d[i]; i++) { ++ if(! ((d[i] >= 'a' && d[i] <= 'z') || ++ (d[i] >= '0' && d[i] <= '9') )) ++ break; ++ } ++ if(d[i] == ':') return i+1; ++ return -1; ++} ++ ++/* Like strcpy, but returns 0 if the string doesn't fit */ ++int __psp_safe_strcpy(char *out, const char *in, int maxlen) ++{ ++ for( ; maxlen > 0 && *in ; maxlen-- ) ++ *(out++) = *(in++); ++ if(maxlen < 1) return 0; ++ *out = 0; ++ return 1; ++} ++ ++/* Like strcat, but returns 0 if the string doesn't fit */ ++int __psp_safe_strcat(char *out, const char *in, int maxlen) ++{ ++ for( ; *out ; out++,maxlen-- ) ++ continue; ++ return __psp_safe_strcpy(out, in, maxlen); ++} ++ ++/* Normalize a pathname (without leading "drive:") by removing ++ . and .. components, duplicated /, etc. */ ++int __psp_path_normalize(char *out, int len) ++{ ++ int i, j; ++ int first, next; ++ ++ /* First append "/" to make the rest easier */ ++ if(!__psp_safe_strcat(out,"/",len)) return -10; ++ ++ /* Convert "//" to "/" */ ++ for(i=0; out[i+1]; i++) { ++ if(out[i]=='/' && out[i+1]=='/') { ++ for(j=i+1; out[j]; j++) ++ out[j] = out[j+1]; ++ i--; ++ } ++ } ++ ++ /* Convert "/./" to "/" */ ++ for(i=0; out[i] && out[i+1] && out[i+2]; i++) { ++ if(out[i]=='/' && out[i+1]=='.' && out[i+2]=='/') { ++ for(j=i+1; out[j]; j++) ++ out[j] = out[j+2]; ++ i--; ++ } ++ } ++ ++ /* Convert "/asdf/../" to "/" until we can't anymore. Also ++ * convert leading "/../" to "/" */ ++ first = next = 0; ++ while(1) { ++ /* If a "../" follows, remove it and the parent */ ++ if(out[next+1] && out[next+1]=='.' && ++ out[next+2] && out[next+2]=='.' && ++ out[next+3] && out[next+3]=='/') { ++ for(j=0; out[first+j+1]; j++) ++ out[first+j+1] = out[next+j+4]; ++ first = next = 0; ++ continue; ++ } ++ ++ /* Find next slash */ ++ first = next; ++ for(next=first+1; out[next] && out[next] != '/'; next++) ++ continue; ++ if(!out[next]) break; ++ } ++ ++ /* Remove trailing "/" */ ++ for(i=1; out[i]; i++) ++ continue; ++ if(i >= 1 && out[i-1] == '/') ++ out[i-1] = 0; ++ ++ return 0; ++} ++ ++/* Convert relative path to absolute path. */ ++int __psp_path_absolute(const char *in, char *out, int len) ++{ ++ int dr; ++ ++ /* See what the relative URL starts with */ ++ dr = __psp_get_drive(in); ++ if(dr > 0 && in[dr] == '/') { ++ /* It starts with "drive:/", so it's already absolute */ ++ if(!__psp_safe_strcpy(out, in, len)) ++ return -1; ++ } else if(in[0] == '/') { ++ /* It's absolute, but missing the drive, so use cwd's drive */ ++ if(strlen(__psp_cwd) >= len) ++ return -2; ++ strcpy(out, __psp_cwd); ++ dr = __psp_get_drive(out); ++ out[dr] = 0; ++ if(!__psp_safe_strcat(out, in, len)) ++ return -3; ++ } else { ++ /* It's not absolute, so append it to the current cwd */ ++ if(strlen(__psp_cwd) >= len) ++ return -4; ++ strcpy(out, __psp_cwd); ++ if(!__psp_safe_strcat(out, "/", len)) ++ return -6; ++ if(!__psp_safe_strcat(out, in, len)) ++ return -7; ++ } ++ ++ /* Now normalize the pathname portion */ ++ dr = __psp_get_drive(out); ++ if(dr < 0) dr = 0; ++ return __psp_path_normalize(out + dr, len - dr); ++} ++ +--- newlib-1.13.0/newlib/libc/sys/psp/select.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/select.c 2006-04-28 09:10:56.000000000 -0400 +@@ -0,0 +1,172 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * select.c - Socket wrappers to provide similar functions to normal unix ++ * ++ * Copyright (c) 2006 Rafael Cabezas ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++ ++#include "fdman.h" ++ ++#define SELECT_POLLING_DELAY_IN_us 100 ++ ++static int __psp_poll_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds); ++ ++int select(int n, fd_set *readfds, fd_set *writefds, ++ fd_set *exceptfds, struct timeval *timeout) ++{ ++ int count; ++ clock_t start_time, time; ++ ++ start_time = clock(); ++ ++ count = 0; ++ ++ if (timeout) { ++ time = (timeout->tv_sec * CLOCKS_PER_SEC) + (timeout->tv_usec * (1*1000*1000/CLOCKS_PER_SEC)); ++ } ++ else { ++ time = 0; ++ } ++ ++ for (;;) { ++ count = __psp_poll_select(n, readfds, writefds, exceptfds); ++ /* If timeout == NULL, then don't timeout! */ ++ if ( (count > 0) || ((timeout != NULL) && ((clock() - start_time) >= time)) ) { ++ break; ++ } ++ else { ++ /* Nothing found, and not timed-out yet; let's yield for SELECT_POLLING_DELAY_IN_us, so we're not in a busy loop */ ++ sceKernelDelayThread(SELECT_POLLING_DELAY_IN_us); ++ } ++ } ++ ++ return count; ++} ++ ++#define SCE_FD_SET(n, p) \ ++ ((p)->fds_bits[((n) & 0xFF) /__NFDBITS] |= (1 << ((n) % __NFDBITS))) ++ ++static int __psp_poll_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds) ++{ ++ int fd, count; ++ fd_set ready_readfds, ready_writefds, ready_exceptfds; ++ fd_set scereadfds, scewritefds, sceexceptfds; ++ SceKernelMppInfo info; ++ struct timeval scetv; ++ ++ FD_ZERO(&ready_readfds); ++ FD_ZERO(&ready_writefds); ++ FD_ZERO(&ready_exceptfds); ++ ++ info.size = sizeof(info); ++ scetv.tv_sec = 0; ++ scetv.tv_usec = 0; ++ count = 0; ++ ++ for (fd = 0; fd < n; fd++) ++ { ++ if (__psp_descriptormap[fd] != NULL) { ++ switch(__psp_descriptormap[fd]->type) ++ { ++ case __PSP_DESCRIPTOR_TYPE_PIPE: ++ if (readfds && FD_ISSET(fd, readfds)) { ++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) { ++ if (info.bufSize != info.freeSize) { ++ FD_SET(fd, &ready_readfds); ++ count++; ++ } ++ } ++ else { ++ FD_SET(fd, &ready_exceptfds); ++ count++; ++ } ++ } ++ if (writefds && FD_ISSET(fd, writefds)) { ++ if (sceKernelReferMsgPipeStatus(__psp_descriptormap[fd]->sce_descriptor, &info) == 0) { ++ if (info.freeSize > 0) { ++ FD_SET(fd, &ready_writefds); ++ count++; ++ } ++ } ++ else { ++ FD_SET(fd, &ready_exceptfds); ++ count++; ++ } ++ } ++ break; ++ case __PSP_DESCRIPTOR_TYPE_FILE: ++ if (readfds && FD_ISSET(fd, readfds)) { ++ if (readfds && FD_ISSET(fd, readfds)) { ++ /** Just set it for now */ ++ FD_SET(fd, &ready_readfds); ++ count++; ++ } ++ } ++ break; ++ case __PSP_DESCRIPTOR_TYPE_SOCKET: ++ if (readfds && FD_ISSET(fd, readfds)) { ++ int sce_ret, sce_fd; ++ sce_fd = __psp_descriptormap[fd]->sce_descriptor; ++ FD_ZERO(&scereadfds); ++ SCE_FD_SET(sce_fd, &scereadfds); ++ errno = 0; ++ sce_ret = sceNetInetSelect (sce_fd+1, &scereadfds, NULL, NULL, &scetv); ++ if (sce_ret>0) { ++ FD_SET(fd, &ready_readfds); ++ count++; ++ } ++ else if (sce_ret == -1) { ++ errno = sceNetInetGetErrno(); ++ if (exceptfds && FD_ISSET(fd, exceptfds)) { ++ FD_SET(fd, &ready_exceptfds); ++ count++; ++ } else { ++ count = -1; ++ } ++ } ++ } ++ if (writefds && FD_ISSET(fd, writefds)) { ++ int sce_ret; ++ FD_ZERO(&scewritefds); ++ SCE_FD_SET(__psp_descriptormap[fd]->sce_descriptor, &scewritefds); ++ sce_ret = sceNetInetSelect (__psp_descriptormap[fd]->sce_descriptor+1, NULL, &scewritefds, NULL, &scetv); ++ if (sce_ret>0) { ++ FD_SET(fd, &ready_writefds); ++ count++; ++ } ++ else if (sce_ret == -1) { ++ if (exceptfds && FD_ISSET(fd, exceptfds)) { ++ FD_SET(fd, &ready_exceptfds); ++ count++; ++ } ++ else { ++ count = -1; ++ } ++ } ++ } ++ break; ++ } ++ } ++ } ++ ++ if (count > 0) { ++ if (readfds) ++ *readfds = ready_readfds; ++ if (writefds) ++ *writefds = ready_writefds; ++ if (exceptfds) ++ *exceptfds = ready_exceptfds; ++ } ++ ++ return count; ++} ++ +--- newlib-1.13.0/newlib/libc/sys/psp/socket.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/socket.c 2006-04-28 10:11:57.000000000 -0400 +@@ -0,0 +1,390 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * socket.c - Socket wrappers to provide similar functions to normal unix ++ * ++ * Copyright (c) 2005 Marcus R. Brown ++ * Copyright (c) 2005 James Forshaw ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include "fdman.h" ++ ++#ifdef F_socket ++int socket(int domain, int type, int protocol) ++{ ++ int sock, scesock; ++ int i; ++ ++ scesock = sceNetInetSocket(domain, type, protocol); ++ if(scesock < 0) { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ sock = __psp_fdman_get_new_descriptor(); ++ if( sock != -1 ) { ++ __psp_descriptormap[sock]->sce_descriptor = scesock; ++ __psp_descriptormap[sock]->type = __PSP_DESCRIPTOR_TYPE_SOCKET; ++ } ++ else { ++ sceNetInetClose(scesock); ++ errno = ENOENT; ++ return -1; ++ } ++ ++ return sock; ++} ++ ++/* These are glue routines that are called from _close(), _read(), and ++ _write(). They are here so that any program that uses socket() will pull ++ them in and have expanded socket capability. */ ++ ++int __psp_socket_close(int sock) ++{ ++ int ret = 0; ++ ++ if (__psp_descriptormap[sock]->ref_count == 1) { ++ ret = sceNetInetClose(__psp_descriptormap[sock]->sce_descriptor); ++ } ++ ++ __psp_fdman_release_descriptor(sock); ++ ++ if(ret < 0) ++ { ++ /* If close is defined likely errno is */ ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++ssize_t __psp_socket_recv(int s, void *buf, size_t len, int flags) ++{ ++ return recv(s, buf, len, flags); ++} ++ ++ssize_t __psp_socket_send(int s, const void *buf, size_t len, int flags) ++{ ++ return send(s, buf, len, flags); ++} ++#endif ++ ++#ifdef F_accept ++int accept(int s, struct sockaddr *addr, socklen_t *addrlen) ++{ ++ int newscesock, newsock; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ newscesock = sceNetInetAccept(__psp_descriptormap[s]->sce_descriptor, addr, addrlen); ++ if( (newscesock >= 0) ) { ++ newsock = __psp_fdman_get_new_descriptor(); ++ if ( newsock != -1 ) { ++ __psp_descriptormap[newsock]->sce_descriptor = newscesock; ++ __psp_descriptormap[newsock]->type = __PSP_DESCRIPTOR_TYPE_SOCKET; ++ } ++ else { ++ sceNetInetClose(newscesock); ++ errno = ENOENT; ++ return -1; ++ } ++ } ++ else { ++ errno = ENOENT; ++ return -1; ++ } ++ ++ return newsock; ++} ++#endif ++ ++#ifdef F_bind ++int bind(int s, const struct sockaddr *my_addr, socklen_t addrlen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetBind(__psp_descriptormap[s]->sce_descriptor, my_addr, addrlen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_connect ++int connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetConnect(__psp_descriptormap[s]->sce_descriptor, serv_addr, addrlen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_setsockopt ++int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetGetsockopt(__psp_descriptormap[s]->sce_descriptor, level, optname, optval, optlen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_listen ++int listen(int s, int backlog) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetListen(__psp_descriptormap[s]->sce_descriptor, backlog); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_recv ++ssize_t recv(int s, void *buf, size_t len, int flags) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetRecv(__psp_descriptormap[s]->sce_descriptor, buf, len, flags); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_recvfrom ++ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetRecvfrom(__psp_descriptormap[s]->sce_descriptor, buf, len, flags, from, fromlen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_send ++ssize_t send(int s, const void *buf, size_t len, int flags) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetSend(__psp_descriptormap[s]->sce_descriptor, buf, len, flags); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_sendto ++ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetSendto(__psp_descriptormap[s]->sce_descriptor, buf, len, flags, to, tolen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_setsockopt ++int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetSetsockopt(__psp_descriptormap[s]->sce_descriptor, level, optname, optval, optlen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ else ++ { ++ if ( (level == SOL_SOCKET) && (optname == SO_NONBLOCK) ) { ++ if (*((int*)optval) == 1) { ++ __psp_descriptormap[s]->flags |= O_NONBLOCK; ++ } ++ else { ++ __psp_descriptormap[s]->flags &= ~O_NONBLOCK; ++ } ++ } ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_shutdown ++int shutdown(int s, int how) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetShutdown(__psp_descriptormap[s]->sce_descriptor, how); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_getpeername ++int getpeername(int s, struct sockaddr *name, socklen_t *namelen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetGetpeername(__psp_descriptormap[s]->sce_descriptor, name, namelen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_getsockname ++int getsockname(int s, struct sockaddr *name, socklen_t *namelen) ++{ ++ int ret; ++ ++ if (!__PSP_IS_FD_OF_TYPE(s, __PSP_DESCRIPTOR_TYPE_SOCKET)) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ ret = sceNetInetGetsockname(__psp_descriptormap[s]->sce_descriptor, name, namelen); ++ if(ret < 0) ++ { ++ errno = sceNetInetGetErrno(); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++#ifdef F_inet_ntoa ++char *inet_ntoa(struct in_addr in) ++{ ++ static char ip_addr[INET_ADDRSTRLEN+1]; ++ ++ if(sceNetInetInetNtop(AF_INET, &in, ip_addr, INET_ADDRSTRLEN) == NULL) ++ { ++ strcpy(ip_addr, "Invalid"); ++ } ++ ++ return ip_addr; ++} ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/sys/dirent.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/dirent.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,39 @@ ++#ifndef _SYS_DIRENT_H ++#define _SYS_DIRENT_H ++ ++/* PSP dirent.h, based on pspiofilemgr_dirent.h ++ by Jim Paris */ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++#define MAXNAMLEN 255 ++ ++/* Same as SceIoDirent, just with a different name. */ ++struct dirent { ++ /** File status. */ ++ SceIoStat d_stat; ++ /** File name. */ ++ char d_name[256]; ++ /** Device-specific data. */ ++ void * d_private; ++ int dummy; ++}; ++ ++typedef struct { ++ SceUID uid; ++ struct dirent de; ++} DIR; ++ ++DIR *opendir (const char *); ++struct dirent *readdir (DIR *); ++int closedir (DIR *); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +--- newlib-1.13.0/newlib/libc/sys/psp/sys/errno.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/errno.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,158 @@ ++/* errno.h for PSP, based on newlib/libc/include/sys/errno.h. */ ++ ++#ifndef _SYS_ERRNO_H_ ++#ifdef __cplusplus ++extern "C" { ++#endif ++#define _SYS_ERRNO_H_ ++ ++#include ++ ++#ifndef _REENT_ONLY ++#define errno (*__errno()) ++extern int *__errno _PARAMS ((void)); ++#endif ++ ++/* Please don't use these variables directly. ++ Use strerror instead. */ ++extern __IMPORT _CONST char * _CONST _sys_errlist[]; ++extern __IMPORT int _sys_nerr; ++#ifdef __CYGWIN__ ++extern __IMPORT const char * const sys_errlist[]; ++extern __IMPORT int sys_nerr; ++#endif ++ ++#define __errno_r(ptr) ((ptr)->_errno) ++ ++#define EPERM 1 /* Not super-user */ ++#define ENOENT 2 /* No such file or directory */ ++#define ESRCH 3 /* No such process */ ++#define EINTR 4 /* Interrupted system call */ ++#define EIO 5 /* I/O error */ ++#define ENXIO 6 /* No such device or address */ ++#define E2BIG 7 /* Arg list too long */ ++#define ENOEXEC 8 /* Exec format error */ ++#define EBADF 9 /* Bad file number */ ++#define ECHILD 10 /* No children */ ++#define EAGAIN 11 /* No more processes */ ++#define ENOMEM 12 /* Not enough core */ ++#define EACCES 13 /* Permission denied */ ++#define EFAULT 14 /* Bad address */ ++#define ENOTBLK 15 /* Block device required */ ++#define EBUSY 16 /* Mount device busy */ ++#define EEXIST 17 /* File exists */ ++#define EXDEV 18 /* Cross-device link */ ++#define ENODEV 19 /* No such device */ ++#define ENOTDIR 20 /* Not a directory */ ++#define EISDIR 21 /* Is a directory */ ++#define EINVAL 22 /* Invalid argument */ ++#define ENFILE 23 /* Too many open files in system */ ++#define EMFILE 24 /* Too many open files */ ++#define ENOTTY 25 /* Not a typewriter */ ++#define ETXTBSY 26 /* Text file busy */ ++#define EFBIG 27 /* File too large */ ++#define ENOSPC 28 /* No space left on device */ ++#define ESPIPE 29 /* Illegal seek */ ++#define EROFS 30 /* Read only file system */ ++#define EMLINK 31 /* Too many links */ ++#define EPIPE 32 /* Broken pipe */ ++#define EDOM 33 /* Math arg out of domain of func */ ++#define ERANGE 34 /* Math result not representable */ ++#define ENOMSG 35 /* No message of desired type */ ++#define EIDRM 36 /* Identifier removed */ ++#define ECHRNG 37 /* Channel number out of range */ ++#define EL2NSYNC 38 /* Level 2 not synchronized */ ++#define EL3HLT 39 /* Level 3 halted */ ++#define EL3RST 40 /* Level 3 reset */ ++#define ELNRNG 41 /* Link number out of range */ ++#define EUNATCH 42 /* Protocol driver not attached */ ++#define ENOCSI 43 /* No CSI structure available */ ++#define EL2HLT 44 /* Level 2 halted */ ++#define EDEADLK 45 /* Deadlock condition */ ++#define ENOLCK 46 /* No record locks available */ ++#define EBADE 50 /* Invalid exchange */ ++#define EBADR 51 /* Invalid request descriptor */ ++#define EXFULL 52 /* Exchange full */ ++#define ENOANO 53 /* No anode */ ++#define EBADRQC 54 /* Invalid request code */ ++#define EBADSLT 55 /* Invalid slot */ ++#define EDEADLOCK 56 /* File locking deadlock error */ ++#define EBFONT 57 /* Bad font file fmt */ ++#define ENOSTR 60 /* Device not a stream */ ++#define ENODATA 61 /* No data (for no delay io) */ ++#define ETIME 62 /* Timer expired */ ++#define ENOSR 63 /* Out of streams resources */ ++#define ENONET 64 /* Machine is not on the network */ ++#define ENOPKG 65 /* Package not installed */ ++#define EREMOTE 66 /* The object is remote */ ++#define ENOLINK 67 /* The link has been severed */ ++#define EADV 68 /* Advertise error */ ++#define ESRMNT 69 /* Srmount error */ ++#define ECOMM 70 /* Communication error on send */ ++#define EPROTO 71 /* Protocol error */ ++#define EMULTIHOP 74 /* Multihop attempted */ ++#define ELBIN 75 /* Inode is remote (not really error) */ ++#define EDOTDOT 76 /* Cross mount point (not really error) */ ++#define EBADMSG 77 /* Trying to read unreadable message */ ++#define EFTYPE 79 /* Inappropriate file type or format */ ++#define ENOTUNIQ 80 /* Given log. name not unique */ ++#define EBADFD 81 /* f.d. invalid for this operation */ ++#define EREMCHG 82 /* Remote address changed */ ++#define ELIBACC 83 /* Can't access a needed shared lib */ ++#define ELIBBAD 84 /* Accessing a corrupted shared lib */ ++#define ELIBSCN 85 /* .lib section in a.out corrupted */ ++#define ELIBMAX 86 /* Attempting to link in too many libs */ ++#define ELIBEXEC 87 /* Attempting to exec a shared library */ ++#define ENOSYS 88 /* Function not implemented */ ++#define ENMFILE 89 /* No more files */ ++#define ENOTEMPTY 90 /* Directory not empty */ ++#define ENAMETOOLONG 91 /* File or path name too long */ ++#define ELOOP 92 /* Too many symbolic links */ ++#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ ++#define EPFNOSUPPORT 96 /* Protocol family not supported */ ++#define ECONNRESET 104 /* Connection reset by peer */ ++#define ENOBUFS 105 /* No buffer space available */ ++#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */ ++#define EPROTOTYPE 107 /* Protocol wrong type for socket */ ++#define ENOTSOCK 108 /* Socket operation on non-socket */ ++#define ENOPROTOOPT 109 /* Protocol not available */ ++#define ESHUTDOWN 110 /* Can't send after socket shutdown */ ++#define ECONNREFUSED 111 /* Connection refused */ ++#define EADDRINUSE 112 /* Address already in use */ ++#define ECONNABORTED 113 /* Connection aborted */ ++#define ENETUNREACH 114 /* Network is unreachable */ ++#define ENETDOWN 115 /* Network interface is not configured */ ++#define ETIMEDOUT 116 /* Connection timed out */ ++#define EHOSTDOWN 117 /* Host is down */ ++#define EHOSTUNREACH 118 /* Host is unreachable */ ++#define EINPROGRESS 119 /* Connection already in progress */ ++#define EALREADY 120 /* Socket already connected */ ++#define EDESTADDRREQ 121 /* Destination address required */ ++#define EMSGSIZE 122 /* Message too long */ ++#define EPROTONOSUPPORT 123 /* Unknown protocol */ ++#define ESOCKTNOSUPPORT 124 /* Socket type not supported */ ++#define EADDRNOTAVAIL 125 /* Address not available */ ++#define ENETRESET 126 ++#define EISCONN 127 /* Socket is already connected */ ++#define ENOTCONN 128 /* Socket is not connected */ ++#define ETOOMANYREFS 129 ++#define EPROCLIM 130 ++#define EUSERS 131 ++#define EDQUOT 132 ++#define ESTALE 133 ++#define ENOTSUP 134 /* Not supported */ ++#define ENOMEDIUM 135 /* No medium (in tape drive) */ ++#define ENOSHARE 136 /* No such host or network path */ ++#define ECASECLASH 137 /* Filename exists with different case */ ++#define EILSEQ 138 ++#define EOVERFLOW 139 /* Value too large for defined data type */ ++ ++/* From cygwin32. */ ++#define EWOULDBLOCK EAGAIN /* Operation would block */ ++ ++#define __ELASTERROR 2000 /* Users can add values starting here */ ++ ++#ifdef __cplusplus ++} ++#endif ++#endif /* _SYS_ERRNO_H */ +--- newlib-1.13.0/newlib/libc/sys/psp/sys/fd_set.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/fd_set.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,69 @@ ++/* $NetBSD: fd_set.h,v 1.1 2005/05/22 12:44:24 kleink Exp $ */ ++ ++/*- ++ * Copyright (c) 1992, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * ++ * from: @(#)types.h 8.4 (Berkeley) 1/21/94 ++ */ ++ ++#ifndef _SYS_FD_SET_H_ ++#define _SYS_FD_SET_H_ ++ ++#include ++#include ++ ++/* ++ * Implementation dependent defines, hidden from user space. X/Open does not ++ * specify them. ++ */ ++#define __NBBY 8 /* number of bits in a byte */ ++typedef uint32_t __fd_mask; ++ ++/* bits per mask */ ++#define __NFDBITS ((unsigned int)sizeof(__fd_mask) * __NBBY) ++ ++#define __howmany(x, y) (((x) + ((y) - 1)) / (y)) ++ ++#define FD_SETSIZE 256 ++ ++typedef struct fd_set { ++ __fd_mask fds_bits[__howmany(FD_SETSIZE, __NFDBITS)]; ++} fd_set; ++ ++#define FD_SET(n, p) \ ++ ((p)->fds_bits[(n) /__NFDBITS] |= (1 << ((n) % __NFDBITS))) ++ ++#define FD_CLR(n, p) \ ++ ((p)->fds_bits[(n) /__NFDBITS] &= ~(1 << ((n) % __NFDBITS))) ++ ++#define FD_ISSET(n, p) \ ++ ((p)->fds_bits[(n) /__NFDBITS] & (1 << ((n) % __NFDBITS))) ++ ++#define FD_ZERO(p) (void)__builtin_memset((p), 0, sizeof(*(p))) ++ ++#endif /* _SYS_FD_SET_H_ */ +--- newlib-1.13.0/newlib/libc/sys/psp/sys/ioctl.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/ioctl.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1 @@ ++/* Empty file, here for compatibility */ +--- newlib-1.13.0/newlib/libc/sys/psp/sys/select.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/select.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,54 @@ ++/* $NetBSD: select.h,v 1.24 2005/05/22 12:44:24 kleink Exp $ */ ++ ++/*- ++ * Copyright (c) 1992, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * ++ * @(#)select.h 8.2 (Berkeley) 1/4/94 ++ */ ++ ++#ifndef _SYS_SELECT_H_ ++#define _SYS_SELECT_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++#include ++ ++int sceNetInetSelect(int n, fd_set *readfds, fd_set *writefds, ++ fd_set *exceptfds, struct timeval *timeout); ++ ++int select(int n, fd_set *readfds, fd_set *writefds, ++ fd_set *exceptfds, struct timeval *timeout); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* !_SYS_SELECT_H_ */ +--- newlib-1.13.0/newlib/libc/sys/psp/sys/socket.h 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/sys/socket.h 2006-05-02 11:27:31.000000000 -0400 +@@ -0,0 +1,294 @@ ++/* $NetBSD: socket.h,v 1.77 2005/11/29 03:12:16 christos Exp $ */ ++ ++/* ++ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++/* ++ * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * ++ * @(#)socket.h 8.6 (Berkeley) 5/3/95 ++ */ ++ ++#ifndef _SYS_SOCKET_H_ ++#define _SYS_SOCKET_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++#include ++#include ++ ++typedef uint8_t sa_family_t; ++typedef uint32_t socklen_t; ++ ++/* ++ * Socket types. ++ */ ++#define SOCK_STREAM 1 /* stream socket */ ++#define SOCK_DGRAM 2 /* datagram socket */ ++#define SOCK_RAW 3 /* raw-protocol interface */ ++#define SOCK_RDM 4 /* reliably-delivered message */ ++#define SOCK_SEQPACKET 5 /* sequenced packet stream */ ++ ++/* ++ * Option flags per-socket. ++ */ ++#define SO_DEBUG 0x0001 /* turn on debugging info recording */ ++#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ ++#define SO_REUSEADDR 0x0004 /* allow local address reuse */ ++#define SO_KEEPALIVE 0x0008 /* keep connections alive */ ++#define SO_DONTROUTE 0x0010 /* just use interface addresses */ ++#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ ++#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ ++#define SO_LINGER 0x0080 /* linger on close if data present */ ++#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ ++#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ ++#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ ++ ++/* ++ * Additional options, not kept in so_options. ++ */ ++#define SO_SNDBUF 0x1001 /* send buffer size */ ++#define SO_RCVBUF 0x1002 /* receive buffer size */ ++#define SO_SNDLOWAT 0x1003 /* send low-water mark */ ++#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ ++#define SO_SNDTIMEO 0x1005 /* send timeout */ ++#define SO_RCVTIMEO 0x1006 /* receive timeout */ ++#define SO_ERROR 0x1007 /* get error status and clear */ ++#define SO_TYPE 0x1008 /* get socket type */ ++#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ ++#define SO_NONBLOCK 0x1009 /* non-blocking I/O */ ++ ++/* ++ * Structure used for manipulating linger option. ++ */ ++struct linger { ++ int l_onoff; /* option on/off */ ++ int l_linger; /* linger time in seconds */ ++}; ++ ++/* ++ * Level number for (get/set)sockopt() to apply to socket itself. ++ */ ++#define SOL_SOCKET 0xffff /* options for socket level */ ++ ++/* ++ * Address families. ++ */ ++#define AF_UNSPEC 0 /* unspecified */ ++#define AF_LOCAL 1 /* local to host (pipes, portals) */ ++#define AF_UNIX AF_LOCAL /* backward compatibility */ ++#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ ++#define AF_IMPLINK 3 /* arpanet imp addresses */ ++#define AF_PUP 4 /* pup protocols: e.g. BSP */ ++#define AF_CHAOS 5 /* mit CHAOS protocols */ ++#define AF_NS 6 /* XEROX NS protocols */ ++#define AF_ISO 7 /* ISO protocols */ ++#define AF_OSI AF_ISO ++#define AF_ECMA 8 /* european computer manufacturers */ ++#define AF_DATAKIT 9 /* datakit protocols */ ++#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ ++#define AF_SNA 11 /* IBM SNA */ ++#define AF_DECnet 12 /* DECnet */ ++#define AF_DLI 13 /* DEC Direct data link interface */ ++#define AF_LAT 14 /* LAT */ ++#define AF_HYLINK 15 /* NSC Hyperchannel */ ++#define AF_APPLETALK 16 /* Apple Talk */ ++#define AF_ROUTE 17 /* Internal Routing Protocol */ ++#define AF_LINK 18 /* Link layer interface */ ++#define AF_COIP 20 /* connection-oriented IP, aka ST II */ ++#define AF_CNT 21 /* Computer Network Technology */ ++#define AF_IPX 23 /* Novell Internet Protocol */ ++#define AF_INET6 24 /* IP version 6 */ ++#define AF_ISDN 26 /* Integrated Services Digital Network*/ ++#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ ++#define AF_NATM 27 /* native ATM access */ ++#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */ ++#define AF_MAX 31 ++ ++/* ++ * Structure used by kernel to store most ++ * addresses. ++ */ ++struct sockaddr { ++ uint8_t sa_len; /* total length */ ++ sa_family_t sa_family; /* address family */ ++ char sa_data[14]; /* actually longer; address value */ ++}; ++ ++/* ++ * Protocol families, same as address families for now. ++ */ ++#define PF_UNSPEC AF_UNSPEC ++#define PF_LOCAL AF_LOCAL ++#define PF_UNIX PF_LOCAL /* backward compatibility */ ++#define PF_INET AF_INET ++#define PF_IMPLINK AF_IMPLINK ++#define PF_PUP AF_PUP ++#define PF_CHAOS AF_CHAOS ++#define PF_NS AF_NS ++#define PF_ISO AF_ISO ++#define PF_OSI AF_ISO ++#define PF_ECMA AF_ECMA ++#define PF_DATAKIT AF_DATAKIT ++#define PF_CCITT AF_CCITT ++#define PF_SNA AF_SNA ++#define PF_DECnet AF_DECnet ++#define PF_DLI AF_DLI ++#define PF_LAT AF_LAT ++#define PF_HYLINK AF_HYLINK ++#define PF_APPLETALK AF_APPLETALK ++#define PF_ROUTE AF_ROUTE ++#define PF_LINK AF_LINK ++#if defined(_NETBSD_SOURCE) ++#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ ++#endif ++#define PF_COIP AF_COIP ++#define PF_CNT AF_CNT ++#define PF_INET6 AF_INET6 ++#define PF_IPX AF_IPX /* same format as AF_NS */ ++#if defined(_NETBSD_SOURCE) ++#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ ++#define PF_PIP pseudo_AF_PIP ++#endif ++#define PF_ISDN AF_ISDN /* same as E164 */ ++#define PF_E164 AF_E164 ++#define PF_NATM AF_NATM ++#define PF_ARP AF_ARP ++#if defined(_NETBSD_SOURCE) ++#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */ ++#endif ++ ++#define PF_MAX AF_MAX ++ ++#define MSG_OOB 0x1 /* process out-of-band data */ ++#define MSG_PEEK 0x2 /* peek at incoming message */ ++#define MSG_DONTROUTE 0x4 /* send without using routing tables */ ++#define MSG_EOR 0x8 /* data completes record */ ++#define MSG_TRUNC 0x10 /* data discarded before delivery */ ++#define MSG_CTRUNC 0x20 /* control data lost before delivery */ ++#define MSG_WAITALL 0x40 /* wait for full request or error */ ++#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ ++#define MSG_BCAST 0x100 /* this message was rcvd using link-level brdcst */ ++#define MSG_MCAST 0x200 /* this message was rcvd using link-level mcast */ ++ ++/* ++ * Types of socket shutdown(2). ++ */ ++#define SHUT_RD 0 /* Disallow further receives. */ ++#define SHUT_WR 1 /* Disallow further sends. */ ++#define SHUT_RDWR 2 /* Disallow further sends/receives. */ ++ ++struct iovec { ++ void *iov_base; /* Base address. */ ++ size_t iov_len; /* Length. */ ++}; ++ ++struct msghdr { ++ void *msg_name; /* optional address */ ++ socklen_t msg_namelen; /* size of address */ ++ struct iovec *msg_iov; /* scatter/gather array */ ++ int msg_iovlen; /* # elements in msg_iov */ ++ void *msg_control; /* ancillary data, see below */ ++ socklen_t msg_controllen; /* ancillary data buffer len */ ++ int msg_flags; /* flags on received message */ ++}; ++ ++/* BSD-compatible socket API. */ ++int accept(int, struct sockaddr * __restrict, socklen_t * __restrict); ++int bind(int, const struct sockaddr *, socklen_t); ++int connect(int, const struct sockaddr *, socklen_t); ++int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); ++int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); ++int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); ++int listen(int, int); ++ssize_t recv(int, void *, size_t, int); ++ssize_t recvfrom(int, void * __restrict, size_t, int, ++ struct sockaddr * __restrict, socklen_t * __restrict); ++ssize_t recvmsg(int s, struct msghdr *msg, int flags); ++ssize_t send(int, const void *, size_t, int); ++ssize_t sendto(int, const void *, ++ size_t, int, const struct sockaddr *, socklen_t); ++ssize_t sendmsg(int s, const struct msghdr *msg, int flags); ++int setsockopt(int, int, int, const void *, socklen_t); ++int shutdown(int, int); ++int socket(int, int, int); ++ ++/* sceNetInet socket API. */ ++int sceNetInetAccept(int s, struct sockaddr *addr, socklen_t *addrlen); ++int sceNetInetBind(int s, const struct sockaddr *my_addr, socklen_t addrlen); ++int sceNetInetConnect(int s, const struct sockaddr *serv_addr, socklen_t addrlen); ++int sceNetInetGetsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); ++int sceNetInetListen(int s, int backlog); ++ssize_t sceNetInetRecv(int s, void *buf, size_t len, int flags); ++ssize_t sceNetInetRecvfrom(int s, void *buf, size_t flags, int, struct sockaddr *from, socklen_t *fromlen); ++ssize_t sceNetInetRecvmsg(int s, struct msghdr *msg, int flags); ++ssize_t sceNetInetSend(int s, const void *buf, size_t len, int flags); ++ssize_t sceNetInetSendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); ++ssize_t sceNetInetSendmsg(int s, const struct msghdr *msg, int flags); ++int sceNetInetSetsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); ++int sceNetInetShutdown(int s, int how); ++int sceNetInetSocket(int domain, int type, int protocol); ++int sceNetInetClose(int s); ++int sceNetInetGetErrno(void); ++int sceNetInetGetsockname(int s, struct sockaddr *name, socklen_t *namelen); ++int sceNetInetGetpeername(int s, struct sockaddr *name, socklen_t *namelen); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* !_SYS_SOCKET_H_ */ +--- newlib-1.13.0/newlib/libc/sys/psp/xprintf.c 1969-12-31 19:00:00.000000000 -0500 ++++ newlib-psp/newlib/libc/sys/psp/xprintf.c 2006-03-13 00:00:00.000000000 -0500 +@@ -0,0 +1,984 @@ ++/* ++ * PSP Software Development Kit - http://www.pspdev.org ++ * ----------------------------------------------------------------------- ++ * Licensed under the BSD license, see LICENSE in PSPSDK root for details. ++ * ++ * xprintf.c - Various *printf functions. ++ * ++ * Copyright (c) 2005 Marcus R. Brown ++ * Copyright (c) 2005 James Forshaw ++ * Copyright (c) 2005 John Kelley ++ * ++ * $Id: newlib-1.14.0.patch,v 1.1 2006-05-07 23:13:24 wntrmute Exp $ ++ */ ++/* Code borrowed from mysql's xprintf.c, by Richard Hipp */ ++/* This xprintf.c file on which this one is based is in public domain. */ ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++/* ++** The maximum number of digits of accuracy in a floating-point conversion. ++*/ ++#define MAXDIG 20 ++ ++/* Instead of including ctype.h, use the isdigit() prototype because psplibc doesn't ++ know about newlib, and newlib defines isdigit as a macro that uses _ctype_. */ ++int isdigit(int __c); ++ ++int vxprintf(void (*func)(char *, int, void *), void *arg, const char *format, va_list ap); ++ ++#ifdef F_vxprintf ++/* ++** Conversion types fall into various categories as defined by the ++** following enumeration. ++*/ ++ ++enum e_type { /* The type of the format field */ ++ RADIX, /* Integer types. %d, %x, %o, and so forth */ ++ FLOAT, /* Floating point. %f */ ++ EXP, /* Exponentional notation. %e and %E */ ++ GENERIC, /* Floating or exponential, depending on exponent. %g */ ++ SIZE, /* Return number of characters processed so far. %n */ ++ STRING, /* Strings. %s */ ++ PERCENT, /* Percent symbol. %% */ ++ CHAR, /* Characters. %c */ ++ ERROR, /* Used to indicate no such conversion type */ ++/* The rest are extensions, not normally found in printf() */ ++ CHARLIT, /* Literal characters. %' */ ++ SEEIT, /* Strings with visible control characters. %S */ ++ MEM_STRING, /* A string which should be deleted after use. %z */ ++ ORDINAL, /* 1st, 2nd, 3rd and so forth */ ++}; ++ ++/* ++** Each builtin conversion character (ex: the 'd' in "%d") is described ++** by an instance of the following structure ++*/ ++typedef struct s_info { /* Information about each format field */ ++ int fmttype; /* The format field code letter */ ++ int base; /* The base for radix conversion */ ++ char *charset; /* The character set for conversion */ ++ int flag_signed; /* Is the quantity signed? */ ++ char *prefix; /* Prefix on non-zero values in alt format */ ++ enum e_type type; /* Conversion paradigm */ ++} info; ++ ++/* ++** The following table is searched linearly, so it is good to put the ++** most frequently used conversion types first. ++*/ ++static info fmtinfo[] = { ++ { 'd', 10, "0123456789", 1, 0, RADIX, }, ++ { 's', 0, 0, 0, 0, STRING, }, ++ { 'S', 0, 0, 0, 0, SEEIT, }, ++ { 'z', 0, 0, 0, 0, MEM_STRING, }, ++ { 'c', 0, 0, 0, 0, CHAR, }, ++ { 'o', 8, "01234567", 0, "0", RADIX, }, ++ { 'u', 10, "0123456789", 0, 0, RADIX, }, ++ { 'x', 16, "0123456789abcdef", 0, "x0", RADIX, }, ++ { 'X', 16, "0123456789ABCDEF", 0, "X0", RADIX, }, ++ { 'r', 10, "0123456789", 0, 0, ORDINAL, }, ++ { 'f', 0, 0, 1, 0, FLOAT, }, ++ { 'e', 0, "e", 1, 0, EXP, }, ++ { 'E', 0, "E", 1, 0, EXP, }, ++ { 'g', 0, "e", 1, 0, GENERIC, }, ++ { 'G', 0, "E", 1, 0, GENERIC, }, ++ { 'i', 10, "0123456789", 1, 0, RADIX, }, ++ { 'n', 0, 0, 0, 0, SIZE, }, ++ { 'S', 0, 0, 0, 0, SEEIT, }, ++ { '%', 0, 0, 0, 0, PERCENT, }, ++ { 'b', 2, "01", 0, "b0", RADIX, }, /* Binary notation */ ++ { 'p', 16, "0123456789ABCDEF", 0, "x0", RADIX, }, /* Pointers */ ++ { '\'', 0, 0, 0, 0, CHARLIT, }, /* Literal char */ ++}; ++#define NINFO (sizeof(fmtinfo)/sizeof(info)) /* Size of the fmtinfo table */ ++ ++/* ++** If NOFLOATINGPOINT is defined, then none of the floating point ++** conversions will work. ++*/ ++#ifndef NOFLOATINGPOINT ++/* ++** "*val" is a double such that 0.1 <= *val < 10.0 ++** Return the ascii code for the leading digit of *val, then ++** multiply "*val" by 10.0 to renormalize. ++** ++** Example: ++** input: *val = 3.14159 ++** output: *val = 1.4159 function return = '3' ++** ++** The counter *cnt is incremented each time. After counter exceeds ++** 16 (the number of significant digits in a 64-bit float) '0' is ++** always returned. ++*/ ++static int getdigit(long double *val, int *cnt){ ++ int digit; ++ long double d; ++ if( (*cnt)++ >= MAXDIG ) return '0'; ++ digit = (int)*val; ++ d = digit; ++ digit += '0'; ++ *val = (*val - d)*10.0; ++ return digit; ++} ++#endif ++ ++/* ++** Setting the size of the BUFFER involves trade-offs. No %d or %f ++** conversion can have more than BUFSIZE characters. If the field ++** width is larger than BUFSIZE, it is silently shortened. On the ++** other hand, this routine consumes more stack space with larger ++** BUFSIZEs. If you have some threads for which you want to minimize ++** stack space, you should keep BUFSIZE small. ++*/ ++#define BUFSIZE 100 /* Size of the output buffer */ ++ ++/* ++** The root program. All variations call this core. ++** ++** INPUTS: ++** func This is a pointer to a function taking three arguments ++** 1. A pointer to the list of characters to be output ++** (Note, this list is NOT null terminated.) ++** 2. An integer number of characters to be output. ++** (Note: This number might be zero.) ++** 3. A pointer to anything. Same as the "arg" parameter. ++** ++** arg This is the pointer to anything which will be passed as the ++** third argument to "func". Use it for whatever you like. ++** ++** fmt This is the format string, as in the usual print. ++** ++** ap This is a pointer to a list of arguments. Same as in ++** vfprint. ++** ++** OUTPUTS: ++** The return value is the total number of characters sent to ++** the function "func". Returns -1 on a error. ++** ++** Note that the order in which automatic variables are declared below ++** seems to make a big difference in determining how fast this beast ++** will run. ++*/ ++ ++int vxprintf(func,arg,format,ap) ++ void (*func)(char*,int,void*); ++ void *arg; ++ const char *format; ++ va_list ap; ++{ ++ register const char *fmt; /* The format string. */ ++ register int c; /* Next character in the format string */ ++ register char *bufpt; /* Pointer to the conversion buffer */ ++ register int precision; /* Precision of the current field */ ++ register int length; /* Length of the field */ ++ register int idx; /* A general purpose loop counter */ ++ int count; /* Total number of characters output */ ++ int width; /* Width of the current field */ ++ int flag_leftjustify; /* True if "-" flag is present */ ++ int flag_plussign; /* True if "+" flag is present */ ++ int flag_blanksign; /* True if " " flag is present */ ++ int flag_alternateform; /* True if "#" flag is present */ ++ int flag_zeropad; /* True if field width constant starts with zero */ ++ int flag_long; /* True if "l" flag is present */ ++ int flag_center; /* True if "=" flag is present */ ++ unsigned long long longvalue; /* Value for integer types */ ++ ++ long double realvalue; /* Value for real types */ ++ info *infop; /* Pointer to the appropriate info structure */ ++ char buf[BUFSIZE]; /* Conversion buffer */ ++ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ ++ int errorflag = 0; /* True if an error is encountered */ ++ enum e_type xtype; /* Conversion paradigm */ ++ char *zMem = 0; /* String to be freed */ ++ static char spaces[] = ++ " "; ++#define SPACESIZE (sizeof(spaces)-1) ++#ifndef NOFLOATINGPOINT ++ int exp; /* exponent of real numbers */ ++ long double rounder; /* Used for rounding floating point values */ ++ int flag_dp; /* True if decimal point should be shown */ ++ int flag_rtz; /* True if trailing zeros should be removed */ ++ int flag_exp; /* True to force display of the exponent */ ++ int nsd; /* Number of significant digits returned */ ++#endif ++ ++ fmt = format; /* Put in a register for speed */ ++ count = length = 0; ++ bufpt = 0; ++ for(; (c=(*fmt))!=0; ++fmt){ ++ if( c!='%' ){ ++ register int amt; ++ bufpt = (char *)fmt; ++ amt = 1; ++ while( (c=(*++fmt))!='%' && c!=0 ) amt++; ++ (*func)(bufpt,amt,arg); ++ count += amt; ++ if( c==0 ) break; ++ } ++ if( (c=(*++fmt))==0 ){ ++ errorflag = 1; ++ (*func)("%",1,arg); ++ count++; ++ break; ++ } ++ /* Find out what flags are present */ ++ flag_leftjustify = flag_plussign = flag_blanksign = ++ flag_alternateform = flag_zeropad = flag_center = 0; ++ do{ ++ switch( c ){ ++ case '-': flag_leftjustify = 1; c = 0; break; ++ case '+': flag_plussign = 1; c = 0; break; ++ case ' ': flag_blanksign = 1; c = 0; break; ++ case '#': flag_alternateform = 1; c = 0; break; ++ case '0': flag_zeropad = 1; c = 0; break; ++ case '=': flag_center = 1; c = 0; break; ++ default: break; ++ } ++ }while( c==0 && (c=(*++fmt))!=0 ); ++ if( flag_center ) flag_leftjustify = 0; ++ /* Get the field width */ ++ width = 0; ++ if( c=='*' ){ ++ width = va_arg(ap,int); ++ if( width<0 ){ ++ flag_leftjustify = 1; ++ width = -width; ++ } ++ c = *++fmt; ++ }else{ ++ while( isdigit(c) ){ ++ width = width*10 + c - '0'; ++ c = *++fmt; ++ } ++ } ++ if( width > BUFSIZE-10 ){ ++ width = BUFSIZE-10; ++ } ++ /* Get the precision */ ++ if( c=='.' ){ ++ precision = 0; ++ c = *++fmt; ++ if( c=='*' ){ ++ precision = va_arg(ap,int); ++#ifndef COMPATIBILITY ++ /* This is sensible, but SUN OS 4.1 doesn't do it. */ ++ if( precision<0 ) precision = -precision; ++#endif ++ c = *++fmt; ++ }else{ ++ while( isdigit(c) ){ ++ precision = precision*10 + c - '0'; ++ c = *++fmt; ++ } ++ } ++ /* Limit the precision to prevent overflowing buf[] during conversion */ ++ if( precision>BUFSIZE-40 ) precision = BUFSIZE-40; ++ }else{ ++ precision = -1; ++ } ++ /* Get the conversion type modifier */ ++ if( c=='l' ){ ++ flag_long = 1; ++ c = *++fmt; ++ if( c == 'l' ){ ++ flag_long = 2; ++ c = *++fmt; ++ } ++ }else{ ++ flag_long = 0; ++ } ++ /* Fetch the info entry for the field */ ++ infop = 0; ++ for(idx=0; idxtype; ++ } ++ ++ /* ++ ** At this point, variables are initialized as follows: ++ ** ++ ** flag_alternateform TRUE if a '#' is present. ++ ** flag_plussign TRUE if a '+' is present. ++ ** flag_leftjustify TRUE if a '-' is present or if the ++ ** field width was negative. ++ ** flag_zeropad TRUE if the width began with 0. ++ ** flag_long TRUE if the letter 'l' (ell) prefixed ++ ** the conversion character. ++ ** flag_blanksign TRUE if a ' ' is present. ++ ** width The specified field width. This is ++ ** always non-negative. Zero is the default. ++ ** precision The specified precision. The default ++ ** is -1. ++ ** xtype The class of the conversion. ++ ** infop Pointer to the appropriate info struct. ++ */ ++ switch( xtype ){ ++ case ORDINAL: ++ case RADIX: ++ if(( flag_long>1 )&&( infop->flag_signed )){ ++ signed long long t = va_arg(ap,signed long long); ++ longvalue = t; ++ }else if(( flag_long>1 )&&( !infop->flag_signed )){ ++ unsigned long long t = va_arg(ap,unsigned long long); ++ longvalue = t; ++ }else if(( flag_long )&&( infop->flag_signed )){ ++ signed long t = va_arg(ap,signed long); ++ longvalue = t; ++ }else if(( flag_long )&&( !infop->flag_signed )){ ++ unsigned long t = va_arg(ap,unsigned long); ++ longvalue = t; ++ }else if(( !flag_long )&&( infop->flag_signed )){ ++ signed int t = va_arg(ap,signed int) & ((unsigned long) 0xffffffff); ++ longvalue = t; ++ }else{ ++ unsigned int t = va_arg(ap,unsigned int) & ((unsigned long) 0xffffffff); ++ longvalue = t; ++ } ++#ifdef COMPATIBILITY ++ /* For the format %#x, the value zero is printed "0" not "0x0". ++ ** I think this is stupid. */ ++ if( longvalue==0 ) flag_alternateform = 0; ++#else ++ /* More sensible: turn off the prefix for octal (to prevent "00"), ++ ** but leave the prefix for hex. */ ++ if( longvalue==0 && infop->base==8 ) flag_alternateform = 0; ++#endif ++ if( infop->flag_signed ){ ++ if( *(long long*)&longvalue<0 ){ ++ longvalue = -*(long long*)&longvalue; ++ prefix = '-'; ++ }else if( flag_plussign ) prefix = '+'; ++ else if( flag_blanksign ) prefix = ' '; ++ else prefix = 0; ++ }else prefix = 0; ++ if( flag_zeropad && precision3 || (b>10 && b<14) ){ ++ bufpt[0] = 't'; ++ bufpt[1] = 'h'; ++ }else if( a==1 ){ ++ bufpt[0] = 's'; ++ bufpt[1] = 't'; ++ }else if( a==2 ){ ++ bufpt[0] = 'n'; ++ bufpt[1] = 'd'; ++ }else if( a==3 ){ ++ bufpt[0] = 'r'; ++ bufpt[1] = 'd'; ++ } ++ } ++ { ++ register char *cset; /* Use registers for speed */ ++ register int base; ++ cset = infop->charset; ++ base = infop->base; ++ do{ /* Convert to ascii */ ++ *(--bufpt) = cset[longvalue%base]; ++ longvalue = longvalue/base; ++ }while( longvalue>0 ); ++ } ++ length = (int)(&buf[BUFSIZE]-bufpt); ++ if(infop->fmttype == 'p') ++ { ++ precision = 8; ++ flag_alternateform = 1; ++ } ++ ++ for(idx=precision-length; idx>0; idx--){ ++ *(--bufpt) = '0'; /* Zero pad */ ++ } ++ if( prefix ) *(--bufpt) = prefix; /* Add sign */ ++ if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ ++ char *pre, x; ++ pre = infop->prefix; ++ if( *bufpt!=pre[0] ){ ++ for(pre=infop->prefix; (x=(*pre))!=0; pre++) *(--bufpt) = x; ++ } ++ } ++ ++ length = (int)(&buf[BUFSIZE]-bufpt); ++ break; ++ case FLOAT: ++ case EXP: ++ case GENERIC: ++ realvalue = va_arg(ap,double); ++#ifndef NOFLOATINGPOINT ++ if( precision<0 ) precision = 6; /* Set default precision */ ++ if( precision>BUFSIZE-10 ) precision = BUFSIZE-10; ++ if( realvalue<0.0 ){ ++ realvalue = -realvalue; ++ prefix = '-'; ++ }else{ ++ if( flag_plussign ) prefix = '+'; ++ else if( flag_blanksign ) prefix = ' '; ++ else prefix = 0; ++ } ++ if( infop->type==GENERIC && precision>0 ) precision--; ++ rounder = 0.0; ++#ifdef COMPATIBILITY ++ /* Rounding works like BSD when the constant 0.4999 is used. Wierd! */ ++ for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1); ++#else ++ /* It makes more sense to use 0.5 */ ++ if( precision>MAXDIG-1 ) idx = MAXDIG-1; ++ else idx = precision; ++ for(rounder=0.5; idx>0; idx--, rounder*=0.1); ++#endif ++ if( infop->type==FLOAT ) realvalue += rounder; ++ /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ ++ exp = 0; ++ if( realvalue>0.0 ){ ++ int k = 0; ++ while( realvalue>=1e8 && k++<100 ){ realvalue *= 1e-8; exp+=8; } ++ while( realvalue>=10.0 && k++<100 ){ realvalue *= 0.1; exp++; } ++ while( realvalue<1e-8 && k++<100 ){ realvalue *= 1e8; exp-=8; } ++ while( realvalue<1.0 && k++<100 ){ realvalue *= 10.0; exp--; } ++ if( k>=100 ){ ++ bufpt = "NaN"; ++ length = 3; ++ break; ++ } ++ } ++ bufpt = buf; ++ /* ++ ** If the field type is GENERIC, then convert to either EXP ++ ** or FLOAT, as appropriate. ++ */ ++ flag_exp = xtype==EXP; ++ if( xtype!=FLOAT ){ ++ realvalue += rounder; ++ if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } ++ } ++ if( xtype==GENERIC ){ ++ flag_rtz = !flag_alternateform; ++ if( exp<-4 || exp>precision ){ ++ xtype = EXP; ++ }else{ ++ precision = precision - exp; ++ xtype = FLOAT; ++ } ++ }else{ ++ flag_rtz = 0; ++ } ++ /* ++ ** The "exp+precision" test causes output to be of type EXP if ++ ** the precision is too large to fit in buf[]. ++ */ ++ nsd = 0; ++ if( xtype==FLOAT && exp+precision0 || flag_alternateform); ++ if( prefix ) *(bufpt++) = prefix; /* Sign */ ++ if( exp<0 ) *(bufpt++) = '0'; /* Digits before "." */ ++ else for(; exp>=0; exp--) *(bufpt++) = getdigit(&realvalue,&nsd); ++ if( flag_dp ) *(bufpt++) = '.'; /* The decimal point */ ++ for(exp++; exp<0 && precision>0; precision--, exp++){ ++ *(bufpt++) = '0'; ++ } ++ while( (precision--)>0 ) *(bufpt++) = getdigit(&realvalue,&nsd); ++ *(bufpt--) = 0; /* Null terminate */ ++ if( flag_rtz && flag_dp ){ /* Remove trailing zeros and "." */ ++ while( bufpt>=buf && *bufpt=='0' ) *(bufpt--) = 0; ++ if( bufpt>=buf && *bufpt=='.' ) *(bufpt--) = 0; ++ } ++ bufpt++; /* point to next free slot */ ++ }else{ /* EXP or GENERIC */ ++ flag_dp = (precision>0 || flag_alternateform); ++ if( prefix ) *(bufpt++) = prefix; /* Sign */ ++ *(bufpt++) = getdigit(&realvalue,&nsd); /* First digit */ ++ if( flag_dp ) *(bufpt++) = '.'; /* Decimal point */ ++ while( (precision--)>0 ) *(bufpt++) = getdigit(&realvalue,&nsd); ++ bufpt--; /* point to last digit */ ++ if( flag_rtz && flag_dp ){ /* Remove tail zeros */ ++ while( bufpt>=buf && *bufpt=='0' ) *(bufpt--) = 0; ++ if( bufpt>=buf && *bufpt=='.' ) *(bufpt--) = 0; ++ } ++ bufpt++; /* point to next free slot */ ++ if( exp || flag_exp ){ ++ *(bufpt++) = infop->charset[0]; ++ if( exp<0 ){ *(bufpt++) = '-'; exp = -exp; } /* sign of exp */ ++ else { *(bufpt++) = '+'; } ++ if( exp>=100 ){ ++ *(bufpt++) = (exp/100)+'0'; /* 100's digit */ ++ exp %= 100; ++ } ++ *(bufpt++) = exp/10+'0'; /* 10's digit */ ++ *(bufpt++) = exp%10+'0'; /* 1's digit */ ++ } ++ } ++ /* The converted number is in buf[] and zero terminated. Output it. ++ ** Note that the number is in the usual order, not reversed as with ++ ** integer conversions. */ ++ length = (int)(bufpt-buf); ++ bufpt = buf; ++ ++ /* Special case: Add leading zeros if the flag_zeropad flag is ++ ** set and we are not left justified */ ++ if( flag_zeropad && !flag_leftjustify && length < width){ ++ int i; ++ int nPad = width - length; ++ for(i=width; i>=nPad; i--){ ++ bufpt[i] = bufpt[i-nPad]; ++ } ++ i = prefix!=0; ++ while( nPad-- ) bufpt[i++] = '0'; ++ length = width; ++ } ++#endif ++ break; ++ case SIZE: ++ *(va_arg(ap,int*)) = count; ++ length = width = 0; ++ break; ++ case PERCENT: ++ buf[0] = '%'; ++ bufpt = buf; ++ length = 1; ++ break; ++ case CHARLIT: ++ case CHAR: ++ c = buf[0] = (xtype==CHAR ? va_arg(ap,int) : *++fmt); ++ if( precision>=0 ){ ++ for(idx=1; idx=0 && precision=0x7f ){ ++ buf[i++] = '^'; ++ buf[i] = (c&0x1f)+0x40; ++ }else{ ++ buf[i] = c; ++ } ++ } ++ bufpt = buf; ++ length = i; ++ if( precision>=0 && precision0 ){ ++ if( flag_center ){ ++ nspace = nspace/2; ++ width -= nspace; ++ flag_leftjustify = 1; ++ } ++ count += nspace; ++ while( nspace>=SPACESIZE ){ ++ (*func)(spaces,SPACESIZE,arg); ++ nspace -= SPACESIZE; ++ } ++ if( nspace>0 ) (*func)(spaces,nspace,arg); ++ } ++ } ++ if( length>0 ){ ++ (*func)(bufpt,length,arg); ++ count += length; ++ } ++ if( xtype==MEM_STRING && zMem ){ ++ free(zMem); ++ } ++ if( flag_leftjustify ){ ++ register int nspace; ++ nspace = width-length; ++ if( nspace>0 ){ ++ count += nspace; ++ while( nspace>=SPACESIZE ){ ++ (*func)(spaces,SPACESIZE,arg); ++ nspace -= SPACESIZE; ++ } ++ if( nspace>0 ) (*func)(spaces,nspace,arg); ++ } ++ } ++ }/* End for loop over the format string */ ++ return errorflag ? -1 : count; ++} /* End of function */ ++#endif ++ ++#ifdef F__xprintf ++/* ++** This non-standard function is still occasionally useful.... ++*/ ++int xprintf( ++ void (*func)(char*,int,void*), ++ void *arg, ++ const char *format, ++ ... ++){ ++ va_list ap; ++ va_start(ap,format); ++ return vxprintf(func,arg,format,ap); ++} ++#endif ++ ++/* ++** Now for string-print, also as found in any standard library. ++** Add to this the snprint function which stops added characters ++** to the string at a given length. ++** ++** Note that snprint returns the length of the string as it would ++** be if there were no limit on the output. ++*/ ++struct s_strargument { /* Describes the string being written to */ ++ char *next; /* Next free slot in the string */ ++ char *last; /* Last available slot in the string */ ++}; ++ ++void __sout(char *, int, void *); ++#ifdef F___sout ++void __sout(txt,amt,arg) ++ char *txt; ++ int amt; ++ void *arg; ++{ ++ register char *head; ++ register const char *t; ++ register int a; ++ register char *tail; ++ a = amt; ++ t = txt; ++ head = ((struct s_strargument*)arg)->next; ++ tail = ((struct s_strargument*)arg)->last; ++ if( tail ){ ++ while( a-- >0 && head0 ) *(head++) = *(t++); ++ } ++ *head = 0; ++ ((struct s_strargument*)arg)->next = head; ++} ++#endif ++ ++#ifdef F_vsnprintf ++int vsnprintf(char *buf, size_t n, const char *fmt, va_list ap){ ++ struct s_strargument arg; ++ arg.next = buf; ++ arg.last = &buf[n-1]; ++ *buf = 0; ++ return vxprintf(__sout,&arg,fmt,ap); ++} ++#endif ++ ++#ifdef F_snprintf ++int snprintf(char *str, size_t sz, const char *format, ...) ++{ ++ va_list args; ++ struct s_strargument arg; ++ int ret; ++ ++ arg.next = str; ++ arg.last = &str[sz-1]; ++ ++ va_start(args, format); ++ ret = vxprintf(__sout, &arg, format, args); ++ va_end(args); ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_vsprintf ++int vsprintf(char *buf, const char *fmt, va_list ap){ ++ struct s_strargument arg; ++ arg.next = buf; ++ arg.last = NULL; ++ *buf = 0; ++ return vxprintf(__sout,&arg,fmt,ap); ++} ++#endif ++ ++#ifdef F_sprintf ++int sprintf (char *str, const char *format, ...) ++{ ++ va_list args; ++ struct s_strargument arg; ++ int ret; ++ ++ arg.next = str; ++ arg.last = NULL; ++ ++ va_start(args, format); ++ ret = vxprintf(__sout, &arg, format, args); ++ va_end(args); ++ ++ return ret; ++} ++#endif ++ ++/* ++** The following section of code handles the mprintf routine, that ++** writes to memory obtained from malloc(). ++*/ ++ ++/* This structure is used to store state information about the ++** write in progress ++*/ ++struct sgMprintf { ++ char *zBase; /* A base allocation */ ++ char *zText; /* The string collected so far */ ++ int nChar; /* Length of the string so far */ ++ int nAlloc; /* Amount of space allocated in zText */ ++}; ++ ++void __mout(char *, int, void*); ++ ++#ifdef F___mout ++/* The xprintf callback function. */ ++void __mout(zNewText,nNewChar,arg) ++ char *zNewText; ++ int nNewChar; ++ void *arg; ++{ ++ struct sgMprintf *pM = (struct sgMprintf*)arg; ++ if( pM->nChar + nNewChar + 1 > pM->nAlloc ){ ++ pM->nAlloc = pM->nChar + nNewChar*2 + 1; ++ if( pM->zText==pM->zBase ){ ++ pM->zText = malloc(pM->nAlloc); ++ if( pM->zText && pM->nChar ) memcpy(pM->zText,pM->zBase,pM->nChar); ++ }else{ ++ pM->zText = realloc(pM->zText, pM->nAlloc); ++ } ++ } ++ if( pM->zText ){ ++ memcpy(&pM->zText[pM->nChar], zNewText, nNewChar); ++ pM->nChar += nNewChar; ++ pM->zText[pM->nChar] = 0; ++ } ++} ++#endif ++ ++/* ++** mprintf() works like printf(), but allocations memory to hold the ++** resulting string and returns a pointer to the allocated memory. ++** ++** We changed the name to TclMPrint() to conform with the Tcl private ++** routine naming conventions. ++*/ ++ ++#ifdef F_mprintf ++char *mprintf(const char *zFormat, ...){ ++ va_list ap; ++ struct sgMprintf sMprintf; ++ char *zNew; ++ char zBuf[200]; ++ ++ va_start(ap,zFormat); ++ sMprintf.nChar = 0; ++ sMprintf.nAlloc = sizeof(zBuf); ++ sMprintf.zText = zBuf; ++ sMprintf.zBase = zBuf; ++ vxprintf(__mout,&sMprintf,zFormat,ap); ++ va_end(ap); ++ if( sMprintf.zText==sMprintf.zBase ){ ++ zNew = malloc( sMprintf.nChar+1 ); ++ if( zNew ) strcpy(zNew,zBuf); ++ }else{ ++ zNew = realloc(sMprintf.zText,sMprintf.nChar+1); ++ } ++ ++ return zNew; ++} ++#endif ++ ++/* This is the varargs version of mprintf. ++** ++** The name is changed to TclVMPrintf() to conform with Tcl naming ++** conventions. ++*/ ++#ifdef F_vmprintf ++char *vmprintf(const char *zFormat,va_list ap){ ++ struct sgMprintf sMprintf; ++ char zBuf[200]; ++ sMprintf.nChar = 0; ++ sMprintf.zText = zBuf; ++ sMprintf.nAlloc = sizeof(zBuf); ++ sMprintf.zBase = zBuf; ++ vxprintf(__mout,&sMprintf,zFormat,ap); ++ if( sMprintf.zText==sMprintf.zBase ){ ++ sMprintf.zText = malloc( strlen(zBuf)+1 ); ++ if( sMprintf.zText ) strcpy(sMprintf.zText,zBuf); ++ }else{ ++ sMprintf.zText = realloc(sMprintf.zText,sMprintf.nChar+1); ++ } ++ return sMprintf.zText; ++} ++#endif ++ ++#ifdef F_asprintf ++int asprintf(char ** strp, const char *zFormat, ...){ ++ va_list ap; ++ struct sgMprintf sMprintf; ++ char *zNew; ++ char zBuf[200]; ++ ++ va_start(ap,zFormat); ++ sMprintf.nChar = 0; ++ sMprintf.nAlloc = sizeof(zBuf); ++ sMprintf.zText = zBuf; ++ sMprintf.zBase = zBuf; ++ vxprintf(__mout,&sMprintf,zFormat,ap); ++ va_end(ap); ++ if( sMprintf.zText==sMprintf.zBase ){ ++ zNew = malloc( sMprintf.nChar+1 ); ++ if( zNew ) strcpy(zNew,zBuf); ++ }else{ ++ zNew = realloc(sMprintf.zText,sMprintf.nChar+1); ++ } ++ ++ *strp = zNew; ++ ++ return sMprintf.nChar+1; ++} ++#endif ++ ++#ifdef F_vasprintf ++int vasprintf(char **strp, const char *format, va_list ap) { ++ struct sgMprintf sMprintf; ++ char zBuf[200]; ++ sMprintf.nChar = 0; ++ sMprintf.zText = zBuf; ++ sMprintf.nAlloc = sizeof(zBuf); ++ sMprintf.zBase = zBuf; ++ vxprintf(__mout,&sMprintf,format,ap); ++ if( sMprintf.zText==sMprintf.zBase ){ ++ sMprintf.zText = malloc( strlen(zBuf)+1 ); ++ if( sMprintf.zText ) strcpy(sMprintf.zText,zBuf); ++ }else{ ++ sMprintf.zText = realloc(sMprintf.zText,sMprintf.nChar+1); ++ } ++ *strp = sMprintf.zText; ++ return sMprintf.nChar; ++} ++#endif ++ ++/* ++** The following section of code handles the standard fprintf routines ++** for pthreads. ++*/ ++ ++void __fout(char *, int, void *); ++ ++#ifdef F___fout ++void __fout(zNewText,nNewChar,arg) ++ char *zNewText; ++ int nNewChar; ++ void *arg; ++{ ++ fwrite(zNewText,1,nNewChar,(FILE*)arg); ++} ++#endif ++ ++#ifdef F_fprintf ++/* The public interface routines */ ++int fprintf(FILE *pOut, const char *zFormat, ...){ ++ va_list ap; ++ int retc; ++ ++ va_start(ap,zFormat); ++ retc = vxprintf(__fout,pOut,zFormat,ap); ++ va_end(ap); ++ return retc; ++} ++#endif ++ ++#ifdef F_vfprintf ++int vfprintf(FILE *pOut, const char *zFormat, va_list ap){ ++ return vxprintf(__fout,pOut,zFormat,ap); ++} ++#endif ++ ++ ++#ifdef F_printf ++int printf(const char *format, ...) ++{ ++ va_list args; ++ int ret; ++ ++ va_start(args, format); ++ ret = vprintf(format, args); ++ va_end(args); ++ ++ return ret; ++} ++#endif ++ ++#ifdef F_vprintf ++int vprintf(const char *format, va_list args) ++{ ++ return vxprintf(__fout, stdout, format, args); ++} ++#endif ++ ++#ifdef F__sprintf_r ++/* Idiotic kludge to get around newlib stupidity. tmpnam() calls this ++ directly, but since sprintf() above replaces newlib's sprintf() (and ++ _sprintf_r()) we have to define this in order to link tmpnam(). */ ++int _sprintf_r(struct _reent *unused, char *str, const char *format, ...) ++{ ++ va_list args; ++ struct s_strargument arg; ++ int ret; ++ ++ (void) unused; ++ arg.next = str; ++ arg.last = NULL; ++ ++ va_start(args, format); ++ ret = vxprintf(__sout, &arg, format, args); ++ va_end(args); ++ ++ return ret; ++} ++#endif diff --git a/dkpsp/scripts/build-gcc.sh b/dkpsp/scripts/build-gcc.sh index fbbd0d6..a2b57dc 100644 --- a/dkpsp/scripts/build-gcc.sh +++ b/dkpsp/scripts/build-gcc.sh @@ -57,6 +57,7 @@ cd pspsdk ./configure || { echo "ERROR RUNNING PSPSDK CONFIGURE"; exit 1; } $MAKE install-data || { echo "ERROR INSTALLING PSPSDK HEADERS"; exit 1; } +cd $BUILDSCRIPTDIR #--------------------------------------------------------------------------------- # build and install newlib