diff --git a/build-devkit.sh b/build-devkit.sh index a546f46..dcb105a 100644 --- a/build-devkit.sh +++ b/build-devkit.sh @@ -52,7 +52,7 @@ done case "$VERSION" in "1" ) - GCC_VER=4.1.1 + GCC_VER=4.1.2 BINUTILS_VER=2.17 NEWLIB_VER=1.15.0 ;; @@ -62,7 +62,7 @@ case "$VERSION" in NEWLIB_VER=1.14.0 ;; "3" ) - GCC_VER=4.1.0 + GCC_VER=4.1.2 BINUTILS_VER=2.16.1 NEWLIB_VER=1.14.0 ;; diff --git a/dkarm-eabi/patches/gcc-4.1.2.patch b/dkarm-eabi/patches/gcc-4.1.2.patch new file mode 100644 index 0000000..4c4e245 --- /dev/null +++ b/dkarm-eabi/patches/gcc-4.1.2.patch @@ -0,0 +1,832 @@ +diff -Nbaur gcc-4.1.2/gcc/c-incpath.c gcc-4.1.2-arm/gcc/c-incpath.c +--- gcc-4.1.2/gcc/c-incpath.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.2-arm/gcc/c-incpath.c Fri Feb 16 10:41:26 2007 +@@ -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.2/gcc/config/arm/t-arm-elf gcc-4.1.2-arm/gcc/config/arm/t-arm-elf +--- gcc-4.1.2/gcc/config/arm/t-arm-elf Wed Sep 1 12:14:21 2004 ++++ gcc-4.1.2-arm/gcc/config/arm/t-arm-elf Wed Apr 11 12:43:29 2007 +@@ -15,9 +15,9 @@ + # MULTILIB_DIRNAMES += ep9312 + # MULTILIB_EXCEPTIONS += *mthumb/*mcpu=ep9312* + # +-# MULTILIB_OPTIONS += mlittle-endian/mbig-endian +-# MULTILIB_DIRNAMES += le be +-# MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=mle ++MULTILIB_OPTIONS += mlittle-endian/mbig-endian ++MULTILIB_DIRNAMES += le be ++MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=mle + # + # MULTILIB_OPTIONS += mhard-float/msoft-float + # MULTILIB_DIRNAMES += fpu soft +diff -Nbaur gcc-4.1.2/gcc/gcc.c gcc-4.1.2-arm/gcc/gcc.c +--- gcc-4.1.2/gcc/gcc.c Tue Nov 7 14:26:21 2006 ++++ gcc-4.1.2-arm/gcc/gcc.c Fri Feb 16 10:41:26 2007 +@@ -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, +@@ -6151,10 +6149,21 @@ + + /* We need to check standard_exec_prefix/just_machine_suffix/specs + for any override of as, ld and libraries. */ ++ if ( gcc_exec_prefix ) ++ { ++ specs_file = alloca (strlen (gcc_exec_prefix) ++ + strlen (just_machine_suffix) + sizeof ("specs")); ++ ++ strcpy (specs_file, gcc_exec_prefix); ++ } else { ++ + specs_file = alloca (strlen (standard_exec_prefix) + + strlen (just_machine_suffix) + sizeof ("specs")); + + strcpy (specs_file, standard_exec_prefix); ++ ++ } ++ + strcat (specs_file, just_machine_suffix); + strcat (specs_file, "specs"); + if (access (specs_file, R_OK) == 0) +diff -Nbaur gcc-4.1.2/gcc/prefix.c gcc-4.1.2-arm/gcc/prefix.c +--- gcc-4.1.2/gcc/prefix.c Sat Jun 25 03:02:01 2005 ++++ gcc-4.1.2-arm/gcc/prefix.c Fri Feb 16 10:41:27 2007 +@@ -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.2/gcc/stor-layout.c gcc-4.1.2-arm/gcc/stor-layout.c +--- gcc-4.1.2/gcc/stor-layout.c Wed Oct 4 08:01:27 2006 ++++ gcc-4.1.2-arm/gcc/stor-layout.c Fri Feb 16 10:45:00 2007 +@@ -526,7 +526,15 @@ + #ifdef STRUCTURE_SIZE_BOUNDARY + /* Packed structures don't need to have minimum size. */ + if (! TYPE_PACKED (t)) +- rli->record_align = MAX (rli->record_align, (unsigned) STRUCTURE_SIZE_BOUNDARY); ++ { ++ unsigned tmp; ++ ++ /* #pragma pack overrides STRUCTURE_SIZE_BOUNDARY. */ ++ tmp = (unsigned) STRUCTURE_SIZE_BOUNDARY; ++ if (maximum_field_alignment != 0) ++ tmp = MIN (tmp, maximum_field_alignment); ++ rli->record_align = MAX (rli->record_align, tmp); ++ } + #endif + + rli->offset = size_zero_node; +diff -Nbaur gcc-4.1.2/gcc/toplev.c gcc-4.1.2-arm/gcc/toplev.c +--- gcc-4.1.2/gcc/toplev.c Thu Aug 3 12:33:49 2006 ++++ gcc-4.1.2-arm/gcc/toplev.c Fri Feb 16 10:41:27 2007 +@@ -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"); ++ if (p && strlen(p)) set_std_prefix (p, strlen(p)); ++ + + hex_init (); + +diff -Nbaur gcc-4.1.2/gcc/version.c gcc-4.1.2-arm/gcc/version.c +--- gcc-4.1.2/gcc/version.c Wed Mar 16 06:04:10 2005 ++++ gcc-4.1.2-arm/gcc/version.c Fri Feb 16 10:41:27 2007 +@@ -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 " (devkitARM release 21)" + + /* 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 -Nbaur gcc-4.1.2/libiberty/pex-win32.c gcc-4.1.2-arm/libiberty/pex-win32.c +--- gcc-4.1.2/libiberty/pex-win32.c Mon Aug 28 01:00:30 2006 ++++ gcc-4.1.2-arm/libiberty/pex-win32.c Fri Feb 16 10:41:27 2007 +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + + /* mingw32 headers may not define the following. */ + +@@ -72,115 +73,6 @@ + return; + } + +-/* This is a kludge to get around the Microsoft C spawn functions' propensity +- to remove the outermost set of double quotes from all arguments. */ +- +-static const char * const * +-fix_argv (char * const *argvec) +-{ +- char **argv; +- int i; +- char *command0; +- +- /* See whether we need to change anything. */ +- for (command0 = argvec[0]; *command0 != '\0'; command0++) +- if (*command0 == '/') +- break; +- if (*command0 == '\0') +- { +- for (i = 1; argvec[i] != NULL; i++) +- if (strpbrk (argvec[i], "\" \t") != NULL) +- break; +- +- if (argvec[i] == NULL) +- return (const char * const *) argvec; +- } +- +- for (i = 0; argvec[i] != NULL; i++) +- ; +- argv = XNEWVEC (char *, i + 2); +- +- argv++; /* Leave space at the beginning of argv +- for potential #! handling */ +- +- for (i = 0; argvec[i] != NULL; i++) +- argv[i] = xstrdup (argvec[i]); +- argv[i] = NULL; +- +- backslashify (argv[0]); +- +- for (i = 1; argv[i] != 0; i++) +- { +- int len, j; +- char *temp, *newtemp; +- +- temp = argv[i]; +- len = strlen (temp); +- for (j = 0; j < len; j++) +- { +- if (temp[j] == '"') +- { +- newtemp = XNEWVEC (char, len + 2); +- strncpy (newtemp, temp, j); +- newtemp [j] = '\\'; +- strncpy (&newtemp [j+1], &temp [j], len-j); +- newtemp [len+1] = 0; +- temp = newtemp; +- len++; +- j++; +- } +- } +- +- if (argv[i] != temp) +- { +- free (argv[i]); +- argv[i] = temp; +- } +- } +- +- for (i = 0; argv[i] != 0; i++) +- { +- if (strpbrk (argv[i], " \t")) +- { +- int len, trailing_backslash; +- char *temp; +- +- len = strlen (argv[i]); +- trailing_backslash = 0; +- +- /* There is an added complication when an arg with embedded white +- space ends in a backslash (such as in the case of -iprefix arg +- passed to cpp). The resulting quoted strings gets misinterpreted +- by the command interpreter -- it thinks that the ending quote +- is escaped by the trailing backslash and things get confused. +- We handle this case by escaping the trailing backslash, provided +- it was not escaped in the first place. */ +- if (len > 1 +- && argv[i][len-1] == '\\' +- && argv[i][len-2] != '\\') +- { +- trailing_backslash = 1; +- ++len; /* to escape the final backslash. */ +- } +- +- len += 2; /* and for the enclosing quotes. */ +- +- temp = XNEWVEC (char, len + 1); +- temp[0] = '"'; +- strcpy (temp + 1, argv[i]); +- if (trailing_backslash) +- temp[len - 2] = '\\'; +- temp[len - 1] = '"'; +- temp[len] = '\0'; +- +- free (argv[i]); +- argv[i] = temp; +- } +- } +- +- return (const char * const *) argv; +-} +- + static int pex_win32_open_read (struct pex_obj *, const char *, int); + static int pex_win32_open_write (struct pex_obj *, const char *, int); + static long pex_win32_exec_child (struct pex_obj *, int, const char *, +@@ -422,8 +314,225 @@ + } + #endif + ++/* Return a Windows command-line from ARGV. It is the caller's ++ responsibility to free the string returned. */ ++ ++static char * ++argv_to_cmdline (char *const *argv) ++{ ++ char *cmdline; ++ char *p; ++ size_t cmdline_len; ++ int i, j, k; ++ ++ cmdline_len = 0; ++ for (i = 0; argv[i]; i++) ++ { ++ /* We quote every last argument. This simplifies the problem; ++ we need only escape embedded double-quotes and immediately ++ preceeding backslash characters. A sequence of backslach characters ++ that is not follwed by a double quote character will not be ++ escaped. */ ++ for (j = 0; argv[i][j]; j++) ++ { ++ if (argv[i][j] == '"') ++ { ++ /* Escape preceeding backslashes. */ ++ for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) ++ cmdline_len++; ++ /* Escape the qote character. */ ++ cmdline_len++; ++ } ++ } ++ /* Trailing backslashes also need to be escaped because they will be ++ followed by the terminating quote. */ ++ for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) ++ cmdline_len++; ++ cmdline_len += j; ++ cmdline_len += 3; /* for leading and trailing quotes and space */ ++ } ++ cmdline = xmalloc (cmdline_len); ++ p = cmdline; ++ for (i = 0; argv[i]; i++) ++ { ++ *p++ = '"'; ++ for (j = 0; argv[i][j]; j++) ++ { ++ if (argv[i][j] == '"') ++ { ++ for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) ++ *p++ = '\\'; ++ *p++ = '\\'; ++ } ++ *p++ = argv[i][j]; ++ } ++ for (k = j - 1; k >= 0 && argv[i][k] == '\\'; k--) ++ *p++ = '\\'; ++ *p++ = '"'; ++ *p++ = ' '; ++ } ++ p[-1] = '\0'; ++ return cmdline; ++} ++ ++static const char *const ++std_suffixes[] = { ++ ".com", ++ ".exe", ++ ".bat", ++ ".cmd", ++ 0 ++}; ++static const char *const ++no_suffixes[] = { ++ "", ++ 0 ++}; ++ ++/* Returns the full path to PROGRAM. If SEARCH is true, look for ++ PROGRAM in each directory in PATH. */ ++ ++static char * ++find_executable (const char *program, BOOL search) ++{ ++ char *full_executable; ++ char *e; ++ size_t fe_len; ++ const char *path = 0; ++ const char *const *ext; ++ const char *p, *q; ++ size_t proglen = strlen (program); ++ int has_extension = !!strchr (program, '.'); ++ int has_slash = (strchr (program, '/') || strchr (program, '\\')); ++ HANDLE h; ++ ++ if (has_slash) ++ search = FALSE; ++ ++ if (search) ++ path = getenv ("PATH"); ++ if (!path) ++ path = ""; ++ ++ fe_len = 0; ++ for (p = path; *p; p = q) ++ { ++ q = p; ++ while (*q != ';' && *q != '\0') ++ q++; ++ if ((size_t)(q - p) > fe_len) ++ fe_len = q - p; ++ if (*q == ';') ++ q++; ++ } ++ fe_len = fe_len + 1 + proglen + (has_extension ? 1 : 5); ++ full_executable = xmalloc (fe_len); ++ ++ p = path; ++ do ++ { ++ q = p; ++ while (*q != ';' && *q != '\0') ++ q++; ++ ++ e = full_executable; ++ memcpy (e, p, q - p); ++ e += (q - p); ++ if (q - p) ++ *e++ = '\\'; ++ strcpy (e, program); ++ ++ if (*q == ';') ++ q++; ++ ++ for (e = full_executable; *e; e++) ++ if (*e == '/') ++ *e = '\\'; ++ ++ /* At this point, e points to the terminating NUL character for ++ full_executable. */ ++ for (ext = has_extension ? no_suffixes : std_suffixes; *ext; ext++) ++ { ++ /* Remove any current extension. */ ++ *e = '\0'; ++ /* Add the new one. */ ++ strcat (full_executable, *ext); ++ ++ /* Attempt to open this file. */ ++ h = CreateFile (full_executable, GENERIC_READ, ++ FILE_SHARE_READ | FILE_SHARE_WRITE, ++ 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); ++ if (h != INVALID_HANDLE_VALUE) ++ goto found; ++ } ++ p = q; ++ } ++ while (*p); ++ free (full_executable); ++ return 0; ++ ++ found: ++ CloseHandle (h); ++ return full_executable; ++} ++ ++/* Low-level process creation function. */ ++ ++static long ++win32_spawn (const char *executable, ++ BOOL search, ++ char *const *argv, ++ DWORD dwCreationFlags, ++ LPSTARTUPINFO si, ++ LPPROCESS_INFORMATION pi) ++{ ++ char *full_executable; ++ char *cmdline; ++ ++ full_executable = NULL; ++ cmdline = NULL; ++ ++ full_executable = find_executable (executable, search); ++ if (!full_executable) ++ goto error; ++ cmdline = argv_to_cmdline (argv); ++ if (!cmdline) ++ goto error; ++ ++ /* Create the child process. */ ++ if (!CreateProcess (full_executable, cmdline, ++ /*lpProcessAttributes=*/NULL, ++ /*lpThreadAttributes=*/NULL, ++ /*bInheritHandles=*/TRUE, ++ dwCreationFlags, ++ /*lpEnvironment=*/NULL, ++ /*lpCurrentDirectory=*/NULL, ++ si, ++ pi)) ++ { ++ free (full_executable); ++ return -1; ++ } ++ ++ /* Clean up. */ ++ CloseHandle (pi->hThread); ++ free (full_executable); ++ ++ return (long) pi->hProcess; ++ ++ error: ++ if (cmdline) ++ free (cmdline); ++ if (full_executable) ++ free (full_executable); ++ return -1; ++} ++ + static long +-spawn_script (const char *executable, const char * const * argv) ++spawn_script (const char *executable, char *const *argv, ++ DWORD dwCreationFlags, ++ LPSTARTUPINFO si, ++ LPPROCESS_INFORMATION pi) + { + int pid = -1; + int save_errno = errno; +@@ -455,17 +564,21 @@ + executable = strrchr (executable1, '\\') + 1; + if (!executable) + executable = executable1; +- pid = _spawnvp (_P_NOWAIT, executable, argv); ++ pid = win32_spawn (executable, TRUE, argv, ++ dwCreationFlags, si, pi); + #else + if (strchr (executable1, '\\') == NULL) +- pid = _spawnvp (_P_NOWAIT, executable1, argv); ++ pid = win32_spawn (executable1, TRUE, argv, ++ dwCreationFlags, si, pi); + else if (executable1[0] != '\\') +- pid = _spawnv (_P_NOWAIT, executable1, argv); ++ pid = win32_spawn (executable1, FALSE, argv, ++ dwCreationFlags, si, pi); + else + { + const char *newex = mingw_rootify (executable1); + *avhere = newex; +- pid = _spawnv (_P_NOWAIT, newex, argv); ++ pid = win32_spawn (newex, FALSE, argv, ++ dwCreationFlags, si, pi); + if (executable1 != newex) + free ((char *) newex); + if (pid < 0) +@@ -474,7 +587,8 @@ + if (newex != executable1) + { + *avhere = newex; +- pid = _spawnv (_P_NOWAIT, newex, argv); ++ pid = win32_spawn (newex, FALSE, argv, ++ dwCreationFlags, si, pi); + free ((char *) newex); + } + } +@@ -498,149 +612,95 @@ + const char **errmsg, + int *err) + { +- int org_in, org_out, org_errdes; + long pid; +- const char * const * newargv; +- +- org_in = -1; +- org_out = -1; +- org_errdes = -1; +- +- if (in != STDIN_FILE_NO) +- { +- org_in = _dup (STDIN_FILE_NO); +- if (org_in < 0) +- { +- *err = errno; +- *errmsg = "_dup"; +- return -1; +- } +- if (_dup2 (in, STDIN_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (_close (in) < 0) +- { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } +- } ++ HANDLE stdin_handle; ++ HANDLE stdout_handle; ++ HANDLE stderr_handle; ++ DWORD dwCreationFlags; ++ OSVERSIONINFO version_info; ++ STARTUPINFO si; ++ PROCESS_INFORMATION pi; ++ ++ stdin_handle = INVALID_HANDLE_VALUE; ++ stdout_handle = INVALID_HANDLE_VALUE; ++ stderr_handle = INVALID_HANDLE_VALUE; ++ ++ stdin_handle = (HANDLE) _get_osfhandle (in); ++ stdout_handle = (HANDLE) _get_osfhandle (out); ++ if (!(flags & PEX_STDERR_TO_STDOUT)) ++ stderr_handle = (HANDLE) _get_osfhandle (errdes); ++ else ++ stderr_handle = stdout_handle; + +- if (out != STDOUT_FILE_NO) +- { +- org_out = _dup (STDOUT_FILE_NO); +- if (org_out < 0) +- { +- *err = errno; +- *errmsg = "_dup"; +- return -1; +- } +- if (_dup2 (out, STDOUT_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (_close (out) < 0) ++ /* Determine the version of Windows we are running on. */ ++ version_info.dwOSVersionInfoSize = sizeof (version_info); ++ GetVersionEx (&version_info); ++ if (version_info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) ++ /* On Windows 95/98/ME the CREATE_NO_WINDOW flag is not ++ supported, so we cannot avoid creating a console window. */ ++ dwCreationFlags = 0; ++ else + { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } +- } ++ HANDLE conout_handle; + +- if (errdes != STDERR_FILE_NO +- || (flags & PEX_STDERR_TO_STDOUT) != 0) +- { +- org_errdes = _dup (STDERR_FILE_NO); +- if (org_errdes < 0) +- { +- *err = errno; +- *errmsg = "_dup"; +- return -1; +- } +- if (_dup2 ((flags & PEX_STDERR_TO_STDOUT) != 0 ? STDOUT_FILE_NO : errdes, +- STDERR_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (errdes != STDERR_FILE_NO) +- { +- if (_close (errdes) < 0) ++ /* Determine whether or not we have an associated console. */ ++ conout_handle = CreateFile("CONOUT$", ++ GENERIC_WRITE, ++ FILE_SHARE_WRITE, ++ /*lpSecurityAttributes=*/NULL, ++ OPEN_EXISTING, ++ FILE_ATTRIBUTE_NORMAL, ++ /*hTemplateFile=*/NULL); ++ if (conout_handle == INVALID_HANDLE_VALUE) ++ /* There is no console associated with this process. Since ++ the child is a console process, the OS would normally ++ create a new console Window for the child. Since we'll be ++ redirecting the child's standard streams, we do not need ++ the console window. */ ++ dwCreationFlags = CREATE_NO_WINDOW; ++ else + { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } ++ /* There is a console associated with the process, so the OS ++ will not create a new console. And, if we use ++ CREATE_NO_WINDOW in this situation, the child will have ++ no associated console. Therefore, if the child's ++ standard streams are connected to the console, the output ++ will be discarded. */ ++ CloseHandle(conout_handle); ++ dwCreationFlags = 0; + } + } + +- newargv = fix_argv (argv); +- pid = (((flags & PEX_SEARCH) != 0 ? _spawnvp : _spawnv) +- (_P_NOWAIT, executable, newargv)); +- ++ /* Since the child will be a console process, it will, by default, ++ connect standard input/output to its console. However, we want ++ the child to use the handles specifically designated above. In ++ addition, if there is no console (such as when we are running in ++ a Cygwin X window), then we must redirect the child's ++ input/output, as there is no console for the child to use. */ ++ memset (&si, 0, sizeof (si)); ++ si.cb = sizeof (si); ++ si.dwFlags = STARTF_USESTDHANDLES; ++ si.hStdInput = stdin_handle; ++ si.hStdOutput = stdout_handle; ++ si.hStdError = stderr_handle; ++ ++ /* Create the child process. */ ++ pid = win32_spawn (executable, (flags & PEX_SEARCH) != 0, ++ argv, dwCreationFlags, &si, &pi); + if (pid == -1) +- pid = spawn_script (executable, newargv); +- ++ pid = spawn_script (executable, argv, dwCreationFlags, &si, &pi); + if (pid == -1) + { +- *err = errno; +- *errmsg = ((flags & PEX_SEARCH) != 0) ? "_spawnvp" : "_spawnv"; +- } +- +- if (in != STDIN_FILE_NO) +- { +- if (_dup2 (org_in, STDIN_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (_close (org_in) < 0) +- { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } +- } +- +- if (out != STDOUT_FILE_NO) +- { +- if (_dup2 (org_out, STDOUT_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (_close (org_out) < 0) +- { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } ++ *err = ENOENT; ++ *errmsg = "CreateProcess"; + } + +- if (errdes != STDERR_FILE_NO +- || (flags & PEX_STDERR_TO_STDOUT) != 0) +- { +- if (_dup2 (org_errdes, STDERR_FILE_NO) < 0) +- { +- *err = errno; +- *errmsg = "_dup2"; +- return -1; +- } +- if (_close (org_errdes) < 0) +- { +- *err = errno; +- *errmsg = "_close"; +- return -1; +- } +- } ++ /* Close the standard output and standard error handles in the ++ parent. */ ++ if (out != STDOUT_FILENO) ++ obj->funcs->close (obj, out); ++ if (errdes != STDERR_FILENO) ++ obj->funcs->close (obj, errdes); + + return pid; + } +@@ -658,30 +718,34 @@ + int *status, struct pex_time *time, int done ATTRIBUTE_UNUSED, + const char **errmsg, int *err) + { +- int termstat; ++ DWORD termstat; ++ HANDLE h; + + if (time != NULL) + memset (time, 0, sizeof *time); + ++ h = (HANDLE) pid; ++ + /* FIXME: If done is non-zero, we should probably try to kill the + process. */ +- +- if (_cwait (&termstat, pid, WAIT_CHILD) < 0) ++ if (WaitForSingleObject (h, INFINITE) != WAIT_OBJECT_0) + { +- *err = errno; +- *errmsg = "_cwait"; ++ CloseHandle (h); ++ *err = ECHILD; ++ *errmsg = "WaitForSingleObject"; + return -1; + } + +- /* cwait returns the child process exit code in termstat. A value +- of 3 indicates that the child caught a signal, but not which one. +- Since only SIGABRT, SIGFPE and SIGINT do anything, we report +- SIGABRT. */ ++ GetExitCodeProcess (h, &termstat); ++ CloseHandle (h); + ++ /* A value of 3 indicates that the child caught a signal, but not ++ which one. Since only SIGABRT, SIGFPE and SIGINT do anything, we ++ report SIGABRT. */ + if (termstat == 3) + *status = SIGABRT; + else +- *status = ((termstat & 0xff) << 8); ++ *status = (termstat & 0xff) << 8; + + return 0; + } diff --git a/dkarm-eabi/scripts/build-gcc.sh b/dkarm-eabi/scripts/build-gcc.sh index 960a4b2..8c074e7 100644 --- a/dkarm-eabi/scripts/build-gcc.sh +++ b/dkarm-eabi/scripts/build-gcc.sh @@ -35,7 +35,7 @@ mkdir -p $target/gcc cd $target/gcc -../../$GCC_SRCDIR/configure \ +CFLAGS=-D__USE_MINGW_ACCESS ../../$GCC_SRCDIR/configure \ --enable-languages=c,c++ \ --with-cpu=arm7tdmi\ --enable-interwork --enable-multilib\ @@ -61,7 +61,7 @@ mkdir -p $target/newlib cd $target/newlib mkdir -p etc -$BUILDSCRIPTDIR/$NEWLIB_SRCDIR/configure \ +CFLAGS=-DREENTRANT_SYSCALLS_PROVIDED ../../$NEWLIB_SRCDIR/configure \ --disable-newlib-supplied-syscalls \ --disable-debug \ --target=$target \ diff --git a/dkppc/scripts/build-crtls.sh b/dkppc/scripts/build-crtls.sh index 298732a..46bb9a2 100644 --- a/dkppc/scripts/build-crtls.sh +++ b/dkppc/scripts/build-crtls.sh @@ -10,6 +10,10 @@ echo "installing specs ..." powerpc-gekko-gcc -dumpspecs $DEVKITPPC/lib/gcc/$target/$GCC_VER/specs cp `pwd`/dkppc/crtls/gcn* $DEVKITPPC/$target/lib/ cp `pwd`/dkppc/crtls/specs $DEVKITPPC/lib/gcc/$target/$GCC_VER/specs +#--------------------------------------------------------------------------------- +# copy base rulesets +#--------------------------------------------------------------------------------- +cp `pwd`/dkppc/rules/gamecube_rules dkppc/rules/base_rules $DEVKITPPC echo "building libogc ..." cd $LIBOGC_SRCDIR @@ -17,10 +21,5 @@ $MAKE echo "installing libogc ..." $MAKE install -#--------------------------------------------------------------------------------- -# copy base rulesets -#--------------------------------------------------------------------------------- -cd $BUILDSCRIPTDIR -cp dkppc/rules/gamecube_rules dkppc/rules/base_rules $DEVKITPPC diff --git a/dkppc/scripts/build-gcc.sh b/dkppc/scripts/build-gcc.sh index 0b59427..5f7b158 100644 --- a/dkppc/scripts/build-gcc.sh +++ b/dkppc/scripts/build-gcc.sh @@ -65,7 +65,7 @@ mkdir -p $target/gcc cd $target/gcc -../../$GCC_SRCDIR/configure \ +CFLAGS=-D__USE_MINGW_ACCESS ../../$GCC_SRCDIR/configure \ --enable-languages=c,c++ \ --with-cpu=750\ --with-gcc --with-gnu-ld --with-gnu-as --with-stabs \ diff --git a/dkpsp/patches/gcc-4.1.2.patch b/dkpsp/patches/gcc-4.1.2.patch new file mode 100644 index 0000000..5ebfbef --- /dev/null +++ b/dkpsp/patches/gcc-4.1.2.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 " devkitPSP release 11 (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/scripts/build-gcc.sh b/dkpsp/scripts/build-gcc.sh index a2b57dc..88f4321 100644 --- a/dkpsp/scripts/build-gcc.sh +++ b/dkpsp/scripts/build-gcc.sh @@ -33,7 +33,7 @@ mkdir -p $target/gcc cd $target/gcc -../../$GCC_SRCDIR/configure \ +CFLAGS=-D__USE_MINGW_ACCESS ../../$GCC_SRCDIR/configure \ --enable-languages=c,c++ \ --disable-multilib\ --with-gcc --with-gnu-ld --with-gnu-as\