diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2008-05-14 07:59:11 +0000 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2008-05-14 07:59:11 +0000 |
commit | cc63458234d9392483f2e63bf19b43be9b424e4c (patch) | |
tree | 58730989732ab35559cf3f1b35120da7319601f4 /patches | |
parent | 3baf665a2f3e1a4c75585b80a2a7f3e4b67494e7 (diff) | |
download | OSELAS.Toolchain-cc63458234d9392483f2e63bf19b43be9b424e4c.tar.gz OSELAS.Toolchain-cc63458234d9392483f2e63bf19b43be9b424e4c.tar.xz |
git-svn-id: https://svn.pengutronix.de/svn/oselas/toolchain/branches/OSELAS.Toolchain-mkl@6337 f8d472c7-5700-0410-ac5a-87979cec3adf
Diffstat (limited to 'patches')
142 files changed, 13626 insertions, 17 deletions
diff --git a/patches/binutils-2.18/generic/gentoo/03_all_binutils-2.15.92.0.2-ppc64-pie.patch b/patches/binutils-2.18/generic/gentoo/03_all_binutils-2.15.92.0.2-ppc64-pie.patch new file mode 100644 index 0000000..03816d2 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/03_all_binutils-2.15.92.0.2-ppc64-pie.patch @@ -0,0 +1,22 @@ +--- + bfd/elf64-ppc.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +Index: binutils-2.18/bfd/elf64-ppc.c +=================================================================== +--- binutils-2.18.orig/bfd/elf64-ppc.c ++++ binutils-2.18/bfd/elf64-ppc.c +@@ -10979,7 +10979,12 @@ ppc64_elf_relocate_section (bfd *output_ + else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf) + && !is_opd + && r_type != R_PPC64_TOC) +- outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type); ++ { ++ outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type); ++ if (h->elf.dynindx == -1 ++ && h->elf.root.type == bfd_link_hash_undefweak) ++ memset (&outrel, 0, sizeof outrel); ++ } + else + { + /* This symbol is local, or marked to become local, diff --git a/patches/binutils-2.18/generic/gentoo/04_all_binutils-2.15.92.0.2-place-orphan.patch b/patches/binutils-2.18/generic/gentoo/04_all_binutils-2.15.92.0.2-place-orphan.patch new file mode 100644 index 0000000..cfc9b05 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/04_all_binutils-2.15.92.0.2-place-orphan.patch @@ -0,0 +1,22 @@ +2003-08-05 Jakub Jelinek <jakub@redhat.com> + + * emulparams/elf64ppc.sh (OTHER_GOT_RELOC_SECTIONS): Add .rela.opd. + +--- + ld/emulparams/elf64ppc.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: binutils-2.18/ld/emulparams/elf64ppc.sh +=================================================================== +--- binutils-2.18.orig/ld/emulparams/elf64ppc.sh ++++ binutils-2.18/ld/emulparams/elf64ppc.sh +@@ -28,7 +28,8 @@ else + .toc 0 : { *(.toc) }" + fi + OTHER_GOT_RELOC_SECTIONS=" +- .rela.toc ${RELOCATING-0} : { *(.rela.toc) }" ++ .rela.toc ${RELOCATING-0} : { *(.rela.toc) } ++ .rela.opd ${RELOCATING-0} : { *(.rela.opd) }" + OTHER_READWRITE_SECTIONS=" + .toc1 ${RELOCATING-0} :${RELOCATING+ ALIGN(8)} { *(.toc1) } + .opd ${RELOCATING-0} :${RELOCATING+ ALIGN(8)} { KEEP (*(.opd)) } diff --git a/patches/binutils-2.18/generic/gentoo/08_all_binutils-RPATH_ENVVAR-smack.patch b/patches/binutils-2.18/generic/gentoo/08_all_binutils-RPATH_ENVVAR-smack.patch new file mode 100644 index 0000000..7180b94 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/08_all_binutils-RPATH_ENVVAR-smack.patch @@ -0,0 +1,19 @@ +http://sourceware.org/ml/binutils/2007-07/msg00401.html +http://sourceware.org/bugzilla/show_bug.cgi?id=4970 + +--- + configure | 1 + + 1 file changed, 1 insertion(+) + +Index: binutils-2.18/configure +=================================================================== +--- binutils-2.18.orig/configure ++++ binutils-2.18/configure +@@ -5369,6 +5369,7 @@ case "${host}" in + *-*-darwin* | *-*-rhapsody* ) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; + *) RPATH_ENVVAR=LD_LIBRARY_PATH ;; + esac ++RPATH_ENVVAR="cant_touch_this_nah_nah_nah" + + # Record target_configdirs and the configure arguments for target and + # build configuration in Makefile. diff --git a/patches/binutils-2.18/generic/gentoo/09_all_binutils-ld-tests-CXXFLAGS.patch b/patches/binutils-2.18/generic/gentoo/09_all_binutils-ld-tests-CXXFLAGS.patch new file mode 100644 index 0000000..93ce802 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/09_all_binutils-ld-tests-CXXFLAGS.patch @@ -0,0 +1,75 @@ +http://sourceware.org/ml/binutils/2007-08/msg00411.html + +forcing CFLAGS against C++ builds causes false failures + +--- + ld/testsuite/lib/ld-lib.exp | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +Index: binutils-2.18/ld/testsuite/lib/ld-lib.exp +=================================================================== +--- binutils-2.18.orig/ld/testsuite/lib/ld-lib.exp ++++ binutils-2.18/ld/testsuite/lib/ld-lib.exp +@@ -206,6 +206,7 @@ proc default_ld_simple_link { ld target + # + proc default_ld_compile { cc source object } { + global CFLAGS ++ global CXXFLAGS + global srcdir + global subdir + global host_triplet +@@ -222,7 +223,11 @@ proc default_ld_compile { cc source obje + + catch "exec rm -f $object" exec_output + +- set flags "-I$srcdir/$subdir $CFLAGS" ++ if {[string match "*.cc" $source]} then { ++ set flags "-I$srcdir/$subdir $CXXFLAGS" ++ } else { ++ set flags "-I$srcdir/$subdir $CFLAGS" ++ } + + # If we are compiling with gcc, we want to add gcc_gas_flag to + # flags. Rather than determine this in some complex way, we guess +@@ -1282,6 +1287,7 @@ proc run_ld_link_exec_tests { targets_to + global CC + global CXX + global CFLAGS ++ global CXXFLAGS + global errcnt + global exec_output + +@@ -1316,7 +1322,11 @@ proc run_ld_link_exec_tests { targets_to + # We ignore warnings since some compilers may generate + # incorrect section attributes and the assembler will warn + # them. +- ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ if { [ string match "c++" $lang ] } { ++ ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ } else { ++ ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ } + + # We have to use $CC to build PIE and shared library. + if { [ string match "c" $lang ] } { +@@ -1408,6 +1418,7 @@ proc run_cc_link_tests { ldtests } { + global CC + global CXX + global CFLAGS ++ global CXXFLAGS + + foreach testitem $ldtests { + set testname [lindex $testitem 0] +@@ -1429,7 +1440,11 @@ proc run_cc_link_tests { ldtests } { + # We ignore warnings since some compilers may generate + # incorrect section attributes and the assembler will warn + # them. +- ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ if { [ string match "c++" $lang ] } { ++ ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ } else { ++ ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile ++ } + } + + # Clear error and warning counts. diff --git a/patches/binutils-2.18/generic/gentoo/12_all_sh-targets.patch b/patches/binutils-2.18/generic/gentoo/12_all_sh-targets.patch new file mode 100644 index 0000000..21c2e8f --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/12_all_sh-targets.patch @@ -0,0 +1,56 @@ +r10231 | lethal | 2005-05-02 09:58:00 -0400 (Mon, 02 May 2005) | 13 lines + +Likewise, binutils has no idea about any of these new targets either, so we +fix that up too.. now we're able to actually build a real toolchain for +sh2a_nofpu- and other more ineptly named toolchains (and yes, there are more +inept targets than that one, really. Go look, I promise). + +--- + configure | 4 ++-- + configure.ac | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +Index: binutils-2.18/configure +=================================================================== +--- binutils-2.18.orig/configure ++++ binutils-2.18/configure +@@ -2206,7 +2206,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -2504,7 +2504,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +Index: binutils-2.18/configure.ac +=================================================================== +--- binutils-2.18.orig/configure.ac ++++ binutils-2.18/configure.ac +@@ -484,7 +484,7 @@ case "${target}" in + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -782,7 +782,7 @@ case "${target}" in + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in diff --git a/patches/binutils-2.18/generic/gentoo/18_all_binutils-makeinfo-version.patch b/patches/binutils-2.18/generic/gentoo/18_all_binutils-makeinfo-version.patch index 04a2eb2..bdbc340 100644 --- a/patches/binutils-2.18/generic/gentoo/18_all_binutils-makeinfo-version.patch +++ b/patches/binutils-2.18/generic/gentoo/18_all_binutils-makeinfo-version.patch @@ -27,7 +27,7 @@ Index: binutils-2.18/configure =================================================================== --- binutils-2.18.orig/configure +++ binutils-2.18/configure -@@ -6128,7 +6128,7 @@ case " $build_configdirs " in +@@ -6129,7 +6129,7 @@ case " $build_configdirs " in # For an installed makeinfo, we require it to be from texinfo 4.4 or # higher, else we use the "missing" dummy. if ${MAKEINFO} --version \ diff --git a/patches/binutils-2.18/generic/gentoo/25_all_binutils-for-build-flags.patch b/patches/binutils-2.18/generic/gentoo/25_all_binutils-for-build-flags.patch new file mode 100644 index 0000000..8c2cf03 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/25_all_binutils-for-build-flags.patch @@ -0,0 +1,23 @@ +only default CFLAGS_FOR_BUILD to host CFLAGS when build and host are the same + +http://bugs.gentoo.org/192959 + +--- + configure | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +Index: binutils-2.18/configure +=================================================================== +--- binutils-2.18.orig/configure ++++ binutils-2.18/configure +@@ -5778,7 +5778,9 @@ esac + + # Allow the user to override the flags for + # our build compiler if desired. +-CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-${CFLAGS}} ++if test x"${build}" = x"${host}" ; then ++ CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-${CFLAGS}} ++fi + + # On Canadian crosses, we'll be searching the right directories for + # the previously-installed cross compiler, so don't bother to add diff --git a/patches/binutils-2.18/generic/gentoo/30_all_binutils-multitarget-fixup.patch b/patches/binutils-2.18/generic/gentoo/30_all_binutils-multitarget-fixup.patch new file mode 100644 index 0000000..ff815e1 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/30_all_binutils-multitarget-fixup.patch @@ -0,0 +1,234 @@ +Fix from upstream for --enable-targets=all on an x86_64 multilib system. + +http://sourceware.org/ml/binutils/2007-09/msg00137.html +http://sourceware.org/ml/binutils/2007-09/msg00162.html + +2007-09-14 Alan Modra <amodra@bigpond.net.au> + + * format.c (bfd_check_format_matches): Record matching targets even + when "matching" is NULL to allow bfd_associated_vector matches. + Consolidate error return code. Consolidate ok return code. Always + restore original target and format on error. + +--- + bfd/format.c | 112 ++++++++++++++++++----------------------------------------- + 1 file changed, 35 insertions(+), 77 deletions(-) + +Index: binutils-2.18/bfd/format.c +=================================================================== +--- binutils-2.18.orig/bfd/format.c ++++ binutils-2.18/bfd/format.c +@@ -125,6 +125,9 @@ bfd_check_format_matches (bfd *abfd, bfd + int match_count; + int ar_match_index; + ++ if (matching != NULL) ++ *matching = NULL; ++ + if (!bfd_read_p (abfd) + || (unsigned int) abfd->format >= (unsigned int) bfd_type_end) + { +@@ -141,11 +144,10 @@ bfd_check_format_matches (bfd *abfd, bfd + match_count = 0; + ar_match_index = _bfd_target_vector_entries; + +- if (matching) ++ if (matching != NULL || *bfd_associated_vector != NULL) + { + bfd_size_type amt; + +- *matching = NULL; + amt = sizeof (*matching_vector) * 2 * _bfd_target_vector_entries; + matching_vector = bfd_malloc (amt); + if (!matching_vector) +@@ -162,31 +164,12 @@ bfd_check_format_matches (bfd *abfd, bfd + if (!abfd->target_defaulted) + { + if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) /* rewind! */ +- { +- if (matching) +- free (matching_vector); +- return FALSE; +- } ++ goto err_ret; + + right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); + + if (right_targ) +- { +- abfd->xvec = right_targ; /* Set the target as returned. */ +- +- if (matching) +- free (matching_vector); +- +- /* If the file was opened for update, then `output_has_begun' +- some time ago when the file was created. Do not recompute +- sections sizes or alignments in _bfd_set_section_contents. +- We can not set this flag until after checking the format, +- because it will interfere with creation of BFD sections. */ +- if (abfd->direction == both_direction) +- abfd->output_has_begun = TRUE; +- +- return TRUE; /* File position has moved, BTW. */ +- } ++ goto ok_ret; + + /* For a long time the code has dropped through to check all + targets if the specified target was wrong. I don't know why, +@@ -201,17 +184,7 @@ bfd_check_format_matches (bfd *abfd, bfd + this sort, I changed this test to check only for the binary + target. */ + if (format == bfd_archive && save_targ == &binary_vec) +- { +- abfd->xvec = save_targ; +- abfd->format = bfd_unknown; +- +- if (matching) +- free (matching_vector); +- +- bfd_set_error (bfd_error_file_not_recognized); +- +- return FALSE; +- } ++ goto err_unrecog; + } + + for (target = bfd_target_vector; *target != NULL; target++) +@@ -227,11 +200,7 @@ bfd_check_format_matches (bfd *abfd, bfd + abfd->xvec = *target; /* Change BFD's target temporarily. */ + + if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) +- { +- if (matching) +- free (matching_vector); +- return FALSE; +- } ++ goto err_ret; + + /* If _bfd_check_format neglects to set bfd_error, assume + bfd_error_wrong_format. We didn't used to even pay any +@@ -255,9 +224,8 @@ bfd_check_format_matches (bfd *abfd, bfd + break; + } + +- if (matching) ++ if (matching_vector) + matching_vector[match_count] = temp; +- + match_count++; + } + else if ((err = bfd_get_error ()) == bfd_error_wrong_object_format +@@ -268,20 +236,12 @@ bfd_check_format_matches (bfd *abfd, bfd + no better matches. */ + if (ar_right_targ != bfd_default_vector[0]) + ar_right_targ = *target; +- if (matching) ++ if (matching_vector) + matching_vector[ar_match_index] = *target; + ar_match_index++; + } + else if (err != bfd_error_wrong_format) +- { +- abfd->xvec = save_targ; +- abfd->format = bfd_unknown; +- +- if (matching) +- free (matching_vector); +- +- return FALSE; +- } ++ goto err_ret; + } + + if (match_count == 0) +@@ -297,16 +257,14 @@ bfd_check_format_matches (bfd *abfd, bfd + { + match_count = ar_match_index - _bfd_target_vector_entries; + +- if (matching && match_count > 1) ++ if (matching_vector && match_count > 1) + memcpy (matching_vector, + matching_vector + _bfd_target_vector_entries, + sizeof (*matching_vector) * match_count); + } + } + +- if (match_count > 1 +- && bfd_associated_vector != NULL +- && matching) ++ if (match_count > 1) + { + const bfd_target * const *assoc = bfd_associated_vector; + +@@ -328,11 +286,9 @@ bfd_check_format_matches (bfd *abfd, bfd + + if (match_count == 1) + { ++ ok_ret: + abfd->xvec = right_targ; /* Change BFD's target permanently. */ + +- if (matching) +- free (matching_vector); +- + /* If the file was opened for update, then `output_has_begun' + some time ago when the file was created. Do not recompute + sections sizes or alignments in _bfd_set_section_contents. +@@ -341,37 +297,39 @@ bfd_check_format_matches (bfd *abfd, bfd + if (abfd->direction == both_direction) + abfd->output_has_begun = TRUE; + ++ if (matching_vector) ++ free (matching_vector); + return TRUE; /* File position has moved, BTW. */ + } + +- abfd->xvec = save_targ; /* Restore original target type. */ +- abfd->format = bfd_unknown; /* Restore original format. */ +- + if (match_count == 0) + { ++ err_unrecog: + bfd_set_error (bfd_error_file_not_recognized); +- +- if (matching) ++ err_ret: ++ abfd->xvec = save_targ; ++ abfd->format = bfd_unknown; ++ if (matching_vector) + free (matching_vector); ++ return FALSE; + } +- else +- { +- bfd_set_error (bfd_error_file_ambiguously_recognized); + +- if (matching) ++ abfd->xvec = save_targ; /* Restore original target type. */ ++ abfd->format = bfd_unknown; /* Restore original format. */ ++ bfd_set_error (bfd_error_file_ambiguously_recognized); ++ ++ if (matching) ++ { ++ *matching = (char **) matching_vector; ++ matching_vector[match_count] = NULL; ++ /* Return target names. This is a little nasty. Maybe we ++ should do another bfd_malloc? */ ++ while (--match_count >= 0) + { +- *matching = (char **) matching_vector; +- matching_vector[match_count] = NULL; +- /* Return target names. This is a little nasty. Maybe we +- should do another bfd_malloc? */ +- while (--match_count >= 0) +- { +- const char *name = matching_vector[match_count]->name; +- *(const char **) &matching_vector[match_count] = name; +- } ++ const char *name = matching_vector[match_count]->name; ++ *(const char **) &matching_vector[match_count] = name; + } + } +- + return FALSE; + } + diff --git a/patches/binutils-2.18/generic/gentoo/33_all_binutils-gnu-relro-fixups.patch b/patches/binutils-2.18/generic/gentoo/33_all_binutils-gnu-relro-fixups.patch new file mode 100644 index 0000000..2471163 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/33_all_binutils-gnu-relro-fixups.patch @@ -0,0 +1,536 @@ +http://bugs.gentoo.org/192584 +http://sourceware.org/bugzilla/show_bug.cgi?id=5037 +http://sourceware.org/ml/binutils/2007-09/msg00208.html + +bfd/ + +2007-09-16 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/3281 + PR binutils/5037 + * elf-bfd.h (elf_obj_tdata): Remove relro. + + * elf.c (get_program_header_size): Check info->relro instead + of elf_tdata (abfd)->relro. + (_bfd_elf_map_sections_to_segments): Likewise. + (assign_file_positions_for_load_sections): Don't set + PT_GNU_RELRO segment alignment here. + (assign_file_positions_for_non_load_sections): Properly set up + PT_GNU_RELRO segment for copying executable/shared library. + (rewrite_elf_program_header): Remove PT_GNU_RELRO segment. + (copy_elf_program_header): Set p_size and p_size_valid fields for + PT_GNU_RELRO segment. + +include/elf/ + +2007-09-16 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/3281 + PR binutils/5037 + * internal.h (elf_segment_map): Add p_size and p_size_valid. + (ELF_IS_SECTION_IN_SEGMENT): Allow SHF_TLS sections in + PT_GNU_RELRO segments. + +ld/ + +2007-09-16 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/3281 + PR binutils/5037 + * ldexp.h (ldexp_control): Add relro, relro_start_stat and + relro_end_stat. + + * ldexp.c (fold_binary): Set expld.dataseg.relro to + exp_dataseg_relro_start or exp_dataseg_relro_end when + seeing DATA_SEGMENT_ALIGN or DATA_SEGMENT_RELRO_END, + respectively. + + * ldlang.c (lang_size_sections_1): Properly set + expld.dataseg.relro_start_stat and + expld.dataseg.relro_end_stat. + (find_relro_section_callback): New function. + (lang_find_relro_sections_1): Likewise. + (lang_find_relro_sections): Likewise. + (lang_process): Call lang_find_relro_sections for + non-relocatable link. + +ld/testsuite/ + +2007-09-16 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/3281 + PR binutils/5037 + * ld-elf/binutils.exp: Update "-z relro" tests to use relro1.s. + Add "-z relro" tests with relro2.s. Add "-z relro" tests with + TLS for objcopy. + + * ld-elf/relro1.s: New file. + * ld-elf/relro2.s: Likewise. + +--- + bfd/elf-bfd.h | 3 - + bfd/elf.c | 77 ++++++++++++++++++++++++----- + bfd/elflink.c | 1 + include/elf/internal.h | 10 +++ + ld/ldexp.c | 2 + ld/ldexp.h | 11 ++++ + ld/ldlang.c | 101 +++++++++++++++++++++++++++++++++++++++ + ld/testsuite/ld-elf/binutils.exp | 28 ++++++++-- + ld/testsuite/ld-elf/relro1.s | 14 +++++ + ld/testsuite/ld-elf/relro2.s | 5 + + 10 files changed, 227 insertions(+), 25 deletions(-) + +Index: binutils-2.18/bfd/elf-bfd.h +=================================================================== +--- binutils-2.18.orig/bfd/elf-bfd.h ++++ binutils-2.18/bfd/elf-bfd.h +@@ -1428,9 +1428,6 @@ struct elf_obj_tdata + /* Segment flags for the PT_GNU_STACK segment. */ + unsigned int stack_flags; + +- /* Should the PT_GNU_RELRO segment be emitted? */ +- bfd_boolean relro; +- + /* Symbol version definitions in external objects. */ + Elf_Internal_Verdef *verdef; + +Index: binutils-2.18/bfd/elf.c +=================================================================== +--- binutils-2.18.orig/bfd/elf.c ++++ binutils-2.18/bfd/elf.c +@@ -3321,7 +3321,7 @@ get_program_header_size (bfd *abfd, stru + /* We need a PT_DYNAMIC segment. */ + ++segs; + +- if (elf_tdata (abfd)->relro) ++ if (info->relro) + { + /* We need a PT_GNU_RELRO segment only when there is a + PT_DYNAMIC segment. */ +@@ -3851,7 +3851,7 @@ _bfd_elf_map_sections_to_segments (bfd * + pm = &m->next; + } + +- if (dynsec != NULL && elf_tdata (abfd)->relro) ++ if (dynsec != NULL && info->relro) + { + /* We make a PT_GNU_RELRO segment only when there is a + PT_DYNAMIC segment. */ +@@ -4326,12 +4326,10 @@ assign_file_positions_for_load_sections + p->p_memsz += this_hdr->sh_size; + } + +- if (p->p_type == PT_GNU_RELRO) +- p->p_align = 1; +- else if (align > p->p_align +- && !m->p_align_valid +- && (p->p_type != PT_LOAD +- || (abfd->flags & D_PAGED) == 0)) ++ if (align > p->p_align ++ && !m->p_align_valid ++ && (p->p_type != PT_LOAD ++ || (abfd->flags & D_PAGED) == 0)) + p->p_align = align; + } + +@@ -4480,18 +4478,53 @@ assign_file_positions_for_non_load_secti + if (m->count != 0) + { + if (p->p_type != PT_LOAD +- && (p->p_type != PT_NOTE || bfd_get_format (abfd) != bfd_core)) ++ && (p->p_type != PT_NOTE ++ || bfd_get_format (abfd) != bfd_core)) + { + Elf_Internal_Shdr *hdr; ++ asection *sect; ++ + BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs); + +- hdr = &elf_section_data (m->sections[m->count - 1])->this_hdr; +- p->p_filesz = (m->sections[m->count - 1]->filepos +- - m->sections[0]->filepos); ++ sect = m->sections[m->count - 1]; ++ hdr = &elf_section_data (sect)->this_hdr; ++ p->p_filesz = sect->filepos - m->sections[0]->filepos; + if (hdr->sh_type != SHT_NOBITS) + p->p_filesz += hdr->sh_size; + +- p->p_offset = m->sections[0]->filepos; ++ if (p->p_type == PT_GNU_RELRO) ++ { ++ /* When we get here, we are copying executable ++ or shared library. But we need to use the same ++ linker logic. */ ++ Elf_Internal_Phdr *lp; ++ ++ for (lp = phdrs; lp < phdrs + count; ++lp) ++ { ++ if (lp->p_type == PT_LOAD ++ && lp->p_paddr == p->p_paddr) ++ break; ++ } ++ ++ if (lp < phdrs + count) ++ { ++ /* We should use p_size if it is valid since it ++ may contain the first few bytes of the next ++ SEC_ALLOC section. */ ++ if (m->p_size_valid) ++ p->p_filesz = m->p_size; ++ else ++ abort (); ++ p->p_vaddr = lp->p_vaddr; ++ p->p_offset = lp->p_offset; ++ p->p_memsz = p->p_filesz; ++ p->p_align = 1; ++ } ++ else ++ abort (); ++ } ++ else ++ p->p_offset = m->sections[0]->filepos; + } + } + else +@@ -5080,7 +5113,12 @@ rewrite_elf_program_header (bfd *ibfd, b + } + + if (segment->p_type != PT_LOAD) +- continue; ++ { ++ /* Remove PT_GNU_RELRO segment. */ ++ if (segment->p_type == PT_GNU_RELRO) ++ segment->p_type = PT_NULL; ++ continue; ++ } + + /* Determine if this segment overlaps any previous segments. */ + for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2 ++) +@@ -5604,6 +5642,17 @@ copy_elf_program_header (bfd *ibfd, bfd + map->p_align_valid = 1; + map->p_vaddr_offset = 0; + ++ if (map->p_type == PT_GNU_RELRO ++ && segment->p_filesz == segment->p_memsz) ++ { ++ /* The PT_GNU_RELRO segment may contain the first a few ++ bytes in the .got.plt section even if the whole .got.plt ++ section isn't in the PT_GNU_RELRO segment. We won't ++ change the size of the PT_GNU_RELRO segment. */ ++ map->p_size = segment->p_filesz; ++ map->p_size_valid = 1; ++ } ++ + /* Determine if this segment contains the ELF file header + and if it contains the program headers themselves. */ + map->includes_filehdr = (segment->p_offset == 0 +Index: binutils-2.18/bfd/elflink.c +=================================================================== +--- binutils-2.18.orig/bfd/elflink.c ++++ binutils-2.18/bfd/elflink.c +@@ -5327,7 +5327,6 @@ bfd_elf_size_dynamic_sections (bfd *outp + return TRUE; + + bed = get_elf_backend_data (output_bfd); +- elf_tdata (output_bfd)->relro = info->relro; + if (info->execstack) + elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; + else if (info->noexecstack) +Index: binutils-2.18/include/elf/internal.h +=================================================================== +--- binutils-2.18.orig/include/elf/internal.h ++++ binutils-2.18/include/elf/internal.h +@@ -239,6 +239,8 @@ struct elf_segment_map + bfd_vma p_vaddr_offset; + /* Program segment alignment. */ + bfd_vma p_align; ++ /* Segment size in file and memory */ ++ bfd_vma p_size; + /* Whether the p_flags field is valid; if not, the flags are based + on the section flags. */ + unsigned int p_flags_valid : 1; +@@ -248,6 +250,9 @@ struct elf_segment_map + /* Whether the p_align field is valid; if not, PT_LOAD segment + alignment is based on the default maximum page size. */ + unsigned int p_align_valid : 1; ++ /* Whether the p_size field is valid; if not, the size are based ++ on the section sizes. */ ++ unsigned int p_size_valid : 1; + /* Whether this segment includes the file header. */ + unsigned int includes_filehdr : 1; + /* Whether this segment includes the program headers. */ +@@ -266,11 +271,12 @@ struct elf_segment_map + || segment->p_type == PT_TLS) ? sec_hdr->sh_size : 0) + + /* Decide if the given sec_hdr is in the given segment. PT_TLS segment +- contains only SHF_TLS sections. Only PT_LOAD and PT_TLS segments +- can contain SHF_TLS sections. */ ++ contains only SHF_TLS sections. Only PT_LOAD, PT_GNU_RELRO and ++ and PT_TLS segments can contain SHF_TLS sections. */ + #define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment) \ + (((((sec_hdr->sh_flags & SHF_TLS) != 0) \ + && (segment->p_type == PT_TLS \ ++ || segment->p_type == PT_GNU_RELRO \ + || segment->p_type == PT_LOAD)) \ + || ((sec_hdr->sh_flags & SHF_TLS) == 0 \ + && segment->p_type != PT_TLS)) \ +Index: binutils-2.18/ld/ldexp.c +=================================================================== +--- binutils-2.18.orig/ld/ldexp.c ++++ binutils-2.18/ld/ldexp.c +@@ -390,6 +390,7 @@ fold_binary (etree_type *tree) + break; + + case DATA_SEGMENT_ALIGN: ++ expld.dataseg.relro = exp_dataseg_relro_start; + if (expld.phase != lang_first_phase_enum + && expld.section == bfd_abs_section_ptr + && (expld.dataseg.phase == exp_dataseg_none +@@ -425,6 +426,7 @@ fold_binary (etree_type *tree) + break; + + case DATA_SEGMENT_RELRO_END: ++ expld.dataseg.relro = exp_dataseg_relro_end; + if (expld.phase != lang_first_phase_enum + && (expld.dataseg.phase == exp_dataseg_align_seen + || expld.dataseg.phase == exp_dataseg_adjust +Index: binutils-2.18/ld/ldexp.h +=================================================================== +--- binutils-2.18.orig/ld/ldexp.h ++++ binutils-2.18/ld/ldexp.h +@@ -98,6 +98,8 @@ typedef enum { + lang_final_phase_enum + } lang_phase_type; + ++union lang_statement_union; ++ + struct ldexp_control { + /* Modify expression evaluation depending on this. */ + lang_phase_type phase; +@@ -125,6 +127,15 @@ struct ldexp_control { + } phase; + + bfd_vma base, min_base, relro_end, end, pagesize, maxpagesize; ++ ++ enum { ++ exp_dataseg_relro_none, ++ exp_dataseg_relro_start, ++ exp_dataseg_relro_end, ++ } relro; ++ ++ union lang_statement_union *relro_start_stat; ++ union lang_statement_union *relro_end_stat; + } dataseg; + }; + +Index: binutils-2.18/ld/ldlang.c +=================================================================== +--- binutils-2.18.orig/ld/ldlang.c ++++ binutils-2.18/ld/ldlang.c +@@ -4631,10 +4631,32 @@ lang_size_sections_1 + bfd_vma newdot = dot; + etree_type *tree = s->assignment_statement.exp; + ++ expld.dataseg.relro = exp_dataseg_relro_none; ++ + exp_fold_tree (tree, + output_section_statement->bfd_section, + &newdot); + ++ if (expld.dataseg.relro == exp_dataseg_relro_start) ++ { ++ if (!expld.dataseg.relro_start_stat) ++ expld.dataseg.relro_start_stat = s; ++ else ++ { ++ ASSERT (expld.dataseg.relro_start_stat == s); ++ } ++ } ++ else if (expld.dataseg.relro == exp_dataseg_relro_end) ++ { ++ if (!expld.dataseg.relro_end_stat) ++ expld.dataseg.relro_end_stat = s; ++ else ++ { ++ ASSERT (expld.dataseg.relro_end_stat == s); ++ } ++ } ++ expld.dataseg.relro = exp_dataseg_relro_none; ++ + /* This symbol is relative to this section. */ + if ((tree->type.node_class == etree_provided + || tree->type.node_class == etree_assign) +@@ -5660,6 +5682,81 @@ lang_gc_sections (void) + bfd_gc_sections (output_bfd, &link_info); + } + ++/* Worker for lang_find_relro_sections_1. */ ++ ++static void ++find_relro_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED, ++ struct wildcard_list *sec ATTRIBUTE_UNUSED, ++ asection *section, ++ lang_input_statement_type *file ATTRIBUTE_UNUSED, ++ void *data) ++{ ++ /* Discarded, excluded and ignored sections effectively have zero ++ size. */ ++ if (section->output_section != NULL ++ && section->output_section->owner == output_bfd ++ && (section->output_section->flags & SEC_EXCLUDE) == 0 ++ && !IGNORE_SECTION (section) ++ && section->size != 0) ++ { ++ bfd_boolean *has_relro_section = (bfd_boolean *) data; ++ *has_relro_section = TRUE; ++ } ++} ++ ++/* Iterate over sections for relro sections. */ ++ ++static void ++lang_find_relro_sections_1 (lang_statement_union_type *s, ++ bfd_boolean *has_relro_section) ++{ ++ if (*has_relro_section) ++ return; ++ ++ for (; s != NULL; s = s->header.next) ++ { ++ if (s == expld.dataseg.relro_end_stat) ++ break; ++ ++ switch (s->header.type) ++ { ++ case lang_wild_statement_enum: ++ walk_wild (&s->wild_statement, ++ find_relro_section_callback, ++ has_relro_section); ++ break; ++ case lang_constructors_statement_enum: ++ lang_find_relro_sections_1 (constructor_list.head, ++ has_relro_section); ++ break; ++ case lang_output_section_statement_enum: ++ lang_find_relro_sections_1 (s->output_section_statement.children.head, ++ has_relro_section); ++ break; ++ case lang_group_statement_enum: ++ lang_find_relro_sections_1 (s->group_statement.children.head, ++ has_relro_section); ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++static void ++lang_find_relro_sections (void) ++{ ++ bfd_boolean has_relro_section = FALSE; ++ ++ /* Check all sections in the link script. */ ++ ++ lang_find_relro_sections_1 (expld.dataseg.relro_start_stat, ++ &has_relro_section); ++ ++ if (!has_relro_section) ++ link_info.relro = FALSE; ++} ++ + /* Relax all sections until bfd_relax_section gives up. */ + + static void +@@ -5787,6 +5884,10 @@ lang_process (void) + section positions, since they will affect SIZEOF_HEADERS. */ + lang_record_phdrs (); + ++ /* Check relro sections. */ ++ if (link_info.relro && ! link_info.relocatable) ++ lang_find_relro_sections (); ++ + /* Size up the sections. */ + lang_size_sections (NULL, !command_line.relax); + +Index: binutils-2.18/ld/testsuite/ld-elf/binutils.exp +=================================================================== +--- binutils-2.18.orig/ld/testsuite/ld-elf/binutils.exp ++++ binutils-2.18/ld/testsuite/ld-elf/binutils.exp +@@ -104,24 +104,42 @@ binutils_test strip "-shared" maxpage1 + binutils_test objcopy "" maxpage1 + binutils_test objcopy "-shared" maxpage1 + +-binutils_test strip "-z relro" maxpage1 +-binutils_test strip "-z relro -shared" maxpage1 +-binutils_test objcopy "-z relro" maxpage1 +-binutils_test objcopy "-z relro -shared" maxpage1 ++binutils_test strip "-z relro" relro1 ++binutils_test strip "-z relro -shared" relro1 ++binutils_test objcopy "-z relro" relro1 ++binutils_test objcopy "-z relro -shared" relro1 ++if { ([istarget "i?86-*-elf*"] ++ || ([istarget "i?86-*-linux*"] ++ && ![istarget "*-*-*aout*"] ++ && ![istarget "*-*-*oldld*"]) ++ || [istarget "x86_64-*-linux*"] ++ || [istarget "amd64-*-linux*"]) } { ++ binutils_test strip "-z relro -shared" relro2 ++ binutils_test objcopy "-z relro -shared" relro2 ++} + + binutils_test objcopy "" tbss1 ++binutils_test objcopy "-z relro" tbss1 + binutils_test objcopy "-shared" tbss1 ++binutils_test objcopy "-shared -z relro" tbss1 + binutils_test objcopy "-z max-page-size=0x100000" tbss1 + binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss1 + binutils_test objcopy "" tdata1 ++binutils_test objcopy "-z relro" tdata1 + binutils_test objcopy "-shared" tdata1 ++binutils_test objcopy "-shared -z relro" tdata1 + binutils_test objcopy "-z max-page-size=0x100000" tdata1 + binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata1 + binutils_test objcopy "" tbss2 ++binutils_test objcopy "-z relro" tbss2 + binutils_test objcopy "-shared" tbss2 ++binutils_test objcopy "-shared -z relro" tbss2 + binutils_test objcopy "-z max-page-size=0x100000" tbss2 + binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss2 +-binutils_test objcopy "-z max-page-size=0x100000" tdata2 ++ + binutils_test objcopy "" tdata2 ++binutils_test objcopy "-z relro" tdata2 + binutils_test objcopy "-shared" tdata2 ++binutils_test objcopy "-shared -z relro" tdata2 ++binutils_test objcopy "-z max-page-size=0x100000" tdata2 + binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata2 +Index: binutils-2.18/ld/testsuite/ld-elf/relro1.s +=================================================================== +--- /dev/null ++++ binutils-2.18/ld/testsuite/ld-elf/relro1.s +@@ -0,0 +1,14 @@ ++ .globl main ++ .globl start ++ .globl _start ++ .globl __start ++ .text ++main: ++start: ++_start: ++__start: ++ .long 0 ++ .data ++ .long 0 ++ .section .data.rel.ro,"aw",%progbits ++ .long 0 +Index: binutils-2.18/ld/testsuite/ld-elf/relro2.s +=================================================================== +--- /dev/null ++++ binutils-2.18/ld/testsuite/ld-elf/relro2.s +@@ -0,0 +1,5 @@ ++ .text ++ .globl x ++ .type x, @function ++x: ++ jmp foo@PLT diff --git a/patches/binutils-2.18/generic/gentoo/66_all_binutils-2.17.50.0.2-warn-textrel.patch b/patches/binutils-2.18/generic/gentoo/66_all_binutils-2.17.50.0.2-warn-textrel.patch new file mode 100644 index 0000000..85b517d --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/66_all_binutils-2.17.50.0.2-warn-textrel.patch @@ -0,0 +1,75 @@ +textrels are bad for forcing copy-on-write (this affects everyone), +and for security/runtime code generation, this affects security ppl. +But in either case, it doesn't matter who needs textrels, it's +the very fact that they're needed at all. + +2006-06-10 Ned Ludd <solar@gentoo.org>, Mike Frysinger <vapier@gentoo.org> + + * bfd/elflink.c (bfd_elf_final_link): Check all objects for TEXTRELs. + * ld/ldmain.c (main): Change textrel warning default to true. + * ld/testsuite/lib/ld-lib.exp (default_ld_simple_link): Scrub TEXTREL + warnings from ld output. + +--- + bfd/elflink.c | 8 +++----- + ld/ldmain.c | 1 + + ld/testsuite/lib/ld-lib.exp | 4 ++++ + 3 files changed, 8 insertions(+), 5 deletions(-) + +Index: binutils-2.18/bfd/elflink.c +=================================================================== +--- binutils-2.18.orig/bfd/elflink.c ++++ binutils-2.18/bfd/elflink.c +@@ -10914,14 +10914,12 @@ bfd_elf_final_link (bfd *abfd, struct bf + goto error_return; + + /* Check for DT_TEXTREL (late, in case the backend removes it). */ +- if (info->warn_shared_textrel && info->shared) ++ o = bfd_get_section_by_name (dynobj, ".dynamic"); ++ if (info->warn_shared_textrel && o != NULL) + { + bfd_byte *dyncon, *dynconend; + + /* Fix up .dynamic entries. */ +- o = bfd_get_section_by_name (dynobj, ".dynamic"); +- BFD_ASSERT (o != NULL); +- + dyncon = o->contents; + dynconend = o->contents + o->size; + for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn) +@@ -10933,7 +10931,7 @@ bfd_elf_final_link (bfd *abfd, struct bf + if (dyn.d_tag == DT_TEXTREL) + { + info->callbacks->einfo +- (_("%P: warning: creating a DT_TEXTREL in a shared object.\n")); ++ (_("%P: warning: creating a DT_TEXTREL in object.\n")); + break; + } + } +Index: binutils-2.18/ld/ldmain.c +=================================================================== +--- binutils-2.18.orig/ld/ldmain.c ++++ binutils-2.18/ld/ldmain.c +@@ -280,6 +280,7 @@ main (int argc, char **argv) + emulation = get_emulation (argc, argv); + ldemul_choose_mode (emulation); + default_target = ldemul_choose_target (argc, argv); ++ link_info.warn_shared_textrel = TRUE; + lang_init (); + ldemul_before_parse (); + lang_has_input_file = FALSE; +Index: binutils-2.18/ld/testsuite/lib/ld-lib.exp +=================================================================== +--- binutils-2.18.orig/ld/testsuite/lib/ld-lib.exp ++++ binutils-2.18/ld/testsuite/lib/ld-lib.exp +@@ -194,6 +194,10 @@ proc default_ld_simple_link { ld target + # symbol, since the default linker script might use ENTRY. + regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output + ++ # Gentoo tweak: ++ # We want to ignore TEXTREL warnings since we force enable them by default ++ regsub -all "^lt-ld-new: warning: creating a DT_TEXTREL in object\." $exec_output "\\1" exec_output ++ + if [string match "" $exec_output] then { + return 1 + } else { diff --git a/patches/binutils-2.18/generic/gentoo/76_all_only-use-new-ld-dtags.patch.disabled b/patches/binutils-2.18/generic/gentoo/76_all_only-use-new-ld-dtags.patch.disabled new file mode 100644 index 0000000..f7db0c5 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/76_all_only-use-new-ld-dtags.patch.disabled @@ -0,0 +1,31 @@ +Don't generate RPATH if we're going to be generating RUNPATH. + +need to ponder what ramifications this has before enabling it + +--- + bfd/elflink.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +Index: binutils-2.18/bfd/elflink.c +=================================================================== +--- binutils-2.18.orig/bfd/elflink.c ++++ binutils-2.18/bfd/elflink.c +@@ -5422,11 +5422,15 @@ bfd_elf_size_dynamic_sections (bfd *outp + + indx = _bfd_elf_strtab_add (elf_hash_table (info)->dynstr, rpath, + TRUE); +- if (indx == (bfd_size_type) -1 +- || !_bfd_elf_add_dynamic_entry (info, DT_RPATH, indx)) ++ if (indx == (bfd_size_type) -1) + return FALSE; + +- if (info->new_dtags) ++ if (!info->new_dtags) ++ { ++ if (!_bfd_elf_add_dynamic_entry (info, DT_RPATH, indx)) ++ return FALSE; ++ } ++ else + { + _bfd_elf_strtab_addref (elf_hash_table (info)->dynstr, indx); + if (!_bfd_elf_add_dynamic_entry (info, DT_RUNPATH, indx)) diff --git a/patches/binutils-2.18/generic/gentoo/91_all_libiberty-pic.patch b/patches/binutils-2.18/generic/gentoo/91_all_libiberty-pic.patch new file mode 100644 index 0000000..9a5ebeb --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/91_all_libiberty-pic.patch @@ -0,0 +1,16 @@ +--- + libiberty/Makefile.in | 1 + + 1 file changed, 1 insertion(+) + +Index: binutils-2.18/libiberty/Makefile.in +=================================================================== +--- binutils-2.18.orig/libiberty/Makefile.in ++++ binutils-2.18/libiberty/Makefile.in +@@ -225,6 +225,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA + $(AR) $(AR_FLAGS) $(TARGETLIB) \ + $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \ + $(RANLIB) $(TARGETLIB); \ ++ cp $(TARGETLIB) ../ ; \ + cd ..; \ + else true; fi + diff --git a/patches/binutils-2.18/generic/gentoo/no_63_all_binutils-2.18-pt-pax-flags-20070828.patch b/patches/binutils-2.18/generic/gentoo/no_63_all_binutils-2.18-pt-pax-flags-20070828.patch new file mode 100644 index 0000000..4c0c1a5 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/no_63_all_binutils-2.18-pt-pax-flags-20070828.patch @@ -0,0 +1,263 @@ +--- + bfd/elf-bfd.h | 3 +++ + bfd/elf.c | 27 ++++++++++++++++++++++++++- + bfd/elflink.c | 24 +++++++++++++++++++++--- + binutils/readelf.c | 1 + + include/bfdlink.h | 8 ++++++++ + include/elf/common.h | 16 ++++++++++++++++ + ld/emultempl/elf32.em | 12 ++++++++++++ + ld/ldgram.y | 2 ++ + 8 files changed, 89 insertions(+), 4 deletions(-) + +Index: binutils-2.18/bfd/elf-bfd.h +=================================================================== +--- binutils-2.18.orig/bfd/elf-bfd.h ++++ binutils-2.18/bfd/elf-bfd.h +@@ -1428,6 +1428,9 @@ struct elf_obj_tdata + /* Segment flags for the PT_GNU_STACK segment. */ + unsigned int stack_flags; + ++ /* Segment flags for the PT_PAX_FLAGS segment. */ ++ unsigned int pax_flags; ++ + /* Symbol version definitions in external objects. */ + Elf_Internal_Verdef *verdef; + +Index: binutils-2.18/bfd/elf.c +=================================================================== +--- binutils-2.18.orig/bfd/elf.c ++++ binutils-2.18/bfd/elf.c +@@ -1085,6 +1085,7 @@ get_segment_type (unsigned int p_type) + case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break; + case PT_GNU_STACK: pt = "STACK"; break; + case PT_GNU_RELRO: pt = "RELRO"; break; ++ case PT_PAX_FLAGS: pt = "PAX_FLAGS"; break; + default: pt = NULL; break; + } + return pt; +@@ -2361,6 +2362,9 @@ bfd_section_from_phdr (bfd *abfd, Elf_In + case PT_GNU_RELRO: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "relro"); + ++ case PT_PAX_FLAGS: ++ return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "pax_flags"); ++ + default: + /* Check for any processor-specific program segment types. */ + bed = get_elf_backend_data (abfd); +@@ -3341,6 +3345,11 @@ get_program_header_size (bfd *abfd, stru + ++segs; + } + ++ { ++ /* We need a PT_PAX_FLAGS segment. */ ++ ++segs; ++ } ++ + for (s = abfd->sections; s != NULL; s = s->next) + { + if ((s->flags & SEC_LOAD) != 0 +@@ -3868,6 +3877,20 @@ _bfd_elf_map_sections_to_segments (bfd * + pm = &m->next; + } + ++ { ++ amt = sizeof (struct elf_segment_map); ++ m = bfd_zalloc (abfd, amt); ++ if (m == NULL) ++ goto error_return; ++ m->next = NULL; ++ m->p_type = PT_PAX_FLAGS; ++ m->p_flags = elf_tdata (abfd)->pax_flags; ++ m->p_flags_valid = 1; ++ ++ *pm = m; ++ pm = &m->next; ++ } ++ + free (sections); + elf_tdata (abfd)->segment_map = mfirst; + } +@@ -5043,7 +5066,8 @@ rewrite_elf_program_header (bfd *ibfd, b + 6. PT_TLS segment includes only SHF_TLS sections. + 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments. + 8. PT_DYNAMIC should not contain empty sections at the beginning +- (with the possible exception of .dynamic). */ ++ (with the possible exception of .dynamic). ++ 9. PT_PAX_FLAGS segments does not include any sections. */ + #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \ + ((((segment->p_paddr \ + ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \ +@@ -5051,6 +5075,7 @@ rewrite_elf_program_header (bfd *ibfd, b + && (section->flags & SEC_ALLOC) != 0) \ + || IS_COREFILE_NOTE (segment, section)) \ + && segment->p_type != PT_GNU_STACK \ ++ && segment->p_type != PT_PAX_FLAGS \ + && (segment->p_type != PT_TLS \ + || (section->flags & SEC_THREAD_LOCAL)) \ + && (segment->p_type == PT_LOAD \ +Index: binutils-2.18/bfd/elflink.c +=================================================================== +--- binutils-2.18.orig/bfd/elflink.c ++++ binutils-2.18/bfd/elflink.c +@@ -5327,16 +5327,30 @@ bfd_elf_size_dynamic_sections (bfd *outp + return TRUE; + + bed = get_elf_backend_data (output_bfd); ++ elf_tdata (output_bfd)->pax_flags = PF_NORANDEXEC; ++ ++ if (info->execheap) ++ elf_tdata (output_bfd)->pax_flags |= PF_NOMPROTECT; ++ else if (info->noexecheap) ++ elf_tdata (output_bfd)->pax_flags |= PF_MPROTECT; ++ + if (info->execstack) +- elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; ++ { ++ elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; ++ elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP; ++ } + else if (info->noexecstack) +- elf_tdata (output_bfd)->stack_flags = PF_R | PF_W; ++ { ++ elf_tdata (output_bfd)->stack_flags = PF_R | PF_W; ++ elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP; ++ } + else + { + bfd *inputobj; + asection *notesec = NULL; + int exec = 0; + ++ elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP; + for (inputobj = info->input_bfds; + inputobj; + inputobj = inputobj->link_next) +@@ -5349,7 +5363,11 @@ bfd_elf_size_dynamic_sections (bfd *outp + if (s) + { + if (s->flags & SEC_CODE) +- exec = PF_X; ++ { ++ elf_tdata (output_bfd)->pax_flags &= ~PF_NOEMUTRAMP; ++ elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP; ++ exec = PF_X; ++ } + notesec = s; + } + else if (bed->default_execstack) +Index: binutils-2.18/binutils/readelf.c +=================================================================== +--- binutils-2.18.orig/binutils/readelf.c ++++ binutils-2.18/binutils/readelf.c +@@ -2469,6 +2469,7 @@ get_segment_type (unsigned long p_type) + return "GNU_EH_FRAME"; + case PT_GNU_STACK: return "GNU_STACK"; + case PT_GNU_RELRO: return "GNU_RELRO"; ++ case PT_PAX_FLAGS: return "PAX_FLAGS"; + + default: + if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC)) +Index: binutils-2.18/include/bfdlink.h +=================================================================== +--- binutils-2.18.orig/include/bfdlink.h ++++ binutils-2.18/include/bfdlink.h +@@ -321,6 +321,14 @@ struct bfd_link_info + /* TRUE if PT_GNU_RELRO segment should be created. */ + unsigned int relro: 1; + ++ /* TRUE if PT_PAX_FLAGS segment should be created with PF_NOMPROTECT ++ flags. */ ++ unsigned int execheap: 1; ++ ++ /* TRUE if PT_PAX_FLAGS segment should be created with PF_MPROTECT ++ flags. */ ++ unsigned int noexecheap: 1; ++ + /* TRUE if we should warn when adding a DT_TEXTREL to a shared object. */ + unsigned int warn_shared_textrel: 1; + +Index: binutils-2.18/include/elf/common.h +=================================================================== +--- binutils-2.18.orig/include/elf/common.h ++++ binutils-2.18/include/elf/common.h +@@ -309,6 +309,7 @@ + #define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME /* Solaris uses the same value */ + #define PT_GNU_STACK (PT_LOOS + 0x474e551) /* Stack flags */ + #define PT_GNU_RELRO (PT_LOOS + 0x474e552) /* Read-only after relocation */ ++#define PT_PAX_FLAGS (PT_LOOS + 0x5041580) /* PaX flags */ + + /* Program segment permissions, in program header p_flags field. */ + +@@ -319,6 +320,21 @@ + #define PF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ + #define PF_MASKPROC 0xF0000000 /* Processor-specific reserved bits */ + ++/* Flags to control PaX behavior. */ ++ ++#define PF_PAGEEXEC (1 << 4) /* Enable PAGEEXEC */ ++#define PF_NOPAGEEXEC (1 << 5) /* Disable PAGEEXEC */ ++#define PF_SEGMEXEC (1 << 6) /* Enable SEGMEXEC */ ++#define PF_NOSEGMEXEC (1 << 7) /* Disable SEGMEXEC */ ++#define PF_MPROTECT (1 << 8) /* Enable MPROTECT */ ++#define PF_NOMPROTECT (1 << 9) /* Disable MPROTECT */ ++#define PF_RANDEXEC (1 << 10) /* Enable RANDEXEC */ ++#define PF_NORANDEXEC (1 << 11) /* Disable RANDEXEC */ ++#define PF_EMUTRAMP (1 << 12) /* Enable EMUTRAMP */ ++#define PF_NOEMUTRAMP (1 << 13) /* Disable EMUTRAMP */ ++#define PF_RANDMMAP (1 << 14) /* Enable RANDMMAP */ ++#define PF_NORANDMMAP (1 << 15) /* Disable RANDMMAP */ ++ + /* Values for section header, sh_type field. */ + + #define SHT_NULL 0 /* Section header table entry unused */ +Index: binutils-2.18/ld/emultempl/elf32.em +=================================================================== +--- binutils-2.18.orig/ld/emultempl/elf32.em ++++ binutils-2.18/ld/emultempl/elf32.em +@@ -2136,6 +2136,16 @@ fragment <<EOF + link_info.noexecstack = TRUE; + link_info.execstack = FALSE; + } ++ else if (strcmp (optarg, "execheap") == 0) ++ { ++ link_info.execheap = TRUE; ++ link_info.noexecheap = FALSE; ++ } ++ else if (strcmp (optarg, "noexecheap") == 0) ++ { ++ link_info.noexecheap = TRUE; ++ link_info.execheap = FALSE; ++ } + EOF + + if test -n "$COMMONPAGESIZE"; then +@@ -2209,6 +2219,7 @@ fragment <<EOF + fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n")); + fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n")); + fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n")); ++ fprintf (file, _(" -z execheap\t\tMark executable as requiring executable heap\n")); + fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n")); + fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n")); + fprintf (file, _(" -z lazy\t\tMark object lazy runtime binding (default)\n")); +@@ -2221,6 +2232,7 @@ fragment <<EOF + fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n")); + fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n")); + fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n")); ++ fprintf (file, _(" -z noexecheap\tMark executable as not requiring executable heap\n")); + EOF + + if test -n "$COMMONPAGESIZE"; then +Index: binutils-2.18/ld/ldgram.y +=================================================================== +--- binutils-2.18.orig/ld/ldgram.y ++++ binutils-2.18/ld/ldgram.y +@@ -1099,6 +1099,8 @@ phdr_type: + $$ = exp_intop (0x6474e550); + else if (strcmp (s, "PT_GNU_STACK") == 0) + $$ = exp_intop (0x6474e551); ++ else if (strcmp (s, "PT_PAX_FLAGS") == 0) ++ $$ = exp_intop (0x65041580); + else + { + einfo (_("\ diff --git a/patches/binutils-2.18/generic/gentoo/no_76_all_use-new-ld-dtags.patch b/patches/binutils-2.18/generic/gentoo/no_76_all_use-new-ld-dtags.patch new file mode 100644 index 0000000..84e20f7 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/no_76_all_use-new-ld-dtags.patch @@ -0,0 +1,10 @@ +--- binutils/ld/ldmain.c ++++ binutils/ld/ldmain.c +@@ -296,6 +296,7 @@ main (int argc, char **argv) + + link_info.allow_undefined_version = TRUE; + link_info.keep_memory = TRUE; ++ link_info.new_dtags = TRUE; + link_info.combreloc = TRUE; + link_info.strip_discarded = TRUE; + link_info.callbacks = &link_callbacks; diff --git a/patches/binutils-2.18/generic/gentoo/no_77_all_generate-gnu-hash.patch b/patches/binutils-2.18/generic/gentoo/no_77_all_generate-gnu-hash.patch new file mode 100644 index 0000000..eb8da88 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/no_77_all_generate-gnu-hash.patch @@ -0,0 +1,6 @@ +--- binutils/ld/ldmain.c ++++ binutils/ld/ldmain.c +@@ -273,2 +273,3 @@ main (int argc, char **argv) + link_info.emit_hash = TRUE; ++ link_info.emit_gnu_hash = TRUE; + link_info.callbacks = &link_callbacks; diff --git a/patches/binutils-2.18/generic/gentoo/no_78_all_use-relro.patch b/patches/binutils-2.18/generic/gentoo/no_78_all_use-relro.patch new file mode 100644 index 0000000..abd5187 --- /dev/null +++ b/patches/binutils-2.18/generic/gentoo/no_78_all_use-relro.patch @@ -0,0 +1,6 @@ +--- binutils/ld/ldmain.c ++++ binutils/ld/ldmain.c +@@ -293,2 +293,3 @@ main (int argc, char **argv) + link_info.combreloc = TRUE; ++ link_info.relro = TRUE; + link_info.strip_discarded = TRUE; diff --git a/patches/binutils-2.18/generic/oe/binutils-2.16.91.0.6-objcopy-rename-errorcode.patch b/patches/binutils-2.18/generic/oe/binutils-2.16.91.0.6-objcopy-rename-errorcode.patch new file mode 100644 index 0000000..1485bf4 --- /dev/null +++ b/patches/binutils-2.18/generic/oe/binutils-2.16.91.0.6-objcopy-rename-errorcode.patch @@ -0,0 +1,39 @@ +# strip (and objcopy) fail to set the error code if there is no +# output file name and the rename of the stripped (or copied) file +# fails, yet the command fails to do anything. This fixes both +# objcopy and strip. +# +# modification by bero: Ported to 2.16.91.0.6 +# +#Signed-off-by: John Bowler <jbowler@acm.org> +#Signed-off-by: Bernhard Rosenkraenzer <bero@arklinux.org> +--- +# binutils/objcopy.c | 8 +++++--- +# 1 file changed, 5 insertions(+), 3 deletions(-) +# +Index: binutils-2.18/binutils/objcopy.c +=================================================================== +--- binutils-2.18.orig/binutils/objcopy.c ++++ binutils-2.18/binutils/objcopy.c +@@ -2787,8 +2787,9 @@ strip_main (int argc, char *argv[]) + if (preserve_dates) + set_times (tmpname, &statbuf); + if (output_file != tmpname) +- smart_rename (tmpname, output_file ? output_file : argv[i], +- preserve_dates); ++ if (smart_rename (tmpname, output_file ? output_file : argv[i], ++ preserve_dates)) ++ hold_status = 1; + status = hold_status; + } + else +@@ -3411,7 +3412,8 @@ copy_main (int argc, char *argv[]) + if (preserve_dates) + set_times (tmpname, &statbuf); + if (tmpname != output_filename) +- smart_rename (tmpname, input_filename, preserve_dates); ++ if (smart_rename (tmpname, input_filename, preserve_dates)) ++ status = 1; + } + else + unlink_if_ordinary (tmpname); diff --git a/patches/binutils-2.18/generic/series b/patches/binutils-2.18/generic/series index 9ab8102..9e69374 100644 --- a/patches/binutils-2.18/generic/series +++ b/patches/binutils-2.18/generic/series @@ -1,3 +1,22 @@ +gentoo/03_all_binutils-2.15.92.0.2-ppc64-pie.patch +gentoo/04_all_binutils-2.15.92.0.2-place-orphan.patch gentoo/07_all_binutils-2.18-windres.patch +gentoo/08_all_binutils-RPATH_ENVVAR-smack.patch +gentoo/09_all_binutils-ld-tests-CXXFLAGS.patch +gentoo/12_all_sh-targets.patch gentoo/18_all_binutils-makeinfo-version.patch +gentoo/25_all_binutils-for-build-flags.patch +gentoo/30_all_binutils-multitarget-fixup.patch +gentoo/33_all_binutils-gnu-relro-fixups.patch gentoo/42_all_012_check_ldrunpath_length.patch +gentoo/66_all_binutils-2.17.50.0.2-warn-textrel.patch +gentoo/76_all_only-use-new-ld-dtags.patch.disabled +gentoo/91_all_libiberty-pic.patch + +#gentoo/no_76_all_use-new-ld-dtags.patch +#gentoo/no_77_all_generate-gnu-hash.patch +#gentoo/no_78_all_use-relro.patch + +oe/binutils-2.16.91.0.6-objcopy-rename-errorcode.patch + +uclibc/110-arm-eabi-conf.patch diff --git a/patches/binutils-2.18/generic/uclibc/110-arm-eabi-conf.patch b/patches/binutils-2.18/generic/uclibc/110-arm-eabi-conf.patch new file mode 100644 index 0000000..d510b5d --- /dev/null +++ b/patches/binutils-2.18/generic/uclibc/110-arm-eabi-conf.patch @@ -0,0 +1,31 @@ +--- + configure | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: binutils-2.18/configure +=================================================================== +--- binutils-2.18.orig/configure ++++ binutils-2.18/configure +@@ -2235,7 +2235,7 @@ case "${target}" in + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + case ${with_newlib} in +Index: binutils-2.18/configure.ac +=================================================================== +--- binutils-2.18.orig/configure.ac ++++ binutils-2.18/configure.ac +@@ -513,7 +513,7 @@ case "${target}" in + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + case ${with_newlib} in diff --git a/patches/gcc-4.2.3/generic/arm-bigendian.patch b/patches/gcc-4.2.3/generic/arm-bigendian.patch new file mode 100644 index 0000000..5340cd4 --- /dev/null +++ b/patches/gcc-4.2.3/generic/arm-bigendian.patch @@ -0,0 +1,134 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +--- + gcc/config.gcc | 5 +++++ + gcc/config/arm/bpabi.h | 12 +++++++++++- + gcc/config/arm/linux-eabi.h | 13 ++++++++++++- + gcc/config/arm/linux-elf.h | 22 ++++++++++++++++++---- + 4 files changed, 46 insertions(+), 6 deletions(-) + +Index: gcc-4.2.3/gcc/config/arm/linux-elf.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/linux-elf.h ++++ gcc-4.2.3/gcc/config/arm/linux-elf.h +@@ -27,19 +27,33 @@ + #undef TARGET_VERSION + #define TARGET_VERSION fputs (" (ARM GNU/Linux with ELF)", stderr); + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +@@ -60,7 +74,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #undef LINK_SPEC +Index: gcc-4.2.3/gcc/config.gcc +=================================================================== +--- gcc-4.2.3.orig/gcc/config.gcc ++++ gcc-4.2.3/gcc/config.gcc +@@ -706,6 +706,11 @@ arm*-*-netbsd*) + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" ++ case $target in ++ arm*b-*) ++ tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ++ ;; ++ esac + tmake_file="${tmake_file} t-linux arm/t-arm" + case ${target} in + arm*-*-linux-*eabi) +Index: gcc-4.2.3/gcc/config/arm/linux-eabi.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/linux-eabi.h ++++ gcc-4.2.3/gcc/config/arm/linux-eabi.h +@@ -19,6 +19,17 @@ + along with GCC; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#undef TARGET_LINKER_EMULATION ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_LINKER_EMULATION "armelfb_linux_eabi" ++#else ++#define TARGET_LINKER_EMULATION "armelf_linux_eabi" ++#endif ++ + /* On EABI GNU/Linux, we want both the BPABI builtins and the + GNU/Linux builtins. */ + #undef TARGET_OS_CPP_BUILTINS +@@ -47,7 +58,7 @@ + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi + + #undef SUBTARGET_EXTRA_LINK_SPEC +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux_eabi" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION + + /* Use ld-linux.so.3 so that it will be possible to run "classic" + GNU/Linux binaries on an EABI system. */ +Index: gcc-4.2.3/gcc/config/arm/bpabi.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/bpabi.h ++++ gcc-4.2.3/gcc/config/arm/bpabi.h +@@ -32,9 +32,19 @@ + #undef FPUTYPE_DEFAULT + #define FPUTYPE_DEFAULT FPUTYPE_VFP + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#endif ++ + /* EABI targets should enable interworking by default. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT MASK_INTERWORK ++#define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT) + + /* The ARM BPABI functions return a boolean; they use no special + calling convention. */ diff --git a/patches/gcc-4.2.3/generic/arm-softfloat.diff b/patches/gcc-4.2.3/generic/arm-softfloat.diff new file mode 100644 index 0000000..c9e2f0a --- /dev/null +++ b/patches/gcc-4.2.3/generic/arm-softfloat.diff @@ -0,0 +1,61 @@ +# +# Submitted-By: Marc Kleine-Budde +# Committed-By: Robert Schwebel +# +# Error: +# +# no error +# +# Description: +# +# Link assembler softfloat functions into gcc. As the functions are +# there in that case anyway, don't add switches for float lib. +# +# State: +# +# upstream will not fix this because oabi is dead +# + +--- + gcc/config/arm/linux-elf.h | 4 ++-- + gcc/config/arm/t-linux | 5 ++++- + 2 files changed, 6 insertions(+), 3 deletions(-) + +Index: gcc-4.2.3/gcc/config/arm/linux-elf.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/linux-elf.h ++++ gcc-4.2.3/gcc/config/arm/linux-elf.h +@@ -53,7 +53,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "msoft-float" "mhard-float", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +@@ -62,7 +62,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" + +Index: gcc-4.2.3/gcc/config/arm/t-linux +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/t-linux ++++ gcc-4.2.3/gcc/config/arm/t-linux +@@ -4,7 +4,10 @@ TARGET_LIBGCC2_CFLAGS = -fomit-frame-poi + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi _floatdidf _floatdisf + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc-4.2.3/generic/gentoo/00_all_gcc-trampolinewarn.patch b/patches/gcc-4.2.3/generic/gentoo/00_all_gcc-trampolinewarn.patch new file mode 100644 index 0000000..85d61f9 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/00_all_gcc-trampolinewarn.patch @@ -0,0 +1,41 @@ + This trivial patch causes gcc to emit a warning whenever + it generates a trampoline. These are otherwise hard to + locate. It is rigged to default ON - to have it default + to OFF remove the text 'Init(1)' from the common.opt + patch, leaving just 'Common Var(warn_trampolines)'. + Kevin F. Quinn <kevquinn@gentoo.org> 17 Jan 2006 + +--- + gcc/builtins.c | 3 +++ + gcc/common.opt | 4 ++++ + 2 files changed, 7 insertions(+) + +Index: gcc-4.2.3/gcc/common.opt +=================================================================== +--- gcc-4.2.3.orig/gcc/common.opt ++++ gcc-4.2.3/gcc/common.opt +@@ -156,6 +156,10 @@ Wsystem-headers + Common Var(warn_system_headers) + Do not suppress warnings from system headers + ++Wtrampolines ++Common Var(warn_trampolines) Init(1) ++Warn whenever a trampoline is generated ++ + Wuninitialized + Common Var(warn_uninitialized) + Warn about uninitialized automatic variables +Index: gcc-4.2.3/gcc/builtins.c +=================================================================== +--- gcc-4.2.3.orig/gcc/builtins.c ++++ gcc-4.2.3/gcc/builtins.c +@@ -5253,6 +5253,9 @@ expand_builtin_init_trampoline (tree arg + trampolines_created = 1; + INITIALIZE_TRAMPOLINE (r_tramp, r_func, r_chain); + ++ if (warn_trampolines) ++ warning (OPT_Wtrampolines, "generating trampoline in object (requires executable stack)"); ++ + return const0_rtx; + } + diff --git a/patches/gcc-4.2.3/generic/gentoo/01_all_gcc4-ice-hack.patch b/patches/gcc-4.2.3/generic/gentoo/01_all_gcc4-ice-hack.patch new file mode 100644 index 0000000..8a09a71 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/01_all_gcc4-ice-hack.patch @@ -0,0 +1,304 @@ +2004-01-23 Jakub Jelinek <jakub@redhat.com> + + * gcc.c (execute): Don't free first string early, but at the end + of the function. Call retry_ice if compiler exited with + ICE_EXIT_CODE. + (retry_ice): New function. + * diagnostic.c (diagnostic_count_diagnostic, + diagnostic_action_after_output, error_recursion): Exit with + ICE_EXIT_CODE instead of FATAL_EXIT_CODE. + +--- + gcc/diagnostic.c | 2 + gcc/gcc.c | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 237 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/gcc/diagnostic.c +=================================================================== +--- gcc-4.2.3.orig/gcc/diagnostic.c ++++ gcc-4.2.3/gcc/diagnostic.c +@@ -269,7 +269,7 @@ diagnostic_action_after_output (diagnost + real_abort (); + + fnotice (stderr, "compilation terminated.\n"); +- exit (FATAL_EXIT_CODE); ++ exit (ICE_EXIT_CODE); + + default: + gcc_unreachable (); +Index: gcc-4.2.3/gcc/gcc.c +=================================================================== +--- gcc-4.2.3.orig/gcc/gcc.c ++++ gcc-4.2.3/gcc/gcc.c +@@ -348,6 +348,9 @@ static void init_gcc_specs (struct obsta + #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX) + static const char *convert_filename (const char *, int, int); + #endif ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS) || defined (WIN32)) ++static void retry_ice (const char *prog, const char **argv); ++#endif + + static const char *if_exists_spec_function (int, const char **); + static const char *if_exists_else_spec_function (int, const char **); +@@ -2948,7 +2951,7 @@ execute (void) + } + } + +- if (string != commands[i].prog) ++ if (i && string != commands[i].prog) + free ((void *) string); + } + +@@ -3005,6 +3008,17 @@ See %s for instructions.", + else if (WIFEXITED (status) + && WEXITSTATUS (status) >= MIN_FATAL_STATUS) + { ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS) || defined (WIN32)) ++ /* For ICEs in cc1, cc1obj, cc1plus see if it is ++ reproducible or not. */ ++ char *p; ++ if (getenv("GCC_RETRY_ICE") == NULL ++ && WEXITSTATUS (status) == ICE_EXIT_CODE ++ && i == 0 ++ && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR)) ++ && ! strncmp (p + 1, "cc1", 3)) ++ retry_ice (commands[0].prog, commands[0].argv); ++#endif + if (WEXITSTATUS (status) > greatest_status) + greatest_status = WEXITSTATUS (status); + ret_code = -1; +@@ -3025,6 +3039,9 @@ See %s for instructions.", + } + } + ++ if (commands[0].argv[0] != commands[0].prog) ++ free ((PTR) commands[0].argv[0]); ++ + return ret_code; + } + } +@@ -5969,6 +5986,224 @@ give_switch (int switchnum, int omit_fir + switches[switchnum].validated = 1; + } + ++#if !(defined (__MSDOS__) || defined (OS2) || defined (VMS) || defined (WIN32)) ++#define RETRY_ICE_ATTEMPTS 2 ++ ++static void ++retry_ice (const char *prog, const char **argv) ++{ ++ int nargs, out_arg = -1, quiet = 0, attempt; ++ int pid, retries, sleep_interval; ++ const char **new_argv; ++ char *temp_filenames[RETRY_ICE_ATTEMPTS * 2 + 2]; ++ ++ if (input_filename == NULL || ! strcmp (input_filename, "-")) ++ return; ++ ++ for (nargs = 0; argv[nargs] != NULL; ++nargs) ++ /* Only retry compiler ICEs, not preprocessor ones. */ ++ if (! strcmp (argv[nargs], "-E")) ++ return; ++ else if (argv[nargs][0] == '-' && argv[nargs][1] == 'o') ++ { ++ if (out_arg == -1) ++ out_arg = nargs; ++ else ++ return; ++ } ++ /* If the compiler is going to output any time information, ++ it might vary between invocations. */ ++ else if (! strcmp (argv[nargs], "-quiet")) ++ quiet = 1; ++ else if (! strcmp (argv[nargs], "-ftime-report")) ++ return; ++ ++ if (out_arg == -1 || !quiet) ++ return; ++ ++ memset (temp_filenames, '\0', sizeof (temp_filenames)); ++ new_argv = alloca ((nargs + 3) * sizeof (const char *)); ++ memcpy (new_argv, argv, (nargs + 1) * sizeof (const char *)); ++ new_argv[nargs++] = "-frandom-seed=0"; ++ new_argv[nargs] = NULL; ++ if (new_argv[out_arg][2] == '\0') ++ new_argv[out_arg + 1] = "-"; ++ else ++ new_argv[out_arg] = "-o-"; ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS + 1; ++attempt) ++ { ++ int fd = -1; ++ int status; ++ ++ temp_filenames[attempt * 2] = make_temp_file (".out"); ++ temp_filenames[attempt * 2 + 1] = make_temp_file (".err"); ++ ++ if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ int i; ++ int fd1, fd2; ++ struct stat st1, st2; ++ size_t n, len; ++ char *buf; ++ ++ buf = xmalloc (8192); ++ ++ for (i = 0; i < 2; ++i) ++ { ++ fd1 = open (temp_filenames[i], O_RDONLY); ++ fd2 = open (temp_filenames[2 + i], O_RDONLY); ++ ++ if (fd1 < 0 || fd2 < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0) ++ { ++ i = -1; ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ if (st1.st_size != st2.st_size) ++ { ++ close (fd1); ++ close (fd2); ++ break; ++ } ++ ++ len = 0; ++ for (n = st1.st_size; n; n -= len) ++ { ++ len = n; ++ if (len > 4096) ++ len = 4096; ++ ++ if (read (fd1, buf, len) != (int) len ++ || read (fd2, buf + 4096, len) != (int) len) ++ { ++ i = -1; ++ break; ++ } ++ ++ if (memcmp (buf, buf + 4096, len) != 0) ++ break; ++ } ++ ++ close (fd1); ++ close (fd2); ++ ++ if (n) ++ break; ++ } ++ ++ free (buf); ++ if (i == -1) ++ break; ++ ++ if (i != 2) ++ { ++ notice ("The bug is not reproducible, so it is likely a hardware or OS problem.\n"); ++ break; ++ } ++ ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ break; ++ write (fd, "//", 2); ++ for (i = 0; i < nargs; i++) ++ { ++ write (fd, " ", 1); ++ write (fd, new_argv[i], strlen (new_argv[i])); ++ } ++ write (fd, "\n", 1); ++ new_argv[nargs] = "-E"; ++ new_argv[nargs + 1] = NULL; ++ } ++ ++ /* Fork a subprocess; wait and retry if it fails. */ ++ sleep_interval = 1; ++ pid = -1; ++ for (retries = 0; retries < 4; retries++) ++ { ++ pid = fork (); ++ if (pid >= 0) ++ break; ++ sleep (sleep_interval); ++ sleep_interval *= 2; ++ } ++ ++ if (pid < 0) ++ break; ++ else if (pid == 0) ++ { ++ if (attempt != RETRY_ICE_ATTEMPTS) ++ fd = open (temp_filenames[attempt * 2], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 1) ++ { ++ close (1); ++ dup (fd); ++ close (fd); ++ } ++ ++ fd = open (temp_filenames[attempt * 2 + 1], O_RDWR); ++ if (fd < 0) ++ exit (-1); ++ if (fd != 2) ++ { ++ close (2); ++ dup (fd); ++ close (fd); ++ } ++ ++ if (prog == new_argv[0]) ++ execvp (prog, (char *const *) new_argv); ++ else ++ execv (new_argv[0], (char *const *) new_argv); ++ exit (-1); ++ } ++ ++ if (waitpid (pid, &status, 0) < 0) ++ break; ++ ++ if (attempt < RETRY_ICE_ATTEMPTS ++ && (! WIFEXITED (status) || WEXITSTATUS (status) != ICE_EXIT_CODE)) ++ { ++ notice ("The bug is not reproducible, so it is likely a hardware or OS problem.\n"); ++ break; ++ } ++ else if (attempt == RETRY_ICE_ATTEMPTS) ++ { ++ close (fd); ++ if (WIFEXITED (status) ++ && WEXITSTATUS (status) == SUCCESS_EXIT_CODE) ++ { ++ notice ("Preprocessed source stored into %s file, please attach this to your bugreport.\n", ++ temp_filenames[attempt * 2]); ++ /* Make sure it is not deleted. */ ++ free (temp_filenames[attempt * 2]); ++ temp_filenames[attempt * 2] = NULL; ++ break; ++ } ++ } ++ } ++ ++ for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS * 2 + 2; attempt++) ++ if (temp_filenames[attempt]) ++ { ++ unlink (temp_filenames[attempt]); ++ free (temp_filenames[attempt]); ++ } ++} ++#endif ++ + /* Search for a file named NAME trying various prefixes including the + user's -B prefix and some standard ones. + Return the absolute file name found. If nothing is found, return NAME. */ diff --git a/patches/gcc-4.2.3/generic/gentoo/06_all_gcc4-slow-pthread-self.patch b/patches/gcc-4.2.3/generic/gentoo/06_all_gcc4-slow-pthread-self.patch new file mode 100644 index 0000000..0fbfeab --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/06_all_gcc4-slow-pthread-self.patch @@ -0,0 +1,21 @@ +2005-05-20 Jakub Jelinek <jakub@redhat.com> + + * configure.host (slow_pthread_self): Set to empty unconditionally + on Linux targets. + +--- + libjava/configure.host | 1 + + 1 file changed, 1 insertion(+) + +Index: gcc-4.2.3/libjava/configure.host +=================================================================== +--- gcc-4.2.3.orig/libjava/configure.host ++++ gcc-4.2.3/libjava/configure.host +@@ -192,6 +192,7 @@ case "${host}" in + sh-linux* | sh[34]*-linux*) + can_unwind_signal=yes + libgcj_ld_symbolic='-Wl,-Bsymbolic' ++ slow_pthread_self= + if test x$slow_pthread_self = xyes \ + && test x$cross_compiling != xyes; then + cat > conftest.c <<EOF diff --git a/patches/gcc-4.2.3/generic/gentoo/20_all_cris-dont-force-limits-header.patch b/patches/gcc-4.2.3/generic/gentoo/20_all_cris-dont-force-limits-header.patch new file mode 100644 index 0000000..b22e3c6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/20_all_cris-dont-force-limits-header.patch @@ -0,0 +1,17 @@ +Remove assumption since it breaks building --without-headers + +--- + gcc/config/cris/t-linux | 4 ---- + 1 file changed, 4 deletions(-) + +Index: gcc-4.2.3/gcc/config/cris/t-linux +=================================================================== +--- gcc-4.2.3.orig/gcc/config/cris/t-linux ++++ gcc-4.2.3/gcc/config/cris/t-linux +@@ -1,6 +1,2 @@ + TARGET_LIBGCC2_CFLAGS += -fPIC + CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +- +-# We *know* we have a limits.h in the glibc library, with extra +-# definitions needed for e.g. libgfortran. +-LIMITS_H_TEST = : diff --git a/patches/gcc-4.2.3/generic/gentoo/35_all_gcc-arm-pragma-pack.patch b/patches/gcc-4.2.3/generic/gentoo/35_all_gcc-arm-pragma-pack.patch new file mode 100644 index 0000000..6cd5e4e --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/35_all_gcc-arm-pragma-pack.patch @@ -0,0 +1,76 @@ +http://gcc.gnu.org/ml/gcc-patches/2006-10/msg01115.html + +From: Paul Brook <paul@codesourcery.com> +Sender: gcc-patches-owner@gcc.gnu.org +To: gcc-patches@gcc.gnu.org +Subject: [patch] #pragma pack vs. STRUCTURE_SIZE_BOUNDARY +Date: Sun, 22 Oct 2006 16:32:31 +0100 + +Currently STRUCTURE_SIZE_BOUNDARY is obeyed even when +#pragma pack(1) is in effect. By contrast __attribute__((packed)) overrides +STRUCTURE_SIZE_BOUNDARY. + +This matters when odd sized packed structs are nested inside each other. + +Given the purpose of #pragma pack is for compatibility with Win32, I think +#pragma pack(1) act the same as __attribute__((packed)). + +The patch below fixes this. +Tested with cross to arm-none-eabi. +Ok? + +Paul + +2006-10-22 Paul Brook <paul@codesourcery.com> + + gcc/ + * stor-layout.c (start_record_layout): maximum_field_alignment + overrides STRUCTURE_SIZE_BOUNDARY. + + gcc/testsuite/ + * gcc.dg/pragma-pack-4.c: New test. + +--- + gcc/stor-layout.c | 10 +++++++++- + gcc/testsuite/gcc.dg/pragma-pack-4.c | 10 ++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/stor-layout.c +=================================================================== +--- gcc-4.2.3.orig/gcc/stor-layout.c ++++ gcc-4.2.3/gcc/stor-layout.c +@@ -530,7 +530,15 @@ start_record_layout (tree t) + #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; +Index: gcc-4.2.3/gcc/testsuite/gcc.dg/pragma-pack-4.c +=================================================================== +--- gcc-4.2.3.orig/gcc/testsuite/gcc.dg/pragma-pack-4.c ++++ gcc-4.2.3/gcc/testsuite/gcc.dg/pragma-pack-4.c +@@ -1,3 +1,13 @@ ++/* Check that pragma pack overrides STRUCTURE_SIZE_BOUNDARY. */ ++/* { dg-do compile } */ ++ ++#pragma pack(1) ++struct S ++{ ++ char a; ++}; ++ ++int test[sizeof(struct S) == 1 ? 1: -1]; + /* PR c/28286 */ + /* { dg-do compile } */ + diff --git a/patches/gcc-4.2.3/generic/gentoo/36_all_gcc-arm-pr30486.patch b/patches/gcc-4.2.3/generic/gentoo/36_all_gcc-arm-pr30486.patch new file mode 100644 index 0000000..39f6eb6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/36_all_gcc-arm-pr30486.patch @@ -0,0 +1,25 @@ +http://bugs.gentoo.org/194975 +http://gcc.gnu.org/PR30486 + +--- + gcc/fortran/trans-types.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +Index: gcc-4.2.3/gcc/fortran/trans-types.c +=================================================================== +--- gcc-4.2.3.orig/gcc/fortran/trans-types.c ++++ gcc-4.2.3/gcc/fortran/trans-types.c +@@ -1799,6 +1799,13 @@ gfc_type_for_size (unsigned bits, int un + if (type && bits == TYPE_PRECISION (type)) + return type; + } ++ ++ /* Handle TImode as a special case because it is used by some backends ++ (eg. ARM) even though it is not available for normal use. */ ++#if HOST_BITS_PER_WIDE_INT >= 64 ++ if (bits == TYPE_PRECISION (intTI_type_node)) ++ return intTI_type_node; ++#endif + } + else + { diff --git a/patches/gcc-4.2.3/generic/gentoo/51_all_gcc-3.4-libiberty-pic.patch b/patches/gcc-4.2.3/generic/gentoo/51_all_gcc-3.4-libiberty-pic.patch new file mode 100644 index 0000000..11d2cc0 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/51_all_gcc-3.4-libiberty-pic.patch @@ -0,0 +1,16 @@ +--- + libiberty/Makefile.in | 1 + + 1 file changed, 1 insertion(+) + +Index: gcc-4.2.3/libiberty/Makefile.in +=================================================================== +--- gcc-4.2.3.orig/libiberty/Makefile.in ++++ gcc-4.2.3/libiberty/Makefile.in +@@ -232,6 +232,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA + $(AR) $(AR_FLAGS) $(TARGETLIB) \ + $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \ + $(RANLIB) $(TARGETLIB); \ ++ cp $(TARGETLIB) ../ ; \ + cd ..; \ + else true; fi + diff --git a/patches/gcc-4.2.3/generic/gentoo/53_all_gcc4-superh-default-multilib.patch b/patches/gcc-4.2.3/generic/gentoo/53_all_gcc4-superh-default-multilib.patch new file mode 100644 index 0000000..102350b --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/53_all_gcc4-superh-default-multilib.patch @@ -0,0 +1,29 @@ +The gcc-3.x toolchains would contain all the targets by default. With gcc-4, +you have to actually list out the multilibs you want or you will end up with +just one when using targets like 'sh4-linux-gnu'. + +The resulting toolchain can't even build a kernel as the kernel needs to build +with the nofpu flag to be sure that no fpu ops are generated. + +Here we restore the gcc-3.x behavior; the additional overhead of building all +of these multilibs by default is negligible. + +http://bugs.gentoo.org/140205 + +--- + gcc/config.gcc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/config.gcc +=================================================================== +--- gcc-4.2.3.orig/gcc/config.gcc ++++ gcc-4.2.3/gcc/config.gcc +@@ -2103,7 +2103,7 @@ sh-*-symbianelf* | sh[12346l]*-*-symbian + if test x${sh_multilibs} = x ; then + case ${target} in + sh64-superh-linux* | \ +- sh[1234]*) sh_multilibs=${sh_cpu_target} ;; ++ sh[1234]*) sh_multilibs=`cd ${srcdir}/config/sh ; echo t-mlib-sh[1-4]* | sed 's:t-mlib-sh:,m:g;s: ::g'` ;; + sh64* | sh5*) sh_multilibs=m5-32media,m5-32media-nofpu,m5-compact,m5-compact-nofpu,m5-64media,m5-64media-nofpu ;; + sh-superh-*) sh_multilibs=m4,m4-single,m4-single-only,m4-nofpu ;; + sh*-*-linux*) sh_multilibs=m1,m3e,m4 ;; diff --git a/patches/gcc-4.2.3/generic/gentoo/56_all_gcc-4-pr32177.patch b/patches/gcc-4.2.3/generic/gentoo/56_all_gcc-4-pr32177.patch new file mode 100644 index 0000000..fa2c7ff --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/56_all_gcc-4-pr32177.patch @@ -0,0 +1,58 @@ +http://gcc.gnu.org/PR32177 + +2007-06-08 Jakub Jelinek <jakub@redhat.com> + + PR c++/32177 + * semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr + on init, the non-decl cond operand and increment value. + +--- + gcc/cp/semantics.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/cp/semantics.c +=================================================================== +--- gcc-4.2.3.orig/gcc/cp/semantics.c ++++ gcc-4.2.3/gcc/cp/semantics.c +@@ -3780,6 +3780,8 @@ tree + finish_omp_for (location_t locus, tree decl, tree init, tree cond, + tree incr, tree body, tree pre_body) + { ++ tree omp_for; ++ + if (decl == NULL) + { + if (init != NULL) +@@ -3857,8 +3859,31 @@ finish_omp_for (location_t locus, tree d + add_stmt (pre_body); + pre_body = NULL; + } ++ ++ init = fold_build_cleanup_point_expr (TREE_TYPE (init), init); + init = build_modify_expr (decl, NOP_EXPR, init); +- return c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body); ++ if (cond && TREE_SIDE_EFFECTS (cond) && COMPARISON_CLASS_P (cond)) ++ { ++ int n = TREE_SIDE_EFFECTS (TREE_OPERAND (cond, 1)) != 0; ++ tree t = TREE_OPERAND (cond, n); ++ ++ TREE_OPERAND (cond, n) ++ = fold_build_cleanup_point_expr (TREE_TYPE (t), t); ++ } ++ omp_for = c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body); ++ if (omp_for != NULL ++ && TREE_CODE (OMP_FOR_INCR (omp_for)) == MODIFY_EXPR ++ && TREE_SIDE_EFFECTS (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1)) ++ && BINARY_CLASS_P (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1))) ++ { ++ tree t = TREE_OPERAND (OMP_FOR_INCR (omp_for), 1); ++ int n = TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)) != 0; ++ ++ TREE_OPERAND (t, n) ++ = fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)), ++ TREE_OPERAND (t, n)); ++ } ++ return omp_for; + } + + void diff --git a/patches/gcc-4.2.3/generic/gentoo/59_all_gcc-4-pr32893.patch b/patches/gcc-4.2.3/generic/gentoo/59_all_gcc-4-pr32893.patch new file mode 100644 index 0000000..e805f54 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/59_all_gcc-4-pr32893.patch @@ -0,0 +1,32 @@ +http://gcc.gnu.org/PR32893 + +2007-10-29 Dorit Nuzman <dorit@il.ibm.com> + + PR tree-optimization/32893 + * tree-vectorize.c (vect_can_force_dr_alignment_p): Check + STACK_BOUNDARY instead of PREFERRED_STACK_BOUNDARY. + +--- + gcc/tree-vectorizer.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +Index: gcc-4.2.3/gcc/tree-vectorizer.c +=================================================================== +--- gcc-4.2.3.orig/gcc/tree-vectorizer.c ++++ gcc-4.2.3/gcc/tree-vectorizer.c +@@ -1530,12 +1530,9 @@ vect_can_force_dr_alignment_p (tree decl + if (TREE_STATIC (decl)) + return (alignment <= MAX_OFILE_ALIGNMENT); + else +- /* This is not 100% correct. The absolute correct stack alignment +- is STACK_BOUNDARY. We're supposed to hope, but not assume, that +- PREFERRED_STACK_BOUNDARY is honored by all translation units. +- However, until someone implements forced stack alignment, SSE +- isn't really usable without this. */ +- return (alignment <= PREFERRED_STACK_BOUNDARY); ++ /* This used to be PREFERRED_STACK_BOUNDARY, however, that is not 100% ++ correct until someone implements forced stack alignment. */ ++ return (alignment <= STACK_BOUNDARY); + } + + diff --git a/patches/gcc-4.2.3/generic/gentoo/62_all_gcc4-noteGNUstack.patch b/patches/gcc-4.2.3/generic/gentoo/62_all_gcc4-noteGNUstack.patch new file mode 100644 index 0000000..62df34a --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/62_all_gcc4-noteGNUstack.patch @@ -0,0 +1,230 @@ +2005-02-08 Jakub Jelinek <jakub@redhat.com> + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/arm/sysv.S: Likewise. + + * ia64_save_regs_in_stack.s: Moved to... + * ia64_save_regs_in_stack.S: ... this. Add .note.GNU-stack + on Linux. + +--- + boehm-gc/ia64_save_regs_in_stack.S | 15 +++++++++++++++ + boehm-gc/ia64_save_regs_in_stack.s | 12 ------------ + libffi/src/alpha/osf.S | 4 ++++ + libffi/src/arm/sysv.S | 3 +++ + libffi/src/ia64/unix.S | 4 ++++ + libffi/src/m68k/sysv.S | 4 ++++ + libffi/src/powerpc/linux64.S | 4 ++++ + libffi/src/powerpc/linux64_closure.S | 4 ++++ + libffi/src/powerpc/ppc_closure.S | 4 ++++ + libffi/src/powerpc/sysv.S | 4 ++++ + libffi/src/s390/sysv.S | 3 +++ + libffi/src/sparc/v8.S | 4 ++++ + libffi/src/sparc/v9.S | 4 ++++ + libffi/src/x86/sysv.S | 4 ++++ + libffi/src/x86/unix64.S | 4 ++++ + 15 files changed, 65 insertions(+), 12 deletions(-) + +Index: gcc-4.2.3/boehm-gc/ia64_save_regs_in_stack.S +=================================================================== +--- /dev/null ++++ gcc-4.2.3/boehm-gc/ia64_save_regs_in_stack.S +@@ -0,0 +1,15 @@ ++ .text ++ .align 16 ++ .global GC_save_regs_in_stack ++ .proc GC_save_regs_in_stack ++GC_save_regs_in_stack: ++ .bodyfoo.mpg ++ flushrs ++ ;; ++ mov r8=ar.bsp ++ br.ret.sptk.few rp ++ .endp GC_save_regs_in_stack ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/boehm-gc/ia64_save_regs_in_stack.s +=================================================================== +--- gcc-4.2.3.orig/boehm-gc/ia64_save_regs_in_stack.s ++++ /dev/null +@@ -1,12 +0,0 @@ +- .text +- .align 16 +- .global GC_save_regs_in_stack +- .proc GC_save_regs_in_stack +-GC_save_regs_in_stack: +- .body +- flushrs +- ;; +- mov r8=ar.bsp +- br.ret.sptk.few rp +- .endp GC_save_regs_in_stack +- +Index: gcc-4.2.3/libffi/src/alpha/osf.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/alpha/osf.S ++++ gcc-4.2.3/libffi/src/alpha/osf.S +@@ -358,4 +358,8 @@ $LASFDE3: + .byte 16 # uleb128 offset 16*-8 + .align 3 + $LEFDE3: ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif + #endif +Index: gcc-4.2.3/libffi/src/arm/sysv.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/arm/sysv.S ++++ gcc-4.2.3/libffi/src/arm/sysv.S +@@ -207,3 +207,6 @@ LSYM(Lepilogue): + .ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",%progbits ++#endif +Index: gcc-4.2.3/libffi/src/ia64/unix.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/ia64/unix.S ++++ gcc-4.2.3/libffi/src/ia64/unix.S +@@ -553,3 +553,7 @@ ffi_closure_unix: + data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/m68k/sysv.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/m68k/sysv.S ++++ gcc-4.2.3/libffi/src/m68k/sysv.S +@@ -95,3 +95,7 @@ epilogue: + unlk %a6 + rts + .size ffi_call_SYSV,.-ffi_call_SYSV ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/powerpc/linux64.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/powerpc/linux64.S ++++ gcc-4.2.3/libffi/src/powerpc/linux64.S +@@ -175,3 +175,7 @@ ffi_call_LINUX64: + .align 3 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/powerpc/linux64_closure.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/powerpc/linux64_closure.S ++++ gcc-4.2.3/libffi/src/powerpc/linux64_closure.S +@@ -204,3 +204,7 @@ ffi_closure_LINUX64: + .align 3 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/powerpc/ppc_closure.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/powerpc/ppc_closure.S ++++ gcc-4.2.3/libffi/src/powerpc/ppc_closure.S +@@ -281,3 +281,7 @@ END(ffi_closure_SYSV) + .LEFDE1: + + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/powerpc/sysv.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/powerpc/sysv.S ++++ gcc-4.2.3/libffi/src/powerpc/sysv.S +@@ -217,3 +217,7 @@ END(ffi_call_SYSV) + .align 2 + .LEFDE1: + #endif ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/s390/sysv.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/s390/sysv.S ++++ gcc-4.2.3/libffi/src/s390/sysv.S +@@ -427,3 +427,6 @@ ffi_closure_SYSV: + + #endif + ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/sparc/v8.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/sparc/v8.S ++++ gcc-4.2.3/libffi/src/sparc/v8.S +@@ -265,3 +265,7 @@ done2: + .byte 0x1f ! uleb128 0x1f + .align WS + .LLEFDE2: ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/sparc/v9.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/sparc/v9.S ++++ gcc-4.2.3/libffi/src/sparc/v9.S +@@ -300,3 +300,7 @@ longdouble1: + .align 8 + .LLEFDE2: + #endif ++ ++#ifdef __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/x86/sysv.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/x86/sysv.S ++++ gcc-4.2.3/libffi/src/x86/sysv.S +@@ -376,3 +376,7 @@ ffi_closure_raw_SYSV: + #endif + + #endif /* ifndef __x86_64__ */ ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif +Index: gcc-4.2.3/libffi/src/x86/unix64.S +=================================================================== +--- gcc-4.2.3.orig/libffi/src/x86/unix64.S ++++ gcc-4.2.3/libffi/src/x86/unix64.S +@@ -410,3 +410,7 @@ ffi_closure_unix64: + .LEFDE3: + + #endif /* __x86_64__ */ ++ ++#if defined __ELF__ && defined __linux__ ++ .section .note.GNU-stack,"",@progbits ++#endif diff --git a/patches/gcc-4.2.3/generic/gentoo/74_all_sh-pr24836.patch b/patches/gcc-4.2.3/generic/gentoo/74_all_sh-pr24836.patch new file mode 100644 index 0000000..d752f99 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/74_all_sh-pr24836.patch @@ -0,0 +1,34 @@ +http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348 +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836 + +--- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/gcc/configure.ac +=================================================================== +--- gcc-4.2.3.orig/gcc/configure.ac ++++ gcc-4.2.3/gcc/configure.ac +@@ -2535,7 +2535,7 @@ foo: .long 25 + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 +Index: gcc-4.2.3/gcc/configure +=================================================================== +--- gcc-4.2.3.orig/gcc/configure ++++ gcc-4.2.3/gcc/configure +@@ -14562,7 +14562,7 @@ foo: .long 25 + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 diff --git a/patches/gcc-4.2.3/generic/gentoo/85_all_gcc-ca-translation-typo.patch b/patches/gcc-4.2.3/generic/gentoo/85_all_gcc-ca-translation-typo.patch new file mode 100644 index 0000000..c713ad6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/85_all_gcc-ca-translation-typo.patch @@ -0,0 +1,23 @@ +http://bugs.gentoo.org/127190 + +2006-03-28 Harald van Dijk <truedfx@gentoo.org> + + * ca.po: Fix printf flag typo in negative value translation. + +--- + gcc/po/ca.po | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/po/ca.po +=================================================================== +--- gcc-4.2.3.orig/gcc/po/ca.po ++++ gcc-4.2.3/gcc/po/ca.po +@@ -34197,7 +34197,7 @@ msgstr "s'ignora l'atribut \"%s\"" + #~ msgstr "passant el valor negatiu `%E' per a %s %P de \"%D\"" + + #~ msgid "%s of negative value `%E' to `%T'" +-#~ msgstr "%s de valor negatiu `%I' a \"%T\"" ++#~ msgstr "%s de valor negatiu `%E' a \"%T\"" + + #~ msgid "initializing array with parameter list" + #~ msgstr "inicialitzant una matriu amb una llista de paràmetres" diff --git a/patches/gcc-4.2.3/generic/gentoo/90_all_mips-add-march-r10k.patch b/patches/gcc-4.2.3/generic/gentoo/90_all_mips-add-march-r10k.patch new file mode 100644 index 0000000..90ae394 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/90_all_mips-add-march-r10k.patch @@ -0,0 +1,405 @@ +--- + gcc/config/mips/10000.md | 248 +++++++++++++++++++++++++++++++++++++++++++++++ + gcc/config/mips/mips.c | 62 +++++++++++ + gcc/config/mips/mips.h | 12 ++ + gcc/config/mips/mips.md | 3 + 4 files changed, 324 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/config/mips/10000.md +=================================================================== +--- /dev/null ++++ gcc-4.2.3/gcc/config/mips/10000.md +@@ -0,0 +1,248 @@ ++;; VR1x000 pipeline description. ++;; Copyright (C) 2005, 2006 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, 51 Franklin Street, Fifth Floor, Boston, ++;; MA 02110-1301, USA. ++ ++ ++;; This file overrides parts of generic.md. It is derived from the ++;; old define_function_unit description. ++ ++ ++ ++;; R12K/R14K/R16K are derivatives of R10K, thus copy its description ++;; until specific tuning for each is added ++ ++ ++;; R10000 has int queue, fp queue, address queue ++(define_automaton "r10k_int, r10k_fp, r10k_addr") ++ ++;; R10000 has 2 integer ALUs, fp-adder and fp-multiplier, load/store ++(define_cpu_unit "r10k_alu1" "r10k_int") ++(define_cpu_unit "r10k_alu2" "r10k_int") ++(define_cpu_unit "r10k_fpadd" "r10k_fp") ++(define_cpu_unit "r10k_fpmpy" "r10k_fp") ++(define_cpu_unit "r10k_loadstore" "r10k_addr") ++ ++;; R10000 has separate fp-div and fp-sqrt units as well and these can ++;; execute in parallel, however their issue & completion logic is shared ++;; by the fp-multiplier ++(define_cpu_unit "r10k_fpdiv" "r10k_fp") ++(define_cpu_unit "r10k_fpsqrt" "r10k_fp") ++ ++ ++ ++ ++;; loader ++(define_insn_reservation "r10k_load" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "load,prefetch,prefetchx")) ++ "r10k_loadstore") ++ ++(define_insn_reservation "r10k_store" 0 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "store,fpstore,fpidxstore")) ++ "r10k_loadstore") ++ ++(define_insn_reservation "r10k_fpload" 3 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "fpload,fpidxload")) ++ "r10k_loadstore") ++ ++ ++ ++ ++;; Integer add/sub + logic ops, and mf/mt hi/lo can be done by alu1 or alu2 ++;; Miscellaneous arith goes here too (this is a guess) ++(define_insn_reservation "r10k_arith" 1 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "arith,mfhilo,mthilo,slt,clz,const,nop,trap")) ++ "r10k_alu1 | r10k_alu2") ++ ++ ++ ++ ++;; ALU1 handles shifts, branch eval, and condmove ++;; ++;; Brancher is separate, but part of ALU1, but can only ++;; do one branch per cycle (needs implementing??) ++;; ++;; jump, call - unsure if brancher handles these too (added for now) ++(define_insn_reservation "r10k_shift" 1 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "shift,branch,jump,call")) ++ "r10k_alu1") ++ ++(define_insn_reservation "r10k_int_cmove" 1 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "condmove") ++ (eq_attr "mode" "SI,DI"))) ++ "r10k_alu1") ++ ++ ++ ++ ++;; Coprocessor Moves ++;; mtc1/dmtc1 are handled by ALU1 ++;; mfc1/dmfc1 are handled by the fp-multiplier ++(define_insn_reservation "r10k_mt_xfer" 3 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "xfer") ++ (not (match_operand 0 "fpr_operand")))) ++ "r10k_alu1") ++ ++(define_insn_reservation "r10k_mf_xfer" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "xfer") ++ (match_operand 0 "fpr_operand"))) ++ "r10k_fpmpy") ++ ++ ++ ++ ++;; Only ALU2 does int multiplications and divisions ++;; R10K allows an int insn using register Lo to be issued ++;; one cycle earlier than an insn using register Hi for ++;; the insns below, however, we skip on doing this ++;; for now until correct usage of lo_operand() is figured ++;; out. ++;; ++;; Divides keep ALU2 busy, but this isn't expressed here (I think...?) ++(define_insn_reservation "r10k_imul_single" 6 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "imul,imul3,imadd") ++ (eq_attr "mode" "SI"))) ++ "r10k_alu2 * 6") ++ ++(define_insn_reservation "r10k_imul_double" 10 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "imul,imul3,imadd") ++ (eq_attr "mode" "DI"))) ++ "r10k_alu2 * 10") ++ ++(define_insn_reservation "r10k_idiv_single" 35 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "idiv") ++ (eq_attr "mode" "SI"))) ++ "r10k_alu2 * 35") ++ ++(define_insn_reservation "r10k_idiv_double" 67 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "idiv") ++ (eq_attr "mode" "DI"))) ++ "r10k_alu2 * 67") ++ ++ ++ ++ ++;; FP add/sub, mul, abs value, neg, comp, & moves ++(define_insn_reservation "r10k_fp_miscadd" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "fadd,fabs,fneg,fcmp")) ++ "r10k_fpadd") ++ ++(define_insn_reservation "r10k_fp_miscmul" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "fmul,fmove")) ++ "r10k_fpmpy") ++ ++(define_insn_reservation "r10k_fp_cmove" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "condmove") ++ (eq_attr "mode" "SF,DF"))) ++ "r10k_fpmpy") ++ ++ ++ ++ ++;; fcvt.s.[wl] has latency 4, repeat 2 ++;; All other fcvt have latency 2, repeat 1 ++(define_insn_reservation "r10k_fcvt_single" 4 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fcvt") ++ (eq_attr "cnv_mode" "I2S"))) ++ "r10k_fpadd * 2") ++ ++(define_insn_reservation "r10k_fcvt_other" 2 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fcvt") ++ (eq_attr "cnv_mode" "!I2S"))) ++ "r10k_fpadd") ++ ++ ++ ++ ++;; fmadd - Runs through fp-adder first, then fp-multiplier ++;; ++;; The latency for fmadd is 2 cycles if the result is used ++;; by another fmadd instruction ++(define_insn_reservation "r10k_fmadd" 4 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "fmadd")) ++ "r10k_fpadd, r10k_fpmpy") ++ ++(define_bypass 2 "r10k_fmadd" "r10k_fmadd") ++ ++ ++ ++ ++;; fp Divisions & square roots ++(define_insn_reservation "r10k_fdiv_single" 12 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fdiv,frdiv") ++ (eq_attr "mode" "SF"))) ++ "r10k_fpdiv * 14") ++ ++(define_insn_reservation "r10k_fdiv_double" 19 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fdiv,frdiv") ++ (eq_attr "mode" "DF"))) ++ "r10k_fpdiv * 21") ++ ++(define_insn_reservation "r10k_fsqrt_single" 18 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fsqrt") ++ (eq_attr "mode" "SF"))) ++ "r10k_fpsqrt * 20") ++ ++(define_insn_reservation "r10k_fsqrt_double" 33 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "fsqrt") ++ (eq_attr "mode" "DF"))) ++ "r10k_fpsqrt * 35") ++ ++(define_insn_reservation "r10k_frsqrt_single" 30 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "frsqrt") ++ (eq_attr "mode" "SF"))) ++ "r10k_fpsqrt * 20") ++ ++(define_insn_reservation "r10k_frsqrt_double" 52 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (and (eq_attr "type" "frsqrt") ++ (eq_attr "mode" "DF"))) ++ "r10k_fpsqrt * 35") ++ ++ ++ ++ ++;; Unknown/multi (this is a guess) ++(define_insn_reservation "r10k_unknown" 1 ++ (and (eq_attr "cpu" "r10000,r12000,r14000,r16000") ++ (eq_attr "type" "unknown,multi")) ++ "r10k_alu1 + r10k_alu2") ++ +Index: gcc-4.2.3/gcc/config/mips/mips.c +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/mips.c ++++ gcc-4.2.3/gcc/config/mips/mips.c +@@ -734,6 +734,10 @@ const struct mips_cpu_info mips_cpu_info + + /* MIPS IV */ + { "r8000", PROCESSOR_R8000, 4 }, ++ { "r10000", PROCESSOR_R10000, 4 }, ++ { "r12000", PROCESSOR_R12000, 4 }, ++ { "r14000", PROCESSOR_R14000, 4 }, ++ { "r16000", PROCESSOR_R16000, 4 }, + { "vr5000", PROCESSOR_R5000, 4 }, + { "vr5400", PROCESSOR_R5400, 4 }, + { "vr5500", PROCESSOR_R5500, 4 }, +@@ -1014,6 +1018,58 @@ static struct mips_rtx_cost_data const m + 1, /* branch_cost */ + 4 /* memory_latency */ + }, ++ { /* R10000 */ ++ COSTS_N_INSNS (2), /* fp_add */ ++ COSTS_N_INSNS (2), /* fp_mult_sf */ ++ COSTS_N_INSNS (2), /* fp_mult_df */ ++ COSTS_N_INSNS (12), /* fp_div_sf */ ++ COSTS_N_INSNS (19), /* fp_div_df */ ++ COSTS_N_INSNS (6), /* int_mult_si */ ++ COSTS_N_INSNS (10), /* int_mult_di */ ++ COSTS_N_INSNS (35), /* int_div_si */ ++ COSTS_N_INSNS (67), /* int_div_di */ ++ 1, /* branch_cost */ ++ 4 /* memory_latency */ ++ }, ++ { /* R12000 */ ++ COSTS_N_INSNS (2), /* fp_add */ ++ COSTS_N_INSNS (2), /* fp_mult_sf */ ++ COSTS_N_INSNS (2), /* fp_mult_df */ ++ COSTS_N_INSNS (12), /* fp_div_sf */ ++ COSTS_N_INSNS (19), /* fp_div_df */ ++ COSTS_N_INSNS (6), /* int_mult_si */ ++ COSTS_N_INSNS (10), /* int_mult_di */ ++ COSTS_N_INSNS (35), /* int_div_si */ ++ COSTS_N_INSNS (67), /* int_div_di */ ++ 1, /* branch_cost */ ++ 4 /* memory_latency */ ++ }, ++ { /* R14000 */ ++ COSTS_N_INSNS (2), /* fp_add */ ++ COSTS_N_INSNS (2), /* fp_mult_sf */ ++ COSTS_N_INSNS (2), /* fp_mult_df */ ++ COSTS_N_INSNS (12), /* fp_div_sf */ ++ COSTS_N_INSNS (19), /* fp_div_df */ ++ COSTS_N_INSNS (6), /* int_mult_si */ ++ COSTS_N_INSNS (10), /* int_mult_di */ ++ COSTS_N_INSNS (35), /* int_div_si */ ++ COSTS_N_INSNS (67), /* int_div_di */ ++ 1, /* branch_cost */ ++ 4 /* memory_latency */ ++ }, ++ { /* R16000 */ ++ COSTS_N_INSNS (2), /* fp_add */ ++ COSTS_N_INSNS (2), /* fp_mult_sf */ ++ COSTS_N_INSNS (2), /* fp_mult_df */ ++ COSTS_N_INSNS (12), /* fp_div_sf */ ++ COSTS_N_INSNS (19), /* fp_div_df */ ++ COSTS_N_INSNS (6), /* int_mult_si */ ++ COSTS_N_INSNS (10), /* int_mult_di */ ++ COSTS_N_INSNS (35), /* int_div_si */ ++ COSTS_N_INSNS (67), /* int_div_di */ ++ 1, /* branch_cost */ ++ 4 /* memory_latency */ ++ }, + { /* SB1 */ + /* These costs are the same as the SB-1A below. */ + COSTS_N_INSNS (4), /* fp_add */ +@@ -10136,6 +10192,12 @@ mips_issue_rate (void) + { + switch (mips_tune) + { ++ case PROCESSOR_R10000: ++ case PROCESSOR_R12000: ++ case PROCESSOR_R14000: ++ case PROCESSOR_R16000: ++ return 4; ++ + case PROCESSOR_R4130: + case PROCESSOR_R5400: + case PROCESSOR_R5500: +Index: gcc-4.2.3/gcc/config/mips/mips.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/mips.h ++++ gcc-4.2.3/gcc/config/mips/mips.h +@@ -56,6 +56,10 @@ enum processor_type { + PROCESSOR_R7000, + PROCESSOR_R8000, + PROCESSOR_R9000, ++ PROCESSOR_R10000, ++ PROCESSOR_R12000, ++ PROCESSOR_R14000, ++ PROCESSOR_R16000, + PROCESSOR_SB1, + PROCESSOR_SB1A, + PROCESSOR_SR71000, +@@ -208,6 +212,10 @@ extern const struct mips_rtx_cost_data * + #define TARGET_MIPS5500 (mips_arch == PROCESSOR_R5500) + #define TARGET_MIPS7000 (mips_arch == PROCESSOR_R7000) + #define TARGET_MIPS9000 (mips_arch == PROCESSOR_R9000) ++#define TARGET_MIPS10000 (mips_arch == PROCESSOR_R10000) ++#define TARGET_MIPS12000 (mips_arch == PROCESSOR_R12000) ++#define TARGET_MIPS14000 (mips_arch == PROCESSOR_R14000) ++#define TARGET_MIPS16000 (mips_arch == PROCESSOR_R16000) + #define TARGET_SB1 (mips_arch == PROCESSOR_SB1 \ + || mips_arch == PROCESSOR_SB1A) + #define TARGET_SR71K (mips_arch == PROCESSOR_SR71000) +@@ -224,6 +232,10 @@ extern const struct mips_rtx_cost_data * + #define TUNE_MIPS6000 (mips_tune == PROCESSOR_R6000) + #define TUNE_MIPS7000 (mips_tune == PROCESSOR_R7000) + #define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000) ++#define TUNE_MIPS10000 (mips_tune == PROCESSOR_R10000) ++#define TUNE_MIPS12000 (mips_tune == PROCESSOR_R12000) ++#define TUNE_MIPS14000 (mips_tune == PROCESSOR_R14000) ++#define TUNE_MIPS16000 (mips_tune == PROCESSOR_R16000) + #define TUNE_SB1 (mips_tune == PROCESSOR_SB1 \ + || mips_tune == PROCESSOR_SB1A) + +Index: gcc-4.2.3/gcc/config/mips/mips.md +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/mips.md ++++ gcc-4.2.3/gcc/config/mips/mips.md +@@ -340,7 +340,7 @@ + ;; Attribute describing the processor. This attribute must match exactly + ;; with the processor_type enumeration in mips.h. + (define_attr "cpu" +- "r3000,4kc,4kp,5kc,5kf,20kc,24k,24kx,m4k,r3900,r6000,r4000,r4100,r4111,r4120,r4130,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,sb1,sb1a,sr71000" ++ "r3000,4kc,4kp,5kc,5kf,20kc,24k,24kx,m4k,r3900,r6000,r4000,r4100,r4111,r4120,r4130,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,r10000,r12000,r14000,r16000,sb1,sb1a,sr71000" + (const (symbol_ref "mips_tune"))) + + ;; The type of hardware hazard associated with this instruction. +@@ -600,6 +600,7 @@ + (include "6000.md") + (include "7000.md") + (include "9000.md") ++(include "10000.md") + (include "sb1.md") + (include "sr71k.md") + (include "generic.md") diff --git a/patches/gcc-4.2.3/generic/gentoo/91_all_mips-ip28_cache_barriers-v4.patch b/patches/gcc-4.2.3/generic/gentoo/91_all_mips-ip28_cache_barriers-v4.patch new file mode 100644 index 0000000..48d52f6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/91_all_mips-ip28_cache_barriers-v4.patch @@ -0,0 +1,352 @@ +--- + gcc/config/mips/mips.c | 7 + gcc/config/mips/mips.opt | 10 + + gcc/config/mips/r10k-cacheb.c | 298 ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 315 insertions(+) + +Index: gcc-4.2.3/gcc/config/mips/mips.c +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/mips.c ++++ gcc-4.2.3/gcc/config/mips/mips.c +@@ -255,6 +255,9 @@ static const char *const mips_fp_conditi + MIPS_FP_CONDITIONS (STRINGIFY) + }; + ++/* R10K Cache Barrier Functions */ ++#include "r10k-cacheb.c" ++ + /* A function to save or store a register. The first argument is the + register and the second is the stack slot. */ + typedef void (*mips_save_restore_fn) (rtx, rtx); +@@ -8908,6 +8911,10 @@ vr4130_avoid_branch_rt_conflict (rtx ins + XEXP (cond, 1) = tmp; + } + } ++ if (TARGET_R10K_SPECEX) ++ { ++ r10k_insert_cache_barriers (); ++ } + } + + /* Implement -mvr4130-align. Go through each basic block and simulate the +Index: gcc-4.2.3/gcc/config/mips/mips.opt +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/mips.opt ++++ gcc-4.2.3/gcc/config/mips/mips.opt +@@ -219,3 +219,13 @@ Perform VR4130-specific alignment optimi + mxgot + Target Report Var(TARGET_XGOT) + Lift restrictions on GOT size ++ ++mr10k-cache-barrier= ++Target Report Joined UInteger Var(TARGET_R10K_SPECEX) ++-mr10k-cache-barrier[=1|2] Generate cache barriers for SGI Indigo2/O2 R10k ++ ++mr10k-cache-barrier ++Target Undocumented Var(TARGET_R10K_SPECEX) VarExists ++ ++mip28-cache-barrier ++Target Undocumented Var(TARGET_R10K_SPECEX) VarExists +Index: gcc-4.2.3/gcc/config/mips/r10k-cacheb.c +=================================================================== +--- /dev/null ++++ gcc-4.2.3/gcc/config/mips/r10k-cacheb.c +@@ -0,0 +1,298 @@ ++/* Subroutines used for MIPS code generation: generate cache-barriers ++ for SiliconGraphics IP28 and IP32/R10000 kernel-code. ++ Copyright (C) 2005,2006 peter fuerst, pf@net.alphadv.de. ++ ++This file is intended to become part of GCC. ++ ++This file 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 file 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, 51 Franklin Street, Fifth Floor, Boston, ++MA 02110-1301 USA. */ ++ ++ ++#define ASM_R10K_CACHE_BARRIER "cache 0x14,0($sp)" ++ ++static int is_stack_pointer (rtx *x, void *data); ++static int check_p_mem_expr (rtx *memx, void *data); ++static int check_p_pattern_for_store (rtx *body, void *data); ++static int strmatch (const char *txt, const char *match); ++static int check_insn_for_store (int state, rtx insn); ++static int bb_insert_store_cache_barrier (rtx head, rtx nxtb); ++static int scan_1_bb_for_store (rtx head, rtx end); ++static int r10k_insert_cache_barriers (void); ++ ++ ++/* Check, whether an instruction is a possibly harmful store instruction, ++ i.e. a store which might cause damage, if speculatively executed. */ ++ ++/* Return truth value whether the expression `*memx' instantiates ++ (mem:M (not (stackpointer_address or constant))). */ ++ ++static int ++is_stack_pointer (rtx *x, void *data) ++{ ++ return (*x == stack_pointer_rtx); ++} ++ ++static int ++check_p_mem_expr (rtx *memx, void *data) ++{ ++ if (!MEM_P (*memx) || for_each_rtx (memx, is_stack_pointer, 0)) ++ return 0; ++ ++ /* Stores/Loads to/from constant addresses can be considered ++ harmless, since: ++ 1) the address is always valid, even when taken speculatively. ++ 2a) the location is (hopefully) never used as a dma-target, thus ++ there is no danger of cache-inconsistency. ++ 2b) uncached loads/stores are guaranteed to be non-speculative. */ ++ if ( CONSTANT_P(XEXP (*memx, 0)) ) ++ return 0; ++ ++ return 1; ++} ++ ++/* Return truth value whether we find (set (mem:M (non_stackpointer_address) ++ ...)) in instruction-pattern `body'. ++ Here we assume, that addressing with the stackpointer accesses neither ++ uncached-aliased nor invalid memory. ++ (May be, this applies to the global pointer and frame pointer also, ++ but its saver not to assume it. And probably it's not worthwile to ++ regard these registers) ++ ++ Speculative loads from invalid addresses also cause bus errors... ++ So check for (set (reg:M ...) (mem:M (non_stackpointer_address))) ++ too, unless there is an enhanced bus-error handler. */ ++ ++static int ++check_p_pattern_for_store (rtx *body, void *data) ++{ ++ if (*body && GET_CODE (*body) == SET) ++ { ++ /* Cache-barriers for SET_SRC may be requested as well. */ ++ if (!(TARGET_R10K_SPECEX & 2)) ++ body = &SET_DEST(*body); ++ ++ if (for_each_rtx (body, check_p_mem_expr, 0)) ++ return 1; ++ ++ /* Don't traverse sub-expressions again. */ ++ return -1; ++ } ++ return 0; ++} ++ ++static int ++strmatch (const char *txt, const char *match) ++{ ++ return !strncmp(txt, match, strlen (match)); ++} ++ ++/* Check for (ins (set (mem:M (dangerous_address)) ...)) or end of the ++ current basic block in instruction `insn'. ++ `state': (internal) recursion-counter and delayslot-flag ++ Criteria to recognize end-of/next basic-block are reduplicated here ++ from final_scan_insn. ++ return >0: `insn' is critical. ++ return <0: `insn' is at end of current basic-block. ++ return 0: `insn' can be ignored. */ ++ ++static int ++check_insn_for_store (int state, rtx insn) ++{ ++ rtx body; ++ ++ if (INSN_DELETED_P (insn)) ++ return 0; ++ ++ if (LABEL_P (insn)) ++ return -1; ++ ++ if (CALL_P (insn) || JUMP_P (insn) || NONJUMP_INSN_P (insn)) ++ { ++ body = PATTERN (insn); ++ if (GET_CODE (body) == SEQUENCE) ++ { ++ /* A delayed-branch sequence. */ ++ rtx insq; ++ FOR_EACH_SUBINSN(insq, insn) ++ if (! INSN_DELETED_P (insq)) ++ { ++ /* |1: delay-slot completely contained in sequence. */ ++ if (check_insn_for_store (8+state|1, insq) > 0) ++ return 1; ++ } ++ /* Following a (conditional) branch sequence, we have a new ++ basic block. */ ++ if (JUMP_P (SEQ_BEGIN(insn))) ++ return -1; ++ /* Handle a call sequence like a conditional branch sequence. */ ++ if (CALL_P (SEQ_BEGIN(insn))) ++ return -1; ++ } ++ if (GET_CODE (body) == PARALLEL) ++ if (for_each_rtx (&body, check_p_pattern_for_store, 0)) ++ return 1; ++ ++ /* Now, only a `simple' INSN or JUMP_INSN remains to be checked. */ ++ if (NONJUMP_INSN_P (insn)) ++ { ++ /* Since we don't know what's inside, we must take inline ++ assembly to be dangerous. */ ++ if (GET_CODE (body) == ASM_INPUT) ++ { ++ const char *t = XSTR (body, 0); ++ if (t && !strmatch(t, ASM_R10K_CACHE_BARRIER)) ++ return 1; ++ } ++ ++ if (check_p_pattern_for_store (&body, 0) > 0) ++ return 1; ++ } ++ /* Handle a CALL_INSN instruction like a conditional branch. */ ++ if (JUMP_P (insn) || CALL_P (insn)) ++ { ++ /* Following a (conditional) branch, we have a new basic block. */ ++ /* But check insn(s) in delay-slot first. If we could know in ++ advance that this jump is in `.reorder' mode, where gas will ++ insert a `nop' into the delay-slot, we could skip this test. ++ Since we don't know, always assume `.noreorder', sometimes ++ emitting a cache-barrier, that isn't needed. */ ++ /* But if we are here recursively, already checking a (pseudo-) ++ delay-slot, we are done. */ ++ if ( !(state & 1) ) ++ for (insn = NEXT_INSN (insn); insn; insn = NEXT_INSN (insn)) ++ { ++ if (LABEL_P (insn) || CALL_P (insn) || JUMP_P (insn)) ++ /* Not in delay-slot at all. */ ++ break; ++ ++ if (NONJUMP_INSN_P (insn)) ++ { ++ if (GET_CODE (PATTERN (insn)) == SEQUENCE) ++ /* Not in delay-slot at all. */ ++ break; ++ ++ if (check_insn_for_store (8+state|1, insn) > 0) ++ return 1; ++ /* We're done anyway. */ ++ break; ++ } ++ /* skip NOTE,... */; ++ } ++ return -1; ++ } ++ } ++ return 0; ++} ++ ++ ++/* Scan a basic block, starting with `insn', for a possibly harmful store ++ instruction. If found, output a cache barrier at the start of this ++ block. */ ++ ++static int ++bb_insert_store_cache_barrier (rtx head, rtx nxtb) ++{ ++ rtx insn = head; ++ ++ if (!insn || insn == nxtb) ++ return 0; ++ ++ while ((insn = NEXT_INSN (insn)) && insn != nxtb) ++ { ++ int found; ++ ++ if (NOTE_INSN_BASIC_BLOCK_P(insn)) /* See scan_1_bb_for_store() */ ++ break; ++ ++ found = check_insn_for_store (0, insn); ++ if (found < 0) ++ break; ++ if (found > 0) ++ { ++ /* found critical store instruction */ ++ insn = gen_rtx_ASM_INPUT (VOIDmode, ++ ASM_R10K_CACHE_BARRIER "\t" ++ ASM_COMMENT_START " Cache Barrier"); ++ /* Here we rely on the assumption, that an explicit delay-slot ++ - if any - is already embedded (in a sequence) in 'head'! */ ++ insn = emit_insn_after (insn, head); ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++ ++/* Scan one basic block for a possibly harmful store instruction. ++ If found, insert a cache barrier at the start of this block, ++ return number of inserted cache_barriers. */ ++ ++static int ++scan_1_bb_for_store (rtx head, rtx end) ++{ ++ rtx nxtb; ++ int count; ++ gcc_assert (head); ++ gcc_assert (end); ++ ++ /* Note: 'end' is not necessarily reached from 'head' (hidden in ++ SEQUENCE, PARALLEL), but 'nxtb' is. */ ++ nxtb = NEXT_INSN (end); ++ ++ /* Each basic block starts with zero or more CODE_LABEL(s), followed ++ by one NOTE_INSN_BASIC_BLOCK. ++ Note: bb_head may equal next_insn(bb_end) already ! */ ++ while (head && head != nxtb && LABEL_P (head)) ++ head = NEXT_INSN (head); ++ ++ if (!head || head == nxtb) ++ return 0; ++ ++ /* Handle the basic block itself, at most up to next CALL_INSN. */ ++ count = bb_insert_store_cache_barrier (head, nxtb); ++ ++ /* 1) Handle any CALL_INSN instruction like a conditional branch. ++ 2) There may be "basic blocks" in the list, which are no basic blocks ++ at all. (containing CODE_LABELs in the body or gathering several ++ other basic blocks (e.g. bb5 containing bb6,bb7,bb8)). */ ++ ++ while ((head = NEXT_INSN (head)) && head != nxtb) ++ { ++ if (INSN_DELETED_P (head)) ++ continue; ++ ++ /* Later we'll be called again for this bb on its own. */ ++ if (NOTE_INSN_BASIC_BLOCK_P(head)) ++ break; ++ ++ if (CALL_P (SEQ_BEGIN (head)) || LABEL_P (head)) ++ count += bb_insert_store_cache_barrier (head, nxtb); ++ } ++ return count; ++} ++ ++static int ++r10k_insert_cache_barriers (void) ++{ ++ if (TARGET_R10K_SPECEX) ++ { ++ basic_block bb; ++ ++ FOR_EACH_BB (bb) ++ if (0 <= bb->index) ++ scan_1_bb_for_store (BB_HEAD (bb), BB_END (bb)); ++ } ++ return 0; ++} diff --git a/patches/gcc-4.2.3/generic/gentoo/92_all_mips-pthread-with-shared.patch b/patches/gcc-4.2.3/generic/gentoo/92_all_mips-pthread-with-shared.patch new file mode 100644 index 0000000..342daad --- /dev/null +++ b/patches/gcc-4.2.3/generic/gentoo/92_all_mips-pthread-with-shared.patch @@ -0,0 +1,37 @@ +just like this, but for mips: +http://gcc.gnu.org/ml/gcc-patches/2002-12/msg00526.html + +--- + gcc/config/mips/linux.h | 4 ++-- + gcc/config/mips/linux64.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +Index: gcc-4.2.3/gcc/config/mips/linux.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/linux.h ++++ gcc-4.2.3/gcc/config/mips/linux.h +@@ -174,7 +174,7 @@ along with GCC; see the file COPYING3. + #undef LIB_SPEC + #define LIB_SPEC "\ + %{shared: -lc} \ +-%{!shared: %{pthread:-lpthread} \ +- %{profile:-lc_p} %{!profile: -lc}}" ++%{pthread:-lpthread} \ ++%{!shared: %{profile:-lc_p} %{!profile: -lc}}" + + #define MD_UNWIND_SUPPORT "config/mips/linux-unwind.h" +Index: gcc-4.2.3/gcc/config/mips/linux64.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/mips/linux64.h ++++ gcc-4.2.3/gcc/config/mips/linux64.h +@@ -32,8 +32,8 @@ along with GCC; see the file COPYING3. + #undef LIB_SPEC + #define LIB_SPEC "\ + %{shared: -lc} \ +-%{!shared: %{pthread:-lpthread} \ +- %{profile:-lc_p} %{!profile: -lc}}" ++%{pthread:-lpthread} \ ++%{!shared: %{profile:-lc_p} %{!profile: -lc}}" + + #define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" + #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld.so.1" diff --git a/patches/gcc-4.2.3/generic/no-host-includes.diff b/patches/gcc-4.2.3/generic/no-host-includes.diff new file mode 100644 index 0000000..da20fb8 --- /dev/null +++ b/patches/gcc-4.2.3/generic/no-host-includes.diff @@ -0,0 +1,56 @@ +# +# Submitted-By: Marc Kleine-Budde, 2006-11-03 +# +# Error: +# +# No error :) +# With this patch gcc bails out if you include a host include path into the searchlist (-I) +# +# Description: +# +# inspired by: +# http://www.openembedded.org/repo/org.openembedded.dev/packages/gcc/gcc-4.1.1/zecke-no-host-includes.patch +# +--- +# gcc/c-incpath.c | 28 ++++++++++++++++++++++++++++ +# 1 file changed, 28 insertions(+) +# +Index: gcc-4.2.3/gcc/c-incpath.c +=================================================================== +--- gcc-4.2.3.orig/gcc/c-incpath.c ++++ gcc-4.2.3/gcc/c-incpath.c +@@ -359,6 +359,34 @@ add_path (char *path, int chain, int cxx + p->construct = 0; + p->user_supplied_p = user_supplied_p; + ++#ifdef CROSS_COMPILE ++ /* A common error when cross compiling is including ++ host headers. This code below will try to fail fast ++ for cross compiling. Currently we consider /usr/include, ++ /opt/include and /sw/include as harmful. */ ++ { ++ unsigned int i; ++ const char *bad_path[] = { ++ "/usr/include", ++ "/usr/local/include", ++ "/sw/include", ++ "/opt/include", ++ }; ++ ++ for (i = 0; i < sizeof(bad_path)/sizeof(bad_path[0]); i++) { ++ if( strstr(p->name, bad_path[i]) == p->name ) { ++ fprintf(stderr,_("\n" ++ "CROSS COMPILE Badness: %s in INCLUDEPATH: %s\n" ++ "\n"), ++ ++ bad_path[i], p->name); ++ ++ exit (FATAL_EXIT_CODE); ++ } ++ } ++ } ++#endif ++ + add_cpp_dir_path (p, chain); + } + diff --git a/patches/gcc-4.2.3/generic/oe/arm-thumb-cache.patch b/patches/gcc-4.2.3/generic/oe/arm-thumb-cache.patch new file mode 100644 index 0000000..5820a10 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/arm-thumb-cache.patch @@ -0,0 +1,35 @@ +--- + gcc/config/arm/linux-gas.h | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +Index: gcc-4.2.3/gcc/config/arm/linux-gas.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/linux-gas.h ++++ gcc-4.2.3/gcc/config/arm/linux-gas.h +@@ -43,6 +43,7 @@ + + /* Clear the instruction cache from `beg' to `end'. This makes an + inline system call to SYS_cacheflush. */ ++#if !defined(__thumb__) + #define CLEAR_INSN_CACHE(BEG, END) \ + { \ + register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ +@@ -52,3 +53,18 @@ + : "=r" (_beg) \ + : "0" (_beg), "r" (_end), "r" (_flg)); \ + } ++#else ++#define CLEAR_INSN_CACHE(BEG, END) \ ++{ \ ++ register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ ++ register unsigned long _end __asm ("a2") = (unsigned long) (END); \ ++ register unsigned long _flg __asm ("a3") = 0; \ ++ register unsigned long _swi __asm ("a4") = 0xf0002; \ ++ __asm __volatile ("push {r7}\n" \ ++ " mov r7,a4\n" \ ++ " swi 0 @ sys_cacheflush\n" \ ++ " pop {r7}\n" \ ++ : "=r" (_beg) \ ++ : "0" (_beg), "r" (_end), "r" (_flg), "r" (_swi)); \ ++} ++#endif diff --git a/patches/gcc-4.2.3/generic/oe/arm-thumb.patch b/patches/gcc-4.2.3/generic/oe/arm-thumb.patch new file mode 100644 index 0000000..a85416a --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/arm-thumb.patch @@ -0,0 +1,73 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- + gcc/config/arm/lib1funcs.asm | 18 +++++++++++++++++- + gcc/config/arm/t-linux | 1 + + 2 files changed, 18 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/config/arm/lib1funcs.asm +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/lib1funcs.asm ++++ gcc-4.2.3/gcc/config/arm/lib1funcs.asm +@@ -995,10 +995,24 @@ LSYM(Lover12): + .code 32 + FUNC_START div0 + ++#if ! defined __thumb__ + stmfd sp!, {r1, lr} + mov r0, #SIGFPE + bl SYM(raise) __PLT__ + RETLDM r1 ++#else ++ push {r1, lr} ++ mov r0, #SIGFPE ++ bl SYM(raise) __PLT__ ++#if __ARM_ARCH__ > 4 ++ pop {r1, pc} ++#else ++ @ on 4T that won't work ++ pop {r1} ++ pop {r3} ++ bx r3 ++#endif ++#endif + + FUNC_END div0 + +@@ -1146,11 +1160,12 @@ LSYM(Lover12): + code here switches to the correct mode before executing the function. */ + + .text +- .align 0 ++ .align 1 + .force_thumb + + .macro call_via register + THUMB_FUNC_START _call_via_\register ++ .hidden SYM (_call_via_\register) + + bx \register + nop +@@ -1247,6 +1262,7 @@ _arm_return_r11: + .code 16 + + THUMB_FUNC_START _interwork_call_via_\register ++ .hidden SYM (_interwork_call_via_\register) + + bx pc + nop +Index: gcc-4.2.3/gcc/config/arm/t-linux +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/t-linux ++++ gcc-4.2.3/gcc/config/arm/t-linux +@@ -7,6 +7,7 @@ LIB1ASMSRC = arm/lib1funcs.asm + LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _call_via_rX \ + _fixsfsi _fixunssfsi _floatdidf _floatdisf + + # MULTILIB_OPTIONS = mhard-float/msoft-float diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-20000320.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-20000320.patch new file mode 100644 index 0000000..3fb0da7 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-20000320.patch @@ -0,0 +1,11 @@ +--- gcc-4.1.2/gcc/testsuite/gcc.c-torture/execute/ieee/20000320-1.c.original 2007-06-07 16:33:44.000000000 +1000 ++++ gcc-4.1.2/gcc/testsuite/gcc.c-torture/execute/ieee/20000320-1.c 2007-06-07 16:34:05.000000000 +1000 +@@ -49,7 +49,7 @@ + exit (0); + + c(0x3690000000000000ULL, 0x00000000U); +-#if (defined __arm__ || defined __thumb__) && ! (defined __ARMEB__ || defined __VFP_FP__) ++#if (defined __arm__ || defined __thumb__) && ! (defined __ARMEB__ || defined __VFP_FP__) && ! (defined __MAVERICK__) + /* The ARM always stores FP numbers in big-wordian format, + even when running in little-byteian mode. */ + c(0x0000000136900000ULL, 0x00000001U); diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-32bit-disable.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-32bit-disable.patch new file mode 100644 index 0000000..88eaee3 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-32bit-disable.patch @@ -0,0 +1,85 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-integer 2007-06-15 09:01:37.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-15 09:04:45.000000000 +1000 +@@ -149,7 +149,7 @@ + (match_operand:SI 1 "cirrus_fp_register" "0") + (mult:SI (match_operand:SI 2 "cirrus_fp_register" "v") + (match_operand:SI 3 "cirrus_fp_register" "v"))))] +- "0 && TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "0 && TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmsc32%?\\t%V0, %V2, %V3" + [(set_attr "type" "mav_farith") + (set_attr "cirrus" "normal")] +@@ -305,7 +305,7 @@ + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float:SF (match_operand:SI 1 "s_register_operand" "r"))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2" + [(set_attr "length" "8") + (set_attr "cirrus" "move")] +@@ -315,7 +315,7 @@ + [(set (match_operand:DF 0 "cirrus_fp_register" "=v") + (float:DF (match_operand:SI 1 "s_register_operand" "r"))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmv64lr%?\\t%Z2, %1\;cfcvt32d%?\\t%V0, %Y2" + [(set_attr "length" "8") + (set_attr "cirrus" "move")] +@@ -339,7 +339,7 @@ + [(set (match_operand:SI 0 "s_register_operand" "=r") + (fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register" "v")))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" + [(set_attr "length" "8") + (set_attr "cirrus" "normal")] +@@ -349,7 +349,7 @@ + [(set (match_operand:SI 0 "s_register_operand" "=r") + (fix:SI (fix:DF (match_operand:DF 1 "cirrus_fp_register" "v")))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" + [(set_attr "length" "8") + (set_attr "cirrus" "normal")] +--- gcc-4.1.2/gcc/config/arm/arm.md-trunc 2007-06-15 10:56:13.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-15 11:01:22.000000000 +1000 +@@ -3130,7 +3130,7 @@ + (float:SF (match_operand:SI 1 "s_register_operand" "")))] + "TARGET_ARM && TARGET_HARD_FLOAT" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + emit_insn (gen_cirrus_floatsisf2 (operands[0], operands[1])); + DONE; +@@ -3142,7 +3142,7 @@ + (float:DF (match_operand:SI 1 "s_register_operand" "")))] + "TARGET_ARM && TARGET_HARD_FLOAT" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + emit_insn (gen_cirrus_floatsidf2 (operands[0], operands[1])); + DONE; +@@ -3154,7 +3154,7 @@ + (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" ""))))] + "TARGET_ARM && TARGET_HARD_FLOAT" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + if (!cirrus_fp_register (operands[0], SImode)) + operands[0] = force_reg (SImode, operands[0]); +@@ -3170,7 +3170,7 @@ + (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" ""))))] + "TARGET_ARM && TARGET_HARD_FLOAT" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + if (!cirrus_fp_register (operands[1], DFmode)) + operands[1] = force_reg (DFmode, operands[0]); diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable-4.2.0.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable-4.2.0.patch new file mode 100644 index 0000000..60b1785 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable-4.2.0.patch @@ -0,0 +1,169 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-integer 2007-06-15 09:01:37.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-15 09:04:45.000000000 +1000 +@@ -34,7 +34,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (plus:DI (match_operand:DI 1 "cirrus_fp_register" "v") + (match_operand:DI 2 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfadd64%?\\t%V0, %V1, %V2" + [(set_attr "type" "mav_farith") + (set_attr "cirrus" "normal")] +@@ -74,7 +74,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (minus:DI (match_operand:DI 1 "cirrus_fp_register" "v") + (match_operand:DI 2 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfsub64%?\\t%V0, %V1, %V2" + [(set_attr "type" "mav_farith") + (set_attr "cirrus" "normal")] +@@ -124,7 +124,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (mult:DI (match_operand:DI 2 "cirrus_fp_register" "v") + (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmul64%?\\t%V0, %V1, %V2" + [(set_attr "type" "mav_dmult") + (set_attr "cirrus" "normal")] +@@ -206,7 +206,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (ashift:DI (match_operand:DI 1 "cirrus_fp_register" "v") + (match_operand:SI 2 "register_operand" "r")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfrshl64%?\\t%V1, %V0, %s2" + [(set_attr "cirrus" "normal")] + ) +@@ -215,7 +215,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (ashift:DI (match_operand:DI 1 "cirrus_fp_register" "v") + (match_operand:SI 2 "cirrus_shift_const" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfsh64%?\\t%V0, %V1, #%s2" + [(set_attr "cirrus" "normal")] + ) +@@ -224,7 +224,7 @@ + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (ashiftrt:DI (match_operand:DI 1 "cirrus_fp_register" "v") + (match_operand:SI 2 "cirrus_shift_const" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfsh64%?\\t%V0, %V1, #-%s2" + [(set_attr "cirrus" "normal")] + ) +@@ -232,7 +232,7 @@ + (define_insn "*cirrus_absdi2" + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (abs:DI (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfabs64%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")] + ) +@@ -238,11 +238,12 @@ + ) + + ;; This doesn't really clobber ``cc''. Fixme: aldyh. ++;; maybe buggy? + (define_insn "*cirrus_negdi2" + [(set (match_operand:DI 0 "cirrus_fp_register" "=v") + (neg:DI (match_operand:DI 1 "cirrus_fp_register" "v"))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfneg64%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")] + ) +@@ -324,14 +324,14 @@ + (define_insn "floatdisf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float:SF (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfcvt64s%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + + (define_insn "floatdidf2" + [(set (match_operand:DF 0 "cirrus_fp_register" "=v") + (float:DF (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfcvt64d%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + +@@ -376,7 +376,7 @@ + (define_insn "*cirrus_arm_movdi" + [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,o<>,v,r,v,m,v") + (match_operand:DI 1 "di_operand" "rIK,mi,r,r,v,mi,v,v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "* + { + switch (which_alternative) +--- gcc-4.1.2/gcc/config/arm/arm.md-64 2007-06-15 11:37:42.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-15 11:40:45.000000000 +1000 +@@ -357,7 +357,7 @@ + (clobber (reg:CC CC_REGNUM))])] + "TARGET_EITHER" + " +- if (TARGET_HARD_FLOAT && TARGET_MAVERICK) ++ if (TARGET_HARD_FLOAT && TARGET_MAVERICK && 0) + { + if (!cirrus_fp_register (operands[0], DImode)) + operands[0] = force_reg (DImode, operands[0]); +@@ -393,7 +393,7 @@ + (plus:DI (match_operand:DI 1 "s_register_operand" "%0, 0") + (match_operand:DI 2 "s_register_operand" "r, 0"))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" ++ "TARGET_ARM" + "#" + "TARGET_ARM && reload_completed" + [(parallel [(set (reg:CC_C CC_REGNUM) +@@ -421,7 +421,7 @@ + (match_operand:SI 2 "s_register_operand" "r,r")) + (match_operand:DI 1 "s_register_operand" "r,0"))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" ++ "TARGET_ARM" + "#" + "TARGET_ARM && reload_completed" + [(parallel [(set (reg:CC_C CC_REGNUM) +@@ -450,7 +450,7 @@ + (match_operand:SI 2 "s_register_operand" "r,r")) + (match_operand:DI 1 "s_register_operand" "r,0"))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" ++ "TARGET_ARM" + "#" + "TARGET_ARM && reload_completed" + [(parallel [(set (reg:CC_C CC_REGNUM) +@@ -838,7 +838,7 @@ + if (TARGET_HARD_FLOAT && TARGET_MAVERICK + && TARGET_ARM + && cirrus_fp_register (operands[0], DImode) +- && cirrus_fp_register (operands[1], DImode)) ++ && cirrus_fp_register (operands[1], DImode) && 0) + { + emit_insn (gen_cirrus_subdi3 (operands[0], operands[1], operands[2])); + DONE; +@@ -2599,7 +2599,7 @@ + values to iwmmxt regs and back. */ + FAIL; + } +- else if (!TARGET_REALLY_IWMMXT && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)) ++ else if (!TARGET_REALLY_IWMMXT) + FAIL; + " + ) +@@ -4215,7 +4215,6 @@ + [(set (match_operand:DI 0 "nonimmediate_operand" "=l,l,l,l,>,l, m,*r") + (match_operand:DI 1 "general_operand" "l, I,J,>,l,mi,l,*r"))] + "TARGET_THUMB +- && !(TARGET_HARD_FLOAT && TARGET_MAVERICK) + && ( register_operand (operands[0], DImode) + || register_operand (operands[1], DImode))" + "* diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable0.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable0.patch new file mode 100644 index 0000000..95abf68 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-64bit-disable0.patch @@ -0,0 +1,47 @@ +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.md gcc-4.1.2/gcc/config/arm/arm.md +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.md 2006-09-28 03:10:22.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-05-15 09:53:21.000000000 +1000 +@@ -6865,10 +6877,12 @@ + ) + + ;; Cirrus DI compare instruction ++;; This is disabled and left go through ARM core registers, because currently ++;; Crunch coprocessor does only signed comparison. + (define_expand "cmpdi" + [(match_operand:DI 0 "cirrus_fp_register" "") + (match_operand:DI 1 "cirrus_fp_register" "")] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK & 0" + "{ + arm_compare_op0 = operands[0]; + arm_compare_op1 = operands[1]; +@@ -6879,7 +6893,7 @@ + [(set (reg:CC CC_REGNUM) + (compare:CC (match_operand:DI 0 "cirrus_fp_register" "v") + (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK & 0" + "cfcmp64%?\\tr15, %V0, %V1" + [(set_attr "type" "mav_farith") + (set_attr "cirrus" "compare")] +@@ -10105,6 +10119,7 @@ + [(unspec:SI [(match_operand:SI 0 "register_operand" "")] UNSPEC_PROLOGUE_USE)] + "" + "%@ %0 needed for prologue" ++ [(set_attr "length" "0")] + ) + + +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/cirrus.md gcc-4.1.2/gcc/config/arm/cirrus.md +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/cirrus.md 2005-06-25 11:22:41.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-05-15 09:55:29.000000000 +1000 +@@ -348,7 +348,8 @@ + (clobber (match_scratch:DF 2 "=v"))] + "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" + "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" +- [(set_attr "length" "8")] ++ [(set_attr "length" "8") ++ (set_attr "cirrus" "normal")] + ) + + (define_insn "*cirrus_truncdfsf2" diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-and-or.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-and-or.patch new file mode 100644 index 0000000..24357d3 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-and-or.patch @@ -0,0 +1,67 @@ +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-13 17:16:38.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-13 17:35:19.000000000 +1000 +@@ -8455,7 +8455,7 @@ + (and:SI (match_operator:SI 1 "arm_comparison_operator" + [(match_operand 3 "cc_register" "") (const_int 0)]) + (match_operand:SI 2 "s_register_operand" "r")))] +- "TARGET_ARM" ++ "TARGET_ARM && !TARGET_MAVERICK" + "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1" + [(set_attr "conds" "use") + (set_attr "length" "8")] +@@ -8466,7 +8466,7 @@ + (ior:SI (match_operator:SI 2 "arm_comparison_operator" + [(match_operand 3 "cc_register" "") (const_int 0)]) + (match_operand:SI 1 "s_register_operand" "0,?r")))] +- "TARGET_ARM" ++ "TARGET_ARM && !TARGET_MAVERICK" + "@ + orr%d2\\t%0, %1, #1 + mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1" +@@ -8734,7 +8734,8 @@ + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM + && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_OR_Y) +- != CCmode)" ++ != CCmode) ++ && !TARGET_MAVERICK" + "#" + "TARGET_ARM && reload_completed" + [(set (match_dup 7) +@@ -8765,7 +8766,7 @@ + (set (match_operand:SI 7 "s_register_operand" "=r") + (ior:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) + (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] +- "TARGET_ARM" ++ "TARGET_ARM && !TARGET_MAVERICK" + "#" + "TARGET_ARM && reload_completed" + [(set (match_dup 0) +@@ -8790,7 +8791,8 @@ + (clobber (reg:CC CC_REGNUM))] + "TARGET_ARM + && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) +- != CCmode)" ++ != CCmode) ++ && !TARGET_MAVERICK" + "#" + "TARGET_ARM && reload_completed + && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) +@@ -8823,7 +8825,7 @@ + (set (match_operand:SI 7 "s_register_operand" "=r") + (and:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) + (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] +- "TARGET_ARM" ++ "TARGET_ARM && !TARGET_MAVERICK" + "#" + "TARGET_ARM && reload_completed" + [(set (match_dup 0) +@@ -8850,7 +8852,7 @@ + [(match_operand:SI 4 "s_register_operand" "r,r,r") + (match_operand:SI 5 "arm_add_operand" "rIL,rIL,rIL")]))) + (clobber (reg:CC CC_REGNUM))] +- "TARGET_ARM ++ "TARGET_ARM && !TARGET_MAVERICK + && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) + == CCmode)" + "#" diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvt64-disable.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvt64-disable.patch new file mode 100644 index 0000000..f9280b1 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvt64-disable.patch @@ -0,0 +1,19 @@ +--- gcc-4.2.0/gcc/config/arm/cirrus.md-original 2007-06-25 15:32:01.000000000 +1000 ++++ gcc-4.2.0/gcc/config/arm/cirrus.md 2007-06-25 15:32:14.000000000 +1000 +@@ -325,14 +325,14 @@ + (define_insn "floatdisf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float:SF (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfcvt64s%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + + (define_insn "floatdidf2" + [(set (match_operand:DF 0 "cirrus_fp_register" "=v") + (float:DF (match_operand:DI 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfcvt64d%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvtds-disable.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvtds-disable.patch new file mode 100644 index 0000000..ec09ea1 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cfcvtds-disable.patch @@ -0,0 +1,32 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-cfcvt 2007-06-15 10:06:24.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-15 10:07:21.000000000 +1000 +@@ -355,11 +355,12 @@ + (set_attr "cirrus" "normal")] + ) + ++; appears to be buggy - causes 20000320-1.c to fail in execute/ieee + (define_insn "*cirrus_truncdfsf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float_truncate:SF + (match_operand:DF 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfcvtds%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")] + ) +--- gcc-4.1.2/gcc/config/arm/arm.md-truncdfsf2 2007-06-15 10:25:43.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-15 10:27:01.000000000 +1000 +@@ -3181,11 +3181,12 @@ + + ;; Truncation insns + ++;; Maverick Crunch truncdfsf2 is buggy - see cirrus.md + (define_expand "truncdfsf2" + [(set (match_operand:SF 0 "s_register_operand" "") + (float_truncate:SF + (match_operand:DF 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + "" + ) + diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cirrus-bugfixes.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cirrus-bugfixes.patch new file mode 100644 index 0000000..cb0af85 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-cirrus-bugfixes.patch @@ -0,0 +1,573 @@ +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c gcc-4.1.2/gcc/config/arm/arm.c +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c 2007-05-09 16:32:29.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-05-15 09:39:41.000000000 +1000 +@@ -4,6 +4,7 @@ + Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl) + and Martin Simmons (@harleqn.co.uk). + More major hacks by Richard Earnshaw (rearnsha@arm.com). ++ Cirrus Crunch bugfixes by Vladimir Ivanov (vladit@nucleusys.com) + + This file is part of GCC. + +@@ -131,9 +132,17 @@ + static bool arm_xscale_rtx_costs (rtx, int, int, int *); + static bool arm_9e_rtx_costs (rtx, int, int, int *); + static int arm_address_cost (rtx); +-static bool arm_memory_load_p (rtx); ++// static bool arm_memory_load_p (rtx); + static bool arm_cirrus_insn_p (rtx); +-static void cirrus_reorg (rtx); ++// static void cirrus_reorg (rtx); ++static bool arm_mem_access_p (rtx); ++static bool cirrus_dest_regn_p (rtx, int); ++static rtx cirrus_prev_next_mach_insn (rtx, int *, int); ++static rtx cirrus_prev_mach_insn (rtx, int *); ++static rtx cirrus_next_mach_insn (rtx, int *); ++static void cirrus_reorg_branch (rtx); ++static void cirrus_reorg_bug1 (rtx); ++static void cirrus_reorg_bug10_12 (rtx); + static void arm_init_builtins (void); + static rtx arm_expand_builtin (tree, rtx, rtx, enum machine_mode, int); + static void arm_init_iwmmxt_builtins (void); +@@ -5399,41 +5412,6 @@ + || TREE_CODE (valtype) == COMPLEX_TYPE)); + } + +-/* Returns TRUE if INSN is an "LDR REG, ADDR" instruction. +- Use by the Cirrus Maverick code which has to workaround +- a hardware bug triggered by such instructions. */ +-static bool +-arm_memory_load_p (rtx insn) +-{ +- rtx body, lhs, rhs;; +- +- if (insn == NULL_RTX || GET_CODE (insn) != INSN) +- return false; +- +- body = PATTERN (insn); +- +- if (GET_CODE (body) != SET) +- return false; +- +- lhs = XEXP (body, 0); +- rhs = XEXP (body, 1); +- +- lhs = REG_OR_SUBREG_RTX (lhs); +- +- /* If the destination is not a general purpose +- register we do not have to worry. */ +- if (GET_CODE (lhs) != REG +- || REGNO_REG_CLASS (REGNO (lhs)) != GENERAL_REGS) +- return false; +- +- /* As well as loads from memory we also have to react +- to loads of invalid constants which will be turned +- into loads from the minipool. */ +- return (GET_CODE (rhs) == MEM +- || GET_CODE (rhs) == SYMBOL_REF +- || note_invalid_constants (insn, -1, false)); +-} +- + /* Return TRUE if INSN is a Cirrus instruction. */ + static bool + arm_cirrus_insn_p (rtx insn) +@@ -5452,124 +5433,218 @@ + return attr != CIRRUS_NOT; + } + +-/* Cirrus reorg for invalid instruction combinations. */ +-static void +-cirrus_reorg (rtx first) ++/* Return TRUE if ISN does memory access. */ ++static bool ++arm_mem_access_p (rtx insn) + { +- enum attr_cirrus attr; +- rtx body = PATTERN (first); +- rtx t; +- int nops; ++ enum attr_type attr; + +- /* Any branch must be followed by 2 non Cirrus instructions. */ +- if (GET_CODE (first) == JUMP_INSN && GET_CODE (body) != RETURN) +- { +- nops = 0; +- t = next_nonnote_insn (first); ++ /* get_attr aborts on USE and CLOBBER. */ ++ if (!insn ++ || GET_CODE (insn) != INSN ++ || GET_CODE (PATTERN (insn)) == USE ++ || GET_CODE (PATTERN (insn)) == CLOBBER) ++ return 0; + +- if (arm_cirrus_insn_p (t)) +- ++ nops; ++ attr = get_attr_type (insn); + +- if (arm_cirrus_insn_p (next_nonnote_insn (t))) +- ++ nops; ++ return attr == TYPE_LOAD_BYTE ++ || attr == TYPE_LOAD1 || attr == TYPE_LOAD2 || attr == TYPE_LOAD3 || attr == TYPE_LOAD4 ++ || attr == TYPE_F_CVT ++ || attr == TYPE_F_MEM_R || attr == TYPE_R_MEM_F || attr == TYPE_F_2_R || attr == TYPE_R_2_F ++ || attr == TYPE_F_LOAD || attr == TYPE_F_LOADS || attr == TYPE_F_LOADD ++ || attr == TYPE_F_STORE || attr == TYPE_F_STORES || attr == TYPE_F_STORED ++ || attr == TYPE_STORE1 || attr == TYPE_STORE2 || attr == TYPE_STORE3 || attr == TYPE_STORE4; ++ ++} + +- while (nops --) +- emit_insn_after (gen_nop (), first); ++/* Return TRUE if destination is certain Cirrus register. */ ++static bool ++cirrus_dest_regn_p (rtx body, int regn) ++{ ++ rtx lhs; ++ int reg; ++ lhs = XEXP (body, 0); ++ if (GET_CODE (lhs) != REG) ++ return 0; + +- return; +- } ++ reg = REGNO (lhs); ++ if (REGNO_REG_CLASS (reg) != CIRRUS_REGS) ++ return 0; + +- /* (float (blah)) is in parallel with a clobber. */ +- if (GET_CODE (body) == PARALLEL && XVECLEN (body, 0) > 0) +- body = XVECEXP (body, 0, 0); ++ return reg == regn; ++} ++ ++/* Get previous/next machine instruction during Cirrus workaround scans. ++ Assume worst case (for the purpose of Cirrus workarounds) ++ for JUMP / CALL instructions. */ ++static rtx ++cirrus_prev_next_mach_insn (rtx insn, int *len, int next) ++{ ++ rtx t; ++ int l = 0; + +- if (GET_CODE (body) == SET) ++ /* It seems that we can count only on INSN length. */ ++ for ( ; ; ) + { +- rtx lhs = XEXP (body, 0), rhs = XEXP (body, 1); ++ if (next) ++ insn = NEXT_INSN (insn); ++ else ++ insn = PREV_INSN (insn); ++ if (!insn) ++ break; + +- /* cfldrd, cfldr64, cfstrd, cfstr64 must +- be followed by a non Cirrus insn. */ +- if (get_attr_cirrus (first) == CIRRUS_DOUBLE) +- { +- if (arm_cirrus_insn_p (next_nonnote_insn (first))) +- emit_insn_after (gen_nop (), first); ++ if (GET_CODE (insn) == INSN) ++ { ++ l = get_attr_length (insn) / 4; ++ if (l) ++ break; ++ } ++ else if (GET_CODE (insn) == JUMP_INSN) ++ { ++ l = 1; ++ t = is_jump_table (insn); ++ if (t) ++ l += get_jump_table_size (t) / 4; ++ break; ++ } ++ else if (GET_CODE (insn) == CALL_INSN) ++ { ++ l = 1; ++ break; ++ } ++ } + +- return; +- } +- else if (arm_memory_load_p (first)) +- { +- unsigned int arm_regno; ++ if (len) ++ *len = l; + +- /* Any ldr/cfmvdlr, ldr/cfmvdhr, ldr/cfmvsr, ldr/cfmv64lr, +- ldr/cfmv64hr combination where the Rd field is the same +- in both instructions must be split with a non Cirrus +- insn. Example: +- +- ldr r0, blah +- nop +- cfmvsr mvf0, r0. */ +- +- /* Get Arm register number for ldr insn. */ +- if (GET_CODE (lhs) == REG) +- arm_regno = REGNO (lhs); +- else +- { +- gcc_assert (GET_CODE (rhs) == REG); +- arm_regno = REGNO (rhs); +- } ++ return insn; ++} + +- /* Next insn. */ +- first = next_nonnote_insn (first); ++static rtx ++cirrus_prev_mach_insn (rtx insn, int *len) ++{ ++ return cirrus_prev_next_mach_insn (insn, len, 0); ++} + +- if (! arm_cirrus_insn_p (first)) +- return; ++static rtx ++cirrus_next_mach_insn (rtx insn, int *len) ++{ ++ return cirrus_prev_next_mach_insn (insn, len, 1); ++} + +- body = PATTERN (first); ++/* Cirrus reorg for branch slots. */ ++static void ++cirrus_reorg_branch (rtx insn) ++{ ++ rtx t; ++ int nops, l; + +- /* (float (blah)) is in parallel with a clobber. */ +- if (GET_CODE (body) == PARALLEL && XVECLEN (body, 0)) +- body = XVECEXP (body, 0, 0); +- +- if (GET_CODE (body) == FLOAT) +- body = XEXP (body, 0); +- +- if (get_attr_cirrus (first) == CIRRUS_MOVE +- && GET_CODE (XEXP (body, 1)) == REG +- && arm_regno == REGNO (XEXP (body, 1))) +- emit_insn_after (gen_nop (), first); ++ /* TODO: handle jump-tables. */ ++ t = is_jump_table (insn); ++ if (t) ++ return; ++ ++ /* Any branch must be followed by 2 non Cirrus instructions. */ ++ t = insn; ++ for (nops = 2; nops > 0; ) ++ { ++ if (!cirrus_next_mach_insn (t, 0)) ++ { ++ insn = t; ++ break; ++ } ++ t = cirrus_next_mach_insn (t, &l); ++ if (arm_cirrus_insn_p (t)) ++ break; ++ nops -= l; + +- return; +- } + } + +- /* get_attr cannot accept USE or CLOBBER. */ +- if (!first +- || GET_CODE (first) != INSN +- || GET_CODE (PATTERN (first)) == USE +- || GET_CODE (PATTERN (first)) == CLOBBER) +- return; ++ while (nops-- > 0) ++ emit_insn_after (gen_nop (), insn); /* WARNING: this appears to cause "bad immediate value for offset" errors in the assembler */ ++} + +- attr = get_attr_cirrus (first); ++/* Cirrus reorg for bug #1 (cirrus + cfcmpxx). */ ++static void ++cirrus_reorg_bug1 (rtx insn) ++{ ++ rtx body = PATTERN (insn), body2; ++ rtx t; ++ int i, nops, l; ++ enum attr_cirrus attr; + +- /* Any coprocessor compare instruction (cfcmps, cfcmpd, ...) +- must be followed by a non-coprocessor instruction. */ +- if (attr == CIRRUS_COMPARE) ++ /* Check if destination or clobber is Cirrus register. */ ++ if (GET_CODE (body) == PARALLEL) + { +- nops = 0; +- +- t = next_nonnote_insn (first); ++ for (i = 0; i < XVECLEN (body, 0); i++) ++ { ++ body2 = XVECEXP (body, 0, i); ++ if (GET_CODE (body2) == SET) ++ { ++ if (cirrus_dest_regn_p (body2, LAST_CIRRUS_FP_REGNUM)) ++ { ++ nops = 5; ++ goto fix; ++ } ++ } ++ else if (GET_CODE (body2) == CLOBBER) ++ { ++ if (cirrus_dest_regn_p (body2, LAST_CIRRUS_FP_REGNUM)) ++ { ++ nops = 4; ++ goto fix; ++ } ++ } ++ } ++ } ++ else if (GET_CODE (body) == SET) ++ { ++ if (cirrus_dest_regn_p (body, LAST_CIRRUS_FP_REGNUM)) ++ { ++ nops = 5; ++ goto fix; ++ } ++ } ++ return; + +- if (arm_cirrus_insn_p (t)) +- ++ nops; ++fix: ++ t = insn; ++ for ( ; nops > 0; ) ++ { ++ t = cirrus_next_mach_insn (t, &l); ++ if (!t) ++ break; ++ if (GET_CODE (t) == JUMP_INSN ++ || GET_CODE (t) == CALL_INSN) ++ { ++ nops -= l; ++ break; ++ } ++ else if (arm_cirrus_insn_p (t)) ++ { ++ attr = get_attr_cirrus (t); ++ if (attr == CIRRUS_COMPARE) ++ break; ++ } ++ nops -= l; ++ } + +- if (arm_cirrus_insn_p (next_nonnote_insn (t))) +- ++ nops; ++ while (nops-- > 0) ++ emit_insn_after (gen_nop (), insn); /* WARNING: this appears to cause "bad immediate value for offset" errors in the assembler */ ++} + +- while (nops --) +- emit_insn_after (gen_nop (), first); ++/* Cirrus reorg for bugs #10 and #12 (data aborts). */ ++static void ++cirrus_reorg_bug10_12 (rtx insn) ++{ ++ rtx t; + +- return; +- } ++ t = cirrus_next_mach_insn (insn, 0); ++ if (arm_cirrus_insn_p (t)) ++ if (TARGET_CIRRUS_D0 || ++ get_attr_cirrus (t) == CIRRUS_DOUBLE) ++ emit_insn_after (gen_nop (), insn); /* WARNING: this appears to cause "bad immediate value for offset" errors in the assembler */ + } + + /* Return TRUE if X references a SYMBOL_REF. */ +@@ -7727,7 +7796,7 @@ + { + Mnode * mp; + Mnode * nmp; +- int align64 = 0; ++ int align64 = 0, stuffnop = 0; + + if (ARM_DOUBLEWORD_ALIGN) + for (mp = minipool_vector_head; mp != NULL; mp = mp->next) +@@ -7742,8 +7811,27 @@ + ";; Emitting minipool after insn %u; address %ld; align %d (bytes)\n", + INSN_UID (scan), (unsigned long) minipool_barrier->address, align64 ? 8 : 4); + ++ /* Check if branch before minipool is already stuffed with nops. */ ++ if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) ++ { ++ rtx t; ++ ++ t = prev_active_insn (scan); ++ if (GET_CODE (t) != INSN ++ || PATTERN (t) != const0_rtx) ++ stuffnop = 1; ++ } + scan = emit_label_after (gen_label_rtx (), scan); + scan = emit_insn_after (align64 ? gen_align_8 () : gen_align_4 (), scan); ++ /* Last instruction was branch, so put two non-Cirrus opcodes. */ ++ if (stuffnop) ++ { ++#if TARGET_CIRRUS /* This is doubling up on nops, so I don't think this is a good idea */ ++ emit_insn_before (gen_nop (), scan); /* WARNING: this appears to cause "bad immediate value for offset" errors in the assembler */ ++ emit_insn_before (gen_nop (), scan); /* WARNING: this appears to cause "bad immediate value for offset" errors in the assembler */ ++#endif ++ } ++ + scan = emit_label_after (minipool_vector_label, scan); + + for (mp = minipool_vector_head; mp != NULL; mp = nmp) +@@ -8151,15 +8239,38 @@ + gcc_assert (GET_CODE (insn) == NOTE); + minipool_pad = 0; + ++#if TARGET_CIRRUS /* I think this is a double-up */ ++ /* Scan all the insn and fix Cirrus issues. */ ++ if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) ++ { ++ rtx t, s; ++ ++ for (t = cirrus_next_mach_insn (insn, 0); t; t = cirrus_next_mach_insn (t, 0)) ++ if (arm_mem_access_p (t)) ++ cirrus_reorg_bug10_12 (t); ++ ++ if (TARGET_CIRRUS_D0) ++ for (t = cirrus_next_mach_insn (insn, 0); t; t = cirrus_next_mach_insn (t, 0)) ++ if (arm_cirrus_insn_p (t)) ++ cirrus_reorg_bug1 (t); ++ ++ /* Find last insn. */ ++ for (t = insn; ; t = s) ++ { ++ s = cirrus_next_mach_insn (t, 0); ++ if (!s) ++ break; ++ } ++ /* Scan backward and fix branches. - WARNING: appears to cause "bad immediate value for offset" problems! */ ++ for ( ; t; t = cirrus_prev_mach_insn (t, 0)) ++ if (GET_CODE (t) == JUMP_INSN ++ || GET_CODE (t) == CALL_INSN) ++ cirrus_reorg_branch (t); ++ } ++#endif + /* Scan all the insns and record the operands that will need fixing. */ + for (insn = next_nonnote_insn (insn); insn; insn = next_nonnote_insn (insn)) + { +- if (TARGET_CIRRUS_FIX_INVALID_INSNS +- && (arm_cirrus_insn_p (insn) +- || GET_CODE (insn) == JUMP_INSN +- || arm_memory_load_p (insn))) +- cirrus_reorg (insn); +- + if (GET_CODE (insn) == BARRIER) + push_minipool_barrier (insn, address); + else if (INSN_P (insn)) +@@ -11755,16 +11910,10 @@ + || get_attr_conds (this_insn) != CONDS_NOCOND) + fail = TRUE; + +- /* A conditional cirrus instruction must be followed by +- a non Cirrus instruction. However, since we +- conditionalize instructions in this function and by +- the time we get here we can't add instructions +- (nops), because shorten_branches() has already been +- called, we will disable conditionalizing Cirrus +- instructions to be safe. */ +- if (GET_CODE (scanbody) != USE +- && GET_CODE (scanbody) != CLOBBER +- && get_attr_cirrus (this_insn) != CIRRUS_NOT) ++ /* To avoid erratic behaviour, we avoid conditional Cirrus ++ instructions when doing workarounds. */ ++ if (arm_cirrus_insn_p(this_insn) ++ && (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1)) + fail = TRUE; + break; + +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.h gcc-4.1.2/gcc/config/arm/arm.h +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.h 2005-11-05 01:02:51.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.h 2007-05-15 10:15:05.000000000 +1000 +@@ -5,6 +5,7 @@ + and Martin Simmons (@harleqn.co.uk). + More major hacks by Richard Earnshaw (rearnsha@arm.com) + Minor hacks by Nick Clifton (nickc@cygnus.com) ++ Cirrus Crunch fixes by Vladimir Ivanov (vladitx@nucleusys.com) + + This file is part of GCC. + +@@ -140,7 +141,9 @@ + %{msoft-float:%{mhard-float: \ + %e-msoft-float and -mhard_float may not be used together}} \ + %{mbig-endian:%{mlittle-endian: \ +- %e-mbig-endian and -mlittle-endian may not be used together}}" ++ %e-mbig-endian and -mlittle-endian may not be used together}} \ ++%{mfix-crunch-d0:%{mfix-crunch-d1: \ ++ %e-mfix-crunch-d0 and -mfix-crunch-d1 may not be used together}}" + + #ifndef CC1_SPEC + #define CC1_SPEC "" +@@ -179,6 +182,9 @@ + #define TARGET_HARD_FLOAT_ABI (arm_float_abi == ARM_FLOAT_ABI_HARD) + #define TARGET_FPA (arm_fp_model == ARM_FP_MODEL_FPA) + #define TARGET_MAVERICK (arm_fp_model == ARM_FP_MODEL_MAVERICK) ++#define TARGET_CIRRUS (arm_arch_cirrus) ++#define TARGET_CIRRUS_D0 0 /* (target_flags & ARM_FLAG_CIRRUS_D0) */ ++#define TARGET_CIRRUS_D1 1 /* (target_flags & ARM_FLAG_CIRRUS_D1) */ + #define TARGET_VFP (arm_fp_model == ARM_FP_MODEL_VFP) + #define TARGET_IWMMXT (arm_arch_iwmmxt) + #define TARGET_REALLY_IWMMXT (TARGET_IWMMXT && TARGET_ARM) +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.opt gcc-4.1.2/gcc/config/arm/arm.opt +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.opt 2005-11-05 01:02:51.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.opt 2007-05-15 10:09:31.000000000 +1000 +@@ -68,6 +68,14 @@ + Target Report Mask(CIRRUS_FIX_INVALID_INSNS) + Cirrus: Place NOPs to avoid invalid instruction combinations + ++fix-crunch-d0 ++Target Report Mask(ARM_FLAG_CIRRUS_D0) ++Cirrus: workarounds for Crunch coprocessor revision D0 ++ ++fix-crunch-d1 ++Target Report Mask(ARM_FLAG_CIRRUS_D1) ++Cirrus: workarounds for Crunch coprocessor revision D1 ++ + mcpu= + Target RejectNegative Joined + Specify the name of the target CPU +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/doc/invoke.texi gcc-4.1.2/gcc/doc/invoke.texi +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/doc/invoke.texi 2006-09-26 07:21:58.000000000 +1000 ++++ gcc-4.1.2/gcc/doc/invoke.texi 2007-05-15 10:07:04.000000000 +1000 +@@ -408,7 +408,7 @@ + -msingle-pic-base -mno-single-pic-base @gol + -mpic-register=@var{reg} @gol + -mnop-fun-dllimport @gol +--mcirrus-fix-invalid-insns -mno-cirrus-fix-invalid-insns @gol ++-mfix-crunch-d0 -mfix-crunch-d1 @gol + -mpoke-function-name @gol + -mthumb -marm @gol + -mtpcs-frame -mtpcs-leaf-frame @gol +@@ -7435,17 +7435,12 @@ + Specify the register to be used for PIC addressing. The default is R10 + unless stack-checking is enabled, when R9 is used. + +-@item -mcirrus-fix-invalid-insns +-@opindex mcirrus-fix-invalid-insns +-@opindex mno-cirrus-fix-invalid-insns +-Insert NOPs into the instruction stream to in order to work around +-problems with invalid Maverick instruction combinations. This option +-is only valid if the @option{-mcpu=ep9312} option has been used to +-enable generation of instructions for the Cirrus Maverick floating +-point co-processor. This option is not enabled by default, since the +-problem is only present in older Maverick implementations. The default +-can be re-enabled by use of the @option{-mno-cirrus-fix-invalid-insns} +-switch. ++@item -mfix-crunch-d0 ++@itemx -mfix-crunch-d1 ++@opindex mfix-crunch-d0 ++@opindex mfix-crunch-d1 ++Enable workarounds for the Cirrus MaverickCrunch coprocessor revisions ++D0 and D1 respectively. + + @item -mpoke-function-name + @opindex mpoke-function-name diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-geu.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-geu.patch new file mode 100644 index 0000000..3d27cc1 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-geu.patch @@ -0,0 +1,48 @@ +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-08 06:39:41.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-08 06:41:00.000000000 +1000 +@@ -7125,6 +7125,22 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match GEU for MAVERICK. ++(define_insn "*arm_bgeu" ++ [(set (pc) ++ (if_then_else (geu (match_operand 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ if (get_attr_cirrus (prev_active_insn(insn)) == CIRRUS_COMPARE) ++ return \"beq\\t%l0\;bvs\\t%l0\"; else return \"bge\\t%l0\;nop\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ + ; Special pattern to match UNLT for MAVERICK - UGLY since we need to test for Z=0 && V=0. + (define_insn "*arm_bunlt" + [(set (pc) +@@ -7240,6 +7256,22 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match reversed GEU for MAVERICK. ++(define_insn "*arm_bgeu_reversed" ++ [(set (pc) ++ (if_then_else (geu (match_operand 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t.+12\;bvs\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) ++ + ; Special pattern to match reversed UNLT for MAVERICK. + (define_insn "*arm_bunlt_reversed" + [(set (pc) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch new file mode 100644 index 0000000..c4fcdb3 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch @@ -0,0 +1,98 @@ +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-07 14:45:22.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-07 15:13:58.000000000 +1000 +@@ -7001,16 +7001,16 @@ + (if_then_else (unordered (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0, + arm_compare_op1);" + ) + + (define_expand "bordered" + [(set (pc) + (if_then_else (ordered (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0, + arm_compare_op1);" +@@ -7141,6 +7141,38 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match UNORDERED for MAVERICK - UGLY since we need to test for Z=0 && N=0. ++(define_insn "*arm_bunordered" ++ [(set (pc) ++ (if_then_else (unordered (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t.+12\;bmi\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) ++ ++; Special pattern to match ORDERED for MAVERICK. ++(define_insn "*arm_bordered" ++ [(set (pc) ++ (if_then_else (ordered (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bmi\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ + (define_insn "*arm_cond_branch" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7224,6 +7256,37 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match reversed UNORDERED for MAVERICK. ++(define_insn "*arm_bunordered_reversed" ++ [(set (pc) ++ (if_then_else (unordered (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bmi\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++; Special pattern to match reversed ORDERED for MAVERICK - UGLY since we need to test for Z=0 && N=0. ++(define_insn "*arm_bordered_reversed" ++ [(set (pc) ++ (if_then_else (ordered (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t.+12\;bmi\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) + + (define_insn "*arm_cond_branch_reversed" + [(set (pc) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch-z-eq b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch-z-eq new file mode 100644 index 0000000..715fb95 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare-unordered.patch-z-eq @@ -0,0 +1,98 @@ +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-07 14:45:22.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-07 15:13:58.000000000 +1000 +@@ -7001,16 +7001,16 @@ + (if_then_else (unordered (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0, + arm_compare_op1);" + ) + + (define_expand "bordered" + [(set (pc) + (if_then_else (ordered (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0, + arm_compare_op1);" +@@ -7141,6 +7141,38 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match UNORDERED for MAVERICK - UGLY since we need to test for C=0 && N=0 ++(define_insn "*arm_bunordered" ++ [(set (pc) ++ (if_then_else (unordered (match_operand 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bcs\\t.+12\;bmi\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) ++ ++; Special pattern to match ORDERED for MAVERICK. ++(define_insn "*arm_bordered" ++ [(set (pc) ++ (if_then_else (ordered (match_operand 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bcs\\t%l0\;bmi\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ + (define_insn "*arm_cond_branch" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7224,6 +7256,37 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match reversed UNORDERED for MAVERICK. ++(define_insn "*arm_bunordered_reversed" ++ [(set (pc) ++ (if_then_else (unordered (match_operand 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bcs\\t%l0\;bmi\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++; Special pattern to match reversed ORDERED for MAVERICK - UGLY since we need to test for C=0 && N=0 ++(define_insn "*arm_bordered_reversed" ++ [(set (pc) ++ (if_then_else (ordered (match_operand 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bcs\\t.+12\;bmi\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) + + (define_insn "*arm_cond_branch_reversed" + [(set (pc) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch new file mode 100644 index 0000000..ccbb485 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch @@ -0,0 +1,400 @@ +diff -urN gcc-4.1.2/gcc/config/arm/arm.c ../../../../old-tmp/work/arm-oabi-angstrom-linux/gcc-cross-4.1.2-backup/gcc-4.1.2/gcc/config/arm/arm.c +--- gcc-4.1.2/gcc/config/arm/arm.c 2007-05-31 12:39:48.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-05-29 17:19:38.000000000 +1000 +@@ -11427,26 +11427,53 @@ + /* These encodings assume that AC=1 in the FPA system control + byte. This allows us to handle all cases except UNEQ and + LTGT. */ +- switch (comp_code) +- { +- case GE: return ARM_GE; +- case GT: return ARM_GT; +- case LE: return ARM_LS; +- case LT: return ARM_MI; +- case NE: return ARM_NE; +- case EQ: return ARM_EQ; +- case ORDERED: return ARM_VC; +- case UNORDERED: return ARM_VS; +- case UNLT: return ARM_LT; +- case UNLE: return ARM_LE; +- case UNGT: return ARM_HI; +- case UNGE: return ARM_PL; +- /* UNEQ and LTGT do not have a representation. */ +- case UNEQ: /* Fall through. */ +- case LTGT: /* Fall through. */ +- default: gcc_unreachable (); +- } +- ++ if (!TARGET_MAVERICK) ++ { ++ switch (comp_code) ++ { ++ case GE: return ARM_GE; ++ case GT: return ARM_GT; ++ case LE: return ARM_LS; ++ case LT: return ARM_MI; ++ case NE: return ARM_NE; ++ case EQ: return ARM_EQ; ++ case ORDERED: return ARM_VC; ++ case UNORDERED: return ARM_VS; ++ case UNLT: return ARM_LT; ++ case UNLE: return ARM_LE; ++ case UNGT: return ARM_HI; ++ case UNGE: return ARM_PL; ++ /* UNEQ and LTGT do not have a representation. */ ++ case UNEQ: /* Fall through. */ ++ case LTGT: /* Fall through. */ ++ default: gcc_unreachable (); ++ } ++ } ++ else ++ { ++ /* CIRRUS */ ++ switch (comp_code) ++ { ++#if 1 ++ case GT: return ARM_VS; ++ case LE: return ARM_LE; ++ case LT: return ARM_LT; ++ case NE: return ARM_NE; ++ case EQ: return ARM_EQ; ++ case UNLE: return ARM_VC; ++ case UNGT: return ARM_GT; ++ case UNGE: return ARM_GE; ++ case UNEQ: return ARM_PL; ++ case LTGT: return ARM_MI; ++ /* These do not have a representation. */ ++ case GE: /* Fall through. -UNGE wrong atm */ ++ case UNLT: /* Fall through. -LT wrong atm */ ++ case ORDERED: /* Fall through. -AL wrong atm */ ++ case UNORDERED: /* Fall through. -AL wrong atm */ ++#endif ++ default: gcc_unreachable (); ++ } ++ } + case CC_SWPmode: + switch (comp_code) + { +diff -urN gcc-4.1.2/gcc/config/arm/arm.md ../../../../old-tmp/work/arm-oabi-angstrom-linux/gcc-cross-4.1.2-backup/gcc-4.1.2/gcc/config/arm/arm.md +--- gcc-4.1.2/gcc/config/arm/arm.md 2007-05-31 12:39:48.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-05-29 15:17:18.000000000 +1000 +@@ -6952,10 +6952,11 @@ + "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" + ) + ++;broken on cirrus + (define_expand "bge" + [(set (pc) + (if_then_else (ge (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM" ++ "TARGET_ARM" ;; && !(TARGET_HARD_FLOAT && TARGET_MAVERICK) + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" +@@ -6988,6 +6989,7 @@ + "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" + ) + ++; broken on cirrus? + (define_expand "bgeu" + [(set (pc) + (if_then_else (geu (match_dup 1) (const_int 0)) +@@ -7031,14 +7033,15 @@ + (if_then_else (ungt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, arm_compare_op1);" + ) + +-(define_expand "bunlt" ++; broken for cirrus ++(define_expand "bunlt" + [(set (pc) + (if_then_else (unlt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, arm_compare_op1);" +@@ -7049,7 +7052,7 @@ + (if_then_else (unge (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7058,7 +7061,7 @@ + (if_then_else (unle (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7069,7 +7072,7 @@ + (if_then_else (uneq (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ;; || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNEQ, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7078,7 +7081,7 @@ + (if_then_else (ltgt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ;; || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (LTGT, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7086,7 +7089,7 @@ + ;; Patterns to match conditional branch insns. + ;; + +-; Special pattern to match UNEQ. ++; Special pattern to match UNEQ for FPA and VFP. + (define_insn "*arm_buneq" + [(set (pc) + (if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7102,7 +7105,7 @@ + (set_attr "length" "8")] + ) + +-; Special pattern to match LTGT. ++; Special pattern to match LTGT for FPA and VFP. + (define_insn "*arm_bltgt" + [(set (pc) + (if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7118,6 +7121,38 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match GE for MAVERICK. ++(define_insn "*arm_bge" ++ [(set (pc) ++ (if_then_else (ge (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bvs\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++; Special pattern to match UNLT for MAVERICK - UGLY since we need to test for Z=0 && V=0. ++(define_insn "*arm_bunlt" ++ [(set (pc) ++ (if_then_else (unlt (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t.+12\;bvs\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) ++ + (define_insn "*arm_cond_branch" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7137,7 +7172,7 @@ + (set_attr "type" "branch")] + ) + +-; Special pattern to match reversed UNEQ. ++; Special pattern to match reversed UNEQ for FPA and VFP. + (define_insn "*arm_buneq_reversed" + [(set (pc) + (if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7153,7 +7188,7 @@ + (set_attr "length" "8")] + ) + +-; Special pattern to match reversed LTGT. ++; Special pattern to match reversed LTGT for FPA and VFP. + (define_insn "*arm_bltgt_reversed" + [(set (pc) + (if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7169,6 +7204,39 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match reversed GE for MAVERICK - UGLY since we need to tst for Z=0 && N=0. ++(define_insn "*arm_bge_reversed" ++ [(set (pc) ++ (if_then_else (ge (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t.+12\;bvs\\t.+8\;b\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "12")] ++) ++ ++; Special pattern to match reversed UNLT for MAVERICK. ++(define_insn "*arm_bunlt_reversed" ++ [(set (pc) ++ (if_then_else (unlt (match_operand:CCFP 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bvs\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++ + (define_insn "*arm_cond_branch_reversed" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7220,8 +7288,9 @@ + "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" + ) + ++;; broken for cirrus - definitely + (define_expand "sge" + [(set (match_operand:SI 0 "s_register_operand" "") + (ge:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM" ++ "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" +@@ -7227,6 +7296,14 @@ + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SGE these can not be represented with MAVERICK ++; (define_expand "sge" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (ge:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "slt" + [(set (match_operand:SI 0 "s_register_operand" "") + (lt:SI (match_dup 1) (const_int 0)))] +@@ -7248,6 +7325,7 @@ + "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" + ) + ++;; broken for cirrus - maybe + (define_expand "sgeu" + [(set (match_operand:SI 0 "s_register_operand" "") + (geu:SI (match_dup 1) (const_int 0)))] +@@ -7255,6 +7333,14 @@ + "operands[1] = arm_gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SGEU these may not be represented with MAVERICK? ++; (define_expand "sgeu" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (ge:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "sltu" + [(set (match_operand:SI 0 "s_register_operand" "") + (ltu:SI (match_dup 1) (const_int 0)))] +@@ -7281,7 +7367,7 @@ + (define_expand "sungt" + [(set (match_operand:SI 0 "s_register_operand" "") + (ungt:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7289,23 +7375,32 @@ + (define_expand "sunge" + [(set (match_operand:SI 0 "s_register_operand" "") + (unge:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, + arm_compare_op1);" + ) + ++; broken for cirrus + (define_expand "sunlt" + [(set (match_operand:SI 0 "s_register_operand" "") + (unlt:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, + arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SUNLT these can't be represented with MAVERICK ++; (define_expand "sunlt" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (unlt:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "sunle" + [(set (match_operand:SI 0 "s_register_operand" "") + (unle:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7371,7 +7466,7 @@ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) + FAIL; + + ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); +@@ -7390,7 +7485,8 @@ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) ++ + FAIL; + + /* When compiling for SOFT_FLOAT, ensure both arms are in registers. +@@ -7409,13 +7505,13 @@ + (if_then_else:DF (match_operand 1 "arm_comparison_operator" "") + (match_operand:DF 2 "s_register_operand" "") + (match_operand:DF 3 "arm_float_add_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + " + { + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code==GE || code == UNLT || code == ORDERED || code == UNORDERED))) + FAIL; + + ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch-z-eq b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch-z-eq new file mode 100644 index 0000000..bc40411 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-compare.patch-z-eq @@ -0,0 +1,400 @@ +diff -urN gcc-4.1.2/gcc/config/arm/arm.c ../../../../old-tmp/work/arm-oabi-angstrom-linux/gcc-cross-4.1.2-backup/gcc-4.1.2/gcc/config/arm/arm.c +--- gcc-4.1.2/gcc/config/arm/arm.c 2007-05-31 12:39:48.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-05-29 17:19:38.000000000 +1000 +@@ -11427,26 +11427,53 @@ + /* These encodings assume that AC=1 in the FPA system control + byte. This allows us to handle all cases except UNEQ and + LTGT. */ +- switch (comp_code) +- { +- case GE: return ARM_GE; +- case GT: return ARM_GT; +- case LE: return ARM_LS; +- case LT: return ARM_MI; +- case NE: return ARM_NE; +- case EQ: return ARM_EQ; +- case ORDERED: return ARM_VC; +- case UNORDERED: return ARM_VS; +- case UNLT: return ARM_LT; +- case UNLE: return ARM_LE; +- case UNGT: return ARM_HI; +- case UNGE: return ARM_PL; +- /* UNEQ and LTGT do not have a representation. */ +- case UNEQ: /* Fall through. */ +- case LTGT: /* Fall through. */ +- default: gcc_unreachable (); +- } +- ++ if (!TARGET_MAVERICK) ++ { ++ switch (comp_code) ++ { ++ case GE: return ARM_GE; ++ case GT: return ARM_GT; ++ case LE: return ARM_LS; ++ case LT: return ARM_MI; ++ case NE: return ARM_NE; ++ case EQ: return ARM_EQ; ++ case ORDERED: return ARM_VC; ++ case UNORDERED: return ARM_VS; ++ case UNLT: return ARM_LT; ++ case UNLE: return ARM_LE; ++ case UNGT: return ARM_HI; ++ case UNGE: return ARM_PL; ++ /* UNEQ and LTGT do not have a representation. */ ++ case UNEQ: /* Fall through. */ ++ case LTGT: /* Fall through. */ ++ default: gcc_unreachable (); ++ } ++ } ++ else ++ { ++ /* CIRRUS */ ++ switch (comp_code) ++ { ++#if 1 ++ case GT: return ARM_VS; ++ case LE: return ARM_LE; ++ case LT: return ARM_LT; ++ case NE: return ARM_NE; ++ case EQ: return ARM_EQ; ++ case UNLE: return ARM_VC; ++ case UNGT: return ARM_GT; ++ case UNGE: return ARM_GE; ++ case UNEQ: return ARM_PL; ++ case LTGT: return ARM_MI; ++ /* These do not have a representation. */ ++ case GE: /* Fall through. -UNGE wrong atm */ ++ case UNLT: /* Fall through. -LT wrong atm */ ++ case ORDERED: /* Fall through. -AL wrong atm */ ++ case UNORDERED: /* Fall through. -AL wrong atm */ ++#endif ++ default: gcc_unreachable (); ++ } ++ } + case CC_SWPmode: + switch (comp_code) + { +diff -urN gcc-4.1.2/gcc/config/arm/arm.md ../../../../old-tmp/work/arm-oabi-angstrom-linux/gcc-cross-4.1.2-backup/gcc-4.1.2/gcc/config/arm/arm.md +--- gcc-4.1.2/gcc/config/arm/arm.md 2007-05-31 12:39:48.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-05-29 15:17:18.000000000 +1000 +@@ -6952,10 +6952,11 @@ + "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" + ) + ++;broken on cirrus + (define_expand "bge" + [(set (pc) + (if_then_else (ge (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM" ++ "TARGET_ARM" + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" +@@ -6988,6 +6989,7 @@ + "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" + ) + ++; broken on cirrus? + (define_expand "bgeu" + [(set (pc) + (if_then_else (geu (match_dup 1) (const_int 0)) +@@ -7031,14 +7033,15 @@ + (if_then_else (ungt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, arm_compare_op1);" + ) + +-(define_expand "bunlt" ++; broken for cirrus ++(define_expand "bunlt" + [(set (pc) + (if_then_else (unlt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, arm_compare_op1);" +@@ -7049,7 +7052,7 @@ + (if_then_else (unge (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7058,7 +7061,7 @@ + (if_then_else (unle (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7069,7 +7072,7 @@ + (if_then_else (uneq (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ;; || TARGET_MAVERICK + "operands[1] = arm_gen_compare_reg (UNEQ, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7078,7 +7081,7 @@ + (if_then_else (ltgt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ;; || TARGET_MAVERICK + "operands[1] = arm_gen_compare_reg (LTGT, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7086,7 +7089,7 @@ + ;; Patterns to match conditional branch insns. + ;; + +-; Special pattern to match UNEQ. ++; Special pattern to match UNEQ for FPA and VFP. + (define_insn "*arm_buneq" + [(set (pc) + (if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7102,7 +7105,7 @@ + (set_attr "length" "8")] + ) + +-; Special pattern to match LTGT. ++; Special pattern to match LTGT for FPA and VFP. + (define_insn "*arm_bltgt" + [(set (pc) + (if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7118,6 +7121,38 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match GE for MAVERICK. ++(define_insn "*arm_bge" ++ [(set (pc) ++ (if_then_else (ge (match_operand 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bvs\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++; Special pattern to match UNLT for MAVERICK. ++(define_insn "*arm_bunlt" ++ [(set (pc) ++ (if_then_else (unlt (match_operand 1 "cc_register" "") (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bne\\t%l0\;bvc\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ + (define_insn "*arm_cond_branch" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7137,7 +7172,7 @@ + (set_attr "type" "branch")] + ) + +-; Special pattern to match reversed UNEQ. ++; Special pattern to match reversed UNEQ for FPA and VFP. + (define_insn "*arm_buneq_reversed" + [(set (pc) + (if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7153,7 +7188,7 @@ + (set_attr "length" "8")] + ) + +-; Special pattern to match reversed LTGT. ++; Special pattern to match reversed LTGT for FPA and VFP. + (define_insn "*arm_bltgt_reversed" + [(set (pc) + (if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0)) +@@ -7169,6 +7204,39 @@ + (set_attr "length" "8")] + ) + ++; Special pattern to match reversed GE for MAVERICK. ++(define_insn "*arm_bge_reversed" ++ [(set (pc) ++ (if_then_else (ge (match_operand 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"bne\\t%l0\;bvc\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++; Special pattern to match reversed UNLT for MAVERICK. ++(define_insn "*arm_bunlt_reversed" ++ [(set (pc) ++ (if_then_else (unlt (match_operand 1 "cc_register" "") (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "TARGET_ARM && (TARGET_MAVERICK)" ++ "* ++ gcc_assert (!arm_ccfsm_state); ++ ++ return \"beq\\t%l0\;bvs\\t%l0\"; ++ " ++ [(set_attr "conds" "jump_clob") ++ (set_attr "length" "8")] ++) ++ ++ + (define_insn "*arm_cond_branch_reversed" + [(set (pc) + (if_then_else (match_operator 1 "arm_comparison_operator" +@@ -7220,8 +7288,9 @@ + "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" + ) + ++;; broken for cirrus - definitely + (define_expand "sge" + [(set (match_operand:SI 0 "s_register_operand" "") + (ge:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM" ++ "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" +@@ -7227,6 +7296,14 @@ + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SGE these can not be represented with MAVERICK ++; (define_expand "sge" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (ge:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "slt" + [(set (match_operand:SI 0 "s_register_operand" "") + (lt:SI (match_dup 1) (const_int 0)))] +@@ -7248,6 +7325,7 @@ + "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" + ) + ++;; broken for cirrus - maybe + (define_expand "sgeu" + [(set (match_operand:SI 0 "s_register_operand" "") + (geu:SI (match_dup 1) (const_int 0)))] +@@ -7255,6 +7333,14 @@ + "operands[1] = arm_gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SGEU these may not be represented with MAVERICK? ++; (define_expand "sgeu" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (ge:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "sltu" + [(set (match_operand:SI 0 "s_register_operand" "") + (ltu:SI (match_dup 1) (const_int 0)))] +@@ -7281,7 +7367,7 @@ + (define_expand "sungt" + [(set (match_operand:SI 0 "s_register_operand" "") + (ungt:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7289,23 +7375,32 @@ + (define_expand "sunge" + [(set (match_operand:SI 0 "s_register_operand" "") + (unge:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, + arm_compare_op1);" + ) + ++; broken for cirrus + (define_expand "sunlt" + [(set (match_operand:SI 0 "s_register_operand" "") + (unlt:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, + arm_compare_op1);" + ) + ++;;; DO NOT add patterns for SUNLT these can't be represented with MAVERICK ++; (define_expand "sunlt" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (unlt:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && (TARGET_MAVERICK)" ++; "gcc_unreachable ();" ++; ) ++ + (define_expand "sunle" + [(set (match_operand:SI 0 "s_register_operand" "") + (unle:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7371,7 +7466,7 @@ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if (code == UNEQ || code == LTGT || code == GE || code == UNLT || code == ORDERED || code == UNORDERED) + FAIL; + + ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); +@@ -7390,7 +7485,8 @@ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if (code == UNEQ || code == LTGT || code == GE || code == UNLT || code == ORDERED || code == UNORDERED) ++ + FAIL; + + /* When compiling for SOFT_FLOAT, ensure both arms are in registers. +@@ -7409,13 +7505,13 @@ + (if_then_else:DF (match_operand 1 "arm_comparison_operator" "") + (match_operand:DF 2 "s_register_operand" "") + (match_operand:DF 3 "arm_float_add_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + " + { + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg; + +- if (code == UNEQ || code == LTGT) ++ if (code == UNEQ || code == LTGT || code == GE || code == UNLT || code == ORDERED || code == UNORDERED) + FAIL; + + ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-dominance.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-dominance.patch new file mode 100644 index 0000000..517ca8d --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-dominance.patch @@ -0,0 +1,12 @@ +--- gcc-4.1.2/gcc/config/arm/arm.c-original 2007-06-13 11:50:10.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-06-13 11:50:56.000000000 +1000 +@@ -6556,6 +6556,9 @@ + enum rtx_code cond1, cond2; + int swapped = 0; + ++ if (TARGET_MAVERICK) // Simple hack for MAVERICK ++ return CCmode; ++ + /* Currently we will probably get the wrong result if the individual + comparisons are not simple. This also ensures that it is safe to + reverse a comparison if necessary. */ diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754-div.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754-div.patch new file mode 100644 index 0000000..940f4a6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754-div.patch @@ -0,0 +1,139 @@ +--- gcc-4.1.2/gcc/config/arm/ieee754-df-original.S 2007-06-25 10:22:06.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/ieee754-df.S 2007-06-25 10:27:17.000000000 +1000 +@@ -717,6 +717,10 @@ + cmn r4, #(53 + 1) + movle xl, #0 + bicle xh, xh, #0x7fffffff ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" le + + @ Find out proper shift value. +@@ -738,6 +742,10 @@ + adc xh, r2, xh, lsr r4 + orrs lr, lr, r3, lsl #1 + biceq xl, xl, r3, lsr #31 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + @ shift result right of 21 to 31 bits, or left 11 to 1 bits after +@@ -752,6 +760,10 @@ + adc xh, xh, #0 + orrs lr, lr, r3, lsl #1 + biceq xl, xl, r3, lsr #31 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + @ Shift value right of 32 to 64 bits, or 0 to 32 bits after a switch +@@ -766,6 +778,10 @@ + add xl, xl, r3, lsr #31 + orrs lr, lr, r3, lsl #1 + biceq xl, xl, r3, lsr #31 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + @ One or both arguments are denormalized. +@@ -808,6 +824,10 @@ + eor xh, xh, yh + bic xh, xh, #0x7fffffff + mov xl, #0 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + 1: @ One or both args are INF or NAN. +@@ -837,12 +857,20 @@ + orr xh, xh, #0x7f000000 + orr xh, xh, #0x00f00000 + mov xl, #0 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + @ Return a quiet NAN. + LSYM(Lml_n): + orr xh, xh, #0x7f000000 + orr xh, xh, #0x00f80000 ++#ifdef __MAVERICK__ ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM "r4, r5, r6" + + FUNC_END aeabi_dmul +--- gcc-4.1.2/gcc/config/arm/ieee754-sf-original.S 2007-06-25 10:18:52.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/ieee754-sf.S 2007-06-25 10:40:25.000000000 +1000 +@@ -518,6 +518,9 @@ + @ Check if denormalized result is possible, otherwise return signed 0. + cmn r2, #(24 + 1) + bicle r0, r0, #0x7fffffff ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RETc(le) + + @ Shift value right, round, etc. +@@ -530,6 +533,9 @@ + adc r0, r0, #0 + orrs r3, r3, ip, lsl #1 + biceq r0, r0, ip, lsr #31 ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RET + + @ One or both arguments are denormalized. +@@ -567,6 +573,9 @@ + LSYM(Lml_z): + eor r0, r0, r1 + bic r0, r0, #0x7fffffff ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RET + + 1: @ One or both args are INF or NAN. +@@ -595,12 +604,18 @@ + and r0, r0, #0x80000000 + orr r0, r0, #0x7f000000 + orr r0, r0, #0x00800000 ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RET + + @ Return a quiet NAN. + LSYM(Lml_n): + orr r0, r0, #0x7f000000 + orr r0, r0, #0x00c00000 ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RET + + FUNC_END aeabi_fmul +@@ -677,6 +692,9 @@ + adds r2, r2, #127 + rsbgts r3, r2, #255 + orrgt r0, r0, r2, lsl #23 ++#ifdef __MAVERICK__ ++ cfmvsr mvf0, r0 ++#endif + RETc(gt) + + orr r0, r0, #0x00800000 diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754.patch new file mode 100644 index 0000000..e4929fa --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi-ieee754.patch @@ -0,0 +1,100 @@ +--- ../gcc-cross-4.1.2-r4-unpatched/gcc-4.1.2/gcc/config/arm/ieee754-df.S 2007-06-07 13:06:52.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/ieee754-df.S 2007-06-07 13:15:49.000000000 +1000 +@@ -42,8 +42,9 @@ + + + @ For FPA, float words are always big-endian. ++@ For MAVERICK, float words are always little-endian. + @ For VFP, floats words follow the memory system mode. +-#if defined(__VFP_FP__) && !defined(__ARMEB__) ++#if ((defined(__VFP_FP__) && !defined(__ARMEB__)) || defined(__MAVERICK__)) + #define xl r0 + #define xh r1 + #define yl r2 +@@ -451,8 +452,13 @@ + + orrs r2, r0, r1 + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) ++#if defined (__FPA_FP__) + mvfeqd f0, #0.0 + #endif ++#if defined (__MAVERICK__) ++ cfstrd mvd0, #0.0 ++#endif ++#endif + RETc(eq) + + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) +@@ -473,8 +479,13 @@ + + orrs r2, r0, r1 + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) ++#if defined (__FPA_FP__) + mvfeqd f0, #0.0 + #endif ++#if defined (__MAVERICK__) ++ cfstrd mvd0, #0.0 ++#endif ++#endif + RETc(eq) + + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) +@@ -526,8 +537,14 @@ + @ Legacy code expects the result to be returned in f0. Copy it + @ there as well. + LSYM(f0_ret): ++#if defined (__FPA_FP__) + stmfd sp!, {r0, r1} + ldfd f0, [sp], #8 ++#endif ++#if defined (__MAVERICK__) ++ cfmvdlr mvd0, xl ++ cfmvdhr mvd0, xh ++#endif + RETLDM + + #endif +--- ../gcc-cross-4.1.2-r4-unpatched/gcc-4.1.2/gcc/config/arm/ieee754-sf.S 2007-06-07 13:06:52.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/ieee754-sf.S 2007-06-07 13:21:43.000000000 +1000 +@@ -302,8 +302,13 @@ + + orrs r2, r0, r1 + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) ++#if defined (__FPA_FP__) + mvfeqs f0, #0.0 + #endif ++#if defined (__MAVERICK__) ++ cfmvsr mvf0, #0.0 ++#endif ++#endif + RETc(eq) + + mov r3, #0 +@@ -314,8 +319,13 @@ + + orrs r2, r0, r1 + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) ++#if defined (__FPA_FP__) + mvfeqs f0, #0.0 + #endif ++#if defined (__MAVERICK__) ++ cfmvsr mvf0, #0.0 ++#endif ++#endif + RETc(eq) + + ands r3, ah, #0x80000000 @ sign bit in r3 +@@ -387,8 +397,13 @@ + #if !defined (__VFP_FP__) && !defined(__SOFTFP__) + + LSYM(f0_ret): ++#if defined (__FPA_FP__) + str r0, [sp, #-4]! + ldfs f0, [sp], #4 ++#endif ++#if defined (__MAVERICK__) ++ cfmvsr mvf0, r0 ++#endif + RETLDM + + #endif diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi.patch new file mode 100644 index 0000000..f8992ed --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-eabi.patch @@ -0,0 +1,64 @@ +--- /home/hwilliams/original/gcc-4.1.2/gcc/config/arm/t-linux-eabi 2005-10-10 11:04:31.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/t-linux-eabi 2007-05-15 13:53:05.000000000 +1000 +@@ -1,11 +1,21 @@ + # These functions are included in shared libraries. + TARGET_LIBGCC2_CFLAGS = -fPIC ++TARGET_LIBGCC2_CFLAGS += -mcpu=ep9312 -mfpu=maverick ++LIBGCC2_DEBUG_CFLAGS = -g0 + + # We do not build a Thumb multilib for Linux because the definition of + # CLEAR_INSN_CACHE in linux-gas.h does not work in Thumb mode. + MULTILIB_OPTIONS = + MULTILIB_DIRNAMES = + ++LIB1ASMSRC = arm/lib1funcs.asm ++LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi ++ ++CRTSTUFF_T_CFLAGS += -mcpu=ep9312 -mfpu=maverick ++ + # Use a version of div0 which raises SIGFPE. + LIB1ASMFUNCS := $(filter-out _dvmd_tls,$(LIB1ASMFUNCS)) _dvmd_lnx + +diff -ruN arm/elf.h gcc-3.4.3/gcc/config/arm/elf.h +--- ../gcc-4.1.2-orig/gcc/config/arm/elf.h 2004-02-24 16:25:22.000000000 +0200 ++++ gcc-4.1.2/gcc/config/arm/elf.h 2005-02-10 00:31:28.000000000 +0200 +@@ -46,7 +46,7 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat}" ++%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa} %{mcpu=ep9312:-mfpu=maverick}" + #endif + + #ifndef ASM_SPEC +diff -ruN t-linux gcc-4.1.2/gcc/config/arm/t-linux +--- t-linux 2007-05-09 16:32:28.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/t-linux 2007-05-25 11:02:17.000000000 +1000 +@@ -1,19 +1,22 @@ + # Just for these, we omit the frame pointer since it makes such a big + # difference. It is then pointless adding debugging. + TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC ++TARGET_LIBGCC2_CFLAGS += -mcpu=ep9312 -mfpu=maverick -mfloat-abi=softfp -D__MAVERICK__ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm + LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ +- _call_via_rX \ +- _fixsfsi _fixunssfsi _floatdidf _floatdisf ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float + + # EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o + ++# EXTRA_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o ++CRTSTUFF_T_CFLAGS += -mcpu=ep9312 -mfpu=maverick -mfloat-abi=softfp -D__MAVERICK__ ++ + # LIBGCC = stmp-multilib + # INSTALL_LIBGCC = install-multilib diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable-single.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable-single.patch new file mode 100644 index 0000000..cdd5224 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable-single.patch @@ -0,0 +1,38 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-cfcvt 2007-06-25 12:12:39.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-25 12:16:13.000000000 +1000 +@@ -301,13 +301,14 @@ + ) + + ;; Convert Cirrus-SI to Cirrus-SF ++; appears to be buggy + (define_insn "cirrus_floatsisf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float:SF (match_operand:SI 1 "s_register_operand" "r"))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2" + [(set_attr "length" "8") + (set_attr "cirrus" "move")] + ) + +--- gcc-4.1.2/gcc/config/arm/arm.md-cfcvt 2007-06-25 12:16:53.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-25 12:18:20.000000000 +1000 +@@ -3125,14 +3125,15 @@ + + ;; Fixed <--> Floating conversion insns + ++;; Maverick Crunch floatsisf2 is buggy - see cirrus.md + (define_expand "floatsisf2" + [(set (match_operand:SF 0 "s_register_operand" "") + (float:SF (match_operand:SI 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + emit_insn (gen_cirrus_floatsisf2 (operands[0], operands[1])); + DONE; + } + ") diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable.patch new file mode 100644 index 0000000..aa54ec3 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatsi-disable.patch @@ -0,0 +1,61 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-cfcvt 2007-06-25 12:12:39.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-25 12:16:13.000000000 +1000 +@@ -301,21 +301,23 @@ + ) + + ;; Convert Cirrus-SI to Cirrus-SF ++; appears to be buggy + (define_insn "cirrus_floatsisf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (float:SF (match_operand:SI 1 "s_register_operand" "r"))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmv64lr%?\\t%Z2, %1\;cfcvt32s%?\\t%V0, %Y2" + [(set_attr "length" "8") + (set_attr "cirrus" "move")] + ) + ++;appears to be buggy + (define_insn "cirrus_floatsidf2" + [(set (match_operand:DF 0 "cirrus_fp_register" "=v") + (float:DF (match_operand:SI 1 "s_register_operand" "r"))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfmv64lr%?\\t%Z2, %1\;cfcvt32d%?\\t%V0, %Y2" + [(set_attr "length" "8") + (set_attr "cirrus" "move")] +--- gcc-4.1.2/gcc/config/arm/arm.md-cfcvt 2007-06-25 12:16:53.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-25 12:18:20.000000000 +1000 +@@ -3125,24 +3125,26 @@ + + ;; Fixed <--> Floating conversion insns + ++;; Maverick Crunch floatsisf2 is buggy - see cirrus.md + (define_expand "floatsisf2" + [(set (match_operand:SF 0 "s_register_operand" "") + (float:SF (match_operand:SI 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + emit_insn (gen_cirrus_floatsisf2 (operands[0], operands[1])); + DONE; + } + ") + ++;; Maverick Crunch floatsidf2 is buggy - see cirrus.md + (define_expand "floatsidf2" + [(set (match_operand:DF 0 "s_register_operand" "") + (float:DF (match_operand:SI 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " +- if (TARGET_MAVERICK) ++ if (TARGET_MAVERICK && 0) + { + emit_insn (gen_cirrus_floatsidf2 (operands[0], operands[1])); + DONE; diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatunsidf.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatunsidf.patch new file mode 100644 index 0000000..2fe2254 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-floatunsidf.patch @@ -0,0 +1,37 @@ +--- gcc-4.1.2/gcc/config/arm/ieee754-df-original.S 2007-06-25 14:05:35.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/ieee754-df.S 2007-06-25 14:08:03.000000000 +1000 +@@ -382,6 +382,8 @@ + FUNC_END aeabi_dadd + FUNC_END adddf3 + ++#ifndef __MAVERICK__ /* THIS IS A BAD HACK */ ++ + ARM_FUNC_START floatunsidf + ARM_FUNC_ALIAS aeabi_ui2d floatunsidf + +@@ -401,8 +403,14 @@ + FUNC_END aeabi_ui2d + FUNC_END floatunsidf + ++#endif ++ + ARM_FUNC_START floatsidf + ARM_FUNC_ALIAS aeabi_i2d floatsidf ++#ifdef __MAVERICK__ /* THIS IS A BAD HACK */ ++ARM_FUNC_ALIAS floatunsidf floatsidf ++ARM_FUNC_ALIAS aeabi_ui2d floatsidf ++#endif + + teq r0, #0 + moveq r1, #0 +@@ -418,6 +426,10 @@ + mov xh, #0 + b LSYM(Lad_l) + ++#ifdef __MAVERICK__ /* THIS IS A BAD HACK */ ++ FUNC_END aeabi_ui2d floatsidf ++ FUNC_END floatunsidf floatsidf ++#endif + FUNC_END aeabi_i2d + FUNC_END floatsidf + diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-fp_consts.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-fp_consts.patch new file mode 100644 index 0000000..5f289bb --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-fp_consts.patch @@ -0,0 +1,13 @@ +--- gcc-4.1.2/gcc/config/arm/arm.c-original 2007-06-12 16:17:14.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-06-12 16:17:28.000000000 +1000 +@@ -5218,7 +5218,9 @@ + int i; + REAL_VALUE_TYPE r; + ++ if (TARGET_MAVERICK) ++ fp_consts_inited = 0; +- if (TARGET_VFP) ++ else if (TARGET_VFP) + fp_consts_inited = 1; + else + fp_consts_inited = 8; diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg.patch new file mode 100644 index 0000000..f14ae01 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg.patch @@ -0,0 +1,30 @@ +WARNING: adding this patch causes copysign1.c and mzero3.c to fail... +diff -urN gcc-4.1.2/gcc/config/arm/arm.md-original gcc-4.1.2/gcc/config/arm/arm.md +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-12 12:48:14.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-12 12:49:53.000000000 +1000 +@@ -2985,14 +2985,14 @@ + (define_expand "negsf2" + [(set (match_operand:SF 0 "s_register_operand" "") + (neg:SF (match_operand:SF 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "" + ) + + (define_expand "negdf2" + [(set (match_operand:DF 0 "s_register_operand" "") + (neg:DF (match_operand:DF 1 "s_register_operand" "")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "") + + ;; abssi2 doesn't really clobber the condition codes if a different register +@@ -4097,7 +4097,7 @@ + [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m") + (match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,r"))] + "TARGET_ARM +- && !(TARGET_HARD_FLOAT && (TARGET_MAVERICK || TARGET_VFP)) ++ && !(TARGET_HARD_FLOAT && (TARGET_MAVERICK || TARGET_VFP || TARGET_MAVERICK)) + && !TARGET_IWMMXT" + "* + switch (which_alternative) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg2.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg2.patch new file mode 100644 index 0000000..4fd91f3 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-neg2.patch @@ -0,0 +1,25 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-original 2007-06-12 17:01:24.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-12 17:03:26.000000000 +1000 +@@ -255,18 +256,20 @@ + [(set_attr "cirrus" "normal")] + ) + ++;; appears to be buggy: neg 0 != -0 + (define_insn "*cirrus_negsf2" + [(set (match_operand:SF 0 "cirrus_fp_register" "=v") + (neg:SF (match_operand:SF 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfnegs%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")] + ) + ++;; appears to be buggy: neg 0 != -0 + (define_insn "*cirrus_negdf2" + [(set (match_operand:DF 0 "cirrus_fp_register" "=v") + (neg:DF (match_operand:DF 1 "cirrus_fp_register" "v")))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cfnegd%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")] + ) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-offset.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-offset.patch new file mode 100644 index 0000000..3a40f0d --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-offset.patch @@ -0,0 +1,20 @@ +--- gcc-4.1.2/gcc/config/arm/arm.c-original 2007-06-12 14:46:20.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-06-12 14:48:06.000000000 +1000 +@@ -3460,7 +3460,7 @@ + + use_ldrd = (TARGET_LDRD + && (mode == DImode +- || (mode == DFmode && (TARGET_SOFT_FLOAT || TARGET_VFP)))); ++ || (mode == DFmode && (TARGET_SOFT_FLOAT || TARGET_MAVERICK || TARGET_VFP)))); + + if (code == POST_INC || code == PRE_DEC + || ((code == PRE_INC || code == POST_DEC) +@@ -3960,7 +3960,7 @@ + /* VFP addressing modes actually allow greater offsets, but for + now we just stick with the lowest common denominator. */ + if (mode == DImode +- || ((TARGET_SOFT_FLOAT || TARGET_VFP) && mode == DFmode)) ++ || ((TARGET_SOFT_FLOAT || TARGET_MAVERICK || TARGET_VFP) && mode == DFmode)) + { + low_n = n & 0x0f; + n &= ~0x0f; diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates.patch new file mode 100644 index 0000000..4841ff8 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates.patch @@ -0,0 +1,20 @@ +diff -urN gcc-4.1.2/gcc/config/arm/predicates.md ../../../../old-tmp/work/arm-oabi-angstrom-linux/gcc-cross-4.1.2-backup/gcc-4.1.2/gcc/config/arm/predicates.md +--- gcc-4.1.2/gcc/config/arm/predicates.md 2005-09-11 17:38:02.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/predicates.md 2007-05-30 12:15:54.000000000 +1000 +@@ -171,8 +171,14 @@ + (match_code "eq,ne")) + + ;; True for comparisons other than LTGT or UNEQ. ++(define_special_predicate "arm_comparison_operator" ++; (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt")) ;; original - no LTGT or UNEQ ++; (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltgt,ltu,unordered,ordered,uneq,unlt,unle,unge,ungt")) ;; everything? ++;; True for comparisons other than GE, GEU, UNLT, unordered or ordered. - Cirrus Version - must include ge? +-(define_special_predicate "arm_comparison_operator" ++;(define_special_predicate "arm_comparison_operator" +- (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt")) ++(match_code "eq,ne,le,lt,ge,geu,gt,gtu,leu,ltgt,ltu,uneq,unle,unge,ungt")) ;; bad codes removed? ++;(match_code "eq,ne,le,lt,gt,gtu,leu,ltgt,ltu,uneq,unle,unge,ungt")) ;; bad codes removed + ge / geu removed ++ + + (define_special_predicate "minmax_operator" + (and (match_code "smin,smax,umin,umax") diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates2.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates2.patch new file mode 100644 index 0000000..3e01158 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates2.patch @@ -0,0 +1,10 @@ +--- gcc-4.1.2/gcc/config/arm/predicates.md-original 2007-06-13 12:25:35.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/predicates.md 2007-06-13 12:25:42.000000000 +1000 +@@ -206,7 +206,6 @@ + || mode == CC_DEQmode + || mode == CC_DLEmode + || mode == CC_DLTmode +- || mode == CC_DGEmode + || mode == CC_DGTmode + || mode == CC_DLEUmode + || mode == CC_DLTUmode diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates3.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates3.patch new file mode 100644 index 0000000..99e1e6c --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-predicates3.patch @@ -0,0 +1,116 @@ +diff -urN ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/arm.md gcc-4.1.2/gcc/config/arm/arm.md +--- ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/arm.md 2007-06-14 11:50:53.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-14 11:43:17.000000000 +1000 +@@ -7488,6 +7488,22 @@ + arm_compare_op1);" + ) + ++;(define_expand "suneq" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (uneq:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++; "operands[1] = arm_gen_compare_reg (UNEQ, arm_compare_op0, ++; arm_compare_op1);" ++;) ++ ++;(define_expand "sltgt" ++; [(set (match_operand:SI 0 "s_register_operand" "") ++; (ltgt:SI (match_dup 1) (const_int 0)))] ++; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_MAVERICK)" ++; "operands[1] = arm_gen_compare_reg (LTGT, arm_compare_op0, ++; arm_compare_op1);" ++;) ++ + ;;; DO NOT add patterns for SUNEQ or SLTGT, these can't be represented with + ;;; simple ARM instructions. + ; +@@ -10284,13 +10284,73 @@ + "TARGET_ARM && arm_arch5e" + "pld\\t%a0") + ++;; Special predication pattern for Maverick Crunch floating-point ++ ++(define_cond_exec ++ [(match_operator 0 "maverick_comparison_operator" ++ [(match_operand:CCFP 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++;; Special predication pattern for Maverick Crunch - !CCFP ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC_NOOV 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC_Z 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC_SWP 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC_C 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC_N 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ ++(define_cond_exec ++ [(match_operator 0 "arm_comparison_operator" ++ [(match_operand:CC 1 "cc_register" "") ++ (const_int 0)])] ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "" ++) ++ + ;; General predication pattern + + (define_cond_exec + [(match_operator 0 "arm_comparison_operator" + [(match_operand 1 "cc_register" "") + (const_int 0)])] +- "TARGET_ARM" ++ "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" + "" + ) + +diff -urN ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/predicates.md gcc-4.1.2/gcc/config/arm/predicates.md +--- ../gcc-cross-4.1.2-r4/gcc-4.1.2/gcc/config/arm/predicates.md 2005-09-11 17:38:02.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/predicates.md 2007-06-14 11:46:13.000000000 +1000 +@@ -172,7 +172,11 @@ + + ;; True for comparisons other than LTGT or UNEQ. + (define_special_predicate "arm_comparison_operator" + (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt")) ++ ++;; True for comparisons other than GE, GEU, UNLT, UNORDERED or ORDERED - TODO add LTGT and UNEQ - needs extra support elsewhere ++(define_special_predicate "maverick_comparison_operator" ++(match_code "eq,ne,le,lt,gt,gtu,leu,ltu,unle,unge,ungt")) + + (define_special_predicate "minmax_operator" + (and (match_code "smin,smax,umin,umax") diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-saveregs.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-saveregs.patch new file mode 100644 index 0000000..531ae86 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-saveregs.patch @@ -0,0 +1,153 @@ +diff -ruN /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c gcc-4.1.2/gcc/config/arm/arm.c +--- /home/hwilliams/openembedded/build/tmp/work/ep9312-angstrom-linux-gnueabi/gcc-cross-4.1.2-r0/gcc-4.1.2/gcc/config/arm/arm.c 2007-05-09 16:32:29.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.c 2007-05-15 09:39:41.000000000 +1000 +@@ -426,7 +435,7 @@ + #define FL_STRONG (1 << 8) /* StrongARM */ + #define FL_ARCH5E (1 << 9) /* DSP extensions to v5 */ + #define FL_XSCALE (1 << 10) /* XScale */ +-#define FL_CIRRUS (1 << 11) /* Cirrus/DSP. */ ++#define FL_CIRRUS (1 << 11) /* Cirrus Crunch coprocessor. */ + #define FL_ARCH6 (1 << 12) /* Architecture rel 6. Adds + media instructions. */ + #define FL_VFPV2 (1 << 13) /* Vector Floating Point V2. */ +@@ -490,7 +499,7 @@ + /* Nonzero if this chip is a StrongARM. */ + int arm_tune_strongarm = 0; + +-/* Nonzero if this chip is a Cirrus variant. */ ++/* Nonzero if this chip supports Cirrus Crunch coprocessor. */ + int arm_arch_cirrus = 0; + + /* Nonzero if this chip supports Intel Wireless MMX technology. */ +@@ -1184,7 +1193,8 @@ + else + */ + if (arm_arch_cirrus) +- arm_fpu_arch = FPUTYPE_MAVERICK; ++ /* Cirrus crunch coprocessor still requires soft-float division. */ ++ arm_fpu_arch = FPUTYPE_MAVERICK; + else + arm_fpu_arch = FPUTYPE_FPA_EMU2; + #endif +@@ -1567,6 +1577,9 @@ + if (regs_ever_live[regno] && !call_used_regs[regno]) + return 0; + ++ if (TARGET_MAVERICK) ++ return 0; ++ + if (TARGET_REALLY_IWMMXT) + for (regno = FIRST_IWMMXT_REGNUM; regno <= LAST_IWMMXT_REGNUM; regno++) + if (regs_ever_live[regno] && ! call_used_regs [regno]) +@@ -9775,7 +9886,19 @@ + /* This variable is for the Virtual Frame Pointer, not VFP regs. */ + int vfp_offset = offsets->frame; + +- if (arm_fpu_arch == FPUTYPE_FPA_EMU2) ++ if (arm_fpu_arch == FPUTYPE_MAVERICK) ++ { ++ for (reg = LAST_CIRRUS_FP_REGNUM; reg >= FIRST_CIRRUS_FP_REGNUM; reg--) ++ if (regs_ever_live[reg] && !call_used_regs[reg]) ++ { ++ floats_offset += 8; /* more problems - futaris? */ ++ /* if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) */ ++ asm_fprintf (f, "\tnop\n"); ++ asm_fprintf (f, "\tcfldrd\tmvd%d, [%r, #-%d]\n", ++ reg - FIRST_CIRRUS_FP_REGNUM, FP_REGNUM, floats_offset - vfp_offset); ++ } ++ } ++ else if (arm_fpu_arch == FPUTYPE_FPA_EMU2) + { + for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--) + if (regs_ever_live[reg] && !call_used_regs[reg]) +@@ -9924,7 +10047,18 @@ + output_add_immediate (operands); + } + +- if (arm_fpu_arch == FPUTYPE_FPA_EMU2) ++ if (arm_fpu_arch == FPUTYPE_MAVERICK) ++ { /* order changed - futaris */ ++ for (reg = FIRST_CIRRUS_FP_REGNUM; reg <= LAST_CIRRUS_FP_REGNUM; reg++) ++ if (regs_ever_live[reg] && !call_used_regs[reg]) ++ { ++ /* if (TARGET_CIRRUS_D0 || TARGET_CIRRUS_D1) */ ++ asm_fprintf (f, "\tnop\n"); ++ asm_fprintf (f, "\tcfldrd\tmvd%u, [%r], #8\n", ++ reg - FIRST_CIRRUS_FP_REGNUM, SP_REGNUM); ++ } /* reg problems - futaris */ ++ } ++ else if (arm_fpu_arch == FPUTYPE_FPA_EMU2) + { + for (reg = FIRST_FPA_REGNUM; reg <= LAST_FPA_REGNUM; reg++) + if (regs_ever_live[reg] && !call_used_regs[reg]) +@@ -10429,9 +10563,19 @@ + if (! IS_VOLATILE (func_type)) + { ++ /* Space for saved MAVERICK registers. */ ++ if (arm_fpu_arch == FPUTYPE_MAVERICK) ++ { ++ for (regno = FIRST_CIRRUS_FP_REGNUM; regno <= LAST_CIRRUS_FP_REGNUM; regno++) ++ if (regs_ever_live[regno] && !call_used_regs[regno]) ++ saved += 8; // 8 in 3.4.3 patch - futaris; ++ } ++ else + /* Space for saved FPA registers. */ ++ { + for (regno = FIRST_FPA_REGNUM; regno <= LAST_FPA_REGNUM; regno++) + if (regs_ever_live[regno] && ! call_used_regs[regno]) + saved += 12; ++ } + + /* Space for saved VFP registers. */ + if (TARGET_HARD_FLOAT && TARGET_VFP) +@@ -10739,7 +10882,19 @@ + + /* Save any floating point call-saved registers used by this + function. */ +- if (arm_fpu_arch == FPUTYPE_FPA_EMU2) ++ if (arm_fpu_arch == FPUTYPE_MAVERICK) ++ { ++ for (reg = LAST_CIRRUS_FP_REGNUM; reg >= FIRST_CIRRUS_FP_REGNUM; reg--) ++ if (regs_ever_live[reg] && !call_used_regs[reg]) ++ { ++ insn = gen_rtx_PRE_DEC (DFmode, stack_pointer_rtx); /* think these causes problems */ ++ insn = gen_rtx_MEM (DFmode, insn); ++ insn = emit_insn (gen_rtx_SET (VOIDmode, insn, ++ gen_rtx_REG (DFmode, reg))); ++ RTX_FRAME_RELATED_P (insn) = 1; saved_regs += 8; /* added by futaris */ ++ } ++ } ++ else if (arm_fpu_arch == FPUTYPE_FPA_EMU2) + { + for (reg = LAST_FPA_REGNUM; reg >= FIRST_FPA_REGNUM; reg--) + if (regs_ever_live[reg] && !call_used_regs[reg]) +@@ -15179,6 +15331,9 @@ + if (IS_FPA_REGNUM (regno)) + return (TARGET_AAPCS_BASED ? 96 : 16) + regno - FIRST_FPA_REGNUM; + ++ if (IS_CIRRUS_REGNUM (regno)) ++ return 28 + regno - FIRST_CIRRUS_FP_REGNUM; ++ + if (IS_VFP_REGNUM (regno)) + return 64 + regno - FIRST_VFP_REGNUM; + +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-28 15:42:36.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-28 15:42:48.000000000 +1000 +@@ -9800,7 +9800,7 @@ + return arm_output_epilogue (next_nonnote_insn (insn)); + " + ;; Length is absolute worst case +- [(set_attr "length" "44") ++ [(set_attr "length" "108") + (set_attr "type" "block") + ;; We don't clobber the conditions, but the potential length of this + ;; operation is sufficient to make conditionalizing the sequence +@@ -9818,7 +9818,7 @@ + return thumb_unexpanded_epilogue (); + " + ; Length is absolute worst case +- [(set_attr "length" "44") ++ [(set_attr "length" "108") + (set_attr "type" "block") + ;; We don't clobber the conditions, but the potential length of this + ;; operation is sufficient to make conditionalizing the sequence diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-scc.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-scc.patch new file mode 100644 index 0000000..d1330f2 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-scc.patch @@ -0,0 +1,38 @@ +--- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-13 12:38:06.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-13 12:40:07.000000000 +1000 +@@ -7375,7 +7375,7 @@ + (define_expand "sge" + [(set (match_operand:SI 0 "s_register_operand" "") + (ge:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" ++ "TARGET_ARM" + "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" + ) + +@@ -7434,7 +7434,7 @@ + (define_expand "sunordered" + [(set (match_operand:SI 0 "s_register_operand" "") + (unordered:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7442,7 +7442,7 @@ + (define_expand "sordered" + [(set (match_operand:SI 0 "s_register_operand" "") + (ordered:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0, + arm_compare_op1);" + ) +@@ -7467,7 +7467,7 @@ + (define_expand "sunlt" + [(set (match_operand:SI 0 "s_register_operand" "") + (unlt:SI (match_dup 1) (const_int 0)))] +- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" + "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, + arm_compare_op1);" + ) diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable-new.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable-new.patch new file mode 100644 index 0000000..6dea43f --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable-new.patch @@ -0,0 +1,33 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-cfcvt 2007-06-25 12:46:22.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-25 12:46:41.000000000 +1000 +@@ -337,13 +337,14 @@ + "cfcvt64d%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + ++; appears to be buggy + (define_insn "cirrus_truncsfsi2" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register" "v")))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" + [(set_attr "length" "8") + (set_attr "cirrus" "normal")] + ) + +--- gcc-4.1.2/gcc/config/arm/arm.md-cfcvt 2007-06-25 12:46:56.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-25 12:48:08.000000000 +1000 +@@ -3151,10 +3151,11 @@ + } + ") + ++; appears to be buggy for MAVERICK + (define_expand "fix_truncsfsi2" + [(set (match_operand:SI 0 "s_register_operand" "") + (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" ""))))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " + if (TARGET_MAVERICK) + { diff --git a/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable.patch b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable.patch new file mode 100644 index 0000000..a5d791a --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/crunch/arm-crunch-truncsi-disable.patch @@ -0,0 +1,56 @@ +--- gcc-4.1.2/gcc/config/arm/cirrus.md-cfcvt 2007-06-25 12:46:22.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/cirrus.md 2007-06-25 12:46:41.000000000 +1000 +@@ -337,21 +337,23 @@ + "cfcvt64d%?\\t%V0, %V1" + [(set_attr "cirrus" "normal")]) + ++; appears to be buggy + (define_insn "cirrus_truncsfsi2" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (fix:SI (fix:SF (match_operand:SF 1 "cirrus_fp_register" "v")))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cftruncs32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" + [(set_attr "length" "8") + (set_attr "cirrus" "normal")] + ) + ++; appears to be buggy + (define_insn "cirrus_truncdfsi2" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (fix:SI (fix:DF (match_operand:DF 1 "cirrus_fp_register" "v")))) + (clobber (match_scratch:DF 2 "=v"))] +- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" ++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK && 0" + "cftruncd32%?\\t%Y2, %V1\;cfmvr64l%?\\t%0, %Z2" + [(set_attr "length" "8") + (set_attr "cirrus" "normal")] +--- gcc-4.1.2/gcc/config/arm/arm.md-cfcvt 2007-06-25 12:46:56.000000000 +1000 ++++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-25 12:48:08.000000000 +1000 +@@ -3151,10 +3151,11 @@ + } + ") + ++; appears to be buggy for MAVERICK + (define_expand "fix_truncsfsi2" + [(set (match_operand:SI 0 "s_register_operand" "") + (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" ""))))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " + if (TARGET_MAVERICK) + { +@@ -3167,10 +3168,11 @@ + } + ") + ++; appears to be buggy for MAVERICK + (define_expand "fix_truncdfsi2" + [(set (match_operand:SI 0 "s_register_operand" "") + (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" ""))))] +- "TARGET_ARM && TARGET_HARD_FLOAT" ++ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" + " + if (TARGET_MAVERICK) + { diff --git a/patches/gcc-4.2.3/generic/oe/fix-ICE-in-arm_unwind_emit_set.diff b/patches/gcc-4.2.3/generic/oe/fix-ICE-in-arm_unwind_emit_set.diff new file mode 100644 index 0000000..b4d172b --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/fix-ICE-in-arm_unwind_emit_set.diff @@ -0,0 +1,24 @@ +--- + gcc/config/arm/arm.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +Index: gcc-4.2.3/gcc/config/arm/arm.c +=================================================================== +--- gcc-4.2.3.orig/gcc/config/arm/arm.c ++++ gcc-4.2.3/gcc/config/arm/arm.c +@@ -15485,6 +15485,15 @@ arm_unwind_emit_set (FILE * asm_out_file + asm_fprintf (asm_out_file, "\t.movsp %r, #%d\n", + REGNO (e0), (int)INTVAL(XEXP (e1, 1))); + } ++ else if (GET_CODE (e1) == PLUS ++ && GET_CODE (XEXP (e1, 0)) == REG ++ && REGNO (XEXP (e1, 0)) == SP_REGNUM ++ && GET_CODE (XEXP (e1, 1)) == CONST_INT) ++ { ++ /* Set reg to offset from sp. */ ++ asm_fprintf (asm_out_file, "\t.movsp %r, #%d\n", ++ REGNO (e0), (int)INTVAL(XEXP (e1, 1))); ++ } + else + abort (); + break; diff --git a/patches/gcc-4.2.3/generic/oe/gcc-4.0.2-e300c2c3.patch b/patches/gcc-4.2.3/generic/oe/gcc-4.0.2-e300c2c3.patch new file mode 100644 index 0000000..87cb09e --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/gcc-4.0.2-e300c2c3.patch @@ -0,0 +1,319 @@ +Adds support for Freescale Power architecture e300c2 and e300c3 cores. +http://www.bitshrine.org/gpp/tc-fsl-x86lnx-e300c3-nptl-4.0.2-2.src.rpm + +Leon Woestenberg <leonw@mailcan.com> + +--- + gcc/config.gcc | 2 + gcc/config/rs6000/e300c2c3.md | 189 ++++++++++++++++++++++++++++++++++++++++++ + gcc/config/rs6000/rs6000.c | 24 +++++ + gcc/config/rs6000/rs6000.h | 4 + gcc/config/rs6000/rs6000.md | 3 + 5 files changed, 220 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/gcc/config/rs6000/e300c2c3.md +=================================================================== +--- /dev/null ++++ gcc-4.2.3/gcc/config/rs6000/e300c2c3.md +@@ -0,0 +1,189 @@ ++;; Pipeline description for Motorola PowerPC e300c3 core. ++;; Copyright (C) 2003 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. ++ ++(define_automaton "ppce300c3_most,ppce300c3_long,ppce300c3_retire") ++(define_cpu_unit "ppce300c3_decode_0,ppce300c3_decode_1" "ppce300c3_most") ++ ++;; We don't simulate general issue queue (GIC). If we have SU insn ++;; and then SU1 insn, they can not be issued on the same cycle ++;; (although SU1 insn and then SU insn can be issued) because the SU ++;; insn will go to SU1 from GIC0 entry. Fortunately, the first cycle ++;; multipass insn scheduling will find the situation and issue the SU1 ++;; insn and then the SU insn. ++(define_cpu_unit "ppce300c3_issue_0,ppce300c3_issue_1" "ppce300c3_most") ++ ++;; We could describe completion buffers slots in combination with the ++;; retirement units and the order of completion but the result ++;; automaton would behave in the same way because we can not describe ++;; real latency time with taking in order completion into account. ++;; Actually we could define the real latency time by querying reserved ++;; automaton units but the current scheduler uses latency time before ++;; issuing insns and making any reservations. ++;; ++;; So our description is aimed to achieve a insn schedule in which the ++;; insns would not wait in the completion buffer. ++(define_cpu_unit "ppce300c3_retire_0,ppce300c3_retire_1" "ppce300c3_retire") ++ ++;; Branch unit: ++(define_cpu_unit "ppce300c3_bu" "ppce300c3_most") ++ ++;; IU: ++(define_cpu_unit "ppce300c3_iu0_stage0,ppce300c3_iu1_stage0" "ppce300c3_most") ++ ++;; IU: This used to describe non-pipelined division. ++(define_cpu_unit "ppce300c3_mu_div" "ppce300c3_long") ++ ++;; SRU: ++(define_cpu_unit "ppce300c3_sru_stage0" "ppce300c3_most") ++ ++;; Here we simplified LSU unit description not describing the stages. ++(define_cpu_unit "ppce300c3_lsu" "ppce300c3_most") ++ ++;; FPU: ++(define_cpu_unit "ppce300c3_fpu" "ppce300c3_most") ++ ++;; The following units are used to make automata deterministic ++(define_cpu_unit "present_ppce300c3_decode_0" "ppce300c3_most") ++(define_cpu_unit "present_ppce300c3_issue_0" "ppce300c3_most") ++(define_cpu_unit "present_ppce300c3_retire_0" "ppce300c3_retire") ++(define_cpu_unit "present_ppce300c3_iu0_stage0" "ppce300c3_most") ++ ++;; The following sets to make automata deterministic when option ndfa is used. ++(presence_set "present_ppce300c3_decode_0" "ppce300c3_decode_0") ++(presence_set "present_ppce300c3_issue_0" "ppce300c3_issue_0") ++(presence_set "present_ppce300c3_retire_0" "ppce300c3_retire_0") ++(presence_set "present_ppce300c3_iu0_stage0" "ppce300c3_iu0_stage0") ++ ++;; Some useful abbreviations. ++(define_reservation "ppce300c3_decode" ++ "ppce300c3_decode_0|ppce300c3_decode_1+present_ppce300c3_decode_0") ++(define_reservation "ppce300c3_issue" ++ "ppce300c3_issue_0|ppce300c3_issue_1+present_ppce300c3_issue_0") ++(define_reservation "ppce300c3_retire" ++ "ppce300c3_retire_0|ppce300c3_retire_1+present_ppce300c3_retire_0") ++(define_reservation "ppce300c3_iu_stage0" ++ "ppce300c3_iu0_stage0|ppce300c3_iu1_stage0+present_ppce300c3_iu0_stage0") ++ ++;; Compares can be executed either one of the IU or SRU ++(define_insn_reservation "ppce300c3_cmp" 1 ++ (and (eq_attr "type" "cmp,compare,delayed_compare,fast_compare") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+(ppce300c3_iu_stage0|ppce300c3_sru_stage0) \ ++ +ppce300c3_retire") ++ ++;; Other one cycle IU insns ++(define_insn_reservation "ppce300c3_iu" 1 ++ (and (eq_attr "type" "integer,insert_word") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0+ppce300c3_retire") ++ ++;; Branch. Actually this latency time is not used by the scheduler. ++(define_insn_reservation "ppce300c3_branch" 1 ++ (and (eq_attr "type" "jmpreg,branch") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_bu,ppce300c3_retire") ++ ++;; Multiply is non-pipelined but can be executed in any IU ++(define_insn_reservation "ppce300c3_multiply" 2 ++ (and (eq_attr "type" "imul,imul2,imul3,imul_compare") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0, \ ++ ppce300c3_iu_stage0+ppce300c3_retire") ++ ++;; Divide. We use the average latency time here. We omit reserving a ++;; retire unit because of the result automata will be huge. ++(define_insn_reservation "ppce300c3_divide" 20 ++ (and (eq_attr "type" "idiv") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0+ppce300c3_mu_div,\ ++ ppce300c3_mu_div*19") ++ ++;; CR logical ++(define_insn_reservation "ppce300c3_cr_logical" 1 ++ (and (eq_attr "type" "cr_logical,delayed_cr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mfcr ++(define_insn_reservation "ppce300c3_mfcr" 1 ++ (and (eq_attr "type" "mfcr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mtcrf ++(define_insn_reservation "ppce300c3_mtcrf" 1 ++ (and (eq_attr "type" "mtcr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mtjmpr ++(define_insn_reservation "ppce300c3_mtjmpr" 1 ++ (and (eq_attr "type" "mtjmpr,mfjmpr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Float point instructions ++(define_insn_reservation "ppce300c3_fpcompare" 3 ++ (and (eq_attr "type" "fpcompare") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fp" 3 ++ (and (eq_attr "type" "fp") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_dmul" 4 ++ (and (eq_attr "type" "dmul") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++; Divides are not pipelined ++(define_insn_reservation "ppce300c3_sdiv" 18 ++ (and (eq_attr "type" "sdiv") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu*17") ++ ++(define_insn_reservation "ppce300c3_ddiv" 33 ++ (and (eq_attr "type" "ddiv") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu*32") ++ ++;; Loads ++(define_insn_reservation "ppce300c3_load" 2 ++ (and (eq_attr "type" "load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fpload" 2 ++ (and (eq_attr "type" "fpload,fpload_ux,fpload_u") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++;; Stores. ++(define_insn_reservation "ppce300c3_store" 2 ++ (and (eq_attr "type" "store,store_ux,store_u") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fpstore" 2 ++ (and (eq_attr "type" "fpstore,fpstore_ux,fpstore_u") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") +Index: gcc-4.2.3/gcc/config/rs6000/rs6000.c +=================================================================== +--- gcc-4.2.3.orig/gcc/config/rs6000/rs6000.c ++++ gcc-4.2.3/gcc/config/rs6000/rs6000.c +@@ -556,6 +556,21 @@ struct processor_costs ppc8540_cost = { + COSTS_N_INSNS (29), /* ddiv */ + }; + ++/* Instruction costs on E300C2 and E300C3 cores. */ ++static const ++struct processor_costs ppce300c2c3_cost = { ++ COSTS_N_INSNS (4), /* mulsi */ ++ COSTS_N_INSNS (4), /* mulsi_const */ ++ COSTS_N_INSNS (4), /* mulsi_const9 */ ++ COSTS_N_INSNS (4), /* muldi */ ++ COSTS_N_INSNS (19), /* divsi */ ++ COSTS_N_INSNS (19), /* divdi */ ++ COSTS_N_INSNS (3), /* fp */ ++ COSTS_N_INSNS (4), /* dmul */ ++ COSTS_N_INSNS (18), /* sdiv */ ++ COSTS_N_INSNS (33), /* ddiv */ ++}; ++ + /* Instruction costs on POWER4 and POWER5 processors. */ + static const + struct processor_costs power4_cost = { +@@ -1175,6 +1190,8 @@ rs6000_override_options (const char *def + /* 8548 has a dummy entry for now. */ + {"8548", PROCESSOR_PPC8540, + POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_STRICT_ALIGN}, ++ {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, ++ {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK}, + {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, + {"970", PROCESSOR_POWER4, + POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64}, +@@ -1567,6 +1584,11 @@ rs6000_override_options (const char *def + rs6000_cost = &ppc8540_cost; + break; + ++ case PROCESSOR_PPCE300C2: ++ case PROCESSOR_PPCE300C3: ++ rs6000_cost = &ppce300c2c3_cost; ++ break; ++ + case PROCESSOR_POWER4: + case PROCESSOR_POWER5: + rs6000_cost = &power4_cost; +@@ -16838,6 +16860,8 @@ rs6000_issue_rate (void) + case CPU_PPC750: + case CPU_PPC7400: + case CPU_PPC8540: ++ case CPU_PPCE300C2: ++ case CPU_PPCE300C3: + return 2; + case CPU_RIOS2: + case CPU_PPC604: +Index: gcc-4.2.3/gcc/config/rs6000/rs6000.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/rs6000/rs6000.h ++++ gcc-4.2.3/gcc/config/rs6000/rs6000.h +@@ -110,6 +110,8 @@ + %{mcpu=970: -mpower4 -maltivec} \ + %{mcpu=G5: -mpower4 -maltivec} \ + %{mcpu=8540: -me500} \ ++%{mcpu=e300c2: -mppc} \ ++%{mcpu=e300c3: -mppc -mpmr} \ + %{maltivec: -maltivec} \ + -many" + +@@ -210,6 +212,8 @@ enum processor_type + PROCESSOR_PPC7400, + PROCESSOR_PPC7450, + PROCESSOR_PPC8540, ++ PROCESSOR_PPCE300C2, ++ PROCESSOR_PPCE300C3, + PROCESSOR_POWER4, + PROCESSOR_POWER5 + }; +Index: gcc-4.2.3/gcc/config/rs6000/rs6000.md +=================================================================== +--- gcc-4.2.3.orig/gcc/config/rs6000/rs6000.md ++++ gcc-4.2.3/gcc/config/rs6000/rs6000.md +@@ -105,7 +105,7 @@ + ;; Processor type -- this attribute must exactly match the processor_type + ;; enumeration in rs6000.h. + +-(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,power4,power5" ++(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,ppce300c2,ppce300c3,power4,power5" + (const (symbol_ref "rs6000_cpu_attr"))) + + (automata_option "ndfa") +@@ -121,6 +121,7 @@ + (include "7xx.md") + (include "7450.md") + (include "8540.md") ++(include "e300c2c3.md") + (include "power4.md") + (include "power5.md") + +Index: gcc-4.2.3/gcc/config.gcc +=================================================================== +--- gcc-4.2.3.orig/gcc/config.gcc ++++ gcc-4.2.3/gcc/config.gcc +@@ -2880,7 +2880,7 @@ case "${target}" in + | rios | rios1 | rios2 | rsc | rsc1 | rs64a \ + | 401 | 403 | 405 | 405fp | 440 | 440fp | 505 \ + | 601 | 602 | 603 | 603e | ec603e | 604 \ +- | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 \ ++ | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 | e300c[23] \ + | 854[08] | 801 | 821 | 823 | 860 | 970 | G3 | G4 | G5) + # OK + ;; diff --git a/patches/gcc-4.2.3/generic/oe/gcc41-configure.in.patch b/patches/gcc-4.2.3/generic/oe/gcc41-configure.in.patch new file mode 100644 index 0000000..457c238 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/gcc41-configure.in.patch @@ -0,0 +1,31 @@ +--- + configure | 2 +- + configure.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/configure.in +=================================================================== +--- gcc-4.2.3.orig/configure.in ++++ gcc-4.2.3/configure.in +@@ -2080,7 +2080,7 @@ fi + # for target_alias and gcc doesn't manage it consistently. + target_configargs="--cache-file=./config.cache --build=${build_alias} --host=${target_alias} --target=${target_alias} ${target_configargs}" + +-FLAGS_FOR_TARGET= ++FLAGS_FOR_TARGET="$ARCH_FLAGS_FOR_TARGET" + case " $target_configdirs " in + *" newlib "*) + case " $target_configargs " in +Index: gcc-4.2.3/configure +=================================================================== +--- gcc-4.2.3.orig/configure ++++ gcc-4.2.3/configure +@@ -3373,7 +3373,7 @@ fi + # for target_alias and gcc doesn't manage it consistently. + target_configargs="--cache-file=./config.cache --build=${build_alias} --host=${target_alias} --target=${target_alias} ${target_configargs}" + +-FLAGS_FOR_TARGET= ++FLAGS_FOR_TARGET="$ARCH_FLAGS_FOR_TARGET" + case " $target_configdirs " in + *" newlib "*) + case " $target_configargs " in diff --git a/patches/gcc-4.2.3/generic/oe/ldflags.patch b/patches/gcc-4.2.3/generic/oe/ldflags.patch new file mode 100644 index 0000000..c52c95e --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/ldflags.patch @@ -0,0 +1,31 @@ +--- + Makefile.in | 2 +- + Makefile.tpl | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/Makefile.in +=================================================================== +--- gcc-4.2.3.orig/Makefile.in ++++ gcc-4.2.3/Makefile.in +@@ -346,7 +346,7 @@ SYSROOT_CFLAGS_FOR_TARGET = @SYSROOT_CFL + CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) + LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET) + LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates +-LDFLAGS_FOR_TARGET = ++LDFLAGS_FOR_TARGET = @LDFLAGS@ + PICFLAG_FOR_TARGET = + + # ------------------------------------ +Index: gcc-4.2.3/Makefile.tpl +=================================================================== +--- gcc-4.2.3.orig/Makefile.tpl ++++ gcc-4.2.3/Makefile.tpl +@@ -349,7 +349,7 @@ SYSROOT_CFLAGS_FOR_TARGET = @SYSROOT_CFL + CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) + LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET) + LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates +-LDFLAGS_FOR_TARGET = ++LDFLAGS_FOR_TARGET = @LDFLAGS@ + PICFLAG_FOR_TARGET = + + # ------------------------------------ diff --git a/patches/gcc-4.2.3/generic/oe/zecke-xgcc-cpp.patch b/patches/gcc-4.2.3/generic/oe/zecke-xgcc-cpp.patch new file mode 100644 index 0000000..d84a7e8 --- /dev/null +++ b/patches/gcc-4.2.3/generic/oe/zecke-xgcc-cpp.patch @@ -0,0 +1,20 @@ +upstream: n/a +comment: Use the preprocessor we have just compiled instead the one of +the system. There might be incompabilities between us and them. + +--- + Makefile.in | 1 + + 1 file changed, 1 insertion(+) + +Index: gcc-4.2.3/Makefile.in +=================================================================== +--- gcc-4.2.3.orig/Makefile.in ++++ gcc-4.2.3/Makefile.in +@@ -194,6 +194,7 @@ BASE_TARGET_EXPORTS = \ + AS="$(COMPILER_AS_FOR_TARGET)"; export AS; \ + CC="$(CC_FOR_TARGET)"; export CC; \ + CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \ ++ CPP="$(CC_FOR_TARGET) -E"; export CCP; \ + CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \ + CPPFLAGS="$(CPPFLAGS_FOR_TARGET)"; export CPPFLAGS; \ + CXXFLAGS="$(CXXFLAGS_FOR_TARGET)"; export CXXFLAGS; \ diff --git a/patches/gcc-4.2.3/generic/series b/patches/gcc-4.2.3/generic/series new file mode 100644 index 0000000..5bbe620 --- /dev/null +++ b/patches/gcc-4.2.3/generic/series @@ -0,0 +1,53 @@ +# bail out on host includes +no-host-includes.diff + +# ARM big endian and softfloat +arm-bigendian.patch +arm-softfloat.diff + +# from uclibc +uclibc/100-uclibc-conf.patch +uclibc/103-uclibc-conf-noupstream.patch +uclibc/104-gnuhurd-uclibc-conf.patch +uclibc/200-uclibc-locale.patch +uclibc/203-uclibc-locale-no__x.patch +uclibc/204-uclibc-locale-wchar_fix.patch +uclibc/205-uclibc-locale-update.patch +uclibc/300-libstdc++-pic.patch +uclibc/301-missing-execinfo_h.patch +uclibc/302-c99-snprintf.patch +uclibc/303-c99-complex-ugly-hack.patch +uclibc/304-index_macro.patch +uclibc/305-libmudflap-susv3-legacy.patch +uclibc/306-libstdc++-namespace.patch +uclibc/307-locale_facets.patch +uclibc/402-libbackend_dep_gcov-iov.h.patch +uclibc/904-flatten-switch-stmt-00.patch +uclibc/920-soft-float.patch + +# from gentoo +gentoo/00_all_gcc-trampolinewarn.patch +gentoo/01_all_gcc4-ice-hack.patch +gentoo/06_all_gcc4-slow-pthread-self.patch +gentoo/20_all_cris-dont-force-limits-header.patch +gentoo/35_all_gcc-arm-pragma-pack.patch +gentoo/36_all_gcc-arm-pr30486.patch +gentoo/51_all_gcc-3.4-libiberty-pic.patch +gentoo/53_all_gcc4-superh-default-multilib.patch +gentoo/56_all_gcc-4-pr32177.patch +gentoo/59_all_gcc-4-pr32893.patch +gentoo/62_all_gcc4-noteGNUstack.patch +gentoo/74_all_sh-pr24836.patch +gentoo/85_all_gcc-ca-translation-typo.patch +gentoo/90_all_mips-add-march-r10k.patch +gentoo/91_all_mips-ip28_cache_barriers-v4.patch +gentoo/92_all_mips-pthread-with-shared.patch + +# from oe +oe/arm-thumb-cache.patch +oe/arm-thumb.patch +oe/fix-ICE-in-arm_unwind_emit_set.diff +oe/gcc-4.0.2-e300c2c3.patch +oe/gcc41-configure.in.patch +oe/ldflags.patch +oe/zecke-xgcc-cpp.patch diff --git a/patches/gcc-4.2.3/generic/uclibc/100-uclibc-conf.patch b/patches/gcc-4.2.3/generic/uclibc/100-uclibc-conf.patch new file mode 100644 index 0000000..8e4164e --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/100-uclibc-conf.patch @@ -0,0 +1,251 @@ +--- + boehm-gc/configure | 2 +- + contrib/regression/objs-gcc.sh | 4 ++++ + gcc/config/cris/linux.h | 6 +++++- + libffi/configure | 2 +- + libgfortran/configure | 2 +- + libgomp/configure | 2 +- + libjava/classpath/configure | 2 +- + libjava/classpath/ltconfig | 4 ++-- + libjava/configure | 2 +- + libmudflap/configure | 2 +- + libobjc/configure | 2 +- + libssp/configure | 2 +- + libstdc++-v3/configure | 2 +- + libtool.m4 | 2 +- + ltconfig | 4 ++-- + zlib/configure | 2 +- + 16 files changed, 25 insertions(+), 17 deletions(-) + +Index: gcc-4.2.3/libgomp/configure +=================================================================== +--- gcc-4.2.3.orig/libgomp/configure ++++ gcc-4.2.3/libgomp/configure +@@ -3893,7 +3893,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/gcc/config/cris/linux.h +=================================================================== +--- gcc-4.2.3.orig/gcc/config/cris/linux.h ++++ gcc-4.2.3/gcc/config/cris/linux.h +@@ -73,7 +73,11 @@ along with GCC; see the file COPYING3. + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + + #undef CRIS_SUBTARGET_VERSION +-#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" ++#if UCLIBC_DEFAULT ++# define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++#else ++# define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" ++#endif + + #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" + +Index: gcc-4.2.3/libstdc++-v3/configure +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/configure ++++ gcc-4.2.3/libstdc++-v3/configure +@@ -4283,7 +4283,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/zlib/configure +=================================================================== +--- gcc-4.2.3.orig/zlib/configure ++++ gcc-4.2.3/zlib/configure +@@ -3429,7 +3429,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libobjc/configure +=================================================================== +--- gcc-4.2.3.orig/libobjc/configure ++++ gcc-4.2.3/libobjc/configure +@@ -3314,7 +3314,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libgfortran/configure +=================================================================== +--- gcc-4.2.3.orig/libgfortran/configure ++++ gcc-4.2.3/libgfortran/configure +@@ -3721,7 +3721,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libmudflap/configure +=================================================================== +--- gcc-4.2.3.orig/libmudflap/configure ++++ gcc-4.2.3/libmudflap/configure +@@ -5394,7 +5394,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/boehm-gc/configure +=================================================================== +--- gcc-4.2.3.orig/boehm-gc/configure ++++ gcc-4.2.3/boehm-gc/configure +@@ -4323,7 +4323,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libffi/configure +=================================================================== +--- gcc-4.2.3.orig/libffi/configure ++++ gcc-4.2.3/libffi/configure +@@ -3460,7 +3460,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libssp/configure +=================================================================== +--- gcc-4.2.3.orig/libssp/configure ++++ gcc-4.2.3/libssp/configure +@@ -4480,7 +4480,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/contrib/regression/objs-gcc.sh +=================================================================== +--- gcc-4.2.3.orig/contrib/regression/objs-gcc.sh ++++ gcc-4.2.3/contrib/regression/objs-gcc.sh +@@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +Index: gcc-4.2.3/libjava/classpath/ltconfig +=================================================================== +--- gcc-4.2.3.orig/libjava/classpath/ltconfig ++++ gcc-4.2.3/libjava/classpath/ltconfig +@@ -603,7 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)- + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1251,7 +1251,7 @@ linux-gnuoldld* | linux-gnuaout* | linux + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + version_type=linux + need_lib_prefix=no + need_version=no +Index: gcc-4.2.3/libjava/classpath/configure +=================================================================== +--- gcc-4.2.3.orig/libjava/classpath/configure ++++ gcc-4.2.3/libjava/classpath/configure +@@ -5307,7 +5307,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libjava/configure +=================================================================== +--- gcc-4.2.3.orig/libjava/configure ++++ gcc-4.2.3/libjava/configure +@@ -5424,7 +5424,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/libtool.m4 +=================================================================== +--- gcc-4.2.3.orig/libtool.m4 ++++ gcc-4.2.3/libtool.m4 +@@ -739,7 +739,7 @@ irix5* | irix6*) + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +Index: gcc-4.2.3/ltconfig +=================================================================== +--- gcc-4.2.3.orig/ltconfig ++++ gcc-4.2.3/ltconfig +@@ -603,7 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)- + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1251,7 +1251,7 @@ linux-gnuoldld* | linux-gnuaout* | linux + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux*) + version_type=linux + need_lib_prefix=no + need_version=no diff --git a/patches/gcc-4.2.3/generic/uclibc/103-uclibc-conf-noupstream.patch b/patches/gcc-4.2.3/generic/uclibc/103-uclibc-conf-noupstream.patch new file mode 100644 index 0000000..852124f --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/103-uclibc-conf-noupstream.patch @@ -0,0 +1,17 @@ +--- + gcc/config.gcc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/config.gcc +=================================================================== +--- gcc-4.2.3.orig/gcc/config.gcc ++++ gcc-4.2.3/gcc/config.gcc +@@ -1972,7 +1972,7 @@ score-*-elf) + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" diff --git a/patches/gcc-4.2.3/generic/uclibc/104-gnuhurd-uclibc-conf.patch b/patches/gcc-4.2.3/generic/uclibc/104-gnuhurd-uclibc-conf.patch new file mode 100644 index 0000000..f759be0 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/104-gnuhurd-uclibc-conf.patch @@ -0,0 +1,18 @@ +--- + gcc/config.gcc | 3 +++ + 1 file changed, 3 insertions(+) + +Index: gcc-4.2.3/gcc/config.gcc +=================================================================== +--- gcc-4.2.3.orig/gcc/config.gcc ++++ gcc-4.2.3/gcc/config.gcc +@@ -497,6 +497,9 @@ case ${target} in + alpha*) + tm_file="${cpu_type}/${cpu_type}.h alpha/elf.h alpha/linux.h alpha/linux-elf.h gnu.h ${tm_file}" + ;; ++ i[34567]86-*hurd*-*) ++ tm_file="${cpu_type}/${cpu_type}.h i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h i386/gnu.h gnu.h ${tm_file}" ++ ;; + i[34567]86-*-*) + tm_file="${cpu_type}/${cpu_type}.h i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h gnu.h ${tm_file}" + ;; diff --git a/patches/gcc-4.2.3/generic/uclibc/200-uclibc-locale.patch b/patches/gcc-4.2.3/generic/uclibc/200-uclibc-locale.patch new file mode 100644 index 0000000..02daf6a --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/200-uclibc-locale.patch @@ -0,0 +1,2841 @@ +--- + libstdc++-v3/acinclude.m4 | 39 + libstdc++-v3/config/locale/uclibc/c++locale_internal.h | 63 + + libstdc++-v3/config/locale/uclibc/c_locale.cc | 160 +++ + libstdc++-v3/config/locale/uclibc/c_locale.h | 117 ++ + libstdc++-v3/config/locale/uclibc/codecvt_members.cc | 306 +++++++ + libstdc++-v3/config/locale/uclibc/collate_members.cc | 80 + + libstdc++-v3/config/locale/uclibc/ctype_members.cc | 300 +++++++ + libstdc++-v3/config/locale/uclibc/messages_members.cc | 100 ++ + libstdc++-v3/config/locale/uclibc/messages_members.h | 118 ++ + libstdc++-v3/config/locale/uclibc/monetary_members.cc | 692 +++++++++++++++++ + libstdc++-v3/config/locale/uclibc/numeric_members.cc | 160 +++ + libstdc++-v3/config/locale/uclibc/time_members.cc | 406 +++++++++ + libstdc++-v3/config/locale/uclibc/time_members.h | 68 + + libstdc++-v3/configure | 75 + + libstdc++-v3/include/c_compatibility/wchar.h | 2 + libstdc++-v3/include/c_std/std_cwchar.h | 2 + 16 files changed, 2686 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/acinclude.m4 +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/acinclude.m4 ++++ gcc-4.2.3/libstdc++-v3/acinclude.m4 +@@ -1334,7 +1334,7 @@ dnl + AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [ + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # Deal with gettext issues. Default to not using it (=no) until we detect + # support for it later. Let the user turn it off via --e/d, but let that +@@ -1355,6 +1355,9 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + enable_clocale_flag=gnu + ;; +@@ -1526,6 +1529,40 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <bits/c++config.h> ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++#endif ++ ++#endif // GLIBC 2.3 and later +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +@@ -0,0 +1,117 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, ++ const int __size __attribute__ ((__unused__)), ++ const char* __fmt, ++#ifdef __UCLIBC_HAS_XCLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XCLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/collate_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/collate_members.cc +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.cc +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -0,0 +1,160 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.cc +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.cc +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +=================================================================== +--- /dev/null ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +Index: gcc-4.2.3/libstdc++-v3/configure +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/configure ++++ gcc-4.2.3/libstdc++-v3/configure +@@ -5769,7 +5769,7 @@ if test "${enable_clocale+set}" = set; t + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5802,6 +5802,9 @@ fi; + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ linux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + enable_clocale_flag=gnu + ;; +@@ -6190,6 +6193,76 @@ echo "${ECHO_T}IEEE 1003.1" >&6 + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +Index: gcc-4.2.3/libstdc++-v3/include/c_compatibility/wchar.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/c_compatibility/wchar.h ++++ gcc-4.2.3/libstdc++-v3/include/c_compatibility/wchar.h +@@ -101,7 +101,9 @@ using std::wmemcmp; + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +Index: gcc-4.2.3/libstdc++-v3/include/c_std/std_cwchar.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/c_std/std_cwchar.h ++++ gcc-4.2.3/libstdc++-v3/include/c_std/std_cwchar.h +@@ -182,7 +182,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc-4.2.3/generic/uclibc/203-uclibc-locale-no__x.patch b/patches/gcc-4.2.3/generic/uclibc/203-uclibc-locale-no__x.patch new file mode 100644 index 0000000..4ac310b --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/203-uclibc-locale-no__x.patch @@ -0,0 +1,246 @@ +--- + libstdc++-v3/config/locale/uclibc/c++locale_internal.h | 45 +++++++++++++++++ + libstdc++-v3/config/locale/uclibc/c_locale.cc | 14 ----- + libstdc++-v3/config/locale/uclibc/c_locale.h | 1 + libstdc++-v3/config/locale/uclibc/collate_members.cc | 7 -- + libstdc++-v3/config/locale/uclibc/ctype_members.cc | 7 -- + libstdc++-v3/config/locale/uclibc/messages_members.cc | 7 -- + libstdc++-v3/config/locale/uclibc/messages_members.h | 18 ++---- + libstdc++-v3/config/locale/uclibc/monetary_members.cc | 4 - + libstdc++-v3/config/locale/uclibc/numeric_members.cc | 3 - + libstdc++-v3/config/locale/uclibc/time_members.cc | 3 - + 10 files changed, 55 insertions(+), 54 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/c++locale_internal.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +@@ -60,4 +60,49 @@ extern "C" __typeof(wcsxfrm_l) __wcsxfrm + extern "C" __typeof(wctype_l) __wctype_l; + #endif + ++# define __nl_langinfo_l nl_langinfo_l ++# define __strcoll_l strcoll_l ++# define __strftime_l strftime_l ++# define __strtod_l strtod_l ++# define __strtof_l strtof_l ++# define __strtold_l strtold_l ++# define __strxfrm_l strxfrm_l ++# define __newlocale newlocale ++# define __freelocale freelocale ++# define __duplocale duplocale ++# define __uselocale uselocale ++ ++# ifdef _GLIBCXX_USE_WCHAR_T ++# define __iswctype_l iswctype_l ++# define __towlower_l towlower_l ++# define __towupper_l towupper_l ++# define __wcscoll_l wcscoll_l ++# define __wcsftime_l wcsftime_l ++# define __wcsxfrm_l wcsxfrm_l ++# define __wctype_l wctype_l ++# endif ++ ++#else ++# define __nl_langinfo_l(N, L) nl_langinfo((N)) ++# define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++# define __strtod_l(S, E, L) strtod((S), (E)) ++# define __strtof_l(S, E, L) strtof((S), (E)) ++# define __strtold_l(S, E, L) strtold((S), (E)) ++# define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++# warning should dummy __newlocale check for C|POSIX ? ++# define __newlocale(a, b, c) NULL ++# define __freelocale(a) ((void)0) ++# define __duplocale(a) __c_locale() ++//# define __uselocale ? ++// ++# ifdef _GLIBCXX_USE_WCHAR_T ++# define __iswctype_l(C, M, L) iswctype((C), (M)) ++# define __towlower_l(C, L) towlower((C)) ++# define __towupper_l(C, L) towupper((C)) ++# define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++//# define __wcsftime_l(S, M, F, T, L) wcsftime((S), (M), (F), (T)) ++# define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++# define __wctype_l(S, L) wctype((S)) ++# endif ++ + #endif // GLIBC 2.3 and later +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +@@ -39,20 +39,6 @@ + #include <langinfo.h> + #include <bits/c++locale_internal.h> + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) +-#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) +-#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) +-#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) +-#define __strtof_l(S, E, L) strtof((S), (E)) +-#define __strtod_l(S, E, L) strtod((S), (E)) +-#define __strtold_l(S, E, L) strtold((S), (E)) +-#warning should dummy __newlocale check for C|POSIX ? +-#define __newlocale(a, b, c) NULL +-#define __freelocale(a) ((void)0) +-#define __duplocale(a) __c_locale() +-#endif +- + namespace std + { + template<> +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/collate_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/collate_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/collate_members.cc +@@ -36,13 +36,6 @@ + #include <locale> + #include <bits/c++locale_internal.h> + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) +-#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) +-#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) +-#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) +-#endif +- + namespace std + { + // These are basically extensions to char_traits, and perhaps should +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -43,10 +43,6 @@ + #warning tailor for stub locale support + #endif + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif +- + namespace std + { + // Construct and return valid pattern consisting of some combination of: +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -41,9 +41,6 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning tailor for stub locale support + #endif +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif + + namespace std + { +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/time_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.cc +@@ -40,9 +40,6 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning tailor for stub locale support + #endif +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __nl_langinfo_l(N, L) nl_langinfo((N)) +-#endif + + namespace std + { +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +@@ -38,13 +38,6 @@ + #undef _LIBC + #include <bits/c++locale_internal.h> + +-#ifndef __UCLIBC_HAS_XLOCALE__ +-#define __wctype_l(S, L) wctype((S)) +-#define __towupper_l(C, L) towupper((C)) +-#define __towlower_l(C, L) towlower((C)) +-#define __iswctype_l(C, M, L) iswctype((C), (M)) +-#endif +- + namespace std + { + // NB: The other ctype<char> specializations are in src/locale.cc and +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/messages_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.cc +@@ -39,13 +39,10 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix gettext stuff + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-extern "C" char *__dcgettext(const char *domainname, +- const char *msgid, int category); + #undef gettext +-#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#define gettext(msgid) dcgettext(NULL, msgid, LC_MESSAGES) + #else +-#undef gettext + #define gettext(msgid) (msgid) + #endif + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/messages_members.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -36,15 +36,11 @@ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix prototypes for *textdomain funcs + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-extern "C" char *__textdomain(const char *domainname); +-extern "C" char *__bindtextdomain(const char *domainname, +- const char *dirname); +-#else +-#undef __textdomain +-#undef __bindtextdomain +-#define __textdomain(D) ((void)0) +-#define __bindtextdomain(D,P) ((void)0) ++#ifndef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#undef textdomain ++#undef bindtextdomain ++#define textdomain(D) ((void)0) ++#define bindtextdomain(D,P) ((void)0) + #endif + + // Non-virtual member functions. +@@ -70,7 +66,7 @@ extern "C" char *__bindtextdomain(const + messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, + const char* __dir) const + { +- __bindtextdomain(__s.c_str(), __dir); ++ bindtextdomain(__s.c_str(), __dir); + return this->do_open(__s, __loc); + } + +@@ -90,7 +86,7 @@ extern "C" char *__bindtextdomain(const + { + // No error checking is done, assume the catalog exists and can + // be used. +- __textdomain(__s.c_str()); ++ textdomain(__s.c_str()); + return 0; + } + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/c_locale.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +@@ -68,6 +68,7 @@ namespace __gnu_cxx + { + extern "C" __typeof(uselocale) __uselocale; + } ++#define __uselocale uselocale + #endif + + namespace std diff --git a/patches/gcc-4.2.3/generic/uclibc/204-uclibc-locale-wchar_fix.patch b/patches/gcc-4.2.3/generic/uclibc/204-uclibc-locale-wchar_fix.patch new file mode 100644 index 0000000..a92cc3e --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/204-uclibc-locale-wchar_fix.patch @@ -0,0 +1,57 @@ +--- + libstdc++-v3/config/locale/uclibc/monetary_members.cc | 4 ++-- + libstdc++-v3/config/locale/uclibc/numeric_members.cc | 13 +++++++++++++ + 2 files changed, 15 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -401,7 +401,7 @@ namespace std + # ifdef __UCLIBC_HAS_XLOCALE__ + _M_data->_M_decimal_point = __cloc->decimal_point_wc; + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; +-# else ++# elif defined __UCLIBC_HAS_LOCALE__ + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; + # endif +@@ -556,7 +556,7 @@ namespace std + # ifdef __UCLIBC_HAS_XLOCALE__ + _M_data->_M_decimal_point = __cloc->decimal_point_wc; + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; +-# else ++# elif defined __UCLIBC_HAS_LOCALE__ + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; + # endif +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -127,12 +127,25 @@ namespace std + { + // Named locale. + // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be numeric ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else + union { char *__s; wchar_t __w; } __u; + __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); + _M_data->_M_decimal_point = __u.__w; + + __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); + _M_data->_M_thousands_sep = __u.__w; ++#endif + + if (_M_data->_M_thousands_sep == L'\0') + _M_data->_M_grouping = ""; diff --git a/patches/gcc-4.2.3/generic/uclibc/205-uclibc-locale-update.patch b/patches/gcc-4.2.3/generic/uclibc/205-uclibc-locale-update.patch new file mode 100644 index 0000000..e0f6d86 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/205-uclibc-locale-update.patch @@ -0,0 +1,371 @@ +--- + libstdc++-v3/config/locale/uclibc/c_locale.cc | 53 +++++++----------- + libstdc++-v3/config/locale/uclibc/c_locale.h | 42 ++++++++------ + libstdc++-v3/config/locale/uclibc/ctype_members.cc | 41 ++++++++++--- + libstdc++-v3/config/locale/uclibc/messages_members.h | 13 ++-- + libstdc++-v3/config/locale/uclibc/monetary_members.cc | 7 ++ + libstdc++-v3/config/locale/uclibc/numeric_members.cc | 5 + + libstdc++-v3/config/locale/uclibc/time_members.h | 20 ++++-- + 7 files changed, 109 insertions(+), 72 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/c_locale.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.cc +@@ -46,16 +46,13 @@ namespace std + __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- float __f = __strtof_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __f; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; + } + + template<> +@@ -63,16 +60,13 @@ namespace std + __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- double __d = __strtod_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __d; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; + } + + template<> +@@ -80,16 +74,13 @@ namespace std + __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, + const __c_locale& __cloc) + { +- if (!(__err & ios_base::failbit)) +- { +- char* __sanity; +- errno = 0; +- long double __ld = __strtold_l(__s, &__sanity, __cloc); +- if (__sanity != __s && errno != ERANGE) +- __v = __ld; +- else +- __err |= ios_base::failbit; +- } ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; + } + + void +@@ -110,7 +101,7 @@ namespace std + void + locale::facet::_S_destroy_c_locale(__c_locale& __cloc) + { +- if (_S_get_c_locale() != __cloc) ++ if (__cloc && _S_get_c_locale() != __cloc) + __freelocale(__cloc); + } + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/ctype_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/ctype_members.cc +@@ -33,9 +33,14 @@ + + // Written by Benjamin Kosnik <bkoz@redhat.com> + ++#include <features.h> ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include <locale> + #undef _LIBC ++#else ++#include <locale> ++#endif + #include <bits/c++locale_internal.h> + + namespace std +@@ -138,20 +143,34 @@ namespace std + ctype<wchar_t>:: + do_is(mask __m, wchar_t __c) const + { +- // Highest bitmask in ctype_base == 10, but extra in "C" +- // library for blank. ++ // The case of __m == ctype_base::space is particularly important, ++ // due to its use in many istream functions. Therefore we deal with ++ // it first, exploiting the knowledge that on GNU systems _M_bit[5] ++ // is the mask corresponding to ctype_base::space. NB: an encoding ++ // change would not affect correctness! + bool __ret = false; +- const size_t __bitmasksize = 11; +- for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) +- if (__m & _M_bit[__bitcur] +- && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) +- { +- __ret = true; +- break; +- } ++ if (__m == _M_bit[5]) ++ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); ++ else ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur]) ++ { ++ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ else if (__m == _M_bit[__bitcur]) ++ break; ++ } ++ } + return __ret; + } +- ++ + const wchar_t* + ctype<wchar_t>:: + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/messages_members.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -47,18 +47,21 @@ + template<typename _CharT> + messages<_CharT>::messages(size_t __refs) + : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), +- _M_name_messages(_S_get_c_name()) ++ _M_name_messages(_S_get_c_name()) + { } + + template<typename _CharT> + messages<_CharT>::messages(__c_locale __cloc, const char* __s, + size_t __refs) +- : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), +- _M_name_messages(__s) ++ : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL) + { +- char* __tmp = new char[std::strlen(__s) + 1]; +- std::strcpy(__tmp, __s); ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); + _M_name_messages = __tmp; ++ ++ // Last to avoid leaking memory if new throws. ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); + } + + template<typename _CharT> +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/monetary_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -33,9 +33,14 @@ + + // Written by Benjamin Kosnik <bkoz@redhat.com> + ++#include <features.h> ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include <locale> + #undef _LIBC ++#else ++#include <locale> ++#endif + #include <bits/c++locale_internal.h> + + #ifdef __UCLIBC_MJN3_ONLY__ +@@ -206,7 +211,7 @@ namespace std + } + break; + default: +- ; ++ __ret = pattern(); + } + return __ret; + } +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/numeric_members.cc ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -33,9 +33,14 @@ + + // Written by Benjamin Kosnik <bkoz@redhat.com> + ++#include <features.h> ++#ifdef __UCLIBC_HAS_LOCALE__ + #define _LIBC + #include <locale> + #undef _LIBC ++#else ++#include <locale> ++#endif + #include <bits/c++locale_internal.h> + + #ifdef __UCLIBC_MJN3_ONLY__ +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/time_members.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +@@ -37,25 +37,33 @@ + template<typename _CharT> + __timepunct<_CharT>::__timepunct(size_t __refs) + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), +- _M_name_timepunct(_S_get_c_name()) ++ _M_name_timepunct(_S_get_c_name()) + { _M_initialize_timepunct(); } + + template<typename _CharT> + __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) + : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), +- _M_name_timepunct(_S_get_c_name()) ++ _M_name_timepunct(_S_get_c_name()) + { _M_initialize_timepunct(); } + + template<typename _CharT> + __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, + size_t __refs) + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), +- _M_name_timepunct(__s) ++ _M_name_timepunct(NULL) + { +- char* __tmp = new char[std::strlen(__s) + 1]; +- std::strcpy(__tmp, __s); ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); + _M_name_timepunct = __tmp; +- _M_initialize_timepunct(__cloc); ++ ++ try ++ { _M_initialize_timepunct(__cloc); } ++ catch(...) ++ { ++ delete [] _M_name_timepunct; ++ __throw_exception_again; ++ } + } + + template<typename _CharT> +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/c_locale.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/c_locale.h +@@ -39,21 +39,23 @@ + #pragma GCC system_header + + #include <cstring> // get std::strlen +-#include <cstdio> // get std::snprintf or std::sprintf ++#include <cstdio> // get std::vsnprintf or std::vsprintf + #include <clocale> + #include <langinfo.h> // For codecvt + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix this + #endif +-#ifdef __UCLIBC_HAS_LOCALE__ ++#ifdef _GLIBCXX_USE_ICONV + #include <iconv.h> // For codecvt using iconv, iconv_t + #endif +-#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ +-#include <libintl.h> // For messages ++#ifdef HAVE_LIBINTL_H ++#include <libintl.h> // For messages + #endif ++#include <cstdarg> + + #ifdef __UCLIBC_MJN3_ONLY__ + #warning what is _GLIBCXX_C_LOCALE_GNU for ++// psm: used in os/gnu-linux/ctype_noninline.h + #endif + #define _GLIBCXX_C_LOCALE_GNU 1 + +@@ -62,7 +64,7 @@ + #endif + // #define _GLIBCXX_NUM_CATEGORIES 6 + #define _GLIBCXX_NUM_CATEGORIES 0 +- ++ + #ifdef __UCLIBC_HAS_XLOCALE__ + namespace __gnu_cxx + { +@@ -79,22 +81,24 @@ namespace std + typedef int* __c_locale; + #endif + +- // Convert numeric value of type _Tv to string and return length of +- // string. If snprintf is available use it, otherwise fall back to +- // the unsafe sprintf which, in general, can be dangerous and should ++ // Convert numeric value of type double to string and return length of ++ // string. If vsnprintf is available use it, otherwise fall back to ++ // the unsafe vsprintf which, in general, can be dangerous and should + // be avoided. +- template<typename _Tv> +- int +- __convert_from_v(char* __out, +- const int __size __attribute__ ((__unused__)), +- const char* __fmt, +-#ifdef __UCLIBC_HAS_XCLOCALE__ +- _Tv __v, const __c_locale& __cloc, int __prec) ++ inline int ++ __convert_from_v(const __c_locale& ++#ifndef __UCLIBC_HAS_XCLOCALE__ ++ __cloc __attribute__ ((__unused__)) ++#endif ++ , ++ char* __out, ++ const int __size, ++ const char* __fmt, ...) + { ++ va_list __args; ++#ifdef __UCLIBC_HAS_XCLOCALE__ + __c_locale __old = __gnu_cxx::__uselocale(__cloc); + #else +- _Tv __v, const __c_locale&, int __prec) +- { + # ifdef __UCLIBC_HAS_LOCALE__ + char* __old = std::setlocale(LC_ALL, NULL); + char* __sav = new char[std::strlen(__old) + 1]; +@@ -103,7 +107,9 @@ namespace std + # endif + #endif + +- const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ va_start(__args, __fmt); ++ const int __ret = std::vsnprintf(__out, __size, __fmt, __args); ++ va_end(__args); + + #ifdef __UCLIBC_HAS_XCLOCALE__ + __gnu_cxx::__uselocale(__old); diff --git a/patches/gcc-4.2.3/generic/uclibc/300-libstdc++-pic.patch b/patches/gcc-4.2.3/generic/uclibc/300-libstdc++-pic.patch new file mode 100644 index 0000000..fc39d4e --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/300-libstdc++-pic.patch @@ -0,0 +1,59 @@ +# DP: Build and install libstdc++_pic.a library. + +--- + libstdc++-v3/src/Makefile.am | 6 ++++++ + libstdc++-v3/src/Makefile.in | 10 +++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/libstdc++-v3/src/Makefile.am +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/src/Makefile.am ++++ gcc-4.2.3/libstdc++-v3/src/Makefile.am +@@ -257,6 +257,12 @@ CXXLINK = $(LIBTOOL) --tag CXX --mode=li + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ + + ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +Index: gcc-4.2.3/libstdc++-v3/src/Makefile.in +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/src/Makefile.in ++++ gcc-4.2.3/libstdc++-v3/src/Makefile.in +@@ -657,7 +657,7 @@ info-am: + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -690,6 +690,7 @@ uninstall-am: uninstall-info-am uninstal + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec \ ++ install-exec-local \ + install-exec-am install-info install-info-am install-man \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ +@@ -799,6 +800,13 @@ build_debug: stamp-debug + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/patches/gcc-4.2.3/generic/uclibc/301-missing-execinfo_h.patch b/patches/gcc-4.2.3/generic/uclibc/301-missing-execinfo_h.patch new file mode 100644 index 0000000..ca45214 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/301-missing-execinfo_h.patch @@ -0,0 +1,17 @@ +--- + boehm-gc/include/gc.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/boehm-gc/include/gc.h +=================================================================== +--- gcc-4.2.3.orig/boehm-gc/include/gc.h ++++ gcc-4.2.3/boehm-gc/include/gc.h +@@ -502,7 +502,7 @@ GC_API GC_PTR GC_malloc_atomic_ignore_of + #if defined(__linux__) || defined(__GLIBC__) + # include <features.h> + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/patches/gcc-4.2.3/generic/uclibc/302-c99-snprintf.patch b/patches/gcc-4.2.3/generic/uclibc/302-c99-snprintf.patch new file mode 100644 index 0000000..3f8d175 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/302-c99-snprintf.patch @@ -0,0 +1,17 @@ +--- + libstdc++-v3/include/c_std/std_cstdio.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/libstdc++-v3/include/c_std/std_cstdio.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/c_std/std_cstdio.h ++++ gcc-4.2.3/libstdc++-v3/include/c_std/std_cstdio.h +@@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) + + _GLIBCXX_END_NAMESPACE + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/patches/gcc-4.2.3/generic/uclibc/303-c99-complex-ugly-hack.patch b/patches/gcc-4.2.3/generic/uclibc/303-c99-complex-ugly-hack.patch new file mode 100644 index 0000000..9db571f --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/303-c99-complex-ugly-hack.patch @@ -0,0 +1,18 @@ +--- + libstdc++-v3/configure | 3 +++ + 1 file changed, 3 insertions(+) + +Index: gcc-4.2.3/libstdc++-v3/configure +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/configure ++++ gcc-4.2.3/libstdc++-v3/configure +@@ -7514,6 +7514,9 @@ cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include <complex.h> ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/patches/gcc-4.2.3/generic/uclibc/304-index_macro.patch b/patches/gcc-4.2.3/generic/uclibc/304-index_macro.patch new file mode 100644 index 0000000..5e84bfa --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/304-index_macro.patch @@ -0,0 +1,33 @@ +--- + libstdc++-v3/include/ext/rope | 3 +++ + libstdc++-v3/include/ext/ropeimpl.h | 3 +++ + 2 files changed, 6 insertions(+) + +Index: gcc-4.2.3/libstdc++-v3/include/ext/rope +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/ext/rope ++++ gcc-4.2.3/libstdc++-v3/include/ext/rope +@@ -58,6 +58,9 @@ + #include <bits/allocator.h> + #include <ext/hash_fun.h> + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +Index: gcc-4.2.3/libstdc++-v3/include/ext/ropeimpl.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/ext/ropeimpl.h ++++ gcc-4.2.3/libstdc++-v3/include/ext/ropeimpl.h +@@ -54,6 +54,9 @@ + #include <ext/memory> // For uninitialized_copy_n + #include <ext/numeric> // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) + + using std::size_t; diff --git a/patches/gcc-4.2.3/generic/uclibc/305-libmudflap-susv3-legacy.patch b/patches/gcc-4.2.3/generic/uclibc/305-libmudflap-susv3-legacy.patch new file mode 100644 index 0000000..cbe4a13 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/305-libmudflap-susv3-legacy.patch @@ -0,0 +1,53 @@ +--- + libmudflap/mf-hooks2.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +Index: gcc-4.2.3/libmudflap/mf-hooks2.c +=================================================================== +--- gcc-4.2.3.orig/libmudflap/mf-hooks2.c ++++ gcc-4.2.3/libmudflap/mf-hooks2.c +@@ -427,7 +427,7 @@ WRAPPER2(void, bzero, void *s, size_t n) + { + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, n, __MF_CHECK_WRITE, "bzero region"); +- bzero (s, n); ++ memset (s, 0, n); + } + + +@@ -437,7 +437,7 @@ WRAPPER2(void, bcopy, const void *src, v + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "bcopy src"); + MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "bcopy dest"); +- bcopy (src, dest, n); ++ memmove (dest, src, n); + } + + +@@ -447,7 +447,7 @@ WRAPPER2(int, bcmp, const void *s1, cons + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s1, n, __MF_CHECK_READ, "bcmp 1st arg"); + MF_VALIDATE_EXTENT(s2, n, __MF_CHECK_READ, "bcmp 2nd arg"); +- return bcmp (s1, s2, n); ++ return n == 0 ? 0 : memcmp (s1, s2, n); + } + + +@@ -456,7 +456,7 @@ WRAPPER2(char *, index, const char *s, i + size_t n = strlen (s); + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "index region"); +- return index (s, c); ++ return strchr (s, c); + } + + +@@ -465,7 +465,7 @@ WRAPPER2(char *, rindex, const char *s, + size_t n = strlen (s); + TRACE ("%s\n", __PRETTY_FUNCTION__); + MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "rindex region"); +- return rindex (s, c); ++ return strrchr (s, c); + } + + /* XXX: stpcpy, memccpy */ diff --git a/patches/gcc-4.2.3/generic/uclibc/306-libstdc++-namespace.patch b/patches/gcc-4.2.3/generic/uclibc/306-libstdc++-namespace.patch new file mode 100644 index 0000000..6bb6fc7 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/306-libstdc++-namespace.patch @@ -0,0 +1,43 @@ +--- + libstdc++-v3/config/locale/uclibc/messages_members.h | 4 +++- + libstdc++-v3/config/locale/uclibc/time_members.h | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/messages_members.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -32,7 +32,8 @@ + // + + // Written by Benjamin Kosnik <bkoz@redhat.com> +- ++namespace std ++{ + #ifdef __UCLIBC_MJN3_ONLY__ + #warning fix prototypes for *textdomain funcs + #endif +@@ -115,3 +116,4 @@ + this->_S_create_c_locale(this->_M_c_locale_messages, __s); + } + } ++} +Index: gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/config/locale/uclibc/time_members.h ++++ gcc-4.2.3/libstdc++-v3/config/locale/uclibc/time_members.h +@@ -33,7 +33,8 @@ + // + + // Written by Benjamin Kosnik <bkoz@redhat.com> +- ++namespace std ++{ + template<typename _CharT> + __timepunct<_CharT>::__timepunct(size_t __refs) + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), +@@ -74,3 +75,4 @@ + delete _M_data; + _S_destroy_c_locale(_M_c_locale_timepunct); + } ++} diff --git a/patches/gcc-4.2.3/generic/uclibc/307-locale_facets.patch b/patches/gcc-4.2.3/generic/uclibc/307-locale_facets.patch new file mode 100644 index 0000000..d7b98c6 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/307-locale_facets.patch @@ -0,0 +1,32 @@ +This patch fixes a bug into ostream::operator<<(double) due to the wrong size +passed into the __convert_from_v method. The wrong size is then passed to +std::snprintf function, that, on uClibc, doens't handle sized 0 buffer. + +Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com> + +--- + libstdc++-v3/include/bits/locale_facets.tcc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/libstdc++-v3/include/bits/locale_facets.tcc +=================================================================== +--- gcc-4.2.3.orig/libstdc++-v3/include/bits/locale_facets.tcc ++++ gcc-4.2.3/libstdc++-v3/include/bits/locale_facets.tcc +@@ -1145,7 +1145,7 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE + const int __cs_size = __fixed ? __max_exp + __prec + 4 + : __max_digits * 2 + __prec; + char* __cs = static_cast<char*>(__builtin_alloca(__cs_size)); +- __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, __fbuf, ++ __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, __fbuf, + __prec, __v); + #endif + +@@ -1779,7 +1779,7 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE + // max_exponent10 + 1 for the integer part, + 2 for sign and '\0'. + const int __cs_size = numeric_limits<long double>::max_exponent10 + 3; + char* __cs = static_cast<char*>(__builtin_alloca(__cs_size)); +- int __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, "%.*Lf", ++ int __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, "%.*Lf", + 0, __units); + #endif + string_type __digits(__len, char_type()); diff --git a/patches/gcc-4.2.3/generic/uclibc/402-libbackend_dep_gcov-iov.h.patch b/patches/gcc-4.2.3/generic/uclibc/402-libbackend_dep_gcov-iov.h.patch new file mode 100644 index 0000000..e2ba5cb --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/402-libbackend_dep_gcov-iov.h.patch @@ -0,0 +1,17 @@ +--- + gcc/Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/Makefile.in +=================================================================== +--- gcc-4.2.3.orig/gcc/Makefile.in ++++ gcc-4.2.3/gcc/Makefile.in +@@ -2660,7 +2660,7 @@ mips-tdump.o : mips-tdump.c $(CONFIG_H) + # FIXME: writing proper dependencies for this is a *LOT* of work. + libbackend.o : $(OBJS-common:.o=.c) $(out_file) \ + insn-config.h insn-flags.h insn-codes.h insn-constants.h \ +- insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) ++ insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) gcov-iov.h + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ + -DTARGET_NAME=\"$(target_noncanonical)\" \ + -DLOCALEDIR=\"$(localedir)\" \ diff --git a/patches/gcc-4.2.3/generic/uclibc/904-flatten-switch-stmt-00.patch b/patches/gcc-4.2.3/generic/uclibc/904-flatten-switch-stmt-00.patch new file mode 100644 index 0000000..0057542 --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/904-flatten-switch-stmt-00.patch @@ -0,0 +1,78 @@ +Hi, + +The attached patch makes sure that we create smaller object code for +simple switch statements. We just make sure to flatten the switch +statement into an if-else chain, basically. + +This fixes a size-regression as compared to gcc-3.4, as can be seen +below. + +2007-04-15 Bernhard Fischer <..> + + * stmt.c (expand_case): Do not create a complex binary tree when + optimizing for size but rather use the simple ordered list. + (emit_case_nodes): do not emit jumps to the default_label when + optimizing for size. + +Not regtested so far. +Comments? + +Attached is the test switch.c mentioned below. + +$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do +gcc-$i -DCHAIN -Os -o switch-CHAIN-$i.o -c switch.c ;done +$ for i in 2.95 3.3 3.4 4.0 4.1 4.2.orig-HEAD 4.3.orig-HEAD 4.3-HEAD;do +gcc-$i -UCHAIN -Os -o switch-$i.o -c switch.c ;done + +$ size switch-*.o + text data bss dec hex filename + 169 0 0 169 a9 switch-2.95.o + 115 0 0 115 73 switch-3.3.o + 103 0 0 103 67 switch-3.4.o + 124 0 0 124 7c switch-4.0.o + 124 0 0 124 7c switch-4.1.o + 124 0 0 124 7c switch-4.2.orig-HEAD.o + 95 0 0 95 5f switch-4.3-HEAD.o + 124 0 0 124 7c switch-4.3.orig-HEAD.o + 166 0 0 166 a6 switch-CHAIN-2.95.o + 111 0 0 111 6f switch-CHAIN-3.3.o + 95 0 0 95 5f switch-CHAIN-3.4.o + 95 0 0 95 5f switch-CHAIN-4.0.o + 95 0 0 95 5f switch-CHAIN-4.1.o + 95 0 0 95 5f switch-CHAIN-4.2.orig-HEAD.o + 95 0 0 95 5f switch-CHAIN-4.3-HEAD.o + 95 0 0 95 5f switch-CHAIN-4.3.orig-HEAD.o + + +Content-Type: text/x-diff; charset=us-ascii +Content-Disposition: attachment; filename="gcc-4.3.gcc-flatten-switch-stmt.00.diff" + +--- + gcc/stmt.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +Index: gcc-4.2.3/gcc/stmt.c +=================================================================== +--- gcc-4.2.3.orig/gcc/stmt.c ++++ gcc-4.2.3/gcc/stmt.c +@@ -2511,7 +2511,11 @@ expand_case (tree exp) + use_cost_table + = (TREE_CODE (orig_type) != ENUMERAL_TYPE + && estimate_case_costs (case_list)); +- balance_case_nodes (&case_list, NULL); ++ /* When optimizing for size, we want a straight list to avoid ++ jumps as much as possible. This basically creates an if-else ++ chain. */ ++ if (!optimize_size) ++ balance_case_nodes (&case_list, NULL); + emit_case_nodes (index, case_list, default_label, index_type); + emit_jump (default_label); + } +@@ -3069,6 +3073,7 @@ emit_case_nodes (rtx index, case_node_pt + { + if (!node_has_low_bound (node, index_type)) + { ++ if (!optimize_size) /* don't jl to the .default_label. */ + emit_cmp_and_jump_insns (index, + convert_modes + (mode, imode, diff --git a/patches/gcc-4.2.3/generic/uclibc/920-soft-float.patch b/patches/gcc-4.2.3/generic/uclibc/920-soft-float.patch new file mode 100644 index 0000000..af510ac --- /dev/null +++ b/patches/gcc-4.2.3/generic/uclibc/920-soft-float.patch @@ -0,0 +1,26 @@ +--- + gcc/config/rs6000/darwin-ldouble.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: gcc-4.2.3/gcc/config/rs6000/darwin-ldouble.c +=================================================================== +--- gcc-4.2.3.orig/gcc/config/rs6000/darwin-ldouble.c ++++ gcc-4.2.3/gcc/config/rs6000/darwin-ldouble.c +@@ -70,6 +70,8 @@ Software Foundation, 51 Franklin Street, + but GCC currently generates poor code when a union is used to turn + a long double into a pair of doubles. */ + ++#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__) ++ + long double __gcc_qadd (double, double, double, double); + long double __gcc_qsub (double, double, double, double); + long double __gcc_qmul (double, double, double, double); +@@ -219,8 +221,6 @@ __gcc_qdiv (double a, double b, double c + return z.ldval; + } + +-#if defined (_SOFT_FLOAT) && defined (__LONG_DOUBLE_128__) +- + long double __gcc_qneg (double, double); + int __gcc_qeq (double, double, double, double); + int __gcc_qne (double, double, double, double); diff --git a/patches/glibc-2.7/generic/gentoo/0030_all_glibc-respect-env-CPPFLAGS.patch b/patches/glibc-2.7/generic/gentoo/0030_all_glibc-respect-env-CPPFLAGS.patch new file mode 100644 index 0000000..e017dfb --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0030_all_glibc-respect-env-CPPFLAGS.patch @@ -0,0 +1,32 @@ +Respect environment CPPFLAGS when we run ./configure so we can inject +random -D things without having to set CFLAGS/ASFLAGS + +--- + Makeconfig | 1 + + config.make.in | 1 + + 2 files changed, 2 insertions(+) + +Index: glibc-2.7/Makeconfig +=================================================================== +--- glibc-2.7.orig/Makeconfig ++++ glibc-2.7/Makeconfig +@@ -681,6 +681,7 @@ CPPFLAGS = $($(subdir)-CPPFLAGS) $(+incl + $(foreach lib,$(libof-$(basename $(@F))) \ + $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \ + $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F))) ++CPPFLAGS += $(CPPFLAGS-config) + CPPFLAGS-native = -D_GNU_SOURCE $($(subdir)-CPPFLAGS) $(+includes-native) $(defines) \ + $(CPPFLAGS-$(suffix $@)) -include $(..)include/libc-symbols.h \ + $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F))) +Index: glibc-2.7/config.make.in +=================================================================== +--- glibc-2.7.orig/config.make.in ++++ glibc-2.7/config.make.in +@@ -97,6 +97,7 @@ CC = @CC@ + CXX = @CXX@ + BUILD_CC = @BUILD_CC@ + CFLAGS = @CFLAGS@ ++CPPFLAGS-config = @CPPFLAGS@ + ASFLAGS-config = @ASFLAGS_config@ + AR = @AR@ + RANLIB = @RANLIB@ diff --git a/patches/glibc-2.7/generic/gentoo/0040_all_glibc-i586-chk.patch b/patches/glibc-2.7/generic/gentoo/0040_all_glibc-i586-chk.patch new file mode 100644 index 0000000..1bf542e --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0040_all_glibc-i586-chk.patch @@ -0,0 +1,32 @@ +http://bugs.gentoo.org/199479 + +2007-09-13 H.J. Lu <hongjiu.lu@intel.com> + + * sysdeps/i386/i586/memcpy_chk.S: New file. + * sysdeps/i386/i586/mempcpy_chk.S: Likewise. + * sysdeps/i386/i586/memset_chk.S: Likewise. + +--- + i386/i586/memcpy_chk.S | 1 + + i386/i586/mempcpy_chk.S | 1 + + i386/i586/memset_chk.S | 1 + + 3 files changed, 3 insertions(+) + +Index: glibc-2.7/i386/i586/memcpy_chk.S +=================================================================== +--- /dev/null ++++ glibc-2.7/i386/i586/memcpy_chk.S +@@ -0,0 +1 @@ ++#include <sysdeps/i386/i686/memcpy_chk.S> +Index: glibc-2.7/i386/i586/mempcpy_chk.S +=================================================================== +--- /dev/null ++++ glibc-2.7/i386/i586/mempcpy_chk.S +@@ -0,0 +1 @@ ++#include <sysdeps/i386/i686/mempcpy_chk.S> +Index: glibc-2.7/i386/i586/memset_chk.S +=================================================================== +--- /dev/null ++++ glibc-2.7/i386/i586/memset_chk.S +@@ -0,0 +1 @@ ++#include <sysdeps/i386/i686/memset_chk.S> diff --git a/patches/glibc-2.7/generic/gentoo/0050_all_glibc-2.7-sscanf-as-BZ5441.patch b/patches/glibc-2.7/generic/gentoo/0050_all_glibc-2.7-sscanf-as-BZ5441.patch new file mode 100644 index 0000000..280d5ac --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0050_all_glibc-2.7-sscanf-as-BZ5441.patch @@ -0,0 +1,25 @@ +http://bugs.gentoo.org/201646 +http://sources.redhat.com/bugzilla/show_bug.cgi?id=5441 + +2007-12-07 Ulrich Drepper <drepper@redhat.com> + + [BZ #5441] + * stdio-common/vfscanf.c (_IO_vfwscanf): Don't free ptrs_to_free + structure, it's allocated with alloca. + +--- + stdio-common/vfscanf.c | 1 - + 1 file changed, 1 deletion(-) + +Index: glibc-2.7/stdio-common/vfscanf.c +=================================================================== +--- glibc-2.7.orig/stdio-common/vfscanf.c ++++ glibc-2.7/stdio-common/vfscanf.c +@@ -2843,7 +2843,6 @@ _IO_vfscanf_internal (_IO_FILE *s, const + *p->ptrs[cnt] = NULL; + } + p = p->next; +- free (ptrs_to_free); + ptrs_to_free = p; + } + } diff --git a/patches/glibc-2.7/generic/gentoo/0060_all_glibc-2.7-i386-makecontext-align-BZ5435.patch b/patches/glibc-2.7/generic/gentoo/0060_all_glibc-2.7-i386-makecontext-align-BZ5435.patch new file mode 100644 index 0000000..125f9d0 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0060_all_glibc-2.7-i386-makecontext-align-BZ5435.patch @@ -0,0 +1,46 @@ +2007-12-03 Ulrich Drepper <drepper@redhat.com> + + [BZ #5435] + * sysdeps/unix/sysv/linux/i386/makecontext.S: Align stack. + +--- + sysdeps/unix/sysv/linux/i386/makecontext.S | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/i386/makecontext.S +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/i386/makecontext.S ++++ glibc-2.7/sysdeps/unix/sysv/linux/i386/makecontext.S +@@ -35,11 +35,6 @@ ENTRY(__makecontext) + movl %ecx, oEIP(%eax) + addl oSS_SIZE(%eax), %edx + +- /* Put the next context on the new stack (from the uc_link +- element). */ +- movl oLINK(%eax), %ecx +- movl %ecx, -4(%edx) +- + /* Remember the number of parameters for the exit handler since + it has to remove them. We store the number in the EBX register + which the function we will call must preserve. */ +@@ -50,9 +45,20 @@ ENTRY(__makecontext) + negl %ecx + leal -8(%edx,%ecx,4), %edx + negl %ecx ++ ++ /* Align the stack. */ ++ addl $16, %edx ++ andl $0xfffffff0, %edx ++ subl $4, %edx ++ + /* Store the future stack pointer. */ + movl %edx, oESP(%eax) + ++ /* Put the next context on the new stack (from the uc_link ++ element). */ ++ movl oLINK(%eax), %eax ++ movl %eax, 4(%edx,%ecx,4) ++ + /* Copy all the parameters. */ + jecxz 2f + 1: movl 12(%esp,%ecx,4), %eax diff --git a/patches/glibc-2.7/generic/gentoo/0065_all_glibc-2.7-i386-new-binutils.patch b/patches/glibc-2.7/generic/gentoo/0065_all_glibc-2.7-i386-new-binutils.patch new file mode 100644 index 0000000..632c6d8 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0065_all_glibc-2.7-i386-new-binutils.patch @@ -0,0 +1,27 @@ +http://bugs.gentoo.org/209629 +http://sourceware.org/ml/libc-alpha/2008-01/msg00017.html + +revision 1.6 +date: 2008/01/22 18:36:15; author: drepper; state: Exp; lines: +1 -1 +(fetestexcept): Use short for fnstsw. + +RCS file: /cvs/glibc/libc/sysdeps/i386/fpu/ftestexcept.c,v +retrieving revision 1.5 +retrieving revision 1.6 +--- + sysdeps/i386/fpu/ftestexcept.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-2.7/sysdeps/i386/fpu/ftestexcept.c +=================================================================== +--- glibc-2.7.orig/sysdeps/i386/fpu/ftestexcept.c ++++ glibc-2.7/sysdeps/i386/fpu/ftestexcept.c +@@ -26,7 +26,7 @@ + int + fetestexcept (int excepts) + { +- int temp; ++ short temp; + int xtemp = 0; + + /* Get current exceptions. */ diff --git a/patches/glibc-2.7/generic/gentoo/0070_all_glibc-i386-x86_64-revert-clone-cfi.patch b/patches/glibc-2.7/generic/gentoo/0070_all_glibc-i386-x86_64-revert-clone-cfi.patch new file mode 100644 index 0000000..79c3868 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0070_all_glibc-i386-x86_64-revert-clone-cfi.patch @@ -0,0 +1,55 @@ +revert cfi additions to clone on i386/x86_64 to workaround problems in +gcc's unwinder code. this is not a bug in glibc, it triggers problems +elsewhere. this cfi code does not gain us a whole lot anyways. + +http://gcc.gnu.org/ml/gcc/2006-12/msg00293.html + +--- + sysdeps/unix/sysv/linux/i386/clone.S | 4 ---- + sysdeps/unix/sysv/linux/x86_64/clone.S | 4 ---- + 2 files changed, 8 deletions(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/i386/clone.S +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/i386/clone.S ++++ glibc-2.7/sysdeps/unix/sysv/linux/i386/clone.S +@@ -120,9 +120,6 @@ L(pseudo_end): + ret + + L(thread_start): +- cfi_startproc; +- /* Clearing frame pointer is insufficient, use CFI. */ +- cfi_undefined (eip); + /* Note: %esi is zero. */ + movl %esi,%ebp /* terminate the stack frame */ + #ifdef RESET_PID +@@ -155,7 +152,6 @@ L(nomoregetpid): + jmp L(haspid) + .previous + #endif +- cfi_endproc; + + cfi_startproc + PSEUDO_END (BP_SYM (__clone)) +Index: glibc-2.7/sysdeps/unix/sysv/linux/x86_64/clone.S +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/x86_64/clone.S ++++ glibc-2.7/sysdeps/unix/sysv/linux/x86_64/clone.S +@@ -89,9 +89,6 @@ L(pseudo_end): + ret + + L(thread_start): +- cfi_startproc; +- /* Clearing frame pointer is insufficient, use CFI. */ +- cfi_undefined (rip); + /* Clear the frame pointer. The ABI suggests this be done, to mark + the outermost frame obviously. */ + xorl %ebp, %ebp +@@ -116,7 +113,6 @@ L(thread_start): + /* Call exit with return value from function call. */ + movq %rax, %rdi + call HIDDEN_JUMPTARGET (_exit) +- cfi_endproc; + + cfi_startproc; + PSEUDO_END (BP_SYM (__clone)) diff --git a/patches/glibc-2.7/generic/gentoo/0080_all_glibc-nscd-overflow-BZ5382.patch b/patches/glibc-2.7/generic/gentoo/0080_all_glibc-nscd-overflow-BZ5382.patch new file mode 100644 index 0000000..8a63cb8 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0080_all_glibc-nscd-overflow-BZ5382.patch @@ -0,0 +1,146 @@ +http://sources.redhat.com/bugzilla/show_bug.cgi?id=5382 + +2007-11-22 Ulrich Drepper <drepper@redhat.com> + + [BZ #5382] + * nscd/nscd.h (NSCD_THREAD_STACKSIZE): Define. + * nscd/connections.c (start_threads): Use NSCD_THREAD_STACKSIZE. + * nscd/mem.c (gc): Don't allocate arrays on the stack if they can + overflow it. + Partially based on a patch by Petr Baudis <pasky@suse.cz>. + +=================================================================== +RCS file: /cvs/glibc/libc/nscd/nscd.h,v +retrieving revision 1.30 +retrieving revision 1.31 +--- + nscd/connections.c | 2 - + nscd/mem.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++----- + nscd/nscd.h | 4 +++ + 3 files changed, 55 insertions(+), 6 deletions(-) + +Index: glibc-2.7/nscd/nscd.h +=================================================================== +--- glibc-2.7.orig/nscd/nscd.h ++++ glibc-2.7/nscd/nscd.h +@@ -55,6 +55,10 @@ typedef enum + #define RESTART_INTERVAL (60 * 60) + + ++/* Stack size for worker threads. */ ++#define NSCD_THREAD_STACKSIZE 1024 * 1024 * (sizeof (void *) / 4) ++ ++ + /* Structure describing dynamic part of one database. */ + struct database_dyn + { +Index: glibc-2.7/nscd/connections.c +=================================================================== +--- glibc-2.7.orig/nscd/connections.c ++++ glibc-2.7/nscd/connections.c +@@ -1837,7 +1837,7 @@ start_threads (void) + pthread_attr_init (&attr); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + /* Use 1MB stacks, twice as much for 64-bit architectures. */ +- pthread_attr_setstacksize (&attr, 1024 * 1024 * (sizeof (void *) / 4)); ++ pthread_attr_setstacksize (&attr, NSCD_THREAD_STACKSIZE); + + /* We allow less than LASTDB threads only for debugging. */ + if (debug_level == 0) +Index: glibc-2.7/nscd/mem.c +=================================================================== +--- glibc-2.7.orig/nscd/mem.c ++++ glibc-2.7/nscd/mem.c +@@ -34,6 +34,11 @@ + #include "nscd.h" + + ++/* Wrapper functions with error checking for standard functions. */ ++extern void *xmalloc (size_t n); ++extern void *xcalloc (size_t n, size_t s); ++ ++ + static int + sort_he (const void *p1, const void *p2) + { +@@ -69,6 +74,10 @@ sort_he_data (const void *p1, const void + #define ALLBITS ((((BITMAP_T) 1) << BITS) - 1) + #define HIGHBIT (((BITMAP_T) 1) << (BITS - 1)) + ++/* Maximum size of stack frames we allow the thread to use. We use ++ 80% of the thread stack size. */ ++#define MAX_STACK_USE ((8 * NSCD_THREAD_STACKSIZE) / 10) ++ + + static void + markrange (BITMAP_T *mark, ref_t start, size_t len) +@@ -117,13 +126,43 @@ gc (struct database_dyn *db) + we have to look at the memory. We use a mark and sweep algorithm + where the marks are placed in this array. */ + assert (db->head->first_free % BLOCK_ALIGN == 0); +- BITMAP_T mark[(db->head->first_free / BLOCK_ALIGN + BITS - 1) / BITS]; +- memset (mark, '\0', sizeof (mark)); ++ ++ BITMAP_T *mark; ++ bool mark_use_malloc; ++ size_t stack_used = 0; ++ size_t memory_needed = ((db->head->first_free / BLOCK_ALIGN + BITS - 1) ++ / BITS) * sizeof (BITMAP_T); ++ if (memory_needed <= MAX_STACK_USE) ++ { ++ mark = (BITMAP_T *) alloca (memory_needed); ++ mark_use_malloc = false; ++ memset (mark, '\0', memory_needed); ++ stack_used = memory_needed; ++ } ++ else ++ { ++ mark = (BITMAP_T *) xcalloc (1, memory_needed); ++ mark_use_malloc = true; ++ } + + /* Create an array which can hold pointer to all the entries in hash + entries. */ +- struct hashentry *he[db->head->nentries]; +- struct hashentry *he_data[db->head->nentries]; ++ memory_needed = 2 * db->head->nentries * sizeof (struct hashentry *); ++ struct hashentry **he; ++ struct hashentry **he_data; ++ bool he_use_malloc; ++ if (stack_used + memory_needed <= MAX_STACK_USE) ++ { ++ he = alloca (db->head->nentries * sizeof (struct hashentry *)); ++ he_data = alloca (db->head->nentries * sizeof (struct hashentry *)); ++ he_use_malloc = false; ++ } ++ else ++ { ++ he = xmalloc (memory_needed); ++ he_data = &he[db->head->nentries * sizeof (struct hashentry *)]; ++ he_use_malloc = true; ++ } + + size_t cnt = 0; + for (size_t idx = 0; idx < db->head->module; ++idx) +@@ -455,6 +494,11 @@ gc (struct database_dyn *db) + out: + pthread_mutex_unlock (&db->memlock); + pthread_rwlock_unlock (&db->lock); ++ ++ if (he_use_malloc) ++ free (he); ++ if (mark_use_malloc) ++ free (mark); + } + + +@@ -481,7 +525,8 @@ mempool_alloc (struct database_dyn *db, + { + /* Try to resize the database. Grow size of 1/8th. */ + size_t oldtotal = (sizeof (struct database_pers_head) +- + roundup (db->head->module * sizeof (ref_t), ALIGN) ++ + roundup (db->head->module * sizeof (ref_t), ++ ALIGN) + + db->head->data_size); + size_t new_data_size = (db->head->data_size + + MAX (2 * len, db->head->data_size / 8)); diff --git a/patches/glibc-2.7/generic/gentoo/0085_all_glibc-resolv-locking-BZ5375.patch b/patches/glibc-2.7/generic/gentoo/0085_all_glibc-resolv-locking-BZ5375.patch new file mode 100644 index 0000000..54e73a4 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/0085_all_glibc-resolv-locking-BZ5375.patch @@ -0,0 +1,138 @@ +http://sources.redhat.com/bugzilla/show_bug.cgi?id=5375 + +2007-11-22 Ulrich Drepper <drepper@redhat.com> + + [BZ #5375] + * resolv/res_hconf.c (_res_hconf_reorder_addrs): Fix locking when + initializing interface list. + +=================================================================== +RCS file: /cvs/glibc/libc/resolv/res_hconf.c,v +retrieving revision 1.32 +retrieving revision 1.33 +--- + resolv/res_hconf.c | 84 +++++++++++++++++++++++++++++------------------------ + 1 file changed, 46 insertions(+), 38 deletions(-) + +Index: glibc-2.7/resolv/res_hconf.c +=================================================================== +--- glibc-2.7.orig/resolv/res_hconf.c ++++ glibc-2.7/resolv/res_hconf.c +@@ -377,9 +377,6 @@ static struct netaddr + } u; + } *ifaddrs); + +-/* We need to protect the dynamic buffer handling. */ +-__libc_lock_define_initialized (static, lock); +- + /* Reorder addresses returned in a hostent such that the first address + is an address on the local subnet, if there is such an address. + Otherwise, nothing is changed. +@@ -393,6 +390,8 @@ _res_hconf_reorder_addrs (struct hostent + int i, j; + /* Number of interfaces. */ + static int num_ifs = -1; ++ /* We need to protect the dynamic buffer handling. */ ++ __libc_lock_define_initialized (static, lock); + + /* Only reorder if we're supposed to. */ + if ((_res_hconf.flags & HCONF_FLAG_REORDER) == 0) +@@ -411,8 +410,6 @@ _res_hconf_reorder_addrs (struct hostent + + /* Initialize interface table. */ + +- num_ifs = 0; +- + /* The SIOCGIFNETMASK ioctl will only work on an AF_INET socket. */ + sd = __socket (AF_INET, SOCK_DGRAM, 0); + if (sd < 0) +@@ -421,45 +418,56 @@ _res_hconf_reorder_addrs (struct hostent + /* Get lock. */ + __libc_lock_lock (lock); + +- /* Get a list of interfaces. */ +- __ifreq (&ifr, &num, sd); +- if (!ifr) +- goto cleanup; +- +- ifaddrs = malloc (num * sizeof (ifaddrs[0])); +- if (!ifaddrs) +- goto cleanup1; +- +- /* Copy usable interfaces in ifaddrs structure. */ +- for (cur_ifr = ifr, i = 0; i < num; cur_ifr = __if_nextreq (cur_ifr), ++i) ++ /* Recheck, somebody else might have done the work by done. */ ++ if (num_ifs <= 0) + { +- if (cur_ifr->ifr_addr.sa_family != AF_INET) +- continue; ++ int new_num_ifs = 0; + +- ifaddrs[num_ifs].addrtype = AF_INET; +- ifaddrs[num_ifs].u.ipv4.addr = +- ((struct sockaddr_in *) &cur_ifr->ifr_addr)->sin_addr.s_addr; ++ /* Get a list of interfaces. */ ++ __ifreq (&ifr, &num, sd); ++ if (!ifr) ++ goto cleanup; ++ ++ ifaddrs = malloc (num * sizeof (ifaddrs[0])); ++ if (!ifaddrs) ++ goto cleanup1; ++ ++ /* Copy usable interfaces in ifaddrs structure. */ ++ for (cur_ifr = ifr, i = 0; i < num; ++ cur_ifr = __if_nextreq (cur_ifr), ++i) ++ { ++ if (cur_ifr->ifr_addr.sa_family != AF_INET) ++ continue; ++ ++ ifaddrs[new_num_ifs].addrtype = AF_INET; ++ ifaddrs[new_num_ifs].u.ipv4.addr = ++ ((struct sockaddr_in *) &cur_ifr->ifr_addr)->sin_addr.s_addr; + +- if (__ioctl (sd, SIOCGIFNETMASK, cur_ifr) < 0) +- continue; ++ if (__ioctl (sd, SIOCGIFNETMASK, cur_ifr) < 0) ++ continue; + +- ifaddrs[num_ifs].u.ipv4.mask = +- ((struct sockaddr_in *) &cur_ifr->ifr_netmask)->sin_addr.s_addr; ++ ifaddrs[new_num_ifs].u.ipv4.mask = ++ ((struct sockaddr_in *) &cur_ifr->ifr_netmask)->sin_addr.s_addr; + +- /* Now we're committed to this entry. */ +- ++num_ifs; ++ /* Now we're committed to this entry. */ ++ ++new_num_ifs; ++ } ++ /* Just keep enough memory to hold all the interfaces we want. */ ++ ifaddrs = realloc (ifaddrs, new_num_ifs * sizeof (ifaddrs[0])); ++ assert (ifaddrs != NULL); ++ ++ cleanup1: ++ __if_freereq (ifr, num); ++ ++ cleanup: ++ /* Release lock, preserve error value, and close socket. */ ++ save = errno; ++ ++ num_ifs = new_num_ifs; ++ ++ __libc_lock_unlock (lock); + } +- /* Just keep enough memory to hold all the interfaces we want. */ +- ifaddrs = realloc (ifaddrs, num_ifs * sizeof (ifaddrs[0])); +- assert (ifaddrs != NULL); +- +- cleanup1: +- __if_freereq (ifr, num); +- +- cleanup: +- /* Release lock, preserve error value, and close socket. */ +- save = errno; +- __libc_lock_unlock (lock); ++ + __close (sd); + } + diff --git a/patches/glibc-2.7/generic/gentoo/1010_all_glibc-queue-header-updates.patch b/patches/glibc-2.7/generic/gentoo/1010_all_glibc-queue-header-updates.patch new file mode 100644 index 0000000..c9b3cdb --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1010_all_glibc-queue-header-updates.patch @@ -0,0 +1,89 @@ +grab some updates from FreeBSD + +http://bugs.gentoo.org/201979 + +--- + misc/sys/queue.h | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +Index: glibc-2.7/misc/sys/queue.h +=================================================================== +--- glibc-2.7.orig/misc/sys/queue.h ++++ glibc-2.7/misc/sys/queue.h +@@ -136,6 +136,11 @@ struct { \ + (var); \ + (var) = ((var)->field.le_next)) + ++#define LIST_FOREACH_SAFE(var, head, field, tvar) \ ++ for ((var) = LIST_FIRST((head)); \ ++ (var) && ((tvar) = LIST_NEXT((var), field), 1); \ ++ (var) = (tvar)) ++ + /* + * List access methods. + */ +@@ -197,6 +202,16 @@ struct { \ + #define SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + ++#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ ++ for ((var) = SLIST_FIRST((head)); \ ++ (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ ++ (var) = (tvar)) ++ ++#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ ++ for ((varp) = &SLIST_FIRST((head)); \ ++ ((var) = *(varp)) != NULL; \ ++ (varp) = &SLIST_NEXT((var), field)) ++ + /* + * Singly-linked List access methods. + */ +@@ -242,6 +257,12 @@ struct { \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + } while (/*CONSTCOND*/0) + ++#define STAILQ_LAST(head, type, field) \ ++ (STAILQ_EMPTY((head)) ? \ ++ NULL : \ ++ ((struct type *)(void *) \ ++ ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) ++ + #define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ +@@ -278,6 +299,11 @@ struct { \ + #define STAILQ_FIRST(head) ((head)->stqh_first) + #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + ++#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ ++ for ((var) = STAILQ_FIRST((head)); \ ++ (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ ++ (var) = (tvar)) ++ + + /* + * Simple queue definitions. +@@ -429,11 +455,22 @@ struct { \ + (var); \ + (var) = ((var)->field.tqe_next)) + ++#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ ++ for ((var) = TAILQ_FIRST((head)); \ ++ (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ ++ (var) = (tvar)) ++ + #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ + (var); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + ++#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ ++ for ((var) = TAILQ_LAST((head), headname); \ ++ (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ ++ (var) = (tvar)) ++ ++ + /* + * Tail queue access methods. + */ diff --git a/patches/glibc-2.7/generic/gentoo/1025_all_glibc-gcc-4.3-include-fixed.patch b/patches/glibc-2.7/generic/gentoo/1025_all_glibc-gcc-4.3-include-fixed.patch new file mode 100644 index 0000000..4a84397 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1025_all_glibc-gcc-4.3-include-fixed.patch @@ -0,0 +1,56 @@ +http://bugs.gentoo.org/183358 +http://sourceware.org/ml/libc-alpha/2007-03/msg00017.html + +From: "Joseph S. Myers" <joseph at codesourcery dot com> +To: libc-alpha at sourceware dot org +Date: Sun, 18 Mar 2007 20:40:59 +0000 (UTC) +Subject: Support GCC 4.3's include-fixed directory + +GCC trunk now has multiple internal headers directories, one +containing the self-contained GCC-provided headers and one containing +the <limits.h> (not self-contained but including libc's <limits.h> or +a fixed version thereof) and the fixed headers; more such directories +may be added in future. + +When glibc uses -nostdinc, it needs to use -isystem options for all +these internal directories. This patch teaches it about the +include-fixed directory (and is harmless with old GCC versions without +that directory). + +2007-03-18 Joseph Myers <joseph@codesourcery.com> + + * configure.in: Also pass -isystem option for GCC's include-fixed + directory. + * configure: Regenerate. + +--- + configure | 2 +- + configure.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: glibc-2.7/configure +=================================================================== +--- glibc-2.7.orig/configure ++++ glibc-2.7/configure +@@ -5063,7 +5063,7 @@ echo "$as_me: WARNING: + # thing on a system that doesn't need fixincludes. (Not presently a problem.) + if test -n "$sysheaders"; then + ccheaders=`$CC -print-file-name=include` +- SYSINCLUDES="-nostdinc -isystem $ccheaders \ ++ SYSINCLUDES="-nostdinc -isystem $ccheaders -isystem $ccheaders-fixed \ + -isystem `echo $sysheaders | sed 's/:/ -isystem /g'`" + if test -n "$CXX"; then + cxxversion=`$CXX -dumpversion 2>&5` && +Index: glibc-2.7/configure.in +=================================================================== +--- glibc-2.7.orig/configure.in ++++ glibc-2.7/configure.in +@@ -912,7 +912,7 @@ test -n "$aux_missing" && AC_MSG_WARN([ + # thing on a system that doesn't need fixincludes. (Not presently a problem.) + if test -n "$sysheaders"; then + ccheaders=`$CC -print-file-name=include` +- SYSINCLUDES="-nostdinc -isystem $ccheaders \ ++ SYSINCLUDES="-nostdinc -isystem $ccheaders -isystem $ccheaders-fixed \ + -isystem `echo $sysheaders | sed 's/:/ -isystem /g'`" + if test -n "$CXX"; then + cxxversion=`$CXX -dumpversion 2>&AS_MESSAGE_LOG_FD` && diff --git a/patches/glibc-2.7/generic/gentoo/1030_all_glibc-manual-no-perl.patch b/patches/glibc-2.7/generic/gentoo/1030_all_glibc-manual-no-perl.patch new file mode 100644 index 0000000..320f411 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1030_all_glibc-manual-no-perl.patch @@ -0,0 +1,29 @@ +If we're using a cvs snapshot which updates the source files, and +perl isn't installed yet, then we can't regen the docs. Not a big +deal, so just whine a little and continue on our merry way. + +http://bugs.gentoo.org/60132 + +--- + manual/Makefile | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: glibc-2.7/manual/Makefile +=================================================================== +--- glibc-2.7.orig/manual/Makefile ++++ glibc-2.7/manual/Makefile +@@ -104,9 +104,14 @@ dir-add.texi: xtract-typefun.awk $(texis + libm-err.texi: stamp-libm-err + stamp-libm-err: libm-err-tab.pl $(wildcard $(foreach dir,$(sysdirs),\ + $(dir)/libm-test-ulps)) ++ifneq ($(PERL),no) + pwd=`pwd`; \ + $(PERL) $< $$pwd/.. > libm-err-tmp + $(move-if-change) libm-err-tmp libm-err.texi ++else ++ echo "Unable to rebuild math docs, no perl installed" ++ touch libm-err.texi ++endif + touch $@ + + # Generate Texinfo files from the C source for the example programs. diff --git a/patches/glibc-2.7/generic/gentoo/1040_all_2.3.3-localedef-fix-trampoline.patch b/patches/glibc-2.7/generic/gentoo/1040_all_2.3.3-localedef-fix-trampoline.patch new file mode 100644 index 0000000..4441b5b --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1040_all_2.3.3-localedef-fix-trampoline.patch @@ -0,0 +1,74 @@ +#! /bin/sh -e + +# DP: Description: Fix localedef segfault when run under exec-shield, +# PaX or similar. (#231438, #198099) +# DP: Dpatch Author: James Troup <james@nocrew.org> +# DP: Patch Author: (probably) Jakub Jelinek <jakub@redhat.com> +# DP: Upstream status: Unknown +# DP: Status Details: Unknown +# DP: Date: 2004-03-16 + +if [ $# -ne 2 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) patch -d "$2" -f --no-backup-if-mismatch -p1 < $0;; + -unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p1 < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +--- + locale/programs/3level.h | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +Index: glibc-2.7/locale/programs/3level.h +=================================================================== +--- glibc-2.7.orig/locale/programs/3level.h ++++ glibc-2.7/locale/programs/3level.h +@@ -203,6 +203,42 @@ CONCAT(TABLE,_iterate) (struct TABLE *t, + } + } + } ++ ++/* GCC ATM seems to do a poor job with pointers to nested functions passed ++ to inlined functions. Help it a little bit with this hack. */ ++#define wchead_table_iterate(tp, fn) \ ++do \ ++ { \ ++ struct wchead_table *t = (tp); \ ++ uint32_t index1; \ ++ for (index1 = 0; index1 < t->level1_size; index1++) \ ++ { \ ++ uint32_t lookup1 = t->level1[index1]; \ ++ if (lookup1 != ((uint32_t) ~0)) \ ++ { \ ++ uint32_t lookup1_shifted = lookup1 << t->q; \ ++ uint32_t index2; \ ++ for (index2 = 0; index2 < (1 << t->q); index2++) \ ++ { \ ++ uint32_t lookup2 = t->level2[index2 + lookup1_shifted]; \ ++ if (lookup2 != ((uint32_t) ~0)) \ ++ { \ ++ uint32_t lookup2_shifted = lookup2 << t->p; \ ++ uint32_t index3; \ ++ for (index3 = 0; index3 < (1 << t->p); index3++) \ ++ { \ ++ struct element_t *lookup3 \ ++ = t->level3[index3 + lookup2_shifted]; \ ++ if (lookup3 != NULL) \ ++ fn ((((index1 << t->q) + index2) << t->p) + index3, \ ++ lookup3); \ ++ } \ ++ } \ ++ } \ ++ } \ ++ } \ ++ } while (0) ++ + #endif + + #ifndef NO_FINALIZE diff --git a/patches/glibc-2.7/generic/gentoo/1045_all_glibc-handle-long-kernel-versions.patch b/patches/glibc-2.7/generic/gentoo/1045_all_glibc-handle-long-kernel-versions.patch new file mode 100644 index 0000000..5bdc5ec --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1045_all_glibc-handle-long-kernel-versions.patch @@ -0,0 +1,24 @@ +http://sourceware.org/ml/libc-alpha/2007-07/msg00023.html + +2007-07-07 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/dl-osinfo.h (_dl_discover_osversion): Break + after reading the first 3 parts of the kernel version. + +--- + sysdeps/unix/sysv/linux/dl-osinfo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/dl-osinfo.h +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/dl-osinfo.h ++++ glibc-2.7/sysdeps/unix/sysv/linux/dl-osinfo.h +@@ -107,7 +107,7 @@ _dl_discover_osversion (void) + version = 0; + parts = 0; + cp = buf; +- while ((*cp >= '0') && (*cp <= '9')) ++ while ((*cp >= '0') && (*cp <= '9') && parts < 3) + { + unsigned int here = *cp++ - '0'; + diff --git a/patches/glibc-2.7/generic/gentoo/1050_all_glibc-posix-awk.patch b/patches/glibc-2.7/generic/gentoo/1050_all_glibc-posix-awk.patch new file mode 100644 index 0000000..07571e6 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1050_all_glibc-posix-awk.patch @@ -0,0 +1,23 @@ +http://bugs.gentoo.org/202511 + +2007-12-24 Mike Frysinger <vapier@gentoo.org> + + * elf/Makefile ($(objpfx)ld.so): Use POSIX (EF)? in awk. + +--- + elf/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-2.7/elf/Makefile +=================================================================== +--- glibc-2.7.orig/elf/Makefile ++++ glibc-2.7/elf/Makefile +@@ -308,7 +308,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld + -Wl,-soname=$(rtld-installed-name) -T $@.lds + rm -f $@.lds + readelf -s $@ \ +- | awk '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' ++ | awk '($$7 ~ /^UND(EF)?$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' + + # interp.c exists just to get this string into the libraries. + CFLAGS-interp.c = -D'RUNTIME_LINKER="$(slibdir)/$(rtld-installed-name)"' \ diff --git a/patches/glibc-2.7/generic/gentoo/1055_all_glibc-resolv-dynamic.patch b/patches/glibc-2.7/generic/gentoo/1055_all_glibc-resolv-dynamic.patch new file mode 100644 index 0000000..ec864de --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1055_all_glibc-resolv-dynamic.patch @@ -0,0 +1,44 @@ +ripped from SuSE + +if /etc/resolv.conf is updated, then make sure applications +already running get the updated information. + +http://bugs.gentoo.org/177416 + +--- + resolv/res_libc.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +Index: glibc-2.7/resolv/res_libc.c +=================================================================== +--- glibc-2.7.orig/resolv/res_libc.c ++++ glibc-2.7/resolv/res_libc.c +@@ -22,6 +22,7 @@ + #include <arpa/nameser.h> + #include <resolv.h> + #include <bits/libc-lock.h> ++#include <sys/stat.h> + + + /* The following bit is copied from res_data.c (where it is #ifdef'ed +@@ -95,6 +96,20 @@ int + __res_maybe_init (res_state resp, int preinit) + { + if (resp->options & RES_INIT) { ++ static time_t last_mtime, last_check; ++ time_t now; ++ struct stat statbuf; ++ ++ time (&now); ++ if (now != last_check) { ++ last_check = now; ++ if (stat (_PATH_RESCONF, &statbuf) == 0 && last_mtime != statbuf.st_mtime) { ++ last_mtime = statbuf.st_mtime; ++ atomicinclock (lock); ++ atomicinc (__res_initstamp); ++ atomicincunlock (lock); ++ } ++ } + if (__res_initstamp != resp->_u._ext.initstamp) { + if (resp->nscount > 0) { + __res_iclose (resp, true); diff --git a/patches/glibc-2.7/generic/gentoo/1058_all_glibc-gnulib-regcomp.patch b/patches/glibc-2.7/generic/gentoo/1058_all_glibc-gnulib-regcomp.patch new file mode 100644 index 0000000..426c1ec --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1058_all_glibc-gnulib-regcomp.patch @@ -0,0 +1,24 @@ +2007-12-01 Jim Meyering <meyering@redhat.com> + + Fix a bug that inhibited much of the utf8-optimization in regcomp.c. + * lib/regcomp.c (optimize_utf8): Fix a typo, s/idx/ctx_type/, + that would inhibit utf8-optimization of a regexp containing line- + or buffer-anchors, e.g., `^', `$'. + +--- + posix/regcomp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-2.7/posix/regcomp.c +=================================================================== +--- glibc-2.7.orig/posix/regcomp.c ++++ glibc-2.7/posix/regcomp.c +@@ -1030,7 +1030,7 @@ optimize_utf8 (re_dfa_t *dfa) + mb_chars = 1; + break; + case ANCHOR: +- switch (dfa->nodes[node].opr.idx) ++ switch (dfa->nodes[node].opr.ctx_type) + { + case LINE_FIRST: + case LINE_LAST: diff --git a/patches/glibc-2.7/generic/gentoo/1060_all_glibc-signal-timer-fd.patch b/patches/glibc-2.7/generic/gentoo/1060_all_glibc-signal-timer-fd.patch new file mode 100644 index 0000000..f81e3b8 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1060_all_glibc-signal-timer-fd.patch @@ -0,0 +1,35 @@ +http://bugs.gentoo.org/200790 + +http://sources.redhat.com/bugzilla/show_bug.cgi?id=5439 + +--- + sysdeps/unix/sysv/linux/Makefile | 2 +- + sysdeps/unix/sysv/linux/sys/signalfd.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/sys/signalfd.h +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/sys/signalfd.h ++++ glibc-2.7/sysdeps/unix/sysv/linux/sys/signalfd.h +@@ -51,7 +51,7 @@ __BEGIN_DECLS + /* Request notification for delivery of signals in MASK to be + performed using descriptor FD.*/ + extern int signalfd (int __fd, const sigset_t *__mask, int __flags) +- __nonnull (2) __THROW; ++ __nonnull ((2)) __THROW; + + __END_DECLS + +Index: glibc-2.7/sysdeps/unix/sysv/linux/Makefile +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/Makefile ++++ glibc-2.7/sysdeps/unix/sysv/linux/Makefile +@@ -25,7 +25,7 @@ sysdep_headers += sys/mount.h sys/acct.h + sys/quota.h sys/fsuid.h \ + scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h sys/pci.h \ + sys/ultrasound.h sys/raw.h sys/personality.h sys/epoll.h \ +- bits/a.out.h sys/inotify.h ++ bits/a.out.h sys/inotify.h sys/signalfd.h sys/eventfd.h + + install-others += $(inst_includedir)/bits/syscall.h + diff --git a/patches/glibc-2.7/generic/gentoo/1065_all_glibc-x86_64-libpthread-no-vdso.patch b/patches/glibc-2.7/generic/gentoo/1065_all_glibc-x86_64-libpthread-no-vdso.patch new file mode 100644 index 0000000..6279cf3 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1065_all_glibc-x86_64-libpthread-no-vdso.patch @@ -0,0 +1,31 @@ +__vdso_clock_gettime is in libc/sysdeps/unix/sysv/linux/x86_64/init-first.c +and is only defined for SHARED, so we cannot use it when !SHARED. otherwise, +static linking against pthread_cond_timedwait() libpthread.a fails. + +http://bugs.gentoo.org/198949 + +Patch by Michal Januszewski. + +--- + nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S | 2 ++ + 1 file changed, 2 insertions(+) + +Index: glibc-2.7/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +=================================================================== +--- glibc-2.7.orig/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S ++++ glibc-2.7/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +@@ -134,12 +134,14 @@ __pthread_cond_timedwait: + /* Only clocks 0 and 1 are allowed so far. Both are handled in the + kernel. */ + leaq 24(%rsp), %rsi ++# ifdef SHARED + movq __vdso_clock_gettime@GOTPCREL(%rip), %rax + movq (%rax), %rax + PTR_DEMANGLE (%rax) + jz 26f + call *%rax + jmp 27f ++# endif + 26: movl $__NR_clock_gettime, %eax + syscall + 27: diff --git a/patches/glibc-2.7/generic/gentoo/1075_all_glibc-section-comments.patch b/patches/glibc-2.7/generic/gentoo/1075_all_glibc-section-comments.patch new file mode 100644 index 0000000..39f4833 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1075_all_glibc-section-comments.patch @@ -0,0 +1,29 @@ +http://sources.redhat.com/ml/binutils/2004-04/msg00665.html + +fixes building on some architectures (like m68k/arm/cris/etc...) because +it does the right thing + +--- + include/libc-symbols.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: glibc-2.7/include/libc-symbols.h +=================================================================== +--- glibc-2.7.orig/include/libc-symbols.h ++++ glibc-2.7/include/libc-symbols.h +@@ -240,12 +240,12 @@ + # define __make_section_unallocated(section_string) + # endif + +-/* Tacking on "\n\t#" to the section name makes gcc put it's bogus ++/* Tacking on "\n#APP\n\t#" to the section name makes gcc put it's bogus + section attributes on what looks like a comment to the assembler. */ + # ifdef HAVE_SECTION_QUOTES +-# define __sec_comment "\"\n\t#\"" ++# define __sec_comment "\"\n#APP\n\t#\"" + # else +-# define __sec_comment "\n\t#" ++# define __sec_comment "\n#APP\n\t#" + # endif + # define link_warning(symbol, msg) \ + __make_section_unallocated (".gnu.warning." #symbol) \ diff --git a/patches/glibc-2.7/generic/gentoo/1080_all_glibc-no-inline-gmon.patch b/patches/glibc-2.7/generic/gentoo/1080_all_glibc-no-inline-gmon.patch new file mode 100644 index 0000000..9d7f74a --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1080_all_glibc-no-inline-gmon.patch @@ -0,0 +1,38 @@ +http://bugs.gentoo.org/196245 +http://sourceware.org/ml/libc-alpha/2006-05/msg00017.html + +Attached is a patch to add __attribute__ ((noinline)) to +call_gmon_start. + +Without this patch, the sec script that processed initfini.s removes a +part of inlined call_gmon_start, causing undefined label errors. + +This patch solves the problem by forcing gcc not to inline +call_gmon_start with __attribute__ ((noinline)). + +Tested by building for arm-none-lixux-gnueabi. OK to apply? + +Kazu Hirata + +2006-05-07 Kazu Hirata <kazu@codesourcery.com> + + * sysdeps/generic/initfini.c (call_gmon_start): Add + __attribute__ ((noinline)). + +--- + sysdeps/generic/initfini.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-2.7/sysdeps/generic/initfini.c +=================================================================== +--- glibc-2.7.orig/sysdeps/generic/initfini.c ++++ glibc-2.7/sysdeps/generic/initfini.c +@@ -70,7 +70,7 @@ asm ("\n/*@TESTS_END*/"); + /* The beginning of _init: */ + asm ("\n/*@_init_PROLOG_BEGINS*/"); + +-static void ++static void __attribute__ ((noinline)) + call_gmon_start(void) + { + extern void __gmon_start__ (void) __attribute__ ((weak)); /*weak_extern (__gmon_start__);*/ diff --git a/patches/glibc-2.7/generic/gentoo/1085_all_glibc-omitfp-memmove.patch b/patches/glibc-2.7/generic/gentoo/1085_all_glibc-omitfp-memmove.patch new file mode 100644 index 0000000..1ad8123 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1085_all_glibc-omitfp-memmove.patch @@ -0,0 +1,34 @@ +use this one pending a real fix committed to upstream repo + +http://sourceware.org/ml/libc-alpha/2007-10/msg00054.html +http://bugs.gentoo.org/196926 + +2007-10-21 Nix <nix@esperi.org.uk> + + * sysdeps/i386/i486/bits/string.h (memmove): New macro. + Function of that name renamed to... + * sysdeps/i386/i486/bits/string.h (__memmove_g): ... this. + +--- + sysdeps/i386/i486/bits/string.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +Index: glibc-2.7/sysdeps/i386/i486/bits/string.h +=================================================================== +--- glibc-2.7.orig/sysdeps/i386/i486/bits/string.h ++++ glibc-2.7/sysdeps/i386/i486/bits/string.h +@@ -143,10 +143,13 @@ __memcpy_g (void *__dest, __const void * + + #define _HAVE_STRING_ARCH_memmove 1 + #ifndef _FORCE_INLINES ++#define memmove(dest, src, n) \ ++ __memmove_g ((dest), (src), (n)) ++ + /* Copy N bytes of SRC to DEST, guaranteeing + correct behavior for overlapping strings. */ + __STRING_INLINE void * +-memmove (void *__dest, __const void *__src, size_t __n) ++__memmove_g (void *__dest, __const void *__src, size_t __n) + { + register unsigned long int __d0, __d1, __d2; + register void *__tmp = __dest; diff --git a/patches/glibc-2.7/generic/gentoo/1090_all_glibc-2.3.6-fix-pr631.patch b/patches/glibc-2.7/generic/gentoo/1090_all_glibc-2.3.6-fix-pr631.patch new file mode 100644 index 0000000..d9a0689 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1090_all_glibc-2.3.6-fix-pr631.patch @@ -0,0 +1,52 @@ +From dank@kegel.com +Wed Jun 15 09:12:43 PDT 2005 + +Fixes + +build-glibc/libc.a(nsswitch.o)(.data+0x64): undefined reference to `_nss_files_getaliasent_r' +build-glibc/libc.a(nsswitch.o)(.data+0x6c): undefined reference to `_nss_files_endaliasent' +... 53 lines deleted ... +build-glibc/libc.a(nsswitch.o)(.data+0x21c): undefined reference to `_nss_files_getspnam_r' +collect2: ld returned 1 exit status +make[2]: *** [/build/gcc-3.4.3-glibc-2.3.5-hdrs-2.6.11.2/i686-unknown-linux-gnu/build-glibc/elf/ldconfig] Error 1 + +when building glibc with --enable-static-nss. + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=631 + +--- + Makeconfig | 2 +- + elf/Makefile | 7 +++++++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +Index: glibc-2.7/Makeconfig +=================================================================== +--- glibc-2.7.orig/Makeconfig ++++ glibc-2.7/Makeconfig +@@ -515,7 +515,7 @@ endif + + # The static libraries. + ifeq (yes,$(build-static)) +-link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a ++link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a + else + ifeq (yes,$(build-shared)) + # We can try to link the programs with lib*_pic.a... +Index: glibc-2.7/elf/Makefile +=================================================================== +--- glibc-2.7.orig/elf/Makefile ++++ glibc-2.7/elf/Makefile +@@ -120,6 +120,13 @@ install-others = $(inst_slibdir)/$(rtld- + install-bin-script = ldd + endif + ++ifeq (yes,$(build-static-nss)) ++nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss) ++resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv) ++otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \ ++ $(resolvobjdir)/libresolv.a ++endif ++ + others = sprof sln + install-bin = sprof + others-static = sln diff --git a/patches/glibc-2.7/generic/gentoo/1100_all_glibc-2.3.3-china.patch b/patches/glibc-2.7/generic/gentoo/1100_all_glibc-2.3.3-china.patch new file mode 100644 index 0000000..63909ab --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1100_all_glibc-2.3.3-china.patch @@ -0,0 +1,35 @@ +--- + localedata/locales/zh_TW | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: glibc-2.7/localedata/locales/zh_TW +=================================================================== +--- glibc-2.7.orig/localedata/locales/zh_TW ++++ glibc-2.7/localedata/locales/zh_TW +@@ -1,7 +1,7 @@ + comment_char % + escape_char / + % +-% Chinese language locale for Taiwan R.O.C. ++% Chinese language locale for Taiwan + % charmap: BIG5-CP950 + % + % Original Author: +@@ -17,7 +17,7 @@ escape_char / + % Reference: http://wwwold.dkuug.dk/JTC1/SC22/WG20/docs/n690.pdf + + LC_IDENTIFICATION +-title "Chinese locale for Taiwan R.O.C." ++title "Chinese locale for Taiwan" + source "" + address "" + contact "" +@@ -25,7 +25,7 @@ email "bug-glibc-locales@gnu.org" + tel "" + fax "" + language "Chinese" +-territory "Taiwan R.O.C." ++territory "Taiwan" + revision "0.2" + date "2000-08-02" + % diff --git a/patches/glibc-2.7/generic/gentoo/1103_all_glibc-new-valencian-locale.patch b/patches/glibc-2.7/generic/gentoo/1103_all_glibc-new-valencian-locale.patch new file mode 100644 index 0000000..6080d07 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1103_all_glibc-new-valencian-locale.patch @@ -0,0 +1,122 @@ +http://bugs.gentoo.org/show_bug.cgi?id=131815 +http://sourceware.org/bugzilla/show_bug.cgi?id=2522 + +--- + localedata/SUPPORTED | 2 + localedata/locales/ca_ES@valencia | 96 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 98 insertions(+) + +Index: glibc-2.7/localedata/SUPPORTED +=================================================================== +--- glibc-2.7.orig/localedata/SUPPORTED ++++ glibc-2.7/localedata/SUPPORTED +@@ -70,6 +70,8 @@ ca_AD/ISO-8859-15 \ + ca_ES.UTF-8/UTF-8 \ + ca_ES/ISO-8859-1 \ + ca_ES@euro/ISO-8859-15 \ ++ca_ES.UTF-8@valencia/UTF-8 \ ++ca_ES@valencia/ISO-8859-15 \ + ca_FR.UTF-8/UTF-8 \ + ca_FR/ISO-8859-15 \ + ca_IT.UTF-8/UTF-8 \ +Index: glibc-2.7/localedata/locales/ca_ES@valencia +=================================================================== +--- /dev/null ++++ glibc-2.7/localedata/locales/ca_ES@valencia +@@ -0,0 +1,96 @@ ++comment_char % ++escape_char / ++% ++% Valencian (southern Catalan) locale for Spain with Euro ++% ++% Note that this locale is almost the same as ca_ES@euro. The point of having ++% a separate locale is only for PO translations, which have a lot of social ++% support and are very appreciated by the Valencian-speaking community. ++% ++% Contact: Jordi Mallach ++% Email: jordi@gnu.org ++% Tel: ++% Fax: ++% Language: ca ++% Territory: ES ++% Option: euro ++% Revision: 1.0 ++% Date: 2006-04-06 ++% Application: general ++% Users: general ++% Repertoiremap: mnemonic,ds ++% Charset: ISO-8859-15 ++% Distribution and use is free, also ++% for commercial purposes. ++ ++LC_IDENTIFICATION ++title "Valencian (southern Catalan) locale for Spain with Euro" ++source "" ++address "" ++contact "Jordi Mallach" ++email "jordi@gnu.org" ++tel "" ++fax "" ++language "Catalan" ++territory "Spain" ++revision "1.0" ++date "2006-04-06" ++% ++category "ca_ES@valencia:2006";LC_IDENTIFICATION ++category "ca_ES@valencia:2006";LC_CTYPE ++category "ca_ES@valencia:2006";LC_COLLATE ++category "ca_ES@valencia:2006";LC_MONETARY ++category "ca_ES@valencia:2006";LC_NUMERIC ++category "ca_ES@valencia:2006";LC_TIME ++category "ca_ES@valencia:2006";LC_MESSAGES ++category "ca_ES@valencia:2006";LC_PAPER ++category "ca_ES@valencia:2006";LC_NAME ++category "ca_ES@valencia:2006";LC_ADDRESS ++category "ca_ES@valencia:2006";LC_TELEPHONE ++category "ca_ES@valencia:2006";LC_MEASUREMENT ++ ++END LC_IDENTIFICATION ++ ++LC_CTYPE ++copy "i18n" ++END LC_CTYPE ++ ++LC_COLLATE ++copy "ca_ES" ++END LC_COLLATE ++ ++LC_MONETARY ++copy "ca_ES" ++END LC_MONETARY ++ ++LC_NUMERIC ++copy "ca_ES" ++END LC_NUMERIC ++ ++LC_TIME ++copy "ca_ES" ++END LC_TIME ++ ++LC_MESSAGES ++copy "ca_ES" ++END LC_MESSAGES ++ ++LC_PAPER ++copy "ca_ES" ++END LC_PAPER ++ ++LC_NAME ++copy "ca_ES" ++END LC_NAME ++ ++LC_ADDRESS ++copy "ca_ES" ++END LC_ADDRESS ++ ++LC_TELEPHONE ++copy "ca_ES" ++END LC_TELEPHONE ++ ++LC_MEASUREMENT ++copy "ca_ES" ++END LC_MEASUREMENT diff --git a/patches/glibc-2.7/generic/gentoo/1120_all_glibc-2.5-strict-aliasing.patch b/patches/glibc-2.7/generic/gentoo/1120_all_glibc-2.5-strict-aliasing.patch new file mode 100644 index 0000000..72abde6 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1120_all_glibc-2.5-strict-aliasing.patch @@ -0,0 +1,92 @@ +workaround strict aliasing warnings on individual files rather than +forcing the whole build with -fno-strict-aliasing + +http://bugs.gentoo.org/155906 + +note that we leave the logout.c and logwtmp.c warnings alone as the +code path that invokes the warning should not be executed when the +warning is applicable. + +--- + libio/Makefile | 4 ++-- + nis/Makefile | 3 +++ + nptl/Makefile | 2 ++ + nss/Makefile | 2 ++ + sunrpc/Makefile | 2 +- + 5 files changed, 10 insertions(+), 3 deletions(-) + +Index: glibc-2.7/libio/Makefile +=================================================================== +--- glibc-2.7.orig/libio/Makefile ++++ glibc-2.7/libio/Makefile +@@ -91,7 +91,7 @@ CFLAGS-fseeko.c = $(exceptions) + CFLAGS-ftello64.c = $(exceptions) + CFLAGS-ftello.c = $(exceptions) + CFLAGS-fwide.c = $(exceptions) +-CFLAGS-genops.c = $(exceptions) ++CFLAGS-genops.c = $(exceptions) -fno-strict-aliasing + CFLAGS-getc.c = $(exceptions) + CFLAGS-getchar.c = $(exceptions) + CFLAGS-getwc.c = $(exceptions) +@@ -133,7 +133,7 @@ CFLAGS-putwc.c = $(exceptions) + CFLAGS-putwchar.c = $(exceptions) + CFLAGS-rewind.c = $(exceptions) + CFLAGS-wfileops.c = $(exceptions) +-CFLAGS-wgenops.c = $(exceptions) ++CFLAGS-wgenops.c = $(exceptions) -fno-strict-aliasing + CFLAGS-oldiofopen.c = $(exceptions) + CFLAGS-iofopen.c = $(exceptions) + CFLAGS-iofopen64.c = $(exceptions) +Index: glibc-2.7/nis/Makefile +=================================================================== +--- glibc-2.7.orig/nis/Makefile ++++ glibc-2.7/nis/Makefile +@@ -67,6 +67,9 @@ libnss_nisplus-routines := $(addprefix n + nss-nisplus nisplus-initgroups + libnss_nisplus-inhibit-o = $(filter-out .os,$(object-suffixes)) + ++CFLAGS-nis_xdr.c += -fno-strict-aliasing ++CFLAGS-yp_xdr.c += -fno-strict-aliasing ++ + include ../Rules + + +Index: glibc-2.7/nptl/Makefile +=================================================================== +--- glibc-2.7.orig/nptl/Makefile ++++ glibc-2.7/nptl/Makefile +@@ -192,6 +192,8 @@ CFLAGS-tcdrain.c = -fexceptions -fasynch + + CFLAGS-pt-system.c = -fexceptions + ++CFLAGS-unwind-dw2.c += -fno-strict-aliasing ++ + # Don't generate deps for calls with no sources. See sysdeps/unix/Makefile. + omit-deps = $(unix-syscalls:%=ptw-%) + +Index: glibc-2.7/nss/Makefile +=================================================================== +--- glibc-2.7.orig/nss/Makefile ++++ glibc-2.7/nss/Makefile +@@ -72,6 +72,8 @@ ifneq ($(build-static-nss),yes) + libnss_files-inhibit-o = $(filter-out .os,$(object-suffixes)) + endif + ++CFLAGS-nsswitch.c += -fno-strict-aliasing ++ + include ../Rules + + +Index: glibc-2.7/sunrpc/Makefile +=================================================================== +--- glibc-2.7.orig/sunrpc/Makefile ++++ glibc-2.7/sunrpc/Makefile +@@ -127,7 +127,7 @@ CFLAGS-pmap_rmt.c = -fexceptions + CFLAGS-clnt_perr.c = -fexceptions + CFLAGS-openchild.c = -fexceptions + +-CPPFLAGS += -D_RPC_THREAD_SAFE_ ++CPPFLAGS += -D_RPC_THREAD_SAFE_ -fno-strict-aliasing + + include ../Rules + diff --git a/patches/glibc-2.7/generic/gentoo/1130_all_glibc-2.4-undefine-__i686.patch b/patches/glibc-2.7/generic/gentoo/1130_all_glibc-2.4-undefine-__i686.patch new file mode 100644 index 0000000..7f6a0ad --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/1130_all_glibc-2.4-undefine-__i686.patch @@ -0,0 +1,49 @@ +If gcc is configured to generate i686 code or better by default (like +when using the --with-arch=pentium3 configure option), then the __i686 +macro will always be defined automatically and thus screw up the +compilation of some .S files. +http://bugs.gentoo.org/131108 +http://sourceware.org/ml/libc-alpha/2006-04/msg00090.html + +2006-04-25 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/i386/sysdep.h (__i686): Undefine. + +--- + nptl/sysdeps/pthread/pt-initfini.c | 3 +++ + sysdeps/i386/sysdep.h | 8 ++++++++ + 2 files changed, 11 insertions(+) + +Index: glibc-2.7/nptl/sysdeps/pthread/pt-initfini.c +=================================================================== +--- glibc-2.7.orig/nptl/sysdeps/pthread/pt-initfini.c ++++ glibc-2.7/nptl/sysdeps/pthread/pt-initfini.c +@@ -45,6 +45,9 @@ + /* Embed an #include to pull in the alignment and .end directives. */ + asm ("\n#include \"defs.h\""); + ++/* Embed an #include to pull in asm settings. */ ++asm ("\n#ifdef __i686__\n#include <sysdep.h>\n#endif"); ++ + /* The initial common code ends here. */ + asm ("\n/*@HEADER_ENDS*/"); + +Index: glibc-2.7/sysdeps/i386/sysdep.h +=================================================================== +--- glibc-2.7.orig/sysdeps/i386/sysdep.h ++++ glibc-2.7/sysdeps/i386/sysdep.h +@@ -18,6 +18,14 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++/* ++ * When building for i686 targets or better, gcc automatically defines ++ * '__i686' to '1' for us which causes trouble when using section names ++ * like '__i686.get_pc_thunk.reg'. Since we check for __i686__ in the ++ * code, killing '__i686' shouldn't be a problem. ++ */ ++#undef __i686 ++ + #include <sysdeps/generic/sysdep.h> + + #ifdef __ASSEMBLER__ diff --git a/patches/glibc-2.7/generic/gentoo/3000_all_2.3.6-dl_execstack-PaX-support.patch b/patches/glibc-2.7/generic/gentoo/3000_all_2.3.6-dl_execstack-PaX-support.patch new file mode 100644 index 0000000..cfb82a6 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/3000_all_2.3.6-dl_execstack-PaX-support.patch @@ -0,0 +1,73 @@ + With latest versions of glibc, a lot of apps failed on a PaX enabled + system with: + cannot enable executable stack as shared object requires: Permission denied + + This is due to PaX 'exec-protecting' the stack, and ld.so then trying + to make the stack executable due to some libraries not containing the + PT_GNU_STACK section. Bug #32960. <azarah@gentoo.org> (12 Nov 2003). + + Patch also NPTL. Bug #116086. <kevquinn@gentoo.org> (20 Dec 2005). + +--- + nptl/allocatestack.c | 3 ++- + sysdeps/unix/sysv/linux/dl-execstack.c | 19 ++++++++++++++++--- + 2 files changed, 18 insertions(+), 4 deletions(-) + +Index: glibc-2.7/nptl/allocatestack.c +=================================================================== +--- glibc-2.7.orig/nptl/allocatestack.c ++++ glibc-2.7/nptl/allocatestack.c +@@ -299,7 +299,8 @@ change_stack_perm (struct pthread *pd + # error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" + #endif + if (mprotect (stack, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) +- return errno; ++ if (errno != EACCES) /* PAX is enabled */ ++ return errno; + + return 0; + } +Index: glibc-2.7/sysdeps/unix/sysv/linux/dl-execstack.c +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/dl-execstack.c ++++ glibc-2.7/sysdeps/unix/sysv/linux/dl-execstack.c +@@ -63,7 +63,10 @@ _dl_make_stack_executable (void **stack_ + else + # endif + { +- result = errno; ++ if (errno == EACCES) /* PAX is enabled */ ++ result = 0; ++ else ++ result = errno; + goto out; + } + } +@@ -89,7 +92,12 @@ _dl_make_stack_executable (void **stack_ + page -= size; + else + { +- if (errno != ENOMEM) /* Unexpected failure mode. */ ++ if (errno == EACCES) /* PAX is enabled */ ++ { ++ result = 0; ++ goto out; ++ } ++ else if (errno != ENOMEM) /* Unexpected failure mode. */ + { + result = errno; + goto out; +@@ -115,7 +123,12 @@ _dl_make_stack_executable (void **stack_ + page += size; + else + { +- if (errno != ENOMEM) /* Unexpected failure mode. */ ++ if (errno == EACCES) /* PAX is enabled */ ++ { ++ result = 0; ++ goto out; ++ } ++ else if (errno != ENOMEM) /* Unexpected failure mode. */ + { + result = errno; + goto out; diff --git a/patches/glibc-2.7/generic/gentoo/3010_all_2.3.3_pre20040117-pt_pax.patch b/patches/glibc-2.7/generic/gentoo/3010_all_2.3.3_pre20040117-pt_pax.patch new file mode 100644 index 0000000..8643b90 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/3010_all_2.3.3_pre20040117-pt_pax.patch @@ -0,0 +1,35 @@ +--- + elf/elf.h | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +Index: glibc-2.7/elf/elf.h +=================================================================== +--- glibc-2.7.orig/elf/elf.h ++++ glibc-2.7/elf/elf.h +@@ -569,6 +569,7 @@ typedef struct + #define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ + #define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ + #define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ ++#define PT_PAX_FLAGS 0x65041580 /* Indicates PaX flag markings */ + #define PT_LOSUNW 0x6ffffffa + #define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ + #define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ +@@ -582,6 +583,18 @@ typedef struct + #define PF_X (1 << 0) /* Segment is executable */ + #define PF_W (1 << 1) /* Segment is writable */ + #define PF_R (1 << 2) /* Segment is readable */ ++#define PF_PAGEEXEC (1 << 4) /* Enable PAGEEXEC */ ++#define PF_NOPAGEEXEC (1 << 5) /* Disable PAGEEXEC */ ++#define PF_SEGMEXEC (1 << 6) /* Enable SEGMEXEC */ ++#define PF_NOSEGMEXEC (1 << 7) /* Disable SEGMEXEC */ ++#define PF_MPROTECT (1 << 8) /* Enable MPROTECT */ ++#define PF_NOMPROTECT (1 << 9) /* Disable MPROTECT */ ++#define PF_RANDEXEC (1 << 10) /* Enable RANDEXEC */ ++#define PF_NORANDEXEC (1 << 11) /* Disable RANDEXEC */ ++#define PF_EMUTRAMP (1 << 12) /* Enable EMUTRAMP */ ++#define PF_NOEMUTRAMP (1 << 13) /* Disable EMUTRAMP */ ++#define PF_RANDMMAP (1 << 14) /* Enable RANDMMAP */ ++#define PF_NORANDMMAP (1 << 15) /* Disable RANDMMAP */ + #define PF_MASKOS 0x0ff00000 /* OS-specific */ + #define PF_MASKPROC 0xf0000000 /* Processor-specific */ + diff --git a/patches/glibc-2.7/generic/gentoo/6400_all_sh-glibc-2.3.2-fpscr_values.patch b/patches/glibc-2.7/generic/gentoo/6400_all_sh-glibc-2.3.2-fpscr_values.patch new file mode 100644 index 0000000..d371485 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/6400_all_sh-glibc-2.3.2-fpscr_values.patch @@ -0,0 +1,42 @@ +http://sources.redhat.com/ml/libc-alpha/2003-06/msg00027.html +http://www.m17n.org/linux-sh/ml/linux-sh/2003-05/msg00010.html + +http://rpm.sh-linux.org/rpm-2004/target/SRPMS/glibc-2.3.3-27.12.src.rpm + +http://bugs.gentoo.org/100696 + +--- + sysdeps/unix/sysv/linux/sh/Versions | 1 + + sysdeps/unix/sysv/linux/sh/sysdep.S | 10 ++++++++++ + 2 files changed, 11 insertions(+) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/sh/Versions +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/sh/Versions ++++ glibc-2.7/sysdeps/unix/sysv/linux/sh/Versions +@@ -2,6 +2,7 @@ libc { + GLIBC_2.2 { + # functions used in other libraries + __xstat64; __fxstat64; __lxstat64; ++ __fpscr_values; + + # a* + alphasort64; +Index: glibc-2.7/sysdeps/unix/sysv/linux/sh/sysdep.S +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/sh/sysdep.S ++++ glibc-2.7/sysdeps/unix/sysv/linux/sh/sysdep.S +@@ -32,3 +32,13 @@ ENTRY (__syscall_error) + + #define __syscall_error __syscall_error_1 + #include <sysdeps/unix/sh/sysdep.S> ++ ++ .data ++ .align 3 ++ .globl ___fpscr_values ++ .type ___fpscr_values, @object ++ .size ___fpscr_values, 8 ++___fpscr_values: ++ .long 0 ++ .long 0x80000 ++weak_alias (___fpscr_values, __fpscr_values) diff --git a/patches/glibc-2.7/generic/gentoo/6415_all_sh-glibc-2.5-no-asm-user-header.patch b/patches/glibc-2.7/generic/gentoo/6415_all_sh-glibc-2.5-no-asm-user-header.patch new file mode 100644 index 0000000..f084bae --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/6415_all_sh-glibc-2.5-no-asm-user-header.patch @@ -0,0 +1,76 @@ +2007-03-13 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/sh/sys/user.h: Copy Linux's asm-sh/user.h. + +--- + sysdeps/unix/sysv/linux/sh/sys/user.h | 56 ++++++++++++++++++++++++++++++++-- + 1 file changed, 53 insertions(+), 3 deletions(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/sh/sys/user.h +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/sh/sys/user.h ++++ glibc-2.7/sysdeps/unix/sysv/linux/sh/sys/user.h +@@ -19,10 +19,60 @@ + #ifndef _SYS_USER_H + #define _SYS_USER_H 1 + +-#include <features.h> ++#include <unistd.h> ++#include <asm/ptrace.h> + +-#include <asm/user.h> ++/* ++ * Core file format: The core file is written in such a way that gdb ++ * can understand it and provide useful information to the user (under ++ * linux we use the `trad-core' bfd). The file contents are as follows: ++ * ++ * upage: 1 page consisting of a user struct that tells gdb ++ * what is present in the file. Directly after this is a ++ * copy of the task_struct, which is currently not used by gdb, ++ * but it may come in handy at some point. All of the registers ++ * are stored as part of the upage. The upage should always be ++ * only one page long. ++ * data: The data segment follows next. We use current->end_text to ++ * current->brk to pick up all of the user variables, plus any memory ++ * that may have been sbrk'ed. No attempt is made to determine if a ++ * page is demand-zero or if a page is totally unused, we just cover ++ * the entire range. All of the addresses are rounded in such a way ++ * that an integral number of pages is written. ++ * stack: We need the stack information in order to get a meaningful ++ * backtrace. We need to write the data from usp to ++ * current->start_stack, so we round each of these in order to be able ++ * to write an integer number of pages. ++ */ + +-#undef start_thread ++struct user_fpu_struct { ++ unsigned long fp_regs[16]; ++ unsigned long xfp_regs[16]; ++ unsigned long fpscr; ++ unsigned long fpul; ++}; ++ ++struct user { ++ struct pt_regs regs; /* entire machine state */ ++ struct user_fpu_struct fpu; /* Math Co-processor registers */ ++ int u_fpvalid; /* True if math co-processor being used */ ++ size_t u_tsize; /* text size (pages) */ ++ size_t u_dsize; /* data size (pages) */ ++ size_t u_ssize; /* stack size (pages) */ ++ unsigned long start_code; /* text starting address */ ++ unsigned long start_data; /* data starting address */ ++ unsigned long start_stack; /* stack starting address */ ++ long int signal; /* signal causing core dump */ ++ struct regs * u_ar0; /* help gdb find registers */ ++ struct user_fpu_struct* u_fpstate; /* Math Co-processor pointer */ ++ unsigned long magic; /* identifies a core file */ ++ char u_comm[32]; /* user command name */ ++}; ++ ++#define NBPG getpagesize() ++#define UPAGES 1 ++#define HOST_TEXT_START_ADDR (u.start_code) ++#define HOST_DATA_START_ADDR (u.start_data) ++#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) + + #endif /* sys/user.h */ diff --git a/patches/glibc-2.7/generic/gentoo/6416_all_sh-glibc-2.5-no-asm-elf-header.patch b/patches/glibc-2.7/generic/gentoo/6416_all_sh-glibc-2.5-no-asm-elf-header.patch new file mode 100644 index 0000000..bf44065 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/6416_all_sh-glibc-2.5-no-asm-elf-header.patch @@ -0,0 +1,33 @@ +2007-03-13 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/sh/sys/procfs.h: Copy Linux's asm-sh/elf.h types. + +--- + sysdeps/unix/sysv/linux/sh/sys/procfs.h | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +Index: glibc-2.7/sysdeps/unix/sysv/linux/sh/sys/procfs.h +=================================================================== +--- glibc-2.7.orig/sysdeps/unix/sysv/linux/sh/sys/procfs.h ++++ glibc-2.7/sysdeps/unix/sysv/linux/sh/sys/procfs.h +@@ -29,10 +29,19 @@ + #include <sys/types.h> + #include <sys/ucontext.h> + #include <sys/user.h> +-#include <asm/elf.h> + + __BEGIN_DECLS + ++/* ++ * ELF register definitions... ++ */ ++typedef unsigned long elf_greg_t; ++ ++#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) ++typedef elf_greg_t elf_gregset_t[ELF_NGREG]; ++ ++typedef struct user_fpu_struct elf_fpregset_t; ++ + struct elf_siginfo + { + int si_signo; /* Signal number. */ diff --git a/patches/glibc-2.7/generic/gentoo/6417_all_sh-glibc-2.7-broken-nptl-lock-macros.patch b/patches/glibc-2.7/generic/gentoo/6417_all_sh-glibc-2.7-broken-nptl-lock-macros.patch new file mode 100644 index 0000000..5faadb8 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/6417_all_sh-glibc-2.7-broken-nptl-lock-macros.patch @@ -0,0 +1,74 @@ +http://sourceware.org/ml/libc-alpha/2007-11/msg00012.html + +2007-11-03 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/sh/lowlevellock.S (LOAD_FUTEX_WAIT): Add + missing line continuations. + * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S (LOAD_FUTEX_WAIT, + LOAD_FUTEX_WAKE): Likewise. Also add missing 3rd parameter. + +--- + nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S | 8 ++++---- + nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +Index: glibc-2.7/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +=================================================================== +--- glibc-2.7.orig/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S ++++ glibc-2.7/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +@@ -76,7 +76,7 @@ + add tmp2, tmp ; \ + mov.l @tmp, tmp2 ; \ + bra 98f ; \ +- mov #FUTEX_PRIVATE_FLAG, tmp ++ mov #FUTEX_PRIVATE_FLAG, tmp ; \ + 99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ + 98: extu.b tmp, tmp ; \ + xor tmp, reg ; \ +@@ -88,7 +88,7 @@ + add tmp2, tmp ; \ + mov.l @tmp, tmp2 ; \ + bra 98f ; \ +- mov #FUTEX_PRIVATE_FLAG, tmp ++ mov #FUTEX_PRIVATE_FLAG, tmp ; \ + 99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ + 98: extu.b tmp, tmp ; \ + xor tmp, reg ; \ +@@ -96,13 +96,13 @@ + mov #FUTEX_WAIT, tmp ; \ + or tmp, reg + # endif +-# define LOAD_FUTEX_WAKE(reg,tmp) \ ++# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \ + stc gbr, tmp ; \ + mov.w 99f, tmp2 ; \ + add tmp2, tmp ; \ + mov.l @tmp, tmp2 ; \ + bra 98f ; \ +- mov #FUTEX_PRIVATE_FLAG, tmp ++ mov #FUTEX_PRIVATE_FLAG, tmp ; \ + 99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ + 98: extu.b tmp, tmp ; \ + xor tmp, reg ; \ +Index: glibc-2.7/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S +=================================================================== +--- glibc-2.7.orig/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S ++++ glibc-2.7/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S +@@ -42,7 +42,7 @@ + add tmp2, tmp ; \ + mov.l @tmp, tmp2 ; \ + bra 98f ; \ +- mov #FUTEX_PRIVATE_FLAG, tmp ++ mov #FUTEX_PRIVATE_FLAG, tmp ; \ + 99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ + 98: extu.b tmp, tmp ; \ + xor tmp, reg ; \ +@@ -54,7 +54,7 @@ + add tmp2, tmp ; \ + mov.l @tmp, tmp2 ; \ + bra 98f ; \ +- mov #FUTEX_PRIVATE_FLAG, tmp ++ mov #FUTEX_PRIVATE_FLAG, tmp ; \ + 99: .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ + 98: extu.b tmp, tmp ; \ + xor tmp, reg ; \ diff --git a/patches/glibc-2.7/generic/gentoo/6645_all_glibc-mips_shn_undef-hack.patch b/patches/glibc-2.7/generic/gentoo/6645_all_glibc-mips_shn_undef-hack.patch new file mode 100644 index 0000000..f653fb6 --- /dev/null +++ b/patches/glibc-2.7/generic/gentoo/6645_all_glibc-mips_shn_undef-hack.patch @@ -0,0 +1,29 @@ + Hack from Debian to hopefully get sandbox working on mips + +<`Kumba> ths: given the SHN_UNDEF thing is a hack, what's the preferred solution? +<ths> For fakeroot the simplest trigger is "fakeroot file /bin/ls". +<ths> `Kumba: I haven't found a better one yet. +<ths> Probably marker symbols around the stub section, and then exclude it from the link map. +<ths> This needs a ld change. + +--- + elf/do-lookup.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +Index: glibc-2.7/elf/do-lookup.h +=================================================================== +--- glibc-2.7.orig/elf/do-lookup.h ++++ glibc-2.7/elf/do-lookup.h +@@ -246,6 +246,12 @@ do_lookup_x (const char *undef_name, uin + } + /* FALLTHROUGH */ + case STB_GLOBAL: ++#ifdef __mips__ ++ /* HACK: MIPS marks its lazy evaluation stubs with SHN_UNDEF ++ symbols, we skip them. */ ++ if (sym->st_shndx == SHN_UNDEF) ++ break; ++#endif + /* Global definition. Just what we need. */ + result->s = sym; + result->m = (struct link_map *) map; diff --git a/patches/glibc-2.7/generic/series b/patches/glibc-2.7/generic/series index 4b9d92e..b45a2c9 100644 --- a/patches/glibc-2.7/generic/series +++ b/patches/glibc-2.7/generic/series @@ -6,3 +6,37 @@ configure-sane_readelf.diff glibc-2.5_stdlib_longlong.h cross_timezone.diff + +gentoo/0030_all_glibc-respect-env-CPPFLAGS.patch +gentoo/0040_all_glibc-i586-chk.patch +gentoo/0050_all_glibc-2.7-sscanf-as-BZ5441.patch +gentoo/0060_all_glibc-2.7-i386-makecontext-align-BZ5435.patch +gentoo/0065_all_glibc-2.7-i386-new-binutils.patch +gentoo/0070_all_glibc-i386-x86_64-revert-clone-cfi.patch +gentoo/0080_all_glibc-nscd-overflow-BZ5382.patch +gentoo/0085_all_glibc-resolv-locking-BZ5375.patch +gentoo/1010_all_glibc-queue-header-updates.patch +gentoo/1025_all_glibc-gcc-4.3-include-fixed.patch +gentoo/1030_all_glibc-manual-no-perl.patch +gentoo/1040_all_2.3.3-localedef-fix-trampoline.patch +gentoo/1045_all_glibc-handle-long-kernel-versions.patch +gentoo/1050_all_glibc-posix-awk.patch +gentoo/1055_all_glibc-resolv-dynamic.patch +gentoo/1058_all_glibc-gnulib-regcomp.patch +gentoo/1060_all_glibc-signal-timer-fd.patch +gentoo/1065_all_glibc-x86_64-libpthread-no-vdso.patch +gentoo/1075_all_glibc-section-comments.patch +gentoo/1080_all_glibc-no-inline-gmon.patch +gentoo/1085_all_glibc-omitfp-memmove.patch +gentoo/1090_all_glibc-2.3.6-fix-pr631.patch +gentoo/1100_all_glibc-2.3.3-china.patch +gentoo/1103_all_glibc-new-valencian-locale.patch +gentoo/1120_all_glibc-2.5-strict-aliasing.patch +gentoo/1130_all_glibc-2.4-undefine-__i686.patch +gentoo/3000_all_2.3.6-dl_execstack-PaX-support.patch +gentoo/3010_all_2.3.3_pre20040117-pt_pax.patch +gentoo/6400_all_sh-glibc-2.3.2-fpscr_values.patch +gentoo/6415_all_sh-glibc-2.5-no-asm-user-header.patch +gentoo/6416_all_sh-glibc-2.5-no-asm-elf-header.patch +gentoo/6417_all_sh-glibc-2.7-broken-nptl-lock-macros.patch +gentoo/6645_all_glibc-mips_shn_undef-hack.patch diff --git a/patches/glibc-2.7/series b/patches/glibc-2.7/series deleted file mode 100644 index 0b1e2be..0000000 --- a/patches/glibc-2.7/series +++ /dev/null @@ -1,3 +0,0 @@ -mcfv4e-codesourcery.patch - - diff --git a/patches/glibc-ports-2.7/generic/gentoo/6220_all_glibc-2.4-arm-cirrus-ep93xx-maverick-crunch-fpu.patch b/patches/glibc-ports-2.7/generic/gentoo/6220_all_glibc-2.4-arm-cirrus-ep93xx-maverick-crunch-fpu.patch new file mode 100644 index 0000000..f5b7582 --- /dev/null +++ b/patches/glibc-ports-2.7/generic/gentoo/6220_all_glibc-2.4-arm-cirrus-ep93xx-maverick-crunch-fpu.patch @@ -0,0 +1,388 @@ +http://yann.poupet.free.fr/ep93xx/ +Add support for the Maverick Crunch FPU on Cirrus EP93XX processor series + +--- + sysdeps/arm/bits/endian.h | 2 - + sysdeps/arm/fpu/__longjmp.S | 26 +++++++++++++ + sysdeps/arm/fpu/bits/fenv.h | 41 ++++++++++++++++++++ + sysdeps/arm/fpu/bits/setjmp.h | 4 ++ + sysdeps/arm/fpu/fegetround.c | 12 ++++++ + sysdeps/arm/fpu/fesetround.c | 16 ++++++++ + sysdeps/arm/fpu/fpu_control.h | 78 ++++++++++++++++++++++++++++++++++++++- + sysdeps/arm/fpu/jmpbuf-offsets.h | 4 ++ + sysdeps/arm/fpu/setjmp.S | 30 +++++++++++++++ + sysdeps/arm/gccframe.h | 4 ++ + sysdeps/arm/gmp-mparam.h | 2 - + 11 files changed, 216 insertions(+), 3 deletions(-) + +Index: glibc-ports-2.7/sysdeps/arm/bits/endian.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/bits/endian.h ++++ glibc-ports-2.7/sysdeps/arm/bits/endian.h +@@ -12,7 +12,7 @@ + /* FPA floating point units are always big-endian, irrespective of the + CPU endianness. VFP floating point units use the same endianness + as the rest of the system. */ +-#ifdef __VFP_FP__ ++#if defined __VFP_FP__ || defined __MAVERICK__ + #define __FLOAT_WORD_ORDER __BYTE_ORDER + #else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN +Index: glibc-ports-2.7/sysdeps/arm/fpu/bits/fenv.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/bits/fenv.h ++++ glibc-ports-2.7/sysdeps/arm/fpu/bits/fenv.h +@@ -20,6 +20,45 @@ + # error "Never use <bits/fenv.h> directly; include <fenv.h> instead." + #endif + ++#if defined(__MAVERICK__) ++ ++/* Define bits representing exceptions in the FPU status word. */ ++enum ++ { ++ FE_INVALID = 1, ++#define FE_INVALID FE_INVALID ++ FE_OVERFLOW = 4, ++#define FE_OVERFLOW FE_OVERFLOW ++ FE_UNDERFLOW = 8, ++#define FE_UNDERFLOW FE_UNDERFLOW ++ FE_INEXACT = 16, ++#define FE_INEXACT FE_INEXACT ++ }; ++ ++/* Amount to shift by to convert an exception to a mask bit. */ ++#define FE_EXCEPT_SHIFT 5 ++ ++/* All supported exceptions. */ ++#define FE_ALL_EXCEPT \ ++ (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) ++ ++/* IEEE rounding modes. */ ++enum ++ { ++ FE_TONEAREST = 0, ++#define FE_TONEAREST FE_TONEAREST ++ FE_TOWARDZERO = 0x400, ++#define FE_TOWARDZERO FE_TOWARDZERO ++ FE_DOWNWARD = 0x800, ++#define FE_DOWNWARD FE_DOWNWARD ++ FE_UPWARD = 0xc00, ++#define FE_UPWARD FE_UPWARD ++ }; ++ ++#define FE_ROUND_MASK (FE_UPWARD) ++ ++#else /* FPA */ ++ + /* Define bits representing exceptions in the FPU status word. */ + enum + { +@@ -44,6 +83,8 @@ enum + modes exist, but you have to encode them in the actual instruction. */ + #define FE_TONEAREST 0 + ++#endif ++ + /* Type representing exception flags. */ + typedef unsigned long int fexcept_t; + +Index: glibc-ports-2.7/sysdeps/arm/fpu/bits/setjmp.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/bits/setjmp.h ++++ glibc-ports-2.7/sysdeps/arm/fpu/bits/setjmp.h +@@ -28,7 +28,11 @@ + #ifndef _ASM + /* Jump buffer contains v1-v6, sl, fp, sp and pc. Other registers are not + saved. */ ++#ifdef __MAVERICK__ ++typedef int __jmp_buf[34]; ++#else + typedef int __jmp_buf[22]; + #endif ++#endif + + #endif +Index: glibc-ports-2.7/sysdeps/arm/fpu/jmpbuf-offsets.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/jmpbuf-offsets.h ++++ glibc-ports-2.7/sysdeps/arm/fpu/jmpbuf-offsets.h +@@ -17,4 +17,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#ifdef __MAVERICK__ ++#define __JMP_BUF_SP 32 ++#else + #define __JMP_BUF_SP 20 ++#endif +Index: glibc-ports-2.7/sysdeps/arm/fpu/fegetround.c +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/fegetround.c ++++ glibc-ports-2.7/sysdeps/arm/fpu/fegetround.c +@@ -18,9 +18,21 @@ + 02111-1307 USA. */ + + #include <fenv.h> ++#include <fpu_control.h> + + int + fegetround (void) + { ++#if defined(__MAVERICK__) ++ ++ unsigned long temp; ++ ++ _FPU_GETCW (temp); ++ return temp & FE_ROUND_MASK; ++ ++#else /* FPA */ ++ + return FE_TONEAREST; /* Easy. :-) */ ++ ++#endif + } +Index: glibc-ports-2.7/sysdeps/arm/fpu/fesetround.c +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/fesetround.c ++++ glibc-ports-2.7/sysdeps/arm/fpu/fesetround.c +@@ -18,12 +18,28 @@ + 02111-1307 USA. */ + + #include <fenv.h> ++#include <fpu_control.h> + + int + fesetround (int round) + { ++#if defined(__MAVERICK__) ++ unsigned long temp; ++ ++ if (round & ~FE_ROUND_MASK) ++ return 1; ++ ++ _FPU_GETCW (temp); ++ temp = (temp & ~FE_ROUND_MASK) | round; ++ _FPU_SETCW (temp); ++ return 0; ++ ++#else /* FPA */ ++ + /* We only support FE_TONEAREST, so there is no need for any work. */ + return (round == FE_TONEAREST)?0:1; ++ ++#endif + } + + libm_hidden_def (fesetround) +Index: glibc-ports-2.7/sysdeps/arm/fpu/fpu_control.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/fpu_control.h ++++ glibc-ports-2.7/sysdeps/arm/fpu/fpu_control.h +@@ -1,5 +1,6 @@ + /* FPU control word definitions. ARM version. +- Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 1998, 2000, 2005 ++ Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -20,6 +21,79 @@ + #ifndef _FPU_CONTROL_H + #define _FPU_CONTROL_H + ++#if defined(__MAVERICK__) ++ ++/* DSPSC register: (from EP9312 User's Guide) ++ * ++ * bits 31..29 - DAID ++ * bits 28..26 - HVID ++ * bits 25..24 - RSVD ++ * bit 23 - ISAT ++ * bit 22 - UI ++ * bit 21 - INT ++ * bit 20 - AEXC ++ * bits 19..18 - SAT ++ * bits 17..16 - FCC ++ * bit 15 - V ++ * bit 14 - FWDEN ++ * bit 13 - Invalid ++ * bit 12 - Denorm ++ * bits 11..10 - RM ++ * bits 9..5 - IXE, UFE, OFE, RSVD, IOE ++ * bits 4..0 - IX, UF, OF, RSVD, IO ++ */ ++ ++/* masking of interrupts */ ++#define _FPU_MASK_IM (1 << 5) /* invalid operation */ ++#define _FPU_MASK_ZM 0 /* divide by zero */ ++#define _FPU_MASK_OM (1 << 7) /* overflow */ ++#define _FPU_MASK_UM (1 << 8) /* underflow */ ++#define _FPU_MASK_PM (1 << 9) /* inexact */ ++#define _FPU_MASK_DM 0 /* denormalized operation */ ++ ++#define _FPU_RESERVED 0xfffff000 /* These bits are reserved. */ ++ ++#define _FPU_DEFAULT 0x00b00000 /* Default value. */ ++#define _FPU_IEEE 0x00b003a0 /* Default + exceptions enabled. */ ++ ++/* Type of the control word. */ ++typedef unsigned int fpu_control_t; ++ ++/* Macros for accessing the hardware control word. */ ++#define _FPU_GETCW(cw) ({ \ ++ register int __t1, __t2; \ ++ \ ++ __asm__ volatile ( \ ++ "cfmvr64l %1, mvdx0\n\t" \ ++ "cfmvr64h %2, mvdx0\n\t" \ ++ "cfmv32sc mvdx0, dspsc\n\t" \ ++ "cfmvr64l %0, mvdx0\n\t" \ ++ "cfmv64lr mvdx0, %1\n\t" \ ++ "cfmv64hr mvdx0, %2" \ ++ : "=r" (cw), "=r" (__t1), "=r" (__t2) \ ++ ); \ ++}) ++ ++#define _FPU_SETCW(cw) ({ \ ++ register int __t0, __t1, __t2; \ ++ \ ++ __asm__ volatile ( \ ++ "cfmvr64l %1, mvdx0\n\t" \ ++ "cfmvr64h %2, mvdx0\n\t" \ ++ "cfmv64lr mvdx0, %0\n\t" \ ++ "cfmvsc32 dspsc, mvdx0\n\t" \ ++ "cfmv64lr mvdx0, %1\n\t" \ ++ "cfmv64hr mvdx0, %2" \ ++ : "=r" (__t0), "=r" (__t1), "=r" (__t2) \ ++ : "0" (cw) \ ++ ); \ ++}) ++ ++/* Default control word set at startup. */ ++extern fpu_control_t __fpu_control; ++ ++#else /* FPA */ ++ + /* We have a slight terminology confusion here. On the ARM, the register + * we're interested in is actually the FPU status word - the FPU control + * word is something different (which is implementation-defined and only +@@ -99,4 +173,6 @@ typedef unsigned int fpu_control_t; + /* Default control word set at startup. */ + extern fpu_control_t __fpu_control; + ++#endif ++ + #endif /* _FPU_CONTROL_H */ +Index: glibc-ports-2.7/sysdeps/arm/fpu/__longjmp.S +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/__longjmp.S ++++ glibc-ports-2.7/sysdeps/arm/fpu/__longjmp.S +@@ -30,7 +30,33 @@ ENTRY (__longjmp) + movs r0, r1 /* get the return value in place */ + moveq r0, #1 /* can't let setjmp() return zero! */ + ++#ifdef __MAVERICK__ ++ cfldrd mvd4, [ip], #8 ++ nop ++ cfldrd mvd5, [ip], #8 ++ nop ++ cfldrd mvd6, [ip], #8 ++ nop ++ cfldrd mvd7, [ip], #8 ++ nop ++ cfldrd mvd8, [ip], #8 ++ nop ++ cfldrd mvd9, [ip], #8 ++ nop ++ cfldrd mvd10, [ip], #8 ++ nop ++ cfldrd mvd11, [ip], #8 ++ nop ++ cfldrd mvd12, [ip], #8 ++ nop ++ cfldrd mvd13, [ip], #8 ++ nop ++ cfldrd mvd14, [ip], #8 ++ nop ++ cfldrd mvd15, [ip], #8 ++#else + lfmfd f4, 4, [ip] ! /* load the floating point regs */ ++#endif + + LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc}) + END (__longjmp) +Index: glibc-ports-2.7/sysdeps/arm/fpu/setjmp.S +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/fpu/setjmp.S ++++ glibc-ports-2.7/sysdeps/arm/fpu/setjmp.S +@@ -24,11 +24,41 @@ + + ENTRY (__sigsetjmp) + /* Save registers */ ++#ifdef __MAVERICK__ ++ cfstrd mvd4, [r0], #8 ++ nop ++ cfstrd mvd5, [r0], #8 ++ nop ++ cfstrd mvd6, [r0], #8 ++ nop ++ cfstrd mvd7, [r0], #8 ++ nop ++ cfstrd mvd8, [r0], #8 ++ nop ++ cfstrd mvd9, [r0], #8 ++ nop ++ cfstrd mvd10, [r0], #8 ++ nop ++ cfstrd mvd11, [r0], #8 ++ nop ++ cfstrd mvd12, [r0], #8 ++ nop ++ cfstrd mvd13, [r0], #8 ++ nop ++ cfstrd mvd14, [r0], #8 ++ nop ++ cfstrd mvd15, [r0], #8 ++#else + sfmea f4, 4, [r0]! ++#endif + stmia r0, {v1-v6, sl, fp, sp, lr} + + /* Restore pointer to jmp_buf */ ++#ifdef __MAVERICK__ ++ sub r0, r0, #96 ++#else + sub r0, r0, #48 ++#endif + + /* Make a tail call to __sigjmp_save; it takes the same args. */ + B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) +Index: glibc-ports-2.7/sysdeps/arm/gccframe.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/gccframe.h ++++ glibc-ports-2.7/sysdeps/arm/gccframe.h +@@ -17,6 +17,10 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#ifdef __MAVERICK__ ++#define FIRST_PSEUDO_REGISTER 43 ++#else + #define FIRST_PSEUDO_REGISTER 27 ++#endif + + #include <sysdeps/generic/gccframe.h> +Index: glibc-ports-2.7/sysdeps/arm/gmp-mparam.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/arm/gmp-mparam.h ++++ glibc-ports-2.7/sysdeps/arm/gmp-mparam.h +@@ -29,7 +29,7 @@ MA 02111-1307, USA. */ + #if defined(__ARMEB__) + # define IEEE_DOUBLE_MIXED_ENDIAN 0 + # define IEEE_DOUBLE_BIG_ENDIAN 1 +-#elif defined(__VFP_FP__) ++#elif defined(__VFP_FP__) || defined(__MAVERICK__) + # define IEEE_DOUBLE_MIXED_ENDIAN 0 + # define IEEE_DOUBLE_BIG_ENDIAN 0 + #else diff --git a/patches/glibc-ports-2.7/generic/gentoo/6224_all_glibc-2.7-lowlevellock-includes.patch b/patches/glibc-ports-2.7/generic/gentoo/6224_all_glibc-2.7-lowlevellock-includes.patch new file mode 100644 index 0000000..4a33972 --- /dev/null +++ b/patches/glibc-ports-2.7/generic/gentoo/6224_all_glibc-2.7-lowlevellock-includes.patch @@ -0,0 +1,28 @@ +fix building on arm: + +armv4l-unknown-linux-gnu-gcc ../nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c -c -std=gnu99 -O2 -Wall -Winline -Wwrite-strings -fmerge-all-constants -fno-strict-aliasing -mcpu=strongarm110 -pipe -Wstrict-prototypes -fPIC -I../include -I/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/nptl -I/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl -I../ports/sysdeps/arm/elf -I../ports/sysdeps/unix/sysv/linux/arm/nptl -I../ports/sysdeps/unix/sysv/linux/arm -I../nptl/sysdeps/unix/sysv/linux -I../nptl/sysdeps/pthread -I../sysdeps/pthread -I../ports/sysdeps/unix/sysv/linux -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../nptl/sysdeps/unix/sysv -I../ports/sysdeps/unix/sysv -I../sysdeps/unix/sysv -I../ports/sysdeps/unix/arm -I../nptl/sysdeps/unix -I../ports/sysdeps/unix -I../sysdeps/unix -I../sysdeps/posix -I../ports/sysdeps/arm/fpu -I../ports/sysdeps/arm/nptl -I../ports/sysdeps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -I../nptl -I../ports -I.. -I../libio -I. -nostdinc -isystem /usr/lib/gcc/armv4l-unknown-linux-gnu/4.1.2/include -isystem /usr/lib/gcc/armv4l-unknown-linux-gnu/4.1.2/include-fixed -isystem /usr/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DSHARED -DNOT_IN_libc=1 -DIS_IN_rtld=1 -o /var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/nptl/rtld-libc-lowlevellock.os -MD -MP -MF /var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/nptl/rtld-libc-lowlevellock.os.dt -MT /var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/nptl/rtld-libc-lowlevellock.os +In file included from ../nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c:21: +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c: In function '__lll_lock_wait_private': +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:34: warning: implicit declaration of function 'THREAD_GETMEM' +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:34: error: 'THREAD_SELF' undeclared (first use in this function) +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:34: error: (Each undeclared identifier is reported only once +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:34: error: for each function it appears in.) +../nptl/sysdeps/unix/sysv/linux/lowlevellock.c:34: error: 'header' undeclared (first use in this function) +make[4]: *** [/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/nptl/rtld-libc-lowlevellock.os] Error 1 + +--- + sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h | 1 + + 1 file changed, 1 insertion(+) + +Index: glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h ++++ glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +@@ -25,6 +25,7 @@ + #include <atomic.h> + #include <sysdep.h> + #include <kernel-features.h> ++#include <tls.h> + + #define FUTEX_WAIT 0 + #define FUTEX_WAKE 1 diff --git a/patches/glibc-ports-2.7/generic/gentoo/6225_all_glibc-2.7-cargs6.patch b/patches/glibc-ports-2.7/generic/gentoo/6225_all_glibc-2.7-cargs6.patch new file mode 100644 index 0000000..a0d0e93 --- /dev/null +++ b/patches/glibc-ports-2.7/generic/gentoo/6225_all_glibc-2.7-cargs6.patch @@ -0,0 +1,31 @@ +fix building on arm: + +(echo '#include <sysdep-cancel.h>'; \ + echo 'PSEUDO (splice, splice, 6)'; \ + echo ' ret'; \ + echo 'PSEUDO_END(splice)'; \ + echo 'libc_hidden_def (splice)'; \ + ) | armv4l-unknown-linux-gnu-gcc -c -I../include -I/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/misc -I/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl -I../ports/sysdeps/arm/elf -I../ports/sysdeps/unix/sysv/linux/arm/nptl -I../ports/sysdeps/unix/sysv/linux/arm -I../nptl/sysdeps/unix/sysv/linux -I../nptl/sysdeps/pthread -I../sysdeps/pthread -I../ports/sysdeps/unix/sysv/linux -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../nptl/sysdeps/unix/sysv -I../ports/sysdeps/unix/sysv -I../sysdeps/unix/sysv -I../ports/sysdeps/unix/arm -I../nptl/sysdeps/unix -I../ports/sysdeps/unix -I../sysdeps/unix -I../sysdeps/posix -I../ports/sysdeps/arm/fpu -I../ports/sysdeps/arm/nptl -I../ports/sysdeps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -I../nptl -I../ports -I.. -I../libio -I. -nostdinc -isystem /usr/lib/gcc/armv4l-unknown-linux-gnu/4.1.2/include -isystem /usr/lib/gcc/armv4l-unknown-linux-gnu/4.1.2/include-fixed -isystem /usr/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DASSEMBLER -x assembler-with-cpp -o /var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/misc/splice.o - +<stdin>: Assembler messages: +<stdin>:2: Error: bad instruction `docargs_6' +<stdin>:2: Error: bad instruction `undocargs_6' +make[2]: *** [/var/tmp/portage/sys-libs/glibc-2.7-r1/work/build-default-armv4l-unknown-linux-gnu-nptl/misc/splice.o] Error 1 + +--- + sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h | 3 +++ + 1 file changed, 3 insertions(+) + +Index: glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h ++++ glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h +@@ -73,6 +73,9 @@ + # define DOCARGS_5 DOCARGS_4 + # define UNDOCARGS_5 UNDOCARGS_4 + ++# define DOCARGS_6 DOCARGS_5 ++# define UNDOCARGS_6 UNDOCARGS_5 ++ + # ifdef IS_IN_libpthread + # define CENABLE bl PLTJMP(__pthread_enable_asynccancel) + # define CDISABLE bl PLTJMP(__pthread_disable_asynccancel) diff --git a/patches/glibc-ports-2.7/generic/gentoo/6230_all_arm-glibc-2.5-no-page-header.patch b/patches/glibc-ports-2.7/generic/gentoo/6230_all_arm-glibc-2.5-no-page-header.patch new file mode 100644 index 0000000..f8852fc --- /dev/null +++ b/patches/glibc-ports-2.7/generic/gentoo/6230_all_arm-glibc-2.5-no-page-header.patch @@ -0,0 +1,20 @@ +2007-03-13 Mike Frysinger <vapier@gentoo.org> + + * sysdeps/unix/sysv/linux/arm/ioperm.c: Don't include asm/page.h. + +--- + sysdeps/unix/sysv/linux/arm/ioperm.c | 1 - + 1 file changed, 1 deletion(-) + +Index: glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/ioperm.c +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/unix/sysv/linux/arm/ioperm.c ++++ glibc-ports-2.7/sysdeps/unix/sysv/linux/arm/ioperm.c +@@ -45,7 +45,6 @@ + #include <sys/mman.h> + + #include <linux/version.h> +-#include <asm/page.h> + #include <sys/sysctl.h> + + #define PATH_ARM_SYSTYPE "/etc/arm_systype" diff --git a/patches/glibc-ports-2.7/generic/gentoo/6605_all_glibc-2.4-fpu-cw-mips.patch b/patches/glibc-ports-2.7/generic/gentoo/6605_all_glibc-2.4-fpu-cw-mips.patch new file mode 100644 index 0000000..832e84c --- /dev/null +++ b/patches/glibc-ports-2.7/generic/gentoo/6605_all_glibc-2.4-fpu-cw-mips.patch @@ -0,0 +1,19 @@ +http://sourceware.org/ml/libc-alpha/2002-10/msg00392.html + +--- + sysdeps/mips/fpu_control.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: glibc-ports-2.7/sysdeps/mips/fpu_control.h +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/mips/fpu_control.h ++++ glibc-ports-2.7/sysdeps/mips/fpu_control.h +@@ -85,7 +85,7 @@ extern fpu_control_t __fpu_control; + #define _FPU_RC_UP 0x2 + #define _FPU_RC_DOWN 0x3 + +-#define _FPU_RESERVED 0xfe3c0000 /* Reserved bits in cw */ ++#define _FPU_RESERVED 0xfebc0000 /* Reserved bits in cw */ + + + /* The fdlibm code requires strict IEEE double precision arithmetic, diff --git a/patches/glibc-ports-2.7/generic/glibc-2.5_ports_sysdeps_arm_mp_clz_tab.c b/patches/glibc-ports-2.7/generic/glibc-2.5_ports_sysdeps_arm_mp_clz_tab.c new file mode 100644 index 0000000..ee2a6bf --- /dev/null +++ b/patches/glibc-ports-2.7/generic/glibc-2.5_ports_sysdeps_arm_mp_clz_tab.c @@ -0,0 +1,33 @@ +--- + ports/sysdeps/arm/mp_clz_tab.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +Index: glibc-ports-2.7/ports/sysdeps/arm/mp_clz_tab.c +=================================================================== +--- /dev/null ++++ glibc-ports-2.7/ports/sysdeps/arm/mp_clz_tab.c +@@ -0,0 +1,24 @@ ++/* __clz_tab -- support for longlong.h ++ Copyright (C) 2004 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) ++/* Nothing required. */ ++#else ++#include <stdlib/mp_clz_tab.c> ++#endif diff --git a/patches/glibc-ports-2.7/generic/quilt-dummy.patch b/patches/glibc-ports-2.7/generic/quilt-dummy.patch deleted file mode 100644 index 4a992a5..0000000 --- a/patches/glibc-ports-2.7/generic/quilt-dummy.patch +++ /dev/null @@ -1,10 +0,0 @@ -Index: glibc-ports-2.7/README -=================================================================== ---- glibc-ports-2.7.orig/README 2008-03-10 18:34:42.000000000 +0100 -+++ glibc-ports-2.7/README 2008-03-10 18:35:22.000000000 +0100 -@@ -41,3 +41,4 @@ - - - $Id: README,v 1.2 2006/02/28 08:23:38 roland Exp $ -+-- ptxdist port for Coldfire 2008-03-10 -\ No newline at end of file diff --git a/patches/glibc-ports-2.7/generic/series b/patches/glibc-ports-2.7/generic/series new file mode 100644 index 0000000..0684074 --- /dev/null +++ b/patches/glibc-ports-2.7/generic/series @@ -0,0 +1,9 @@ +sysdeps_mips_mips32_Makefile-bootstrap.diff + +glibc-2.5_ports_sysdeps_arm_mp_clz_tab.c + +gentoo/6220_all_glibc-2.4-arm-cirrus-ep93xx-maverick-crunch-fpu.patch +gentoo/6605_all_glibc-2.4-fpu-cw-mips.patch +gentoo/6230_all_arm-glibc-2.5-no-page-header.patch +gentoo/6224_all_glibc-2.7-lowlevellock-includes.patch +gentoo/6225_all_glibc-2.7-cargs6.patch diff --git a/patches/glibc-ports-2.7/generic/series_2.7 b/patches/glibc-ports-2.7/generic/series_2.7 deleted file mode 100644 index ceb6774..0000000 --- a/patches/glibc-ports-2.7/generic/series_2.7 +++ /dev/null @@ -1,3 +0,0 @@ -#mcfv4e-codesourcery.patch -p1 - -quilt-dummy.patch diff --git a/patches/glibc-ports-2.7/generic/sysdeps_mips_mips32_Makefile-bootstrap.diff b/patches/glibc-ports-2.7/generic/sysdeps_mips_mips32_Makefile-bootstrap.diff new file mode 100644 index 0000000..62e5d82 --- /dev/null +++ b/patches/glibc-ports-2.7/generic/sysdeps_mips_mips32_Makefile-bootstrap.diff @@ -0,0 +1,40 @@ +http://sourceware.org/ml/crossgcc/2005-05/msg00165.html +Fixes a MIPS build problem (unrelated to NPTL) + +Message-ID: <428E8B24.1000201@realitydiluted.com> +Date: Fri, 20 May 2005 20:13:08 -0500 +From: "Steven J dot Hill" <sjhill at realitydiluted dot com> +To: crossgcc at sources dot redhat dot com, toolchain at gentoo dot org, + Shay_Gal-On at pmc-sierra dot com, TheNop at gmx dot net +Subject: New NPTL patches for crosstools and MIPS NPTL patches.... + +Greetings. + +I have uploaded the latest NPTL patch for crosstool-0.34. I have also +uploaded a tarball of the patches necessary to build a MIPS NPTL +cross toolchain. To build a MIPS NPTL toolchain you will need the +released version of binutils-2.16 and the absolute latest GCC and +glibc code from the HEAD of cvs. Use the 'demo-mips-nptl.sh' script +to build the toolchain. Please report bugs or issues to the crossgcc +mailing list. Here is the link off of my FTP site: + + ftp://ftp.realitydiluted.com/crosstools/crosstool-0.34/ + +[Note: BOOTSTRAP_GCC is set by crosstool.sh when invoking make install-headers] + +--- + sysdeps/mips/mips32/Makefile | 4 ++++ + 1 file changed, 4 insertions(+) + +Index: glibc-ports-2.7/sysdeps/mips/mips32/Makefile +=================================================================== +--- glibc-ports-2.7.orig/sysdeps/mips/mips32/Makefile ++++ glibc-ports-2.7/sysdeps/mips/mips32/Makefile +@@ -1,3 +1,7 @@ ++ifeq ($(filter -DBOOTSTRAP_GCC,$(CFLAGS)),) + ifeq ($(filter -mabi=32,$(CC)),) + CC += -mabi=32 + endif ++else ++CC += -D"_MIPS_SZPTR=32" ++endif diff --git a/patches/linux-2.6.25/generic/include_asm-arm_memory_h-remove-deprecated.diff b/patches/linux-2.6.25/generic/include_asm-arm_memory_h-remove-deprecated.diff new file mode 100644 index 0000000..77e4d5f --- /dev/null +++ b/patches/linux-2.6.25/generic/include_asm-arm_memory_h-remove-deprecated.diff @@ -0,0 +1,53 @@ +From: Marc Kleine-Budde <mkl@pengutronix.de> +Subject: remove __depreacted tag + +This patch fixes this problem, when compiling glibc-2.7 on arm with sanitized kernel-header: + +arm-v4t-linux-gnueabi-gcc ../ports/sysdeps/unix/sysv/linux/arm/ioperm.c -c -std=gnu99 -fgnu89-inline -O2 -Wall -Winline -Wwrite-strings -fmerge-all-constant +s -g -Wstrict-prototypes -I../include -I/home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build/misc -I/home/frogge +r/pengutronix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build -I../ports/sysdeps/arm/elf -I../ports/sysdeps/unix/sysv/linux/arm/eabi/nptl +-I../ports/sysdeps/unix/sysv/linux/arm/eabi -I../ports/sysdeps/unix/sysv/linux/arm/nptl -I../ports/sysdeps/unix/sysv/linux/arm -I../ports/sysdeps/unix/sysv/ +linux -I../nptl/sysdeps/unix/sysv/linux -I../nptl/sysdeps/pthread -I../sysdeps/pthread -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/commo +n -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../ports/sysdeps/unix/sysv -I../nptl/sysdeps/unix/sysv -I../sysdeps/unix/sysv -I../ports/sysdeps/unix/arm +-I../ports/sysdeps/unix -I../nptl/sysdeps/unix -I../sysdeps/unix -I../sysdeps/posix -I../ports/sysdeps/arm/eabi -I../ports/sysdeps/arm/nptl -I../ports/sysde +ps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic - +I../ports -I../nptl -I.. -I../libio -I. -nostdinc -isystem /home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/opt/OSELAS.Toolchain-trunk/arm-v4t-linu +x-gnueabi/gcc-4.2.3-glibc-2.7-kernel-2.6.25-sanitized/gcc-first/lib/gcc/arm-v4t-linux-gnueabi/4.2.3/include -isystem /home/frogger/pengutronix/toolchain/OSE +LAS.Toolchain-mkl/opt/OSELAS.Toolchain-trunk/arm-v4t-linux-gnueabi/gcc-4.2.3-glibc-2.7-kernel-2.6.25-sanitized/sysroot-arm-v4t-linux-gnueabi/usr/include -D_ +LIBC_REENTRANT -include ../include/libc-symbols.h -o /home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build/misc/ +ioperm.o -MD -MP -MF /home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build/misc/ioperm.o.dt -MT /home/frogger/pengutro +nix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build/misc/ioperm.o +In file included from /home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/opt/OSELAS.Toolchain-trunk/arm-v4t-linux-gnueabi/gcc-4.2.3-glibc-2.7-kernel-2 +.6.25-sanitized/sysroot-arm-v4t-linux-gnueabi/usr/include/asm/page.h:178, + from ../ports/sysdeps/unix/sysv/linux/arm/ioperm.c:48: +/home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/opt/OSELAS.Toolchain-trunk/arm-v4t-linux-gnueabi/gcc-4.2.3-glibc-2.7-kernel-2.6.25-sanitized/sysroo +t-arm-v4t-linux-gnueabi/usr/include/asm/memory.h:191: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'unsigned' +/home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/opt/OSELAS.Toolchain-trunk/arm-v4t-linux-gnueabi/gcc-4.2.3-glibc-2.7-kernel-2.6.25-sanitized/sysroo +t-arm-v4t-linux-gnueabi/usr/include/asm/memory.h:196: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' +make[3]: *** [/home/frogger/pengutronix/toolchain/OSELAS.Toolchain-mkl/build-target/glibc-2.7-first-build/misc/ioperm.o] Error 1 + +Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> + +--- + include/asm-arm/memory.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: linux-2.6.25/include/asm-arm/memory.h +=================================================================== +--- linux-2.6.25.orig/include/asm-arm/memory.h ++++ linux-2.6.25/include/asm-arm/memory.h +@@ -188,12 +188,12 @@ static inline void *phys_to_virt(unsigne + * memory. Use of these is *deprecated* (and that doesn't mean + * use the __ prefixed forms instead.) See dma-mapping.h. + */ +-static inline __deprecated unsigned long virt_to_bus(void *x) ++static inline unsigned long virt_to_bus(void *x) + { + return __virt_to_bus((unsigned long)x); + } + +-static inline __deprecated void *bus_to_virt(unsigned long x) ++static inline void *bus_to_virt(unsigned long x) + { + return (void *)__bus_to_virt(x); + } diff --git a/patches/linux-2.6.25/generic/series b/patches/linux-2.6.25/generic/series new file mode 100644 index 0000000..157d476 --- /dev/null +++ b/patches/linux-2.6.25/generic/series @@ -0,0 +1 @@ +include_asm-arm_memory_h-remove-deprecated.diff |