From 1906cf93f86d8d66f45f90380a8d3da25c087ee5 Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN\"" Date: Sat, 24 Feb 2007 11:00:05 +0000 Subject: Add the full crosstool-NG sources to the new repository of its own. You might just say: 'Yeah! crosstool-NG's got its own repo!". Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup. That means I'm putting backups in place in the afternoon. That also means we've lost history... :-( diff --git a/.cdtproject b/.cdtproject new file mode 100644 index 0000000..6940585 --- /dev/null +++ b/.cdtproject @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +make + +all +true +true + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..521ece3 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + crosstool-ng + + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.cdt.make.core.makeBuilder.launch + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.cdt.make.core.ScannerConfigBuilder.launch + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.make.core.makeNature + org.eclipse.cdt.make.core.ScannerConfigNature + + diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..d9cabed --- /dev/null +++ b/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,3 @@ +#Sat Feb 17 16:17:18 CET 2007 +eclipse.preferences.version=1 +indexerId=org.eclipse.cdt.core.fastIndexer diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..8c36fbe --- /dev/null +++ b/COPYING @@ -0,0 +1,21 @@ +Unless otherwise stated in individaul files, this work is licensed to you under +the following terms. + +- Files in docs/ are available under the Creative Commons Attribution, Share + Alike (by-sa), v2.5, to be found there: + licenses/by-sa/deed.en (human-readable summary) + licenses/by-sa/legalcode (legal code, the full license) + +- Files found in patches/uClibc/*/ are available under the GNU Lesser General + Public License (LGPL), v2.1, to be found here: + licenses/lgpl.txt + +- Files found in patches/glibc/*/ are available under the GNU Lesser General + Public License (LGPL), v2.1, to be found there: + licenses/lgpl.txt + +- Other files not covered by the above licenses, and not covered by an + individual license specified in the file itself, or an accompanying file, + are available under the GNU General Public License (GPL), v2, to be found + here: + licenses/gpl.txt diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000..b571936 --- /dev/null +++ b/CREDITS @@ -0,0 +1,9 @@ +I would like to thank these fine people for making crosstool-NG possible: + + Dan KEGEL, the original author of crosstool: http://www.kegel.com/ + Dan was very helpfull and willing to help when I build my first toolchains. + I owe him one. Thank you Dan! + Some crosstool-NG scripts have code snippets coming almost as-is from the + original work by Dan. + +More to come as they help. diff --git a/LICENSES b/LICENSES new file mode 120000 index 0000000..d24842f --- /dev/null +++ b/LICENSES @@ -0,0 +1 @@ +COPYING \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bab7828 --- /dev/null +++ b/Makefile @@ -0,0 +1,46 @@ +# Makefile for crosstool-NG. +# Copyright 2006 Yann E. MORIN + +# The project version +export PROJECTVERSION=0.0.1 + +# This should eventually be computed if compiling out-of-tree is implemented +export CT_TOP_DIR=$(shell pwd) + +.PHONY: all +all: build + +HOST_CC = gcc -funsigned-char + +help:: + @echo 'Available make targets (*: default target):' + @echo + +include $(CT_TOP_DIR)/kconfig/Makefile +#include $(CT_TOP_DIR)/samples/Makefile + +help:: + @echo 'Build targets:' + @echo '* build - Build the toolchain' + @echo ' clean - Remove generated files' + @echo ' distclean - Remove generated files and configuration' + +include $(CT_TOP_DIR)/tools/Makefile + +.config: config/*.in + @make menuconfig + @# Because exiting menuconfig without saving is not an error to menuconfig + @test -f .config + +# Actual build +build: .config + @$(CT_TOP_DIR)/scripts/crosstool.sh + +.PHONY: clean +clean:: + @rm -f .crosstool.config + +.PHONY: distclean +distclean:: clean + @rm -f .config* ..config.tmp + diff --git a/README b/README new file mode 100644 index 0000000..2d1f154 --- /dev/null +++ b/README @@ -0,0 +1,9 @@ +This is the README for crosstool-NG + +To get you started, hust enter: + make help + +You can find a (terse and WIP) documentation in docs/. + +You can also point your browser to + http://ymorin.is-a-geek.org/dokuwiki/doku.php?id=projects:crosstool diff --git a/config/binutils.in b/config/binutils.in new file mode 100644 index 0000000..e91b64e --- /dev/null +++ b/config/binutils.in @@ -0,0 +1,133 @@ +# binutils options + +menu "binutils" + +config BINUTILS_VERSION + string + +choice + bool + prompt "binutils version" + +config BINUTILS_V_2_11_2 + bool + prompt "2.11.2" + +config BINUTILS_V_2_13_90 + bool + prompt "2.13.90" + +config BINUTILS_V_2_14 + bool + prompt "2.14" + +config BINUTILS_V_2_14_90 + bool + prompt "2.14.90" + +config BINUTILS_V_2_14_92 + bool + prompt "2.14.92" + +config BINUTILS_V_2_15 + bool + prompt "2.15" + +config BINUTILS_V_2_15_90 + bool + prompt "2.15.90" + +config BINUTILS_V_2_15_91 + bool + prompt "2.15.91" + +config BINUTILS_V_2_16 + bool + prompt "2.16" + +config BINUTILS_V_2_16_1 + bool + prompt "2.16.1" + +config BINUTILS_V_2_17 + bool + prompt "2.17" + +config BINUTILS_V_2_17_50_0_1 + bool + prompt "2.17.50.0.1" + +config BINUTILS_V_2_17_50_0_2 + bool + prompt "2.17.50.0.2" + +config BINUTILS_V_2_17_50_0_3 + bool + prompt "2.17.50.0.3" + +config BINUTILS_V_2_17_50_0_4 + bool + prompt "2.17.50.0.4" + +config BINUTILS_V_2_17_50_0_5 + bool + prompt "2.17.50.0.5" + +config BINUTILS_V_2_17_50_0_6 + bool + prompt "2.17.50.0.6" + +config BINUTILS_V_2_17_50_0_7 + bool + prompt "2.17.50.0.7" + +config BINUTILS_V_2_17_50_0_8 + bool + prompt "2.17.50.0.8" + +config BINUTILS_V_2_17_50_0_9 + bool + prompt "2.17.50.0.9" + +config BINUTILS_V_2_17_50_0_10 + bool + prompt "2.17.50.0.10" + +# CT_INSERT_VERSION_ABOVE +# Don't remove qbove line! +endchoice + +config BINUTILS_VERSION + string + default "2.11.2" if BINUTILS_V_2_11_2 + default "2.13.90" if BINUTILS_V_2_13_90 + default "2.14" if BINUTILS_V_2_14 + default "2.14.90" if BINUTILS_V_2_14_90 + default "2.14.92" if BINUTILS_V_2_14_92 + default "2.15" if BINUTILS_V_2_15 + default "2.15.90" if BINUTILS_V_2_15_90 + default "2.15.91" if BINUTILS_V_2_15_91 + default "2.16" if BINUTILS_V_2_16 + default "2.16.1" if BINUTILS_V_2_16_1 + default "2.17" if BINUTILS_V_2_17 + default "2.17.50.0.1" if BINUTILS_V_2_17_50_0_1 + default "2.17.50.0.2" if BINUTILS_V_2_17_50_0_2 + default "2.17.50.0.3" if BINUTILS_V_2_17_50_0_3 + default "2.17.50.0.4" if BINUTILS_V_2_17_50_0_4 + default "2.17.50.0.5" if BINUTILS_V_2_17_50_0_5 + default "2.17.50.0.6" if BINUTILS_V_2_17_50_0_6 + default "2.17.50.0.7" if BINUTILS_V_2_17_50_0_7 + default "2.17.50.0.8" if BINUTILS_V_2_17_50_0_8 + default "2.17.50.0.9" if BINUTILS_V_2_17_50_0_9 + default "2.17.50.0.10" if BINUTILS_V_2_17_50_0_10 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove qbove line! + +config BINUTILS_EXTRA_CONFIG + string + prompt "binutils extra config" + default "" + help + Extra flags passed onto ./configure when configuring + +endmenu diff --git a/config/cc.in b/config/cc.in new file mode 100644 index 0000000..18eb559 --- /dev/null +++ b/config/cc.in @@ -0,0 +1,185 @@ +# Compiler options + +menu "C compiler" + +comment "Core C Compiler (used to build the C library)" + +config CC_USE_CORE + bool + prompt "Use a different core C compiler" + default n + help + Use a different compiler to build the C library than the one + in the final toolchain. + + You can change the compiler used, or only the version used. + + You most probably don't need that. + +config CC_CORE_GCC + bool + default y if ! CC_USE_CORE && CC_GCC + default n if CC_USE_CORE || ! CC_GCC + +config CC_CORE_TCC + bool + default y if ! CC_USE_CORE && CC_TCC + default n if CC_USE_CORE || ! CC_TCC + +choice + bool + prompt "Core C compiler:" + depends on CC_USE_CORE + +config CC_CORE_GCC + bool + prompt "gcc" + +#config CC_CORE_TCC +# bool +# prompt "tcc (EXPERIMENTAL)" + +endchoice + +config CC_CORE_VERSION + string + +config CC_CORE + string + default "gcc" if CC_CORE_GCC + default "tcc" if CC_CORE_TCC + +if CC_CORE_GCC && CC_USE_CORE +source config/cc_core_gcc.in +endif + +if CC_CORE_TCC && CC_USE_CORE +source config/cc_core_tcc.in +endif + +comment "Final C compiler" + +choice + bool + prompt "Final C compiler" + default CC_GCC + +config CC_GCC + bool + prompt "gcc" + select CC_SUPPORT_CXX + select CC_SUPPORT_FORTRAN + select CC_SUPPORT_JAVA + select CC_SUPPORT_ADA + select CC_SUPPORT_OBJC + select CC_SUPPORT_OBJCXX + +#config CC_TCC +# bool +# prompt "tcc (EXPERIMENTAL)" +# select CC_LANG_C + +endchoice + +config CC_VERSION + string + +config CC + string + default "gcc" if CC_GCC + default "tcc" if CC_TCC + +if CC_GCC +source config/cc_gcc.in +endif + +if CC_GCC +source config/cc_tcc.in +endif + +config CC_SUPPORT_CXX + bool + +config CC_SUPPORT_FORTRAN + bool + +config CC_SUPPORT_JAVA + bool + +config CC_SUPPORT_ADA + bool + +config CC_SUPPORT_OBJC + bool + +config CC_SUPPORT_OBJCXX + bool + +comment "Additionnal supported languages:" + +config CC_LANG_CXX + bool + prompt "C++" + default n + depends on CC_SUPPORT_CXX + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_FORTRAN + bool + prompt "Fortran" + default n + depends on CC_SUPPORT_FORTRAN + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_JAVA + bool + prompt "Java" + default n + depends on CC_SUPPORT_JAVA + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_ADA + bool + prompt "ADA" + default n + depends on CC_SUPPORT_ADA + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OBJC + bool + prompt "Objective-C" + default n + depends on CC_SUPPORT_OBJC + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OBJCXX + bool + prompt "Objective-C++" + default n + depends on CC_SUPPORT_OBJCXX + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OTHERS + string + prompt "Other languages" + default "" + help + Enter here a comma-separated list of languages that you know your compiler + supports, besides those listed above. + + Eg. gcc-4.1+ has a toy programming language, treelang. As it is not usefull + in real life, it is not available in the selection above. + +endmenu diff --git a/config/cc_core_gcc.in b/config/cc_core_gcc.in new file mode 100644 index 0000000..f922219 --- /dev/null +++ b/config/cc_core_gcc.in @@ -0,0 +1,137 @@ +# Compiler options + +choice + bool + prompt "Core gcc version" + +config CC_CORE_V_2_95_3 + bool + prompt "2.95.3" + +config CC_CORE_V_3_2_3 + bool + prompt "3.2.3" + +config CC_CORE_V_3_3 + bool + prompt "3.3" + +config CC_CORE_V_3_3_1 + bool + prompt "3.3.1" + +config CC_CORE_V_3_3_2 + bool + prompt "3.3.2" + +config CC_CORE_V_3_3_3 + bool + prompt "3.3.3" + +config CC_CORE_V_3_3_4 + bool + prompt "3.3.4" + +config CC_CORE_V_3_3_5 + bool + prompt "3.3.5" + +config CC_CORE_V_3_3_6 + bool + prompt "3.3.6" + +config CC_CORE_V_3_4_0 + bool + prompt "3.4.0" + +config CC_CORE_V_3_4_1 + bool + prompt "3.4.1" + +config CC_CORE_V_3_4_2 + bool + prompt "3.4.2" + +config CC_CORE_V_3_4_3 + bool + prompt "3.4.3" + +config CC_CORE_V_3_4_4 + bool + prompt "3.4.4" + +config CC_CORE_V_3_4_5 + bool + prompt "3.4.5" + +config CC_CORE_V_3_4_6 + bool + prompt "3.4.6" + +config CC_CORE_V_4_0_0 + bool + prompt "4.0.0" + +config CC_CORE_V_4_0_1 + bool + prompt "4.0.1" + +config CC_CORE_V_4_0_2 + bool + prompt "4.0.2" + +config CC_CORE_V_4_0_3 + bool + prompt "4.0.3" + +config CC_CORE_V_4_0_4 + bool + prompt "4.0.4" + +config CC_CORE_V_4_1_0 + bool + prompt "4.1.0" + +config CC_CORE_V_4_1_1 + bool + prompt "4.1.1" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config CC_CORE_VERSION + string + default "2.95.3" if CC_CORE_V_2_95_3 + default "3.2.3" if CC_CORE_V_3_2_3 + default "3.3" if CC_CORE_V_3_3 + default "3.3.1" if CC_CORE_V_3_3_1 + default "3.3.2" if CC_CORE_V_3_3_2 + default "3.3.3" if CC_CORE_V_3_3_3 + default "3.3.4" if CC_CORE_V_3_3_4 + default "3.3.5" if CC_CORE_V_3_3_5 + default "3.3.6" if CC_CORE_V_3_3_6 + default "3.4.0" if CC_CORE_V_3_4_0 + default "3.4.1" if CC_CORE_V_3_4_1 + default "3.4.2" if CC_CORE_V_3_4_2 + default "3.4.3" if CC_CORE_V_3_4_3 + default "3.4.4" if CC_CORE_V_3_4_4 + default "3.4.5" if CC_CORE_V_3_4_5 + default "3.4.6" if CC_CORE_V_3_4_6 + default "4.0.0" if CC_CORE_V_4_0_0 + default "4.0.1" if CC_CORE_V_4_0_1 + default "4.0.2" if CC_CORE_V_4_0_2 + default "4.0.3" if CC_CORE_V_4_0_3 + default "4.0.4" if CC_CORE_V_4_0_4 + default "4.1.0" if CC_CORE_V_4_1_0 + default "4.1.1" if CC_CORE_V_4_1_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +config CC_CORE_EXTRA_CONFIG + string + prompt "Core gcc extra config" + default "" + depends on CC_USE_CORE && CC_CORE_GCC || ! CC_USE_CORE && CC_GCC + help + Extra flags to pass onto ./configure when configuring the core gcc. diff --git a/config/cc_core_tcc.in b/config/cc_core_tcc.in new file mode 100644 index 0000000..e69de29 diff --git a/config/cc_gcc.in b/config/cc_gcc.in new file mode 100644 index 0000000..3e64b7f --- /dev/null +++ b/config/cc_gcc.in @@ -0,0 +1,131 @@ +# Compiler options + +choice + bool + prompt "Final gcc version" + +config CC_V_2_95_3 + bool + prompt "2.95.3" + +config CC_V_3_2_3 + bool + prompt "3.2.3" + +config CC_V_3_3 + bool + prompt "3.3" + +config CC_V_3_3_1 + bool + prompt "3.3.1" + +config CC_V_3_3_2 + bool + prompt "3.3.2" + +config CC_V_3_3_3 + bool + prompt "3.3.3" + +config CC_V_3_3_4 + bool + prompt "3.3.4" + +config CC_V_3_3_5 + bool + prompt "3.3.5" + +config CC_V_3_3_6 + bool + prompt "3.3.6" + +config CC_V_3_4_0 + bool + prompt "3.4.0" + +config CC_V_3_4_1 + bool + prompt "3.4.1" + +config CC_V_3_4_2 + bool + prompt "3.4.2" + +config CC_V_3_4_3 + bool + prompt "3.4.3" + +config CC_V_3_4_4 + bool + prompt "3.4.4" + +config CC_V_3_4_5 + bool + prompt "3.4.5" + +config CC_V_4_0_0 + bool + prompt "4.0.0" + +config CC_V_4_0_1 + bool + prompt "4.0.1" + +config CC_V_4_0_2 + bool + prompt "4.0.2" + +config CC_V_4_0_3 + bool + prompt "4.0.3" + +config CC_V_4_0_4 + bool + prompt "4.0.4" + +config CC_V_4_1_0 + bool + prompt "4.1.0" + +config CC_V_4_1_1 + bool + prompt "4.1.1" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config CC_VERSION + string + default "2.95.3" if CC_V_2_95_3 + default "3.2.3" if CC_V_3_2_3 + default "3.3" if CC_V_3_3 + default "3.3.1" if CC_V_3_3_1 + default "3.3.2" if CC_V_3_3_2 + default "3.3.3" if CC_V_3_3_3 + default "3.3.4" if CC_V_3_3_4 + default "3.3.5" if CC_V_3_3_5 + default "3.3.6" if CC_V_3_3_6 + default "3.4.0" if CC_V_3_4_0 + default "3.4.1" if CC_V_3_4_1 + default "3.4.2" if CC_V_3_4_2 + default "3.4.3" if CC_V_3_4_3 + default "3.4.4" if CC_V_3_4_4 + default "3.4.5" if CC_V_3_4_5 + default "4.0.0" if CC_V_4_0_0 + default "4.0.1" if CC_V_4_0_1 + default "4.0.2" if CC_V_4_0_2 + default "4.0.3" if CC_V_4_0_3 + default "4.0.4" if CC_V_4_0_4 + default "4.1.0" if CC_V_4_1_0 + default "4.1.1" if CC_V_4_1_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +config CC_EXTRA_CONFIG + string + prompt "Final gcc extra config" + default "" + help + Extra flags to pass onto ./configure when configuring gcc. diff --git a/config/cc_tcc.in b/config/cc_tcc.in new file mode 100644 index 0000000..e69de29 diff --git a/config/config.in b/config/config.in new file mode 100644 index 0000000..76bc8ca --- /dev/null +++ b/config/config.in @@ -0,0 +1,6 @@ +source config/global.in +source config/target.in +source config/kernel.in +source config/binutils.in +source config/cc.in +source config/libc.in diff --git a/config/global.in b/config/global.in new file mode 100644 index 0000000..e61b132 --- /dev/null +++ b/config/global.in @@ -0,0 +1,256 @@ +# Overall toolchain configuration: paths, jobs, etc... + +menu "Paths and misc options" + +config PARALLEL_JOBS + int + prompt "Number of parallel jobs" + default 1 + help + Number of jobs make will be allowed to run concurently. + Set this higher than the number of processors you have, but not too high. + A good rule of thumb is twice the number of processors you have. + + Enter 1 (or 0) to have only one job at a time. + +config LOAD + int + prompt "Maximum allowed load" + default 0 + help + Specifies that no new jobs should be started if there are others jobs + running and the load average is at least this value. + + Makes sense on SMP machines only. + + Enter 0 to have no limit on the load average. + + Note: only the integer part of the load is allowed here (you can't enter + 0.75 for example). + +config NICE + int + prompt "Nice level" + default 0 + range 0 19 + help + Renices the build process up. + +config USE_PIPES + bool + prompt "Use -pipe" + default y + help + Use gcc's option -pipe to use pipes rather than temp files when building + the toolchain. + +comment "Paths" + +config TARBALLS_DIR + string + prompt "Tarballs directory" + default "`pwd`/tarballs" + help + This is the directory into which tarballs are going to be stored once + they are downloaded (or otherwise retrieved). + +config SRC_DIR + string + prompt "Extract directory" + default "`pwd`/${CT_TARGET}/src" + help + This is the directory into which tarballs will be extracted. + + If you will build multiple toolchains, you should arrange to have one + SRC_DIR for each toolchain, as different targets may require different + patches to be applied. + +config BUILD_DIR + string + prompt "Build directory" + default "`pwd`/${CT_TARGET}/gcc-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" + help + This is the directory into which builds will occur. + + Once again, arrange for one build directory for each toolchain you build, + to avoid collision. + +config PREFIX_DIR + string + prompt "Prefix directory" + default "${HOME}/${CT_TARGET}" + help + This is the path the toolchain will run from. + +config INSTALL_DIR + string +# prompt "Install directory" + default "${CT_PREFIX_DIR}" +# help +# This is the path the target will be installed into. +# +# Normally, you would set this to ${CT_PREFIX_DIR}, but if for some reasons +# you can't write there, you can install somewhere else and have a third +# person do the install for you. +# The reason you might also want to install elsewhere is if you are going +# to package your shinny new toolchain for distribution. + +config CUSTOM_PATCH + bool + prompt "Use custom patch directory" + default n + help + If you have custom patches that you want to be applied, say 'Y' here and + enter the path directory below. + + Note that you must ensure that the patch directory is arranged the same + way the official directory is. + +config CUSTOM_PATCH_ONLY + bool + prompt "Only use custom patches" + default n + depends on CUSTOM_PATCH + help + Don't apply patches coming with CT-NG, only those patches available in + the directory below. + + If you say 'N' here, then the patches provided with CT-NG will be applied + first, and then your patches. + +config CUSTOM_PATCH_DIR + string + prompt "Custom patch directory" + default "" + depends on CUSTOM_PATCH + help + Enter the custom patch directory here. + +comment "Downloading and extracting" + +config NO_DOWNLOAD + bool + prompt "Avoid downloads" + default n + help + Avoid downloading anything. Bail out if a tarball is missing. + +config ONLY_DOWNLOAD + bool + prompt "Only download tarballs" + default n + depends on ! NO_DOWNLOAD + help + Only download the tarballs. Exit once it done. + + Usefull to pre-retrieve the tarballs before going off-line. + +config FORCE_DOWNLOAD + bool + prompt "Force downloads" + default n + depends on ! NO_DOWNLOAD + help + Force downloading tarballs, even if one already exists. + Usefull if you suspect a tarball to be damaged. + +config FORCE_EXTRACT + bool + prompt "Force extractions" + depends on ! ONLY_DOWNLOAD + default n + help + Force extraction of already exctracted tarballs. + + Usefull if you suspect a previous extract did not complete (eg. broken + tarball), or you added a new set of patches for this component. + +comment "Logging" + +choice + bool + prompt "Maximum log level to see:" + default LOG_INFO + +config LOG_ERROR + bool + prompt "ERROR" + help + The build will be silent. + Only if there is an error will you see a mesage. + +config LOG_WARN + bool + prompt "WARN" + help + The same as above, plus warnings. + +config LOG_INFO + bool + prompt "INFO" + help + The same as above, plus informational messages (main steps). + +config LOG_EXTRA + bool + prompt "EXTRA" + help + The same as above, plus extra messages (sub-steps). + +config LOG_DEBUG + bool + prompt "DEBUG" + help + The same as above, plus lots of debug information, of which each + component's build messages (very noisy!). + +endchoice + +config LOG_LEVEL_MAX + string + default "ERROR" if LOG_ERROR + default "WARN" if LOG_WARN + default "INFO" if LOG_INFO + default "EXTRA" if LOG_EXTRA + default "DEBUG" if LOG_DEBUG + +config LOG_PROGRESS_BAR + bool + prompt "Progress bar" + default n + depends on ! LOG_DEBUG + help + This option will print a "rotating bar" (/-\|) below the last log line + to show work is not stalled. + + Available when not in DEBUG log level. + +config LOG_USE_COLORS + bool + prompt "Use colors for logging to console" + default n + help + Use colors to highlight important messages. + ERROR: bright red + WARN : bright yellow + INFO : bright green + EXTRA: dim green + DEBUG: dim white + +config LOG_TO_FILE + bool + prompt "Log to a file" + default y + help + Save *full* logs to a file. Even log levels you didn't specify above + will be available in this file. + +config LOG_FILE + string + prompt "Log file" + default "${CT_PREFIX_DIR}/${CT_TARGET}.log" + depends on LOG_TO_FILE + help + File name into which to put logs. + +endmenu diff --git a/config/kernel.in b/config/kernel.in new file mode 100644 index 0000000..414ab26 --- /dev/null +++ b/config/kernel.in @@ -0,0 +1,36 @@ +# Kernel options + +menu "Kernel" + +choice + bool + prompt "\"Kernel\" to use:" + default KERNEL_LINUX + +config KERNEL_LINUX + bool + prompt "linux" + help + Build a toolchain targeting systems running Linux as a kernel. + +config KERNEL_CYGWIN + bool + prompt "cygwin" + depends on ARCH_x86 || ARCH_x86_64 + help + Build a toolchain targeting systems running Windows/cygwin as a kernel. + +endchoice + +config KERNEL_VERSION + string + +if KERNEL_LINUX +source config/kernel_linux.in +endif + +if KERNEL_CYGWIN +source config/kernel_cygwin.in +endif + +endmenu diff --git a/config/kernel_cygwin.in b/config/kernel_cygwin.in new file mode 100644 index 0000000..1edac59 --- /dev/null +++ b/config/kernel_cygwin.in @@ -0,0 +1,5 @@ +# Cygwin 'kernel' options + +config KERNEL + string + default "cygwin" diff --git a/config/kernel_linux.in b/config/kernel_linux.in new file mode 100644 index 0000000..aa07cad --- /dev/null +++ b/config/kernel_linux.in @@ -0,0 +1,102 @@ +# Linux kernel options + +choice + bool + prompt "Get kernel headers from:" + +config KERNEL_LINUX_HEADERS_INSTALL + bool + prompt "kernel's 'headers_install'" + help + This will make use of the new headers_install rule in recent kernels. + This is most probably what you want to use. + +config KERNEL_LINUX_HEADERS_SANITISED + bool + prompt "Mazur's sanitized headers (OBSOLETE)" + help + M. Mazur used to maintain a tree of sanitised headers, but it is now + obsoleted by the headers_install rule (above), and has not seen eny + update since 2.6.12 + +config KERNEL_LINUX_HEADERS_COPY + bool + prompt "pure kernel headers (NOT RECOMMENDED)" + help + This will simply copy the kernel headers to the toolchain. + + You do NOT want this. It's badly broken because it leaks kernel internals + to userspace. + +endchoice + +config KERNEL + string + default "linux" if KERNEL_LINUX_HEADERS_INSTALL || KERNEL_LINUX_HEADERS_COPY + default "linux-libc-headers" if KERNEL_LINUX_HEADERS_SANITISED + +config KERNEL_VERSION_SEE_EXTRAVERSION + bool + prompt "See extra versions" + default n + depends on ! KERNEL_LINUX_HEADERS_SANITISED + help + See extra versions (kernel with 4 numbers, eg 2.6.19.1). + + If you say 'no', you'll only see sub-level, 3-digit versions. + If you say 'yes', you'll see far more versions! + + It is recommended that you say 'no', unless you _*know*_ + that an extra version fixes a headers bug. + +if KERNEL_LINUX_HEADERS_INSTALL +source config/kernel_linux_headers_install.in +endif + +if KERNEL_LINUX_HEADERS_COPY +source config/kernel_linux_headers_copy.in +endif + +if KERNEL_LINUX_HEADERS_SANITISED +source config/kernel_linux_headers_sanitised.in +endif + +choice + bool + prompt "Kernel verbosity:" + default KERNEL_LINUX_VERBOSITY_0 + +config KERNEL_LINUX_VERBOSITY_0 + bool + prompt "Simplified" + help + Print simplified command lines. + +config KERNEL_LINUX_VERBOSITY_1 + bool + prompt "Full commands" + help + Print full command lines. + +config KERNEL_LINUX_VERBOSITY_2 + bool + prompt "Exec reasons" + help + Print the reasons why a make target is rebuild. + +endchoice + +config KERNEL_LINUX_VERBOSE_LEVEL + int + default 0 if KERNEL_LINUX_VERBOSITY_0 + default 1 if KERNEL_LINUX_VERBOSITY_1 + default 2 if KERNEL_LINUX_VERBOSITY_2 + +config KERNEL_LINUX_CONFIG_FILE + string + prompt "Configuration file" + default "" + help + Path to the kernel configuration file. + + You _must_ provide one (for now). diff --git a/config/kernel_linux_headers_copy.in b/config/kernel_linux_headers_copy.in new file mode 100644 index 0000000..f18bed5 --- /dev/null +++ b/config/kernel_linux_headers_copy.in @@ -0,0 +1,682 @@ +choice + bool + prompt "Linux kernel version" + +config KERNEL_COPY_V_2_6_0 + bool + prompt "2.6.0" + +config KERNEL_COPY_V_2_6_1 + bool + prompt "2.6.1" + +config KERNEL_COPY_V_2_6_2 + bool + prompt "2.6.2" + +config KERNEL_COPY_V_2_6_3 + bool + prompt "2.6.3" + +config KERNEL_COPY_V_2_6_4 + bool + prompt "2.6.4" + +config KERNEL_COPY_V_2_6_5 + bool + prompt "2.6.5" + +config KERNEL_COPY_V_2_6_6 + bool + prompt "2.6.6" + +config KERNEL_COPY_V_2_6_7 + bool + prompt "2.6.7" + +config KERNEL_COPY_V_2_6_8 + bool + prompt "2.6.8" + +config KERNEL_COPY_V_2_6_8_1 + bool + prompt "2.6.8.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_9 + bool + prompt "2.6.9" + +config KERNEL_COPY_V_2_6_10 + bool + prompt "2.6.10" + +config KERNEL_COPY_V_2_6_11 + bool + prompt "2.6.11" + +config KERNEL_COPY_V_2_6_11_1 + bool + prompt "2.6.11.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_10 + bool + prompt "2.6.11.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_11 + bool + prompt "2.6.11.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_12 + bool + prompt "2.6.11.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_2 + bool + prompt "2.6.11.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_3 + bool + prompt "2.6.11.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_4 + bool + prompt "2.6.11.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_5 + bool + prompt "2.6.11.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_6 + bool + prompt "2.6.11.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_7 + bool + prompt "2.6.11.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_8 + bool + prompt "2.6.11.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_9 + bool + prompt "2.6.11.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12 + bool + prompt "2.6.12" + +config KERNEL_COPY_V_2_6_12_1 + bool + prompt "2.6.12.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_2 + bool + prompt "2.6.12.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_3 + bool + prompt "2.6.12.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_4 + bool + prompt "2.6.12.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_5 + bool + prompt "2.6.12.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_6 + bool + prompt "2.6.12.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13 + bool + prompt "2.6.13" + +config KERNEL_COPY_V_2_6_13_1 + bool + prompt "2.6.13.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_2 + bool + prompt "2.6.13.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_3 + bool + prompt "2.6.13.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_4 + bool + prompt "2.6.13.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_5 + bool + prompt "2.6.13.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14 + bool + prompt "2.6.14" + +config KERNEL_COPY_V_2_6_14_1 + bool + prompt "2.6.14.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_2 + bool + prompt "2.6.14.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_3 + bool + prompt "2.6.14.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_4 + bool + prompt "2.6.14.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_5 + bool + prompt "2.6.14.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_6 + bool + prompt "2.6.14.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_7 + bool + prompt "2.6.14.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15 + bool + prompt "2.6.15" + +config KERNEL_COPY_V_2_6_15_1 + bool + prompt "2.6.15.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_2 + bool + prompt "2.6.15.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_3 + bool + prompt "2.6.15.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_4 + bool + prompt "2.6.15.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_5 + bool + prompt "2.6.15.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_6 + bool + prompt "2.6.15.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_7 + bool + prompt "2.6.15.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16 + bool + prompt "2.6.16" + +config KERNEL_COPY_V_2_6_16_1 + bool + prompt "2.6.16.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_10 + bool + prompt "2.6.16.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_11 + bool + prompt "2.6.16.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_12 + bool + prompt "2.6.16.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_13 + bool + prompt "2.6.16.13" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_14 + bool + prompt "2.6.16.14" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_15 + bool + prompt "2.6.16.15" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_16 + bool + prompt "2.6.16.16" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_17 + bool + prompt "2.6.16.17" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_18 + bool + prompt "2.6.16.18" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_19 + bool + prompt "2.6.16.19" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_2 + bool + prompt "2.6.16.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_20 + bool + prompt "2.6.16.20" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_21 + bool + prompt "2.6.16.21" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_22 + bool + prompt "2.6.16.22" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_23 + bool + prompt "2.6.16.23" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_24 + bool + prompt "2.6.16.24" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_25 + bool + prompt "2.6.16.25" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_26 + bool + prompt "2.6.16.26" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_27 + bool + prompt "2.6.16.27" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_28 + bool + prompt "2.6.16.28" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_29 + bool + prompt "2.6.16.29" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_3 + bool + prompt "2.6.16.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_30 + bool + prompt "2.6.16.30" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_31 + bool + prompt "2.6.16.31" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_32 + bool + prompt "2.6.16.32" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_33 + bool + prompt "2.6.16.33" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_34 + bool + prompt "2.6.16.34" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_35 + bool + prompt "2.6.16.35" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_36 + bool + prompt "2.6.16.36" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_4 + bool + prompt "2.6.16.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_5 + bool + prompt "2.6.16.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_6 + bool + prompt "2.6.16.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_7 + bool + prompt "2.6.16.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_8 + bool + prompt "2.6.16.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_9 + bool + prompt "2.6.16.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17 + bool + prompt "2.6.17" + +config KERNEL_COPY_V_2_6_17_1 + bool + prompt "2.6.17.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_10 + bool + prompt "2.6.17.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_11 + bool + prompt "2.6.17.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_12 + bool + prompt "2.6.17.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_13 + bool + prompt "2.6.17.13" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_14 + bool + prompt "2.6.17.14" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_2 + bool + prompt "2.6.17.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_3 + bool + prompt "2.6.17.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_4 + bool + prompt "2.6.17.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_5 + bool + prompt "2.6.17.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_6 + bool + prompt "2.6.17.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_7 + bool + prompt "2.6.17.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_8 + bool + prompt "2.6.17.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_9 + bool + prompt "2.6.17.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18 + bool + prompt "2.6.18" + +config KERNEL_COPY_V_2_6_18_1 + bool + prompt "2.6.18.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_2 + bool + prompt "2.6.18.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_3 + bool + prompt "2.6.18.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_4 + bool + prompt "2.6.18.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_5 + bool + prompt "2.6.18.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_6 + bool + prompt "2.6.18.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_19 + bool + prompt "2.6.19" + +config KERNEL_COPY_V_2_6_19_1 + bool + prompt "2.6.19.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.0" if KERNEL_COPY_V_2_6_0 + default "2.6.1" if KERNEL_COPY_V_2_6_1 + default "2.6.2" if KERNEL_COPY_V_2_6_2 + default "2.6.3" if KERNEL_COPY_V_2_6_3 + default "2.6.4" if KERNEL_COPY_V_2_6_4 + default "2.6.5" if KERNEL_COPY_V_2_6_5 + default "2.6.6" if KERNEL_COPY_V_2_6_6 + default "2.6.7" if KERNEL_COPY_V_2_6_7 + default "2.6.8" if KERNEL_COPY_V_2_6_8 + default "2.6.8.1" if KERNEL_COPY_V_2_6_8_1 + default "2.6.9" if KERNEL_COPY_V_2_6_9 + default "2.6.10" if KERNEL_COPY_V_2_6_10 + default "2.6.11" if KERNEL_COPY_V_2_6_11 + default "2.6.11.1" if KERNEL_COPY_V_2_6_11_1 + default "2.6.11.10" if KERNEL_COPY_V_2_6_11_10 + default "2.6.11.11" if KERNEL_COPY_V_2_6_11_11 + default "2.6.11.12" if KERNEL_COPY_V_2_6_11_12 + default "2.6.11.2" if KERNEL_COPY_V_2_6_11_2 + default "2.6.11.3" if KERNEL_COPY_V_2_6_11_3 + default "2.6.11.4" if KERNEL_COPY_V_2_6_11_4 + default "2.6.11.5" if KERNEL_COPY_V_2_6_11_5 + default "2.6.11.6" if KERNEL_COPY_V_2_6_11_6 + default "2.6.11.7" if KERNEL_COPY_V_2_6_11_7 + default "2.6.11.8" if KERNEL_COPY_V_2_6_11_8 + default "2.6.11.9" if KERNEL_COPY_V_2_6_11_9 + default "2.6.12" if KERNEL_COPY_V_2_6_12 + default "2.6.12.1" if KERNEL_COPY_V_2_6_12_1 + default "2.6.12.2" if KERNEL_COPY_V_2_6_12_2 + default "2.6.12.3" if KERNEL_COPY_V_2_6_12_3 + default "2.6.12.4" if KERNEL_COPY_V_2_6_12_4 + default "2.6.12.5" if KERNEL_COPY_V_2_6_12_5 + default "2.6.12.6" if KERNEL_COPY_V_2_6_12_6 + default "2.6.13" if KERNEL_COPY_V_2_6_13 + default "2.6.13.1" if KERNEL_COPY_V_2_6_13_1 + default "2.6.13.2" if KERNEL_COPY_V_2_6_13_2 + default "2.6.13.3" if KERNEL_COPY_V_2_6_13_3 + default "2.6.13.4" if KERNEL_COPY_V_2_6_13_4 + default "2.6.13.5" if KERNEL_COPY_V_2_6_13_5 + default "2.6.14" if KERNEL_COPY_V_2_6_14 + default "2.6.14.1" if KERNEL_COPY_V_2_6_14_1 + default "2.6.14.2" if KERNEL_COPY_V_2_6_14_2 + default "2.6.14.3" if KERNEL_COPY_V_2_6_14_3 + default "2.6.14.4" if KERNEL_COPY_V_2_6_14_4 + default "2.6.14.5" if KERNEL_COPY_V_2_6_14_5 + default "2.6.14.6" if KERNEL_COPY_V_2_6_14_6 + default "2.6.14.7" if KERNEL_COPY_V_2_6_14_7 + default "2.6.15" if KERNEL_COPY_V_2_6_15 + default "2.6.15.1" if KERNEL_COPY_V_2_6_15_1 + default "2.6.15.2" if KERNEL_COPY_V_2_6_15_2 + default "2.6.15.3" if KERNEL_COPY_V_2_6_15_3 + default "2.6.15.4" if KERNEL_COPY_V_2_6_15_4 + default "2.6.15.5" if KERNEL_COPY_V_2_6_15_5 + default "2.6.15.6" if KERNEL_COPY_V_2_6_15_6 + default "2.6.15.7" if KERNEL_COPY_V_2_6_15_7 + default "2.6.16" if KERNEL_COPY_V_2_6_16 + default "2.6.16.1" if KERNEL_COPY_V_2_6_16_1 + default "2.6.16.10" if KERNEL_COPY_V_2_6_16_10 + default "2.6.16.11" if KERNEL_COPY_V_2_6_16_11 + default "2.6.16.12" if KERNEL_COPY_V_2_6_16_12 + default "2.6.16.13" if KERNEL_COPY_V_2_6_16_13 + default "2.6.16.14" if KERNEL_COPY_V_2_6_16_14 + default "2.6.16.15" if KERNEL_COPY_V_2_6_16_15 + default "2.6.16.16" if KERNEL_COPY_V_2_6_16_16 + default "2.6.16.17" if KERNEL_COPY_V_2_6_16_17 + default "2.6.16.18" if KERNEL_COPY_V_2_6_16_18 + default "2.6.16.19" if KERNEL_COPY_V_2_6_16_19 + default "2.6.16.2" if KERNEL_COPY_V_2_6_16_2 + default "2.6.16.20" if KERNEL_COPY_V_2_6_16_20 + default "2.6.16.21" if KERNEL_COPY_V_2_6_16_21 + default "2.6.16.22" if KERNEL_COPY_V_2_6_16_22 + default "2.6.16.23" if KERNEL_COPY_V_2_6_16_23 + default "2.6.16.24" if KERNEL_COPY_V_2_6_16_24 + default "2.6.16.25" if KERNEL_COPY_V_2_6_16_25 + default "2.6.16.26" if KERNEL_COPY_V_2_6_16_26 + default "2.6.16.27" if KERNEL_COPY_V_2_6_16_27 + default "2.6.16.28" if KERNEL_COPY_V_2_6_16_28 + default "2.6.16.29" if KERNEL_COPY_V_2_6_16_29 + default "2.6.16.3" if KERNEL_COPY_V_2_6_16_3 + default "2.6.16.30" if KERNEL_COPY_V_2_6_16_30 + default "2.6.16.31" if KERNEL_COPY_V_2_6_16_31 + default "2.6.16.32" if KERNEL_COPY_V_2_6_16_32 + default "2.6.16.33" if KERNEL_COPY_V_2_6_16_33 + default "2.6.16.34" if KERNEL_COPY_V_2_6_16_34 + default "2.6.16.35" if KERNEL_COPY_V_2_6_16_35 + default "2.6.16.36" if KERNEL_COPY_V_2_6_16_36 + default "2.6.16.4" if KERNEL_COPY_V_2_6_16_4 + default "2.6.16.5" if KERNEL_COPY_V_2_6_16_5 + default "2.6.16.6" if KERNEL_COPY_V_2_6_16_6 + default "2.6.16.7" if KERNEL_COPY_V_2_6_16_7 + default "2.6.16.8" if KERNEL_COPY_V_2_6_16_8 + default "2.6.16.9" if KERNEL_COPY_V_2_6_16_9 + default "2.6.17" if KERNEL_COPY_V_2_6_17 + default "2.6.17.1" if KERNEL_COPY_V_2_6_17_1 + default "2.6.17.10" if KERNEL_COPY_V_2_6_17_10 + default "2.6.17.11" if KERNEL_COPY_V_2_6_17_11 + default "2.6.17.12" if KERNEL_COPY_V_2_6_17_12 + default "2.6.17.13" if KERNEL_COPY_V_2_6_17_13 + default "2.6.17.14" if KERNEL_COPY_V_2_6_17_14 + default "2.6.17.2" if KERNEL_COPY_V_2_6_17_2 + default "2.6.17.3" if KERNEL_COPY_V_2_6_17_3 + default "2.6.17.4" if KERNEL_COPY_V_2_6_17_4 + default "2.6.17.5" if KERNEL_COPY_V_2_6_17_5 + default "2.6.17.6" if KERNEL_COPY_V_2_6_17_6 + default "2.6.17.7" if KERNEL_COPY_V_2_6_17_7 + default "2.6.17.8" if KERNEL_COPY_V_2_6_17_8 + default "2.6.17.9" if KERNEL_COPY_V_2_6_17_9 + default "2.6.18" if KERNEL_COPY_V_2_6_18 + default "2.6.18.1" if KERNEL_COPY_V_2_6_18_1 + default "2.6.18.2" if KERNEL_COPY_V_2_6_18_2 + default "2.6.18.3" if KERNEL_COPY_V_2_6_18_3 + default "2.6.18.4" if KERNEL_COPY_V_2_6_18_4 + default "2.6.18.5" if KERNEL_COPY_V_2_6_18_5 + default "2.6.18.6" if KERNEL_COPY_V_2_6_18_6 + default "2.6.19" if KERNEL_COPY_V_2_6_19 + default "2.6.19.1" if KERNEL_COPY_V_2_6_19_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/kernel_linux_headers_install.in b/config/kernel_linux_headers_install.in new file mode 100644 index 0000000..f89957b --- /dev/null +++ b/config/kernel_linux_headers_install.in @@ -0,0 +1,75 @@ +choice + bool + prompt "Linux kernel version" + +config KERNEL_INSTALL_V_2_6_18 + bool + prompt "2.6.18" + +config KERNEL_INSTALL_V_2_6_18_1 + bool + prompt "2.6.18.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_2 + bool + prompt "2.6.18.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_3 + bool + prompt "2.6.18.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_4 + bool + prompt "2.6.18.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_5 + bool + prompt "2.6.18.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_6 + bool + prompt "2.6.18.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_19 + bool + prompt "2.6.19" + +config KERNEL_INSTALL_V_2_6_19_1 + bool + prompt "2.6.19.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_19_2 + bool + prompt "2.6.19.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_20 + bool + prompt "2.6.20" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.18" if KERNEL_INSTALL_V_2_6_18 + default "2.6.18.1" if KERNEL_INSTALL_V_2_6_18_1 + default "2.6.18.2" if KERNEL_INSTALL_V_2_6_18_2 + default "2.6.18.3" if KERNEL_INSTALL_V_2_6_18_3 + default "2.6.18.4" if KERNEL_INSTALL_V_2_6_18_4 + default "2.6.18.5" if KERNEL_INSTALL_V_2_6_18_5 + default "2.6.18.6" if KERNEL_INSTALL_V_2_6_18_6 + default "2.6.19" if KERNEL_INSTALL_V_2_6_19 + default "2.6.19.1" if KERNEL_INSTALL_V_2_6_19_1 + default "2.6.19.2" if KERNEL_INSTALL_V_2_6_19_2 + default "2.6.20" if KERNEL_INSTALL_V_2_6_20 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/kernel_linux_headers_sanitised.in b/config/kernel_linux_headers_sanitised.in new file mode 100644 index 0000000..820df6e --- /dev/null +++ b/config/kernel_linux_headers_sanitised.in @@ -0,0 +1,62 @@ +choice + bool + prompt "Linux headers version" + +config KERNEL_SANITISED_V_2_6_7_0 + bool + prompt "2.6.7.0" + +config KERNEL_SANITISED_V_2_6_8_0 + bool + prompt "2.6.8.0" + +config KERNEL_SANITISED_V_2_6_8_1 + bool + prompt "2.6.8.1" + +config KERNEL_SANITISED_V_2_6_9_0 + bool + prompt "2.6.9.0" + +config KERNEL_SANITISED_V_2_6_9_1 + bool + prompt "2.6.9.1" + +config KERNEL_SANITISED_V_2_6_10_0 + bool + prompt "2.6.10.0" + +config KERNEL_SANITISED_V_2_6_11_0 + bool + prompt "2.6.11.0" + +config KERNEL_SANITISED_V_2_6_11_1 + bool + prompt "2.6.11.1" + +config KERNEL_SANITISED_V_2_6_11_2 + bool + prompt "2.6.11.2" + +config KERNEL_SANITISED_V_2_6_12_0 + bool + prompt "2.6.12.0" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.7.0" if KERNEL_SANITISED_V_2_6_7_0 + default "2.6.8.0" if KERNEL_SANITISED_V_2_6_8_0 + default "2.6.8.1" if KERNEL_SANITISED_V_2_6_8_1 + default "2.6.9.0" if KERNEL_SANITISED_V_2_6_9_0 + default "2.6.9.1" if KERNEL_SANITISED_V_2_6_9_1 + default "2.6.10.0" if KERNEL_SANITISED_V_2_6_10_0 + default "2.6.11.0" if KERNEL_SANITISED_V_2_6_11_0 + default "2.6.11.1" if KERNEL_SANITISED_V_2_6_11_1 + default "2.6.11.2" if KERNEL_SANITISED_V_2_6_11_2 + default "2.6.12.0" if KERNEL_SANITISED_V_2_6_12_0 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/libc.in b/config/libc.in new file mode 100644 index 0000000..ba6a1be --- /dev/null +++ b/config/libc.in @@ -0,0 +1,36 @@ +# C library options + +menu "C-library" + +choice + bool + prompt "C-library to use:" + default LIBC_GLIBC + +config LIBC_GLIBC + bool + prompt "glibc" + +config LIBC_UCLIBC + bool + prompt "uClibc" + +endchoice + +config LIBC_VERSION + string + +config LIBC + string + default "glibc" if LIBC_GLIBC + default "uClibc" if LIBC_UCLIBC + +if LIBC_GLIBC +source config/libc_glibc.in +endif + +if LIBC_UCLIBC +source config/libc_uClibc.in +endif + +endmenu diff --git a/config/libc_glibc.in b/config/libc_glibc.in new file mode 100644 index 0000000..867e0a0 --- /dev/null +++ b/config/libc_glibc.in @@ -0,0 +1,199 @@ +# glibc options + +choice + bool + prompt "glibc version" + +config LIBC_V_1_09_1 + bool + prompt "1.09.1" + +config LIBC_V_2_0_1 + bool + prompt "2.0.1" + +config LIBC_V_2_0_6 + bool + prompt "2.0.6" + +config LIBC_V_2_1_1 + bool + prompt "2.1.1" + +config LIBC_V_2_1_2 + bool + prompt "2.1.2" + +config LIBC_V_2_1_3 + bool + prompt "2.1.3" + +config LIBC_V_2_2 + bool + prompt "2.2" + +config LIBC_V_2_2_1 + bool + prompt "2.2.1" + +config LIBC_V_2_2_2 + bool + prompt "2.2.2" + +config LIBC_V_2_2_3 + bool + prompt "2.2.3" + +config LIBC_V_2_2_4 + bool + prompt "2.2.4" + +config LIBC_V_2_2_5 + bool + prompt "2.2.5" + +config LIBC_V_2_3 + bool + prompt "2.3" + +config LIBC_V_2_3_1 + bool + prompt "2.3.1" + +config LIBC_V_2_3_2 + bool + prompt "2.3.2" + +config LIBC_V_2_3_3 + bool + prompt "2.3.3" + +config LIBC_V_2_3_4 + bool + prompt "2.3.4" + +config LIBC_V_2_3_5 + bool + prompt "2.3.5" + +config LIBC_V_2_3_6 + bool + prompt "2.3.6" + +config LIBC_V_2_4 + bool + prompt "2.4" + +config LIBC_V_2_5 + bool + prompt "2.5" + +# CT_INSERT_VERSION_ABOVE +# Don't remove qbove line! +endchoice + +config LIBC_VERSION + string + default "1.09.1" if LIBC_V_1_09_1 + default "2.0.1" if LIBC_V_2_0_1 + default "2.0.6" if LIBC_V_2_0_6 + default "2.1.1" if LIBC_V_2_1_1 + default "2.1.2" if LIBC_V_2_1_2 + default "2.1.3" if LIBC_V_2_1_3 + default "2.2" if LIBC_V_2_2 + default "2.2.1" if LIBC_V_2_2_1 + default "2.2.2" if LIBC_V_2_2_2 + default "2.2.3" if LIBC_V_2_2_3 + default "2.2.4" if LIBC_V_2_2_4 + default "2.2.5" if LIBC_V_2_2_5 + default "2.3" if LIBC_V_2_3 + default "2.3.1" if LIBC_V_2_3_1 + default "2.3.2" if LIBC_V_2_3_2 + default "2.3.3" if LIBC_V_2_3_3 + default "2.3.4" if LIBC_V_2_3_4 + default "2.3.5" if LIBC_V_2_3_5 + default "2.3.6" if LIBC_V_2_3_6 + default "2.4" if LIBC_V_2_4 + default "2.5" if LIBC_V_2_5 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +choice + bool + prompt "Threading implentation to use:" + default LIBC_GLIBC_THREADS_LINUXTHREADS + +config LIBC_GLIBC_THREADS_NPTL + bool + prompt "nptl (not implemented)" + +config LIBC_GLIBC_THREADS_LINUXTHREADS + bool + prompt "linuxthreads" + +config LIBC_GLIBC_THREADS_NONE + bool + prompt "none" + +endchoice + +config LIBC_GLIBC_EXTRA_CONFIG + string + prompt "glibc extra config" + default "" + help + Extra flags to pass onto ./configure when configuring glibc. + + Eg.: --enable-static-nss + +config LIBC_GLIBC_EXTRA_CFLAGS + string + prompt "glibc extra target CFLAGS" + default "" + help + Extra target CFLAGS to use when building glibc. + +config LIBC_EXTRA_CC_ARGS + string + prompt "gcc extra flags" + default "" + help + Extra flags to pass gcc when building glibc. + + Seldom used, except for sparc64 which seems to need the flag -64 + to be passed onto gcc. + +# Please note: This is not used for now (no sh support). +config LIBC_GLIBC_CONFIGPARMS + string + prompt "Extra config params (READ HELP)" + default "" if ARCH != "sh3" && ARCH != "sh4" + default "no-z-defs=yes" if ARCH = "sh3" || ARCH = "sh4" + help + Some architectures need to set options in the file configparms. + This is the case for sh3/4, which really need to set configparms as of + gcc-3.4/glibc-2.3.2. + + Unless you are building a toolchain for sh3/4, you should leave that empty. + + Note: this is awkward, doesn't work well if you need more than one + line in configparms + +config LIBC_ADDONS + bool + prompt "Pass extra addons list" + default n + help + If you say Y here, you'll be able to give the list of addons you want to + include in your C library. + +config LIBC_ADDONS_LIST + string + prompt "Extra addons" + default "" + help + Extra addons to include in glibc. + + Eg.: crypt (for very old glibces) + ports (for the ports addon, with other architectures) + linuxthreads (for the linuxthreads implementation of threads) diff --git a/config/libc_uClibc.in b/config/libc_uClibc.in new file mode 100644 index 0000000..f693912 --- /dev/null +++ b/config/libc_uClibc.in @@ -0,0 +1,92 @@ +# uClibc options + +choice + bool + prompt "uClibc version" + +config LIBC_V_snapshot + bool + prompt "latest snapshot" + +config LIBC_V_specific_date + bool + prompt "" + +config LIBC_V_0_9_26 + bool + prompt "0.9.26" + +config LIBC_V_0_9_27 + bool + prompt "0.9.27" + +config LIBC_V_0_9_28 + bool + prompt "0.9.28" + +config LIBC_V_0_9_28_1 + bool + prompt "0.9.28.1" + +config LIBC_V_0_9_28_2 + bool + prompt "0.9.28.2" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config LIBC_VERSION + string + prompt "Enter date (YYYYMMDD)" if LIBC_V_specific_date + default "snapshot" if LIBC_V_snapshot + default "0.9.26" if LIBC_V_0_9_26 + default "0.9.27" if LIBC_V_0_9_27 + default "0.9.28" if LIBC_V_0_9_28 + default "0.9.28.1" if LIBC_V_0_9_28_1 + default "0.9.28.2" if LIBC_V_0_9_28_2 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove qbove line! + +choice + bool + prompt "Debug level" + default LIBC_UCLIBC_DEBUG_LEVEL_0 + +config LIBC_UCLIBC_DEBUG_LEVEL_0 + bool + prompt "none" + +config LIBC_UCLIBC_DEBUG_LEVEL_1 + bool + prompt "minimal" + +config LIBC_UCLIBC_DEBUG_LEVEL_2 + bool + prompt "all" + +endchoice + +config LIBC_UCLIBC_DEBUG_LEVEL + int + default 0 if LIBC_UCLIBC_DEBUG_LEVEL_0 + default 1 if LIBC_UCLIBC_DEBUG_LEVEL_1 + default 2 if LIBC_UCLIBC_DEBUG_LEVEL_2 + +config LIBC_UCLIBC_CONFIG_FILE + string + prompt "Configuration file" + default "" + help + Path to the configuration file. + + You _must_ provide one (for now). + +config LIBC_UCLIBC_LOCALES + bool + prompt "Add support for locales" + default n + help + Say y if you want uClibc to support localisation. + + Note that seems to be broken on recent uClibc releases. diff --git a/config/target.in b/config/target.in new file mode 100644 index 0000000..42a7a3a --- /dev/null +++ b/config/target.in @@ -0,0 +1,300 @@ +# Target definition: architecture, optimisations, etc... + +menu "Target options" + +comment "General target options" + +choice + bool + prompt "Target architecture:" + default ARCH_x86 + +config ARCH_ARM + bool + prompt "arm" + +config ARCH_MIPS + bool + prompt "mips" + +config ARCH_x86 + bool + prompt "x86" + +config ARCH_x86_64 + bool + prompt "x86_64" + +endchoice + +choice + bool + prompt "Endianness:" + +config ARCH_BE + bool + prompt "Big endian" + +config ARCH_LE + bool + prompt "Little endian" + +endchoice + +comment "Target optimisations" + +config ARCH_CPU + string + prompt "Emit assembly for CPU" + default "" + help + This specifies the name of the target ARM processor. GCC uses this name + to determine what kind of instructions it can emit when generating + assembly code. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_TUNE + string + prompt "Tune for CPU" + default "" + help + This option is very similar to the ARCH_CPU option (above), except + that instead of specifying the actual target processor type, and hence + restricting which instructions can be used, it specifies that GCC should + tune the performance of the code as if the target were of the type + specified in this option, but still choosing the instructions that it + will generate based on the cpu specified by the ARCH_CPU option + (above), or a (command-line) -mcpu= option. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_ARCH + string + prompt "Achitecture level" + default "" + help + GCC uses this name to determine what kind of instructions it can emit + when generating assembly code. This option can be used in conjunction + with or instead of the ARCH_CPU option (above), or a (command-line) + -mcpu= option. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_FPU + string + prompt "Use FPU" + default "" + help + On some targets (eg. ARM), you can specify the kind of FPU to emit + code for. + + See below wether to actually emit FP opcodes, or to emulate them. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +choice + bool + prompt "Floating point:" + +config ARCH_FLOAT_HW + bool + prompt "hardware (FPU)" + help + Emit hardware floating point opcodes. + + If you've got a processor with a FPU, then you want that. + If your hardware has no FPU, you still can use HW floating point, but + need to compile support for FPU emulation in your kernel. Needless to + say that emulating the FPU is /slooowwwww/... + + One situation you'd want HW floating point without a FPU is if you get + binary blobs from different vendors that are compiling this way and + can't (don't wan't to) change. + +config ARCH_FLOAT_SW + bool + prompt "software" + help + Do not emit any hardware floating point opcode. + + If your processor has no FPU, then you most probably want this, as it + is faster than emulating the FPU in the kernel. + +endchoice + +config ARCH_FLOAT_SW_LIBFLOAT + bool + prompt "Use libfloat" + default n + depends on ARCH_FLOAT_SW + help + For those targets upporting it, you can use libfloat for the software + floating point emulation. + + Note that some versions of gcc have support code that supersedes libfloat, + while others don't. Known version of gcc that don't have support code are + versions prior to 3.0, and version above 4.0. + + You should check gcc before deciding to use libfloat. + +config TARGET_CFLAGS + string + prompt "Default target CFLAGS" + default "" + help + Used to add specific options when compiling libraries of the toolchain, + that will run on the target (eg. libc.so). + + Note that the options above for CPU, tune, arch and FPU will be + automaticaly used. You don't need to specify them here. + + Leave blank if you don't know better. + +comment "Toolchain options" + +config USE_SYSROOT + bool + prompt "Use sysroot'ed toolchain" + default y + help + Use the 'shinny new' sysroot feature of gcc: libraries split between + prefix/target/sys-root/lib and prefix/target/sys-root/usr/lib + + You definitely want to say 'Y' here. Yes you do. I know you do. Say 'Y'. + +config SHARED_LIBS + bool + prompt "Build shared libraries" + default y + help + Say 'y' here, unless you don't want shared libraries. + + You might not want shared librries if you're building for a target that + don't support it (maybe some nommu targets, for example, or bare metal). + +config TARGET_MULTILIB + bool +# prompt "Enable 'multilib' support (EXPERIMENTAL)" + default n + help + Enable the so-called 'multilib' support. + + With the same toolchain, and on some architectures, you will be able to + build big and little endian binaries, soft- and hard-float, etc... + + See the gcc configure manual at http://gcc.gnu.org/install/configure.html + to see what multilib your target supports. + + It's preferable for now to build two (or more) toolchains, one for each + configuration you need to support (eg. one for thumb and one for ARM, + etc...). You can use the vendor string to diferentiate those toolchains. + +config TARGET_VENDOR + string + prompt "Vendor string" + default "unknown" + help + Vendor part of the machine triplet. + + A triplet is of the form arch-vendor-kernel-system. + You can set the second part, vendor, to whatever you see fit. + Use a single word, or use underscores "_" to separate words. + + Keep the default (unkown) if you don't know better. + +config TARGET_ALIAS + string + prompt "Target alias" + default "" + help + Normaly, you'd call your toolchain component (especially gcc) by + prefixing the target triplet followed by a dash and the component name + (eg. armeb-unknown-linux-uclibc-gcc). + + You can enter a shortcut here. This string will be used to create + symbolic links to the toolchain tools (eg. if you enter "foo-bar" here, + then gcc for your toolchain will also be available as "foo-bar-gcc" along + with the original name). + + You shouldn't need to enter anything here, unless you plan to manually + call the tools (autotools-based ./configure will use the standard name). + +config ARCH + string + default "arm" if ARCH_ARM + default "mips" if ARCH_MIPS + default "x86" if ARCH_x86 + default "x86_64" if ARCH_x86_64 + +config BUILD + string + prompt "Build system triplet" + default "" + help + Canonical name of the machine building the toolchain. + You should leave empty, unless you really now what you're doing. + +config CC_NATIVE + string + prompt "Native gcc" + default "gcc" + help + The native C compiler. + + You can set this to an alternative compiler if you have more than one + installed (eg. gcc is gcc-4.1.1 and you want to use gcc-3.4.6). + + You can leave this empty as well, in which case gcc will be used. + +config CANADIAN + bool + prompt "Canadian build (EXPERIMENTAL)" + default n + help + A canadian build allows to build a compiler on a first machine + (build system), that will run on second machine (host system), + targetting a third machine (target system). + + An example where you'd want a candian cross-compiler is to create + a native compiler for your target. In this case host and target + are the same. + +config HOST + string + prompt "Host system triplet" + default "" + depends on CANADIAN + help + Canonical name of the machine serving as host. + +config HOST_CC + string + prompt "Host system compiler" + default "${CT_HOST}-" + depends on CANADIAN + help + C compiler targeting the host system. + If HOST_CC ends with a dash (-), then it is considered to be the + prefix to gcc (eg. x86-pc-linuc-gnu-). + If it is empty, it is formed by appending '-gcc' to HOST. + Else it is considered to be the complete name of the compiler, with + full path, or without path (provided that it can be found in PATH). + +endmenu diff --git a/docs/overview.txt b/docs/overview.txt new file mode 100644 index 0000000..8027180 --- /dev/null +++ b/docs/overview.txt @@ -0,0 +1,108 @@ +File.........: overview.txt +Content......: Overview of how ct-ng works. +Copyrigth....: (C) 2006 Yann E. MORIN +License......: see COPYING in the root of this package +________________ + / +Introduction / +_____________/ + +crosstool-NG aims at building toolchains. Toolchains are an essential component +in a software development project. It will compile, assemble and link the code +that is being developped. Some pieces of the toolchain will eventually end up +in the resulting binary/ies: static libraries are but an example. + +So, a toolchain is a very sensitive piece of software, as any bug in one of the +components, or a poorly configured component, can lead to execution problems, +ranging from poor performance, to applications ending unexpectedly, to +mis-behaving software (which more than often is hard to detect), to hardware +damage, or even to human risks (which is more than regretable). + +Toolchains are made of different piece of software, each being quite complex +and requiring specially crafted options to build and work seamlessly. This +is usually not that easy, even in the not-so-trivial case of native toolchains. +The work reaches a higher degree of complexity when it comes to cross- +compilation, where it can becomes quite a nightmare... + +Some cross-toolchain exits on the internet, and can be used for general +development, but they have a number of limitations: + - they can be general purpose, in that they are configured for the majority: + no optimisation for your specific target, + - they can be prepared for a specific target and thus are not easy to use, + nor optimised for, or even supporting your target, + - they often are using ageing components (compiler, C library, etc...) not + supporting special features of your shiny new processor; +On the other side, these toolchain offer some advantages: + - they are ready to use and quite easy to install and setup, + - they are proven if used by a wide community. + +But once you want to get all the juice out of your specific hardware, you will +want to build your own toolchain. This is where crosstool-ng comes into play. + +There are also a number of tools that builds toolchains for specific needs, +which is not really scalable. Examples are: + - buildroot (buildroot.uclibc.org) whose main puprpose is to build root file + systems, hence the name. But once you have your toolchain with buildroot, + part of it is installed in the root-to-be, so if you want to build a whole + new root, you either have to save the existing one as a template and + restore it later, or restart again from scratch. This is not convenient, + - ptxdist (www.pengutronix.de/software/ptxdist), whose purpose is very + similar to buildroot, + - other projects (openembeded.org for example), which is again used to + build root file systems. + +crosstool-NG is really targetted at building toolchains, and only toolchains. +It is then up to you to use it the way you want. + +___________ + / +History / +________/ + +crosstool was first 'conceived' by Dan Kegel, which offered it to the community, +as a set of scripts, a repository of patches, and some pre-configured, general +purpose setup files to be used to configure crosstool. This is available at +www.kegel.com/crosstool, and the subversion repository is hosted on google at +http://code.google.com/p/crosstool/. + +At the time of writing, crosstool only supports building with one C library, +namely glibc, and one C compiler, gcc; it is cripled with historical support +for legacy components, and is some kind of a mess to upgrade. + +I once managed to add support for uClibc-based toolchains, but it did not make +into mainline, mostly because I don't have time to port the patch forward to +the new versions, due in part to the big effort it was taking. + +So I decided to clean up crosstool in the state it was, re-order the things +in place, and add appropriate support for what I needed, that is uClibc +support. + +The only option left to me was rewrite crosstool from scratch. I decided to go +this way, and name the new implementation ct-ng, standing for crosstool Next +Generation, as many other comunity projects do, and as a wink at the TV series +"Star Trek: The Next Generation". ;-) + +_____________ + / +Operation / +__________/ + +ct-ng is configured by a configurator presenting a menu-stuctured set of +options. These options let you specify the way you want your toolchain built, +where you want it installed, what architecture and specific processor it +will support, the version of the components you want to use, etc... The +value for those options are then stored in a configuration file. + +You then simply run make. It will use this configuration file to retrieve, +extract and patch the components, build, install and test your newly built +toolchain. + +You are then free to add the toolchain /bin directory in your PATH to use +it at will. + +_____________ + / +Internals / +__________/ + + diff --git a/kconfig/Makefile b/kconfig/Makefile new file mode 100644 index 0000000..7463548 --- /dev/null +++ b/kconfig/Makefile @@ -0,0 +1,71 @@ +# =========================================================================== +# crosstool-ng configuration targets +# These targets are used from top-level makefile + +KCONFIG_TOP = config/config.in +obj = ./kconfig +PHONY += clean help oldconfig menuconfig config silentoldconfig \ + randconfig allyesconfig allnoconfig allmodconfig defconfig + +menuconfig: $(obj)/mconf + @$< $(KCONFIG_TOP) + +config: $(obj)/conf + @$< $(KCONFIG_TOP) + +oldconfig: $(obj)/conf + @$< -s $(KCONFIG_TOP) + +randconfig: $(obj)/conf + @$< -r $(KCONFIG_TOP) + +allyesconfig: $(obj)/conf + @$< -y $(KCONFIG_TOP) + +allnoconfig: $(obj)/conf + @$< -n $(KCONFIG_TOP) + +defconfig: $(obj)/conf + @$< -d $(KCONFIG_TOP) + +# Build a list of all available samples +SAMPLES = $(patsubst $(CT_TOP_DIR)/samples/%,%,$(filter-out %Makefile,$(wildcard $(CT_TOP_DIR)/samples/*))) +SAMPLES_CONFIG = $(patsubst %,%_config,$(SAMPLES)) +.PHONY: $(SAMPLES_CONFIG) +$(SAMPLES_CONFIG): + @cp "$(CT_TOP_DIR)/samples/$(patsubst %_config,%,$@)/crosstool.config" "$(CT_TOP_DIR)/.config" + @$(MAKE) oldconfig + +# Help text used by make help +help:: + @echo 'General purpose configuration targets:' + @echo ' config - Update current config utilising a line-oriented program' + @echo ' menuconfig - Update current config utilising a menu based program' + @echo ' oldconfig - Update current config utilising a provided .config as base' + @echo ' randconfig - New config with random answer to all options' + @echo ' defconfig - New config with default answer to all options' + @echo ' allyesconfig - New config where all options are accepted with yes' + @echo ' allnoconfig - New config where all options are answered with no' + @echo + @echo 'Preconfigured configuration targets:' + @for s in $(SAMPLES_CONFIG); do \ + echo " $${s}"; \ + done + @echo '' + +# Cheesy build + +SHIPPED = kconfig/zconf.tab.c kconfig/lex.zconf.c kconfig/zconf.hash.c + +%.c: %.c_shipped + @ln -s $(notdir $<) $@ + +kconfig/mconf: $(SHIPPED) kconfig/mconf.c + @$(HOST_CC) -o $@ kconfig/{mconf.c,zconf.tab.c,lxdialog/*.c} \ + -lcurses "-DCURSES_LOC=" + +kconfig/conf: $(SHIPPED) kconfig/conf.c + @$(HOST_CC) -o $@ kconfig/{conf.c,zconf.tab.c} + +clean:: + @rm -f $(wildcard kconfig/*zconf*.c) kconfig/{conf,mconf} diff --git a/kconfig/conf.c b/kconfig/conf.c new file mode 100644 index 0000000..1b5b5d5 --- /dev/null +++ b/kconfig/conf.c @@ -0,0 +1,623 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf(struct menu *menu); +static void check_conf(struct menu *menu); + +enum { + ask_all, + ask_new, + ask_silent, + set_default, + set_yes, + set_mod, + set_no, + set_random +} input_mode = ask_all; +char *defconfig_file; + +static int indent = 1; +static int valid_stdin = 1; +static int conf_cnt; +static char line[128]; +static struct menu *rootEntry; + +static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); + +static void strip(char *str) +{ + char *p = str; + int l; + + while ((isspace(*p))) + p++; + l = strlen(p); + if (p != str) + memmove(str, p, l + 1); + if (!l) + return; + p = str + l - 1; + while ((isspace(*p))) + *p-- = 0; +} + +static void check_stdin(void) +{ + if (!valid_stdin && input_mode == ask_silent) { + printf(_("aborted!\n\n")); + printf(_("Console input/output is redirected. ")); + printf(_("Run 'make oldconfig' to update configuration.\n\n")); + exit(1); + } +} + +static void conf_askvalue(struct symbol *sym, const char *def) +{ + enum symbol_type type = sym_get_type(sym); + tristate val; + + if (!sym_has_value(sym)) + printf("(NEW) "); + + line[0] = '\n'; + line[1] = 0; + + if (!sym_is_changable(sym)) { + printf("%s\n", def); + line[0] = '\n'; + line[1] = 0; + return; + } + + switch (input_mode) { + case set_no: + case set_mod: + case set_yes: + case set_random: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + break; + case ask_new: + case ask_silent: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + return; + case set_default: + printf("%s\n", def); + return; + default: + break; + } + + switch (type) { + case S_INT: + case S_HEX: + case S_STRING: + printf("%s\n", def); + return; + default: + ; + } + switch (input_mode) { + case set_yes: + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_mod: + if (type == S_TRISTATE) { + if (sym_tristate_within_range(sym, mod)) { + line[0] = 'm'; + line[1] = '\n'; + line[2] = 0; + break; + } + } else { + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + } + case set_no: + if (sym_tristate_within_range(sym, no)) { + line[0] = 'n'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_random: + do { + val = (tristate)(random() % 3); + } while (!sym_tristate_within_range(sym, val)); + switch (val) { + case no: line[0] = 'n'; break; + case mod: line[0] = 'm'; break; + case yes: line[0] = 'y'; break; + } + line[1] = '\n'; + line[2] = 0; + break; + default: + break; + } + printf("%s", line); +} + +int conf_string(struct menu *menu) +{ + struct symbol *sym = menu->sym; + const char *def, *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + printf("(%s) ", sym->name); + def = sym_get_string_value(sym); + if (sym_get_string_value(sym)) + printf("[%s] ", def); + conf_askvalue(sym, def); + switch (line[0]) { + case '\n': + break; + case '?': + /* print help */ + if (line[1] == '\n') { + help = nohelp_text; + if (menu->sym->help) + help = menu->sym->help; + printf("\n%s\n", menu->sym->help); + def = NULL; + break; + } + default: + line[strlen(line)-1] = 0; + def = line; + } + if (def && sym_set_string_value(sym, def)) + return 0; + } +} + +static int conf_sym(struct menu *menu) +{ + struct symbol *sym = menu->sym; + int type; + tristate oldval, newval; + const char *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + if (sym->name) + printf("(%s) ", sym->name); + type = sym_get_type(sym); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { + case no: + putchar('N'); + break; + case mod: + putchar('M'); + break; + case yes: + putchar('Y'); + break; + } + if (oldval != no && sym_tristate_within_range(sym, no)) + printf("/n"); + if (oldval != mod && sym_tristate_within_range(sym, mod)) + printf("/m"); + if (oldval != yes && sym_tristate_within_range(sym, yes)) + printf("/y"); + if (sym->help) + printf("/?"); + printf("] "); + conf_askvalue(sym, sym_get_string_value(sym)); + strip(line); + + switch (line[0]) { + case 'n': + case 'N': + newval = no; + if (!line[1] || !strcmp(&line[1], "o")) + break; + continue; + case 'm': + case 'M': + newval = mod; + if (!line[1]) + break; + continue; + case 'y': + case 'Y': + newval = yes; + if (!line[1] || !strcmp(&line[1], "es")) + break; + continue; + case 0: + newval = oldval; + break; + case '?': + goto help; + default: + continue; + } + if (sym_set_tristate_value(sym, newval)) + return 0; +help: + help = nohelp_text; + if (sym->help) + help = sym->help; + printf("\n%s\n", help); + } +} + +static int conf_choice(struct menu *menu) +{ + struct symbol *sym, *def_sym; + struct menu *child; + int type; + bool is_new; + + sym = menu->sym; + type = sym_get_type(sym); + is_new = !sym_has_value(sym); + if (sym_is_changable(sym)) { + conf_sym(menu); + sym_calc_value(sym); + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + return 0; + case yes: + break; + } + } else { + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + return 0; + case yes: + break; + } + } + + while (1) { + int cnt, def; + + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + def_sym = sym_get_choice_value(sym); + cnt = def = 0; + line[0] = 0; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (!child->sym) { + printf("%*c %s\n", indent, '*', menu_get_prompt(child)); + continue; + } + cnt++; + if (child->sym == def_sym) { + def = cnt; + printf("%*c", indent, '>'); + } else + printf("%*c", indent, ' '); + printf(" %d. %s", cnt, menu_get_prompt(child)); + if (child->sym->name) + printf(" (%s)", child->sym->name); + if (!sym_has_value(child->sym)) + printf(" (NEW)"); + printf("\n"); + } + printf("%*schoice", indent - 1, ""); + if (cnt == 1) { + printf("[1]: 1\n"); + goto conf_childs; + } + printf("[1-%d", cnt); + if (sym->help) + printf("?"); + printf("]: "); + switch (input_mode) { + case ask_new: + case ask_silent: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + strip(line); + if (line[0] == '?') { + printf("\n%s\n", menu->sym->help ? + menu->sym->help : nohelp_text); + continue; + } + if (!line[0]) + cnt = def; + else if (isdigit(line[0])) + cnt = atoi(line); + else + continue; + break; + case set_random: + def = (random() % cnt) + 1; + case set_default: + case set_yes: + case set_mod: + case set_no: + cnt = def; + printf("%d\n", cnt); + break; + } + + conf_childs: + for (child = menu->list; child; child = child->next) { + if (!child->sym || !menu_is_visible(child)) + continue; + if (!--cnt) + break; + } + if (!child) + continue; + if (line[strlen(line) - 1] == '?') { + printf("\n%s\n", child->sym->help ? + child->sym->help : nohelp_text); + continue; + } + sym_set_choice_value(sym, child->sym); + if (child->list) { + indent += 2; + conf(child->list); + indent -= 2; + } + return 1; + } +} + +static void conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (prop) { + const char *prompt; + + switch (prop->type) { + case P_MENU: + if (input_mode == ask_silent && rootEntry != menu) { + check_conf(menu); + return; + } + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) + printf("%*c\n%*c %s\n%*c\n", + indent, '*', + indent, '*', prompt, + indent, '*'); + default: + ; + } + } + + if (!sym) + goto conf_childs; + + if (sym_is_choice(sym)) { + conf_choice(menu); + if (sym->curr.tri != mod) + return; + goto conf_childs; + } + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + conf_string(menu); + break; + default: + conf_sym(menu); + break; + } + +conf_childs: + if (sym) + indent += 2; + for (child = menu->list; child; child = child->next) + conf(child); + if (sym) + indent -= 2; +} + +static void check_conf(struct menu *menu) +{ + struct symbol *sym; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + if (sym && !sym_has_value(sym)) { + if (sym_is_changable(sym) || + (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { + if (!conf_cnt++) + printf(_("*\n* Restart config...\n*\n")); + rootEntry = menu_get_parent_menu(menu); + conf(rootEntry); + } + } + + for (child = menu->list; child; child = child->next) + check_conf(child); +} + +int main(int ac, char **av) +{ + int i = 1; + const char *name; + struct stat tmpstat; + + if (ac > i && av[i][0] == '-') { + switch (av[i++][1]) { + case 'o': + input_mode = ask_new; + break; + case 's': + input_mode = ask_silent; + valid_stdin = isatty(0) && isatty(1) && isatty(2); + break; + case 'd': + input_mode = set_default; + break; + case 'D': + input_mode = set_default; + defconfig_file = av[i++]; + if (!defconfig_file) { + printf(_("%s: No default config file specified\n"), + av[0]); + exit(1); + } + break; + case 'n': + input_mode = set_no; + break; + case 'm': + input_mode = set_mod; + break; + case 'y': + input_mode = set_yes; + break; + case 'r': + input_mode = set_random; + srandom(time(NULL)); + break; + case 'h': + case '?': + fprintf(stderr, "See README for usage info\n"); + exit(0); + } + } + name = av[i]; + if (!name) { + printf(_("%s: Kconfig file missing\n"), av[0]); + exit(1); + } + conf_parse(name); + //zconfdump(stdout); + switch (input_mode) { + case set_default: + if (!defconfig_file) + defconfig_file = conf_get_default_confname(); + if (conf_read(defconfig_file)) { + printf("***\n" + "*** Can't find default configuration \"%s\"!\n" + "***\n", defconfig_file); + exit(1); + } + break; + case ask_silent: + if (stat(".config", &tmpstat)) { + printf(_("***\n" + "*** You have not yet configured your "PROJECT_NAME"!\n" + "***\n" + "*** Please run some configurator (e.g. \"make oldconfig\" or\n" + "*** \"make menuconfig\" or \"make xconfig\").\n" + "***\n")); + exit(1); + } + case ask_all: + case ask_new: + conf_read(NULL); + break; + case set_no: + case set_mod: + case set_yes: + case set_random: + name = getenv("KCONFIG_ALLCONFIG"); + if (name && !stat(name, &tmpstat)) { + conf_read_simple(name, S_DEF_USER); + break; + } + switch (input_mode) { + case set_no: name = "allno.config"; break; + case set_mod: name = "allmod.config"; break; + case set_yes: name = "allyes.config"; break; + case set_random: name = "allrandom.config"; break; + default: break; + } + if (!stat(name, &tmpstat)) + conf_read_simple(name, S_DEF_USER); + else if (!stat("all.config", &tmpstat)) + conf_read_simple("all.config", S_DEF_USER); + break; + default: + break; + } + + if (input_mode != ask_silent) { + rootEntry = &rootmenu; + conf(&rootmenu); + if (input_mode == ask_all) { + input_mode = ask_silent; + valid_stdin = 1; + } + } else if (sym_change_count) { + name = getenv("KCONFIG_NOSILENTUPDATE"); + if (name && *name) { + fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n")); + return 1; + } + } else + goto skip_check; + + do { + conf_cnt = 0; + check_conf(&rootmenu); + } while (conf_cnt); + + if (!conf_write(NULL)) { +skip_check: + return 0; + } + fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n")); + return 1; +} diff --git a/kconfig/confdata.c b/kconfig/confdata.c new file mode 100644 index 0000000..8d79f44 --- /dev/null +++ b/kconfig/confdata.c @@ -0,0 +1,800 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf_warning(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + +static const char *conf_filename; +static int conf_lineno, conf_warnings, conf_unsaved; + +#ifndef conf_defname +const char conf_defname[] = "arch/$ARCH/defconfig"; +#endif + +static void conf_warning(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + conf_warnings++; +} + +const char *conf_get_configname(void) +{ + char *name = getenv("KCONFIG_CONFIG"); + + return name ? name : ".config"; +} + +static char *conf_expand_value(const char *in) +{ + struct symbol *sym; + const char *src; + static char res_value[SYMBOL_MAXLENGTH]; + char *dst, name[SYMBOL_MAXLENGTH]; + + res_value[0] = 0; + dst = name; + while ((src = strchr(in, '$'))) { + strncat(res_value, in, src - in); + src++; + dst = name; + while (isalnum(*src) || *src == '_') + *dst++ = *src++; + *dst = 0; + sym = sym_lookup(name, 0); + sym_calc_value(sym); + strcat(res_value, sym_get_string_value(sym)); + in = src; + } + strcat(res_value, in); + + return res_value; +} + +char *conf_get_default_confname(void) +{ + struct stat buf; + static char fullname[PATH_MAX+1]; + char *env, *name; + + name = conf_expand_value(conf_defname); + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + if (!stat(fullname, &buf)) + return fullname; + } + return name; +} + +int conf_read_simple(const char *name, int def) +{ + FILE *in = NULL; + char line[1024]; + char *p, *p2; + struct symbol *sym; + int i, def_flags; + + if (name) { + in = zconf_fopen(name); + } else { + struct property *prop; + + name = conf_get_configname(); + in = zconf_fopen(name); + if (in) + goto load; + sym_change_count++; + if (!sym_defconfig_list) + return 1; + + for_all_defaults(sym_defconfig_list, prop) { + if (expr_calc_value(prop->visible.expr) == no || + prop->expr->type != E_SYMBOL) + continue; + name = conf_expand_value(prop->expr->left.sym->name); + in = zconf_fopen(name); + if (in) { + printf(_("#\n" + "# using defaults found in %s\n" + "#\n"), name); + goto load; + } + } + } + if (!in) + return 1; + +load: + conf_filename = name; + conf_lineno = 0; + conf_warnings = 0; + conf_unsaved = 0; + + def_flags = SYMBOL_DEF << def; + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_CHANGED; + sym->flags &= ~(def_flags|SYMBOL_VALID); + if (sym_is_choice(sym)) + sym->flags |= def_flags; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->def[def].val) + free(sym->def[def].val); + default: + sym->def[def].val = NULL; + sym->def[def].tri = no; + } + } + + while (fgets(line, sizeof(line), in)) { + conf_lineno++; + sym = NULL; + switch (line[0]) { + case '#': + if (memcmp(line + 2, "CT_", 3)) + continue; + p = strchr(line + 5, ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + if (def == S_DEF_USER) { + sym = sym_find(line + 5); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 5); + break; + } + } else { + sym = sym_lookup(line + 5, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_BOOLEAN; + } + if (sym->flags & def_flags) { + conf_warning("trying to reassign symbol %s", sym->name); + break; + } + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + default: + ; + } + break; + case 'C': + if (memcmp(line, "CT_", 3)) { + conf_warning("unexpected data"); + continue; + } + p = strchr(line + 3, '='); + if (!p) + continue; + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) { + *p2-- = 0; + if (*p2 == '\r') + *p2 = 0; + } + if (def == S_DEF_USER) { + sym = sym_find(line + 3); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 3); + break; + } + } else { + sym = sym_lookup(line + 3, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_OTHER; + } + if (sym->flags & def_flags) { + conf_warning("trying to reassign symbol %s", sym->name); + break; + } + switch (sym->type) { + case S_TRISTATE: + if (p[0] == 'm') { + sym->def[def].tri = mod; + sym->flags |= def_flags; + break; + } + case S_BOOLEAN: + if (p[0] == 'y') { + sym->def[def].tri = yes; + sym->flags |= def_flags; + break; + } + if (p[0] == 'n') { + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + } + conf_warning("symbol value '%s' invalid for %s", p, sym->name); + break; + case S_OTHER: + if (*p != '"') { + for (p2 = p; *p2 && !isspace(*p2); p2++) + ; + sym->type = S_STRING; + goto done; + } + case S_STRING: + if (*p++ != '"') + break; + for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { + if (*p2 == '"') { + *p2 = 0; + break; + } + memmove(p2, p2 + 1, strlen(p2)); + } + if (!p2) { + conf_warning("invalid string found"); + continue; + } + case S_INT: + case S_HEX: + done: + if (sym_string_valid(sym, p)) { + sym->def[def].val = strdup(p); + sym->flags |= def_flags; + } else { + conf_warning("symbol value '%s' invalid for %s", p, sym->name); + continue; + } + break; + default: + ; + } + break; + case '\r': + case '\n': + break; + default: + conf_warning("unexpected data"); + continue; + } + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->def[def].tri) { + case no: + break; + case mod: + if (cs->def[def].tri == yes) { + conf_warning("%s creates inconsistent choice state", sym->name); + cs->flags &= ~def_flags; + } + break; + case yes: + if (cs->def[def].tri != no) { + conf_warning("%s creates inconsistent choice state", sym->name); + cs->flags &= ~def_flags; + } else + cs->def[def].val = sym; + break; + } + cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri); + } + } + fclose(in); + + if (modules_sym) + sym_calc_value(modules_sym); + return 0; +} + +int conf_read(const char *name) +{ + struct symbol *sym; + struct property *prop; + struct expr *e; + int i, flags; + + sym_change_count = 0; + + if (conf_read_simple(name, S_DEF_USER)) + return 1; + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) + goto sym_ok; + if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { + /* check that calculated value agrees with saved value */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) + break; + if (!sym_is_choice(sym)) + goto sym_ok; + default: + if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) + goto sym_ok; + break; + } + } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) + /* no previous value and not saved */ + goto sym_ok; + conf_unsaved++; + /* maybe print value in verbose mode... */ + sym_ok: + if (sym_has_value(sym) && !sym_is_choice_value(sym)) { + if (sym->visible == no) + sym->flags &= ~SYMBOL_DEF_USER; + switch (sym->type) { + case S_STRING: + case S_INT: + case S_HEX: + if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val)) + sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); + default: + break; + } + } + if (!sym_is_choice(sym)) + continue; + prop = sym_get_choice_prop(sym); + flags = sym->flags; + for (e = prop->expr; e; e = e->left.expr) + if (e->right.sym->visible != no) + flags &= e->right.sym->flags; + sym->flags &= flags | ~SYMBOL_DEF_USER; + } + + sym_change_count += conf_warnings || conf_unsaved; + + return 0; +} + +struct menu *next_menu(struct menu *menu) +{ + if (menu->list) return menu->list; + do { + if (menu->next) { + menu = menu->next; + break; + } + } while ((menu = menu->parent)); + + return menu; +} + +#define SYMBOL_FORCEWRITE (1<<31) + +int conf_write(const char *name) +{ + FILE *out; + struct symbol *sym; + struct menu *menu; + const char *basename; + char dirname[128], tmpname[128], newname[128]; + int type, l, writetype; + const char *str; + time_t now; + int use_timestamp = 1; + char *env; + + dirname[0] = 0; + if (name && name[0]) { + struct stat st; + char *slash; + + if (!stat(name, &st) && S_ISDIR(st.st_mode)) { + strcpy(dirname, name); + strcat(dirname, "/"); + basename = conf_get_configname(); + } else if ((slash = strrchr(name, '/'))) { + int size = slash - name + 1; + memcpy(dirname, name, size); + dirname[size] = 0; + if (slash[1]) + basename = slash + 1; + else + basename = conf_get_configname(); + } else + basename = name; + } else + basename = conf_get_configname(); + + sprintf(newname, "%s%s", dirname, basename); + env = getenv("KCONFIG_OVERWRITECONFIG"); + if (!env || !*env) { + sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); + out = fopen(tmpname, "w"); + } else { + *tmpname = 0; + out = fopen(newname, "w"); + } + if (!out) + return 1; + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + time(&now); + env = getenv("KCONFIG_NOTIMESTAMP"); + if (env && *env) + use_timestamp = 0; + + fprintf(out, _("#\n" + "# Automatically generated make config: don't edit\n" + "# "PROJECT_NAME" version: %s\n" + "%s%s" + "#\n"), + sym_get_string_value(sym), + use_timestamp ? "# " : "", + use_timestamp ? ctime(&now) : ""); + + if (!sym_change_count) + sym_clear_all_valid(); + + // Write out all symbols (even in closed sub-menus). + if (1) { + for (menu = rootmenu.list; menu; menu = next_menu(menu)) + if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE; + writetype = SYMBOL_FORCEWRITE; + + // Don't write out symbols in closed menus. + + } else writetype = SYMBOL_WRITE; + + + menu = rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + str = menu_get_prompt(menu); + fprintf(out, "\n" + "#\n" + "# %s\n" + "#\n", str); + } else if (!(sym->flags & SYMBOL_CHOICE)) { + sym_calc_value(sym); + if (!(sym->flags & writetype)) + goto next; + sym->flags &= ~writetype; + type = sym->type; + if (type == S_TRISTATE) { + sym_calc_value(modules_sym); + if (modules_sym->curr.tri == no) + type = S_BOOLEAN; + } + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + fprintf(out, "# CT_%s is not set\n", sym->name); + break; + case mod: + fprintf(out, "CT_%s=m\n", sym->name); + break; + case yes: + fprintf(out, "CT_%s=y\n", sym->name); + break; + } + break; + case S_STRING: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=\"", sym->name); + while (1) { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + str += l; + } + if (!*str) + break; + fprintf(out, "\\%c", *str++); + } + fputs("\"\n", out); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0"); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0"); + break; + } + } + + next: + if (writetype == SYMBOL_WRITE) { + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->next) { + menu = menu->next; + break; + } + } + } else + menu = next_menu(menu); + } + fclose(out); + + if (*tmpname) { + strcat(dirname, basename); + strcat(dirname, ".old"); + rename(newname, dirname); + if (rename(tmpname, newname)) + return 1; + } + + printf(_("#\n" + "# configuration written to %s\n" + "#\n"), newname); + + sym_change_count = 0; + + return 0; +} + +int conf_split_config(void) +{ + char *name, path[128]; + char *s, *d, c; + struct symbol *sym; + struct stat sb; + int res, i, fd; + + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + conf_read_simple(name, S_DEF_AUTO); + + if (chdir("include/config")) + return 1; + + res = 0; + for_all_symbols(i, sym) { + sym_calc_value(sym); + if ((sym->flags & SYMBOL_AUTO) || !sym->name) + continue; + if (sym->flags & SYMBOL_WRITE) { + if (sym->flags & SYMBOL_DEF_AUTO) { + /* + * symbol has old and new value, + * so compare them... + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == + sym->def[S_DEF_AUTO].tri) + continue; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (!strcmp(sym_get_string_value(sym), + sym->def[S_DEF_AUTO].val)) + continue; + break; + default: + break; + } + } else { + /* + * If there is no old value, only 'no' (unset) + * is allowed as new value. + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == no) + continue; + break; + default: + break; + } + } + } else if (!(sym->flags & SYMBOL_DEF_AUTO)) + /* There is neither an old nor a new value. */ + continue; + /* else + * There is an old value, but no new value ('no' (unset) + * isn't saved in auto.conf, so the old value is always + * different from 'no'). + */ + + /* Replace all '_' and append ".h" */ + s = sym->name; + d = path; + while ((c = *s++)) { + c = tolower(c); + *d++ = (c == '_') ? '/' : c; + } + strcpy(d, ".h"); + + /* Assume directory path already exists. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + if (errno != ENOENT) { + res = 1; + break; + } + /* + * Create directory components, + * unless they exist already. + */ + d = path; + while ((d = strchr(d, '/'))) { + *d = 0; + if (stat(path, &sb) && mkdir(path, 0755)) { + res = 1; + goto out; + } + *d++ = '/'; + } + /* Try it again. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + res = 1; + break; + } + } + close(fd); + } +out: + if (chdir("../..")) + return 1; + + return res; +} + +int conf_write_autoconf(void) +{ + struct symbol *sym; + const char *str; + char *name; + FILE *out, *out_h; + time_t now; + int i, l; + + sym_clear_all_valid(); + + file_write_dep("include/config/auto.conf.cmd"); + + if (conf_split_config()) + return 1; + + out = fopen(".tmpconfig", "w"); + if (!out) + return 1; + + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) { + fclose(out); + return 1; + } + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + time(&now); + fprintf(out, "#\n" + "# Automatically generated make config: don't edit\n" + "# "PROJECT_NAME" version: %s\n" + "# %s" + "#\n", + sym_get_string_value(sym), ctime(&now)); + fprintf(out_h, "/*\n" + " * Automatically generated C config: don't edit\n" + " * "PROJECT_NAME" version: %s\n" + " * %s" + " */\n" + "#define AUTOCONF_INCLUDED\n", + sym_get_string_value(sym), ctime(&now)); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE) || !sym->name) + continue; + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + break; + case mod: + fprintf(out, "CT_%s=m\n", sym->name); + fprintf(out_h, "#define CT_%s_MODULE 1\n", sym->name); + break; + case yes: + fprintf(out, "CT_%s=y\n", sym->name); + fprintf(out_h, "#define CT_%s 1\n", sym->name); + break; + } + break; + case S_STRING: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=\"", sym->name); + fprintf(out_h, "#define CT_%s \"", sym->name); + while (1) { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + fwrite(str, l, 1, out_h); + str += l; + } + if (!*str) + break; + fprintf(out, "\\%c", *str); + fprintf(out_h, "\\%c", *str); + str++; + } + fputs("\"\n", out); + fputs("\"\n", out_h); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "CT_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CT_%s 0x%s\n", sym->name, str); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CT_%s %s\n", sym->name, str); + break; + default: + break; + } + } + fclose(out); + fclose(out_h); + + name = getenv("KCONFIG_AUTOHEADER"); + if (!name) + name = "include/linux/autoconf.h"; + if (rename(".tmpconfig.h", name)) + return 1; + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + /* + * This must be the last step, kbuild has a dependency on auto.conf + * and this marks the successful completion of the previous steps. + */ + if (rename(".tmpconfig", name)) + return 1; + + return 0; +} diff --git a/kconfig/expr.c b/kconfig/expr.c new file mode 100644 index 0000000..6f98dbf --- /dev/null +++ b/kconfig/expr.c @@ -0,0 +1,1100 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define DEBUG_EXPR 0 + +struct expr *expr_alloc_symbol(struct symbol *sym) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = E_SYMBOL; + e->left.sym = sym; + return e; +} + +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = ce; + return e; +} + +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = e1; + e->right.expr = e2; + return e; +} + +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.sym = s1; + e->right.sym = s2; + return e; +} + +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; +} + +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; +} + +struct expr *expr_copy(struct expr *org) +{ + struct expr *e; + + if (!org) + return NULL; + + e = malloc(sizeof(*org)); + memcpy(e, org, sizeof(*org)); + switch (org->type) { + case E_SYMBOL: + e->left = org->left; + break; + case E_NOT: + e->left.expr = expr_copy(org->left.expr); + break; + case E_EQUAL: + case E_UNEQUAL: + e->left.sym = org->left.sym; + e->right.sym = org->right.sym; + break; + case E_AND: + case E_OR: + case E_CHOICE: + e->left.expr = expr_copy(org->left.expr); + e->right.expr = expr_copy(org->right.expr); + break; + default: + printf("can't copy type %d\n", e->type); + free(e); + e = NULL; + break; + } + + return e; +} + +void expr_free(struct expr *e) +{ + if (!e) + return; + + switch (e->type) { + case E_SYMBOL: + break; + case E_NOT: + expr_free(e->left.expr); + return; + case E_EQUAL: + case E_UNEQUAL: + break; + case E_OR: + case E_AND: + expr_free(e->left.expr); + expr_free(e->right.expr); + break; + default: + printf("how to free type %d?\n", e->type); + break; + } + free(e); +} + +static int trans_count; + +#define e1 (*ep1) +#define e2 (*ep2) + +static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ + if (e1->type == type) { + __expr_eliminate_eq(type, &e1->left.expr, &e2); + __expr_eliminate_eq(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + __expr_eliminate_eq(type, &e1, &e2->left.expr); + __expr_eliminate_eq(type, &e1, &e2->right.expr); + return; + } + if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym && + (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) + return; + if (!expr_eq(e1, e2)) + return; + trans_count++; + expr_free(e1); expr_free(e2); + switch (type) { + case E_OR: + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + break; + case E_AND: + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + break; + default: + ; + } +} + +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) +{ + if (!e1 || !e2) + return; + switch (e1->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e1->type, ep1, ep2); + default: + ; + } + if (e1->type != e2->type) switch (e2->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e2->type, ep1, ep2); + default: + ; + } + e1 = expr_eliminate_yn(e1); + e2 = expr_eliminate_yn(e2); +} + +#undef e1 +#undef e2 + +int expr_eq(struct expr *e1, struct expr *e2) +{ + int res, old_count; + + if (e1->type != e2->type) + return 0; + switch (e1->type) { + case E_EQUAL: + case E_UNEQUAL: + return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; + case E_SYMBOL: + return e1->left.sym == e2->left.sym; + case E_NOT: + return expr_eq(e1->left.expr, e2->left.expr); + case E_AND: + case E_OR: + e1 = expr_copy(e1); + e2 = expr_copy(e2); + old_count = trans_count; + expr_eliminate_eq(&e1, &e2); + res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym); + expr_free(e1); + expr_free(e2); + trans_count = old_count; + return res; + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + + if (DEBUG_EXPR) { + expr_fprint(e1, stdout); + printf(" = "); + expr_fprint(e2, stdout); + printf(" ?\n"); + } + + return 0; +} + +struct expr *expr_eliminate_yn(struct expr *e) +{ + struct expr *tmp; + + if (e) switch (e->type) { + case E_AND: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } + } + break; + case E_OR: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + break; + default: + ; + } + return e; +} + +/* + * bool FOO!=n => FOO + */ +struct expr *expr_trans_bool(struct expr *e) +{ + if (!e) + return NULL; + switch (e->type) { + case E_AND: + case E_OR: + case E_NOT: + e->left.expr = expr_trans_bool(e->left.expr); + e->right.expr = expr_trans_bool(e->right.expr); + break; + case E_UNEQUAL: + // FOO!=n -> FOO + if (e->left.sym->type == S_TRISTATE) { + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + } + } + break; + default: + ; + } + return e; +} + +/* + * e1 || e2 -> ? + */ +struct expr *expr_join_or(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='m') -> (a!='n') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='n') -> (a!='m') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { + // (a='m') || (a='n') -> (a!='y') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); + } + } + if (sym1->type == S_BOOLEAN && sym1 == sym2) { + if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || + (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) + return expr_alloc_symbol(&symbol_yes); + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") || ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +struct expr *expr_join_and(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) + // (a) && (a='y') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) + // (a) && (a!='n') -> (a) + return expr_alloc_symbol(sym1); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) + // (a) && (a!='m') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e1->right.sym; + if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e2->right.sym; + if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='m') -> (a='n') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) + // (a!='m') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || + (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) + return NULL; + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") && ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp; + + if (e1->type == type) { + expr_eliminate_dups1(type, &e1->left.expr, &e2); + expr_eliminate_dups1(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups1(type, &e1, &e2->left.expr); + expr_eliminate_dups1(type, &e1, &e2->right.expr); + return; + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e1->type, &e1, &e1); + default: + ; + } + + switch (type) { + case E_OR: + tmp = expr_join_or(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_no); + e2 = tmp; + trans_count++; + } + break; + case E_AND: + tmp = expr_join_and(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_yes); + e2 = tmp; + trans_count++; + } + break; + default: + ; + } +#undef e1 +#undef e2 +} + +static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp, *tmp1, *tmp2; + + if (e1->type == type) { + expr_eliminate_dups2(type, &e1->left.expr, &e2); + expr_eliminate_dups2(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups2(type, &e1, &e2->left.expr); + expr_eliminate_dups2(type, &e1, &e2->right.expr); + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO || BAR) && (!FOO && !BAR) -> n + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_and(&tmp1, &tmp2); + if (expr_is_yes(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_no); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + case E_AND: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO && BAR) || (!FOO || !BAR) -> y + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_or(&tmp1, &tmp2); + if (expr_is_no(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_yes); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + default: + ; + } +#undef e1 +#undef e2 +} + +struct expr *expr_eliminate_dups(struct expr *e) +{ + int oldcount; + if (!e) + return e; + + oldcount = trans_count; + while (1) { + trans_count = 0; + switch (e->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e->type, &e, &e); + expr_eliminate_dups2(e->type, &e, &e); + default: + ; + } + if (!trans_count) + break; + e = expr_eliminate_yn(e); + } + trans_count = oldcount; + return e; +} + +struct expr *expr_transform(struct expr *e) +{ + struct expr *tmp; + + if (!e) + return NULL; + switch (e->type) { + case E_EQUAL: + case E_UNEQUAL: + case E_SYMBOL: + case E_CHOICE: + break; + default: + e->left.expr = expr_transform(e->left.expr); + e->right.expr = expr_transform(e->right.expr); + } + + switch (e->type) { + case E_EQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + break; + case E_UNEQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + break; + case E_NOT: + switch (e->left.expr->type) { + case E_NOT: + // !!a -> a + tmp = e->left.expr->left.expr; + free(e->left.expr); + free(e); + e = tmp; + e = expr_transform(e); + break; + case E_EQUAL: + case E_UNEQUAL: + // !a='x' -> a!='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; + break; + case E_OR: + // !(a || b) -> !a && !b + tmp = e->left.expr; + e->type = E_AND; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_AND: + // !(a && b) -> !a || !b + tmp = e->left.expr; + e->type = E_OR; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_SYMBOL: + if (e->left.expr->left.sym == &symbol_yes) { + // !'y' -> 'n' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + break; + } + if (e->left.expr->left.sym == &symbol_mod) { + // !'m' -> 'm' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_mod; + break; + } + if (e->left.expr->left.sym == &symbol_no) { + // !'n' -> 'y' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + break; + } + break; + default: + ; + } + break; + default: + ; + } + return e; +} + +int expr_contains_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return 0; + + switch (dep->type) { + case E_AND: + case E_OR: + return expr_contains_symbol(dep->left.expr, sym) || + expr_contains_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + case E_UNEQUAL: + return dep->left.sym == sym || + dep->right.sym == sym; + case E_NOT: + return expr_contains_symbol(dep->left.expr, sym); + default: + ; + } + return 0; +} + +bool expr_depends_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return false; + + switch (dep->type) { + case E_AND: + return expr_depends_symbol(dep->left.expr, sym) || + expr_depends_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) + return true; + } + break; + case E_UNEQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_no) + return true; + } + break; + default: + ; + } + return false; +} + +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_AND, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_OR, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + if (e1->type == type) { + expr_extract_eq(type, ep, &e1->left.expr, &e2); + expr_extract_eq(type, ep, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_extract_eq(type, ep, ep1, &e2->left.expr); + expr_extract_eq(type, ep, ep1, &e2->right.expr); + return; + } + if (expr_eq(e1, e2)) { + *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1; + expr_free(e2); + if (type == E_AND) { + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + } else if (type == E_OR) { + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + } + } +#undef e1 +#undef e2 +} + +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) +{ + struct expr *e1, *e2; + + if (!e) { + e = expr_alloc_symbol(sym); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + } + switch (e->type) { + case E_AND: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_AND, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_OR, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_OR: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_OR, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_AND, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_NOT: + return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); + case E_UNEQUAL: + case E_EQUAL: + if (type == E_EQUAL) { + if (sym == &symbol_yes) + return expr_copy(e); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_no); + if (sym == &symbol_no) + return expr_alloc_one(E_NOT, expr_copy(e)); + } else { + if (sym == &symbol_yes) + return expr_alloc_one(E_NOT, expr_copy(e)); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_yes); + if (sym == &symbol_no) + return expr_copy(e); + } + break; + case E_SYMBOL: + return expr_alloc_comp(type, e->left.sym, sym); + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + return NULL; +} + +tristate expr_calc_value(struct expr *e) +{ + tristate val1, val2; + const char *str1, *str2; + + if (!e) + return yes; + + switch (e->type) { + case E_SYMBOL: + sym_calc_value(e->left.sym); + return e->left.sym->curr.tri; + case E_AND: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_AND(val1, val2); + case E_OR: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_OR(val1, val2); + case E_NOT: + val1 = expr_calc_value(e->left.expr); + return E_NOT(val1); + case E_EQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? yes : no; + case E_UNEQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? no : yes; + default: + printf("expr_calc_value: %d?\n", e->type); + return no; + } +} + +int expr_compare_type(enum expr_type t1, enum expr_type t2) +{ +#if 0 + return 1; +#else + if (t1 == t2) + return 0; + switch (t1) { + case E_EQUAL: + case E_UNEQUAL: + if (t2 == E_NOT) + return 1; + case E_NOT: + if (t2 == E_AND) + return 1; + case E_AND: + if (t2 == E_OR) + return 1; + case E_OR: + if (t2 == E_CHOICE) + return 1; + case E_CHOICE: + if (t2 == 0) + return 1; + default: + return -1; + } + printf("[%dgt%d?]", t1, t2); + return 0; +#endif +} + +void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) +{ + if (!e) { + fn(data, NULL, "y"); + return; + } + + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, "("); + switch (e->type) { + case E_SYMBOL: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, ""); + break; + case E_NOT: + fn(data, NULL, "!"); + expr_print(e->left.expr, fn, data, E_NOT); + break; + case E_EQUAL: + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_UNEQUAL: + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "!="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_OR: + expr_print(e->left.expr, fn, data, E_OR); + fn(data, NULL, " || "); + expr_print(e->right.expr, fn, data, E_OR); + break; + case E_AND: + expr_print(e->left.expr, fn, data, E_AND); + fn(data, NULL, " && "); + expr_print(e->right.expr, fn, data, E_AND); + break; + case E_CHOICE: + fn(data, e->right.sym, e->right.sym->name); + if (e->left.expr) { + fn(data, NULL, " ^ "); + expr_print(e->left.expr, fn, data, E_CHOICE); + } + break; + case E_RANGE: + fn(data, NULL, "["); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, " "); + fn(data, e->right.sym, e->right.sym->name); + fn(data, NULL, "]"); + break; + default: + { + char buf[32]; + sprintf(buf, "", e->type); + fn(data, NULL, buf); + break; + } + } + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, ")"); +} + +static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) +{ + fwrite(str, strlen(str), 1, data); +} + +void expr_fprint(struct expr *e, FILE *out) +{ + expr_print(e, expr_print_file_helper, out, E_NONE); +} + +static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) +{ + str_append((struct gstr*)data, str); +} + +void expr_gstr_print(struct expr *e, struct gstr *gs) +{ + expr_print(e, expr_print_gstr_helper, gs, E_NONE); +} diff --git a/kconfig/expr.h b/kconfig/expr.h new file mode 100644 index 0000000..6084525 --- /dev/null +++ b/kconfig/expr.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#ifndef __cplusplus +#include +#endif + +struct file { + struct file *next; + struct file *parent; + char *name; + int lineno; + int flags; +}; + +#define FILE_BUSY 0x0001 +#define FILE_SCANNED 0x0002 +#define FILE_PRINTED 0x0004 + +typedef enum tristate { + no, mod, yes +} tristate; + +enum expr_type { + E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE +}; + +union expr_data { + struct expr *expr; + struct symbol *sym; +}; + +struct expr { + enum expr_type type; + union expr_data left, right; +}; + +#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) +#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) +#define E_NOT(dep) (2-(dep)) + +struct expr_value { + struct expr *expr; + tristate tri; +}; + +struct symbol_value { + void *val; + tristate tri; +}; + +enum symbol_type { + S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER +}; + +enum { + S_DEF_USER, /* main user value */ + S_DEF_AUTO, +}; + +struct symbol { + struct symbol *next; + char *name; + char *help; + enum symbol_type type; + struct symbol_value curr; + struct symbol_value def[4]; + tristate visible; + int flags; + struct property *prop; + struct expr *dep, *dep2; + struct expr_value rev_dep; +}; + +#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) + +#define SYMBOL_CONST 0x0001 +#define SYMBOL_CHECK 0x0008 +#define SYMBOL_CHOICE 0x0010 +#define SYMBOL_CHOICEVAL 0x0020 +#define SYMBOL_PRINTED 0x0040 +#define SYMBOL_VALID 0x0080 +#define SYMBOL_OPTIONAL 0x0100 +#define SYMBOL_WRITE 0x0200 +#define SYMBOL_CHANGED 0x0400 +#define SYMBOL_AUTO 0x1000 +#define SYMBOL_CHECKED 0x2000 +#define SYMBOL_WARNED 0x8000 +#define SYMBOL_DEF 0x10000 +#define SYMBOL_DEF_USER 0x10000 +#define SYMBOL_DEF_AUTO 0x20000 +#define SYMBOL_DEF3 0x40000 +#define SYMBOL_DEF4 0x80000 + +#define SYMBOL_MAXLENGTH 256 +#define SYMBOL_HASHSIZE 257 +#define SYMBOL_HASHMASK 0xff + +enum prop_type { + P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE +}; + +struct property { + struct property *next; + struct symbol *sym; + enum prop_type type; + const char *text; + struct expr_value visible; + struct expr *expr; + struct menu *menu; + struct file *file; + int lineno; +}; + +#define for_all_properties(sym, st, tok) \ + for (st = sym->prop; st; st = st->next) \ + if (st->type == (tok)) +#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) +#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) +#define for_all_prompts(sym, st) \ + for (st = sym->prop; st; st = st->next) \ + if (st->text) + +struct menu { + struct menu *next; + struct menu *parent; + struct menu *list; + struct symbol *sym; + struct property *prompt; + struct expr *dep; + unsigned int flags; + //char *help; + struct file *file; + int lineno; + void *data; +}; + +#define MENU_CHANGED 0x0001 +#define MENU_ROOT 0x0002 + +#ifndef SWIG + +extern struct file *file_list; +extern struct file *current_file; +struct file *lookup_file(const char *name); + +extern struct symbol symbol_yes, symbol_no, symbol_mod; +extern struct symbol *modules_sym; +extern struct symbol *sym_defconfig_list; +extern int cdebug; +struct expr *expr_alloc_symbol(struct symbol *sym); +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); +struct expr *expr_copy(struct expr *org); +void expr_free(struct expr *e); +int expr_eq(struct expr *e1, struct expr *e2); +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); +tristate expr_calc_value(struct expr *e); +struct expr *expr_eliminate_yn(struct expr *e); +struct expr *expr_trans_bool(struct expr *e); +struct expr *expr_eliminate_dups(struct expr *e); +struct expr *expr_transform(struct expr *e); +int expr_contains_symbol(struct expr *dep, struct symbol *sym); +bool expr_depends_symbol(struct expr *dep, struct symbol *sym); +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); + +void expr_fprint(struct expr *e, FILE *out); +struct gstr; /* forward */ +void expr_gstr_print(struct expr *e, struct gstr *gs); + +static inline int expr_is_yes(struct expr *e) +{ + return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); +} + +static inline int expr_is_no(struct expr *e) +{ + return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EXPR_H */ diff --git a/kconfig/lex.zconf.c_shipped b/kconfig/lex.zconf.c_shipped new file mode 100644 index 0000000..800f8c7 --- /dev/null +++ b/kconfig/lex.zconf.c_shipped @@ -0,0 +1,2350 @@ + +#line 3 "scripts/kconfig/lex.zconf.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 33 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE zconfrestart(zconfin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int zconfleng; + +extern FILE *zconfin, *zconfout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via zconfrestart()), so that the user can continue scanning by + * just pointing zconfin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when zconftext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int zconfleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow zconfwrap()'s to do buffer switches + * instead of setting up a fresh zconfin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void zconfrestart (FILE *input_file ); +void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); +void zconf_delete_buffer (YY_BUFFER_STATE b ); +void zconf_flush_buffer (YY_BUFFER_STATE b ); +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); +void zconfpop_buffer_state (void ); + +static void zconfensure_buffer_stack (void ); +static void zconf_load_buffer_state (void ); +static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); + +void *zconfalloc (yy_size_t ); +void *zconfrealloc (void *,yy_size_t ); +void zconffree (void * ); + +#define yy_new_buffer zconf_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define zconfwrap() 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; + +typedef int yy_state_type; + +extern int zconflineno; + +int zconflineno = 1; + +extern char *zconftext; +#define yytext_ptr zconftext +static yyconst flex_int16_t yy_nxt[][17] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 16 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 16 + + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 26, 26, 27, 28, 29, 30, 31, 29, 32, + 33, 34, 35, 35, 36, 37, 38 + + }, + + { + 11, 26, 26, 27, 28, 29, 30, 31, 29, 32, + 33, 34, 35, 35, 36, 37, 38 + }, + + { + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11 + }, + + { + 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12 + }, + + { + 11, -13, 39, 40, -13, -13, 41, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13 + }, + + { + 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14 + + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16 + }, + + { + 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17 + }, + + { + 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, 44, -18, -18, -18 + }, + + { + 11, 45, 45, -19, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45 + + }, + + { + 11, -20, 46, 47, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20 + }, + + { + 11, 48, -21, -21, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48 + }, + + { + 11, 49, 49, 50, 49, -22, 49, 49, -22, 49, + 49, 49, 49, 49, 49, -22, 49 + }, + + { + 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23 + }, + + { + 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24 + + }, + + { + 11, 51, 51, 52, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51 + }, + + { + 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26 + }, + + { + 11, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27 + }, + + { + 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, 53, -28, -28 + }, + + { + 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29 + + }, + + { + 11, 54, 54, -30, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54 + }, + + { + 11, -31, -31, -31, -31, -31, -31, 55, -31, -31, + -31, -31, -31, -31, -31, -31, -31 + }, + + { + 11, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32 + }, + + { + 11, -33, -33, -33, -33, -33, -33, -33, -33, -33, + -33, -33, -33, -33, -33, -33, -33 + }, + + { + 11, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, 56, 57, 57, -34, -34, -34 + + }, + + { + 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, 57, 57, 57, -35, -35, -35 + }, + + { + 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36 + }, + + { + 11, -37, -37, 58, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37 + }, + + { + 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, 59 + }, + + { + 11, -39, 39, 40, -39, -39, 41, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39 + + }, + + { + 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40 + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43 + }, + + { + 11, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, 44, -44, -44, -44 + + }, + + { + 11, 45, 45, -45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45 + }, + + { + 11, -46, 46, 47, -46, -46, -46, -46, -46, -46, + -46, -46, -46, -46, -46, -46, -46 + }, + + { + 11, 48, -47, -47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48 + }, + + { + 11, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48 + }, + + { + 11, 49, 49, 50, 49, -49, 49, 49, -49, 49, + 49, 49, 49, 49, 49, -49, 49 + + }, + + { + 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50 + }, + + { + 11, -51, -51, 52, -51, -51, -51, -51, -51, -51, + -51, -51, -51, -51, -51, -51, -51 + }, + + { + 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52 + }, + + { + 11, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53 + }, + + { + 11, 54, 54, -54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54 + + }, + + { + 11, -55, -55, -55, -55, -55, -55, -55, -55, -55, + -55, -55, -55, -55, -55, -55, -55 + }, + + { + 11, -56, -56, -56, -56, -56, -56, -56, -56, -56, + -56, 60, 57, 57, -56, -56, -56 + }, + + { + 11, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, 57, 57, 57, -57, -57, -57 + }, + + { + 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58 + }, + + { + 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, -59, -59, -59, -59 + + }, + + { + 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, 57, 57, 57, -60, -60, -60 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up zconftext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + zconfleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 33 +#define YY_END_OF_BUFFER 34 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[61] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 5, 4, 2, 3, 7, 8, 6, 32, 29, + 31, 24, 28, 27, 26, 22, 17, 13, 16, 20, + 22, 11, 12, 19, 19, 14, 22, 22, 4, 2, + 3, 3, 1, 6, 32, 29, 31, 30, 24, 23, + 26, 25, 15, 20, 9, 19, 19, 21, 10, 18 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 10, 1, 1, 1, 11, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 14, 1, 1, 1, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 15, 1, 1, 13, 1, 13, 13, 13, 13, + + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 1, 16, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int zconf_flex_debug; +int zconf_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *zconftext; + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +static struct { + struct file *file; + int lineno; +} current_pos; + +static char *text; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static void zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_size = 0; + *text = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + new_size += START_STRSIZE - 1; + new_size &= -START_STRSIZE; + text = realloc(text, new_size); + text_asize = new_size; + } + memcpy(text + text_size, str, size); + text_size += size; + text[text_size] = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +#define INITIAL 0 +#define COMMAND 1 +#define HELP 2 +#define STRING 3 +#define PARAM 4 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int zconfwrap (void ); +#else +extern int zconfwrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(zconfin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int zconflex (void); + +#define YY_DECL int zconflex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after zconftext and zconfleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + int str = 0; + int ts, i; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! zconfin ) + zconfin = stdin; + + if ( ! zconfout ) + zconfout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of zconftext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + return T_EOL; +} + YY_BREAK +case 3: +YY_RULE_SETUP + + YY_BREAK +case 4: +YY_RULE_SETUP +{ + BEGIN(COMMAND); +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ + unput(zconftext[0]); + BEGIN(COMMAND); +} + YY_BREAK + +case 6: +YY_RULE_SETUP +{ + struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + BEGIN(PARAM); + current_pos.file = current_file; + current_pos.lineno = current_file->lineno; + if (id && id->flags & TF_COMMAND) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 7: +YY_RULE_SETUP + + YY_BREAK +case 8: +/* rule 8 can match eol */ +YY_RULE_SETUP +{ + BEGIN(INITIAL); + current_file->lineno++; + return T_EOL; + } + YY_BREAK + +case 9: +YY_RULE_SETUP +return T_AND; + YY_BREAK +case 10: +YY_RULE_SETUP +return T_OR; + YY_BREAK +case 11: +YY_RULE_SETUP +return T_OPEN_PAREN; + YY_BREAK +case 12: +YY_RULE_SETUP +return T_CLOSE_PAREN; + YY_BREAK +case 13: +YY_RULE_SETUP +return T_NOT; + YY_BREAK +case 14: +YY_RULE_SETUP +return T_EQUAL; + YY_BREAK +case 15: +YY_RULE_SETUP +return T_UNEQUAL; + YY_BREAK +case 16: +YY_RULE_SETUP +{ + str = zconftext[0]; + new_string(); + BEGIN(STRING); + } + YY_BREAK +case 17: +/* rule 17 can match eol */ +YY_RULE_SETUP +BEGIN(INITIAL); current_file->lineno++; return T_EOL; + YY_BREAK +case 18: +YY_RULE_SETUP +/* ignore */ + YY_BREAK +case 19: +YY_RULE_SETUP +{ + struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + if (id && id->flags & TF_PARAM) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 20: +YY_RULE_SETUP +/* comment */ + YY_BREAK +case 21: +/* rule 21 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 22: +YY_RULE_SETUP + + YY_BREAK +case YY_STATE_EOF(PARAM): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 23: +/* rule 23 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 24: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + } + YY_BREAK +case 25: +/* rule 25 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 26: +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + } + YY_BREAK +case 27: +YY_RULE_SETUP +{ + if (str == zconftext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(zconftext, 1); + } + YY_BREAK +case 28: +/* rule 28 can match eol */ +YY_RULE_SETUP +{ + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + YY_BREAK +case YY_STATE_EOF(STRING): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 29: +YY_RULE_SETUP +{ + ts = 0; + for (i = 0; i < zconfleng; i++) { + if (zconftext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + YY_BREAK +case 30: +/* rule 30 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK +case 31: +/* rule 31 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + append_string("\n", 1); + } + YY_BREAK +case 32: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + if (!first_ts) + first_ts = last_ts; + } + YY_BREAK +case YY_STATE_EOF(HELP): +{ + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMAND): +{ + if (current_file) { + zconf_endfile(); + return T_EOL; + } + fclose(zconfin); + yyterminate(); +} + YY_BREAK +case 33: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed zconfin at a new source and called + * zconflex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( zconfwrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * zconftext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of zconflex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + zconfrestart(zconfin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up zconftext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + zconfrestart(zconfin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( zconfwrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve zconftext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void zconfrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); + zconf_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * zconfpop_buffer_state(); + * zconfpush_buffer_state(new_buffer); + */ + zconfensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + zconf_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (zconfwrap()) processing, but the only time this flag + * is looked at is after zconfwrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void zconf_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + zconf_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with zconf_create_buffer() + * + */ + void zconf_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + zconffree((void *) b->yy_ch_buf ); + + zconffree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a zconfrestart() or at EOF. + */ + static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + zconf_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then zconf_init_buffer was _probably_ + * called from zconfrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void zconf_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + zconf_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + zconfensure_buffer_stack(); + + /* This block is copied from zconf_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from zconf_switch_to_buffer. */ + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void zconfpop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void zconfensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + zconf_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to zconflex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * zconf_scan_bytes() instead. + */ +YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr ) +{ + + return zconf_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) zconfalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = zconf_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + zconftext[zconfleng] = (yy_hold_char); \ + (yy_c_buf_p) = zconftext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + zconfleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int zconfget_lineno (void) +{ + + return zconflineno; +} + +/** Get the input stream. + * + */ +FILE *zconfget_in (void) +{ + return zconfin; +} + +/** Get the output stream. + * + */ +FILE *zconfget_out (void) +{ + return zconfout; +} + +/** Get the length of the current token. + * + */ +int zconfget_leng (void) +{ + return zconfleng; +} + +/** Get the current token. + * + */ + +char *zconfget_text (void) +{ + return zconftext; +} + +/** Set the current line number. + * @param line_number + * + */ +void zconfset_lineno (int line_number ) +{ + + zconflineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see zconf_switch_to_buffer + */ +void zconfset_in (FILE * in_str ) +{ + zconfin = in_str ; +} + +void zconfset_out (FILE * out_str ) +{ + zconfout = out_str ; +} + +int zconfget_debug (void) +{ + return zconf_flex_debug; +} + +void zconfset_debug (int bdebug ) +{ + zconf_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from zconflex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + zconfin = stdin; + zconfout = stdout; +#else + zconfin = (FILE *) 0; + zconfout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * zconflex_init() + */ + return 0; +} + +/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ +int zconflex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + zconfpop_buffer_state(); + } + + /* Destroy the stack itself. */ + zconffree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * zconflex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *zconfalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *zconfrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void zconffree (void * ptr ) +{ + free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static void zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(zconfin); + zconf_delete_buffer(YY_CURRENT_BUFFER); + zconf_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; +} + +int zconf_lineno(void) +{ + return current_pos.lineno; +} + +char *zconf_curname(void) +{ + return current_pos.file ? current_pos.file->name : ""; +} + diff --git a/kconfig/lkc.h b/kconfig/lkc.h new file mode 100644 index 0000000..cf32679 --- /dev/null +++ b/kconfig/lkc.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef LKC_H +#define LKC_H + +#define PROJECT_NAME "crosstool-NG" + +// Make some warnings go away +#define YYENABLE_NLS 0 +#define YYLTYPE_IS_TRIVIAL 0 + +#include "expr.h" + +#ifndef KBUILD_NO_NLS +# include +#else +# define gettext(Msgid) ((const char *) (Msgid)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LKC_DIRECT_LINK +#define P(name,type,arg) extern type name arg +#else +#include "lkc_defs.h" +#define P(name,type,arg) extern type (*name ## _p) arg +#endif +#include "lkc_proto.h" +#undef P + +#define SRCTREE "srctree" + +#define PACKAGE "crosstool-NG" +#define LOCALEDIR "/usr/share/locale" + +#define _(text) gettext(text) +#define N_(text) (text) + + +#define TF_COMMAND 0x0001 +#define TF_PARAM 0x0002 +#define TF_OPTION 0x0004 + +#define T_OPT_MODULES 1 +#define T_OPT_DEFCONFIG_LIST 2 + +struct kconf_id { + int name; + int token; + unsigned int flags; + enum symbol_type stype; +}; + +int zconfparse(void); +void zconfdump(FILE *out); + +extern int zconfdebug; +void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); +void zconf_initscan(const char *name); +void zconf_nextfile(const char *name); +int zconf_lineno(void); +char *zconf_curname(void); + +/* confdata.c */ +char *conf_get_default_confname(void); + +/* kconfig_load.c */ +void kconfig_load(void); + +/* menu.c */ +void menu_init(void); +struct menu *menu_add_menu(void); +void menu_end_menu(void); +void menu_add_entry(struct symbol *sym); +void menu_end_entry(void); +void menu_add_dep(struct expr *dep); +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); +struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_add_option(int token, char *arg); +void menu_finalize(struct menu *parent); +void menu_set_type(int type); + +/* util.c */ +struct file *file_lookup(const char *name); +int file_write_dep(const char *name); + +struct gstr { + size_t len; + char *s; +}; +struct gstr str_new(void); +struct gstr str_assign(const char *s); +void str_free(struct gstr *gs); +void str_append(struct gstr *gs, const char *s); +void str_printf(struct gstr *gs, const char *fmt, ...); +const char *str_get(struct gstr *gs); + +/* symbol.c */ +void sym_init(void); +void sym_clear_all_valid(void); +void sym_set_all_changed(void); +void sym_set_changed(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct property *prop_alloc(enum prop_type type, struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); + +static inline tristate sym_get_tristate_value(struct symbol *sym) +{ + return sym->curr.tri; +} + + +static inline struct symbol *sym_get_choice_value(struct symbol *sym) +{ + return (struct symbol *)sym->curr.val; +} + +static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) +{ + return sym_set_tristate_value(chval, yes); +} + +static inline bool sym_is_choice(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICE ? true : false; +} + +static inline bool sym_is_choice_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICEVAL ? true : false; +} + +static inline bool sym_is_optional(struct symbol *sym) +{ + return sym->flags & SYMBOL_OPTIONAL ? true : false; +} + +static inline bool sym_has_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_DEF_USER ? true : false; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LKC_H */ diff --git a/kconfig/lkc_proto.h b/kconfig/lkc_proto.h new file mode 100644 index 0000000..a263746 --- /dev/null +++ b/kconfig/lkc_proto.h @@ -0,0 +1,42 @@ + +/* confdata.c */ +P(conf_parse,void,(const char *name)); +P(conf_read,int,(const char *name)); +P(conf_read_simple,int,(const char *name, int)); +P(conf_write,int,(const char *name)); +P(conf_write_autoconf,int,(void)); + +/* menu.c */ +P(rootmenu,struct menu,); + +P(menu_is_visible,bool,(struct menu *menu)); +P(menu_get_prompt,const char *,(struct menu *menu)); +P(menu_get_root_menu,struct menu *,(struct menu *menu)); +P(menu_get_parent_menu,struct menu *,(struct menu *menu)); + +/* symbol.c */ +P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); +P(sym_change_count,int,); + +P(sym_lookup,struct symbol *,(const char *name, int isconst)); +P(sym_find,struct symbol *,(const char *name)); +P(sym_re_search,struct symbol **,(const char *pattern)); +P(sym_type_name,const char *,(enum symbol_type type)); +P(sym_calc_value,void,(struct symbol *sym)); +P(sym_get_type,enum symbol_type,(struct symbol *sym)); +P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri)); +P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri)); +P(sym_toggle_tristate_value,tristate,(struct symbol *sym)); +P(sym_string_valid,bool,(struct symbol *sym, const char *newval)); +P(sym_string_within_range,bool,(struct symbol *sym, const char *str)); +P(sym_set_string_value,bool,(struct symbol *sym, const char *newval)); +P(sym_is_changable,bool,(struct symbol *sym)); +P(sym_get_choice_prop,struct property *,(struct symbol *sym)); +P(sym_get_default_prop,struct property *,(struct symbol *sym)); +P(sym_get_string_value,const char *,(struct symbol *sym)); + +P(prop_get_type_name,const char *,(enum prop_type type)); + +/* expr.c */ +P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); +P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)); diff --git a/kconfig/lxdialog/BIG.FAT.WARNING b/kconfig/lxdialog/BIG.FAT.WARNING new file mode 100644 index 0000000..a8999d8 --- /dev/null +++ b/kconfig/lxdialog/BIG.FAT.WARNING @@ -0,0 +1,4 @@ +This is NOT the official version of dialog. This version has been +significantly modified from the original. It is for use by the Linux +kernel configuration script. Please do not bother Savio Lam with +questions about this program. diff --git a/kconfig/lxdialog/check-lxdialog.sh b/kconfig/lxdialog/check-lxdialog.sh new file mode 100644 index 0000000..120d624 --- /dev/null +++ b/kconfig/lxdialog/check-lxdialog.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# Check ncurses compatibility + +# What library to link +ldflags() +{ + $cc -print-file-name=libncursesw.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lncursesw' + exit + fi + $cc -print-file-name=libncurses.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lncurses' + exit + fi + $cc -print-file-name=libcurses.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lcurses' + exit + fi + exit 1 +} + +# Where is ncurses.h? +ccflags() +{ + if [ -f /usr/include/ncurses/ncurses.h ]; then + echo '-I/usr/include/ncurses -DCURSES_LOC=""' + elif [ -f /usr/include/ncurses/curses.h ]; then + echo '-I/usr/include/ncurses -DCURSES_LOC=""' + elif [ -f /usr/include/ncurses.h ]; then + echo '-DCURSES_LOC=""' + else + echo '-DCURSES_LOC=""' + fi +} + +# Temp file, try to clean up after us +tmp=.lxdialog.tmp +trap "rm -f $tmp" 0 1 2 3 15 + +# Check if we can link to ncurses +check() { + echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null + if [ $? != 0 ]; then + echo " *** Unable to find the ncurses libraries." 1>&2 + echo " *** make menuconfig require the ncurses libraries" 1>&2 + echo " *** " 1>&2 + echo " *** Install ncurses (ncurses-devel) and try again" 1>&2 + echo " *** " 1>&2 + exit 1 + fi +} + +usage() { + printf "Usage: $0 [-check compiler options|-header|-library]\n" +} + +if [ $# == 0 ]; then + usage + exit 1 +fi + +cc="" +case "$1" in + "-check") + shift + cc="$@" + check + ;; + "-ccflags") + ccflags + ;; + "-ldflags") + shift + cc="$@" + ldflags + ;; + "*") + usage + exit 1 + ;; +esac diff --git a/kconfig/lxdialog/checklist.c b/kconfig/lxdialog/checklist.c new file mode 100644 index 0000000..cf69708 --- /dev/null +++ b/kconfig/lxdialog/checklist.c @@ -0,0 +1,325 @@ +/* + * checklist.c -- implements the checklist box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension + * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static int list_width, check_x, item_x; + +/* + * Print list item + */ +static void print_item(WINDOW * win, int choice, int selected) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, choice, 0); + for (i = 0; i < list_width; i++) + waddch(win, ' '); + + wmove(win, choice, check_x); + wattrset(win, selected ? dlg.check_selected.atr + : dlg.check.atr); + wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' '); + + wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr); + mvwaddch(win, choice, item_x, item_str()[0]); + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + waddstr(win, (char *)item_str() + 1); + if (selected) { + wmove(win, choice, check_x + 1); + wrefresh(win); + } +} + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int choice, int item_no, int scroll, + int y, int x, int height) +{ + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + choice < item_no - 1)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } +} + +/* + * Display the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, "Select", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with a list of options that can be turned on or off + * in the style of radiolist (only one option turned on at a time). + */ +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height) +{ + int i, x, y, box_x, box_y; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice; + WINDOW *dialog, *list; + + /* which item to highlight */ + item_foreach() { + if (item_is_tag('X')) + choice = item_n(); + if (item_is_selected()) { + choice = item_n(); + break; + } + } + +do_resize: + if (getmaxy(stdscr) < (height + 6)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + 6)) + return -ERRDISPLAYTOOSMALL; + + max_choice = MIN(list_height, item_count()); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + list_width = width - 6; + box_y = height - list_height - 5; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin(dialog, list_height, list_width, y + box_y + 1, + x + box_x + 1); + + keypad(list, TRUE); + + /* draw a box around the list items */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + /* Find length of longest item in order to center checklist */ + check_x = 0; + item_foreach() + check_x = MAX(check_x, strlen(item_str()) + 4); + + check_x = (list_width - check_x) / 2; + item_x = check_x + 4; + + if (choice >= list_height) { + scroll = choice - list_height + 1; + choice -= scroll; + } + + /* Print the list */ + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + print_item(list, i, i == choice); + } + + print_arrows(dialog, choice, item_count(), scroll, + box_y, box_x + check_x + 5, list_height); + + print_buttons(dialog, height, width, 0); + + wnoutrefresh(dialog); + wnoutrefresh(list); + doupdate(); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + for (i = 0; i < max_choice; i++) { + item_set(i + scroll); + if (toupper(key) == toupper(item_str()[0])) + break; + } + + if (i < max_choice || key == KEY_UP || key == KEY_DOWN || + key == '+' || key == '-') { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (!scroll) + continue; + /* Scroll list down */ + if (list_height > 1) { + /* De-highlight current first item */ + item_set(scroll); + print_item(list, 0, FALSE); + scrollok(list, TRUE); + wscrl(list, -1); + scrollok(list, FALSE); + } + scroll--; + item_set(scroll); + print_item(list, 0, TRUE); + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice - 1; + } else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll + choice >= item_count() - 1) + continue; + /* Scroll list up */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + item_set(scroll + max_choice - 1); + print_item(list, + max_choice - 1, + FALSE); + scrollok(list, TRUE); + wscrl(list, 1); + scrollok(list, FALSE); + } + scroll++; + item_set(scroll + max_choice - 1); + print_item(list, max_choice - 1, TRUE); + + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice + 1; + } + if (i != choice) { + /* De-highlight current item */ + item_set(scroll + choice); + print_item(list, choice, FALSE); + /* Highlight new item */ + choice = i; + item_set(scroll + choice); + print_item(list, choice, TRUE); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + switch (key) { + case 'H': + case 'h': + case '?': + button = 1; + /* fall-through */ + case 'S': + case 's': + case ' ': + case '\n': + item_foreach() + item_set_selected(0); + item_set(scroll + choice); + item_set_selected(1); + delwin(list); + delwin(dialog); + return button; + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(list); + delwin(dialog); + on_key_resize(); + goto do_resize; + } + + /* Now, update everything... */ + doupdate(); + } + delwin(list); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/dialog.h b/kconfig/lxdialog/dialog.h new file mode 100644 index 0000000..fd695e1 --- /dev/null +++ b/kconfig/lxdialog/dialog.h @@ -0,0 +1,224 @@ +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __sun__ +#define CURS_MACROS +#endif +#include CURSES_LOC + +/* + * Colors in ncurses 1.9.9e do not work properly since foreground and + * background colors are OR'd rather than separately masked. This version + * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible + * with standard curses. The simplest fix (to make this work with standard + * curses) uses the wbkgdset() function, not used in the original hack. + * Turn it off if we're building with 1.9.9e, since it just confuses things. + */ +#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) +#define OLD_NCURSES 1 +#undef wbkgdset +#define wbkgdset(w,p) /*nothing */ +#else +#define OLD_NCURSES 0 +#endif + +#define TR(params) _tracef params + +#define KEY_ESC 27 +#define TAB 9 +#define MAX_LEN 2048 +#define BUF_SIZE (10*1024) +#define MIN(x,y) (x < y ? x : y) +#define MAX(x,y) (x > y ? x : y) + +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif + +/* error return codes */ +#define ERRDISPLAYTOOSMALL (KEY_MAX + 1) + +/* + * Color definitions + */ +struct dialog_color { + chtype atr; /* Color attribute */ + int fg; /* foreground */ + int bg; /* background */ + int hl; /* highlight this item */ +}; + +struct dialog_info { + const char *backtitle; + struct dialog_color screen; + struct dialog_color shadow; + struct dialog_color dialog; + struct dialog_color title; + struct dialog_color border; + struct dialog_color button_active; + struct dialog_color button_inactive; + struct dialog_color button_key_active; + struct dialog_color button_key_inactive; + struct dialog_color button_label_active; + struct dialog_color button_label_inactive; + struct dialog_color inputbox; + struct dialog_color inputbox_border; + struct dialog_color searchbox; + struct dialog_color searchbox_title; + struct dialog_color searchbox_border; + struct dialog_color position_indicator; + struct dialog_color menubox; + struct dialog_color menubox_border; + struct dialog_color item; + struct dialog_color item_selected; + struct dialog_color tag; + struct dialog_color tag_selected; + struct dialog_color tag_key; + struct dialog_color tag_key_selected; + struct dialog_color check; + struct dialog_color check_selected; + struct dialog_color uarrow; + struct dialog_color darrow; +}; + +/* + * Global variables + */ +extern struct dialog_info dlg; +extern char dialog_input_result[]; + +/* + * Function prototypes + */ + +/* item list as used by checklist and menubox */ +void item_reset(void); +void item_make(const char *fmt, ...); +void item_add_str(const char *fmt, ...); +void item_set_tag(char tag); +void item_set_data(void *p); +void item_set_selected(int val); +int item_activate_selected(void); +void *item_data(void); +char item_tag(void); + +/* item list manipulation for lxdialog use */ +#define MAXITEMSTR 200 +struct dialog_item { + char str[MAXITEMSTR]; /* promtp displayed */ + char tag; + void *data; /* pointer to menu item - used by menubox+checklist */ + int selected; /* Set to 1 by dialog_*() function if selected. */ +}; + +/* list of lialog_items */ +struct dialog_list { + struct dialog_item node; + struct dialog_list *next; +}; + +extern struct dialog_list *item_cur; +extern struct dialog_list item_nil; +extern struct dialog_list *item_head; + +int item_count(void); +void item_set(int n); +int item_n(void); +const char *item_str(void); +int item_is_selected(void); +int item_is_tag(char tag); +#define item_foreach() \ + for (item_cur = item_head ? item_head: item_cur; \ + item_cur && (item_cur != &item_nil); item_cur = item_cur->next) + +/* generic key handlers */ +int on_key_esc(WINDOW *win); +int on_key_resize(void); + +void init_dialog(const char *backtitle); +void reset_dialog(void); +void end_dialog(void); +void attr_clear(WINDOW * win, int height, int width, chtype attr); +void dialog_clear(void); +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); +void print_button(WINDOW * win, const char *label, int y, int x, int selected); +void print_title(WINDOW *dialog, const char *title, int width); +void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, + chtype border); +void draw_shadow(WINDOW * win, int y, int x, int height, int width); + +int first_alpha(const char *string, const char *exempt); +int dialog_yesno(const char *title, const char *prompt, int height, int width); +int dialog_msgbox(const char *title, const char *prompt, int height, + int width, int pause); +int dialog_textbox(const char *title, const char *file, int height, int width); +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll); +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height); +extern char dialog_input_result[]; +int dialog_inputbox(const char *title, const char *prompt, int height, + int width, const char *init); + +/* + * This is the base for fictitious keys, which activate + * the buttons. + * + * Mouse-generated keys are the following: + * -- the first 32 are used as numbers, in addition to '0'-'9' + * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') + * -- uppercase chars are used to invoke the button (M_EVENT + 'O') + */ +#define M_EVENT (KEY_MAX+1) diff --git a/kconfig/lxdialog/inputbox.c b/kconfig/lxdialog/inputbox.c new file mode 100644 index 0000000..05e7206 --- /dev/null +++ b/kconfig/lxdialog/inputbox.c @@ -0,0 +1,238 @@ +/* + * inputbox.c -- implements the input box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +char dialog_input_result[MAX_LEN + 1]; + +/* + * Print the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, " Ok ", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box for inputing a string + */ +int dialog_inputbox(const char *title, const char *prompt, int height, int width, + const char *init) +{ + int i, x, y, box_y, box_x, box_width; + int input_x = 0, scroll = 0, key = 0, button = -1; + char *instr = dialog_input_result; + WINDOW *dialog; + + if (!init) + instr[0] = '\0'; + else + strcpy(instr, init); + +do_resize: + if (getmaxy(stdscr) <= (height - 2)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) <= (width - 2)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + /* Draw the input field box */ + box_width = width - 6; + getyx(dialog, y, x); + box_y = y + 2; + box_x = (width - box_width) / 2; + draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, + dlg.border.atr, dlg.dialog.atr); + + print_buttons(dialog, height, width, 0); + + /* Set up the initial value */ + wmove(dialog, box_y, box_x); + wattrset(dialog, dlg.inputbox.atr); + + input_x = strlen(instr); + + if (input_x >= box_width) { + scroll = input_x - box_width + 1; + input_x = box_width - 1; + for (i = 0; i < box_width - 1; i++) + waddch(dialog, instr[scroll + i]); + } else { + waddstr(dialog, instr); + } + + wmove(dialog, box_y, box_x + input_x); + + wrefresh(dialog); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + if (button == -1) { /* Input box selected */ + switch (key) { + case TAB: + case KEY_UP: + case KEY_DOWN: + break; + case KEY_LEFT: + continue; + case KEY_RIGHT: + continue; + case KEY_BACKSPACE: + case 127: + if (input_x || scroll) { + wattrset(dialog, dlg.inputbox.atr); + if (!input_x) { + scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, + instr[scroll + input_x + i] ? + instr[scroll + input_x + i] : ' '); + input_x = strlen(instr) - scroll; + } else + input_x--; + instr[scroll + input_x] = '\0'; + mvwaddch(dialog, box_y, input_x + box_x, ' '); + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } + continue; + default: + if (key < 0x100 && isprint(key)) { + if (scroll + input_x < MAX_LEN) { + wattrset(dialog, dlg.inputbox.atr); + instr[scroll + input_x] = key; + instr[scroll + input_x + 1] = '\0'; + if (input_x == box_width - 1) { + scroll++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width - 1; i++) + waddch(dialog, instr [scroll + i]); + } else { + wmove(dialog, box_y, input_x++ + box_x); + waddch(dialog, key); + } + wrefresh(dialog); + } else + flash(); /* Alarm user about overflow */ + continue; + } + } + } + switch (key) { + case 'O': + case 'o': + delwin(dialog); + return 0; + case 'H': + case 'h': + delwin(dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + switch (button) { + case -1: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + case 0: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + } + break; + case ' ': + case '\n': + delwin(dialog); + return (button == -1 ? 0 : button); + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return KEY_ESC; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/menubox.c b/kconfig/lxdialog/menubox.c new file mode 100644 index 0000000..0d83159 --- /dev/null +++ b/kconfig/lxdialog/menubox.c @@ -0,0 +1,434 @@ +/* + * menubox.c -- implements the menu box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Changes by Clifford Wolf (god@clifford.at) + * + * [ 1998-06-13 ] + * + * *) A bugfix for the Page-Down problem + * + * *) Formerly when I used Page Down and Page Up, the cursor would be set + * to the first position in the menu box. Now lxdialog is a bit + * smarter and works more like other menu systems (just have a look at + * it). + * + * *) Formerly if I selected something my scrolling would be broken because + * lxdialog is re-invoked by the Menuconfig shell script, can't + * remember the last scrolling position, and just sets it so that the + * cursor is at the bottom of the box. Now it writes the temporary file + * lxdialog.scrltmp which contains this information. The file is + * deleted by lxdialog if the user leaves a submenu or enters a new + * one, but it would be nice if Menuconfig could make another "rm -f" + * just to be sure. Just try it out - you will recognise a difference! + * + * [ 1998-06-14 ] + * + * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files + * and menus change their size on the fly. + * + * *) If for some reason the last scrolling position is not saved by + * lxdialog, it sets the scrolling so that the selected item is in the + * middle of the menu box, not at the bottom. + * + * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) + * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. + * This fixes a bug in Menuconfig where using ' ' to descend into menus + * would leave mis-synchronized lxdialog.scrltmp files lying around, + * fscanf would read in 'scroll', and eventually that value would get used. + */ + +#include "dialog.h" + +static int menu_width, item_x; + +/* + * Print menu item + */ +static void do_print_item(WINDOW * win, const char *item, int line_y, + int selected, int hotkey) +{ + int j; + char *menu_item = malloc(menu_width + 1); + + strncpy(menu_item, item, menu_width - item_x); + menu_item[menu_width - item_x] = '\0'; + j = first_alpha(menu_item, "YyNnMmHh"); + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, line_y, 0); +#if OLD_NCURSES + { + int i; + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + mvwaddstr(win, line_y, item_x, menu_item); + if (hotkey) { + wattrset(win, selected ? dlg.tag_key_selected.atr + : dlg.tag_key.atr); + mvwaddch(win, line_y, item_x + j, menu_item[j]); + } + if (selected) { + wmove(win, line_y, item_x + 1); + } + free(menu_item); + wrefresh(win); +} + +#define print_item(index, choice, selected) \ +do { \ + item_set(index); \ + do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \ +} while (0) + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x, + int height) +{ + int cur_y, cur_x; + + getyx(win, cur_y, cur_x); + + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + wrefresh(win); + + if ((height < item_no) && (scroll + height < item_no)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + wmove(win, cur_y, cur_x); + wrefresh(win); +} + +/* + * Display the termination buttons. + */ +static void print_buttons(WINDOW * win, int height, int width, int selected) +{ + int x = width / 2 - 16; + int y = height - 2; + + print_button(win, "Select", y, x, selected == 0); + print_button(win, " Exit ", y, x + 12, selected == 1); + print_button(win, " Help ", y, x + 24, selected == 2); + + wmove(win, y, x + 1 + 12 * selected); + wrefresh(win); +} + +/* scroll up n lines (n may be negative) */ +static void do_scroll(WINDOW *win, int *scroll, int n) +{ + /* Scroll menu up */ + scrollok(win, TRUE); + wscrl(win, n); + scrollok(win, FALSE); + *scroll = *scroll + n; + wrefresh(win); +} + +/* + * Display a menu for choosing among a number of options + */ +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll) +{ + int i, j, x, y, box_x, box_y; + int height, width, menu_height; + int key = 0, button = 0, scroll = 0, choice = 0; + int first_item = 0, max_choice; + WINDOW *dialog, *menu; + +do_resize: + height = getmaxy(stdscr); + width = getmaxx(stdscr); + if (height < 15 || width < 65) + return -ERRDISPLAYTOOSMALL; + + height -= 4; + width -= 5; + menu_height = height - 10; + + max_choice = MIN(menu_height, item_count()); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + menu_width = width - 6; + box_y = height - menu_height - 5; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + if (menu_width >= 80) + item_x = (menu_width - 70) / 2; + else + item_x = 4; + + /* Set choice to default item */ + item_foreach() + if (selected && (selected == item_data())) + choice = item_n(); + /* get the saved scroll info */ + scroll = *s_scroll; + if ((scroll <= choice) && (scroll + max_choice > choice) && + (scroll >= 0) && (scroll + max_choice <= item_count())) { + first_item = scroll; + choice = choice - scroll; + } else { + scroll = 0; + } + if ((choice >= max_choice)) { + if (choice >= item_count() - max_choice / 2) + scroll = first_item = item_count() - max_choice; + else + scroll = first_item = choice - max_choice / 2; + choice = choice - scroll; + } + + /* Print the menu */ + for (i = 0; i < max_choice; i++) { + print_item(first_item + i, i, i == choice); + } + + wnoutrefresh(menu); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + print_buttons(dialog, height, width, 0); + wmove(menu, choice, item_x + 1); + wrefresh(menu); + + while (key != KEY_ESC) { + key = wgetch(menu); + + if (key < 256 && isalpha(key)) + key = tolower(key); + + if (strchr("ynmh", key)) + i = max_choice; + else { + for (i = choice + 1; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + if (i == max_choice) + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + } + + if (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE) { + /* Remove highligt of current item */ + print_item(scroll + choice, choice, FALSE); + + if (key == KEY_UP || key == '-') { + if (choice < 2 && scroll) { + /* Scroll menu down */ + do_scroll(menu, &scroll, -1); + + print_item(scroll, 0, FALSE); + } else + choice = MAX(choice - 1, 0); + + } else if (key == KEY_DOWN || key == '+') { + print_item(scroll+choice, choice, FALSE); + + if ((choice > max_choice - 3) && + (scroll + max_choice < item_count())) { + /* Scroll menu up */ + do_scroll(menu, &scroll, 1); + + print_item(scroll+max_choice - 1, + max_choice - 1, FALSE); + } else + choice = MIN(choice + 1, max_choice - 1); + + } else if (key == KEY_PPAGE) { + scrollok(menu, TRUE); + for (i = 0; (i < max_choice); i++) { + if (scroll > 0) { + do_scroll(menu, &scroll, -1); + print_item(scroll, 0, FALSE); + } else { + if (choice > 0) + choice--; + } + } + + } else if (key == KEY_NPAGE) { + for (i = 0; (i < max_choice); i++) { + if (scroll + max_choice < item_count()) { + do_scroll(menu, &scroll, 1); + print_item(scroll+max_choice-1, + max_choice - 1, FALSE); + } else { + if (choice + 1 < max_choice) + choice++; + } + } + } else + choice = i; + + print_item(scroll + choice, choice, TRUE); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + wnoutrefresh(dialog); + wrefresh(menu); + + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_LEFT: + case TAB: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 2 : (button > 2 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(menu); + break; + case ' ': + case 's': + case 'y': + case 'n': + case 'm': + case '/': + /* save scroll info */ + *s_scroll = scroll; + delwin(menu); + delwin(dialog); + item_set(scroll + choice); + item_set_selected(1); + switch (key) { + case 's': + return 3; + case 'y': + return 3; + case 'n': + return 4; + case 'm': + return 5; + case ' ': + return 6; + case '/': + return 7; + } + return 0; + case 'h': + case '?': + button = 2; + case '\n': + *s_scroll = scroll; + delwin(menu); + delwin(dialog); + item_set(scroll + choice); + item_set_selected(1); + return button; + case 'e': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(menu); + break; + case KEY_RESIZE: + on_key_resize(); + delwin(menu); + delwin(dialog); + goto do_resize; + } + } + delwin(menu); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/textbox.c b/kconfig/lxdialog/textbox.c new file mode 100644 index 0000000..fabfc1a --- /dev/null +++ b/kconfig/lxdialog/textbox.c @@ -0,0 +1,391 @@ +/* + * textbox.c -- implements the text box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static void back_lines(int n); +static void print_page(WINDOW * win, int height, int width); +static void print_line(WINDOW * win, int row, int width); +static char *get_line(void); +static void print_position(WINDOW * win); + +static int hscroll; +static int begin_reached, end_reached, page_length; +static const char *buf; +static const char *page; + +/* + * refresh window content + */ +static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw, + int cur_y, int cur_x) +{ + print_page(box, boxh, boxw); + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); +} + + +/* + * Display text from a file in a dialog box. + */ +int dialog_textbox(const char *title, const char *tbuf, + int initial_height, int initial_width) +{ + int i, x, y, cur_x, cur_y, key = 0; + int height, width, boxh, boxw; + int passed_end; + WINDOW *dialog, *box; + + begin_reached = 1; + end_reached = 0; + page_length = 0; + hscroll = 0; + buf = tbuf; + page = buf; /* page is pointer to start of page to be displayed */ + +do_resize: + getmaxyx(stdscr, height, width); + if (height < 8 || width < 8) + return -ERRDISPLAYTOOSMALL; + if (initial_height != 0) + height = initial_height; + else + if (height > 4) + height -= 4; + else + height = 0; + if (initial_width != 0) + width = initial_width; + else + if (width > 5) + width -= 5; + else + width = 0; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + /* Create window for box region, used for scrolling text */ + boxh = height - 4; + boxw = width - 2; + box = subwin(dialog, boxh, boxw, y + 1, x + 1); + wattrset(box, dlg.dialog.atr); + wbkgdset(box, dlg.dialog.atr & A_COLOR); + + keypad(box, TRUE); + + /* register the new window, along with its borders */ + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE); + wnoutrefresh(dialog); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear(box, boxh, boxw, dlg.dialog.atr); + refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x); + + while ((key != KEY_ESC) && (key != '\n')) { + key = wgetch(dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + case 'X': + case 'x': + delwin(box); + delwin(dialog); + return 0; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + page = buf; + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + } + break; + case 'G': /* Last page */ + case KEY_END: + + end_reached = 1; + /* point to last char in buf */ + page = buf + strlen(buf); + back_lines(boxh); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'K': /* Previous line */ + case 'k': + case KEY_UP: + if (!begin_reached) { + back_lines(page_length + 1); + + /* We don't call print_page() here but use + * scrolling to ensure faster screen update. + * However, 'end_reached' and 'page_length' + * should still be updated, and 'page' should + * point to start of next page. This is done + * by calling get_line() in the following + * 'for' loop. */ + scrollok(box, TRUE); + wscrl(box, -1); /* Scroll box region down one line */ + scrollok(box, FALSE); + page_length = 0; + passed_end = 0; + for (i = 0; i < boxh; i++) { + if (!i) { + /* print first line of page */ + print_line(box, 0, boxw); + wnoutrefresh(box); + } else + /* Called to update 'end_reached' and 'page' */ + get_line(); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'B': /* Previous page */ + case 'b': + case KEY_PPAGE: + if (begin_reached) + break; + back_lines(page_length + boxh); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'J': /* Next line */ + case 'j': + case KEY_DOWN: + if (!end_reached) { + begin_reached = 0; + scrollok(box, TRUE); + scroll(box); /* Scroll box region up one line */ + scrollok(box, FALSE); + print_line(box, boxh - 1, boxw); + wnoutrefresh(box); + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case KEY_NPAGE: /* Next page */ + case ' ': + if (end_reached) + break; + + begin_reached = 0; + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll <= 0) + break; + + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll >= MAX_LEN) + break; + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + back_lines(height); + delwin(box); + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + delwin(box); + delwin(dialog); + return key; /* ESC pressed */ +} + +/* + * Go back 'n' lines in text. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void back_lines(int n) +{ + int i; + + begin_reached = 0; + /* Go back 'n' lines */ + for (i = 0; i < n; i++) { + if (*page == '\0') { + if (end_reached) { + end_reached = 0; + continue; + } + } + if (page == buf) { + begin_reached = 1; + return; + } + page--; + do { + if (page == buf) { + begin_reached = 1; + return; + } + page--; + } while (*page != '\n'); + page++; + } +} + +/* + * Print a new page of text. Called by dialog_textbox(). + */ +static void print_page(WINDOW * win, int height, int width) +{ + int i, passed_end = 0; + + page_length = 0; + for (i = 0; i < height; i++) { + print_line(win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh(win); +} + +/* + * Print a new line of text. Called by dialog_textbox() and print_page(). + */ +static void print_line(WINDOW * win, int row, int width) +{ + int y, x; + char *line; + + line = get_line(); + line += MIN(strlen(line), hscroll); /* Scroll horizontally */ + wmove(win, row, 0); /* move cursor to correct line */ + waddch(win, ' '); + waddnstr(win, line, MIN(strlen(line), width - 2)); + + getyx(win, y, x); + /* Clear 'residue' of previous line */ +#if OLD_NCURSES + { + int i; + for (i = 0; i < width - x; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif +} + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static char *get_line(void) +{ + int i = 0; + static char line[MAX_LEN + 1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { + if (!end_reached) { + end_reached = 1; + break; + } + } else if (i < MAX_LEN) + line[i++] = *(page++); + else { + /* Truncate lines longer than MAX_LEN characters */ + if (i == MAX_LEN) + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move pass '\n' */ + + return line; +} + +/* + * Print current position + */ +static void print_position(WINDOW * win) +{ + int percent; + + wattrset(win, dlg.position_indicator.atr); + wbkgdset(win, dlg.position_indicator.atr & A_COLOR); + percent = (page - buf) * 100 / strlen(buf); + wmove(win, getmaxy(win) - 3, getmaxx(win) - 9); + wprintw(win, "(%3d%%)", percent); +} diff --git a/kconfig/lxdialog/util.c b/kconfig/lxdialog/util.c new file mode 100644 index 0000000..ebc781b --- /dev/null +++ b/kconfig/lxdialog/util.c @@ -0,0 +1,642 @@ +/* + * util.c + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +struct dialog_info dlg; + +static void set_mono_theme(void) +{ + dlg.screen.atr = A_NORMAL; + dlg.shadow.atr = A_NORMAL; + dlg.dialog.atr = A_NORMAL; + dlg.title.atr = A_BOLD; + dlg.border.atr = A_NORMAL; + dlg.button_active.atr = A_REVERSE; + dlg.button_inactive.atr = A_DIM; + dlg.button_key_active.atr = A_REVERSE; + dlg.button_key_inactive.atr = A_BOLD; + dlg.button_label_active.atr = A_REVERSE; + dlg.button_label_inactive.atr = A_NORMAL; + dlg.inputbox.atr = A_NORMAL; + dlg.inputbox_border.atr = A_NORMAL; + dlg.searchbox.atr = A_NORMAL; + dlg.searchbox_title.atr = A_BOLD; + dlg.searchbox_border.atr = A_NORMAL; + dlg.position_indicator.atr = A_BOLD; + dlg.menubox.atr = A_NORMAL; + dlg.menubox_border.atr = A_NORMAL; + dlg.item.atr = A_NORMAL; + dlg.item_selected.atr = A_REVERSE; + dlg.tag.atr = A_BOLD; + dlg.tag_selected.atr = A_REVERSE; + dlg.tag_key.atr = A_BOLD; + dlg.tag_key_selected.atr = A_REVERSE; + dlg.check.atr = A_BOLD; + dlg.check_selected.atr = A_REVERSE; + dlg.uarrow.atr = A_BOLD; + dlg.darrow.atr = A_BOLD; +} + +#define DLG_COLOR(dialog, f, b, h) \ +do { \ + dlg.dialog.fg = (f); \ + dlg.dialog.bg = (b); \ + dlg.dialog.hl = (h); \ +} while (0) + +static void set_classic_theme(void) +{ + DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true); + DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false); + DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true); + DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true); + DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true); +} + +static void set_blackbg_theme(void) +{ + DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false); + DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false); + DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false); + + DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true); + DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false); + + DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false); + + DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false); +} + +static void set_bluetitle_theme(void) +{ + set_classic_theme(); + DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true); + +} + +/* + * Select color theme + */ +static int set_theme(const char *theme) +{ + int use_color = 1; + if (!theme) + set_bluetitle_theme(); + else if (strcmp(theme, "classic") == 0) + set_classic_theme(); + else if (strcmp(theme, "bluetitle") == 0) + set_bluetitle_theme(); + else if (strcmp(theme, "blackbg") == 0) + set_blackbg_theme(); + else if (strcmp(theme, "mono") == 0) + use_color = 0; + + return use_color; +} + +static void init_one_color(struct dialog_color *color) +{ + static int pair = 0; + + pair++; + init_pair(pair, color->fg, color->bg); + if (color->hl) + color->atr = A_BOLD | COLOR_PAIR(pair); + else + color->atr = COLOR_PAIR(pair); +} + +static void init_dialog_colors(void) +{ + init_one_color(&dlg.screen); + init_one_color(&dlg.shadow); + init_one_color(&dlg.dialog); + init_one_color(&dlg.title); + init_one_color(&dlg.border); + init_one_color(&dlg.button_active); + init_one_color(&dlg.button_inactive); + init_one_color(&dlg.button_key_active); + init_one_color(&dlg.button_key_inactive); + init_one_color(&dlg.button_label_active); + init_one_color(&dlg.button_label_inactive); + init_one_color(&dlg.inputbox); + init_one_color(&dlg.inputbox_border); + init_one_color(&dlg.searchbox); + init_one_color(&dlg.searchbox_title); + init_one_color(&dlg.searchbox_border); + init_one_color(&dlg.position_indicator); + init_one_color(&dlg.menubox); + init_one_color(&dlg.menubox_border); + init_one_color(&dlg.item); + init_one_color(&dlg.item_selected); + init_one_color(&dlg.tag); + init_one_color(&dlg.tag_selected); + init_one_color(&dlg.tag_key); + init_one_color(&dlg.tag_key_selected); + init_one_color(&dlg.check); + init_one_color(&dlg.check_selected); + init_one_color(&dlg.uarrow); + init_one_color(&dlg.darrow); +} + +/* + * Setup for color display + */ +static void color_setup(const char *theme) +{ + if (set_theme(theme)) { + if (has_colors()) { /* Terminal supports color? */ + start_color(); + init_dialog_colors(); + } + } + else + { + set_mono_theme(); + } +} + +/* + * Set window to attribute 'attr' + */ +void attr_clear(WINDOW * win, int height, int width, chtype attr) +{ + int i, j; + + wattrset(win, attr); + for (i = 0; i < height; i++) { + wmove(win, i, 0); + for (j = 0; j < width; j++) + waddch(win, ' '); + } + touchwin(win); +} + +void dialog_clear(void) +{ + attr_clear(stdscr, LINES, COLS, dlg.screen.atr); + /* Display background title if it exists ... - SLH */ + if (dlg.backtitle != NULL) { + int i; + + wattrset(stdscr, dlg.screen.atr); + mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); + wmove(stdscr, 1, 1); + for (i = 1; i < COLS - 1; i++) + waddch(stdscr, ACS_HLINE); + } + wnoutrefresh(stdscr); +} + +/* + * Do some initialization for dialog + */ +void init_dialog(const char *backtitle) +{ + dlg.backtitle = backtitle; + color_setup(getenv("MENUCONFIG_COLOR")); +} + +void reset_dialog(void) +{ + initscr(); /* Init curses */ + keypad(stdscr, TRUE); + cbreak(); + noecho(); + dialog_clear(); +} + +/* + * End using dialog functions. + */ +void end_dialog(void) +{ + endwin(); +} + +/* Print the title of the dialog. Center the title and truncate + * tile if wider than dialog (- 2 chars). + **/ +void print_title(WINDOW *dialog, const char *title, int width) +{ + if (title) { + int tlen = MIN(width - 2, strlen(title)); + wattrset(dialog, dlg.title.atr); + mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); + mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); + waddch(dialog, ' '); + } +} + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Newline + * characters '\n' are replaced by spaces. We start on a new line + * if there is no room for at least 4 nonblanks following a double-space. + */ +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) +{ + int newl, cur_x, cur_y; + int i, prompt_len, room, wlen; + char tempstr[MAX_LEN + 1], *word, *sp, *sp2; + + strcpy(tempstr, prompt); + + prompt_len = strlen(tempstr); + + /* + * Remove newlines + */ + for (i = 0; i < prompt_len; i++) { + if (tempstr[i] == '\n') + tempstr[i] = ' '; + } + + if (prompt_len <= width - x * 2) { /* If prompt is short */ + wmove(win, y, (width - prompt_len) / 2); + waddstr(win, tempstr); + } else { + cur_x = x; + cur_y = y; + newl = 1; + word = tempstr; + while (word && *word) { + sp = index(word, ' '); + if (sp) + *sp++ = 0; + + /* Wrap to next line if either the word does not fit, + or it is the first word of a new sentence, and it is + short, and the next word does not fit. */ + room = width - cur_x; + wlen = strlen(word); + if (wlen > room || + (newl && wlen < 4 && sp + && wlen + 1 + strlen(sp) > room + && (!(sp2 = index(sp, ' ')) + || wlen + 1 + (sp2 - sp) > room))) { + cur_y++; + cur_x = x; + } + wmove(win, cur_y, cur_x); + waddstr(win, word); + getyx(win, cur_y, cur_x); + cur_x++; + if (sp && *sp == ' ') { + cur_x++; /* double space */ + while (*++sp == ' ') ; + newl = 1; + } else + newl = 0; + word = sp; + } + } +} + +/* + * Print a button + */ +void print_button(WINDOW * win, const char *label, int y, int x, int selected) +{ + int i, temp; + + wmove(win, y, x); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, "<"); + temp = strspn(label, " "); + label += temp; + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + for (i = 0; i < temp; i++) + waddch(win, ' '); + wattrset(win, selected ? dlg.button_key_active.atr + : dlg.button_key_inactive.atr); + waddch(win, label[0]); + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + waddstr(win, (char *)label + 1); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, ">"); + wmove(win, y, x + temp + 1); +} + +/* + * Draw a rectangular box with line drawing characters + */ +void +draw_box(WINDOW * win, int y, int x, int height, int width, + chtype box, chtype border) +{ + int i, j; + + wattrset(win, 0); + for (i = 0; i < height; i++) { + wmove(win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch(win, border | ACS_ULCORNER); + else if (i == height - 1 && !j) + waddch(win, border | ACS_LLCORNER); + else if (!i && j == width - 1) + waddch(win, box | ACS_URCORNER); + else if (i == height - 1 && j == width - 1) + waddch(win, box | ACS_LRCORNER); + else if (!i) + waddch(win, border | ACS_HLINE); + else if (i == height - 1) + waddch(win, box | ACS_HLINE); + else if (!j) + waddch(win, border | ACS_VLINE); + else if (j == width - 1) + waddch(win, box | ACS_VLINE); + else + waddch(win, box | ' '); + } +} + +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void draw_shadow(WINDOW * win, int y, int x, int height, int width) +{ + int i; + + if (has_colors()) { /* Whether terminal supports color? */ + wattrset(win, dlg.shadow.atr); + wmove(win, y + height, x + 2); + for (i = 0; i < width; i++) + waddch(win, winch(win) & A_CHARTEXT); + for (i = y + 1; i < y + height + 1; i++) { + wmove(win, i, x + width); + waddch(win, winch(win) & A_CHARTEXT); + waddch(win, winch(win) & A_CHARTEXT); + } + wnoutrefresh(win); + } +} + +/* + * Return the position of the first alphabetic character in a string. + */ +int first_alpha(const char *string, const char *exempt) +{ + int i, in_paren = 0, c; + + for (i = 0; i < strlen(string); i++) { + c = tolower(string[i]); + + if (strchr("<[(", c)) + ++in_paren; + if (strchr(">])", c) && in_paren > 0) + --in_paren; + + if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0) + return i; + } + + return 0; +} + +/* + * ncurses uses ESC to detect escaped char sequences. This resutl in + * a small timeout before ESC is actually delivered to the application. + * lxdialog suggest which is correctly translated to two + * times esc. But then we need to ignore the second esc to avoid stepping + * out one menu too much. Filter away all escaped key sequences since + * keypad(FALSE) turn off ncurses support for escape sequences - and thats + * needed to make notimeout() do as expected. + */ +int on_key_esc(WINDOW *win) +{ + int key; + int key2; + int key3; + + nodelay(win, TRUE); + keypad(win, FALSE); + key = wgetch(win); + key2 = wgetch(win); + do { + key3 = wgetch(win); + } while (key3 != ERR); + nodelay(win, FALSE); + keypad(win, TRUE); + if (key == KEY_ESC && key2 == ERR) + return KEY_ESC; + else if (key != ERR && key != KEY_ESC && key2 == ERR) + ungetch(key); + + return -1; +} + +/* redraw screen in new size */ +int on_key_resize(void) +{ + dialog_clear(); + return KEY_RESIZE; +} + +struct dialog_list *item_cur; +struct dialog_list item_nil; +struct dialog_list *item_head; + +void item_reset(void) +{ + struct dialog_list *p, *next; + + for (p = item_head; p; p = next) { + next = p->next; + free(p); + } + item_head = NULL; + item_cur = &item_nil; +} + +void item_make(const char *fmt, ...) +{ + va_list ap; + struct dialog_list *p = malloc(sizeof(*p)); + + if (item_head) + item_cur->next = p; + else + item_head = p; + item_cur = p; + memset(p, 0, sizeof(*p)); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap); + va_end(ap); +} + +void item_add_str(const char *fmt, ...) +{ + va_list ap; + size_t avail; + + avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str + strlen(item_cur->node.str), + avail, fmt, ap); + item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0'; + va_end(ap); +} + +void item_set_tag(char tag) +{ + item_cur->node.tag = tag; +} +void item_set_data(void *ptr) +{ + item_cur->node.data = ptr; +} + +void item_set_selected(int val) +{ + item_cur->node.selected = val; +} + +int item_activate_selected(void) +{ + item_foreach() + if (item_is_selected()) + return 1; + return 0; +} + +void *item_data(void) +{ + return item_cur->node.data; +} + +char item_tag(void) +{ + return item_cur->node.tag; +} + +int item_count(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) + n++; + return n; +} + +void item_set(int n) +{ + int i = 0; + item_foreach() + if (i++ == n) + return; +} + +int item_n(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) { + if (p == item_cur) + return n; + n++; + } + return 0; +} + +const char *item_str(void) +{ + return item_cur->node.str; +} + +int item_is_selected(void) +{ + return (item_cur->node.selected != 0); +} + +int item_is_tag(char tag) +{ + return (item_cur->node.tag == tag); +} diff --git a/kconfig/lxdialog/yesno.c b/kconfig/lxdialog/yesno.c new file mode 100644 index 0000000..ee0a04e --- /dev/null +++ b/kconfig/lxdialog/yesno.c @@ -0,0 +1,114 @@ +/* + * yesno.c -- implements the yes/no box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 10; + int y = height - 2; + + print_button(dialog, " Yes ", y, x, selected == 0); + print_button(dialog, " No ", y, x + 13, selected == 1); + + wmove(dialog, y, x + 1 + 13 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with two buttons - Yes and No + */ +int dialog_yesno(const char *title, const char *prompt, int height, int width) +{ + int i, x, y, key = 0, button = 0; + WINDOW *dialog; + +do_resize: + if (getmaxy(stdscr) < (height + 4)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + 4)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + print_buttons(dialog, height, width, 0); + + while (key != KEY_ESC) { + key = wgetch(dialog); + switch (key) { + case 'Y': + case 'y': + delwin(dialog); + return 0; + case 'N': + case 'n': + delwin(dialog); + return 1; + + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case ' ': + case '\n': + delwin(dialog); + return button; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/mconf.c b/kconfig/mconf.c new file mode 100644 index 0000000..8f268be --- /dev/null +++ b/kconfig/mconf.c @@ -0,0 +1,919 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis + * + * i18n, 2005, Arnaldo Carvalho de Melo + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" +#include "lxdialog/dialog.h" + +static char menu_backtitle[128]; +static const char mconf_readme[] = N_( +"Overview\n" +"--------\n" +"Some kernel features may be built directly into the kernel.\n" +"Some may be made into loadable runtime modules. Some features\n" +"may be completely removed altogether. There are also certain\n" +"kernel parameters which are not really features, but must be\n" +"entered in as decimal or hexadecimal numbers or possibly text.\n" +"\n" +"Menu items beginning with [*], or [ ] represent features\n" +"configured to be built in, modularized or removed respectively.\n" +"Pointed brackets <> represent module capable features.\n" +"\n" +"To change any of these features, highlight it with the cursor\n" +"keys and press to build it in, to make it a module or\n" +" to removed it. You may also press the to cycle\n" +"through the available options (ie. Y->N->M->Y).\n" +"\n" +"Some additional keyboard hints:\n" +"\n" +"Menus\n" +"----------\n" +"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" +" you wish to change or submenu wish to select and press .\n" +" Submenus are designated by \"--->\".\n" +"\n" +" Shortcut: Press the option's highlighted letter (hotkey).\n" +" Pressing a hotkey more than once will sequence\n" +" through all visible items which use that hotkey.\n" +"\n" +" You may also use the and keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the button\n" +" and press .\n" +"\n" +" Shortcut: Press or or if there is no hotkey\n" +" using those letters. You may press a single , but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the and cursor keys will cycle between and\n" +" \n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press \n" +" If you are entering hexadecimal values, it is not necessary to\n" +" add the '0x' prefix to the entry.\n" +"\n" +"o For help, use the or cursor keys to highlight the help option\n" +" and press . You can try as well.\n" +"\n" +"\n" +"Text Box (Help Window)\n" +"--------\n" +"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" +" keys h,j,k,l function here as do and for those\n" +" who are familiar with less and lynx.\n" +"\n" +"o Press , , or to exit.\n" +"\n" +"\n" +"Alternate Configuration Files\n" +"-----------------------------\n" +"Menuconfig supports the use of alternate configuration files for\n" +"those who, for various reasons, find it necessary to switch\n" +"between different kernel configurations.\n" +"\n" +"At the end of the main menu you will find two options. One is\n" +"for saving the current configuration to a file of your choosing.\n" +"The other option is for loading a previously saved alternate\n" +"configuration.\n" +"\n" +"Even if you don't use alternate configuration files, but you\n" +"find during a Menuconfig session that you have completely messed\n" +"up your settings, you may use the \"Load Alternate...\" option to\n" +"restore your previously saved settings from \".config\" without\n" +"restarting Menuconfig.\n" +"\n" +"Other information\n" +"-----------------\n" +"If you use Menuconfig in an XTERM window make sure you have your\n" +"$TERM variable set to point to a xterm definition which supports color.\n" +"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n" +"display correctly in a RXVT window because rxvt displays only one\n" +"intensity of color, bright.\n" +"\n" +"Menuconfig will display larger menus on screens or xterms which are\n" +"set to display more than the standard 25 row by 80 column geometry.\n" +"In order for this to work, the \"stty size\" command must be able to\n" +"display the screen's current row and column geometry. I STRONGLY\n" +"RECOMMEND that you make sure you do NOT have the shell variables\n" +"LINES and COLUMNS exported into your environment. Some distributions\n" +"export those variables via /etc/profile. Some ncurses programs can\n" +"become confused when those variables (LINES & COLUMNS) don't reflect\n" +"the true screen size.\n" +"\n" +"Optional personality available\n" +"------------------------------\n" +"If you prefer to have all of the kernel options listed in a single\n" +"menu, rather than the default multimenu hierarchy, run the menuconfig\n" +"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n" +"\n" +"make MENUCONFIG_MODE=single_menu menuconfig\n" +"\n" +" will then unroll the appropriate category, or enfold it if it\n" +"is already unrolled.\n" +"\n" +"Note that this mode can eventually be a little more CPU expensive\n" +"(especially with a larger number of unrolled categories) than the\n" +"default mode.\n" +"\n" +"Different color themes available\n" +"--------------------------------\n" +"It is possible to select different color themes using the variable\n" +"MENUCONFIG_COLOR. To select a theme use:\n" +"\n" +"make MENUCONFIG_COLOR= menuconfig\n" +"\n" +"Available themes are\n" +" mono => selects colors suitable for monochrome displays\n" +" blackbg => selects a color scheme with black background\n" +" classic => theme with blue background. The classic look\n" +" bluetitle => a LCD friendly version of classic. (default)\n" +"\n"), +menu_instructions[] = N_( + "Arrow keys navigate the menu. " + " selects submenus --->. " + "Highlighted letters are hotkeys. " + "Pressing includes, excludes, modularizes features. " + "Press to exit, for Help, for Search. " + "Legend: [*] built-in [ ] excluded module < > module capable"), +radiolist_instructions[] = N_( + "Use the arrow keys to navigate this window or " + "press the hotkey of the item you wish to select " + "followed by the . " + "Press for additional information about this option."), +inputbox_instructions_int[] = N_( + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the key to move from the input field to the buttons below it."), +inputbox_instructions_hex[] = N_( + "Please enter a hexadecimal value. " + "Use the key to move from the input field to the buttons below it."), +inputbox_instructions_string[] = N_( + "Please enter a string value. " + "Use the key to move from the input field to the buttons below it."), +setmod_text[] = N_( + "This feature depends on another which has been configured as a module.\n" + "As a result, this feature will be built as a module."), +nohelp_text[] = N_( + "There is no help available for this kernel option.\n"), +load_config_text[] = N_( + "Enter the name of the configuration file you wish to load. " + "Accept the name shown to restore the configuration you " + "last retrieved. Leave blank to abort."), +load_config_help[] = N_( + "\n" + "For various reasons, one may wish to keep several different kernel\n" + "configurations available on a single machine.\n" + "\n" + "If you have saved a previous configuration in a file other than the\n" + "kernel's default, entering the name of the file here will allow you\n" + "to modify that configuration.\n" + "\n" + "If you are uncertain, then you have probably never used alternate\n" + "configuration files. You should therefor leave this blank to abort.\n"), +save_config_text[] = N_( + "Enter a filename to which this configuration should be saved " + "as an alternate. Leave blank to abort."), +save_config_help[] = N_( + "\n" + "For various reasons, one may wish to keep different kernel\n" + "configurations available on a single machine.\n" + "\n" + "Entering a file name here will allow you to later retrieve, modify\n" + "and use the current configuration as an alternate to whatever\n" + "configuration options you have selected at that time.\n" + "\n" + "If you are uncertain what all this means then you should probably\n" + "leave this blank.\n"), +search_help[] = N_( + "\n" + "Search for CT_ symbols and display their relations.\n" + "Regular expressions are allowed.\n" + "Example: search for \"^FOO\"\n" + "Result:\n" + "-----------------------------------------------------------------\n" + "Symbol: FOO [=m]\n" + "Prompt: Foo bus is used to drive the bar HW\n" + "Defined at drivers/pci/Kconfig:47\n" + "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" + "Location:\n" + " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" + " -> PCI support (PCI [=y])\n" + " -> PCI access mode ( [=y])\n" + "Selects: LIBCRC32\n" + "Selected by: BAR\n" + "-----------------------------------------------------------------\n" + "o The line 'Prompt:' shows the text used in the menu structure for\n" + " this CT_ symbol\n" + "o The 'Defined at' line tell at what file / line number the symbol\n" + " is defined\n" + "o The 'Depends on:' line tell what symbols needs to be defined for\n" + " this symbol to be visible in the menu (selectable)\n" + "o The 'Location:' lines tell where in the menu structure this symbol\n" + " is located\n" + " A location followed by a [=y] indicate that this is a selectable\n" + " menu item - and current value is displayed inside brackets.\n" + "o The 'Selects:' line tell what symbol will be automatically\n" + " selected if this symbol is selected (y or m)\n" + "o The 'Selected by' line tell what symbol has selected this symbol\n" + "\n" + "Only relevant lines are shown.\n" + "\n\n" + "Search examples:\n" + "Examples: USB => find all CT_ symbols containing USB\n" + " ^USB => find all CT_ symbols starting with USB\n" + " USB$ => find all CT_ symbols ending with USB\n" + "\n"); + +static char filename[PATH_MAX+1] = ".config"; +static int indent; +static struct termios ios_org; +static int rows = 0, cols = 0; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; + +static void conf(struct menu *menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static void show_textbox(const char *title, const char *text, int r, int c); +static void show_helptext(const char *title, const char *text); +static void show_help(struct menu *menu); + +static void init_wsize(void) +{ + struct winsize ws; + char *env; + + if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) { + rows = ws.ws_row; + cols = ws.ws_col; + } + + if (!rows) { + env = getenv("LINES"); + if (env) + rows = atoi(env); + if (!rows) + rows = 24; + } + if (!cols) { + env = getenv("COLUMNS"); + if (env) + cols = atoi(env); + if (!cols) + cols = 80; + } + + if (rows < 19 || cols < 80) { + fprintf(stderr, N_("Your display is too small to run Menuconfig!\n")); + fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n")); + exit(1); + } + + rows -= 4; + cols -= 5; +} + +static void get_prompt_str(struct gstr *r, struct property *prop) +{ + int i, j; + struct menu *submenu[8], *menu; + + str_printf(r, "Prompt: %s\n", prop->text); + str_printf(r, " Defined at %s:%d\n", prop->menu->file->name, + prop->menu->lineno); + if (!expr_is_yes(prop->visible.expr)) { + str_append(r, " Depends on: "); + expr_gstr_print(prop->visible.expr, r); + str_append(r, "\n"); + } + menu = prop->menu->parent; + for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) + submenu[i++] = menu; + if (i > 0) { + str_printf(r, " Location:\n"); + for (j = 4; --i >= 0; j += 2) { + menu = submenu[i]; + str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu)); + if (menu->sym) { + str_printf(r, " (%s [=%s])", menu->sym->name ? + menu->sym->name : "", + sym_get_string_value(menu->sym)); + } + str_append(r, "\n"); + } + } +} + +static void get_symbol_str(struct gstr *r, struct symbol *sym) +{ + bool hit; + struct property *prop; + + str_printf(r, "Symbol: %s [=%s]\n", sym->name, + sym_get_string_value(sym)); + for_all_prompts(sym, prop) + get_prompt_str(r, prop); + hit = false; + for_all_properties(sym, prop, P_SELECT) { + if (!hit) { + str_append(r, " Selects: "); + hit = true; + } else + str_printf(r, " && "); + expr_gstr_print(prop->expr, r); + } + if (hit) + str_append(r, "\n"); + if (sym->rev_dep.expr) { + str_append(r, " Selected by: "); + expr_gstr_print(sym->rev_dep.expr, r); + str_append(r, "\n"); + } + str_append(r, "\n\n"); +} + +static struct gstr get_relations_str(struct symbol **sym_arr) +{ + struct symbol *sym; + struct gstr res = str_new(); + int i; + + for (i = 0; sym_arr && (sym = sym_arr[i]); i++) + get_symbol_str(&res, sym); + if (!i) + str_append(&res, "No matches found.\n"); + return res; +} + +static void search_conf(void) +{ + struct symbol **sym_arr; + struct gstr res; + int dres; +again: + dialog_clear(); + dres = dialog_inputbox(_("Search Configuration Parameter"), + _("Enter CT_ (sub)string to search for (omit CT_)"), + 10, 75, ""); + switch (dres) { + case 0: + break; + case 1: + show_helptext(_("Search Configuration"), search_help); + goto again; + default: + return; + } + + sym_arr = sym_re_search(dialog_input_result); + res = get_relations_str(sym_arr); + free(sym_arr); + show_textbox(_("Search Results"), str_get(&res), 0, 0); + str_free(&res); +} + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + switch (prop->type) { + case P_MENU: + child_count++; + if (single_menu_mode) { + item_make("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else + item_make(" %*c%s --->", indent + 1, ' ', prompt); + + item_set_tag('m'); + item_set_data(menu); + if (single_menu_mode && menu->data) + goto conf_childs; + return; + default: + if (prompt) { + child_count++; + item_make("---%*c%s", indent + 1, ' ', prompt); + item_set_tag(':'); + item_set_data(menu); + } + } + } else + doint = 0; + goto conf_childs; + } + + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changable(sym)) { + switch (type) { + case S_BOOLEAN: + item_make("[%c]", val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + item_make("<%c>", ch); + break; + } + item_set_tag('t'); + item_set_data(menu); + } else { + item_make(" "); + item_set_tag(def_menu ? 't' : ':'); + item_set_data(menu); + } + + item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + item_add_str(" (%s)", menu_get_prompt(def_menu)); + item_add_str(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + if (menu == current_menu) { + item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + item_set_tag(':'); + item_set_data(menu); + goto conf_childs; + } + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + item_make(" "); + item_set_tag(':'); + item_set_data(menu); + } else { + switch (type) { + case S_BOOLEAN: + if (sym_is_changable(sym)) + item_make("[%c]", val == no ? ' ' : '*'); + else + item_make("---"); + item_set_tag('t'); + item_set_data(menu); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + if (sym_is_changable(sym)) + item_make("<%c>", ch); + else + item_make("---"); + item_set_tag('t'); + item_set_data(menu); + break; + default: + tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */ + item_make("(%s)", sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + item_set_tag('s'); + item_set_data(menu); + goto conf_childs; + } + } + item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + if (menu->prompt->type == P_MENU) { + item_add_str(" --->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void conf(struct menu *menu) +{ + struct menu *submenu; + const char *prompt = menu_get_prompt(menu); + struct symbol *sym; + struct menu *active_menu = NULL; + int res; + int s_scroll = 0; + + while (1) { + item_reset(); + current_menu = menu; + build_conf(menu); + if (!child_count) + break; + if (menu == &rootmenu) { + item_make("--- "); + item_set_tag(':'); + item_make(_(" Load an Alternate Configuration File")); + item_set_tag('L'); + item_make(_(" Save an Alternate Configuration File")); + item_set_tag('S'); + } + dialog_clear(); + res = dialog_menu(prompt ? prompt : _("Main Menu"), + _(menu_instructions), + active_menu, &s_scroll); + if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) + break; + if (!item_activate_selected()) + continue; + if (!item_tag()) + continue; + + submenu = item_data(); + active_menu = item_data(); + if (submenu) + sym = submenu->sym; + else + sym = NULL; + + switch (res) { + case 0: + switch (item_tag()) { + case 'm': + if (single_menu_mode) + submenu->data = (void *) (long) !submenu->data; + else + conf(submenu); + break; + case 't': + if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt->type == P_MENU) + conf(submenu); + break; + case 's': + conf_string(submenu); + break; + case 'L': + conf_load(); + break; + case 'S': + conf_save(); + break; + } + break; + case 2: + if (sym) + show_help(submenu); + else + show_helptext("README", _(mconf_readme)); + break; + case 3: + if (item_is_tag('t')) { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + show_textbox(NULL, setmod_text, 6, 74); + } + break; + case 4: + if (item_is_tag('t')) + sym_set_tristate_value(sym, no); + break; + case 5: + if (item_is_tag('t')) + sym_set_tristate_value(sym, mod); + break; + case 6: + if (item_is_tag('t')) + sym_toggle_tristate_value(sym); + else if (item_is_tag('m')) + conf(submenu); + break; + case 7: + search_conf(); + break; + } + } +} + +static void show_textbox(const char *title, const char *text, int r, int c) +{ + dialog_clear(); + dialog_textbox(title, text, r, c); +} + +static void show_helptext(const char *title, const char *text) +{ + show_textbox(title, text, 0, 0); +} + +static void show_help(struct menu *menu) +{ + struct gstr help = str_new(); + struct symbol *sym = menu->sym; + + if (sym->help) + { + if (sym->name) { + str_printf(&help, "CT_%s:\n\n", sym->name); + str_append(&help, _(sym->help)); + str_append(&help, "\n"); + } + } else { + str_append(&help, nohelp_text); + } + get_symbol_str(&help, sym); + show_helptext(menu_get_prompt(menu), str_get(&help)); + str_free(&help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child; + struct symbol *active; + + active = sym_get_choice_value(menu->sym); + while (1) { + int res; + int selected; + item_reset(); + + current_menu = menu; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + item_make("%s", menu_get_prompt(child)); + item_set_data(child); + if (child->sym == active) + item_set_selected(1); + if (child->sym == sym_get_choice_value(menu->sym)) + item_set_tag('X'); + } + dialog_clear(); + res = dialog_checklist(prompt ? prompt : _("Main Menu"), + _(radiolist_instructions), + 15, 70, 6); + selected = item_activate_selected(); + switch (res) { + case 0: + if (selected) { + child = item_data(); + sym_set_tristate_value(child->sym, yes); + } + return; + case 1: + if (selected) { + child = item_data(); + show_help(child); + active = child->sym; + } else + show_help(menu); + break; + case KEY_ESC: + return; + case -ERRDISPLAYTOOSMALL: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + int res; + char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = _(inputbox_instructions_int); + break; + case S_HEX: + heading = _(inputbox_instructions_hex); + break; + case S_STRING: + heading = _(inputbox_instructions_string); + break; + default: + heading = "Internal mconf error!"; + } + dialog_clear(); + res = dialog_inputbox(prompt ? prompt : _("Main Menu"), + heading, 10, 75, + sym_get_string_value(menu->sym)); + switch (res) { + case 0: + if (sym_set_string_value(menu->sym, dialog_input_result)) + return; + show_textbox(NULL, _("You have made an invalid entry."), 5, 43); + break; + case 1: + show_help(menu); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_load(void) +{ + + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, load_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) + return; + show_textbox(NULL, _("File does not exist!"), 5, 38); + break; + case 1: + show_helptext(_("Load Alternate Configuration"), load_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, save_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_write(dialog_input_result)) + return; + show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60); + break; + case 1: + show_helptext(_("Save Alternate Configuration"), save_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); +} + +int main(int ac, char **av) +{ + struct symbol *sym; + char *mode; + int res; + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + conf_parse(av[1] ? av[1] : ""); + conf_read(NULL); + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + sprintf(menu_backtitle, _(PROJECT_NAME" v%s Configuration"), + sym_get_string_value(sym)); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + tcgetattr(1, &ios_org); + atexit(conf_cleanup); + init_wsize(); + reset_dialog(); + init_dialog(menu_backtitle); + do { + conf(&rootmenu); + dialog_clear(); + res = dialog_yesno(NULL, + _("Do you wish to save your " + "new "PROJECT_NAME" configuration?\n" + " to continue."), + 6, 60); + } while (res == KEY_ESC); + end_dialog(); + if (res == 0) { + if (conf_write(NULL)) { + fprintf(stderr, _("\n\n" + "Error writing "PROJECT_NAME" configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + printf(_("\n\n" + "*** End of "PROJECT_NAME" configuration.\n" + "*** Execute 'make' to build, or try 'make help'." + "\n\n")); + } else { + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n")); + } + + return 0; +} diff --git a/kconfig/menu.c b/kconfig/menu.c new file mode 100644 index 0000000..c86c27f --- /dev/null +++ b/kconfig/menu.c @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct menu rootmenu; +static struct menu **last_entry_ptr; + +struct file *file_list; +struct file *current_file; + +static void menu_warn(struct menu *menu, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static void prop_warn(struct property *prop, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +void menu_init(void) +{ + current_entry = current_menu = &rootmenu; + last_entry_ptr = &rootmenu.list; +} + +void menu_add_entry(struct symbol *sym) +{ + struct menu *menu; + + menu = malloc(sizeof(*menu)); + memset(menu, 0, sizeof(*menu)); + menu->sym = sym; + menu->parent = current_menu; + menu->file = current_file; + menu->lineno = zconf_lineno(); + + *last_entry_ptr = menu; + last_entry_ptr = &menu->next; + current_entry = menu; +} + +void menu_end_entry(void) +{ +} + +struct menu *menu_add_menu(void) +{ + menu_end_entry(); + last_entry_ptr = ¤t_entry->list; + return current_menu = current_entry; +} + +void menu_end_menu(void) +{ + last_entry_ptr = ¤t_menu->next; + current_menu = current_menu->parent; +} + +struct expr *menu_check_dep(struct expr *e) +{ + if (!e) + return e; + + switch (e->type) { + case E_NOT: + e->left.expr = menu_check_dep(e->left.expr); + break; + case E_OR: + case E_AND: + e->left.expr = menu_check_dep(e->left.expr); + e->right.expr = menu_check_dep(e->right.expr); + break; + case E_SYMBOL: + /* change 'm' into 'm' && MODULES */ + if (e->left.sym == &symbol_mod) + return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); + break; + default: + break; + } + return e; +} + +void menu_add_dep(struct expr *dep) +{ + current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); +} + +void menu_set_type(int type) +{ + struct symbol *sym = current_entry->sym; + + if (sym->type == type) + return; + if (sym->type == S_UNKNOWN) { + sym->type = type; + return; + } + menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'", + sym->name ? sym->name : "", + sym_type_name(sym->type), sym_type_name(type)); +} + +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) +{ + struct property *prop = prop_alloc(type, current_entry->sym); + + prop->menu = current_entry; + prop->expr = expr; + prop->visible.expr = menu_check_dep(dep); + + if (prompt) { + if (isspace(*prompt)) { + prop_warn(prop, "leading whitespace ignored"); + while (isspace(*prompt)) + prompt++; + } + if (current_entry->prompt) + prop_warn(prop, "prompt redefined"); + current_entry->prompt = prop; + } + prop->text = prompt; + + return prop; +} + +struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) +{ + return menu_add_prop(type, prompt, NULL, dep); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, NULL, expr, dep); +} + +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) +{ + menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); +} + +void menu_add_option(int token, char *arg) +{ + struct property *prop; + + switch (token) { + case T_OPT_MODULES: + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(current_entry->sym); + break; + case T_OPT_DEFCONFIG_LIST: + if (!sym_defconfig_list) + sym_defconfig_list = current_entry->sym; + else if (sym_defconfig_list != current_entry->sym) + zconf_error("trying to redefine defconfig symbol"); + break; + } +} + +static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2) +{ + return sym2->type == S_INT || sym2->type == S_HEX || + (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); +} + +void sym_check_prop(struct symbol *sym) +{ + struct property *prop; + struct symbol *sym2; + for (prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_DEFAULT: + if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && + prop->expr->type != E_SYMBOL) + prop_warn(prop, + "default for config symbol '%'" + " must be a single symbol", sym->name); + break; + case P_SELECT: + sym2 = prop_get_symbol(prop); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + prop_warn(prop, + "config symbol '%s' uses select, but is " + "not boolean or tristate", sym->name); + else if (sym2->type == S_UNKNOWN) + prop_warn(prop, + "'select' used by config symbol '%s' " + "refer to undefined symbol '%s'", + sym->name, sym2->name); + else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE) + prop_warn(prop, + "'%s' has wrong type. 'select' only " + "accept arguments of boolean and " + "tristate type", sym2->name); + break; + case P_RANGE: + if (sym->type != S_INT && sym->type != S_HEX) + prop_warn(prop, "range is only allowed " + "for int or hex symbols"); + if (!menu_range_valid_sym(sym, prop->expr->left.sym) || + !menu_range_valid_sym(sym, prop->expr->right.sym)) + prop_warn(prop, "range is invalid"); + break; + default: + ; + } + } +} + +void menu_finalize(struct menu *parent) +{ + struct menu *menu, *last_menu; + struct symbol *sym; + struct property *prop; + struct expr *parentdep, *basedep, *dep, *dep2, **ep; + + sym = parent->sym; + if (parent->list) { + if (sym && sym_is_choice(sym)) { + /* find the first choice value and find out choice type */ + for (menu = parent->list; menu; menu = menu->next) { + if (menu->sym) { + current_entry = parent; + menu_set_type(menu->sym->type); + current_entry = menu; + menu_set_type(sym->type); + break; + } + } + parentdep = expr_alloc_symbol(sym); + } else if (parent->prompt) + parentdep = parent->prompt->visible.expr; + else + parentdep = parent->dep; + + for (menu = parent->list; menu; menu = menu->next) { + basedep = expr_transform(menu->dep); + basedep = expr_alloc_and(expr_copy(parentdep), basedep); + basedep = expr_eliminate_dups(basedep); + menu->dep = basedep; + if (menu->sym) + prop = menu->sym->prop; + else + prop = menu->prompt; + for (; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + dep = expr_transform(prop->visible.expr); + dep = expr_alloc_and(expr_copy(basedep), dep); + dep = expr_eliminate_dups(dep); + if (menu->sym && menu->sym->type != S_TRISTATE) + dep = expr_trans_bool(dep); + prop->visible.expr = dep; + if (prop->type == P_SELECT) { + struct symbol *es = prop_get_symbol(prop); + es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } + } + } + for (menu = parent->list; menu; menu = menu->next) + menu_finalize(menu); + } else if (sym) { + basedep = parent->prompt ? parent->prompt->visible.expr : NULL; + basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); + basedep = expr_eliminate_dups(expr_transform(basedep)); + last_menu = NULL; + for (menu = parent->next; menu; menu = menu->next) { + dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; + if (!expr_contains_symbol(dep, sym)) + break; + if (expr_depends_symbol(dep, sym)) + goto next; + dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); + dep = expr_eliminate_dups(expr_transform(dep)); + dep2 = expr_copy(basedep); + expr_eliminate_eq(&dep, &dep2); + expr_free(dep); + if (!expr_is_yes(dep2)) { + expr_free(dep2); + break; + } + expr_free(dep2); + next: + menu_finalize(menu); + menu->parent = parent; + last_menu = menu; + } + if (last_menu) { + parent->list = parent->next; + parent->next = last_menu->next; + last_menu->next = NULL; + } + } + for (menu = parent->list; menu; menu = menu->next) { + if (sym && sym_is_choice(sym) && menu->sym) { + menu->sym->flags |= SYMBOL_CHOICEVAL; + if (!menu->prompt) + menu_warn(menu, "choice value must have a prompt"); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->type == P_PROMPT && prop->menu != menu) { + prop_warn(prop, "choice values " + "currently only support a " + "single prompt"); + } + if (prop->type == P_DEFAULT) + prop_warn(prop, "defaults for choice " + "values not supported"); + } + current_entry = menu; + menu_set_type(sym->type); + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); + for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) + ; + *ep = expr_alloc_one(E_CHOICE, NULL); + (*ep)->right.sym = menu->sym; + } + if (menu->list && (!menu->prompt || !menu->prompt->text)) { + for (last_menu = menu->list; ; last_menu = last_menu->next) { + last_menu->parent = parent; + if (!last_menu->next) + break; + } + last_menu->next = menu->next; + menu->next = menu->list; + menu->list = NULL; + } + } + + if (sym && !(sym->flags & SYMBOL_WARNED)) { + if (sym->type == S_UNKNOWN) + menu_warn(parent, "config symbol defined without type"); + + if (sym_is_choice(sym) && !parent->prompt) + menu_warn(parent, "choice must have a prompt"); + + /* Check properties connected to this symbol */ + sym_check_prop(sym); + sym->flags |= SYMBOL_WARNED; + } + + if (sym && !sym_is_optional(sym) && parent->prompt) { + sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, + expr_alloc_and(parent->prompt->visible.expr, + expr_alloc_symbol(&symbol_mod))); + } +} + +bool menu_is_visible(struct menu *menu) +{ + struct menu *child; + struct symbol *sym; + tristate visible; + + if (!menu->prompt) + return false; + sym = menu->sym; + if (sym) { + sym_calc_value(sym); + visible = menu->prompt->visible.tri; + } else + visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); + + if (visible != no) + return true; + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) + if (menu_is_visible(child)) + return true; + return false; +} + +const char *menu_get_prompt(struct menu *menu) +{ + if (menu->prompt) + return _(menu->prompt->text); + else if (menu->sym) + return _(menu->sym->name); + return NULL; +} + +struct menu *menu_get_root_menu(struct menu *menu) +{ + return &rootmenu; +} + +struct menu *menu_get_parent_menu(struct menu *menu) +{ + enum prop_type type; + + for (; menu != &rootmenu; menu = menu->parent) { + type = menu->prompt ? menu->prompt->type : 0; + if (type == P_MENU) + break; + } + return menu; +} + diff --git a/kconfig/symbol.c b/kconfig/symbol.c new file mode 100644 index 0000000..34f42fb --- /dev/null +++ b/kconfig/symbol.c @@ -0,0 +1,882 @@ +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct symbol symbol_yes = { + .name = "y", + .curr = { "y", yes }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_mod = { + .name = "m", + .curr = { "m", mod }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_no = { + .name = "n", + .curr = { "n", no }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_empty = { + .name = "", + .curr = { "", no }, + .flags = SYMBOL_VALID, +}; + +int sym_change_count; +struct symbol *sym_defconfig_list; +struct symbol *modules_sym; +tristate modules_val; + +void sym_add_default(struct symbol *sym, const char *def) +{ + struct property *prop = prop_alloc(P_DEFAULT, sym); + + prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); +} + +void sym_init(void) +{ + struct symbol *sym; + struct utsname uts; + char *p; + static bool inited = false; + + if (inited) + return; + inited = true; + + uname(&uts); + + sym = sym_lookup("ARCH", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("ARCH"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("PROJECTVERSION", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("PROJECTVERSION"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("UNAME_RELEASE", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + sym_add_default(sym, uts.release); +} + +enum symbol_type sym_get_type(struct symbol *sym) +{ + enum symbol_type type = sym->type; + + if (type == S_TRISTATE) { + if (sym_is_choice_value(sym) && sym->visible == yes) + type = S_BOOLEAN; + else if (modules_val == no) + type = S_BOOLEAN; + } + return type; +} + +const char *sym_type_name(enum symbol_type type) +{ + switch (type) { + case S_BOOLEAN: + return "boolean"; + case S_TRISTATE: + return "tristate"; + case S_INT: + return "integer"; + case S_HEX: + return "hex"; + case S_STRING: + return "string"; + case S_UNKNOWN: + return "unknown"; + case S_OTHER: + break; + } + return "???"; +} + +struct property *sym_get_choice_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_choices(sym, prop) + return prop; + return NULL; +} + +struct property *sym_get_default_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +struct property *sym_get_range_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_properties(sym, prop, P_RANGE) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +static int sym_get_range_val(struct symbol *sym, int base) +{ + sym_calc_value(sym); + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + break; + } + return strtol(sym->curr.val, NULL, base); +} + +static void sym_validate_range(struct symbol *sym) +{ + struct property *prop; + int base, val, val2; + char str[64]; + + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + return; + } + prop = sym_get_range_prop(sym); + if (!prop) + return; + val = strtol(sym->curr.val, NULL, base); + val2 = sym_get_range_val(prop->expr->left.sym, base); + if (val >= val2) { + val2 = sym_get_range_val(prop->expr->right.sym, base); + if (val <= val2) + return; + } + if (sym->type == S_INT) + sprintf(str, "%d", val2); + else + sprintf(str, "0x%x", val2); + sym->curr.val = strdup(str); +} + +static void sym_calc_visibility(struct symbol *sym) +{ + struct property *prop; + tristate tri; + + /* any prompt visible? */ + tri = no; + for_all_prompts(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + tri = E_OR(tri, prop->visible.tri); + } + if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) + tri = yes; + if (sym->visible != tri) { + sym->visible = tri; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym)) + return; + tri = no; + if (sym->rev_dep.expr) + tri = expr_calc_value(sym->rev_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->rev_dep.tri != tri) { + sym->rev_dep.tri = tri; + sym_set_changed(sym); + } +} + +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* is the user choice visible? */ + def_sym = sym->def[S_DEF_USER].val; + if (def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + def_sym = e->right.sym; + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* no choice? reset tristate value */ + sym->curr.tri = no; + return NULL; +} + +void sym_calc_value(struct symbol *sym) +{ + struct symbol_value newval, oldval; + struct property *prop; + struct expr *e; + + if (!sym) + return; + + if (sym->flags & SYMBOL_VALID) + return; + sym->flags |= SYMBOL_VALID; + + oldval = sym->curr; + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + newval = symbol_empty.curr; + break; + case S_BOOLEAN: + case S_TRISTATE: + newval = symbol_no.curr; + break; + default: + sym->curr.val = sym->name; + sym->curr.tri = no; + return; + } + if (!sym_is_choice_value(sym)) + sym->flags &= ~SYMBOL_WRITE; + + sym_calc_visibility(sym); + + /* set default if recursively called */ + sym->curr = newval; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_is_choice_value(sym) && sym->visible == yes) { + prop = sym_get_choice_prop(sym); + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) + newval.tri = sym->def[S_DEF_USER].tri; + else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) + newval.tri = expr_calc_value(prop->expr); + } + newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); + } else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + sym->flags |= SYMBOL_WRITE; + newval.tri = expr_calc_value(prop->expr); + } + } + if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) + newval.tri = yes; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) { + newval.val = sym->def[S_DEF_USER].val; + break; + } + } + prop = sym_get_default_prop(sym); + if (prop) { + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } + } + break; + default: + ; + } + + sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); + sym_validate_range(sym); + + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { + sym_set_changed(sym); + if (modules_sym == sym) { + sym_set_all_changed(); + modules_val = modules_sym->curr.tri; + } + } + + if (sym_is_choice(sym)) { + int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + e->right.sym->flags |= flags; + if (flags & SYMBOL_CHANGED) + sym_set_changed(e->right.sym); + } + } +} + +void sym_clear_all_valid(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_VALID; + sym_change_count++; + if (modules_sym) + sym_calc_value(modules_sym); +} + +void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + +void sym_set_all_changed(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym_set_changed(sym); +} + +bool sym_tristate_within_range(struct symbol *sym, tristate val) +{ + int type = sym_get_type(sym); + + if (sym->visible == no) + return false; + + if (type != S_BOOLEAN && type != S_TRISTATE) + return false; + + if (type == S_BOOLEAN && val == mod) + return false; + if (sym->visible <= sym->rev_dep.tri) + return false; + if (sym_is_choice_value(sym) && sym->visible == yes) + return val == yes; + return val >= sym->rev_dep.tri && val <= sym->visible; +} + +bool sym_set_tristate_value(struct symbol *sym, tristate val) +{ + tristate oldval = sym_get_tristate_value(sym); + + if (oldval != val && !sym_tristate_within_range(sym, val)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + /* + * setting a choice value also resets the new flag of the choice + * symbol and all other choice values. + */ + if (sym_is_choice_value(sym) && val == yes) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + struct property *prop; + struct expr *e; + + cs->def[S_DEF_USER].val = sym; + cs->flags |= SYMBOL_DEF_USER; + prop = sym_get_choice_prop(cs); + for (e = prop->expr; e; e = e->left.expr) { + if (e->right.sym->visible != no) + e->right.sym->flags |= SYMBOL_DEF_USER; + } + } + + sym->def[S_DEF_USER].tri = val; + if (oldval != val) + sym_clear_all_valid(); + + return true; +} + +tristate sym_toggle_tristate_value(struct symbol *sym) +{ + tristate oldval, newval; + + oldval = newval = sym_get_tristate_value(sym); + do { + switch (newval) { + case no: + newval = mod; + break; + case mod: + newval = yes; + break; + case yes: + newval = no; + break; + } + if (sym_set_tristate_value(sym, newval)) + break; + } while (oldval != newval); + return newval; +} + +bool sym_string_valid(struct symbol *sym, const char *str) +{ + signed char ch; + + switch (sym->type) { + case S_STRING: + return true; + case S_INT: + ch = *str++; + if (ch == '-') + ch = *str++; + if (!isdigit(ch)) + return false; + if (ch == '0' && *str != 0) + return false; + while ((ch = *str++)) { + if (!isdigit(ch)) + return false; + } + return true; + case S_HEX: + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + str += 2; + ch = *str++; + do { + if (!isxdigit(ch)) + return false; + } while ((ch = *str++)); + return true; + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + case 'm': case 'M': + case 'n': case 'N': + return true; + } + return false; + default: + return false; + } +} + +bool sym_string_within_range(struct symbol *sym, const char *str) +{ + struct property *prop; + int val; + + switch (sym->type) { + case S_STRING: + return sym_string_valid(sym, str); + case S_INT: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 10); + return val >= sym_get_range_val(prop->expr->left.sym, 10) && + val <= sym_get_range_val(prop->expr->right.sym, 10); + case S_HEX: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 16); + return val >= sym_get_range_val(prop->expr->left.sym, 16) && + val <= sym_get_range_val(prop->expr->right.sym, 16); + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + return sym_tristate_within_range(sym, yes); + case 'm': case 'M': + return sym_tristate_within_range(sym, mod); + case 'n': case 'N': + return sym_tristate_within_range(sym, no); + } + return false; + default: + return false; + } +} + +bool sym_set_string_value(struct symbol *sym, const char *newval) +{ + const char *oldval; + char *val; + int size; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (newval[0]) { + case 'y': case 'Y': + return sym_set_tristate_value(sym, yes); + case 'm': case 'M': + return sym_set_tristate_value(sym, mod); + case 'n': case 'N': + return sym_set_tristate_value(sym, no); + } + return false; + default: + ; + } + + if (!sym_string_within_range(sym, newval)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + + oldval = sym->def[S_DEF_USER].val; + size = strlen(newval) + 1; + if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { + size += 2; + sym->def[S_DEF_USER].val = val = malloc(size); + *val++ = '0'; + *val++ = 'x'; + } else if (!oldval || strcmp(oldval, newval)) + sym->def[S_DEF_USER].val = val = malloc(size); + else + return true; + + strcpy(val, newval); + free((void *)oldval); + sym_clear_all_valid(); + + return true; +} + +const char *sym_get_string_value(struct symbol *sym) +{ + tristate val; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + return "n"; + case mod: + return "m"; + case yes: + return "y"; + } + break; + default: + ; + } + return (const char *)sym->curr.val; +} + +bool sym_is_changable(struct symbol *sym) +{ + return sym->visible > sym->rev_dep.tri; +} + +struct symbol *sym_lookup(const char *name, int isconst) +{ + struct symbol *symbol; + const char *ptr; + char *new_name; + int hash = 0; + + if (name) { + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name)) { + if ((isconst && symbol->flags & SYMBOL_CONST) || + (!isconst && !(symbol->flags & SYMBOL_CONST))) + return symbol; + } + } + new_name = strdup(name); + } else { + new_name = NULL; + hash = 256; + } + + symbol = malloc(sizeof(*symbol)); + memset(symbol, 0, sizeof(*symbol)); + symbol->name = new_name; + symbol->type = S_UNKNOWN; + if (isconst) + symbol->flags |= SYMBOL_CONST; + + symbol->next = symbol_hash[hash]; + symbol_hash[hash] = symbol; + + return symbol; +} + +struct symbol *sym_find(const char *name) +{ + struct symbol *symbol = NULL; + const char *ptr; + int hash = 0; + + if (!name) + return NULL; + + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name) && + !(symbol->flags & SYMBOL_CONST)) + break; + } + + return symbol; +} + +struct symbol **sym_re_search(const char *pattern) +{ + struct symbol *sym, **sym_arr = NULL; + int i, cnt, size; + regex_t re; + + cnt = size = 0; + /* Skip if empty */ + if (strlen(pattern) == 0) + return NULL; + if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) + return NULL; + + for_all_symbols(i, sym) { + if (sym->flags & SYMBOL_CONST || !sym->name) + continue; + if (regexec(&re, sym->name, 0, NULL, 0)) + continue; + if (cnt + 1 >= size) { + void *tmp = sym_arr; + size += 16; + sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); + if (!sym_arr) { + free(tmp); + return NULL; + } + } + sym_arr[cnt++] = sym; + } + if (sym_arr) + sym_arr[cnt] = NULL; + regfree(&re); + + return sym_arr; +} + + +struct symbol *sym_check_deps(struct symbol *sym); + +static struct symbol *sym_check_expr_deps(struct expr *e) +{ + struct symbol *sym; + + if (!e) + return NULL; + switch (e->type) { + case E_OR: + case E_AND: + sym = sym_check_expr_deps(e->left.expr); + if (sym) + return sym; + return sym_check_expr_deps(e->right.expr); + case E_NOT: + return sym_check_expr_deps(e->left.expr); + case E_EQUAL: + case E_UNEQUAL: + sym = sym_check_deps(e->left.sym); + if (sym) + return sym; + return sym_check_deps(e->right.sym); + case E_SYMBOL: + return sym_check_deps(e->left.sym); + default: + break; + } + printf("Oops! How to check %d?\n", e->type); + return NULL; +} + +struct symbol *sym_check_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + + if (sym->flags & SYMBOL_CHECK) { + printf("Warning! Found recursive dependency: %s", sym->name); + return sym; + } + if (sym->flags & SYMBOL_CHECKED) + return NULL; + + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_expr_deps(sym->rev_dep.expr); + if (sym2) + goto out; + + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->type == P_CHOICE || prop->type == P_SELECT) + continue; + sym2 = sym_check_expr_deps(prop->visible.expr); + if (sym2) + goto out; + if (prop->type != P_DEFAULT || sym_is_choice(sym)) + continue; + sym2 = sym_check_expr_deps(prop->expr); + if (sym2) + goto out; + } +out: + if (sym2) { + printf(" %s", sym->name); + if (sym2 == sym) { + printf("\n"); + sym2 = NULL; + } + } + sym->flags &= ~SYMBOL_CHECK; + return sym2; +} + +struct property *prop_alloc(enum prop_type type, struct symbol *sym) +{ + struct property *prop; + struct property **propp; + + prop = malloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->sym = sym; + prop->file = current_file; + prop->lineno = zconf_lineno(); + + /* append property to the prop list of symbol */ + if (sym) { + for (propp = &sym->prop; *propp; propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_CHOICE)) + return prop->expr->left.sym; + return NULL; +} + +const char *prop_get_type_name(enum prop_type type) +{ + switch (type) { + case P_PROMPT: + return "prompt"; + case P_COMMENT: + return "comment"; + case P_MENU: + return "menu"; + case P_DEFAULT: + return "default"; + case P_CHOICE: + return "choice"; + case P_SELECT: + return "select"; + case P_RANGE: + return "range"; + case P_UNKNOWN: + break; + } + return "unknown"; +} diff --git a/kconfig/util.c b/kconfig/util.c new file mode 100644 index 0000000..e3f28b9 --- /dev/null +++ b/kconfig/util.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2002-2005 Roman Zippel + * Copyright (C) 2002-2005 Sam Ravnborg + * + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include "lkc.h" + +/* file already present in list? If not add it */ +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) + return file; + } + + file = malloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = strdup(name); + file->next = file_list; + file_list = file; + return file; +} + +/* write a dependency file as used by kbuild to track dependencies */ +int file_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + if (!name) + name = ".kconfig.d"; + out = fopen("..config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\ninclude/config/auto.conf: \\\n" + "\t$(deps_config)\n\n" + "$(deps_config): ;\n"); + fclose(out); + rename("..config.tmp", name); + return 0; +} + + +/* Allocate initial growable sting */ +struct gstr str_new(void) +{ + struct gstr gs; + gs.s = malloc(sizeof(char) * 64); + gs.len = 16; + strcpy(gs.s, "\0"); + return gs; +} + +/* Allocate and assign growable string */ +struct gstr str_assign(const char *s) +{ + struct gstr gs; + gs.s = strdup(s); + gs.len = strlen(s) + 1; + return gs; +} + +/* Free storage for growable string */ +void str_free(struct gstr *gs) +{ + if (gs->s) + free(gs->s); + gs->s = NULL; + gs->len = 0; +} + +/* Append to growable string */ +void str_append(struct gstr *gs, const char *s) +{ + size_t l = strlen(gs->s) + strlen(s) + 1; + if (l > gs->len) { + gs->s = realloc(gs->s, l); + gs->len = l; + } + strcat(gs->s, s); +} + +/* Append printf formatted string to growable string */ +void str_printf(struct gstr *gs, const char *fmt, ...) +{ + va_list ap; + char s[10000]; /* big enough... */ + va_start(ap, fmt); + vsnprintf(s, sizeof(s), fmt, ap); + str_append(gs, s); + va_end(ap); +} + +/* Retrieve value of growable string */ +const char *str_get(struct gstr *gs) +{ + return gs->s; +} + diff --git a/kconfig/zconf.hash.c_shipped b/kconfig/zconf.hash.c_shipped new file mode 100644 index 0000000..47c8b5b --- /dev/null +++ b/kconfig/zconf.hash.c_shipped @@ -0,0 +1,242 @@ +/* ANSI-C code produced by gperf version 3.0.1 */ +/* Command-line: gperf */ +/* Computed positions: -k'1,3' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#endif + +struct kconf_id; +/* maximum key range = 45, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +kconf_id_hash (register const char *str, register unsigned int len) +{ + static unsigned char asso_values[] = + { + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 25, 30, 15, + 0, 15, 0, 47, 5, 15, 47, 47, 30, 20, + 5, 0, 25, 15, 0, 0, 10, 35, 47, 47, + 5, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval; +} + +struct kconf_id_strings_t + { + char kconf_id_strings_str2[sizeof("on")]; + char kconf_id_strings_str6[sizeof("string")]; + char kconf_id_strings_str7[sizeof("default")]; + char kconf_id_strings_str8[sizeof("def_bool")]; + char kconf_id_strings_str10[sizeof("range")]; + char kconf_id_strings_str11[sizeof("def_boolean")]; + char kconf_id_strings_str12[sizeof("def_tristate")]; + char kconf_id_strings_str13[sizeof("hex")]; + char kconf_id_strings_str14[sizeof("defconfig_list")]; + char kconf_id_strings_str16[sizeof("option")]; + char kconf_id_strings_str17[sizeof("if")]; + char kconf_id_strings_str18[sizeof("optional")]; + char kconf_id_strings_str20[sizeof("endif")]; + char kconf_id_strings_str21[sizeof("choice")]; + char kconf_id_strings_str22[sizeof("endmenu")]; + char kconf_id_strings_str23[sizeof("requires")]; + char kconf_id_strings_str24[sizeof("endchoice")]; + char kconf_id_strings_str26[sizeof("config")]; + char kconf_id_strings_str27[sizeof("modules")]; + char kconf_id_strings_str28[sizeof("int")]; + char kconf_id_strings_str29[sizeof("menu")]; + char kconf_id_strings_str31[sizeof("prompt")]; + char kconf_id_strings_str32[sizeof("depends")]; + char kconf_id_strings_str33[sizeof("tristate")]; + char kconf_id_strings_str34[sizeof("bool")]; + char kconf_id_strings_str35[sizeof("menuconfig")]; + char kconf_id_strings_str36[sizeof("select")]; + char kconf_id_strings_str37[sizeof("boolean")]; + char kconf_id_strings_str39[sizeof("help")]; + char kconf_id_strings_str41[sizeof("source")]; + char kconf_id_strings_str42[sizeof("comment")]; + char kconf_id_strings_str43[sizeof("mainmenu")]; + char kconf_id_strings_str46[sizeof("enable")]; + }; +static struct kconf_id_strings_t kconf_id_strings_contents = + { + "on", + "string", + "default", + "def_bool", + "range", + "def_boolean", + "def_tristate", + "hex", + "defconfig_list", + "option", + "if", + "optional", + "endif", + "choice", + "endmenu", + "requires", + "endchoice", + "config", + "modules", + "int", + "menu", + "prompt", + "depends", + "tristate", + "bool", + "menuconfig", + "select", + "boolean", + "help", + "source", + "comment", + "mainmenu", + "enable" + }; +#define kconf_id_strings ((const char *) &kconf_id_strings_contents) +#ifdef __GNUC__ +__inline +#endif +struct kconf_id * +kconf_id_lookup (register const char *str, register unsigned int len) +{ + enum + { + TOTAL_KEYWORDS = 33, + MIN_WORD_LENGTH = 2, + MAX_WORD_LENGTH = 14, + MIN_HASH_VALUE = 2, + MAX_HASH_VALUE = 46 + }; + + static struct kconf_id wordlist[] = + { + {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_ON, TF_PARAM}, + {-1}, {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_TYPE, TF_COMMAND, S_STRING}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_RANGE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_TYPE, TF_COMMAND, S_HEX}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_OPTION, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_IF, TF_COMMAND|TF_PARAM}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20, T_ENDIF, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_CHOICE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_REQUIRES, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24, T_ENDCHOICE, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_CONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_TYPE, TF_COMMAND, S_INT}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_PROMPT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_DEPENDS, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_TYPE, TF_COMMAND, S_TRISTATE}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34, T_TYPE, TF_COMMAND, S_BOOLEAN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_MENUCONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_SELECT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37, T_TYPE, TF_COMMAND, S_BOOLEAN}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_HELP, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_COMMENT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_MAINMENU, TF_COMMAND}, + {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_SELECT, TF_COMMAND} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = kconf_id_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = wordlist[key].name; + if (o >= 0) + { + register const char *s = o + kconf_id_strings; + + if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') + return &wordlist[key]; + } + } + } + return 0; +} + diff --git a/kconfig/zconf.tab.c_shipped b/kconfig/zconf.tab.c_shipped new file mode 100644 index 0000000..34ccabd --- /dev/null +++ b/kconfig/zconf.tab.c_shipped @@ -0,0 +1,2345 @@ +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse zconfparse +#define yylex zconflex +#define yyerror zconferror +#define yylval zconflval +#define yychar zconfchar +#define yydebug zconfdebug +#define yynerrs zconfnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_MENUCONFIG = 266, + T_HELP = 267, + T_HELPTEXT = 268, + T_IF = 269, + T_ENDIF = 270, + T_DEPENDS = 271, + T_REQUIRES = 272, + T_OPTIONAL = 273, + T_PROMPT = 274, + T_TYPE = 275, + T_DEFAULT = 276, + T_SELECT = 277, + T_RANGE = 278, + T_OPTION = 279, + T_ON = 280, + T_WORD = 281, + T_WORD_QUOTE = 282, + T_UNEQUAL = 283, + T_CLOSE_PAREN = 284, + T_OPEN_PAREN = 285, + T_EOL = 286, + T_OR = 287, + T_AND = 288, + T_EQUAL = 289, + T_NOT = 290 + }; +#endif +/* Tokens. */ +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_MENUCONFIG 266 +#define T_HELP 267 +#define T_HELPTEXT 268 +#define T_IF 269 +#define T_ENDIF 270 +#define T_DEPENDS 271 +#define T_REQUIRES 272 +#define T_OPTIONAL 273 +#define T_PROMPT 274 +#define T_TYPE 275 +#define T_DEFAULT 276 +#define T_SELECT 277 +#define T_RANGE 278 +#define T_OPTION 279 +#define T_ON 280 +#define T_WORD 281 +#define T_WORD_QUOTE 282 +#define T_UNEQUAL 283 +#define T_CLOSE_PAREN 284 +#define T_OPEN_PAREN 285 +#define T_EOL 286 +#define T_OR 287 +#define T_AND 288 +#define T_EQUAL 289 +#define T_NOT 290 + + + + +/* Copy the first part of user declarations. */ + + +/* + * Copyright (C) 2002 Roman Zippel + * Released under the terms of the GNU GPL v2.0. + */ + +#include +#include +#include +#include +#include +#include + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#include "zconf.hash.c" + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconf_error(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +static struct menu *current_menu, *current_entry; + +#define YYDEBUG 0 +#if YYDEBUG +#define YYERROR_VERBOSE +#endif + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + +typedef union YYSTYPE { + char *string; + struct file *file; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; + struct kconf_id *id; +} YYSTYPE; +/* Line 196 of yacc.c. */ + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 219 of yacc.c. */ + + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 275 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 36 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 45 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 110 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 183 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 290 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 5, 6, 9, 12, 15, 20, 23, + 28, 33, 37, 39, 41, 43, 45, 47, 49, 51, + 53, 55, 57, 59, 61, 63, 67, 70, 74, 77, + 81, 84, 85, 88, 91, 94, 97, 100, 103, 107, + 112, 117, 122, 128, 132, 133, 137, 138, 141, 144, + 147, 149, 153, 154, 157, 160, 163, 166, 169, 174, + 178, 181, 186, 187, 190, 194, 196, 200, 201, 204, + 207, 210, 214, 217, 219, 223, 224, 227, 230, 233, + 237, 241, 244, 247, 250, 251, 254, 257, 260, 265, + 269, 273, 274, 277, 279, 281, 284, 287, 290, 292, + 295, 296, 299, 301, 305, 309, 313, 316, 320, 324, + 326 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 37, 0, -1, 38, -1, -1, 38, 40, -1, 38, + 54, -1, 38, 65, -1, 38, 3, 75, 77, -1, + 38, 76, -1, 38, 26, 1, 31, -1, 38, 39, + 1, 31, -1, 38, 1, 31, -1, 16, -1, 19, + -1, 20, -1, 22, -1, 18, -1, 23, -1, 21, + -1, 31, -1, 60, -1, 69, -1, 43, -1, 45, + -1, 67, -1, 26, 1, 31, -1, 1, 31, -1, + 10, 26, 31, -1, 42, 46, -1, 11, 26, 31, + -1, 44, 46, -1, -1, 46, 47, -1, 46, 48, + -1, 46, 73, -1, 46, 71, -1, 46, 41, -1, + 46, 31, -1, 20, 74, 31, -1, 19, 75, 78, + 31, -1, 21, 79, 78, 31, -1, 22, 26, 78, + 31, -1, 23, 80, 80, 78, 31, -1, 24, 49, + 31, -1, -1, 49, 26, 50, -1, -1, 34, 75, + -1, 7, 31, -1, 51, 55, -1, 76, -1, 52, + 57, 53, -1, -1, 55, 56, -1, 55, 73, -1, + 55, 71, -1, 55, 31, -1, 55, 41, -1, 19, + 75, 78, 31, -1, 20, 74, 31, -1, 18, 31, + -1, 21, 26, 78, 31, -1, -1, 57, 40, -1, + 14, 79, 77, -1, 76, -1, 58, 61, 59, -1, + -1, 61, 40, -1, 61, 65, -1, 61, 54, -1, + 4, 75, 31, -1, 62, 72, -1, 76, -1, 63, + 66, 64, -1, -1, 66, 40, -1, 66, 65, -1, + 66, 54, -1, 6, 75, 31, -1, 9, 75, 31, + -1, 68, 72, -1, 12, 31, -1, 70, 13, -1, + -1, 72, 73, -1, 72, 31, -1, 72, 41, -1, + 16, 25, 79, 31, -1, 16, 79, 31, -1, 17, + 79, 31, -1, -1, 75, 78, -1, 26, -1, 27, + -1, 5, 31, -1, 8, 31, -1, 15, 31, -1, + 31, -1, 77, 31, -1, -1, 14, 79, -1, 80, + -1, 80, 34, 80, -1, 80, 28, 80, -1, 30, + 79, 29, -1, 35, 79, -1, 79, 32, 79, -1, + 79, 33, 79, -1, 26, -1, 27, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 105, 105, 107, 109, 110, 111, 112, 113, 114, + 115, 119, 123, 123, 123, 123, 123, 123, 123, 127, + 128, 129, 130, 131, 132, 136, 137, 143, 151, 157, + 165, 175, 177, 178, 179, 180, 181, 182, 185, 193, + 199, 209, 215, 221, 224, 226, 237, 238, 243, 252, + 257, 265, 268, 270, 271, 272, 273, 274, 277, 283, + 294, 300, 310, 312, 317, 325, 333, 336, 338, 339, + 340, 345, 352, 357, 365, 368, 370, 371, 372, 375, + 383, 390, 397, 403, 410, 412, 413, 414, 417, 422, + 427, 435, 437, 442, 443, 446, 447, 448, 452, 453, + 456, 457, 460, 461, 462, 463, 464, 465, 466, 469, + 470 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", + "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", + "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", + "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", + "T_SELECT", "T_RANGE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", + "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", + "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name", + "common_stmt", "option_error", "config_entry_start", "config_stmt", + "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", + "config_option", "symbol_option", "symbol_option_list", + "symbol_option_arg", "choice", "choice_entry", "choice_end", + "choice_stmt", "choice_option_list", "choice_option", "choice_block", + "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry", + "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment", + "comment_stmt", "help_start", "help", "depends_list", "depends", + "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 36, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 39, 39, 39, 39, 39, 39, 39, 40, + 40, 40, 40, 40, 40, 41, 41, 42, 43, 44, + 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, + 47, 47, 47, 48, 49, 49, 50, 50, 51, 52, + 53, 54, 55, 55, 55, 55, 55, 55, 56, 56, + 56, 56, 57, 57, 58, 59, 60, 61, 61, 61, + 61, 62, 63, 64, 65, 66, 66, 66, 66, 67, + 68, 69, 70, 71, 72, 72, 72, 72, 73, 73, + 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, + 78, 78, 79, 79, 79, 79, 79, 79, 79, 80, + 80 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 0, 2, 2, 2, 4, 2, 4, + 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 2, 3, 2, 3, + 2, 0, 2, 2, 2, 2, 2, 2, 3, 4, + 4, 4, 5, 3, 0, 3, 0, 2, 2, 2, + 1, 3, 0, 2, 2, 2, 2, 2, 4, 3, + 2, 4, 0, 2, 3, 1, 3, 0, 2, 2, + 2, 3, 2, 1, 3, 0, 2, 2, 2, 3, + 3, 2, 2, 2, 0, 2, 2, 2, 4, 3, + 3, 0, 2, 1, 1, 2, 2, 2, 1, 2, + 0, 2, 1, 3, 3, 3, 2, 3, 3, 1, + 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 16, 13, 14, + 18, 15, 17, 0, 19, 0, 4, 31, 22, 31, + 23, 52, 62, 5, 67, 20, 84, 75, 6, 24, + 84, 21, 8, 11, 93, 94, 0, 0, 95, 0, + 48, 96, 0, 0, 0, 109, 110, 0, 0, 0, + 102, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 98, 7, 71, 79, 80, 27, 29, 0, + 106, 0, 0, 64, 0, 0, 9, 10, 0, 0, + 0, 0, 0, 91, 0, 0, 0, 44, 0, 37, + 36, 32, 33, 0, 35, 34, 0, 0, 91, 0, + 56, 57, 53, 55, 54, 63, 51, 50, 68, 70, + 66, 69, 65, 86, 87, 85, 76, 78, 74, 77, + 73, 99, 105, 107, 108, 104, 103, 26, 82, 0, + 0, 0, 100, 0, 100, 100, 100, 0, 0, 0, + 83, 60, 100, 0, 100, 0, 89, 90, 0, 0, + 38, 92, 0, 0, 100, 46, 43, 25, 0, 59, + 0, 88, 101, 39, 40, 41, 0, 0, 45, 58, + 61, 42, 47 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 1, 2, 25, 26, 100, 27, 28, 29, 30, + 64, 101, 102, 148, 178, 31, 32, 116, 33, 66, + 112, 67, 34, 120, 35, 68, 36, 37, 128, 38, + 70, 39, 40, 41, 103, 104, 69, 105, 143, 144, + 42, 73, 159, 59, 60 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -135 +static const short int yypact[] = +{ + -135, 2, 170, -135, -14, 56, 56, -8, 56, 24, + 67, 56, 7, 14, 62, 97, -135, -135, -135, -135, + -135, -135, -135, 156, -135, 166, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, 138, 151, -135, 152, + -135, -135, 163, 167, 176, -135, -135, 62, 62, 185, + -19, -135, 188, 190, 42, 103, 194, 85, 70, 222, + 70, 132, -135, 191, -135, -135, -135, -135, -135, 127, + -135, 62, 62, 191, 104, 104, -135, -135, 193, 203, + 9, 62, 56, 56, 62, 161, 104, -135, 196, -135, + -135, -135, -135, 233, -135, -135, 204, 56, 56, 221, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, 219, -135, -135, -135, -135, -135, 62, + 209, 212, 240, 224, 240, -1, 240, 104, 41, 225, + -135, -135, 240, 226, 240, 218, -135, -135, 62, 227, + -135, -135, 228, 229, 240, 230, -135, -135, 231, -135, + 232, -135, 112, -135, -135, -135, 234, 56, -135, -135, + -135, -135, -135 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -135, -135, -135, -135, 94, -45, -135, -135, -135, -135, + 237, -135, -135, -135, -135, -135, -135, -135, -54, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, 1, + -135, -135, -135, -135, -135, 195, 235, -44, 159, -5, + 98, 210, -134, -53, -77 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -82 +static const short int yytable[] = +{ + 46, 47, 3, 49, 79, 80, 52, 135, 136, 84, + 161, 162, 163, 158, 119, 85, 127, 43, 168, 147, + 170, 111, 114, 48, 124, 125, 124, 125, 133, 134, + 176, 81, 82, 53, 139, 55, 56, 140, 141, 57, + 54, 145, -28, 88, 58, -28, -28, -28, -28, -28, + -28, -28, -28, -28, 89, 50, -28, -28, 90, 91, + -28, 92, 93, 94, 95, 96, 97, 165, 98, 121, + 164, 129, 166, 99, 6, 7, 8, 9, 10, 11, + 12, 13, 44, 45, 14, 15, 155, 142, 55, 56, + 7, 8, 57, 10, 11, 12, 13, 58, 51, 14, + 15, 24, 152, -30, 88, 172, -30, -30, -30, -30, + -30, -30, -30, -30, -30, 89, 24, -30, -30, 90, + 91, -30, 92, 93, 94, 95, 96, 97, 61, 98, + 55, 56, -81, 88, 99, -81, -81, -81, -81, -81, + -81, -81, -81, -81, 81, 82, -81, -81, 90, 91, + -81, -81, -81, -81, -81, -81, 132, 62, 98, 81, + 82, 115, 118, 123, 126, 117, 122, 63, 130, 72, + -2, 4, 182, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 74, 75, 14, 15, 16, 146, 17, 18, + 19, 20, 21, 22, 76, 88, 23, 149, 77, -49, + -49, 24, -49, -49, -49, -49, 89, 78, -49, -49, + 90, 91, 106, 107, 108, 109, 72, 81, 82, 86, + 98, 87, 131, 88, 137, 110, -72, -72, -72, -72, + -72, -72, -72, -72, 138, 151, -72, -72, 90, 91, + 156, 81, 82, 157, 81, 82, 150, 154, 98, 171, + 81, 82, 82, 123, 158, 160, 167, 169, 173, 174, + 175, 113, 179, 180, 177, 181, 65, 153, 0, 83, + 0, 0, 0, 0, 0, 71 +}; + +static const short int yycheck[] = +{ + 5, 6, 0, 8, 57, 58, 11, 84, 85, 28, + 144, 145, 146, 14, 68, 34, 70, 31, 152, 96, + 154, 66, 66, 31, 69, 69, 71, 71, 81, 82, + 164, 32, 33, 26, 25, 26, 27, 90, 91, 30, + 26, 94, 0, 1, 35, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 31, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 26, 26, 68, + 147, 70, 31, 31, 4, 5, 6, 7, 8, 9, + 10, 11, 26, 27, 14, 15, 139, 92, 26, 27, + 5, 6, 30, 8, 9, 10, 11, 35, 31, 14, + 15, 31, 107, 0, 1, 158, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 31, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 31, 26, + 26, 27, 0, 1, 31, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 32, 33, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 29, 1, 26, 32, + 33, 67, 68, 31, 70, 67, 68, 1, 70, 31, + 0, 1, 177, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 31, 31, 14, 15, 16, 26, 18, 19, + 20, 21, 22, 23, 31, 1, 26, 1, 31, 5, + 6, 31, 8, 9, 10, 11, 12, 31, 14, 15, + 16, 17, 18, 19, 20, 21, 31, 32, 33, 31, + 26, 31, 31, 1, 31, 31, 4, 5, 6, 7, + 8, 9, 10, 11, 31, 31, 14, 15, 16, 17, + 31, 32, 33, 31, 32, 33, 13, 26, 26, 31, + 32, 33, 33, 31, 14, 31, 31, 31, 31, 31, + 31, 66, 31, 31, 34, 31, 29, 108, -1, 59, + -1, -1, -1, -1, -1, 40 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 37, 38, 0, 1, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, + 21, 22, 23, 26, 31, 39, 40, 42, 43, 44, + 45, 51, 52, 54, 58, 60, 62, 63, 65, 67, + 68, 69, 76, 31, 26, 27, 75, 75, 31, 75, + 31, 31, 75, 26, 26, 26, 27, 30, 35, 79, + 80, 31, 1, 1, 46, 46, 55, 57, 61, 72, + 66, 72, 31, 77, 31, 31, 31, 31, 31, 79, + 79, 32, 33, 77, 28, 34, 31, 31, 1, 12, + 16, 17, 19, 20, 21, 22, 23, 24, 26, 31, + 41, 47, 48, 70, 71, 73, 18, 19, 20, 21, + 31, 41, 56, 71, 73, 40, 53, 76, 40, 54, + 59, 65, 76, 31, 41, 73, 40, 54, 64, 65, + 76, 31, 29, 79, 79, 80, 80, 31, 31, 25, + 79, 79, 75, 74, 75, 79, 26, 80, 49, 1, + 13, 31, 75, 74, 26, 79, 31, 31, 14, 78, + 31, 78, 78, 78, 80, 26, 31, 31, 78, 31, + 78, 31, 79, 31, 31, 31, 78, 34, 50, 31, + 31, 31, 75 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + case 52: /* "choice_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + case 58: /* "if_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + case 63: /* "menu_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + ; +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a look-ahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to look-ahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 8: + + { zconf_error("unexpected end statement"); ;} + break; + + case 9: + + { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); ;} + break; + + case 10: + + { + zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name); +;} + break; + + case 11: + + { zconf_error("invalid statement"); ;} + break; + + case 25: + + { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); ;} + break; + + case 26: + + { zconf_error("invalid option"); ;} + break; + + case 27: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +;} + break; + + case 28: + + { + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 29: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +;} + break; + + case 30: + + { + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 38: + + { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); +;} + break; + + case 39: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 40: + + { + menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); + if ((yyvsp[-3].id)->stype != S_UNKNOWN) + menu_set_type((yyvsp[-3].id)->stype); + printd(DEBUG_PARSE, "%s:%d:default(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-3].id)->stype); +;} + break; + + case 41: + + { + menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 42: + + { + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 45: + + { + struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string))); + if (id && id->flags & TF_OPTION) + menu_add_option(id->token, (yyvsp[0].string)); + else + zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string)); + free((yyvsp[-1].string)); +;} + break; + + case 46: + + { (yyval.string) = NULL; ;} + break; + + case 47: + + { (yyval.string) = (yyvsp[0].string); ;} + break; + + case 48: + + { + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 49: + + { + (yyval.menu) = menu_add_menu(); +;} + break; + + case 50: + + { + if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 58: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 59: + + { + if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); + } else + YYERROR; +;} + break; + + case 60: + + { + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 61: + + { + if ((yyvsp[-3].id)->stype == S_UNKNOWN) { + menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:default\n", + zconf_curname(), zconf_lineno()); + } else + YYERROR; +;} + break; + + case 64: + + { + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep((yyvsp[-1].expr)); + (yyval.menu) = menu_add_menu(); +;} + break; + + case 65: + + { + if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 71: + + { + menu_add_entry(NULL); + menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 72: + + { + (yyval.menu) = menu_add_menu(); +;} + break; + + case 73: + + { + if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 79: + + { + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); + zconf_nextfile((yyvsp[-1].string)); +;} + break; + + case 80: + + { + menu_add_entry(NULL); + menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 81: + + { + menu_end_entry(); +;} + break; + + case 82: + + { + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +;} + break; + + case 83: + + { + current_entry->sym->help = (yyvsp[0].string); +;} + break; + + case 88: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 89: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 90: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 92: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); +;} + break; + + case 95: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 96: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 97: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 100: + + { (yyval.expr) = NULL; ;} + break; + + case 101: + + { (yyval.expr) = (yyvsp[0].expr); ;} + break; + + case 102: + + { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;} + break; + + case 103: + + { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} + break; + + case 104: + + { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} + break; + + case 105: + + { (yyval.expr) = (yyvsp[-1].expr); ;} + break; + + case 106: + + { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;} + break; + + case 107: + + { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 108: + + { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 109: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;} + break; + + case 110: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;} + break; + + + default: break; + } + +/* Line 1126 of yacc.c. */ + + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (YY_("syntax error")); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (0) + goto yyerrorlab; + +yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + + + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup(NULL, 0); + modules_sym->type = S_BOOLEAN; + modules_sym->flags |= SYMBOL_AUTO; + rootmenu.prompt = menu_add_prompt(P_MENU, PROJECT_NAME" Configuration", NULL); + +#if YYDEBUG + if (getenv("ZCONF_DEBUG")) + zconfdebug = 1; +#endif + zconfparse(); + if (zconfnerrs) + exit(1); + if (!modules_sym->prop) { + struct property *prop; + + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0)); + } + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + sym_check_deps(sym); + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + case T_DEPENDS: return "depends"; + } + return ""; +} + +static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken) +{ + if (id->token != endtoken) { + zconf_error("unexpected '%s' within %s block", + kconf_id_strings + id->name, zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconf_error("'%s' in different file than '%s'", + kconf_id_strings + id->name, zconf_tokenname(starttoken)); + fprintf(stderr, "%s:%d: location of the '%s'\n", + current_menu->file->name, current_menu->lineno, + zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconf_error(const char *err, ...) +{ + va_list ap; + + zconfnerrs++; + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ +#if YYDEBUG + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +#endif +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "util.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" + + diff --git a/licenses/by-sa/deed.en b/licenses/by-sa/deed.en new file mode 100644 index 0000000..6f1fae7 --- /dev/null +++ b/licenses/by-sa/deed.en @@ -0,0 +1,306 @@ + +Creative Commons Deed + + + + + + + + + + + +

Creative Commons

+ + + +
+This page is available in the following languages: +
+ + + +българÑки + + + + +Català + + + + +Dansk + + + + +Deutsch + + + + +English + + + + +English (CA) + + + + +English (GB) + + + + +Castellano + + + + +Castellano (AR) + + + + +Español (CL) + + + + +Castellano (MX) + + + + +Euskara + + + + +Suomeksi + + + + +français + + + + +français (CA) + + + + +Galego + + + + +עברית + + + + +hrvatski + + + + +Magyar + + + + +Italiano + + + + +日本語 + + + + +한국어 + + + + +Melayu + + + + +Nederlands + + + + +polski + + + + +Português + + + + +Português (PT) + + + + +svenska + + + + +slovenski jezik + + + + +简体中文 + + + + +è¯èªž (å°ç£) + + +
+ + + + +
+ +
+ + Creative Commons Deed + +

Attribution-ShareAlike 2.5

+ + + +
+ + + +

You are free:

+ +
    + +
  • to copy, distribute, display, and perform the work
  • + +
  • to make derivative works
  • + +
  • to make commercial use of the work
  • + +
+ + + +

Under the following conditions:

+ +
+ + + + + + + + + + + + +
+ by + +
Attribution. + You must attribute the work in the manner specified by the author or licensor.
+
+ sa + +
Share Alike. +If you alter, transform, or build upon this work, you may distribute +the resulting work only under a license identical to this one.
+
+ + + +
    + +
  • For any reuse or distribution, you must make clear to others the license terms of this work.
  • + +
  • Any of these conditions can be waived if you get permission from the copyright holder.
  • + +
+ + + +

Your fair use and other rights are in no way affected by the above.

+ + + + + +

+ + + This is a human-readable summary of the Legal Code (the full license). + +

+ + + + + + + +

 

+ +
+ +
+ +
+ +

+ +Learn how to distribute your work using this license + +

+ + + + + \ No newline at end of file diff --git a/licenses/by-sa/deed_files/deed.gif b/licenses/by-sa/deed_files/deed.gif new file mode 100644 index 0000000..ef811af Binary files /dev/null and b/licenses/by-sa/deed_files/deed.gif differ diff --git a/licenses/by-sa/deed_files/deed_002.gif b/licenses/by-sa/deed_files/deed_002.gif new file mode 100644 index 0000000..2160a80 Binary files /dev/null and b/licenses/by-sa/deed_files/deed_002.gif differ diff --git a/licenses/by-sa/deed_files/deeds.css b/licenses/by-sa/deed_files/deeds.css new file mode 100644 index 0000000..7c50dbc --- /dev/null +++ b/licenses/by-sa/deed_files/deeds.css @@ -0,0 +1,54 @@ +body { + margin: 0px; + padding: 0px; + font-family: verdana, arial, helvetica, sans-serif; + color: black; + background-color: white; + text-align: center; + font-size:11px; + /* part 1 of 2 centering hack */ + } + +#deed { + width: 620px; + padding: 15px; + margin-top: 20px; + margin-bottom: 20px; + margin-right: auto; + margin-left: auto; + /* opera does not like 'margin:20px auto' */ + background: #ffc; + border: 3px groove #333; + text-align:left; + /* part 2 of 2 centering hack */ + width: 620px; /* ie5win fudge begins */ + voice-family: "\"}\""; + voice-family:inherit; + width: 584px; + } + +html>body #content { + width: 584px; /* ie5win fudge ends */ + } + +.fineprint { + border:1px solid black; + padding:8px; + background:#ffffff; + text-align:justify; +} + +.text, li { + font-family:verdana, sans-serif; + font-size:11px; + margin-left:20px; + margin-right:20px; + line-height:140%; + text-align:left; +} + +.tiny { + font-family:verdana, sans-serif; + font-size:11px; + margin-bottom:10px; +} \ No newline at end of file diff --git a/licenses/by-sa/deed_files/logo_deed.gif b/licenses/by-sa/deed_files/logo_deed.gif new file mode 100644 index 0000000..6024290 Binary files /dev/null and b/licenses/by-sa/deed_files/logo_deed.gif differ diff --git a/licenses/by-sa/deed_files/popup.gif b/licenses/by-sa/deed_files/popup.gif new file mode 100644 index 0000000..31dfb98 Binary files /dev/null and b/licenses/by-sa/deed_files/popup.gif differ diff --git a/licenses/by-sa/legalcode b/licenses/by-sa/legalcode new file mode 100644 index 0000000..6cf807e --- /dev/null +++ b/licenses/by-sa/legalcode @@ -0,0 +1,378 @@ + +Creative Commons Legal Code + + + + + + +

Creative Commons

+ + + +
+
Creative Commons Legal Code
+ + +

Attribution-ShareAlike 2.5

+ + +
+ + +
+CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL +SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON +AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE.
+ + + + +

License

+ +

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS +PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK +OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS +PROHIBITED.

+ +

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND +AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU +THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH +TERMS AND CONDITIONS.

+ + +

1. Definitions

+ +
    +
  1. +"Collective Work" means a work, such as a periodical +issue, anthology or encyclopedia, in which the Work in its entirety in +unmodified form, along with a number of other contributions, +constituting separate and independent works in themselves, are +assembled into a collective whole. A work that constitutes a Collective +Work will not be considered a Derivative Work (as defined below) for +the purposes of this License. +
  2. + +
  3. +"Derivative Work" means a work based upon the Work or +upon the Work and other pre-existing works, such as a translation, +musical arrangement, dramatization, fictionalization, motion picture +version, sound recording, art reproduction, abridgment, condensation, +or any other form in which the Work may be recast, transformed, or +adapted, except that a work that constitutes a Collective Work will not +be considered a Derivative Work for the purpose of this License. For +the avoidance of doubt, where the Work is a musical composition or +sound recording, the synchronization of the Work in timed-relation with +a moving image ("synching") will be considered a Derivative Work for +the purpose of this License. +
  4. + +
  5. +"Licensor" means the individual or entity that offers the Work under the terms of this License. +
  6. + +
  7. +"Original Author" means the individual or entity who created the Work. +
  8. + +
  9. +"Work" means the copyrightable work of authorship offered under the terms of this License. +
  10. + +
  11. +"You" means an individual or entity exercising rights +under this License who has not previously violated the terms of this +License with respect to the Work, or who has received express +permission from the Licensor to exercise rights under this License +despite a previous violation. +
  12. + +
  13. "License Elements" means the following high-level +license attributes as selected by Licensor and indicated in the title +of this License: Attribution, ShareAlike.
+ +

2. Fair Use Rights. Nothing in this license is +intended to reduce, limit, or restrict any rights arising from fair +use, first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws.

+ + +

3. License Grant. Subject to the terms and +conditions of this License, Licensor hereby grants You a worldwide, +royalty-free, non-exclusive, perpetual (for the duration of the +applicable copyright) license to exercise the rights in the Work as +stated below:

+ + +
    +
  1. +to reproduce the Work, to incorporate the Work into one or more +Collective Works, and to reproduce the Work as incorporated in the +Collective Works; +
  2. + +
  3. +to create and reproduce Derivative Works; +
  4. + +
  5. to distribute copies or phonorecords of, display publicly, perform +publicly, and perform publicly by means of a digital audio transmission +the Work including as incorporated in Collective Works; +
  6. + +
  7. to distribute copies or phonorecords of, display publicly, perform +publicly, and perform publicly by means of a digital audio transmission +Derivative Works. +
  8. + +
  9. For the avoidance of doubt, where the work is a musical composition:

    + +
      +
    1. Performance Royalties Under Blanket Licenses. +Licensor waives the exclusive right to collect, whether individually or +via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties +for the public performance or public digital performance (e.g. webcast) +of the Work.
    2. + +
    3. Mechanical Rights and Statutory Royalties. +Licensor waives the exclusive right to collect, whether individually or +via a music rights society or designated agent (e.g. Harry Fox Agency), +royalties for any phonorecord You create from the Work ("cover +version") and distribute, subject to the compulsory license created by +17 USC Section 115 of the US Copyright Act (or the equivalent in other +jurisdictions). +
    4. +
    +
  10. + +
  11. Webcasting Rights and Statutory Royalties. For the +avoidance of doubt, where the Work is a sound recording, Licensor +waives the exclusive right to collect, whether individually or via a +performance-rights society (e.g. SoundExchange), royalties for the +public digital performance (e.g. webcast) of the Work, subject to the +compulsory license created by 17 USC Section 114 of the US Copyright +Act (or the equivalent in other jurisdictions).
  12. +
+ + +

The above rights may be exercised in all media and formats whether +now known or hereafter devised. The above rights include the right to +make such modifications as are technically necessary to exercise the +rights in other media and formats. All rights not expressly granted by +Licensor are hereby reserved.

+ +

4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

+ + +
    +
  1. +You may distribute, publicly display, publicly perform, or publicly +digitally perform the Work only under the terms of this License, and +You must include a copy of, or the Uniform Resource Identifier for, +this License with every copy or phonorecord of the Work You distribute, +publicly display, publicly perform, or publicly digitally perform. You +may not offer or impose any terms on the Work that alter or restrict +the terms of this License or the recipients' exercise of the rights +granted hereunder. You may not sublicense the Work. You must keep +intact all notices that refer to this License and to the disclaimer of +warranties. You may not distribute, publicly display, publicly perform, +or publicly digitally perform the Work with any technological measures +that control access or use of the Work in a manner inconsistent with +the terms of this License Agreement. The above applies to the Work as +incorporated in a Collective Work, but this does not require the +Collective Work apart from the Work itself to be made subject to the +terms of this License. If You create a Collective Work, upon notice +from any Licensor You must, to the extent practicable, remove from the +Collective Work any credit as required by clause 4(c), as requested. If +You create a Derivative Work, upon notice from any Licensor You must, +to the extent practicable, remove from the Derivative Work any credit +as required by clause 4(c), as requested. +
  2. + +
  3. You may distribute, publicly display, publicly perform, or publicly +digitally perform a Derivative Work only under the terms of this +License, a later version of this License with the same License Elements +as this License, or a Creative Commons iCommons license that contains +the same License Elements as this License (e.g. Attribution-ShareAlike +2.5 Japan). You must include a copy of, or the Uniform Resource +Identifier for, this License or other license specified in the previous +sentence with every copy or phonorecord of each Derivative Work You +distribute, publicly display, publicly perform, or publicly digitally +perform. You may not offer or impose any terms on the Derivative Works +that alter or restrict the terms of this License or the recipients' +exercise of the rights granted hereunder, and You must keep intact all +notices that refer to this License and to the disclaimer of warranties. +You may not distribute, publicly display, publicly perform, or publicly +digitally perform the Derivative Work with any technological measures +that control access or use of the Work in a manner inconsistent with +the terms of this License Agreement. The above applies to the +Derivative Work as incorporated in a Collective Work, but this does not +require the Collective Work apart from the Derivative Work itself to be +made subject to the terms of this License. +
  4. + +
  5. If you distribute, publicly display, publicly perform, or publicly +digitally perform the Work or any Derivative Works or Collective Works, +You must keep intact all copyright notices for the Work and provide, +reasonable to the medium or means You are utilizing: (i) the name of +the Original Author (or pseudonym, if applicable) if supplied, and/or +(ii) if the Original Author and/or Licensor designate another party or +parties (e.g. a sponsor institute, publishing entity, journal) for +attribution in Licensor's copyright notice, terms of service or by +other reasonable means, the name of such party or parties; the title of +the Work if supplied; to the extent reasonably practicable, the Uniform +Resource Identifier, if any, that Licensor specifies to be associated +with the Work, unless such URI does not refer to the copyright notice +or licensing information for the Work; and in the case of a Derivative +Work, a credit identifying the use of the Work in the Derivative Work +(e.g., "French translation of the Work by Original Author," or +"Screenplay based on original Work by Original Author"). Such credit +may be implemented in any reasonable manner; provided, however, that in +the case of a Derivative Work or Collective Work, at a minimum such +credit will appear where any other comparable authorship credit appears +and in a manner at least as prominent as such other comparable +authorship credit. +
  6. + + + + +
+ + + + + +

5. Representations, Warranties and Disclaimer

+ +

UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR +OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, +MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR +THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF +ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO +NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY +NOT APPLY TO YOU.

+ + +

6. Limitation on Liability. EXCEPT TO THE EXTENT +REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU +ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, +PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF +THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES.

+ +

7. Termination

+ +
    + +
  1. +This License and the rights granted hereunder will terminate +automatically upon any breach by You of the terms of this License. +Individuals or entities who have received Derivative Works or +Collective Works from You under this License, however, will not have +their licenses terminated provided such individuals or entities remain +in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 +will survive any termination of this License. +
  2. + +
  3. Subject to the above terms and conditions, the license granted here +is perpetual (for the duration of the applicable copyright in the +Work). Notwithstanding the above, Licensor reserves the right to +release the Work under different license terms or to stop distributing +the Work at any time; provided, however that any such election will not +serve to withdraw this License (or any other license that has been, or +is required to be, granted under the terms of this License), and this +License will continue in full force and effect unless terminated as +stated above. +
  4. +
+ +

8. Miscellaneous

+ +
    + +
  1. Each time You distribute or publicly digitally perform the Work or +a Collective Work, the Licensor offers to the recipient a license to +the Work on the same terms and conditions as the license granted to You +under this License. +
  2. + +
  3. Each time You distribute or publicly digitally perform a Derivative +Work, Licensor offers to the recipient a license to the original Work +on the same terms and conditions as the license granted to You under +this License. +
  4. + +
  5. If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this License, and without further action +by the parties to this agreement, such provision shall be reformed to +the minimum extent necessary to make such provision valid and +enforceable. +
  6. + +
  7. No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. +
  8. + +
  9. This License constitutes the entire agreement between the parties +with respect to the Work licensed here. There are no understandings, +agreements or representations with respect to the Work not specified +here. Licensor shall not be bound by any additional provisions that may +appear in any communication from You. This License may not be modified +without the mutual written agreement of the Licensor and You. +
  10. +
+ + + +
+ + +

Creative Commons is not a party to this License, and makes no +warranty whatsoever in connection with the Work. Creative Commons will +not be liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor.

+ + +

Except for the limited purpose of indicating to the public that the +Work is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted +use will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time.

+ + +

Creative Commons may be contacted at http://creativecommons.org/.

+ + +
+ + + +
+ + + + +
+ \ No newline at end of file diff --git a/licenses/by-sa/legalcode_files/deeds.css b/licenses/by-sa/legalcode_files/deeds.css new file mode 100644 index 0000000..7c50dbc --- /dev/null +++ b/licenses/by-sa/legalcode_files/deeds.css @@ -0,0 +1,54 @@ +body { + margin: 0px; + padding: 0px; + font-family: verdana, arial, helvetica, sans-serif; + color: black; + background-color: white; + text-align: center; + font-size:11px; + /* part 1 of 2 centering hack */ + } + +#deed { + width: 620px; + padding: 15px; + margin-top: 20px; + margin-bottom: 20px; + margin-right: auto; + margin-left: auto; + /* opera does not like 'margin:20px auto' */ + background: #ffc; + border: 3px groove #333; + text-align:left; + /* part 2 of 2 centering hack */ + width: 620px; /* ie5win fudge begins */ + voice-family: "\"}\""; + voice-family:inherit; + width: 584px; + } + +html>body #content { + width: 584px; /* ie5win fudge ends */ + } + +.fineprint { + border:1px solid black; + padding:8px; + background:#ffffff; + text-align:justify; +} + +.text, li { + font-family:verdana, sans-serif; + font-size:11px; + margin-left:20px; + margin-right:20px; + line-height:140%; + text-align:left; +} + +.tiny { + font-family:verdana, sans-serif; + font-size:11px; + margin-bottom:10px; +} \ No newline at end of file diff --git a/licenses/by-sa/legalcode_files/logo_code.gif b/licenses/by-sa/legalcode_files/logo_code.gif new file mode 100644 index 0000000..7de342c Binary files /dev/null and b/licenses/by-sa/legalcode_files/logo_code.gif differ diff --git a/licenses/gpl.txt b/licenses/gpl.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/licenses/gpl.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/licenses/lgpl.txt b/licenses/lgpl.txt new file mode 100644 index 0000000..5ab7695 --- /dev/null +++ b/licenses/lgpl.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This 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. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/patches/binutils/2.11.2/gcc-pr3106.patch b/patches/binutils/2.11.2/gcc-pr3106.patch new file mode 100644 index 0000000..c3a0264 --- /dev/null +++ b/patches/binutils/2.11.2/gcc-pr3106.patch @@ -0,0 +1,28 @@ +See http://gcc.gnu.org/PR3106 +Backported from gcc-3.0.x + +Fixes error + .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr' + /usr/include/stdio.h:258: error: previous declaration of `sys_nerr' + make[1]: *** [strerror.o] Error 1 + make: *** [all-libiberty] Error 2 +on Mac OS X. + +--- binutils-2.11.2/libiberty/strerror.c.old 2004-03-24 16:23:19.000000000 -0800 ++++ binutils-2.11.2/libiberty/strerror.c 2004-03-24 16:23:48.000000000 -0800 +@@ -13,6 +13,7 @@ + incompatible with our later declaration, perhaps by using const + attributes. So we hide the declaration in errno.h (if any) using a + macro. */ ++#define sys_nerr sys_nerr__ + #define sys_errlist sys_errlist__ + #endif + +@@ -20,6 +21,7 @@ + #include + + #ifdef HAVE_SYS_ERRLIST ++#undef sys_nerr + #undef sys_errlist + #endif + diff --git a/patches/binutils/2.13.90.0.2/README b/patches/binutils/2.13.90.0.2/README new file mode 100644 index 0000000..521e669 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/README @@ -0,0 +1,6 @@ +The files rh62*.patch are from the Red Hat 6.2 file +binutils-2.13.90.0.2-2.src.rpm + +I am trusting here that Red Hat's patches are appropriate for all CPU +types. If I'm wrong, just remove the offending patch... +- Dan Kegel diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch new file mode 100644 index 0000000..f8719a5 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch @@ -0,0 +1,96 @@ +2002-04-20 Jakub Jelinek + + * elf32-sparc.c (elf32_sparc_relocate_section): Find real output + section with SEC_MERGE. + * elf64-sparc.c (sparc64_elf_relocate_section): Likewise. + +--- binutils/bfd/elf32-sparc.c.jj Sat Apr 20 22:11:57 2002 ++++ binutils/bfd/elf32-sparc.c Sat Apr 20 23:06:33 2002 +@@ -1144,7 +1144,7 @@ elf32_sparc_relocate_section (output_bfd + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; + asection *sec; +- bfd_vma relocation, off; ++ bfd_vma relocation, off, orig_addend = 0; + bfd_reloc_status_type r; + boolean is_plt = false; + boolean unresolved_reloc; +@@ -1192,6 +1192,7 @@ elf32_sparc_relocate_section (output_bfd + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; ++ orig_addend = rel->r_addend; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); + } + else +@@ -1527,6 +1528,25 @@ elf32_sparc_relocate_section (output_bfd + asection *osec; + + osec = sec->output_section; ++ /* FIXME: As soon as making sections zero size ++ is possible, this if can go away. */ ++ if (bfd_is_abs_section (osec) ++ && h == NULL ++ && (sec->flags & SEC_MERGE) ++ && ELF_ST_TYPE (sym->st_info) == STT_SECTION ++ && (elf_section_data (sec)->sec_info_type ++ == ELF_INFO_TYPE_MERGE)) ++ { ++ asection *msec; ++ ++ msec = sec; ++ _bfd_merged_section_offset (output_bfd, &msec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value + orig_addend, ++ (bfd_vma) 0); ++ osec = msec->output_section; ++ } ++ + indx = elf_section_data (osec)->dynindx; + + /* FIXME: we really should be able to link non-pic +--- binutils/bfd/elf64-sparc.c.jj Sat Apr 20 22:11:57 2002 ++++ binutils/bfd/elf64-sparc.c Sat Apr 20 23:12:18 2002 +@@ -1939,7 +1939,7 @@ sparc64_elf_relocate_section (output_bfd + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; + asection *sec; +- bfd_vma relocation, off; ++ bfd_vma relocation, off, orig_addend = 0; + bfd_reloc_status_type r; + boolean is_plt = false; + boolean unresolved_reloc; +@@ -1982,6 +1982,7 @@ sparc64_elf_relocate_section (output_bfd + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; ++ orig_addend = rel->r_addend; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); + } + else +@@ -2211,6 +2212,25 @@ sparc64_elf_relocate_section (output_bfd + asection *osec; + + osec = sec->output_section; ++ /* FIXME: As soon as making sections zero size ++ is possible, this if can go away. */ ++ if (bfd_is_abs_section (osec) ++ && h == NULL ++ && (sec->flags & SEC_MERGE) ++ && ELF_ST_TYPE (sym->st_info) == STT_SECTION ++ && (elf_section_data (sec)->sec_info_type ++ == ELF_INFO_TYPE_MERGE)) ++ { ++ asection *msec; ++ ++ msec = sec; ++ _bfd_merged_section_offset (output_bfd, &msec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value + orig_addend, ++ (bfd_vma) 0); ++ osec = msec->output_section; ++ } ++ + indx = elf_section_data (osec)->dynindx; + + /* FIXME: we really should be able to link non-pic diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch new file mode 100644 index 0000000..a35b8f8 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch @@ -0,0 +1,58 @@ +--- binutils/ld/emulparams/elf_i386_glibc21.sh.jj Sat Aug 3 17:04:41 2002 ++++ binutils/ld/emulparams/elf_i386_glibc21.sh Sat Aug 3 17:04:41 2002 +@@ -0,0 +1,11 @@ ++SCRIPT_NAME=elf ++OUTPUT_FORMAT="elf32-i386" ++TEXT_START_ADDR=0x08048000 ++MAXPAGESIZE=0x1000 ++NONPAGED_TEXT_START_ADDR=0x08048000 ++ARCH=i386 ++MACHINE= ++NOP=0x9090 ++TEMPLATE_NAME=elf32 ++GENERATE_SHLIB_SCRIPT=yes ++LIB_PATH=/usr/i386-glibc21-linux/lib:/usr/local/lib +--- binutils/ld/configure.tgt.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/configure.tgt Sat Aug 3 17:06:18 2002 +@@ -143,7 +143,8 @@ i[3456]86-*-linux*aout*) targ_emul=i386l + ;; + i[3456]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; + i[3456]86-*-linux-gnu*) targ_emul=elf_i386 +- targ_extra_emuls=i386linux ++ targ_extra_emuls="i386linux elf_i386_glibc21" ++ targ_extra_libpath=elf_i386_glibc21 + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi +--- binutils/ld/Makefile.am.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/Makefile.am Sat Aug 3 17:04:41 2002 +@@ -181,6 +181,7 @@ ALL_EMULATIONS = \ + eelf_i386.o \ + eelf_i386_be.o \ + eelf_i386_chaos.o \ ++ eelf_i386_glibc21.o \ + eelf_i386_fbsd.o \ + eelf_i386_ldso.o \ + eelf_s390.o \ +@@ -718,6 +719,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf + eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)" ++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)" + eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \ + $(srcdir)/emulparams/elf_i386.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} +--- binutils/ld/Makefile.in.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/Makefile.in Sat Aug 3 17:07:34 2002 +@@ -1197,6 +1197,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf + eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)" ++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)" + eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \ + $(srcdir)/emulparams/elf_i386.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch new file mode 100644 index 0000000..030dfa9 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch @@ -0,0 +1,372 @@ +2002-08-03 Jakub Jelinek + + * config/tc-i386.c (output_insn): Save frag_now and frag_now_fix () + at start of insn, pass it to output_disp and output_imm. + (output_disp): Added arguments. If _GLOBAL_OFFSET_TABLE_ is seen + in displacement for R_386_32 reloc, use R_386_GOTPC and compute + properly addend. + (output_imm): Added arguments. Compute properly addend for + R_386_GOTPC. + (md_apply_fix3): Remove R_386_GOTPC handling. + * testsuite/gas/i386/gotpc.s: New. + * testsuite/gas/i386/gotpc.d: New. + * testsuite/gas/i386/i386.exp: Add gotpc test. + +--- binutils/gas/config/tc-i386.c.jj 2002-07-18 11:35:39.000000000 +0200 ++++ binutils/gas/config/tc-i386.c 2002-08-02 21:13:18.000000000 +0200 +@@ -104,8 +104,10 @@ static void output_insn PARAMS ((void)); + static void output_branch PARAMS ((void)); + static void output_jump PARAMS ((void)); + static void output_interseg_jump PARAMS ((void)); +-static void output_imm PARAMS ((void)); +-static void output_disp PARAMS ((void)); ++static void output_imm PARAMS ((fragS *insn_start_frag, ++ offsetT insn_start_off)); ++static void output_disp PARAMS ((fragS *insn_start_frag, ++ offsetT insn_start_off)); + #ifndef I386COFF + static void s_bss PARAMS ((int)); + #endif +@@ -3101,14 +3103,21 @@ output_interseg_jump () + md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2); + } + ++ + static void + output_insn () + { ++ fragS *insn_start_frag; ++ offsetT insn_start_off; ++ + /* Tie dwarf2 debug info to the address at the start of the insn. + We can't do this after the insn has been output as the current + frag may have been closed off. eg. by frag_var. */ + dwarf2_emit_insn (0); + ++ insn_start_frag = frag_now; ++ insn_start_off = frag_now_fix (); ++ + /* Output jumps. */ + if (i.tm.opcode_modifier & Jump) + output_branch (); +@@ -3179,10 +3188,10 @@ output_insn () + } + + if (i.disp_operands) +- output_disp (); ++ output_disp (insn_start_frag, insn_start_off); + + if (i.imm_operands) +- output_imm (); ++ output_imm (insn_start_frag, insn_start_off); + } + + #ifdef DEBUG386 +@@ -3194,7 +3203,9 @@ output_insn () + } + + static void +-output_disp () ++output_disp (insn_start_frag, insn_start_off) ++ fragS *insn_start_frag; ++ offsetT insn_start_off; + { + char *p; + unsigned int n; +@@ -3224,6 +3235,7 @@ output_disp () + } + else + { ++ RELOC_ENUM reloc_type; + int size = 4; + int sign = 0; + int pcrel = (i.flags[n] & Operand_PCrel) != 0; +@@ -3266,16 +3278,50 @@ output_disp () + } + + p = frag_more (size); ++ reloc_type = reloc (size, pcrel, sign, i.reloc[n]); ++#ifdef BFD_ASSEMBLER ++ if (reloc_type == BFD_RELOC_32 ++ && GOT_symbol ++ && GOT_symbol == i.op[n].disps->X_add_symbol ++ && (i.op[n].disps->X_op == O_symbol ++ || (i.op[n].disps->X_op == O_add ++ && ((symbol_get_value_expression ++ (i.op[n].disps->X_op_symbol)->X_op) ++ == O_subtract)))) ++ { ++ offsetT add; ++ ++ if (insn_start_frag == frag_now) ++ add = (p - frag_now->fr_literal) - insn_start_off; ++ else ++ { ++ fragS *fr; ++ ++ add = insn_start_frag->fr_fix - insn_start_off; ++ for (fr = insn_start_frag->fr_next; ++ fr && fr != frag_now; fr = fr->fr_next) ++ add += fr->fr_fix; ++ add += p - frag_now->fr_literal; ++ } ++ ++ /* We don't support dynamic linking on x86-64 yet. */ ++ if (flag_code == CODE_64BIT) ++ abort (); ++ reloc_type = BFD_RELOC_386_GOTPC; ++ i.op[n].disps->X_add_number += add; ++ } ++#endif + fix_new_exp (frag_now, p - frag_now->fr_literal, size, +- i.op[n].disps, pcrel, +- reloc (size, pcrel, sign, i.reloc[n])); ++ i.op[n].disps, pcrel, reloc_type); + } + } + } + } + + static void +-output_imm () ++output_imm (insn_start_frag, insn_start_off) ++ fragS *insn_start_frag; ++ offsetT insn_start_off; + { + char *p; + unsigned int n; +@@ -3328,6 +3374,48 @@ output_imm () + p = frag_more (size); + reloc_type = reloc (size, 0, sign, i.reloc[n]); + #ifdef BFD_ASSEMBLER ++ /* This is tough to explain. We end up with this one if we ++ * have operands that look like ++ * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to ++ * obtain the absolute address of the GOT, and it is strongly ++ * preferable from a performance point of view to avoid using ++ * a runtime relocation for this. The actual sequence of ++ * instructions often look something like: ++ * ++ * call .L66 ++ * .L66: ++ * popl %ebx ++ * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx ++ * ++ * The call and pop essentially return the absolute address ++ * of the label .L66 and store it in %ebx. The linker itself ++ * will ultimately change the first operand of the addl so ++ * that %ebx points to the GOT, but to keep things simple, the ++ * .o file must have this operand set so that it generates not ++ * the absolute address of .L66, but the absolute address of ++ * itself. This allows the linker itself simply treat a GOTPC ++ * relocation as asking for a pcrel offset to the GOT to be ++ * added in, and the addend of the relocation is stored in the ++ * operand field for the instruction itself. ++ * ++ * Our job here is to fix the operand so that it would add ++ * the correct offset so that %ebx would point to itself. The ++ * thing that is tricky is that .-.L66 will point to the ++ * beginning of the instruction, so we need to further modify ++ * the operand so that it will point to itself. There are ++ * other cases where you have something like: ++ * ++ * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66] ++ * ++ * and here no correction would be required. Internally in ++ * the assembler we treat operands of this form as not being ++ * pcrel since the '.' is explicitly mentioned, and I wonder ++ * whether it would simplify matters to do it this way. Who ++ * knows. In earlier versions of the PIC patches, the ++ * pcrel_adjust field was used to store the correction, but ++ * since the expression is not pcrel, I felt it would be ++ * confusing to do it this way. */ ++ + if (reloc_type == BFD_RELOC_32 + && GOT_symbol + && GOT_symbol == i.op[n].imms->X_add_symbol +@@ -3337,11 +3425,26 @@ output_imm () + (i.op[n].imms->X_op_symbol)->X_op) + == O_subtract)))) + { ++ offsetT add; ++ ++ if (insn_start_frag == frag_now) ++ add = (p - frag_now->fr_literal) - insn_start_off; ++ else ++ { ++ fragS *fr; ++ ++ add = insn_start_frag->fr_fix - insn_start_off; ++ for (fr = insn_start_frag->fr_next; ++ fr && fr != frag_now; fr = fr->fr_next) ++ add += fr->fr_fix; ++ add += p - frag_now->fr_literal; ++ } ++ + /* We don't support dynamic linking on x86-64 yet. */ + if (flag_code == CODE_64BIT) + abort (); + reloc_type = BFD_RELOC_386_GOTPC; +- i.op[n].imms->X_add_number += 3; ++ i.op[n].imms->X_add_number += add; + } + #endif + fix_new_exp (frag_now, p - frag_now->fr_literal, size, +@@ -4542,48 +4645,6 @@ md_apply_fix3 (fixP, valP, seg) + runtime we merely add the offset to the actual PLT entry. */ + value = -4; + break; +- case BFD_RELOC_386_GOTPC: +- +-/* This is tough to explain. We end up with this one if we have +- * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal +- * here is to obtain the absolute address of the GOT, and it is strongly +- * preferable from a performance point of view to avoid using a runtime +- * relocation for this. The actual sequence of instructions often look +- * something like: +- * +- * call .L66 +- * .L66: +- * popl %ebx +- * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx +- * +- * The call and pop essentially return the absolute address of +- * the label .L66 and store it in %ebx. The linker itself will +- * ultimately change the first operand of the addl so that %ebx points to +- * the GOT, but to keep things simple, the .o file must have this operand +- * set so that it generates not the absolute address of .L66, but the +- * absolute address of itself. This allows the linker itself simply +- * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be +- * added in, and the addend of the relocation is stored in the operand +- * field for the instruction itself. +- * +- * Our job here is to fix the operand so that it would add the correct +- * offset so that %ebx would point to itself. The thing that is tricky is +- * that .-.L66 will point to the beginning of the instruction, so we need +- * to further modify the operand so that it will point to itself. +- * There are other cases where you have something like: +- * +- * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66] +- * +- * and here no correction would be required. Internally in the assembler +- * we treat operands of this form as not being pcrel since the '.' is +- * explicitly mentioned, and I wonder whether it would simplify matters +- * to do it this way. Who knows. In earlier versions of the PIC patches, +- * the pcrel_adjust field was used to store the correction, but since the +- * expression is not pcrel, I felt it would be confusing to do it this +- * way. */ +- +- value -= 1; +- break; + case BFD_RELOC_386_GOT32: + case BFD_RELOC_386_TLS_GD: + case BFD_RELOC_386_TLS_LDM: +--- binutils/gas/testsuite/gas/i386/gotpc.s.jj 2002-08-02 21:17:57.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/gotpc.s 2002-08-03 22:55:47.000000000 +0200 +@@ -0,0 +1,40 @@ ++ .text ++test: ++ addl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ addl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ addl $_GLOBAL_OFFSET_TABLE_, %eax ++ addl $_GLOBAL_OFFSET_TABLE_, %ebx ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %ebx ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %eax ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %eax ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %ebx ++ subl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ subl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ subl $_GLOBAL_OFFSET_TABLE_, %eax ++ subl $_GLOBAL_OFFSET_TABLE_, %ebx ++ orl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ orl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ orl $_GLOBAL_OFFSET_TABLE_, %eax ++ orl $_GLOBAL_OFFSET_TABLE_, %ebx ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ movl $_GLOBAL_OFFSET_TABLE_, %eax ++ movl $_GLOBAL_OFFSET_TABLE_, %ebx ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %gs:foo ++ gs; movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], _GLOBAL_OFFSET_TABLE_ ++ movl _GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ movl _GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %eax, %gs:_GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %ebx, %gs:_GLOBAL_OFFSET_TABLE_+[.-test] ++ gs; movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test] ++ gs; movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test] ++ leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax ++ leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx ++ movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax ++ movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx ++ .long _GLOBAL_OFFSET_TABLE_+[.-test] ++ .long _GLOBAL_OFFSET_TABLE_@GOTOFF +--- binutils/gas/testsuite/gas/i386/gotpc.d.jj 2002-08-02 21:18:43.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/gotpc.d 2002-08-03 23:05:43.000000000 +0200 +@@ -0,0 +1,52 @@ ++#objdump: -drw ++#name: i386 gotpc ++ ++.*: +file format .* ++ ++Disassembly of section .text: ++ ++0+000 : ++ 0: 05 01 00 00 00 [ ]*add \$0x1,%eax 1: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5: 81 c3 07 00 00 00 [ ]*add \$0x7,%ebx 7: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ b: 05 01 00 00 00 [ ]*add \$0x1,%eax c: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 10: 81 c3 02 00 00 00 [ ]*add \$0x2,%ebx 12: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 16: 8d 98 16 00 00 00 [ ]*lea 0x16\(%eax\),%ebx 18: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 1c: 8d 83 1c 00 00 00 [ ]*lea 0x1c\(%ebx\),%eax 1e: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 22: 8d 80 22 00 00 00 [ ]*lea 0x22\(%eax\),%eax 24: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 28: 8d 9b 28 00 00 00 [ ]*lea 0x28\(%ebx\),%ebx 2a: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 2e: 2d 2f 00 00 00 [ ]*sub \$0x2f,%eax 2f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 33: 81 eb 35 00 00 00 [ ]*sub \$0x35,%ebx 35: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 39: 2d 01 00 00 00 [ ]*sub \$0x1,%eax 3a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 3e: 81 eb 02 00 00 00 [ ]*sub \$0x2,%ebx 40: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 44: 0d 45 00 00 00 [ ]*or \$0x45,%eax 45: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 49: 81 cb 4b 00 00 00 [ ]*or \$0x4b,%ebx 4b: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 4f: 0d 01 00 00 00 [ ]*or \$0x1,%eax 50: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 54: 81 cb 02 00 00 00 [ ]*or \$0x2,%ebx 56: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5a: b8 5b 00 00 00 [ ]*mov \$0x5b,%eax 5b: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5f: bb 60 00 00 00 [ ]*mov \$0x60,%ebx 60: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 64: b8 01 00 00 00 [ ]*mov \$0x1,%eax 65: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 69: bb 01 00 00 00 [ ]*mov \$0x1,%ebx 6a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 6e: c7 05 00 00 00 00 74 00 00 00 [ ]*movl \$0x74,0x0 70: (R_386_)?(dir)?32 foo ++[ ]*74: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 78: 65 c7 05 00 00 00 00 7f 00 00 00 [ ]*movl \$0x7f,%gs:0x0 7b: (R_386_)?(dir)?32 foo ++[ ]*7f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 83: 65 c7 05 00 00 00 00 8a 00 00 00 [ ]*movl \$0x8a,%gs:0x0 86: (R_386_)?(dir)?32 foo ++[ ]*8a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 8e: c7 05 02 00 00 00 94 00 00 00 [ ]*movl \$0x94,0x2 90: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++[ ]*94: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 98: a1 99 00 00 00 [ ]*mov 0x99,%eax 99: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 9d: 8b 1d 9f 00 00 00 [ ]*mov 0x9f,%ebx 9f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ a3: a3 a4 00 00 00 [ ]*mov %eax,0xa4 a4: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ a8: 89 1d aa 00 00 00 [ ]*mov %ebx,0xaa aa: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ ae: 65 a3 b0 00 00 00 [ ]*mov %eax,%gs:0xb0 b0: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ b4: 65 89 1d b7 00 00 00 [ ]*mov %ebx,%gs:0xb7 b7: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ bb: 65 a3 bd 00 00 00 [ ]*mov %eax,%gs:0xbd bd: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ c1: 65 89 1d c4 00 00 00 [ ]*mov %ebx,%gs:0xc4 c4: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ c8: 8d 83 00 00 00 00 [ ]*lea 0x0\(%ebx\),%eax ca: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ ce: 8d 9b 00 00 00 00 [ ]*lea 0x0\(%ebx\),%ebx d0: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ d4: 8b 83 00 00 00 00 [ ]*mov 0x0\(%ebx\),%eax d6: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ da: 8b 9b 00 00 00 00 [ ]*mov 0x0\(%ebx\),%ebx dc: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ e0: e0 00 [ ]*loopne e2 e0: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ e2: 00 00 [ ]*add %al,\(%eax\) ++ e4: 00 00 [ ]*add %al,\(%eax\) e4: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ ... +--- binutils/gas/testsuite/gas/i386/i386.exp.jj 2002-07-18 11:35:39.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/i386.exp 2002-08-02 21:57:46.000000000 +0200 +@@ -53,6 +53,7 @@ if [expr ([istarget "i*86-*-*"] || [ist + run_dump_test "jump" + run_dump_test "ssemmx2" + run_dump_test "sse2" ++ run_dump_test "gotpc" + + # PIC is only supported on ELF targets. + if { ([istarget "*-*-elf*"] || [istarget "*-*-linux*"] ) + diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch new file mode 100644 index 0000000..511a11e --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch @@ -0,0 +1,27 @@ +2002-08-07 Jakub Jelinek + + * elf32-i386.c (elf_i386_relocate_section): Fill in proper addend + for R_386_TLS_TPOFF32 relocs against symndx 0. + +--- binutils/bfd/elf32-i386.c.jj 2002-07-30 16:14:55.000000000 +0200 ++++ binutils/bfd/elf32-i386.c 2002-08-07 23:41:48.000000000 +0200 +@@ -2561,13 +2567,17 @@ elf_i386_relocate_section (output_bfd, i + outrel.r_offset = (htab->sgot->output_section->vma + + htab->sgot->output_offset + off); + +- bfd_put_32 (output_bfd, 0, +- htab->sgot->contents + off); + indx = h && h->dynindx != -1 ? h->dynindx : 0; + if (r_type == R_386_TLS_GD) + dr_type = R_386_TLS_DTPMOD32; + else + dr_type = R_386_TLS_TPOFF32; ++ if (dr_type == R_386_TLS_TPOFF32 && indx == 0) ++ bfd_put_32 (output_bfd, relocation - dtpoff_base (info), ++ htab->sgot->contents + off); ++ else ++ bfd_put_32 (output_bfd, 0, ++ htab->sgot->contents + off); + outrel.r_info = ELF32_R_INFO (indx, dr_type); + loc = (Elf32_External_Rel *) htab->srelgot->contents; + loc += htab->srelgot->reloc_count++; diff --git a/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch new file mode 100644 index 0000000..ec701ce --- /dev/null +++ b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch @@ -0,0 +1,11 @@ +--- orig/Makefile.in 2004-05-12 18:22:30.000000000 -0700 ++++ binutils-2.14.90.0.5/Makefile.in 2004-05-12 18:26:19.000000000 -0700 +@@ -24384,6 +24384,8 @@ + # Demangler depends on libiberty. + configure-demangler: maybe-configure-libiberty + all-demangler: maybe-all-libiberty ++configure-build-demangler: maybe-configure-build-libiberty ++all-build-demangler: maybe-all-build-libiberty + + # The new demangler, which is included in libiberty, is written in C++. + # A working C++ compiler is required. For the target demangler, it may diff --git a/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch new file mode 100644 index 0000000..ca0f2ac --- /dev/null +++ b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch @@ -0,0 +1,38 @@ +Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700" + <3F28A15A.5010400@kegel.com> +References: <3F28A15A.5010400@kegel.com> +Date: Thu, 31 Jul 2003 21:47:38 +0900 +From: kaz Kojima + +Dan Kegel wrote: +>> I'll give binutils-2.14.90.0.5 a shot, then. +> +> No joy - same problem. Guess I'll take this up on binutils and/or libc-alpha. + +Please try the patch below, though it's a diff against the current +binutils CVS. + +Regards, + kaz +-- +diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c +--- src/bfd/elf32-sh.c.old Fri Jul 25 14:46:58 2003 ++++ src/bfd/elf32-sh.c Thu Jul 31 21:09:38 2003 +@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b + sreloc, 2)) + return FALSE; + } ++#if 0 + if (sec->flags & SEC_READONLY) + info->flags |= DF_TEXTREL; ++#endif + elf_section_data (sec)->sreloc = sreloc; + } + + + diff --git a/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch new file mode 100644 index 0000000..ec701ce --- /dev/null +++ b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch @@ -0,0 +1,11 @@ +--- orig/Makefile.in 2004-05-12 18:22:30.000000000 -0700 ++++ binutils-2.14.90.0.5/Makefile.in 2004-05-12 18:26:19.000000000 -0700 +@@ -24384,6 +24384,8 @@ + # Demangler depends on libiberty. + configure-demangler: maybe-configure-libiberty + all-demangler: maybe-all-libiberty ++configure-build-demangler: maybe-configure-build-libiberty ++all-build-demangler: maybe-all-build-libiberty + + # The new demangler, which is included in libiberty, is written in C++. + # A working C++ compiler is required. For the target demangler, it may diff --git a/patches/binutils/2.14.92/binutils-skip-comments.patch b/patches/binutils/2.14.92/binutils-skip-comments.patch new file mode 100644 index 0000000..804a17e --- /dev/null +++ b/patches/binutils/2.14.92/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.14.92/gccpr15247-fix.patch b/patches/binutils/2.14.92/gccpr15247-fix.patch new file mode 100644 index 0000000..967bf7f --- /dev/null +++ b/patches/binutils/2.14.92/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.14/binutils-sh-relocs.patch b/patches/binutils/2.14/binutils-sh-relocs.patch new file mode 100644 index 0000000..ca0f2ac --- /dev/null +++ b/patches/binutils/2.14/binutils-sh-relocs.patch @@ -0,0 +1,38 @@ +Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700" + <3F28A15A.5010400@kegel.com> +References: <3F28A15A.5010400@kegel.com> +Date: Thu, 31 Jul 2003 21:47:38 +0900 +From: kaz Kojima + +Dan Kegel wrote: +>> I'll give binutils-2.14.90.0.5 a shot, then. +> +> No joy - same problem. Guess I'll take this up on binutils and/or libc-alpha. + +Please try the patch below, though it's a diff against the current +binutils CVS. + +Regards, + kaz +-- +diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c +--- src/bfd/elf32-sh.c.old Fri Jul 25 14:46:58 2003 ++++ src/bfd/elf32-sh.c Thu Jul 31 21:09:38 2003 +@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b + sreloc, 2)) + return FALSE; + } ++#if 0 + if (sec->flags & SEC_READONLY) + info->flags |= DF_TEXTREL; ++#endif + elf_section_data (sec)->sreloc = sreloc; + } + + + diff --git a/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch new file mode 100644 index 0000000..97fa6ee --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch new file mode 100644 index 0000000..03f6453 --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch @@ -0,0 +1,74 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +2004-08-20 Daniel Jacobowitz + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. + +Index: elflink.c +=================================================================== +RCS file: /big/fsf/rsync/src-cvs/src/bfd/elflink.c,v +retrieving revision 1.97 +diff -u -p -r1.97 elflink.c +--- binutils/bfd/elflink.c 18 Aug 2004 02:45:42 -0000 1.97 ++++ binutils/bfd/elflink.c 21 Aug 2004 00:59:08 -0000 +@@ -9366,6 +9366,36 @@ _bfd_elf_section_already_linked (bfd *ab + (_("%B: duplicate section `%A' has different size\n"), + abfd, sec); + break; ++ ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ abfd, sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ abfd, sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ l->sec->owner, l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ abfd, sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section + diff --git a/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch new file mode 100644 index 0000000..804a17e --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch new file mode 100644 index 0000000..967bf7f --- /dev/null +++ b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch new file mode 100644 index 0000000..97fa6ee --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch new file mode 100644 index 0000000..4e4934d --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch @@ -0,0 +1,68 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +[ rediffed against binutils-2.15.91.0.2, with some elbow grease ] + +2004-08-20 Daniel Jacobowitz + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. +--- binutils-2.15.91.0.2/bfd/elflink.c.old 2004-07-27 21:36:08.000000000 -0700 ++++ binutils-2.15.91.0.2/bfd/elflink.c 2004-08-26 06:38:07.000000000 -0700 +@@ -9359,6 +9359,35 @@ + (_("%s: %s: warning: duplicate section `%s' has different size\n"), + bfd_archive_filename (abfd), name); + break; ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename(l->sec->owner), l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ bfd_archive_filename (abfd), sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section diff --git a/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch new file mode 100644 index 0000000..804a17e --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15/002-uclibc.patch b/patches/binutils/2.15/002-uclibc.patch new file mode 100644 index 0000000..c64e74f --- /dev/null +++ b/patches/binutils/2.15/002-uclibc.patch @@ -0,0 +1,144 @@ +diff -uNr binutils-2.15-pristine/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-pristine/bfd/configure 2004-05-17 12:35:57.000000000 -0700 ++++ binutils-2.15/bfd/configure 2004-07-19 16:36:19.000000000 -0700 +@@ -1009,7 +1009,7 @@ + bfd_version_string="\"${VERSION}\"" + if test x${is_release} = x; then + bfd_version_date=`sed -n -e 's/.*DATE //p' < ${srcdir}/version.h` +- bfd_version_string="\"${VERSION} ${bfd_version_date}\"" ++ bfd_version_string="\"${VERSION} ${bfd_version_date} uClibc\"" + fi + + +diff -uNr binutils-2.15-pristine/bfd/elf32-arm.h binutils-2.15/bfd/elf32-arm.h +--- binutils-2.15-pristine/bfd/elf32-arm.h 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-arm.h 2004-07-19 16:37:06.000000000 -0700 +@@ -124,7 +124,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + #ifdef FOUR_WORD_PLT + +diff -uNr binutils-2.15-pristine/bfd/elf32-cris.c binutils-2.15/bfd/elf32-cris.c +--- binutils-2.15-pristine/bfd/elf32-cris.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-cris.c 2004-07-19 16:49:59.000000000 -0700 +@@ -536,7 +536,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + +diff -uNr binutils-2.15-pristine/bfd/elf32-frv.c binutils-2.15/bfd/elf32-frv.c +--- binutils-2.15-pristine/bfd/elf32-frv.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-frv.c 2004-07-19 16:49:59.000000000 -0700 +@@ -2913,7 +2913,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + #define DEFAULT_STACK_SIZE 0x20000 + +diff -uNr binutils-2.15-pristine/bfd/elf32-hppa.c binutils-2.15/bfd/elf32-hppa.c +--- binutils-2.15-pristine/bfd/elf32-hppa.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-hppa.c 2004-07-19 16:49:59.000000000 -0700 +@@ -115,7 +115,7 @@ + + #define PLT_ENTRY_SIZE 8 + #define GOT_ENTRY_SIZE 4 +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + static const bfd_byte plt_stub[] = + { +diff -uNr binutils-2.15-pristine/bfd/elf32-ppc.c binutils-2.15/bfd/elf32-ppc.c +--- binutils-2.15-pristine/bfd/elf32-ppc.c 2004-05-17 12:35:59.000000000 -0700 ++++ binutils-2.15/bfd/elf32-ppc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -49,7 +49,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 12 +diff -uNr binutils-2.15-pristine/bfd/elf32-s390.c binutils-2.15/bfd/elf32-s390.c +--- binutils-2.15-pristine/bfd/elf32-s390.c 2004-05-17 12:35:59.000000000 -0700 ++++ binutils-2.15/bfd/elf32-s390.c 2004-07-19 16:49:59.000000000 -0700 +@@ -452,7 +452,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid + copying dynamic variables from a shared lib into an app's dynbss +diff -uNr binutils-2.15-pristine/bfd/elf32-sparc.c binutils-2.15/bfd/elf32-sparc.c +--- binutils-2.15-pristine/bfd/elf32-sparc.c 2004-05-17 12:36:00.000000000 -0700 ++++ binutils-2.15/bfd/elf32-sparc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -536,7 +536,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The nop opcode we use. */ + +diff -uNr binutils-2.15-pristine/bfd/elf64-ppc.c binutils-2.15/bfd/elf64-ppc.c +--- binutils-2.15-pristine/bfd/elf64-ppc.c 2004-05-17 12:36:01.000000000 -0700 ++++ binutils-2.15/bfd/elf64-ppc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -99,7 +99,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 24 +diff -uNr binutils-2.15-pristine/bfd/elf64-s390.c binutils-2.15/bfd/elf64-s390.c +--- binutils-2.15-pristine/bfd/elf64-s390.c 2004-05-17 12:36:01.000000000 -0700 ++++ binutils-2.15/bfd/elf64-s390.c 2004-07-19 16:49:59.000000000 -0700 +@@ -473,7 +473,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid + copying dynamic variables from a shared lib into an app's dynbss +diff -uNr binutils-2.15-pristine/bfd/elf-m10300.c binutils-2.15/bfd/elf-m10300.c +--- binutils-2.15-pristine/bfd/elf-m10300.c 2004-05-17 12:35:57.000000000 -0700 ++++ binutils-2.15/bfd/elf-m10300.c 2004-07-19 16:49:59.000000000 -0700 +@@ -4026,7 +4026,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* Create dynamic sections when linking against a dynamic object. */ + +diff -uNr binutils-2.15-pristine/bfd/elfxx-ia64.c binutils-2.15/bfd/elfxx-ia64.c +--- binutils-2.15-pristine/bfd/elfxx-ia64.c 2004-05-17 12:36:02.000000000 -0700 ++++ binutils-2.15/bfd/elfxx-ia64.c 2004-07-19 16:49:59.000000000 -0700 +@@ -643,7 +643,7 @@ + 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ + }; + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + static const bfd_byte oor_brl[16] = + { diff --git a/patches/binutils/2.15/100-uclibc-conf.patch b/patches/binutils/2.15/100-uclibc-conf.patch new file mode 100644 index 0000000..1c7fa4a --- /dev/null +++ b/patches/binutils/2.15/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15-dist/bfd/config.bfd binutils-2.15/bfd/config.bfd +--- binutils-2.15-dist/bfd/config.bfd 2004-05-17 14:35:56.000000000 -0500 ++++ binutils-2.15/bfd/config.bfd 2004-08-04 12:01:44.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15-dist/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-dist/bfd/configure 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/bfd/configure.in binutils-2.15/bfd/configure.in +--- binutils-2.15-dist/bfd/configure.in 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/binutils/configure binutils-2.15/binutils/configure +--- binutils-2.15-dist/binutils/configure 2004-01-02 11:08:04.000000000 -0600 ++++ binutils-2.15/binutils/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1585,6 +1585,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/configure binutils-2.15/configure +--- binutils-2.15-dist/configure 2004-05-17 14:36:20.000000000 -0500 ++++ binutils-2.15/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/configure.in binutils-2.15/configure.in +--- binutils-2.15-dist/configure.in 2004-05-17 14:40:54.000000000 -0500 ++++ binutils-2.15/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/gas/configure binutils-2.15/gas/configure +--- binutils-2.15-dist/gas/configure 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure 2004-08-04 12:07:50.000000000 -0500 +@@ -3400,6 +3400,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4224,6 +4229,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4240,6 +4246,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4253,6 +4260,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4310,7 +4318,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4370,6 +4380,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4397,6 +4408,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4459,6 +4471,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4486,7 +4499,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4519,6 +4534,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gas/configure.in binutils-2.15/gas/configure.in +--- binutils-2.15-dist/gas/configure.in 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure.in 2004-08-04 12:07:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gprof/configure binutils-2.15/gprof/configure +--- binutils-2.15-dist/gprof/configure 2003-08-26 12:19:19.000000000 -0500 ++++ binutils-2.15/gprof/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1581,6 +1581,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure binutils-2.15/ld/configure +--- binutils-2.15-dist/ld/configure 2003-04-24 07:36:07.000000000 -0500 ++++ binutils-2.15/ld/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1589,6 +1589,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure.tgt binutils-2.15/ld/configure.tgt +--- binutils-2.15-dist/ld/configure.tgt 2004-05-17 14:36:15.000000000 -0500 ++++ binutils-2.15/ld/configure.tgt 2004-08-04 12:01:45.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -364,7 +374,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -381,9 +392,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -396,6 +407,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15-dist/libtool.m4 binutils-2.15/libtool.m4 +--- binutils-2.15-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ binutils-2.15/libtool.m4 2004-08-04 12:01:45.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15-dist/ltconfig binutils-2.15/ltconfig +--- binutils-2.15-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ binutils-2.15/ltconfig 2004-08-04 12:01:45.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15-dist/opcodes/configure binutils-2.15/opcodes/configure +--- binutils-2.15-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ binutils-2.15/opcodes/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/binutils/2.15/210-cflags.patch b/patches/binutils/2.15/210-cflags.patch new file mode 100644 index 0000000..dc67d3c --- /dev/null +++ b/patches/binutils/2.15/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch new file mode 100644 index 0000000..e07a7e8 --- /dev/null +++ b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch @@ -0,0 +1,26 @@ +--- binutils/bfd/elf32-mips.c~ ++++ binutils/bfd/elf32-mips.c +@@ -1611,7 +1611,9 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++/*#define ELF_MAXPAGESIZE 0x10000*/ ++/* Use 4K to shrink the elf header. NOT for general use! */ ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ +--- binutils/bfd/elfn32-mips.c~ ++++ binutils/bfd/elfn32-mips.c +@@ -1976,7 +1976,9 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++/*#define ELF_MAXPAGESIZE 0x10000*/ ++/* Use 4K to shrink the elf header. NOT for general use! */ ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ diff --git a/patches/binutils/2.15/600-arm-textrel.patch b/patches/binutils/2.15/600-arm-textrel.patch new file mode 100644 index 0000000..73d5b9d --- /dev/null +++ b/patches/binutils/2.15/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/patches/binutils/2.15/bfd-hash-tweak.patch b/patches/binutils/2.15/bfd-hash-tweak.patch new file mode 100644 index 0000000..6b8fc41 --- /dev/null +++ b/patches/binutils/2.15/bfd-hash-tweak.patch @@ -0,0 +1,24 @@ +Signed-off-by: dank@kegel.com + +Raising the size of the hash table is a noticable win when linking +at least one large app. + +There was a patch, +http://sources.redhat.com/ml/binutils/2004-06/msg00165.html +to do this dynamically. No idea why that didn't make it in. +So this tiny change to raise the default size is just +a stopgap for now. + + +--- binutils-2.15/bfd/hash.c.old 2003-12-01 01:33:01.000000000 -0500 ++++ binutils-2.15/bfd/hash.c 2006-03-01 16:26:26.701991000 -0500 +@@ -295,7 +295,7 @@ + */ + + /* The default number of entries to use when creating a hash table. */ +-#define DEFAULT_SIZE (4051) ++#define DEFAULT_SIZE (32749) + + /* Create a new hash table, given a number of entries. */ + + diff --git a/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch new file mode 100644 index 0000000..26e5a12 --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch @@ -0,0 +1,75 @@ +Fix found here: http://www.freelists.org/archives/openbeos/11-2005/msg00090.html + +Fixes: +In file included from ./targ-cpu.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/obj-elf.h:42, + from ./obj-format.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/te-linux.h:4, + from ./targ-env.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/as.h:626, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/app.c:30: +/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/tc-i386.h:451: error: array type has incomplete element type +make[3]: *** [app.o] Error 1 +make[3]: Leaving directory `/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-binutils/gas' + +when building binutils-2.15 with gcc-4.0 + + +diff -ur binutils-2.15.old/gas/as.h binutils-2.15/gas/as.h +--- binutils-2.15.old/gas/as.h 2003-11-22 18:14:21.000000000 -0800 ++++ binutils-2.15/gas/as.h 2006-02-14 22:05:35.000000000 -0800 +@@ -605,7 +605,26 @@ + struct expressionS; + struct fix; + typedef struct symbol symbolS; +-struct relax_type; ++ ++/* JF moved this here from as.h under the theory that nobody except MACHINE.c ++ and write.c care about it anyway. */ ++/* [zooey]: the above no longer holds with gcc4, as it keeps bugging about ++ incomplete element types in arrays, if relax_type isn't defined ++ here. So I moved the definition back from tc.h to here. */ ++struct relax_type ++{ ++ /* Forward reach. Signed number. > 0. */ ++ long rlx_forward; ++ /* Backward reach. Signed number. < 0. */ ++ long rlx_backward; ++ ++ /* Bytes length of this address. */ ++ unsigned char rlx_length; ++ ++ /* Next longer relax-state. 0 means there is no 'next' relax-state. */ ++ relax_substateT rlx_more; ++}; ++ + typedef struct frag fragS; + + #ifdef BFD_ASSEMBLER +diff -ur binutils-2.15.old/gas/tc.h binutils-2.15/gas/tc.h +--- binutils-2.15.old/gas/tc.h 2003-12-03 15:39:38.000000000 -0800 ++++ binutils-2.15/gas/tc.h 2006-02-14 22:03:35.000000000 -0800 +@@ -24,23 +24,6 @@ + + extern const pseudo_typeS md_pseudo_table[]; + +-/* JF moved this here from as.h under the theory that nobody except MACHINE.c +- and write.c care about it anyway. */ +- +-struct relax_type +-{ +- /* Forward reach. Signed number. > 0. */ +- long rlx_forward; +- /* Backward reach. Signed number. < 0. */ +- long rlx_backward; +- +- /* Bytes length of this address. */ +- unsigned char rlx_length; +- +- /* Next longer relax-state. 0 means there is no 'next' relax-state. */ +- relax_substateT rlx_more; +-}; +- + typedef struct relax_type relax_typeS; + + extern const int md_reloc_size; /* Size of a relocation record */ diff --git a/patches/binutils/2.15/binutils-2.15-psignal.patch b/patches/binutils/2.15/binutils-2.15-psignal.patch new file mode 100644 index 0000000..98fa600 --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-psignal.patch @@ -0,0 +1,40 @@ +Make psignal prototype in libiberty match that in glibc. + +Fixes: + +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal': +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned +mprotect... make[1]: *** [strsignal.o] Error 1 +make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty' +make: *** [all-libiberty] Error 2 + +when building on red hat 7.1 +though it's a bit of a mystery why libiberty's psignal is being compiled at +all, since red hat 7.1's glibc supports psignal (hence the error message) + +--- binutils-2.15/libiberty/strsignal.c.old 2005-04-18 13:57:40.000000000 -0700 ++++ binutils-2.15/libiberty/strsignal.c 2005-04-18 13:59:09.000000000 -0700 +@@ -544,7 +544,7 @@ + + /* + +-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message}) ++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message}) + + Print @var{message} to the standard error, followed by a colon, + followed by the description of the signal specified by @var{signo}, +@@ -557,9 +557,7 @@ + #ifndef HAVE_PSIGNAL + + void +-psignal (signo, message) +- unsigned signo; +- char *message; ++psignal (int signo, const char *message) + { + if (signal_names == NULL) + { diff --git a/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch new file mode 100644 index 0000000..5fe3623 --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch @@ -0,0 +1,22 @@ +See http://sources.redhat.com/ml/binutils/2004-06/msg00114.html + +--- src/bfd/elflink.c.org 2004-07-05 09:11:42.920597000 -0400 ++++ src/bfd/elflink.c 2004-07-05 09:12:59.240847000 -0400 +@@ -2700,7 +2700,7 @@ + return vdiff > 0 ? 1 : -1; + else + { +- long sdiff = h1->root.u.def.section - h2->root.u.def.section; ++ long sdiff = h1->root.u.def.section->id - h2->root.u.def.section->id; + if (sdiff != 0) + return sdiff > 0 ? 1 : -1; + } +@@ -3954,7 +3954,7 @@ + i = idx + 1; + else + { +- long sdiff = slook - h->root.u.def.section; ++ long sdiff = slook->id - h->root.u.def.section->id; + if (sdiff < 0) + j = idx; + else if (sdiff > 0) diff --git a/patches/binutils/2.15/binutils-2.15-vmx.patch b/patches/binutils/2.15/binutils-2.15-vmx.patch new file mode 100644 index 0000000..5ae9efe --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-vmx.patch @@ -0,0 +1,45 @@ +Grabbed with +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/opcodes/ppc-opc.c.diff?r1=1.70&r2=1.71&cvsroot=src' +See +http://mail.gnu.org/archive/html/bug-binutils/2004-05/msg00071.html +and +http://sources.redhat.com/ml/binutils-cvs/2004-05/msg00111.html + +This fixes problems like +{standard input}: Assembler messages: +{standard input}:1: Error: Unrecognized opcode: `dssall' +which show up in binutils-2.15 when building the Linux kernel, +or possibly failed compilations when building setjmp/longjmp in glibc. + +An alternative fix would be to pass -many to the assembler. +A patch to do that for glibc is at +wget 'http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2004-05&msgid=40B36E8C.9030609%40us.ibm.com' +Yet another, better, fix would be for gcc to generate assembly +that told the assembler which processor type to use. +Presumably the Linux kernel sources would need a fix, too. +Probably better to just fix binutils to accept sources that it used to. + + +=================================================================== +RCS file: /cvs/src/src/opcodes/ppc-opc.c,v +retrieving revision 1.70 +retrieving revision 1.71 +diff -u -r1.70 -r1.71 +--- src/opcodes/ppc-opc.c 2004/05/05 13:43:36 1.70 ++++ src/opcodes/ppc-opc.c 2004/05/19 05:11:48 1.71 +@@ -1004,8 +1004,13 @@ + + /* If only one bit of the FXM field is set, we can use the new form + of the instruction, which is faster. Unlike the Power4 branch hint +- encoding, this is not backward compatible. */ +- else if ((dialect & PPC_OPCODE_POWER4) != 0 && (value & -value) == value) ++ encoding, this is not backward compatible. Do not generate the ++ new form unless -mpower4 has been given, or -many and the two ++ operand form of mfcr was used. */ ++ else if ((value & -value) == value ++ && ((dialect & PPC_OPCODE_POWER4) != 0 ++ || ((dialect & PPC_OPCODE_ANY) != 0 ++ && (insn & (0x3ff << 1)) == 19 << 1))) + insn |= 1 << 20; + + /* Any other value on mfcr is an error. */ diff --git a/patches/binutils/2.15/binutils-arm-undef-imm.patch b/patches/binutils/2.15/binutils-arm-undef-imm.patch new file mode 100644 index 0000000..6bf403c --- /dev/null +++ b/patches/binutils/2.15/binutils-arm-undef-imm.patch @@ -0,0 +1,51 @@ +From http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/gas/config/tc-arm.c.diff?r1=1.168&r2=1.169&cvsroot=src +See also http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-July/023128.html, +"[CRITICAL PATCH] 2.6: fix silent build error]" + +Revision 1.169, Fri Jul 2 11:12:29 2004 UTC (19 hours, 4 minutes ago) by nickc +Branch: MAIN +CVS Tags: binutils_latest_snapshot, HEAD +Changes since 1.168: +14 -1 lines + +(md_apply_fix3:BFD_RELOC_ARM_IMMEDIATE): Do not allow values which have come +from undefined symbols. +Always consider this fixup to have been processed as a reloc cannot be +generated for it. + + +=================================================================== +RCS file: /cvs/src/src/gas/config/tc-arm.c,v +retrieving revision 1.168 +retrieving revision 1.169 +diff -u -r1.168 -r1.169 +--- src/gas/config/tc-arm.c 2004/04/30 10:51:12 1.168 ++++ src/gas/config/tc-arm.c 2004/07/02 11:12:29 1.169 +@@ -12186,6 +12186,20 @@ + switch (fixP->fx_r_type) + { + case BFD_RELOC_ARM_IMMEDIATE: ++ /* We claim that this fixup has been processed here, ++ even if in fact we generate an error because we do ++ not have a reloc for it, so tc_gen_reloc will reject it. */ ++ fixP->fx_done = 1; ++ ++ if (fixP->fx_addsy ++ && ! S_IS_DEFINED (fixP->fx_addsy)) ++ { ++ as_bad_where (fixP->fx_file, fixP->fx_line, ++ _("undefined symbol %s used as an immediate value"), ++ S_GET_NAME (fixP->fx_addsy)); ++ break; ++ } ++ + newimm = validate_immediate (value); + temp = md_chars_to_number (buf, INSN_SIZE); + +@@ -12202,7 +12216,6 @@ + + newimm |= (temp & 0xfffff000); + md_number_to_chars (buf, (valueT) newimm, INSN_SIZE); +- fixP->fx_done = 1; + break; + + case BFD_RELOC_ARM_ADRL_IMMEDIATE: diff --git a/patches/binutils/2.15/binutils-skip-comments.patch b/patches/binutils/2.15/binutils-skip-comments.patch new file mode 100644 index 0000000..804a17e --- /dev/null +++ b/patches/binutils/2.15/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15/cross-gprof.patch b/patches/binutils/2.15/cross-gprof.patch new file mode 100644 index 0000000..ea6c18f --- /dev/null +++ b/patches/binutils/2.15/cross-gprof.patch @@ -0,0 +1,22 @@ +--- binutils-2.15/configure.old 2004-07-21 21:36:47.000000000 -0700 ++++ binutils-2.15/configure 2004-07-21 21:37:08.000000000 -0700 +@@ -999,7 +999,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +--- binutils-2.15/configure.in.old 2004-07-21 21:37:19.000000000 -0700 ++++ binutils-2.15/configure.in 2004-07-21 21:37:34.000000000 -0700 +@@ -236,7 +236,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. diff --git a/patches/binutils/2.15/gccpr15247-fix.patch b/patches/binutils/2.15/gccpr15247-fix.patch new file mode 100644 index 0000000..967bf7f --- /dev/null +++ b/patches/binutils/2.15/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.15/ld-2.15-callahan.patch b/patches/binutils/2.15/ld-2.15-callahan.patch new file mode 100644 index 0000000..bb4a69c --- /dev/null +++ b/patches/binutils/2.15/ld-2.15-callahan.patch @@ -0,0 +1,677 @@ +Signed-off-by: dank@kegel.com +Fixes ld speed issue. +See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html +See thread "Re: optimizations for 3x speedup in ld", +http://sources.redhat.com/ml/binutils/2005-03/msg00847.html + +Wildcard section matching enhancement, backported from the binutils CVS tree. +Here's the CVS log comment from the original change to ldlang.c: + +revision 1.177 +date: 2005/04/06 15:33:02; author: jakub; state: Exp; lines: +438 -51 +2005-04-06 Jakub Jelinek + + * ldlang.c: Formatting. + (walk_wild_consider_section): Remember return value from wildcardp. + (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen. + (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen. + +2005-04-06 Robert O'Callahan + + * ld.h (lean_section_userdata_type): Remove. + (fat_section_userdata_type): Remove file field. + (SECTION_USERDATA_SIZE): Remove. + * ldlang.c (init_os): Eliminate initialization of unused + lean_section_userdata_type. + + * ldlang.h (callback_t, walk_wild_section_handler_t): New + typedefs. + (struct lang_wild_statement_struct): Add walk_wild_section_handler + and handler_data fields. + * ldlang.c (callback_t): Removed. + (walk_wild_consider_section, walk_wild_section_general, + section_iterator_callback, find_section, is_simple_wild, + match_simple_wild, walk_wild_section_specs1_wild0, + walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1, + walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2, + wild_spec_can_overlap, analyze_walk_wild_section_handler): New + functions. + (lang_add_wild): Call analyze_walk_wild_section_handler. + (walk_wild_section): Renamed to walk_wild_section_general and + created a wrapper function. + (section_iterator_callback_data): New typedef. + +Note that bfd_get_section_by_name_if didn't exist in 2.15, so it was backported +as well. + +--- binutils-2.15/bfd/bfd-in2.h.old 2004-05-17 15:35:56.000000000 -0400 ++++ binutils-2.15/bfd/bfd-in2.h 2006-02-09 11:54:45.989940000 -0500 +@@ -1425,6 +1425,10 @@ + + asection *bfd_get_section_by_name (bfd *abfd, const char *name); + ++asection *bfd_get_section_by_name_if (bfd *abfd, const char *name, ++ bfd_boolean (*operation) (bfd *, asection *, void *), ++ void *user_storage); ++ + char *bfd_get_unique_section_name + (bfd *abfd, const char *templat, int *count); + +--- binutils-2.15/bfd/section.c.old 2003-12-01 01:33:01.000000000 -0500 ++++ binutils-2.15/bfd/section.c 2006-01-23 14:16:54.768993000 -0500 +@@ -801,6 +801,57 @@ + + /* + FUNCTION ++ bfd_get_section_by_name_if ++ ++SYNOPSIS ++ asection *bfd_get_section_by_name_if ++ (bfd *abfd, ++ const char *name, ++ bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj), ++ void *obj); ++ ++DESCRIPTION ++ Call the provided function @var{func} for each section ++ attached to the BFD @var{abfd} whose name matches @var{name}, ++ passing @var{obj} as an argument. The function will be called ++ as if by ++ ++| func (abfd, the_section, obj); ++ ++ It returns the first section for which @var{func} returns true, ++ otherwise <>. ++ ++*/ ++ ++asection * ++bfd_get_section_by_name_if (bfd *abfd, const char *name, ++ bfd_boolean (*operation) (bfd *, ++ asection *, ++ void *), ++ void *user_storage) ++{ ++ struct section_hash_entry *sh; ++ unsigned long hash; ++ ++ sh = section_hash_lookup (&abfd->section_htab, name, FALSE, FALSE); ++ if (sh == NULL) ++ return NULL; ++ ++ hash = sh->root.hash; ++ do ++ { ++ if ((*operation) (abfd, &sh->section, user_storage)) ++ return &sh->section; ++ sh = (struct section_hash_entry *) sh->root.next; ++ } ++ while (sh != NULL && sh->root.hash == hash ++ && strcmp (sh->root.string, name) == 0); ++ ++ return NULL; ++} ++ ++/* ++FUNCTION + bfd_get_unique_section_name + + SYNOPSIS +--- binutils-2.15/ld/ldlang.c.old 2004-05-17 15:36:16.000000000 -0400 ++++ binutils-2.15/ld/ldlang.c 2006-01-23 13:40:12.745499000 -0500 +@@ -81,9 +81,6 @@ + static void lang_record_phdrs (void); + static void lang_do_version_exports_section (void); + +-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, +- asection *, lang_input_statement_type *, void *); +- + /* Exported variables. */ + lang_output_section_statement_type *abs_output_section; + lang_statement_list_type lang_output_section_statement; +@@ -138,21 +135,71 @@ + + /* Generic traversal routines for finding matching sections. */ + ++/* Try processing a section against a wildcard. This just calls ++ the callback unless the filename exclusion list is present ++ and excludes the file. It's hardly ever present so this ++ function is very fast. */ ++ ++static void ++walk_wild_consider_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ asection *s, ++ struct wildcard_list *sec, ++ callback_t callback, ++ void *data) ++{ ++ bfd_boolean skip = FALSE; ++ struct name_list *list_tmp; ++ ++ /* Don't process sections from files which were ++ excluded. */ ++ for (list_tmp = sec->spec.exclude_name_list; ++ list_tmp; ++ list_tmp = list_tmp->next) ++ { ++ bfd_boolean is_wildcard = wildcardp (list_tmp->name); ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, file->filename, 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, file->filename) == 0; ++ ++ /* If this file is part of an archive, and the archive is ++ excluded, exclude this file. */ ++ if (! skip && file->the_bfd != NULL ++ && file->the_bfd->my_archive != NULL ++ && file->the_bfd->my_archive->filename != NULL) ++ { ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, ++ file->the_bfd->my_archive->filename, ++ 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, ++ file->the_bfd->my_archive->filename) == 0; ++ } ++ ++ if (skip) ++ break; ++ } ++ ++ if (!skip) ++ (*callback) (ptr, sec, s, file, data); ++} ++ ++/* Lowest common denominator routine that can handle everything correctly, ++ but slowly. */ ++ + static void +-walk_wild_section (lang_wild_statement_type *ptr, +- lang_input_statement_type *file, +- callback_t callback, +- void *data) ++walk_wild_section_general (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) + { + asection *s; +- +- if (file->just_syms_flag) +- return; ++ struct wildcard_list *sec; + + for (s = file->the_bfd->sections; s != NULL; s = s->next) + { +- struct wildcard_list *sec; +- + sec = ptr->section_list; + if (sec == NULL) + (*callback) (ptr, sec, s, file, data); +@@ -160,39 +207,8 @@ + while (sec != NULL) + { + bfd_boolean skip = FALSE; +- struct name_list *list_tmp; +- +- /* Don't process sections from files which were +- excluded. */ +- for (list_tmp = sec->spec.exclude_name_list; +- list_tmp; +- list_tmp = list_tmp->next) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, file->filename, 0) == 0; +- else +- skip = strcmp (list_tmp->name, file->filename) == 0; +- +- /* If this file is part of an archive, and the archive is +- excluded, exclude this file. */ +- if (! skip && file->the_bfd != NULL +- && file->the_bfd->my_archive != NULL +- && file->the_bfd->my_archive->filename != NULL) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, +- file->the_bfd->my_archive->filename, +- 0) == 0; +- else +- skip = strcmp (list_tmp->name, +- file->the_bfd->my_archive->filename) == 0; +- } +- +- if (skip) +- break; +- } + +- if (!skip && sec->spec.name != NULL) ++ if (sec->spec.name != NULL) + { + const char *sname = bfd_get_section_name (file->the_bfd, s); + +@@ -203,13 +219,381 @@ + } + + if (!skip) +- (*callback) (ptr, sec, s, file, data); ++ walk_wild_consider_section (ptr, file, s, sec, callback, data); + + sec = sec->next; + } + } + } + ++/* Routines to find a single section given its name. If there's more ++ than one section with that name, we report that. */ ++ ++typedef struct ++{ ++ asection *found_section; ++ bfd_boolean multiple_sections_found; ++} section_iterator_callback_data; ++ ++static bfd_boolean ++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data) ++{ ++ section_iterator_callback_data *d = data; ++ ++ if (d->found_section != NULL) ++ { ++ d->multiple_sections_found = TRUE; ++ return TRUE; ++ } ++ ++ d->found_section = s; ++ return FALSE; ++} ++ ++static asection * ++find_section (lang_input_statement_type *file, ++ struct wildcard_list *sec, ++ bfd_boolean *multiple_sections_found) ++{ ++ section_iterator_callback_data cb_data = { NULL, FALSE }; ++ ++ bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, ++ section_iterator_callback, &cb_data); ++ *multiple_sections_found = cb_data.multiple_sections_found; ++ return cb_data.found_section; ++} ++ ++/* Code for handling simple wildcards without going through fnmatch, ++ which can be expensive because of charset translations etc. */ ++ ++/* A simple wild is a literal string followed by a single '*', ++ where the literal part is at least 4 characters long. */ ++ ++static bfd_boolean ++is_simple_wild (const char *name) ++{ ++ size_t len = strcspn (name, "*?["); ++ return len >= 4 && name[len] == '*' && name[len + 1] == '\0'; ++} ++ ++static bfd_boolean ++match_simple_wild (const char *pattern, const char *name) ++{ ++ /* The first four characters of the pattern are guaranteed valid ++ non-wildcard characters. So we can go faster. */ ++ if (pattern[0] != name[0] || pattern[1] != name[1] ++ || pattern[2] != name[2] || pattern[3] != name[3]) ++ return FALSE; ++ ++ pattern += 4; ++ name += 4; ++ while (*pattern != '*') ++ if (*name++ != *pattern++) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Specialized, optimized routines for handling different kinds of ++ wildcards */ ++ ++static void ++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ /* We can just do a hash lookup for the section with the right name. ++ But if that lookup discovers more than one section with the name ++ (should be rare), we fall back to the general algorithm because ++ we would otherwise have to sort the sections to make sure they ++ get processed in the bfd's order. */ ++ bfd_boolean multiple_sections_found; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ walk_wild_section_general (ptr, file, callback, data); ++ else if (s0) ++ walk_wild_consider_section (ptr, file, s0, sec0, callback, data); ++} ++ ++static void ++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *wildsec0 = ptr->handler_data[0]; ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec0, callback, data); ++ } ++} ++ ++static void ++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ /* Note that if the section was not found, s0 is NULL and ++ we'll simply never succeed the s == s0 test below. */ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ /* Recall that in this code path, a section cannot satisfy more ++ than one spec, so if s == s0 then it cannot match ++ wildspec1. */ ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, ++ data); ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, data); ++ else ++ { ++ skip = !match_simple_wild (wildsec2->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *sec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ struct wildcard_list *wildsec3 = ptr->handler_data[3]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1; ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ s1 = find_section (file, sec1, &multiple_sections_found); ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ if (s == s1) ++ walk_wild_consider_section (ptr, file, s, sec1, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec2->spec.name, ++ sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ else ++ { ++ skip = !match_simple_wild (wildsec3->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec3, ++ callback, data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ if (file->just_syms_flag) ++ return; ++ ++ (*ptr->walk_wild_section_handler) (ptr, file, callback, data); ++} ++ ++/* Returns TRUE when name1 is a wildcard spec that might match ++ something name2 can match. We're conservative: we return FALSE ++ only if the prefixes of name1 and name2 are different up to the ++ first wildcard character. */ ++ ++static bfd_boolean ++wild_spec_can_overlap (const char *name1, const char *name2) ++{ ++ size_t prefix1_len = strcspn (name1, "?*["); ++ size_t prefix2_len = strcspn (name2, "?*["); ++ size_t min_prefix_len; ++ ++ /* Note that if there is no wildcard character, then we treat the ++ terminating 0 as part of the prefix. Thus ".text" won't match ++ ".text." or ".text.*", for example. */ ++ if (name1[prefix1_len] == '\0') ++ prefix1_len++; ++ if (name2[prefix2_len] == '\0') ++ prefix2_len++; ++ ++ min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len; ++ ++ return memcmp (name1, name2, min_prefix_len) == 0; ++} ++ ++/* Select specialized code to handle various kinds of wildcard ++ statements. */ ++ ++static void ++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr) ++{ ++ int sec_count = 0; ++ int wild_name_count = 0; ++ struct wildcard_list *sec; ++ int signature; ++ int data_counter; ++ ++ ptr->walk_wild_section_handler = walk_wild_section_general; ++ ++ /* Count how many wildcard_specs there are, and how many of those ++ actually use wildcards in the name. Also, bail out if any of the ++ wildcard names are NULL. (Can this actually happen? ++ walk_wild_section used to test for it.) And bail out if any ++ of the wildcards are more complex than a simple string ++ ending in a single '*'. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ ++sec_count; ++ if (sec->spec.name == NULL) ++ return; ++ if (wildcardp (sec->spec.name)) ++ { ++ ++wild_name_count; ++ if (!is_simple_wild (sec->spec.name)) ++ return; ++ } ++ } ++ ++ /* The zero-spec case would be easy to optimize but it doesn't ++ happen in practice. Likewise, more than 4 specs doesn't ++ happen in practice. */ ++ if (sec_count == 0 || sec_count > 4) ++ return; ++ ++ /* Check that no two specs can match the same section. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ struct wildcard_list *sec2; ++ for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next) ++ { ++ if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name)) ++ return; ++ } ++ } ++ ++ signature = (sec_count << 8) + wild_name_count; ++ switch (signature) ++ { ++ case 0x0100: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0; ++ break; ++ case 0x0101: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1; ++ break; ++ case 0x0201: ++ ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1; ++ break; ++ case 0x0302: ++ ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2; ++ break; ++ case 0x0402: ++ ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2; ++ break; ++ default: ++ return; ++ } ++ ++ /* Now fill the data array with pointers to the specs, first the ++ specs with non-wildcard names, then the specs with wildcard ++ names. It's OK to process the specs in different order from the ++ given order, because we've already determined that no section ++ will match more than one spec. */ ++ data_counter = 0; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (!wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++} ++ + /* Handle a wild statement for a single file F. */ + + static void +@@ -4353,6 +4737,7 @@ + new->section_list = section_list; + new->keep_sections = keep_sections; + lang_list_init (&new->children); ++ analyze_walk_wild_section_handler (new); + } + + void +--- binutils-2.15/ld/ldlang.h.old 2004-05-17 15:36:16.000000000 -0400 ++++ binutils-2.15/ld/ldlang.h 2006-01-23 13:32:33.653292000 -0500 +@@ -295,7 +295,17 @@ + union lang_statement_union *file; + } lang_afile_asection_pair_statement_type; + +-typedef struct lang_wild_statement_struct ++typedef struct lang_wild_statement_struct lang_wild_statement_type; ++ ++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, ++ asection *, lang_input_statement_type *, void *); ++ ++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *, ++ lang_input_statement_type *, ++ callback_t callback, ++ void *data); ++ ++struct lang_wild_statement_struct + { + lang_statement_header_type header; + const char *filename; +@@ -303,7 +313,10 @@ + struct wildcard_list *section_list; + bfd_boolean keep_sections; + lang_statement_list_type children; +-} lang_wild_statement_type; ++ ++ walk_wild_section_handler_t walk_wild_section_handler; ++ struct wildcard_list *handler_data[4]; ++}; + + typedef struct lang_address_statement_struct + { diff --git a/patches/binutils/2.15/ld-2.15-stabs-tweak.patch b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch new file mode 100644 index 0000000..bd6ae7a --- /dev/null +++ b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch @@ -0,0 +1,33 @@ +Signed-off-by: dank@kegel.com + +See http://sourceware.org/ml/binutils/2005-12/msg00270.html +http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html + +STABS hash table size change, backported from the binutils CVS tree. Here's +the CVS log comment for the original change: + +revision 1.25 +date: 2005/12/29 10:29:23; author: nickc; state: Exp; lines: +2 -3 +(_bfd_link_section_stabs): Use bfd_hash_table_init rather than +bfd_hash_table_init_n(...,251) so that the size of the hash table can be +controlled by the user. + +Note that tunable hash table size changes were added after 2.15. The effect +of this change is to make bfd use its default hash table size for the stabs +hash as well. + + +--- binutils-2.15/bfd/stabs.c.old 2004-05-17 15:36:04.000000000 -0400 ++++ binutils-2.15/bfd/stabs.c 2006-02-09 15:21:56.567014000 -0500 +@@ -241,9 +241,8 @@ + goto error_return; + /* Make sure the first byte is zero. */ + (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); +- if (! bfd_hash_table_init_n (&sinfo->includes.root, +- stab_link_includes_newfunc, +- 251)) ++ if (! bfd_hash_table_init (&sinfo->includes.root, ++ stab_link_includes_newfunc)) + goto error_return; + sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); + sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING; diff --git a/patches/binutils/2.15/s390-invalid-insn-format.patch b/patches/binutils/2.15/s390-invalid-insn-format.patch new file mode 100644 index 0000000..3296201 --- /dev/null +++ b/patches/binutils/2.15/s390-invalid-insn-format.patch @@ -0,0 +1,42 @@ +Message-ID: <000801c48f60$cec16630$9103a8c0@ULOC5012> +From: "Michael Geiger" +To: +Subject: Patch for cross compiling s/390 kernel on linux host +Date: Tue, 31 Aug 2004 15:45:41 +0200 + +Dear Dan, + +I had big problems compiling a kernel for s/390 on my linux host - I tried +different chains from crosstool-0.28-rc34 and finally succeded with +gcc-3.3.4-glibc-2.3.2 after applying another patch to binutils-2.15 +(attached). +All compilations of the different kernel versions I tried stopped with +"Invalid .insn format" somewhere. I checked the recent cvs version of +binutils and applied the latest diff to gas/config/tc-s390.c and that solved +it. + +Greetings + +Michael Geiger + + +diff -u -r1.39 -r1.40 +--- src/gas/config/tc-s390.c 2004/05/06 11:01:48 1.39 ++++ src/gas/config/tc-s390.c 2004/06/15 12:38:08 1.40 +@@ -1596,13 +1596,13 @@ + if (exp.X_op == O_constant) + { + if ( ( opformat->oplen == 6 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 48)) + || ( opformat->oplen == 4 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 32)) + || ( opformat->oplen == 2 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 16))) + md_number_to_chars (insn, exp.X_add_number, opformat->oplen); + else diff --git a/patches/binutils/2.16.1/bfd-hash-tweak.patch b/patches/binutils/2.16.1/bfd-hash-tweak.patch new file mode 100644 index 0000000..c6de93a --- /dev/null +++ b/patches/binutils/2.16.1/bfd-hash-tweak.patch @@ -0,0 +1,23 @@ +Signed-off-by: dank@kegel.com + +Raising the size of the hash table is a noticable win when linking +at least one large app. + +There was a patch, +http://sources.redhat.com/ml/binutils/2004-06/msg00165.html +to do this dynamically. No idea why that didn't make it in. +So this tiny change to raise the default size is just +a stopgap for now. + + +--- binutils-2.16.1/bfd/hash.c.old 2006-03-02 23:01:39.000000000 -0800 ++++ binutils-2.16.1/bfd/hash.c 2006-03-02 23:01:58.000000000 -0800 +@@ -300,7 +300,7 @@ + */ + + /* The default number of entries to use when creating a hash table. */ +-#define DEFAULT_SIZE 4051 ++#define DEFAULT_SIZE 32749 + static size_t bfd_default_hash_table_size = DEFAULT_SIZE; + + /* Create a new hash table, given a number of entries. */ diff --git a/patches/binutils/2.16.1/binutils-2.15-psignal.patch b/patches/binutils/2.16.1/binutils-2.15-psignal.patch new file mode 100644 index 0000000..98fa600 --- /dev/null +++ b/patches/binutils/2.16.1/binutils-2.15-psignal.patch @@ -0,0 +1,40 @@ +Make psignal prototype in libiberty match that in glibc. + +Fixes: + +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal': +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned +mprotect... make[1]: *** [strsignal.o] Error 1 +make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty' +make: *** [all-libiberty] Error 2 + +when building on red hat 7.1 +though it's a bit of a mystery why libiberty's psignal is being compiled at +all, since red hat 7.1's glibc supports psignal (hence the error message) + +--- binutils-2.15/libiberty/strsignal.c.old 2005-04-18 13:57:40.000000000 -0700 ++++ binutils-2.15/libiberty/strsignal.c 2005-04-18 13:59:09.000000000 -0700 +@@ -544,7 +544,7 @@ + + /* + +-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message}) ++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message}) + + Print @var{message} to the standard error, followed by a colon, + followed by the description of the signal specified by @var{signo}, +@@ -557,9 +557,7 @@ + #ifndef HAVE_PSIGNAL + + void +-psignal (signo, message) +- unsigned signo; +- char *message; ++psignal (int signo, const char *message) + { + if (signal_names == NULL) + { diff --git a/patches/binutils/2.16.1/binutils-skip-comments.patch b/patches/binutils/2.16.1/binutils-skip-comments.patch new file mode 100644 index 0000000..0ca9a47 --- /dev/null +++ b/patches/binutils/2.16.1/binutils-skip-comments.patch @@ -0,0 +1,95 @@ +[removed first hunk so it would apply to 2.16.1 - copyright date already updated - dank] + +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab +To: Nathan Sidwell +Cc: Ian Lance Taylor , binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.16.1/callahan.patch b/patches/binutils/2.16.1/callahan.patch new file mode 100644 index 0000000..a39050f --- /dev/null +++ b/patches/binutils/2.16.1/callahan.patch @@ -0,0 +1,693 @@ +Signed-off-by: dank@kegel.com +Fixes ld speed issue. +See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html +See thread "Re: optimizations for 3x speedup in ld", +http://sources.redhat.com/ml/binutils/2005-03/msg00847.html + +Wildcard section matching enhancement, backported from the binutils CVS tree. +Here's the CVS log comment from the original change to ldlang.c: + +revision 1.177 +date: 2005/04/06 15:33:02; author: jakub; state: Exp; lines: +438 -51 +2005-04-06 Jakub Jelinek + + * ldlang.c: Formatting. + (walk_wild_consider_section): Remember return value from wildcardp. + (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen. + (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen. + +2005-04-06 Robert O'Callahan + + * ld.h (lean_section_userdata_type): Remove. + (fat_section_userdata_type): Remove file field. + (SECTION_USERDATA_SIZE): Remove. + * ldlang.c (init_os): Eliminate initialization of unused + lean_section_userdata_type. + + * ldlang.h (callback_t, walk_wild_section_handler_t): New + typedefs. + (struct lang_wild_statement_struct): Add walk_wild_section_handler + and handler_data fields. + * ldlang.c (callback_t): Removed. + (walk_wild_consider_section, walk_wild_section_general, + section_iterator_callback, find_section, is_simple_wild, + match_simple_wild, walk_wild_section_specs1_wild0, + walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1, + walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2, + wild_spec_can_overlap, analyze_walk_wild_section_handler): New + functions. + (lang_add_wild): Call analyze_walk_wild_section_handler. + (walk_wild_section): Renamed to walk_wild_section_general and + created a wrapper function. + (section_iterator_callback_data): New typedef. + + +Index: src/ld/ld.h +=================================================================== +RCS file: /cvs/src/src/ld/ld.h,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- binutils/ld/ld.h.old 16 Mar 2005 21:52:42 -0000 1.26 ++++ binutils/ld/ld.h 6 Apr 2005 15:33:02 -0000 1.27 +@@ -1,6 +1,6 @@ + /* ld.h -- general linker header file + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +- 2001, 2002, 2003, 2004 ++ 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + This file is part of GLD, the Gnu Linker. +@@ -89,28 +89,15 @@ + struct map_symbol_def *next; + }; + +-/* Extra information we hold on sections */ +-typedef struct lean_user_section_struct { +- /* For output sections: pointer to the section where this data will go. */ +- struct lang_input_statement_struct *file; +-} lean_section_userdata_type; +- + /* The initial part of fat_user_section_struct has to be idential with + lean_user_section_struct. */ + typedef struct fat_user_section_struct { +- /* For output sections: pointer to the section where this data will go. */ +- struct lang_input_statement_struct *file; + /* For input sections, when writing a map file: head / tail of a linked + list of hash table entries for symbols defined in this section. */ + struct map_symbol_def *map_symbol_def_head; + struct map_symbol_def **map_symbol_def_tail; + } fat_section_userdata_type; + +-#define SECTION_USERDATA_SIZE \ +- (command_line.reduce_memory_overheads \ +- ? sizeof (lean_section_userdata_type) \ +- : sizeof (fat_section_userdata_type)) +- + #define get_userdata(x) ((x)->userdata) + + #define BYTE_SIZE (1) +Index: src/ld/ldlang.c +=================================================================== +RCS file: /cvs/src/src/ld/ldlang.c,v +retrieving revision 1.176 +retrieving revision 1.177 +diff -u -r1.176 -r1.177 +--- binutils/ld/ldlang.c.old 18 Mar 2005 13:56:26 -0000 1.176 ++++ binutils/ld/ldlang.c 6 Apr 2005 15:33:02 -0000 1.177 +@@ -84,9 +84,6 @@ + static void lang_record_phdrs (void); + static void lang_do_version_exports_section (void); + +-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, +- asection *, lang_input_statement_type *, void *); +- + /* Exported variables. */ + lang_output_section_statement_type *abs_output_section; + lang_statement_list_type lang_output_section_statement; +@@ -155,21 +152,71 @@ + + /* Generic traversal routines for finding matching sections. */ + ++/* Try processing a section against a wildcard. This just calls ++ the callback unless the filename exclusion list is present ++ and excludes the file. It's hardly ever present so this ++ function is very fast. */ ++ ++static void ++walk_wild_consider_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ asection *s, ++ struct wildcard_list *sec, ++ callback_t callback, ++ void *data) ++{ ++ bfd_boolean skip = FALSE; ++ struct name_list *list_tmp; ++ ++ /* Don't process sections from files which were ++ excluded. */ ++ for (list_tmp = sec->spec.exclude_name_list; ++ list_tmp; ++ list_tmp = list_tmp->next) ++ { ++ bfd_boolean is_wildcard = wildcardp (list_tmp->name); ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, file->filename, 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, file->filename) == 0; ++ ++ /* If this file is part of an archive, and the archive is ++ excluded, exclude this file. */ ++ if (! skip && file->the_bfd != NULL ++ && file->the_bfd->my_archive != NULL ++ && file->the_bfd->my_archive->filename != NULL) ++ { ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, ++ file->the_bfd->my_archive->filename, ++ 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, ++ file->the_bfd->my_archive->filename) == 0; ++ } ++ ++ if (skip) ++ break; ++ } ++ ++ if (!skip) ++ (*callback) (ptr, sec, s, file, data); ++} ++ ++/* Lowest common denominator routine that can handle everything correctly, ++ but slowly. */ ++ + static void +-walk_wild_section (lang_wild_statement_type *ptr, +- lang_input_statement_type *file, +- callback_t callback, +- void *data) ++walk_wild_section_general (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) + { + asection *s; +- +- if (file->just_syms_flag) +- return; ++ struct wildcard_list *sec; + + for (s = file->the_bfd->sections; s != NULL; s = s->next) + { +- struct wildcard_list *sec; +- + sec = ptr->section_list; + if (sec == NULL) + (*callback) (ptr, sec, s, file, data); +@@ -177,39 +224,8 @@ + while (sec != NULL) + { + bfd_boolean skip = FALSE; +- struct name_list *list_tmp; + +- /* Don't process sections from files which were +- excluded. */ +- for (list_tmp = sec->spec.exclude_name_list; +- list_tmp; +- list_tmp = list_tmp->next) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, file->filename, 0) == 0; +- else +- skip = strcmp (list_tmp->name, file->filename) == 0; +- +- /* If this file is part of an archive, and the archive is +- excluded, exclude this file. */ +- if (! skip && file->the_bfd != NULL +- && file->the_bfd->my_archive != NULL +- && file->the_bfd->my_archive->filename != NULL) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, +- file->the_bfd->my_archive->filename, +- 0) == 0; +- else +- skip = strcmp (list_tmp->name, +- file->the_bfd->my_archive->filename) == 0; +- } +- +- if (skip) +- break; +- } +- +- if (!skip && sec->spec.name != NULL) ++ if (sec->spec.name != NULL) + { + const char *sname = bfd_get_section_name (file->the_bfd, s); + +@@ -220,13 +236,381 @@ + } + + if (!skip) +- (*callback) (ptr, sec, s, file, data); ++ walk_wild_consider_section (ptr, file, s, sec, callback, data); + + sec = sec->next; + } + } + } + ++/* Routines to find a single section given its name. If there's more ++ than one section with that name, we report that. */ ++ ++typedef struct ++{ ++ asection *found_section; ++ bfd_boolean multiple_sections_found; ++} section_iterator_callback_data; ++ ++static bfd_boolean ++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data) ++{ ++ section_iterator_callback_data *d = data; ++ ++ if (d->found_section != NULL) ++ { ++ d->multiple_sections_found = TRUE; ++ return TRUE; ++ } ++ ++ d->found_section = s; ++ return FALSE; ++} ++ ++static asection * ++find_section (lang_input_statement_type *file, ++ struct wildcard_list *sec, ++ bfd_boolean *multiple_sections_found) ++{ ++ section_iterator_callback_data cb_data = { NULL, FALSE }; ++ ++ bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, ++ section_iterator_callback, &cb_data); ++ *multiple_sections_found = cb_data.multiple_sections_found; ++ return cb_data.found_section; ++} ++ ++/* Code for handling simple wildcards without going through fnmatch, ++ which can be expensive because of charset translations etc. */ ++ ++/* A simple wild is a literal string followed by a single '*', ++ where the literal part is at least 4 characters long. */ ++ ++static bfd_boolean ++is_simple_wild (const char *name) ++{ ++ size_t len = strcspn (name, "*?["); ++ return len >= 4 && name[len] == '*' && name[len + 1] == '\0'; ++} ++ ++static bfd_boolean ++match_simple_wild (const char *pattern, const char *name) ++{ ++ /* The first four characters of the pattern are guaranteed valid ++ non-wildcard characters. So we can go faster. */ ++ if (pattern[0] != name[0] || pattern[1] != name[1] ++ || pattern[2] != name[2] || pattern[3] != name[3]) ++ return FALSE; ++ ++ pattern += 4; ++ name += 4; ++ while (*pattern != '*') ++ if (*name++ != *pattern++) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Specialized, optimized routines for handling different kinds of ++ wildcards */ ++ ++static void ++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ /* We can just do a hash lookup for the section with the right name. ++ But if that lookup discovers more than one section with the name ++ (should be rare), we fall back to the general algorithm because ++ we would otherwise have to sort the sections to make sure they ++ get processed in the bfd's order. */ ++ bfd_boolean multiple_sections_found; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ walk_wild_section_general (ptr, file, callback, data); ++ else if (s0) ++ walk_wild_consider_section (ptr, file, s0, sec0, callback, data); ++} ++ ++static void ++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *wildsec0 = ptr->handler_data[0]; ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec0, callback, data); ++ } ++} ++ ++static void ++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ /* Note that if the section was not found, s0 is NULL and ++ we'll simply never succeed the s == s0 test below. */ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ /* Recall that in this code path, a section cannot satisfy more ++ than one spec, so if s == s0 then it cannot match ++ wildspec1. */ ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, ++ data); ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, data); ++ else ++ { ++ skip = !match_simple_wild (wildsec2->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *sec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ struct wildcard_list *wildsec3 = ptr->handler_data[3]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1; ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ s1 = find_section (file, sec1, &multiple_sections_found); ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ if (s == s1) ++ walk_wild_consider_section (ptr, file, s, sec1, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec2->spec.name, ++ sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ else ++ { ++ skip = !match_simple_wild (wildsec3->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec3, ++ callback, data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ if (file->just_syms_flag) ++ return; ++ ++ (*ptr->walk_wild_section_handler) (ptr, file, callback, data); ++} ++ ++/* Returns TRUE when name1 is a wildcard spec that might match ++ something name2 can match. We're conservative: we return FALSE ++ only if the prefixes of name1 and name2 are different up to the ++ first wildcard character. */ ++ ++static bfd_boolean ++wild_spec_can_overlap (const char *name1, const char *name2) ++{ ++ size_t prefix1_len = strcspn (name1, "?*["); ++ size_t prefix2_len = strcspn (name2, "?*["); ++ size_t min_prefix_len; ++ ++ /* Note that if there is no wildcard character, then we treat the ++ terminating 0 as part of the prefix. Thus ".text" won't match ++ ".text." or ".text.*", for example. */ ++ if (name1[prefix1_len] == '\0') ++ prefix1_len++; ++ if (name2[prefix2_len] == '\0') ++ prefix2_len++; ++ ++ min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len; ++ ++ return memcmp (name1, name2, min_prefix_len) == 0; ++} ++ ++/* Select specialized code to handle various kinds of wildcard ++ statements. */ ++ ++static void ++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr) ++{ ++ int sec_count = 0; ++ int wild_name_count = 0; ++ struct wildcard_list *sec; ++ int signature; ++ int data_counter; ++ ++ ptr->walk_wild_section_handler = walk_wild_section_general; ++ ++ /* Count how many wildcard_specs there are, and how many of those ++ actually use wildcards in the name. Also, bail out if any of the ++ wildcard names are NULL. (Can this actually happen? ++ walk_wild_section used to test for it.) And bail out if any ++ of the wildcards are more complex than a simple string ++ ending in a single '*'. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ ++sec_count; ++ if (sec->spec.name == NULL) ++ return; ++ if (wildcardp (sec->spec.name)) ++ { ++ ++wild_name_count; ++ if (!is_simple_wild (sec->spec.name)) ++ return; ++ } ++ } ++ ++ /* The zero-spec case would be easy to optimize but it doesn't ++ happen in practice. Likewise, more than 4 specs doesn't ++ happen in practice. */ ++ if (sec_count == 0 || sec_count > 4) ++ return; ++ ++ /* Check that no two specs can match the same section. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ struct wildcard_list *sec2; ++ for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next) ++ { ++ if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name)) ++ return; ++ } ++ } ++ ++ signature = (sec_count << 8) + wild_name_count; ++ switch (signature) ++ { ++ case 0x0100: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0; ++ break; ++ case 0x0101: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1; ++ break; ++ case 0x0201: ++ ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1; ++ break; ++ case 0x0302: ++ ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2; ++ break; ++ case 0x0402: ++ ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2; ++ break; ++ default: ++ return; ++ } ++ ++ /* Now fill the data array with pointers to the specs, first the ++ specs with non-wildcard names, then the specs with wildcard ++ names. It's OK to process the specs in different order from the ++ given order, because we've already determined that no section ++ will match more than one spec. */ ++ data_counter = 0; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (!wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++} ++ + /* Handle a wild statement for a single file F. */ + + static void +@@ -1175,17 +1559,12 @@ + static void + init_os (lang_output_section_statement_type *s) + { +- lean_section_userdata_type *new; +- + if (s->bfd_section != NULL) + return; + + if (strcmp (s->name, DISCARD_SECTION_NAME) == 0) + einfo (_("%P%F: Illegal use of `%s' section\n"), DISCARD_SECTION_NAME); + +- new = stat_alloc (SECTION_USERDATA_SIZE); +- memset (new, 0, SECTION_USERDATA_SIZE); +- + s->bfd_section = bfd_get_section_by_name (output_bfd, s->name); + if (s->bfd_section == NULL) + s->bfd_section = bfd_make_section (output_bfd, s->name); +@@ -1199,7 +1578,14 @@ + /* We initialize an output sections output offset to minus its own + vma to allow us to output a section through itself. */ + s->bfd_section->output_offset = 0; +- get_userdata (s->bfd_section) = new; ++ if (!command_line.reduce_memory_overheads) ++ { ++ fat_section_userdata_type *new ++ = stat_alloc (sizeof (fat_section_userdata_type)); ++ memset (new, 0, sizeof (fat_section_userdata_type)); ++ get_userdata (s->bfd_section) = new; ++ } ++ + + /* If there is a base address, make sure that any sections it might + mention are initialized. */ +@@ -4939,6 +5325,7 @@ + new->section_list = section_list; + new->keep_sections = keep_sections; + lang_list_init (&new->children); ++ analyze_walk_wild_section_handler (new); + } + + void +Index: src/ld/ldlang.h +=================================================================== +RCS file: /cvs/src/src/ld/ldlang.h,v +retrieving revision 1.44 +retrieving revision 1.45 +diff -u -r1.44 -r1.45 +--- binutils/ld/ldlang.h.old 3 Mar 2005 11:51:58 -0000 1.44 ++++ binutils/ld/ldlang.h 6 Apr 2005 15:33:03 -0000 1.45 +@@ -298,7 +298,17 @@ + union lang_statement_union *file; + } lang_afile_asection_pair_statement_type; + +-typedef struct lang_wild_statement_struct ++typedef struct lang_wild_statement_struct lang_wild_statement_type; ++ ++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, ++ asection *, lang_input_statement_type *, void *); ++ ++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *, ++ lang_input_statement_type *, ++ callback_t callback, ++ void *data); ++ ++struct lang_wild_statement_struct + { + lang_statement_header_type header; + const char *filename; +@@ -306,7 +316,10 @@ + struct wildcard_list *section_list; + bfd_boolean keep_sections; + lang_statement_list_type children; +-} lang_wild_statement_type; ++ ++ walk_wild_section_handler_t walk_wild_section_handler; ++ struct wildcard_list *handler_data[4]; ++}; + + typedef struct lang_address_statement_struct + { diff --git a/patches/binutils/2.16.1/cross-gprof.patch b/patches/binutils/2.16.1/cross-gprof.patch new file mode 100644 index 0000000..ea6c18f --- /dev/null +++ b/patches/binutils/2.16.1/cross-gprof.patch @@ -0,0 +1,22 @@ +--- binutils-2.15/configure.old 2004-07-21 21:36:47.000000000 -0700 ++++ binutils-2.15/configure 2004-07-21 21:37:08.000000000 -0700 +@@ -999,7 +999,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +--- binutils-2.15/configure.in.old 2004-07-21 21:37:19.000000000 -0700 ++++ binutils-2.15/configure.in 2004-07-21 21:37:34.000000000 -0700 +@@ -236,7 +236,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. diff --git a/patches/binutils/2.16.1/stabs-tweak.patch b/patches/binutils/2.16.1/stabs-tweak.patch new file mode 100644 index 0000000..86e3611 --- /dev/null +++ b/patches/binutils/2.16.1/stabs-tweak.patch @@ -0,0 +1,28 @@ +Signed-off-by: dank@kegel.com + +See http://sourceware.org/ml/binutils/2005-12/msg00270.html +http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html + +STABS hash table size change, backported from the binutils CVS tree. Here's +the CVS log comment for the original change: + +revision 1.25 +date: 2005/12/29 10:29:23; author: nickc; state: Exp; lines: +2 -3 +(_bfd_link_section_stabs): Use bfd_hash_table_init rather than +bfd_hash_table_init_n(...,251) so that the size of the hash table can be +controlled by the user. + +--- binutils/bfd/stabs.c.old 4 May 2005 15:53:39 -0000 1.24 ++++ binutils/bfd/stabs.c 29 Dec 2005 10:29:23 -0000 1.25 +@@ -194,9 +194,8 @@ + goto error_return; + /* Make sure the first byte is zero. */ + (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); +- if (! bfd_hash_table_init_n (&sinfo->includes, +- stab_link_includes_newfunc, +- 251)) ++ if (! bfd_hash_table_init (&sinfo->includes, ++ stab_link_includes_newfunc)) + goto error_return; + sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); + if (sinfo->stabstr == NULL) diff --git a/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch new file mode 100644 index 0000000..25222e5 --- /dev/null +++ b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + 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) +@@ -1578,7 +1578,7 @@ + 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 +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + 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) +@@ -776,7 +776,7 @@ + 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 +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch new file mode 100644 index 0000000..be85ceb --- /dev/null +++ b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + 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" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + 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" + ;; diff --git a/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000..04a7e61 --- /dev/null +++ b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000..498651a --- /dev/null +++ b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch new file mode 100644 index 0000000..25222e5 --- /dev/null +++ b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + 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) +@@ -1578,7 +1578,7 @@ + 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 +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + 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) +@@ -776,7 +776,7 @@ + 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 +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch new file mode 100644 index 0000000..be85ceb --- /dev/null +++ b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + 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" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + 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" + ;; diff --git a/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000..04a7e61 --- /dev/null +++ b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000..498651a --- /dev/null +++ b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch new file mode 100644 index 0000000..25222e5 --- /dev/null +++ b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + 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) +@@ -1578,7 +1578,7 @@ + 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 +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + 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) +@@ -776,7 +776,7 @@ + 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 +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch new file mode 100644 index 0000000..be85ceb --- /dev/null +++ b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + 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" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + 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" + ;; diff --git a/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000..04a7e61 --- /dev/null +++ b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000..498651a --- /dev/null +++ b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch new file mode 100644 index 0000000..d312403 --- /dev/null +++ b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch @@ -0,0 +1,40 @@ +Message-ID: <4269173F.7020705@zee2.com> +Date: Fri, 22 Apr 2005 16:24:47 +0100 +From: Steve Papacharalambous +To: "Robert P. J. Day" +CC: crossgcc list +Subject: Re: cygwin source directory has moved +In-Reply-To: + +Hi Robert, + +I've attached two patches: + +1/ For crosstool-0.31 which changes the CYGWIN_URL to one which has the +cygwin source archives. The version of cygwin that is used to build the +cross toolchain has been changed to cygwin-1.5.15-1-src.tar.bz2 since +most of the mirror sites don't seem to have the original archive used. +[created gcc-3.3.2-cygwin-1.5.15-1.dat - dank] + + +2/ The later cygwin source archive fails to cross build with the error: +/opt/crosstool/i686-pc-cygwin/gcc-3.3.2-cygwin-1.5.15-1/lib/gcc-lib/i686-pc-cygwin/bin/ld: +cannot find -luser32 + +unless the second patch is applied, + + +diff -uNr cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in cygwin-1.5.15-1/winsup/mingw/Makefile.in +--- cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in 2005-02-28 22:51:02.000000000 +0000 ++++ cygwin-1.5.15-1/winsup/mingw/Makefile.in 2005-04-22 15:29:18.000000000 +0100 +@@ -71,7 +71,7 @@ + mkinstalldirs = $(SHELL) @MKINSTALLDIRS@ + + CC := @CC@ +-override CC := ${filter-out -L% -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\) *[^ ]*\( \|$$\)% %g'}} ++override CC := ${filter-out -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\) *[^ ]*\( \|$$\)% %g'}} + # FIXME: Which is it, CC or CC_FOR_TARGET? + CC_FOR_TARGET = $(CC) + AS_FOR_TARGET = $(AS) + + diff --git a/patches/gcc/2.95.3/arm-linux.patch b/patches/gcc/2.95.3/arm-linux.patch new file mode 100644 index 0000000..00974f6 --- /dev/null +++ b/patches/gcc/2.95.3/arm-linux.patch @@ -0,0 +1,647 @@ +--------- snip ------- +Downloaded from ftp://ftp.linux.org.uk/pub/armlinux/toolchain/src-2.95.3/gcc-2.95.3.diff.bz2 +Not sure what it fixes, but this appears to be The Patch used with gcc-2.95.3 on arm. +--------- snip ------- + +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.c gcc-2.95.3/gcc/config/arm/arm.c +--- gcc-2.95.3-orig/gcc/config/arm/arm.c Thu Jan 25 15:03:24 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.c Fri Jul 20 19:39:11 2001 +@@ -1529,27 +1529,34 @@ + return gen_rtx_PLUS (Pmode, base, offset); + } + else if (GET_CODE (orig) == LABEL_REF) +- current_function_uses_pic_offset_table = 1; +- +- return orig; +-} ++ { ++ current_function_uses_pic_offset_table = 1; + +-static rtx pic_rtx; ++ if (NEED_PLT_GOT) ++ { ++ rtx pic_ref, address = gen_reg_rtx (Pmode); ++ ++ emit_insn (gen_pic_load_addr (address, orig)); ++ pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, ++ address); ++ emit_move_insn (address, pic_ref); ++ return address; ++ } ++ } + +-int +-is_pic(x) +- rtx x; +-{ +- if (x == pic_rtx) +- return 1; +- return 0; ++ return orig; + } + ++/* Generate code to load the PIC register. PROLOGUE is true if ++ called from arm_expand_prologue (in which case we want the ++ generated insns at the start of the function); false if called ++ by an exception receiver that needs the PIC register reloaded ++ (in which case the insns are just dumped at the current location). */ + void +-arm_finalize_pic () ++arm_finalize_pic (int prologue) + { + #ifndef AOF_ASSEMBLER +- rtx l1, pic_tmp, pic_tmp2, seq; ++ rtx l1, pic_tmp, pic_tmp2, seq, pic_rtx; + rtx global_offset_table; + + if (current_function_uses_pic_offset_table == 0) +@@ -1578,7 +1585,10 @@ + + seq = gen_sequence (); + end_sequence (); +- emit_insn_after (seq, get_insns ()); ++ if (prologue) ++ emit_insn_after (seq, get_insns ()); ++ else ++ emit_insn (seq); + + /* Need to emit this whether or not we obey regdecls, + since setjmp/longjmp can cause life info to screw up. */ +@@ -5327,7 +5337,13 @@ + if (frame_pointer_needed) + live_regs += 4; + +- if (live_regs) ++ if (live_regs == 1 && regs_ever_live[LR_REGNUM] ++ && ! lr_save_eliminated && ! really_return) ++ { ++ output_asm_insn (reverse ? "ldr%?%D0\t%|lr, [%|sp}, #4" ++ : "ldr%?%d0\t%|lr, [%|sp], #4", &operand); ++ } ++ else if (live_regs) + { + if (lr_save_eliminated || ! regs_ever_live[14]) + live_regs++; +@@ -5446,7 +5462,7 @@ + rtx x; + + length = strlen (name); +- alignlength = (length + 1) + 3 & ~3; ++ alignlength = ((length + 1) + 3) & ~3; + + ASM_OUTPUT_ASCII (stream, name, length + 1); + ASM_OUTPUT_ALIGN (stream, 2); +@@ -5838,6 +5854,9 @@ + int store_arg_regs = 0; + int volatile_func = (optimize > 0 + && TREE_THIS_VOLATILE (current_function_decl)); ++ rtx ip_rtx; ++ int fp_offset = 0; ++ rtx insn; + + /* Naked functions don't have prologues. */ + if (arm_naked_function_p (current_function_decl)) +@@ -5859,11 +5878,59 @@ + live_regs_mask |= 0x4000; + } + ++ ip_rtx = gen_rtx_REG (SImode, IP_REGNUM); ++ + if (frame_pointer_needed) + { ++ if (current_function_needs_context) ++ { ++ /* The Static chain register is the same as the IP register ++ used as a scratch register during stack frame creation. ++ To get around this need to find somewhere to store IP ++ whilst the frame is being created. We try the following ++ places in order: ++ ++ 1. An unused argument register. ++ 2. A slot on the stack above the frame. (This only ++ works if the function is not a varargs function). ++ ++ If neither of these places is available, we abort (for now). */ ++ if (regs_ever_live[3] == 0) ++ { ++ insn = gen_rtx_REG (SImode, 3); ++ insn = gen_rtx_SET (SImode, insn, ip_rtx); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ else if (current_function_pretend_args_size == 0) ++ { ++ insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx); ++ insn = gen_rtx_MEM (SImode, insn); ++ insn = gen_rtx_SET (VOIDmode, insn, ip_rtx); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ fp_offset = 4; ++ } ++ else ++ /* FIXME - the way to handle this situation is to allow ++ the pretend args to be dumped onto the stack, then ++ reuse r3 to save IP. This would involve moving the ++ copying os SP into IP until after the pretend args ++ have been dumped, but this is not too hard. */ ++ error ("Unable to find a temporary location for static chanin register"); ++ } ++ + live_regs_mask |= 0xD800; +- emit_insn (gen_movsi (gen_rtx_REG (SImode, 12), +- stack_pointer_rtx)); ++ if (fp_offset) ++ { ++ insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset)); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ } ++ else ++ insn = gen_movsi (ip_rtx, stack_pointer_rtx); ++ ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; + } + + if (current_function_pretend_args_size) +@@ -5927,9 +5994,31 @@ + } + + if (frame_pointer_needed) +- emit_insn (gen_addsi3 (hard_frame_pointer_rtx, gen_rtx_REG (SImode, 12), +- (GEN_INT +- (-(4 + current_function_pretend_args_size))))); ++ { ++ insn = GEN_INT (-(4 + current_function_pretend_args_size + fp_offset)); ++ insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, ip_rtx, insn)); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ if (current_function_needs_context) ++ { ++ /* Recover the static chain register. */ ++ if (regs_ever_live [3] == 0) ++ { ++ insn = gen_rtx_REG (SImode, 3); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ else /* if (current_function_pretend_args_size == 0) */ ++ { ++ insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx, GEN_INT (4)); ++ insn = gen_rtx_MEM (SImode, insn); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ } ++ } + + if (amount != const0_rtx) + { +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.h gcc-2.95.3/gcc/config/arm/arm.h +--- gcc-2.95.3-orig/gcc/config/arm/arm.h Thu Jan 25 15:03:26 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.h Fri Jul 20 19:39:11 2001 +@@ -601,14 +601,20 @@ + (TREE_CODE (EXP) == STRING_CST \ + && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN)) + ++#ifndef STRUCTURE_SIZE_BOUNDARY + /* Every structures size must be a multiple of 32 bits. */ + /* This is for compatibility with ARMCC. ARM SDT Reference Manual + (ARM DUI 0020D) page 2-20 says "Structures are aligned on word + boundaries". */ +-#ifndef STRUCTURE_SIZE_BOUNDARY +-#define STRUCTURE_SIZE_BOUNDARY 32 ++/* Setting this to 32 produces more efficient code, but the value set in previous ++ versions of this toolchain was 8, which produces more compact structures. The ++ command line option -mstructure_size_boundary= can be used to change this ++ value. */ ++#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary + #endif + ++extern int arm_structure_size_boundary; ++ + /* Used when parsing command line option -mstructure_size_boundary. */ + extern const char * structure_size_string; + +@@ -768,6 +774,9 @@ + /* Specify the registers used for certain standard purposes. + The values of these macros are register numbers. */ + ++/* Register which holds return address from a subroutine call. */ ++#define LR_REGNUM 14 ++ + /* Define this if the program counter is overloaded on a register. */ + #define PC_REGNUM 15 + +@@ -777,6 +786,9 @@ + /* Base register for access to local variables of the function. */ + #define FRAME_POINTER_REGNUM 25 + ++/* Scratch register - used in all kinds of places, eg trampolines. */ ++#define IP_REGNUM 12 ++ + /* Define this to be where the real frame pointer is if it is not possible to + work out the offset between the frame pointer and the automatic variables + until after register allocation has taken place. FRAME_POINTER_REGNUM +@@ -798,7 +810,7 @@ + /* The native (Norcroft) Pascal compiler for the ARM passes the static chain + as an invisible last argument (possible since varargs don't exist in + Pascal), so the following is not true. */ +-#define STATIC_CHAIN_REGNUM 8 ++#define STATIC_CHAIN_REGNUM 12 + + /* Register in which address to store a structure value + is passed to a function. */ +@@ -1248,7 +1260,12 @@ + { \ + int volatile_func = arm_volatile_func (); \ + if ((FROM) == ARG_POINTER_REGNUM && (TO) == HARD_FRAME_POINTER_REGNUM)\ +- (OFFSET) = 0; \ ++ { \ ++ if (! current_function_needs_context || ! frame_pointer_needed) \ ++ (OFFSET) = 0; \ ++ else \ ++ (OFFSET) = 4; \ ++ } \ + else if ((FROM) == FRAME_POINTER_REGNUM \ + && (TO) == STACK_POINTER_REGNUM) \ + (OFFSET) = (current_function_outgoing_args_size \ +@@ -1379,8 +1396,10 @@ + + On the ARM, allow any integer (invalid ones are removed later by insn + patterns), nice doubles and symbol_refs which refer to the function's +- constant pool XXX. */ +-#define LEGITIMATE_CONSTANT_P(X) (! label_mentioned_p (X)) ++ constant pool XXX. ++ ++ When generating PIC code, allow anything. */ ++#define LEGITIMATE_CONSTANT_P(X) (flag_pic || ! label_mentioned_p (X)) + + /* Symbols in the text segment can be accessed without indirecting via the + constant pool; it may take an extra binary operation, but this is still +@@ -1496,9 +1515,8 @@ + && INTVAL (op) <= 31) \ + goto LABEL; \ + } \ +- /* NASTY: Since this limits the addressing of unsigned byte loads */ \ + range = ((MODE) == HImode || (MODE) == QImode) \ +- ? (arm_arch4 ? 256 : 4095) : 4096; \ ++ ? (((MODE) == HImode && arm_arch4) ? 256 : 4095) : 4096; \ + if (code == CONST_INT && INTVAL (INDEX) < range \ + && INTVAL (INDEX) > -range) \ + goto LABEL; \ +@@ -1812,14 +1830,15 @@ + data addresses in memory. */ + #define PIC_OFFSET_TABLE_REGNUM arm_pic_register + +-#define FINALIZE_PIC arm_finalize_pic () ++#define FINALIZE_PIC arm_finalize_pic (1) + +-/* We can't directly access anything that contains a symbol, ++/* We can't directly access anything that contains a symbol or label, + nor can we indirect via the constant pool. */ + #define LEGITIMATE_PIC_OPERAND_P(X) \ +- (! symbol_mentioned_p (X) \ ++ (! symbol_mentioned_p (X) && ! label_mentioned_p (X) \ + && (! CONSTANT_POOL_ADDRESS_P (X) \ +- || ! symbol_mentioned_p (get_pool_constant (X)))) ++ || (! symbol_mentioned_p (get_pool_constant (X))) \ ++ && (! label_mentioned_p (get_pool_constant (X))))) + + /* We need to know when we are making a constant pool; this determines + whether data needs to be in the GOT or can be referenced via a GOT +@@ -2046,17 +2065,9 @@ + else output_addr_const(STREAM, X); \ + } + +-/* Handles PIC addr specially */ + #define OUTPUT_INT_ADDR_CONST(STREAM,X) \ + { \ +- if (flag_pic && GET_CODE(X) == CONST && is_pic(X)) \ +- { \ +- output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0)); \ +- fputs(" - (", STREAM); \ +- output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0)); \ +- fputs(")", STREAM); \ +- } \ +- else output_addr_const(STREAM, X); \ ++ output_addr_const(STREAM, X); \ + \ + /* Mark symbols as position independent. We only do this in the \ + .text segment, not in the .data segment. */ \ +@@ -2170,8 +2181,7 @@ + int arm_return_in_memory PROTO ((Tree)); + int legitimate_pic_operand_p PROTO ((Rtx)); + Rtx legitimize_pic_address PROTO ((Rtx, Mmode, Rtx)); +-int is_pic PROTO ((Rtx)); +-void arm_finalize_pic PROTO ((void)); ++void arm_finalize_pic PROTO ((int)); + int arm_rtx_costs RTX_CODE_PROTO ((Rtx, Rcode)); + int arm_adjust_cost PROTO ((Rtx, Rtx, Rtx, int)); + int const_double_rtx_ok_for_fpu PROTO ((Rtx)); +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.md gcc-2.95.3/gcc/config/arm/arm.md +--- gcc-2.95.3-orig/gcc/config/arm/arm.md Thu Jan 25 15:03:27 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.md Fri Jul 20 19:39:11 2001 +@@ -2629,7 +2629,8 @@ + : preserve_subexpressions_p ())); + DONE; + } +- if (CONSTANT_P (operands[1]) && flag_pic) ++ if ((CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1]) ++ || label_mentioned_p (operands[1])) && flag_pic) + operands[1] = legitimize_pic_address (operands[1], SImode, + ((reload_in_progress + || reload_completed) +@@ -2721,6 +2722,15 @@ + return \"add%?\\t%0, %|pc, %0\"; + ") + ++(define_expand "builtin_setjmp_receiver" ++ [(label_ref (match_operand 0 "" ""))] ++ "flag_pic" ++ " ++{ ++ arm_finalize_pic (0); ++ DONE; ++}") ++ + ;; If copying one reg to another we can set the condition codes according to + ;; its value. Such a move is common after a return from subroutine and the + ;; result is being tested against zero. +@@ -6184,15 +6194,20 @@ + abort (); + return \"\"; + } +- strcpy (pattern, \"stmfd\\t%m0!, {%1\"); +- for (i = 1; i < XVECLEN (operands[2], 0); i++) ++ if (XVECLEN (operands[2], 0) > 1) + { +- strcat (pattern, \", %|\"); +- strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), ++ strcpy (pattern, \"stmfd\\t%m0!, {%1\"); ++ for (i = 1; i < XVECLEN (operands[2], 0); i++) ++ { ++ strcat (pattern, \", %|\"); ++ strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), + 0))]); ++ } ++ strcat (pattern, \"}\"); ++ output_asm_insn (pattern, operands); + } +- strcat (pattern, \"}\"); +- output_asm_insn (pattern, operands); ++ else ++ output_asm_insn (\"str\\t%1, [%m0, #-4]!\", operands); + return \"\"; + }" + [(set_attr "type" "store4")]) +diff -urN gcc-2.95.3-orig/gcc/config/arm/elf.h gcc-2.95.3/gcc/config/arm/elf.h +--- gcc-2.95.3-orig/gcc/config/arm/elf.h Mon May 31 10:21:53 1999 ++++ gcc-2.95.3/gcc/config/arm/elf.h Fri Jul 20 19:39:11 2001 +@@ -167,15 +167,6 @@ + #define MULTILIB_DEFAULTS { "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } + #endif + +-/* Setting this to 32 produces more efficient code, but the value set in previous +- versions of this toolchain was 8, which produces more compact structures. The +- command line option -mstructure_size_boundary= can be used to change this +- value. */ +-#undef STRUCTURE_SIZE_BOUNDARY +-#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary +- +-extern int arm_structure_size_boundary; +- + /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to DECL. */ +diff -urN gcc-2.95.3-orig/gcc/config/arm/linux-gas.h gcc-2.95.3/gcc/config/arm/linux-gas.h +--- gcc-2.95.3-orig/gcc/config/arm/linux-gas.h Mon Feb 22 17:47:57 1999 ++++ gcc-2.95.3/gcc/config/arm/linux-gas.h Fri Jul 20 19:39:11 2001 +@@ -1,6 +1,6 @@ + /* Definitions of target machine for GNU compiler. + ARM Linux-based GNU systems version. +- Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Contributed by Russell King . + + This file is part of GNU CC. +@@ -79,5 +79,7 @@ + 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; \ +- __asm __volatile ("swi 0x9f0002"); \ ++ __asm __volatile ("swi 0x9f0002 @ sys_cacheflush" \ ++ : "=r" (_beg) \ ++ : "0" (_beg), "r" (_end), "r" (_flg)); \ + } +diff -urN gcc-2.95.3-orig/gcc/config/arm/t-linux gcc-2.95.3/gcc/config/arm/t-linux +--- gcc-2.95.3-orig/gcc/config/arm/t-linux Fri Mar 26 16:30:20 1999 ++++ gcc-2.95.3/gcc/config/arm/t-linux Fri Jul 20 20:46:19 2001 +@@ -1,6 +1,6 @@ + # 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 = -fomit-frame-pointer -fPIC + LIBGCC2_DEBUG_CFLAGS = -g0 + + # Don't build enquire +diff -urN gcc-2.95.3-orig/gcc/final.c gcc-2.95.3/gcc/final.c +--- gcc-2.95.3-orig/gcc/final.c Mon Mar 12 13:07:59 2001 ++++ gcc-2.95.3/gcc/final.c Fri Jul 20 19:39:11 2001 +@@ -3652,8 +3652,9 @@ + + output_addr_const (file, XEXP (x, 0)); + fprintf (file, "-"); +- if (GET_CODE (XEXP (x, 1)) == CONST_INT +- && INTVAL (XEXP (x, 1)) < 0) ++ if ((GET_CODE (XEXP (x, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) < 0) ++ || GET_CODE (XEXP (x, 1)) != CONST_INT) + { + fprintf (file, ASM_OPEN_PAREN); + output_addr_const (file, XEXP (x, 1)); +diff -urN gcc-2.95.3-orig/gcc/function.c gcc-2.95.3/gcc/function.c +--- gcc-2.95.3-orig/gcc/function.c Thu Jan 25 15:03:15 2001 ++++ gcc-2.95.3/gcc/function.c Fri Jul 20 19:39:10 2001 +@@ -3053,6 +3053,105 @@ + extracted by usage MEM with narrower mode. */ + static rtx purge_addressof_replacements; + ++/* Return 1 if X and Y are identical-looking rtx's. ++ This is the Lisp function EQUAL for rtx arguments. */ ++ ++int ++rtx_equal_for_addressof_p (x, y) ++ rtx x, y; ++{ ++ register int i; ++ register int j; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ if (x == y) ++ return 1; ++ if (x == 0 || y == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ /* Rtx's of different codes cannot be equal. */ ++ if (code != GET_CODE (y)) ++ return 0; ++ ++ /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. ++ (REG:SI x) and (REG:HI x) are NOT equivalent. ++ But (MEM:SI x) and (MEM:HI x) are equivalent for our purposes. */ ++ ++ if (code != MEM && (GET_MODE (x) != GET_MODE (y))) ++ return 0; ++ ++ /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */ ++ ++ if (code == REG) ++ return REGNO (x) == REGNO (y); ++ else if (code == LABEL_REF) ++ return XEXP (x, 0) == XEXP (y, 0); ++ else if (code == SYMBOL_REF) ++ return XSTR (x, 0) == XSTR (y, 0); ++ else if (code == SCRATCH || code == CONST_DOUBLE) ++ return 0; ++ ++ /* Compare the elements. If any pair of corresponding elements ++ fail to match, return 0 for the whole things. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ switch (fmt[i]) ++ { ++ case 'w': ++ if (XWINT (x, i) != XWINT (y, i)) ++ return 0; ++ break; ++ ++ case 'n': ++ case 'i': ++ if (XINT (x, i) != XINT (y, i)) ++ return 0; ++ break; ++ ++ case 'V': ++ case 'E': ++ /* Two vectors must have the same length. */ ++ if (XVECLEN (x, i) != XVECLEN (y, i)) ++ return 0; ++ ++ /* And the corresponding elements must match. */ ++ for (j = 0; j < XVECLEN (x, i); j++) ++ if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0) ++ return 0; ++ break; ++ ++ case 'e': ++ if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0) ++ return 0; ++ break; ++ ++ case 'S': ++ case 's': ++ if (strcmp (XSTR (x, i), XSTR (y, i))) ++ return 0; ++ break; ++ ++ case 'u': ++ /* These are just backpointers, so they don't matter. */ ++ break; ++ ++ case '0': ++ break; ++ ++ /* It is believed that rtx's at this level will never ++ contain anything but integers and other rtx's, ++ except for within LABEL_REFs and SYMBOL_REFs. */ ++ default: ++ abort (); ++ } ++ } ++ return 1; ++} ++ + /* Helper function for purge_addressof. See if the rtx expression at *LOC + in INSN needs to be changed. If FORCE, always put any ADDRESSOFs into + the stack. */ +@@ -3133,7 +3232,7 @@ + for (tem = purge_bitfield_addressof_replacements; + tem != NULL_RTX; + tem = XEXP (XEXP (tem, 1), 1)) +- if (rtx_equal_p (x, XEXP (tem, 0))) ++ if (rtx_equal_for_addressof_p (x, XEXP (tem, 0))) + { + *loc = XEXP (XEXP (tem, 1), 0); + return; +@@ -3143,7 +3242,7 @@ + for (tem = purge_addressof_replacements; + tem != NULL_RTX; + tem = XEXP (XEXP (tem, 1), 1)) +- if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0))) ++ if (rtx_equal_for_addressof_p (XEXP (x, 0), XEXP (tem, 0))) + { + rtx z = XEXP (XEXP (tem, 1), 0); + +diff -urN gcc-2.95.3-orig/gcc/jump.c gcc-2.95.3/gcc/jump.c +--- gcc-2.95.3-orig/gcc/jump.c Thu Oct 21 08:24:03 1999 ++++ gcc-2.95.3/gcc/jump.c Fri Jul 20 19:39:10 2001 +@@ -115,7 +115,7 @@ + static rtx delete_unreferenced_labels PROTO((rtx)); + static void delete_noop_moves PROTO((rtx)); + static int calculate_can_reach_end PROTO((rtx, int, int)); +-static int duplicate_loop_exit_test PROTO((rtx)); ++static int duplicate_loop_exit_test PROTO((rtx, int)); + static void find_cross_jump PROTO((rtx, rtx, int, rtx *, rtx *)); + static void do_cross_jump PROTO((rtx, rtx, rtx)); + static int jump_back_p PROTO((rtx, rtx)); +@@ -338,7 +338,7 @@ + && simplejump_p (temp1)) + { + temp = PREV_INSN (insn); +- if (duplicate_loop_exit_test (insn)) ++ if (duplicate_loop_exit_test (insn, after_regscan)) + { + changed = 1; + next = NEXT_INSN (temp); +@@ -2548,8 +2548,9 @@ + values of regno_first_uid and regno_last_uid. */ + + static int +-duplicate_loop_exit_test (loop_start) ++duplicate_loop_exit_test (loop_start, after_regscan) + rtx loop_start; ++ int after_regscan; + { + rtx insn, set, reg, p, link; + rtx copy = 0, first_copy = 0; +@@ -2662,6 +2663,9 @@ + reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg)); + } + } ++ ++ if (after_regscan) ++ reg_scan_update (exitcode, lastexit, max_reg); + + /* Now copy each insn. */ + for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn)) +diff -urN gcc-2.95.3-orig/gcc/varasm.c gcc-2.95.3/gcc/varasm.c +--- gcc-2.95.3-orig/gcc/varasm.c Mon Feb 19 15:02:02 2001 ++++ gcc-2.95.3/gcc/varasm.c Fri Jul 20 19:39:11 2001 +@@ -3286,7 +3286,10 @@ + value->un.addr.offset = - INTVAL (XEXP (x, 1)); + } + else +- abort (); ++ { ++ value->un.addr.base = x; ++ value->un.addr.offset = 0; ++ } + break; + + default: diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.4.patch b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch new file mode 100644 index 0000000..141de0c --- /dev/null +++ b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch @@ -0,0 +1,35 @@ +# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.3&r2=1.4 +# Should fix error +# Configuration powerpc-host_apple-darwin7.3.0 not supported +# when configuring gcc-2.95 on Mac OS X for i686 target +# Also create xm-darwin.h, seems to be required, else we get the error +# In file included from .../gcc-2.95.3/gcc/gencheck.c:21: +# hconfig.h:11:30: rs6000/xm-darwin.h: No such file or directory +# make[1]: *** [gencheck.o] Error 1 + + +--- gcc-2.95.3/gcc/configure.old 2004-03-24 12:17:44.000000000 -0800 ++++ gcc-2.95.3/gcc/configure 2004-03-24 17:14:38.000000000 -0800 +@@ -5079,6 +5079,10 @@ + tmake_file=rs6000/t-beos + xmake_file=rs6000/x-beos + ;; ++ powerpc-*-darwin*) ++ xm_file="rs6000/xm-rs6000.h rs6000/xm-darwin.h" ++ xmake_file=rs6000/x-darwin ++ ;; + powerpc-*-sysv* | powerpc-*-elf*) + tm_file=rs6000/sysv4.h + xm_file="xm-siglist.h rs6000/xm-sysv4.h" +--- /dev/null 2003-01-30 02:24:37.000000000 -0800 ++++ gcc-3.0.4/gcc/config/rs6000/xm-darwin.h 2000-11-20 19:02:09.000000000 -0800 +@@ -0,0 +1,9 @@ ++/* Undo the USG definition in xm-rs6000.h, Darwin is a BSD flavor. */ ++ ++#undef USG ++ ++/* Override the usual setting, since Apple's GCC has lame bugs and ++ can't handle the initializers. Someday the bugs will be fixed and ++ we can get rid of this silliness. */ ++ ++#define HAVE_DESIGNATED_INITIALIZERS 0 diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.92.patch b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch new file mode 100644 index 0000000..fc55681 --- /dev/null +++ b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch @@ -0,0 +1,39 @@ +# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.91&r2=1.92 +# Should fix error +# Configuration x86_64-host_unknown-linux-gnu not supported +# when configuring gcc-2.95 on x86_64 build for i686 target +# It's a bit silly, since tm_file refers to files that don't exist, +# but as long as x86_64 is just the build machine, that doesn't matter. + +--- gcc-2.95.3/gcc/configure.old 2004-03-24 12:17:44.000000000 -0800 ++++ gcc-2.95.3/gcc/configure 2004-03-24 12:19:30.000000000 -0800 +@@ -2929,6 +2929,9 @@ + i[34567]86-*-*) + cpu_type=i386 + ;; ++ x86_64-*-*) ++ cpu_type=i386 ++ ;; + hppa*-*-*) + cpu_type=pa + ;; +@@ -3643,6 +3646,19 @@ + thread_file='posix' + fi + ;; ++ x86_64-*-linux*) ++ xmake_file=x-linux ++ tm_file="i386/biarch64.h i386/i386.h i386/att.h linux.h i386/x86-64.h \ ++ i386/linux64.h" ++ tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ float_format=i386 ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; ++ + i[34567]86-*-gnu*) + float_format=i386 + ;; diff --git a/patches/gcc/2.95.3/config.sub.patch b/patches/gcc/2.95.3/config.sub.patch new file mode 100644 index 0000000..c8189b5 --- /dev/null +++ b/patches/gcc/2.95.3/config.sub.patch @@ -0,0 +1,1257 @@ +# Backport from gcc-3.3.3 +# Fixes errors like +# Invalid configuration `x86_64-host_unknown-linux-gnu': machine `x86_64-host_unknown' not recognized +# Unrecognized host system name x86_64-host_unknown-linux-gnu. +# when configuring on chip types or operating systems like x86_64 or Darwin +# which are newer than gcc-2.95 + +--- gcc-2.95.3/config.sub.old 1999-08-04 01:09:26.000000000 -0700 ++++ gcc-2.95.3/config.sub 2004-03-24 11:28:24.000000000 -0800 +@@ -1,6 +1,10 @@ + #! /bin/sh +-# Configuration validation subroutine script, version 1.1. +-# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. ++# Configuration validation subroutine script. ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ ++timestamp='2003-01-28' ++ + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software + # can handle that machine. It does not imply ALL GNU software can. +@@ -25,6 +29,9 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++# Please send patches to . Submit a context ++# diff and a properly formatted ChangeLog entry. ++# + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. +@@ -45,30 +52,73 @@ + # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + # It is wrong to echo any other type of specification. + +-if [ x$1 = x ] +-then +- echo Configuration name missing. 1>&2 +- echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 +- echo "or $0 ALIAS" 1>&2 +- echo where ALIAS is a recognized configuration type. 1>&2 +- exit 1 +-fi ++me=`echo "$0" | sed -e 's,.*/,,'` + +-# First pass through any local machine types. +-case $1 in +- *local*) +- echo $1 +- exit 0 +- ;; +- *) +- ;; ++usage="\ ++Usage: $0 [OPTION] CPU-MFR-OPSYS ++ $0 [OPTION] ALIAS ++ ++Canonicalize a configuration name. ++ ++Operation modes: ++ -h, --help print this help, then exit ++ -t, --time-stamp print date of last modification, then exit ++ -v, --version print version number, then exit ++ ++Report bugs and patches to ." ++ ++version="\ ++GNU config.sub ($timestamp) ++ ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ++Free Software Foundation, Inc. ++ ++This is free software; see the source for copying conditions. There is NO ++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++ ++help=" ++Try \`$me --help' for more information." ++ ++# Parse command line ++while test $# -gt 0 ; do ++ case $1 in ++ --time-stamp | --time* | -t ) ++ echo "$timestamp" ; exit 0 ;; ++ --version | -v ) ++ echo "$version" ; exit 0 ;; ++ --help | --h* | -h ) ++ echo "$usage"; exit 0 ;; ++ -- ) # Stop option processing ++ shift; break ;; ++ - ) # Use stdin as input. ++ break ;; ++ -* ) ++ echo "$me: invalid option $1$help" ++ exit 1 ;; ++ ++ *local*) ++ # First pass through any local machine types. ++ echo $1 ++ exit 0;; ++ ++ * ) ++ break ;; ++ esac ++done ++ ++case $# in ++ 0) echo "$me: missing argument$help" >&2 ++ exit 1;; ++ 1) ;; ++ *) echo "$me: too many arguments$help" >&2 ++ exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- linux-gnu*) ++ nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -94,20 +144,28 @@ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple) ++ -apple | -axis) + os= + basic_machine=$1 + ;; +- -sim | -cisco | -oki | -wec | -winbond ) # EGCS LOCAL ++ -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; +- -scout) # EGCS LOCAL ++ -scout) + ;; +- -wrs) # EGCS LOCAL ++ -wrs) + os=-vxworks + basic_machine=$1 + ;; ++ -chorusos*) ++ os=-chorusos ++ basic_machine=$1 ++ ;; ++ -chorusrdb) ++ os=-chorusrdb ++ basic_machine=$1 ++ ;; + -hiux*) + os=-hiuxwe2 + ;; +@@ -156,49 +214,72 @@ + -psos*) + os=-psos + ;; ++ -mint | -mint[0-9]*) ++ basic_machine=m68k-atari ++ os=-mint ++ ;; + esac + + # Decode aliases for certain CPU-COMPANY combinations. + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. +- tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ +- | arme[lb] | pyramid | mn10200 | mn10300 \ +- | tron | a29k | 580 | i960 | h8300 \ +- | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ +- | alpha | alphaev5 | alphaev56 | alphapca56 | alphaev6 \ +- | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ +- | 1750a | dsp16xx | pdp11 \ +- | mips64 | mipsel | mips64el | mips64orion | mips64orionel \ +- | mipstx39 | mipstx39el \ +- | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x) +- basic_machine=$basic_machine-unknown +- ;; +- m88110 | m680[012346]0 | m683?2 | m68360 | m5200 | z8k | v70 \ +- | h8500 | w65) # EGCS LOCAL +- ;; +- thumb) +- basic_machine=$basic_machine-unknown +- ;; +- mips64vr4300 | mips64vr4300el) # EGCS LOCAL jsmith/vr4300 ++ 1750a | 580 \ ++ | a29k \ ++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ ++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | clipper \ ++ | d10v | d30v | dlx | dsp16xx \ ++ | fr30 | frv \ ++ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | i370 | i860 | i960 | ia64 \ ++ | ip2k \ ++ | m32r | m68000 | m68k | m88k | mcore \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64el \ ++ | mips64vr | mips64vrel \ ++ | mips64orion | mips64orionel \ ++ | mips64vr4100 | mips64vr4100el \ ++ | mips64vr4300 | mips64vr4300el \ ++ | mips64vr5000 | mips64vr5000el \ ++ | mipsisa32 | mipsisa32el \ ++ | mipsisa32r2 | mipsisa32r2el \ ++ | mipsisa64 | mipsisa64el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipstx39 | mipstx39el \ ++ | mn10200 | mn10300 \ ++ | msp430 \ ++ | ns16k | ns32k \ ++ | openrisc | or32 \ ++ | pdp10 | pdp11 | pj | pjl \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | pyramid \ ++ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | sh64 | sh64le \ ++ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ ++ | strongarm \ ++ | tahoe | thumb | tic80 | tron \ ++ | v850 | v850e \ ++ | we32k \ ++ | x86 | xscale | xstormy16 | xtensa \ ++ | z8k) + basic_machine=$basic_machine-unknown + ;; +- mips64vr4100 | mips64vr4100el) # EGCS LOCAL jsmith/vr4100 +- basic_machine=$basic_machine-unknown +- ;; +- mips64vr5000 | mips64vr5000el) # EGCS LOCAL ian/vr5000 +- basic_machine=$basic_machine-unknown +- ;; +- mips16) ++ m6811 | m68hc11 | m6812 | m68hc12) ++ # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown ++ os=-none + ;; +- d10v) +- basic_machine=$basic_machine-unknown ++ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; ++ + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. +- i[34567]86) ++ i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. +@@ -207,44 +288,62 @@ + exit 1 + ;; + # Recognize the basic CPU types with company name. +- vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \ +- | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ +- | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ +- | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \ +- | xmp-* | ymp-* \ +- | hppa-* | hppa1.0-* | hppa1.1-* \ +- | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ +- | alpha-* | alphaev5-* | alphaev56-* | alphapca56-* \ +- | alphaev6-* | we32k-* | cydra-* | ns16k-* | pn-* | np1-* \ +- | xps100-* | clipper-* | orion-* \ +- | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ +- | sparc64-* | sparcv9-* | sparc86x-* | mips64-* | mipsel-* \ +- | mips64el-* | mips64orion-* | mips64orionel-* \ +- | mipstx39-* | mipstx39el-* \ +- | f301-* | arm*-*) +- ;; +- m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-* | d10v-*) # EGCS LOCAL +- ;; +- thumb-*) # EGCS LOCAL angela/thumb +- ;; +- v850-*) # EGCS LOCAL +- ;; +- d30v-*) # EGCS LOCAL +- ;; +- mips64vr4300-* | mips64vr4300el-*) # EGCS LOCAL jsmith/vr4300 +- ;; +- mips64vr4100-* | mips64vr4100el-*) # EGCS LOCAL jsmith/vr4100 +- ;; +- mips16-*) # EGCS LOCAL krk/mips16 +- ;; +- tic30-*) # EGCS LOCAL ian/tic30 +- ;; +- c30-*) # EGCS LOCAL ian/tic30 +- basic_machine=tic30-unknown ++ 580-* \ ++ | a29k-* \ ++ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ ++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | avr-* \ ++ | bs2000-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ ++ | clipper-* | cydra-* \ ++ | d10v-* | d30v-* | dlx-* \ ++ | elxsi-* \ ++ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | h8300-* | h8500-* \ ++ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | i*86-* | i860-* | i960-* | ia64-* \ ++ | ip2k-* \ ++ | m32r-* \ ++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ ++ | m88110-* | m88k-* | mcore-* \ ++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ ++ | mips16-* \ ++ | mips64-* | mips64el-* \ ++ | mips64vr-* | mips64vrel-* \ ++ | mips64orion-* | mips64orionel-* \ ++ | mips64vr4100-* | mips64vr4100el-* \ ++ | mips64vr4300-* | mips64vr4300el-* \ ++ | mips64vr5000-* | mips64vr5000el-* \ ++ | mipsisa32-* | mipsisa32el-* \ ++ | mipsisa32r2-* | mipsisa32r2el-* \ ++ | mipsisa64-* | mipsisa64el-* \ ++ | mipsisa64sb1-* | mipsisa64sb1el-* \ ++ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ ++ | mipstx39-* | mipstx39el-* \ ++ | msp430-* \ ++ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ ++ | orion-* \ ++ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | pyramid-* \ ++ | romp-* | rs6000-* \ ++ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ ++ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ ++ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ ++ | v850-* | v850e-* | vax-* \ ++ | we32k-* \ ++ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ ++ | xtensa-* \ ++ | ymp-* \ ++ | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +- 386bsd) # EGCS LOCAL ++ 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; +@@ -254,11 +353,11 @@ + 3b*) + basic_machine=we32k-att + ;; +- a29khif) # EGCS LOCAL ++ a29khif) + basic_machine=a29k-amd + os=-udi + ;; +- adobe68k) # EGCS LOCAL ++ adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; +@@ -277,21 +376,21 @@ + os=-sysv + ;; + amiga | amiga-*) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + ;; + amigaos | amigados) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; +- apollo68bsd) # EGCS LOCAL ++ apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; +@@ -303,6 +402,10 @@ + basic_machine=ns32k-sequent + os=-dynix + ;; ++ c90) ++ basic_machine=c90-cray ++ os=-unicos ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -323,27 +426,30 @@ + basic_machine=c38-convex + os=-bsd + ;; +- cray | ymp) +- basic_machine=ymp-cray +- os=-unicos +- ;; +- cray2) +- basic_machine=cray2-cray +- os=-unicos +- ;; +- [ctj]90-cray) +- basic_machine=c90-cray ++ cray | j90) ++ basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ cris | cris-* | etrax*) ++ basic_machine=cris-axis ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; ++ decsystem10* | dec10*) ++ basic_machine=pdp10-dec ++ os=-tops10 ++ ;; ++ decsystem20* | dec20*) ++ basic_machine=pdp10-dec ++ os=-tops20 ++ ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola +@@ -371,7 +477,7 @@ + encore | umax | mmax) + basic_machine=ns32k-encore + ;; +- es1800 | OSE68k | ose68k | ose | OSE) # EGCS LOCAL ++ es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; +@@ -385,6 +491,10 @@ + basic_machine=tron-gmicro + os=-sysv + ;; ++ go32) ++ basic_machine=i386-pc ++ os=-go32 ++ ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 +@@ -393,11 +503,11 @@ + basic_machine=h8300-hitachi + os=-hms + ;; +- h8300xray) # EGCS LOCAL ++ h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; +- h8500hms) # EGCS LOCAL ++ h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; +@@ -416,22 +526,6 @@ + basic_machine=m68k-hp + os=-hpux + ;; +- w89k-*) # EGCS LOCAL +- basic_machine=hppa1.1-winbond +- os=-proelf +- ;; +- op50n-*) # EGCS LOCAL +- basic_machine=hppa1.1-oki +- os=-proelf +- ;; +- op60c-*) # EGCS LOCAL +- basic_machine=hppa1.1-oki +- os=-proelf +- ;; +- hppro) # EGCS LOCAL +- basic_machine=hppa1.1-hp +- os=-proelf +- ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; +@@ -441,22 +535,21 @@ + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; +- hp9k6[0-9][0-9] | hp6[0-9][0-9] ) ++ hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; +- hp9k7[0-79][0-9] | hp7[0-79][0-9] ) ++ hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; +- hp9k78[0-9] | hp78[0-9] ) ++ hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; +- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | \ +- hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893 ) ++ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; +- hp9k8[0-9][13679] | hp8[0-9][13679] ) ++ hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) +@@ -465,47 +558,42 @@ + hppa-next) + os=-nextstep3 + ;; +- hppaosf) # EGCS LOCAL ++ hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; ++ hppro) ++ basic_machine=hppa1.1-hp ++ os=-proelf ++ ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm +- os=-mvs + ;; + # I'm not sure what "Sysv32" means. Should this be sysv3.2? +- i[34567]86v32) ++ i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; +- i[34567]86v4*) ++ i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; +- i[34567]86v) ++ i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; +- i[34567]86sol2) ++ i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; +- i386mach) # EGCS LOCAL ++ i386mach) + basic_machine=i386-mach + os=-mach + ;; +- i386-vsta | vsta) # EGCS LOCAL ++ i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; +- i386-go32 | go32) # EGCS LOCAL +- basic_machine=i386-unknown +- os=-go32 +- ;; +- i386-mingw32 | mingw32) +- basic_machine=i386-unknown +- os=-mingw32 +- ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in +@@ -531,16 +619,16 @@ + basic_machine=ns32k-utek + os=-sysv + ;; ++ mingw32) ++ basic_machine=i386-pc ++ os=-mingw32 ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +- mipsel*-linux*) +- basic_machine=mipsel-unknown +- os=-linux-gnu +- ;; +- mips*-linux*) +- basic_machine=mips-unknown +- os=-linux-gnu ++ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) ++ basic_machine=m68k-atari ++ os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` +@@ -548,24 +636,36 @@ + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; +- monitor) # EGCS LOCAL ++ mmix*) ++ basic_machine=mmix-knuth ++ os=-mmixware ++ ;; ++ monitor) + basic_machine=m68k-rom68k + os=-coff + ;; +- msdos) # EGCS LOCAL +- basic_machine=i386-unknown ++ morphos) ++ basic_machine=powerpc-unknown ++ os=-morphos ++ ;; ++ msdos) ++ basic_machine=i386-pc + os=-msdos + ;; ++ mvs) ++ basic_machine=i370-ibm ++ os=-mvs ++ ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) +- basic_machine=i386-unknown # EGCS LOCAL ++ basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) +- basic_machine=armv4l-corel ++ basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) +@@ -580,7 +680,7 @@ + basic_machine=mips-sony + os=-newsos + ;; +- necv70) # EGCS LOCAL ++ necv70) + basic_machine=v70-nec + os=-sysv + ;; +@@ -609,18 +709,37 @@ + basic_machine=i960-intel + os=-nindy + ;; +- mon960) # EGCS LOCAL ++ mon960) + basic_machine=i960-intel + os=-mon960 + ;; ++ nonstopux) ++ basic_machine=mips-compaq ++ os=-nonstopux ++ ;; + np1) + basic_machine=np1-gould + ;; +- OSE68000 | ose68000) # EGCS LOCAL ++ nv1) ++ basic_machine=nv1-cray ++ os=-unicosmp ++ ;; ++ nsr-tandem) ++ basic_machine=nsr-tandem ++ ;; ++ op50n-* | op60c-*) ++ basic_machine=hppa1.1-oki ++ os=-proelf ++ ;; ++ or32 | or32-*) ++ basic_machine=or32-unknown ++ os=-coff ++ ;; ++ OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; +- os68k) # EGCS LOCAL ++ os68k) + basic_machine=m68k-none + os=-os68k + ;; +@@ -638,46 +757,60 @@ + pbb) + basic_machine=m68k-tti + ;; +- pc532 | pc532-*) ++ pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; +- pentium | p5 | k5 | k6 | nexen) ++ pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +- pentiumpro | p6 | 6x86) ++ pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) +- basic_machine=i786-pc ++ basic_machine=i686-pc + ;; +- pentium-* | p5-* | k5-* | k6-* | nexen-*) ++ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; +- pentiumpro-* | p6-* | 6x86-*) ++ pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) +- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; +- power) basic_machine=rs6000-ibm ++ power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown +- ;; ++ ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown +- ;; ++ ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ++ ppc64) basic_machine=powerpc64-unknown ++ ;; ++ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ ppc64le | powerpc64little | ppc64-le | powerpc64-little) ++ basic_machine=powerpc64le-unknown ++ ;; ++ ppc64le-* | powerpc64little-*) ++ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + ps2) + basic_machine=i386-ibm + ;; +- rom68k) # EGCS LOCAL ++ pw32) ++ basic_machine=i586-unknown ++ os=-pw32 ++ ;; ++ rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; +@@ -687,10 +820,22 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- sa29200) # EGCS LOCAL ++ s390 | s390-*) ++ basic_machine=s390-ibm ++ ;; ++ s390x | s390x-*) ++ basic_machine=s390x-ibm ++ ;; ++ sa29200) + basic_machine=a29k-amd + os=-udi + ;; ++ sb1) ++ basic_machine=mipsisa64sb1-unknown ++ ;; ++ sb1el) ++ basic_machine=mipsisa64sb1el-unknown ++ ;; + sequent) + basic_machine=i386-sequent + ;; +@@ -698,7 +843,7 @@ + basic_machine=sh-hitachi + os=-hms + ;; +- sparclite-wrs) # EGCS LOCAL ++ sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; +@@ -709,10 +854,10 @@ + spur) + basic_machine=spur-unknown + ;; +- st2000) # EGCS LOCAL ++ st2000) + basic_machine=m68k-tandem + ;; +- stratus) # EGCS LOCAL ++ stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; +@@ -756,16 +901,40 @@ + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; ++ sv1) ++ basic_machine=sv1-cray ++ os=-unicos ++ ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; ++ t3e) ++ basic_machine=alphaev5-cray ++ os=-unicos ++ ;; ++ t90) ++ basic_machine=t90-cray ++ os=-unicos ++ ;; ++ tic4x | c4x*) ++ basic_machine=tic4x-unknown ++ os=-coff ++ ;; ++ tic54x | c54x*) ++ basic_machine=tic54x-unknown ++ os=-coff ++ ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; ++ toad1) ++ basic_machine=pdp10-xkl ++ os=-tops20 ++ ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; +@@ -777,7 +946,7 @@ + basic_machine=a29k-nyu + os=-sym1 + ;; +- v810 | necv810) # EGCS LOCAL ++ v810 | necv810) + basic_machine=v810-nec + os=-none + ;; +@@ -790,8 +959,8 @@ + os=-vms + ;; + vpp*|vx|vx-*) +- basic_machine=f301-fujitsu +- ;; ++ basic_machine=f301-fujitsu ++ ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks +@@ -804,18 +973,22 @@ + basic_machine=a29k-wrs + os=-vxworks + ;; +- w65*) # EGCS LOCAL +- basic_machine=w65-wdc +- os=-none ++ w65*) ++ basic_machine=w65-wdc ++ os=-none + ;; +- xmp) +- basic_machine=xmp-cray +- os=-unicos ++ w89k-*) ++ basic_machine=hppa1.1-winbond ++ os=-proelf + ;; +- xps | xps100) ++ xps | xps100) + basic_machine=xps100-honeywell + ;; +- z8k-*-coff) # EGCS LOCAL ++ ymp) ++ basic_machine=ymp-cray ++ os=-unicos ++ ;; ++ z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; +@@ -826,22 +999,15 @@ + + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. +- w89k) # EGCS LOCAL ++ w89k) + basic_machine=hppa1.1-winbond + ;; +- op50n) # EGCS LOCAL ++ op50n) + basic_machine=hppa1.1-oki + ;; +- op60c) # EGCS LOCAL ++ op60c) + basic_machine=hppa1.1-oki + ;; +- mips) +- if [ x$os = x-linux-gnu ]; then +- basic_machine=mips-unknown +- else +- basic_machine=mips-mips +- fi +- ;; + romp) + basic_machine=romp-ibm + ;; +@@ -851,16 +1017,26 @@ + vax) + basic_machine=vax-dec + ;; ++ pdp10) ++ # there are many clones, so DEC is not a safe bet ++ basic_machine=pdp10-unknown ++ ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; +- sparc | sparcv9) ++ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) ++ basic_machine=sh-unknown ++ ;; ++ sh64) ++ basic_machine=sh64-unknown ++ ;; ++ sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; +- cydra) ++ cydra) + basic_machine=cydra-cydrome + ;; + orion) +@@ -869,16 +1045,15 @@ + orion105) + basic_machine=clipper-highlevel + ;; +- mac | mpw | mac-mpw) # EGCS LOCAL ++ mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; +- pmac | pmac-mpw) # EGCS LOCAL ++ pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; +- c4x*) +- basic_machine=c4x-none +- os=-coff +- ;; ++ *-unknown) ++ # Make sure to match an already-canonicalized machine name. ++ ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 +@@ -935,20 +1110,38 @@ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ ++ | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ +- | -interix* | -uwin* ) ++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ ++ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ ++ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ ++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ ++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ ++ | -powermax* | -dnix* | -microbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; +- # EGCS LOCAL ++ -qnx*) ++ case $basic_machine in ++ x86-* | i*86-*) ++ ;; ++ *) ++ os=-nto$os ++ ;; ++ esac ++ ;; ++ -nto-qnx*) ++ ;; ++ -nto*) ++ os=`echo $os | sed -e 's|nto|nto-qnx|'` ++ ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ +- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ +- | -macos* | -mpw* | -magic* | -mon960* | -lnews* ) ++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ ++ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; +- # END EGCS LOCAL + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; +@@ -958,6 +1151,12 @@ + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; ++ -opened*) ++ os=-openedition ++ ;; ++ -wince*) ++ os=-wince ++ ;; + -osfrose*) + os=-osfrose + ;; +@@ -973,14 +1172,23 @@ + -acis*) + os=-aos + ;; +- -386bsd) # EGCS LOCAL ++ -atheos*) ++ os=-atheos ++ ;; ++ -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; ++ -nova*) ++ os=-rtmk-nova ++ ;; + -ns2 ) +- os=-nextstep2 ++ os=-nextstep2 ++ ;; ++ -nsk*) ++ os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) +@@ -1007,15 +1215,21 @@ + # This must come after -sysvr4. + -sysv*) + ;; +- -ose*) # EGCS LOCAL ++ -ose*) + os=-ose + ;; +- -es1800*) # EGCS LOCAL ++ -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ os=-mint ++ ;; ++ -aros*) ++ os=-aros ++ ;; + -none) + ;; + *) +@@ -1041,13 +1255,17 @@ + *-acorn) + os=-riscix1.2 + ;; +- arm*-corel) ++ arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; +- pdp11-*) ++ # This must come before the *-dec entry. ++ pdp10-*) ++ os=-tops20 ++ ;; ++ pdp11-*) + os=-none + ;; + *-dec | vax-*) +@@ -1065,15 +1283,18 @@ + # default. + # os=-sunos4 + ;; +- m68*-cisco) # EGCS LOCAL ++ m68*-cisco) + os=-aout + ;; +- mips*-cisco) # EGCS LOCAL ++ mips*-cisco) + os=-elf + ;; +- mips*-*) # EGCS LOCAL +- os=-elf +- ;; ++ mips*-*) ++ os=-elf ++ ;; ++ or32-*) ++ os=-coff ++ ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; +@@ -1086,13 +1307,13 @@ + *-ibm) + os=-aix + ;; +- *-wec) # EGCS LOCAL ++ *-wec) + os=-proelf + ;; +- *-winbond) # EGCS LOCAL ++ *-winbond) + os=-proelf + ;; +- *-oki) # EGCS LOCAL ++ *-oki) + os=-proelf + ;; + *-hp) +@@ -1137,36 +1358,39 @@ + *-next) + os=-nextstep3 + ;; +- *-gould) ++ *-gould) + os=-sysv + ;; +- *-highlevel) ++ *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; +- *-sgi) ++ *-sgi) + os=-irix + ;; +- *-siemens) ++ *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; +- f301-fujitsu) ++ f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; +- *-rom68k) # EGCS LOCAL ++ *-rom68k) + os=-coff + ;; +- *-*bug) # EGCS LOCAL ++ *-*bug) + os=-coff + ;; +- *-apple) # EGCS LOCAL ++ *-apple) + os=-macos + ;; ++ *-atari*) ++ os=-mint ++ ;; + *) + os=-none + ;; +@@ -1212,27 +1436,41 @@ + -genix*) + vendor=ns + ;; +- -mvs*) ++ -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; +- -vxsim* | -vxworks*) ++ -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; +- -hms*) # EGCS LOCAL ++ -hms*) + vendor=hitachi + ;; +- -mpw* | -macos*) # EGCS LOCAL ++ -mpw* | -macos*) + vendor=apple + ;; ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ vendor=atari ++ ;; ++ -vos*) ++ vendor=stratus ++ ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os ++exit 0 ++ ++# Local variables: ++# eval: (add-hook 'write-file-hooks 'time-stamp) ++# time-stamp-start: "timestamp='" ++# time-stamp-format: "%:y-%02m-%02d" ++# time-stamp-end: "'" ++# End: diff --git a/patches/gcc/2.95.3/deque-leak-fix.patch b/patches/gcc/2.95.3/deque-leak-fix.patch new file mode 100644 index 0000000..44d2a01 --- /dev/null +++ b/patches/gcc/2.95.3/deque-leak-fix.patch @@ -0,0 +1,31 @@ +[See also http://gcc.gnu.org/ml/libstdc++/2001-11/msg00133.html ] + +Date: Fri, 16 Nov 2001 16:06:22 -0500 +From: Phil Edwards +To: gcc-patches at gcc dot gnu dot org +Subject: [libstdc++ trunk & 3.0] Fix deque memory leak +Message-ID: <20011116160622.A23094@disaster.jaj.com> + + +As discussed on the libstdc++ mailing list. Tested on i686/linux. + + + +2001-11-16 Paolo Carlini + + * include/bits/stl_deque.h (deque::erase()): Fix memory leak. + + +[rediffed against 2.95.3 -- dank] + +--- gcc-2.95.3/libstdc++/stl/stl_deque.h.old 2001-01-01 09:48:22.000000000 -0800 ++++ gcc-2.95.3/libstdc++/stl/stl_deque.h 2006-02-18 15:24:17.000000000 -0800 +@@ -1052,7 +1052,7 @@ + copy_backward(_M_start, __first, __last); + iterator __new_start = _M_start + __n; + destroy(_M_start, __new_start); +- _M_destroy_nodes(__new_start._M_node, _M_start._M_node); ++ _M_destroy_nodes(_M_start._M_node, __new_start._M_node); /* fixed per http://gcc.gnu.org/ml/libstdc++/2001-11/msg00139.html */ + _M_start = __new_start; + } + else { diff --git a/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch new file mode 100644 index 0000000..fb2b8da --- /dev/null +++ b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch @@ -0,0 +1,33 @@ +[ Building gcc-2.95.3 on cygwin yields a compiler that sticks a .exe + on the end of every executable, even if they're linux executable. + This is highly annoying, and causes glibc build failures that look like this: + mv: `.../bin/makedb.new' and `.../bin/makedb' are the same file + make[2]: *** [.../bin/makedb] Error 1 + make[2]: Leaving directory `.../gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/db2' + + The mainline solves this with http://gcc.gnu.org/ml/gcc-cvs/2001-04/msg00440.html, + but that doesn't apply cleanly to gcc-2.95.3. + + So, I'm using + http://www.uclinux.org/pub/uClinux/uclinux-elf-tools/tools-20030314/gcc-2.95.3-cygwin-020611.patch + This is the only patch in crosstool that *isn't* suitable for the mainline. + I can live with this patch simply because crosstool does not build + compilers that target cygwin or VAX/VMS. + If that ever changes, I might need to try applying the real patch. +] + + + +# +# This patch can be found at http://www.uclinux.org/pub/uClinux/m68k-elf-tools/ +# +--- gcc-2.95.3/gcc/config/i386/xm-cygwin.h 1999-04-22 16:40:56.000000000 +0200 ++++ gcc-2.95.3-cygwin/gcc/config/i386/xm-cygwin.h 2002-06-11 08:23:18.000000000 +0200 +@@ -19,7 +19,6 @@ + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +-#define EXECUTABLE_SUFFIX ".exe" + #define NO_SYS_SIGLIST 1 + + /* We support both "/" and "\" since everybody tests both but we diff --git a/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch new file mode 100644 index 0000000..1d18055 --- /dev/null +++ b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde , 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-2.95.3-orig/configure gcc-2.95.3/configure +--- gcc-2.95.3-orig/configure 1999-04-02 16:17:40.000000000 +0200 ++++ gcc-2.95.3/configure 2005-04-20 18:25:45.030488235 +0200 +@@ -687,7 +687,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -f Makefile* ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1599,7 +1599,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -f ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/2.95.3/gcc-pr3106.patch b/patches/gcc/2.95.3/gcc-pr3106.patch new file mode 100644 index 0000000..0e077ea --- /dev/null +++ b/patches/gcc/2.95.3/gcc-pr3106.patch @@ -0,0 +1,28 @@ +See http://gcc.gnu.org/PR3106 +Backported from gcc-3.0.x + +Fixes error + .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr' + /usr/include/stdio.h:258: error: previous declaration of `sys_nerr' + make[1]: *** [strerror.o] Error 1 + make: *** [all-libiberty] Error 2 +on Mac OS X. + +--- gcc-2.95.3/libiberty/strerror.c.old 2004-03-24 16:23:19.000000000 -0800 ++++ gcc-2.95.3/libiberty/strerror.c 2004-03-24 16:23:48.000000000 -0800 +@@ -13,6 +13,7 @@ + incompatible with our later declaration, perhaps by using const + attributes. So we hide the declaration in errno.h (if any) using a + macro. */ ++#define sys_nerr sys_nerr__ + #define sys_errlist sys_errlist__ + #endif + +@@ -20,6 +21,7 @@ + #include + + #ifdef HAVE_SYS_ERRLIST ++#undef sys_nerr + #undef sys_errlist + #endif + diff --git a/patches/gcc/2.95.3/threads_snafu.patch b/patches/gcc/2.95.3/threads_snafu.patch new file mode 100644 index 0000000..2c5297e --- /dev/null +++ b/patches/gcc/2.95.3/threads_snafu.patch @@ -0,0 +1,28 @@ +This fixes the error + +In file included from gthr-default.h:1, + from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr.h:98, + from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/libgcc2.c:3034: +/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directory +make[3]: *** [libgcc2.a] Error 1 +make[3]: Leaving directory `/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-gcc-core/gcc' + +in what I think is a nicer way than the patch used by the arm team, +i.e. "perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc -D__gthr_posix_h/' gcc/config/arm/t-linux" +which seems a bit of a kludge. + +--- gcc-2.95.3/gcc/configure.old Fri Mar 16 06:13:48 2001 ++++ gcc-2.95.3/gcc/configure Sun Jun 8 13:02:20 2003 +@@ -853,9 +853,9 @@ + # Check whether --enable-threads or --disable-threads was given. + if test "${enable_threads+set}" = set; then + enableval="$enable_threads" +- if test x$enable_threads = xno; then +- enable_threads='' +-fi ++ #if test x$enable_threads = xno; then ++ #enable_threads='' ++ #fi + else + enable_threads='' + fi diff --git a/patches/gcc/3.2.3/README-mips b/patches/gcc/3.2.3/README-mips new file mode 100644 index 0000000..170b21d --- /dev/null +++ b/patches/gcc/3.2.3/README-mips @@ -0,0 +1,1648 @@ +See also http://www.spinics.net/lists/mips/msg12236.html + +ftp://ftp.linux-mips.org/pub/linux/mips/redhat/7.3/test/SRPMS/gcc-3.2-7.1.src.rpm +contains the following patches and spec file. +You may wish to investigate some of these patches; I haven't. +I think this is mostly the Red Hat 8.0 srpm for a prerelease gcc-3.2, plus a couple +mips specific fixes, but you'd have to ask H.J.Lu or compare with the regular +Red Hat 8.0 srpm to find out. +In any case, the spec file is interesting reading. +- Dan K. + +total 1164 + 4 boehm-gc-LINUX.patch + 4 boehm-gc-mips.patch + 4 contrib-touch.patch + 8 gcc-arch.patch + 4 gcc-c++-template.patch + 4 gcc-copy.patch + 4 gcc-cross-bfd.patch + 4 gcc-cross.patch + 4 gcc-gcj-cross.patch + 4 gcc-libffi-mips.patch + 4 gcc-libgcc.patch + 480 gcc-libstdc++-glibc-2.2.patch + 4 gcc-libstdc++-mips.patch + 4 gcc-linux-atexit.patch + 8 gcc-linux-crt.patch + 4 gcc-mips-coff.patch + 4 gcc-mips-file.patch + 4 gcc-mips-ieee.patch + 4 gcc-mips-return.patch + 4 gcc-ppc-linux.patch + 8 gcc-sizeof.patch + 4 gcc-test-atexit.patch + 4 gcc-testsuite-c++.patch + 4 gcc-var.patch + 8 gcc32-2.96-RH-compat.patch + 4 gcc32-ada-addr2line.patch + 8 gcc32-ada-link.patch + 12 gcc32-attr-visibility.patch + 4 gcc32-attr-visibility2.patch + 4 gcc32-attr-visibility3.patch + 4 gcc32-attr-visibility4.patch + 4 gcc32-attr-visibility5.patch + 8 gcc32-boehm-gc-libs.patch + 4 gcc32-bogus-inline.patch + 4 gcc32-c++-nrv-test.patch + 4 gcc32-c++-pretty_function.patch + 16 gcc32-c++-tail-pad-backout.patch + 4 gcc32-c++-tsubst-asm.patch + 4 gcc32-cfg-eh.patch + 4 gcc32-debug-pr7241.patch + 4 gcc32-doc-gcov.patch + 4 gcc32-duplicate-decl.patch + 4 gcc32-dwarf2-pr6381.patch + 4 gcc32-dwarf2-pr6436-test.patch + 4 gcc32-fde-merge-compat.patch + 4 gcc32-fold-const-associate.patch + 4 gcc32-fold-const2.patch + 24 gcc32-hard-reg-sharing.patch + 4 gcc32-hard-reg-sharing2.patch + 4 gcc32-i386-default-momit-leaf-frame-pointer.patch + 4 gcc32-i386-memtest-test.patch + 4 gcc32-i386-no-default-momit-leaf-frame-pointer.patch + 4 gcc32-i386-pic-label-thunk.patch + 4 gcc32-i386-pr7242.patch + 4 gcc32-i386-profile-olfp.patch + 4 gcc32-inline-label.patch + 4 gcc32-interface_only.patch + 4 gcc32-java-no-rpath.patch + 20 gcc32-libstdc++-glibc23-1.patch + 4 gcc32-libstdc++-glibc23-2.patch + 4 gcc32-libstdc++-glibc23-3.patch + 4 gcc32-libstdc++-glibc23-4.patch + 4 gcc32-loop-prefetch.patch + 4 gcc32-pr6842.patch + 8 gcc32-rh69989.patch + 40 gcc32-s390-java.patch + 4 gcc32-sparc-sll1.patch + 4 gcc32-test-rh65771.patch + 8 gcc32-test-rotate.patch + 12 gcc32-tls-dwarf2.patch + 140 gcc32-tls.patch + 4 gcc32-tls2.patch + 4 gcc32-tls3.patch + 4 gcc32-tls4.patch + 4 gcc32-tls5.patch + 24 gcc32-tree-code.patch + 4 gcc32-trunc_int_for_mode.patch + 4 gcc32-typeof-asm.patch + 4 gcc32-x86_64-libiberty-pic.patch + 4 gcc32-x86_64-pr7559.patch + 4 gcc32-x86_64-q_regs_operand.patch + 4 gcc32-x86_64-rip-lowercase.patch + 4 libjava-cross.patch + 4 libtool-libs.patch + 4 libtool-mips.patch + +---------- gcc32.spec --------- + +%if %{_arch} != %{_build_arch} +%define cross_compile 1 +%else +%define cross_compile 0 +%endif +%{?_with_crosscompile: %{expand: %%define cross_compile 1}} + +%if %{cross_compile} +%define make_check 0 +%else +%define make_check 1 +%endif +%{?_without_check: %{expand: %%define make_check 0}} +%{?_with_check: %{expand: %%define make_check 1}} + +%define default 0 +%{?_with_default: %{expand: %%define default 1}} + +%define gcconly 0 +%{?_with_gcconly: %{expand: %%define gcconly 1}} + +%define DATE 20020903 +%define gcc_version 3.2 +%define gcc_release 7.1 +%ifarch %{ix86} alpha ia64 ppc +%define build_ada 1 +%else +%define build_ada 0 +%endif +%{?_without_ada: %{expand: %%define build_ada 0}} +%if %{cross_compile} +%define build_ada 0 +%endif +Summary: Various compilers (C, C++, Objective-C, Java, ...) +%if !%{gcconly} +Name: gcc +Version: 3.2 +Release: %{gcc_release} +%else +Name: gcc-%{gcc_version} +Version: %{gcc_release} +Release: 1 +%endif +Copyright: GPL +Group: Development/Languages +Source0: gcc-%{version}-%{DATE}.tar.bz2 +URL: http://gcc.gnu.org +BuildRoot: %{_tmppath}/%{name}-%{version}-root +BuildRequires: binutils >= 2.12.90.0.9-1 +BuildRequires: zlib-devel, gettext, dejagnu +# Make sure pthread.h doesn't contain __thread tokens +BuildRequires: glibc-devel >= 2.2.5-36.2 +%if %{build_ada} +# Ada requires Ada to build +BuildRequires: gcc-gnat >= 3.1, libgnat >= 3.1 +%endif +Requires: cpp = %{version}-%{release} +# Need .eh_frame ld optimizations +# Need proper visibility support +Requires: binutils >= 2.12.90.0.7-1 +# Make sure gdb will understand DW_FORM_strp +Conflicts: gdb < 5.1-2 +Requires: glibc-devel >= 2.2.5-36.2 +Requires: libgcc >= %{version}-%{release} +%if !%{gcconly} +Obsoletes: gcc3 +%endif +Prereq: /sbin/install-info + +Patch1: gcc32-2.96-RH-compat.patch +Patch2: gcc32-boehm-gc-libs.patch +Patch3: gcc32-bogus-inline.patch +Patch6: gcc32-fde-merge-compat.patch +Patch7: gcc32-attr-visibility.patch +Patch8: gcc32-attr-visibility2.patch +Patch9: gcc32-duplicate-decl.patch +Patch10: gcc32-trunc_int_for_mode.patch +Patch11: gcc32-sparc-sll1.patch +Patch12: gcc32-x86_64-q_regs_operand.patch +Patch13: gcc32-dwarf2-pr6381.patch +Patch14: gcc32-dwarf2-pr6436-test.patch +Patch15: gcc32-c++-pretty_function.patch +Patch16: gcc32-c++-tsubst-asm.patch +Patch18: gcc32-i386-memtest-test.patch +Patch19: gcc32-fold-const2.patch +Patch21: gcc32-ada-addr2line.patch +Patch22: gcc32-ada-link.patch +Patch23: gcc32-java-no-rpath.patch +Patch25: gcc32-s390-java.patch +Patch26: gcc32-test-rotate.patch +Patch27: gcc32-x86_64-libiberty-pic.patch +Patch29: gcc32-test-rh65771.patch +Patch30: gcc32-i386-default-momit-leaf-frame-pointer.patch +Patch31: gcc32-i386-pic-label-thunk.patch +Patch34: gcc32-pr6842.patch +Patch35: gcc32-tls.patch +Patch36: gcc32-i386-profile-olfp.patch +Patch37: gcc32-tree-code.patch +Patch38: gcc32-hard-reg-sharing.patch +Patch39: gcc32-hard-reg-sharing2.patch +Patch40: gcc32-c++-nrv-test.patch +Patch41: gcc32-debug-pr7241.patch +Patch42: gcc32-i386-pr7242.patch +Patch43: gcc32-cfg-eh.patch +Patch44: gcc32-attr-visibility3.patch +Patch45: gcc32-tls2.patch +Patch46: gcc32-fold-const-associate.patch +Patch47: gcc32-inline-label.patch +Patch48: gcc32-typeof-asm.patch +Patch50: gcc32-rh69989.patch +Patch51: gcc32-tls3.patch +Patch52: gcc32-tls4.patch +Patch54: gcc32-tls5.patch +Patch55: gcc32-tls-dwarf2.patch +Patch56: gcc32-x86_64-pr7559.patch +Patch57: gcc32-loop-prefetch.patch +Patch58: gcc32-doc-gcov.patch +Patch59: gcc32-attr-visibility4.patch +Patch60: gcc32-c++-tail-pad-backout.patch +Patch61: gcc32-attr-visibility5.patch +Patch62: gcc32-i386-no-default-momit-leaf-frame-pointer.patch +Patch64: gcc32-x86_64-rip-lowercase.patch +Patch65: gcc32-libstdc++-glibc23-1.patch +Patch66: gcc32-libstdc++-glibc23-2.patch +Patch67: gcc32-libstdc++-glibc23-3.patch +Patch68: gcc32-libstdc++-glibc23-4.patch +Patch69: gcc32-interface_only.patch + +%define _gnu %{nil} + +Patch10000: boehm-gc-mips.patch +Patch10001: boehm-gc-LINUX.patch +Patch10002: gcc-libffi-mips.patch + +Patch11000: gcc-mips-coff.patch +Patch11001: gcc-mips-file.patch +Patch11002: gcc-mips-ieee.patch +Patch11003: gcc-mips-return.patch +Patch11004: gcc-libstdc++-mips.patch +Patch11005: libtool-mips.patch + +Patch12000: gcc-libgcc.patch + +Patch13000: gcc-ppc-linux.patch +Patch13001: gcc-linux-crt.patch + +Patch14000: gcc-linux-atexit.patch +Patch14001: gcc-test-atexit.patch + +Patch15000: gcc-var.patch +Patch15001: gcc-copy.patch + +Patch16000: gcc-c++-template.patch +Patch16001: gcc-testsuite-c++.patch + +Patch17000: gcc-cross.patch +Patch17001: gcc-cross-bfd.patch +Patch17002: gcc-sizeof.patch +Patch17003: gcc-arch.patch + +Patch18000: libjava-cross.patch +Patch18001: gcc-gcj-cross.patch + +Patch19000: contrib-touch.patch + +Patch20000: libtool-libs.patch + +Patch21000: gcc-libstdc++-glibc-2.2.patch + +%description +The gcc package contains the GNU Compiler Collection version 3.2. +You'll need this package in order to compile C code. + +%package -n libgcc +Summary: GCC version 3.2 shared support library +Group: System Environment/Libraries + +%description -n libgcc +This package contains GCC shared support library which is needed +e.g. for exception handling support. + +%package c++ +Summary: C++ support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libstdc++ = %{version} +Requires: libstdc++-devel = %{version} +Obsoletes: gcc3-c++ + +%description c++ +This package adds C++ support to the GNU Compiler Collection. +It includes support for most of the current C++ specification, +including templates and exception handling. + +%package -n libstdc++ +Summary: GNU Standard C++ Library +Group: System Environment/Libraries +Obsoletes: libstdc++3 + +%description -n libstdc++ +The libstdc++ package contains a rewritten standard compliant GCC Standard +C++ Library. + +%package -n libstdc++-devel +Summary: Header files and libraries for C++ development +Group: Development/Libraries +Requires: libstdc++ = %{version}-%{release} +Obsoletes: libstdc++3-devel + +%description -n libstdc++-devel +This is the GNU implementation of the standard C++ libraries. This +package includes the header files and libraries needed for C++ +development. This includes rewritten implementation of STL. + +%package objc +Summary: Objective-C support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libobjc = %{version}-%{release} +Obsoletes: gcc3-objc + +%description objc +gcc-objc provides Objective-C support for the GCC. +Mainly used on systems running NeXTSTEP, Objective-C is an +object-oriented derivative of the C language. + +%package -n libobjc +Summary: Objective-C runtime +Group: System Environment/Libraries + +%description -n libobjc +This package contains Objective-C shared library which is needed to run +Objective-C dynamically linked programs. + +%package g77 +Summary: Fortran 77 support +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libf2c = %{version}-%{release} +Prereq: /sbin/install-info +Obsoletes: gcc3-g77 + +%description g77 +The gcc-g77 package provides support for compiling Fortran 77 +programs with the GNU Compiler Collection. + +%package -n libf2c +Summary: Fortran 77 runtime +Group: System Environment/Libraries + +%description -n libf2c +This package contains Fortran 77 shared library which is needed to run +Fortran 77 dynamically linked programs. + +%package java +Summary: Java support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libgcj >= %{version}, libgcj-devel >= %{version} +Obsoletes: gcc3-java +Prereq: /sbin/install-info + +%description java +This package adds support for compiling Java(tm) programs and +bytecode into native code. + +%package -n libgcj +Summary: Java runtime library for gcc +Group: System Environment/Libraries +Requires: zip >= 2.1 +Obsoletes: gcc-libgcj +Obsoletes: libgcj3 +# Kaffe includes jar too +Conflicts: kaffe + +%description -n libgcj +The Java(tm) runtime library. You will need this package to run your Java +programs compiled using the Java compiler from GNU Compiler Collection (gcj). + +%package -n libgcj-devel +Summary: Libraries for Java development using GCC +Group: Development/Languages +Requires: zip >= 2.1, libgcj = %{version} +Obsoletes: libgcj3-devel + +%description -n libgcj-devel +The Java(tm) static libraries and C header files. You will need this +package to compile your Java programs using the GCC Java compiler (gcj). + +%package -n cpp +Summary: The C Preprocessor. +Group: Development/Languages +Prereq: /sbin/install-info +%ifarch ia64 +Obsoletes: gnupro +%endif + +%description -n cpp +Cpp is the GNU C-Compatible Compiler Preprocessor. +Cpp is a macro processor which is used automatically +by the C compiler to transform your program before actual +compilation. It is called a macro processor because it allows +you to define macros, abbreviations for longer +constructs. + +The C preprocessor provides four separate functionalities: the +inclusion of header files (files of declarations that can be +substituted into your program); macro expansion (you can define macros, +and the C preprocessor will replace the macros with their definitions +throughout the program); conditional compilation (using special +preprocessing directives, you can include or exclude parts of the +program according to various conditions); and line control (if you use +a program to combine or rearrange source files into an intermediate +file which is then compiled, you can use line control to inform the +compiler about where each source line originated). + +You should install this package if you are a C programmer and you use +macros. + +%package gnat +Summary: Ada 95 support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release}, libgnat = %{version}-%{release} +Obsoletes: gnat-devel, gcc3-gnat +Prereq: /sbin/install-info + +%description gnat +GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools, +the documents and Ada 95 compiler. + +%package -n libgnat +Summary: GNU Ada 95 runtime shared libraries +Group: System Environment/Libraries +Obsoletes: gnat libgnat3 + +%description -n libgnat +GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries, +which are required to run programs compiled with the GNAT. + +%prep +%setup -q -n gcc-%{version}-%{DATE} +%patch1 -p0 -b .2.96-RH-compat~ +%patch2 -p0 -b .boehm-gc-libs~ +%patch3 -p0 -b .bogus-inline~ +%patch6 -p0 -b .fde-merge-compat~ +%patch7 -p0 -b .attr-visibility~ +%patch8 -p0 -b .attr-visibility2~ +%patch9 -p0 -b .duplicate-decl~ +%patch10 -p0 -b .trunc_int_for_mode~ +%patch11 -p0 -b .sparc-sll1~ +%patch12 -p0 -b .x86_64-q_regs_operand~ +%patch13 -p0 -b .dwarf2-pr6381~ +%patch14 -p0 -b .dwarf2-pr6436-test~ +%patch15 -p0 -b .c++-pretty_function~ +%patch16 -p0 -b .c++-tsubst-asm~ +%patch18 -p0 -b .i386-memtest-test~ +%patch19 -p0 -b .fold-const2~ +%patch21 -p0 -b .ada-addr2line~ +%patch22 -p0 -b .ada-link~ +%patch23 -p0 -b .java-no-rpath~ +%patch25 -p0 -b .s390-java~ +%patch26 -p0 -b .test-rotate~ +%patch27 -p0 -b .x86_64-libiberty-pic~ +%patch29 -p0 -b .test-rh65771~ +%patch30 -p0 -b .i386-default-momit-leaf-frame-pointer~ +%patch31 -p0 -b .i386-pic-label-thunk~ +%patch34 -p0 -b .pr6842~ +%patch35 -p0 -b .tls~ +%patch36 -p0 -b .i386-profile-olfp~ +%patch37 -p0 -b .tree-code~ +%patch38 -p0 -b .hard-reg-sharing~ +%patch39 -p0 -b .hard-reg-sharing2~ +%patch40 -p0 -b .c++-nrv-test~ +%patch41 -p0 -b .debug-pr7241~ +%patch42 -p0 -b .i386-pr7242~ +%patch43 -p0 -b .cfg-eh~ +%patch44 -p0 -b .attr-visibility3~ +%patch45 -p0 -b .tls2~ +%patch46 -p0 -b .fold-const-associate~ +%patch47 -p0 -b .inline-label~ +%patch48 -p0 -b .typeof-asm~ +%patch50 -p0 -b .rh69989~ +%patch51 -p0 -b .tls3~ +%patch52 -p0 -b .tls4~ +%patch54 -p0 -b .tls5~ +%patch55 -p0 -b .tls-dwarf2~ +%patch56 -p0 -b .x86_64-pr7559~ +%patch57 -p0 -b .loop-prefetch~ +%patch58 -p0 -b .doc-gcov~ +%patch59 -p0 -b .attr-visibility4~ +%patch60 -p0 -b .c++-tail-pad-backout~ +%patch61 -p0 -b .attr-visibility5~ +%patch62 -p0 -b .i386-no-default-momit-leaf-frame-pointer~ +%patch64 -p0 -b .x86_64-rip-lowercase~ +%patch65 -p0 -b .libstdc++-glibc23-1~ +%patch66 -p0 -b .libstdc++-glibc23-2~ +%patch67 -p0 -b .libstdc++-glibc23-3~ +%patch68 -p0 -b .libstdc++-glibc23-4~ +%patch69 -p0 -b .interface_only + +%patch10000 -p0 -b .mips +%patch10001 -p0 -b .LINUX +%patch10002 -p0 -b .mips +pushd boehm-gc +autoconf +popd +pushd libffi +autoconf +# Ignore the error from automake +automake --cygnus Makefile || : +popd + +%patch11000 -p0 -b .coff +%patch11001 -p0 -b .file +%patch11002 -p0 -b .ieee +%patch11003 -p0 -b .return +%patch11004 -p0 -b .mips +%patch11005 -p1 -b .mips + +%patch12000 -p0 -b .libgcc + +%patch13000 -p0 -b .ppc +%patch13001 -p0 -b .crt + +%patch14000 -p0 -b .order +%patch14001 -p0 -b .order + +%patch15000 -p0 -b .var +%patch15001 -p0 -b .copy + +%patch16000 -p0 -b .template +%patch16001 -p0 -b .template + +%patch17000 -p1 -b .cross +%patch17001 -p0 -b .cross-bfd +%patch17002 -p1 -b .sizeof +%patch17003 -p0 -b .arch +pushd gcc +autoheader +autoconf +popd +pushd fastjar +aclocal +autoconf +popd +pushd libffi +aclocal +autoconf +popd + +%patch18000 -p0 -b .cross +%patch18001 -p0 -b .build +pushd libjava +autoconf +automake --foreign Makefile +popd + +%patch19000 -p0 -b .touch + +%patch20000 -p0 -b .libs + +%patch21000 -p0 -b .glibc-2.2 +pushd libstdc++-v3 +autoconf +popd + +perl -pi -e 's/3\.2\.1/3.2/' gcc/version.c gcc/f/version.c gcc/ada/gnatvsn.ads +perl -pi -e 's/"%{gcc_version}"/"%{gcc_version} \(release\)"/' gcc/version.c +perl -pi -e 's/\((prerelease|experimental|release)\)/\(Red Hat Linux 8.0 %{version}-%{gcc_release}\)/' gcc/version.c gcc/f/version.c +perl -pi -e 's/\((prerelease|experimental|release)\)/\(%{version}-%{gcc_release}\)/' gcc/ada/gnatvsn.ads +perl -pi -e 's/#define GCCBUGURL.*$/#define GCCBUGURL ""/' gcc/system.h +# The version string is now longer than 32 bytes and the line containing it +# doesn't fit into 80 columns +#perl -pi -e 's/:= 32/:= 64/;s/(Gnat_Version_String.*:=)/\1\n /' gcc/ada/gnatvsn.ads + +./contrib/gcc_update --touch + +%build +rm -fr obj-%{_target_platform} +mkdir obj-%{_target_platform} +cd obj-%{_target_platform} + +%if %{_arch} != %{_build_arch} +%ifos linux +export ac_cv_func_mmap_anywhere=yes +export ac_cv_func_mmap_file=yes +export ac_cv_func_mmap_fixed_mapped=yes +export ac_cv_func_strncmp_works=yes +export gcc_cv_func_printf_ptr=yes +%endif +%endif + +DEFAULT_FLAGS= +%if %{default} +%ifarch %{ix86} +TARGET_CPU="%{_target_cpu}" +DEFAULT_FLAGS="--with-arch=$TARGET_CPU --with-cpu=$TARGET_CPU" +%endif +%endif + +CC=%{__cc} +OPT_FLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/-fno-rtti//g' -e 's/-fno-exceptions//g'` +CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$OPT_FLAGS" XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ + ../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \ + --enable-shared --enable-threads=posix --disable-checking --host=%{_target_platform} \ + $DEFAULT_FLAGS \ +%if %{cross_compile} + --target=%{_target_platform} --build=%{_build_alias} \ +%endif + --with-system-zlib --enable-__cxa_atexit + +# We have to make sure all gcc configure files are up to date for +# parallel build. We have to do it twice due to the stupid Makefile. +make -C gcc cstamp-h +make -C gcc cstamp-h + +# if RPM_BUILD_NCPUS unset, set it +if [ -z "$RPM_BUILD_NCPUS" ] ; then + if [ -x /usr/bin/getconf ] ; then + RPM_BUILD_NCPUS=$(/usr/bin/getconf _NPROCESSORS_ONLN) + if [ $RPM_BUILD_NCPUS -eq 0 ]; then + RPM_BUILD_NCPUS=1 + fi + else + RPM_BUILD_NCPUS=1 + fi +fi + +RPM_BUILD_NCPUS=`expr $RPM_BUILD_NCPUS + $RPM_BUILD_NCPUS` + +cat < makefile +MAKE=make -j $RPM_BUILD_NCPUS +include Makefile +CFLAGS:=\$(CFLAGS) -pipe +CXXFLAGS:=\$(CXXFLAGS) -pipe +EOF + +# FIXME: It is a kludge. +export GCJFLAGS="$OPT_FLAGS" + +%if %{cross_compile} +make -j$RPM_BUILD_NCPUS \ + CC=%{__cc} \ + CXX=%{__cxx} \ + AR=%{__ar} \ + AS=%{__as} \ + LD=%{__ld} \ + NM=%{__nm} \ + RANLIB=%{__ranlib} \ + CC_FOR_TARGET=%{__cc} \ + GCC_FOR_TARGET=%{__cc} \ + CXX_FOR_TARGET=%{__cxx} \ + AR_FOR_TARGET=%{__ar} \ + AS_FOR_TARGET=%{__as} \ + LD_FOR_TARGET=%{__ld} \ + NM_FOR_TARGET=%{__nm} \ + RANLIB_FOR_TARGET=%{__ranlib} \ + HOST_CC=cc \ + CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \ + CFLAGS_FOR_BUILD="-O -pipe" \ + CFLAGS="$RPM_OPT_FLAGS -pipe" \ + CXXFLAGS="$RPM_OPT_FLAGS -pipe" +%else +make -j$RPM_BUILD_NCPUS bootstrap-lean +#make -j$RPM_BUILD_NCPUS bootstrap +%endif + +%if %{build_ada} +# This doesn't work with -j$RPM_BUILD_NCPUS +make -C gcc gnatlib-shared +make -C gcc gnattools +make -C gcc/ada doc +%endif + +%if %{make_check} +# run the tests. +make -j$RPM_BUILD_NCPUS -k check || : +%ifarch %{ix86} +ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform} +ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}-gnu +%endif +echo ====================TESTING========================= +( ../contrib/test_summary || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' +%ifarch %{ix86} +make -C %{_target_platform}/libstdc++-v3 check-abi +%endif +echo ====================TESTING END===================== +#cd %{_target_platform}/libstdc++-v3 +#./mkcheck 0 +#cd ../.. +%endif + +%if !%{cross_compile} +# Make protoize +make -C gcc CC="./xgcc -B ./ -O2" proto +%endif + +# Make generated man pages even if Pod::Man is not new enough +perl -pi -e 's/head3/head2/' ../contrib/texi2pod.pl +for i in ../gcc/doc/*.texi; do + cp -a $i $i.orig; sed 's/ftable/table/' $i.orig > $i +done +make -C gcc generated-manpages +for i in ../gcc/doc/*.texi; do mv -f $i.orig $i; done + +# Copy various doc files here and there +cd .. +mkdir -p rpm.doc/g77 rpm.doc/objc +mkdir -p rpm.doc/boehm-gc rpm.doc/fastjar rpm.doc/libffi rpm.doc/libjava + +(cd gcc/f; for i in ChangeLog*; do + cp -p $i ../../rpm.doc/g77/$i.f +done) +(cd libf2c; for i in ChangeLog*; do + cp -p $i ../rpm.doc/g77/$i.libf2c +done) +(cd gcc/objc; for i in README*; do + cp -p $i ../../rpm.doc/objc/$i.objc +done) +(cd libobjc; for i in README*; do + cp -p $i ../rpm.doc/objc/$i.libobjc +done) +(cd boehm-gc; for i in ChangeLog*; do + cp -p $i ../rpm.doc/boehm-gc/$i.gc +done) +(cd fastjar; for i in ChangeLog* README*; do + cp -p $i ../rpm.doc/fastjar/$i.fastjar +done) +(cd libffi; for i in ChangeLog* README* LICENSE; do + cp -p $i ../rpm.doc/libffi/$i.libffi +done) +(cd libjava; for i in ChangeLog* README*; do + cp -p $i ../rpm.doc/libjava/$i.libjava +done) + +%install +rm -fr $RPM_BUILD_ROOT + +perl -pi -e \ + 's~href="l(ibstdc|atest)~href="http://gcc.gnu.org/onlinedocs/libstdc++/l\1~' \ + libstdc++-v3/docs/html/documentation.html +ln -sf documentation.html libstdc++-v3/docs/html/index.html +find libstdc++-v3/docs/html -name CVS | xargs rm -rf + +cd obj-%{_target_platform} +TARGET_PLATFORM=%{_target_platform} + +# There are some MP bugs in libstdc++ and libjava Makefiles +make -C %{_target_platform}/libstdc++-v3 +make -C %{_target_platform}/libjava + +make prefix=$RPM_BUILD_ROOT%{_prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \ +%if %{cross_compile} + CC=%{__cc} \ + CXX=%{__cxx} \ + AR=%{__ar} \ + AS=%{__as} \ + LD=%{__ld} \ + NM=%{__nm} \ + RANLIB=%{__ranlib} \ + CC_FOR_TARGET=%{__cc} \ + GCC_FOR_TARGET=%{__cc} \ + CXX_FOR_TARGET=%{__cxx} \ + AR_FOR_TARGET=%{__ar} \ + AS_FOR_TARGET=%{__as} \ + LD_FOR_TARGET=%{__ld} \ + NM_FOR_TARGET=%{__nm} \ + RANLIB_FOR_TARGET=%{__ranlib} \ + HOST_CC=cc \ + CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \ + CFLAGS_FOR_BUILD="-O -pipe" \ + CFLAGS="$RPM_OPT_FLAGS -pipe" \ + CXXFLAGS="$RPM_OPT_FLAGS -pipe" \ +%endif + infodir=$RPM_BUILD_ROOT%{_infodir} install +%if %{build_ada} +pushd gcc/ada +cp -a gnat-style.info* gnat_rm.info* $RPM_BUILD_ROOT%{_infodir}/ +for i in gnat_ug_unx.info*; do + sed 's/gnat_ug_unx/gnat_ug/g' $i > $RPM_BUILD_ROOT%{_infodir}/`echo $i | sed 's/gnat_ug_unx/gnat_ug/'` +done +chmod 644 $RPM_BUILD_ROOT%{_infodir}/gnat* +popd +%endif + +FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1) + +file $RPM_BUILD_ROOT/%{_prefix}/bin/* | grep ELF | cut -d':' -f1 | xargs %{__strip} || : +%{__strip} $FULLPATH/{cc1,cc1obj,cc1plus,cpp0,tradcpp0,f771,jc1,jvgenmain} + +# fix some things +ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/cc +mkdir -p $RPM_BUILD_ROOT/lib +ln -sf ..%{_prefix}/bin/cpp $RPM_BUILD_ROOT/lib/cpp +ln -sf g77 $RPM_BUILD_ROOT%{_prefix}/bin/f77 +rm -f $RPM_BUILD_ROOT%{_infodir}/dir +gzip -9 $RPM_BUILD_ROOT%{_infodir}/*.info* +ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/gnatgcc + +mv $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.*a $FULLPATH/ +sed 's/-lgcjgc//g;s/-lzgcj//g;s/-lpthread//g' $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.spec > $FULLPATH/libgcj.spec +mv $RPM_BUILD_ROOT%{_prefix}/include/gc*.h $FULLPATH/include/ +mv $RPM_BUILD_ROOT%{_prefix}/include/j*.h $FULLPATH/include/ +mv -f $RPM_BUILD_ROOT%{_prefix}/include/{java,javax,gnu,org} $FULLPATH/include/ +mkdir -p $FULLPATH/include/gcj +mv -f $RPM_BUILD_ROOT%{_prefix}/include/gcj/* $FULLPATH/include/gcj/ +rmdir $RPM_BUILD_ROOT%{_prefix}/include/gcj + +mkdir -p $RPM_BUILD_ROOT/%{_lib} +mv -f `find $RPM_BUILD_ROOT%{_prefix}/lib -name libgcc_s.so.1` $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +chmod 755 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s.so.1 +ln -sf ../../%{_lib}/libgcc_s.so.1 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so +#ln -sf `echo "%{_prefix}" | sed 's~/[^/]*~\.\./~g'`../%{_lib}/libgcc_s.so.1 \ +# $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so +#mv -f $FULLPATH/libobjc.so.1* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +%if %{build_ada} +mv -f $FULLPATH/adalib/libgnarl-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +mv -f $FULLPATH/adalib/libgnat-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +rm -f $FULLPATH/adalib/libgnarl.so* $FULLPATH/adalib/libgnat.so* +%endif +pushd $FULLPATH +if [ "%{_lib}" = "lib" ]; then +ln -sf ../../../libobjc.so.1 libobjc.so +ln -sf ../../../libstdc++.so.5.* libstdc++.so +ln -sf ../../../libgcj.so.3.* libgcj.so +ln -sf ../../../libg2c.so.0.* libg2c.so +%if %{build_ada} +cd adalib +ln -sf ../../../../libgnarl-*.so.* libgnarl.so +ln -sf ../../../../libgnat-*.so.* libgnat.so +cd .. +%endif +else +ln -sf ../../../../%{_lib}/libobjc.so.1 libobjc.so +ln -sf ../../../../%{_lib}/libstdc++.so.5.* libstdc++.so +ln -sf ../../../../%{_lib}/libgcj.so.3.* libgcj.so +ln -sf ../../../../%{_lib}/libg2c.so.0.* libg2c.so +%if %{build_ada} +cd adalib +ln -sf ../../../../../%{_lib}/libgnarl-*.so.* libgnarl.so +ln -sf ../../../../../%{_lib}/libgnat-*.so.* libgnat.so +cd .. +%endif +fi +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libstdc++.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libsupc++.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libfrtbegin.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.*a . +# Strip debug info from Fortran/ObjC/Java static libraries +%{__strip} -g libg2c.a libobjc.a libgcj.a +# Fix up .la files +for i in *.la; do + sed -e '/^libdir/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \ + -e '/^dependency_libs/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \ + -e '/^dependency_libs/s~'\''$~ '\''~' \ + -e '/^dependency_libs/s~[ ][ ]*~ ~g' \ + -e '/^dependency_libs/s~-L[^ ]* ~~g' \ + -e '/^dependency_libs/s~-lgcc_s -lgcc -lc -lgcc_s -lgcc ~~g' \ + -e '/^dependency_libs/s~-lgcc -lc -lgcc ~~g' \ + -e '/^dependency_libs/s~-lc ~~g' \ + -e '/^dependency_libs/s~-lm \(-lm \)*~-lm ~g' \ + $i > $i.tmp + mv -f $i.tmp $i +done +popd +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.so.0.* +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.so.1.* +%if %{build_ada} +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnarl*so* +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnat*so* +%endif + +cat > $RPM_BUILD_ROOT%{_prefix}/bin/c89 <<"EOF" +#!/bin/sh +fl="-std=c89" +for opt; do + case "$opt" in + -ansi|-std=c89|-std=iso9899:1990) fl="";; + -std=*) echo "`basename $0` called with non ANSI/ISO C option $opt" >&2 + exit 1;; + esac +done +exec %{_prefix}/bin/gcc $fl ${1+"$@"} +EOF +cat > $RPM_BUILD_ROOT%{_prefix}/bin/c99 <<"EOF" +#!/bin/sh +fl="-std=c99" +for opt; do + case "$opt" in + -std=c99|-std=iso9899:1999) fl="";; + -std=*) echo "`basename $0` called with non ISO C99 option $opt" >&2 + exit 1;; + esac +done +exec %{_prefix}/bin/gcc $fl ${1+"$@"} +EOF +chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/c?9 + +cd .. +%find_lang %{name} + +%if %{cross_compile} +# Install syslimits.h for canadian cross compile. +pushd $RPM_BUILD_DIR/gcc-%{gcc_version}-%{DATE}/obj-%{_target_platform} +cp -af ../gcc/gsyslimits.h $FULLPATH/include/syslimits.h +# Fix the specs file. +cat gcc/specs | +awk ' +BEGIN { + cross=0; +} +/cross_compile/ { print; cross = 1; next; } +/^1$/ { + if (cross == 0) { + print; + } + else { + cross = 0; + print "0"; + } + next; +} +{ print; } +' > $FULLPATH/specs +popd +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gcc.info.gz + +%preun +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gcc.info.gz +fi + +%post -n cpp +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/cpp.info.gz + +%preun -n cpp +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/cpp.info.gz +fi + +%post g77 +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/g77.info.gz + +%preun g77 +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/g77.info.gz +fi + +%post java +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gcj.info.gz + +%preun java +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gcj.info.gz +fi + +%post gnat +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz + +%preun gnat +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz +fi + +%post -n libgcc -p /sbin/ldconfig + +%postun -n libgcc -p /sbin/ldconfig + +%post -n libstdc++ -p /sbin/ldconfig + +%postun -n libstdc++ -p /sbin/ldconfig + +%post -n libobjc -p /sbin/ldconfig + +%postun -n libobjc -p /sbin/ldconfig + +%post -n libgcj -p /sbin/ldconfig + +%postun -n libgcj -p /sbin/ldconfig + +%post -n libf2c -p /sbin/ldconfig + +%postun -n libf2c -p /sbin/ldconfig + +%post -n libgnat -p /sbin/ldconfig + +%postun -n libgnat -p /sbin/ldconfig + +%files -f %{name}.lang +%defattr(-,root,root) +%{_prefix}/bin/cc +%{_prefix}/bin/c89 +%{_prefix}/bin/c99 +%{_prefix}/bin/gcc +%{_prefix}/bin/gcov +%if !%{cross_compile} +%{_prefix}/bin/protoize +%{_prefix}/bin/unprotoize +%endif +%{_prefix}/bin/%{_target_platform}-gcc +%{_mandir}/man1/gcc.1* +%{_mandir}/man1/gcov.1* +%{_infodir}/gcc* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stddef.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdarg.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/varargs.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/float.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/limits.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdbool.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/iso646.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/syslimits.h +%ifarch %{ix86} x86_64 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/mmintrin.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/xmmintrin.h +%endif +%ifarch ia64 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ia64intrin.h +%endif +%ifarch ppc +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ppc-asm.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/altivec.h +%endif +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/README +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/collect2 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/crt*.o +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc_eh.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/specs +%{_prefix}/%{_lib}/libgcc_s.so +%doc gcc/README* gcc/*ChangeLog* + +%if !%{gcconly} +%files -n cpp +%defattr(-,root,root) +/lib/cpp +%endif +%{_prefix}/bin/cpp +%{_mandir}/man1/cpp.1* +%{_infodir}/cpp* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cpp0 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/tradcpp0 + +%files -n libgcc +%defattr(-,root,root) +/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +/%{_lib}/libgcc_s.so.1 + +%if !%{gcconly} +%files c++ +%defattr(-,root,root) +%{_prefix}/bin/%{_target_platform}-*++ +%{_prefix}/bin/g++ +%{_prefix}/bin/c++ +%{_prefix}/bin/c++filt +%{_mandir}/man1/g++.1* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1plus +%doc gcc/cp/ChangeLog* + +%files -n libstdc++ +%defattr(-,root,root) +%{_prefix}/%{_lib}/libstdc++.so.5* + +%files -n libstdc++-devel +%defattr(-,root,root) +%{_prefix}/include/c++ +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libsupc++.a +%doc libstdc++-v3/ChangeLog* libstdc++-v3/README* libstdc++-v3/docs/html/ + +%files objc +%defattr(-,root,root) +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/objc +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1obj +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.so +%doc rpm.doc/objc/* +%doc libobjc/THREADS* libobjc/ChangeLog + +%files -n libobjc +%defattr(-,root,root) +%{_prefix}/%{_lib}/libobjc.so.1* + +%files g77 +%defattr(-,root,root) +%{_prefix}/bin/g77 +%{_prefix}/bin/f77 +%{_mandir}/man1/g77.1* +%{_infodir}/g77* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/f771 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libfrtbegin.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/g2c.h +%doc gcc/f/README rpm.doc/g77/* + +%files -n libf2c +%defattr(-,root,root) +%{_prefix}/%{_lib}/libg2c.so.0* + +%files java +%defattr(-,root,root) +%{_prefix}/bin/gcj +%{_prefix}/bin/gcjh +%{_prefix}/bin/jcf-dump +%{_prefix}/bin/jv-scan +%{_mandir}/man1/gcj.1* +%{_mandir}/man1/gcjh.1* +%{_mandir}/man1/jcf-dump.1* +%{_mandir}/man1/jv-scan.1* +%{_infodir}/gcj* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jc1 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jvgenmain +%doc gcc/java/ChangeLog* + +%files -n libgcj +%defattr(-,root,root) +%{_prefix}/bin/jv-convert +%{_prefix}/bin/gij +%{_prefix}/bin/jar +%{_prefix}/bin/grepjar +%{_prefix}/bin/rmic +%{_prefix}/bin/rmiregistry +%{_mandir}/man1/jv-convert.1* +%{_mandir}/man1/gij.1* +%{_mandir}/man1/rmic.1* +%{_mandir}/man1/rmiregistry.1* +%{_prefix}/%{_lib}/libgcj.so.* +%{_prefix}/share/java +%{_prefix}/lib/security + +%files -n libgcj-devel +%defattr(-,root,root) +%{_prefix}/bin/addr2name.awk +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.spec +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gc*.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/j*.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/java +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/javax +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gnu +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gcj +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/org +%doc rpm.doc/boehm-gc/* rpm.doc/fastjar/* rpm.doc/libffi/* +%doc rpm.doc/libjava/* + +%if %{build_ada} +%files gnat +%defattr(-,root,root) +%{_prefix}/bin/gnat* +%{_infodir}/gnat* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adainclude +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adalib +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/gnat1 +%doc gcc/ada/ChangeLog + +%files -n libgnat +%defattr(-,root,root) +%{_prefix}/%{_lib}/libgnat-*.so.* +%{_prefix}/%{_lib}/libgnarl-*.so.* +%endif +%endif + +%changelog +* Tue Sep 3 2002 Bill Nottingham 3.2-7 +- fix calling of C++ destructors in certain cases + +* Tue Sep 3 2002 Jakub Jelinek 3.2-6 +- update from CVS (but revert C++ tail padding patches + for now) +- further fixes to make libstdc++-v3 build on glibc 2.3 +- run libstdc++-v3 make check-abi on IA-32 during testing + +* Fri Aug 30 2002 Jakub Jelinek 3.2-5 +- disable tail copy patches, they seem to still have problems +- make libstdc++-v3 build on glibc 2.3 (and use thread-local + locale model) +- fix c89 and c99 scripts (#73104) + +* Wed Aug 26 2002 Jakub Jelinek 3.2-4 +- reorder alpha_encode_section_info checks slightly to fix an ICE + when building glibc and to take better advantage of visibility + attribute on Alpha +- as gdb is not there yet, disable -momit-leaf-frame-pointer + by default for now on IA-32 +- fix IA-64 bootstrap with tail padding patch (Jason Merrill, Daniel Berlin) +- fix x86-64 %RIP to %rip, only output (%rip) if no other relocation + is used (Richard Henderson) + +* Fri Aug 23 2002 Jakub Jelinek 3.2-3 +- take advantage of __attribute__((visibility())) on Alpha +- avoid copying tail padding (Jason Merrill) + +* Thu Aug 22 2002 Jakub Jelinek 3.2-2 +- fixed Dwarf2 DW_OP_GNU_push_tls_address patch from Richard Henderson +- don't mention removed -a and -ax options in the documentation + (Nathan Sidwell, #72233) +- fixed __typeof() followed by __asm() redirection from Alexandre Oliva + +* Wed Aug 14 2002 Jakub Jelinek 3.2-1 +- update to 3.2 release +- fix x86-64 PR target/7559 (Jan Hubicka) +- fix -fprefetch-loop-arrays (Janis Johnson) +- fix x86-64 prefetch (Jan Hubicka) + +* Fri Aug 9 2002 Jakub Jelinek 3.2-0.3 +- istream fix (Benjamin Kosnik) +- emit Dwarf2 DW_OP_GNU_push_tls_address extension for TLS (Richard Henderson) +- temporarily disable __typeof() + __asm() fix + +* Thu Aug 8 2002 Jakub Jelinek 3.2-0.2 +- update from 3.2 branch + - ABI incompatible changes in libstdc++.so.5, long long bitfield + layout on IA-32 (both C and C++), oversized bitfields layout + on IA-32 and bitfields with base type with __attribute__((aligned ())) + - fix strstream segfaults (#68292, Benjamin Kosnik) +- fix __attribute__((visibility())) together with __asm__() + function redirection +- fix __typeof() followed by __asm() redirection (Alexandre Oliva) +- fix TLS ICE on glibc (#70061) +- fix K6 ICE on linux kernel (#69989, Richard Sandiford, Jan Hubicka) +- fix inlining bug with labels (#70941) +- fix fold-const bug (#70541) +- fix PR preprocessor/7358 (Neil Booth) +- error when mixing __thread and non-__thread declarations + (#70059, Aldy Hernandez) +- fix TLS bug on g++.dg/tls/diag-1.C (Jason Merrill) +- add -mcmodel= x86-64 documentation (Andreas Jaeger) +- avoid TLS emitting movl %gs:0, MEMORY on IA-32 (#71033) + +* Mon Jul 22 2002 Jakub Jelinek 3.2-0.1 +- first attempt for gcc 3.2 +- remove .la files + +* Sat Jul 20 2002 Jakub Jelinek 3.1-10 +- update from 3.1 branch + - add throw() to set_new_handler (Andreas Schwab) + - fixed PR optimization/7147, optimization/7153 +- make sure pic register is set up even when the only @PLT calls + are done in EH basic blocks (Richard Henderson) + +* Sun Jul 14 2002 Jakub Jelinek 3.1-9 +- define %%_gnu to nothing for compatibility + +* Sat Jul 13 2002 Jakub Jelinek 3.1-8 +- update from 3.1 branch + - fix OpenOffice miscompilation (PR c++/7279, Jason Merrill) + - PRs c++/7224, c++/6255, optimization/7145, c++/6706, preprocessor/7070, + middle-end/6963, target/6841, target/6770, target/6719, + other/6836, libstdc++/7057, libstdc++/7097, libstdc++/3946, + libstdc++/7173 + - fix a GC bug with named labels in C++ (Jim Wilson) + - fix ICE on Mesa (Bernd Schmidt, #65771) +- added some NRV tests +- fix typo in i386 specs (PR c/7242) +- fix IA-32 ICE with shifts by negative values followed by compare + (PR middle-end/7245, #68395) +- fixed DWARF-2 output for const char * (PR debug/7241) +- actually enable __cxa_atexit for standard compliance at configury time +- added PPC as Ada enabled architecture + +* Wed Jun 19 2002 Jakub Jelinek 3.1-7 +- update from 3.1 branch + - PRs target/6922, opt/6722, c/7030, c/6677, objc/6834, c++/6892, + c++/6723, opt/6793 +- use __cxa_atexit for standard compliance: + if your C++ project knows it won't call atexit from within its + static constructors, use -fno-use-cxa-atexit to optimize it +- share hard register rtxs where possible to speed the compiler up (Jeff Law) +- optimize tree_code_* arrays (Kaveh Ghazi) +- don't link prefix.o into libgnat, link libgnat against libgcc_s and + libgnarl against libgnat +- fix typo in GNAT %%post (#66847, #66941, #66639) +- add TLS support + +* Fri Jun 7 2002 Jakub Jelinek 3.1-6 +- add GNAT +- remove DT_RPATH from Java binaries (#66103) +- obsolete kaffe, install jar as %{_prefix}/bin/jar +- add include/org directory in java +- add rmic and rmiregistry programs to libgcj +- add info documentation for gcj and various man pages +- add message catalogues for da, el, es, fr, ja, nl, sv, tr +- don't put IA-64 vtables with relocations into read-only sections + with -fpic + +* Tue Jun 4 2002 Jakub Jelinek 3.1-5 +- update from 3.1 branch + - PRs optimization/6822, preprocessor/6844, target/6838, target/6788, + libstdc++/6886, libstdc++/6795, libstdc++/6811 +- m$ compatibility for unnamed fields as typedef of struct/union + (PR c/6660) +- fix -fverbose-asm with unnamed fields (PR c/6809) +- fix -mmmx ICE (PR optimization/6842) +- default to -momit-leaf-frame-pointer on i386 (Richard Henderson) +- use linkonce section/hidden symbol for i686 pic getpc thunks + (Richard Henderson) + +* Tue May 28 2002 Jakub Jelinek 3.1-4 +- rebuilt + +* Sat May 25 2002 Jakub Jelinek 3.1-3 +- update from 3.1 branch + - PRs other/6782, preprocessor/6780, preprocessor/6517, + libstdc++/6282, libstdc++/6701, libstdc++/6701 + - fix out << "" bug (Ben Kosnik, #65409, PR libstdc++/6750) +- 3 new patches + - fix C++ __PRETTY_FUNCTION__ (PR c++/6794) + - fix ICE on jikes (#65379) + - add test for fixed mozilla miscompilation +- include intrinsic headers on IA-32/x86-64, include altivec.h on PPC + +* Wed May 22 2002 Jakub Jelinek 3.1-2 +- update from 3.1 branch +- 8 new patches + - fix as version test for 2.12.1 and newer binutils non-CVS releases + - fix ICE in do_subst (#65049) + - fix SSE conditional move (PR target/6753) + - fix SPARC CSE ICE (PR optimization/6759) + - fix x86_64 dbx64_register_map typo (Jan Hubicka) + - fix DWARF-2 with flag_asynchronous_unwind_tables set for leaf + functions (Jan Hubicka) + - fix DWARF-2 x86_64 __builtin_dwarf_reg_sizes (Jan Hubicka) + - fix x86_64 movabsdi (Michael Matz) + +* Wed May 15 2002 Jakub Jelinek 3.1-1 +- update to 3.1 final +- 15 new patches + - fix PR c/6643 + - fix fold-const.c typo + - fix unitialized pointer-to-member values (Alexandre Oliva) + - fix templates with asm inputs (Jason Merrill) + - fix -fdata-section (Andreas Schwab) + - readd warning about i386 -malign-double into documentation (Jan Hubicka) + - fix PR libstdc++/6594 (Ben Kosnik) + - fix PR PR libstdc++/6648 (Paolo Carlini) + - fix libstdc++ testsuite rlimits (Rainer Orth) + - s390 java support (Gerhard Tonn) + - rotate testcases (Tom Rix) + - build libiberty with -fpic on x86_64 (Andreas Schwab) + - fix x86_64 multilib build (Bo Thorsen) + - fix x86_64 ASM_OUTPUT_MI_THUNK (Jan Hubicka) + - fix loop-2[cd].c tests on i386 (Eric Botcazou) +- fix typo in g77 info files tweaking +- fix libgcj.so symlink + +* Thu May 9 2002 Jakub Jelinek 3.1-0.28 +- update to CVS 3.1 branch + - PR c++/6212, target/6429, opt/6534, c/6543, target/6561, c/6569 +- fix x86_64 q_regs_operand (Jan Hubicka) +- better PR c++/6381 fix (Jason Merrill) + +* Fri May 3 2002 Jakub Jelinek 3.1-0.27 +- update to CVS 3.1 branch + - PR target/5628, libstdc++/5820, c++/6396, preprocessor/6489, + libstdc++/6501, libstdc++/6511, target/6512, libstdc++/6513, + bootstrap/6514, opt/6516, bootstrap/6525, c++/6527, libstdc++/6533, + target/6540 +- fix PR target/6542, target/6522, libstdc++/6549 + +* Mon Apr 29 2002 Jakub Jelinek 3.1-0.26 +- update to CVS 3.1 branch + - PR c/3581, libstdc++/4150, libstdc++/4164, c/5154, c/5430, c++/5504, + c++/5658, c++/5719, f/6138, libgcj/6158, middle-end/6205, c++/6256, + c/6300, c++/6331, c/6343, c/6344, c++/6352, c/6358, libstdc++/6360, + c++/6395, target/6413, libstdc++/6414, target/6422, bootstrap/6445, + optimization/6475, target/6476, c++/6477, c++/6479, c++/6486, c++/6492, + target/6494, target/6496, c/6497, target/6500 +- fix PR c++/6396 +- run make check as part of build process + +* Thu Apr 18 2002 Jakub Jelinek 3.1-0.25 +- update to CVS 3.1 branch + - PR opt/420, c++/525, target/817, target/1538, opt/3967, target/3997, + opt/4120, bootstrap/4191, opt/4311, optimization/4328, c++/4884, c++/4934, + c/5078, c++/5104, opt/5120, c++/5189, c++/5373, target/5446, c/5484, + c++/5507, c++/5571, c++/5636, target/5672, target/5715, target/5886, + c++/5933, c++/5964, c++/5998, opt/6007, target/6032, target/6041, + target/6054, c++/6073, target/6082, optimization/6086, target/6087, + middle-end/6096, middle-end/6098, middle-end/6099, middle-end/6100, + middle-end/6102, fortran/6106, c++/6119, opt/6165, optimization/6177, + c++/6179, optimization/6189, c/6202, c/6223, optimization/6233, + middle-end/6279, c/6290, optimization/6305, target/6305, bootstrap/6315, + c++/6320... +- fix PR c++/6316 + +* Wed Mar 27 2002 Jakub Jelinek 3.1-0.24 +- update to CVS 3.1 branch + - PRs c/5656, c/5972, bootstrap/4192, target/4792, bootstrap/4195, + optimization/5854, target/6043, c++/6037, bootstrap/4128, target/5740, + c/5597, optimization/5863, optimization/5742, target/3177, c/5354, + optimization/5999, target/5977, middle-end/5731, target/5312... + +* Fri Mar 15 2002 Jakub Jelinek 3.1-0.23.1 +- fix info and man page generation + +* Thu Mar 14 2002 Jakub Jelinek 3.1-0.23 +- update to CVS 3.1 branch + - fix IA-64 packet selection (PR optimization/5892) + - make highest_pow2_factor work for all constants (PR middle-end/5877) + - fix -Wunused (#61047) + - fix loop on mixed mode class assignments (#60923) + - fix wide character literals + - support SPARC v9 long distance branches (PR target/5626) + - fix SPARC leaf functions + - fix a rtl sharing problem (Richard Henderson, #60760, + PR optimization/5844) + - fix va_arg with variable size types (PR c/3711) + - PRs optimization/5901, optimization/5878, 5693, preprocessor/5899 +- fix C++ ?: at the end of stmt expr (PR c++/5373) +- fix loop unrolling with sibcalls (PR optimization/5891) + +* Thu Mar 7 2002 Jakub Jelinek 3.1-0.22 +- update to CVS 3.1 branch + - fix ICE with volatile long long (#60650) + - fix tempbuf.h (Philipp Thomas, #60212) + - fix -fssa-ccp (Jeff Law, #60651) + - versioned libstdc++ + - backport __attribute__((visibility("..."))) patches from trunk +- include libstdc++ html documentation + +* Tue Feb 5 2002 Jakub Jelinek 3.1-0.21 +- update to CVS HEAD + - fix demangler (H.J. Lu, #59300, #59310) + - fix typo in IA-32 specs file (#59081) + - support moving SFmode values in MMX regs if -mmmx (#59083) + - fix recog_for_combine (#59084) + - don't ICE when inserting insns on edge from bb0 to bb0 (Bernd Schmidt, + #59087) + - make sure configure has not time in the future (#59203) + - fix division/modulo by certain constants (#58065, PR c/5304) + - fix -Wswitch (PR c/4475) + +* Thu Jan 31 2002 Jakub Jelinek 3.1-0.20 +- update to CVS HEAD + - fix jar (Tom Tromey) + - fix loop unrolling (Richard Henderson) + +* Wed Jan 30 2002 Jakub Jelinek 3.1-0.19 +- update to CVS HEAD + - fix a reload bug on ia32 (#58579, #58648) + - issue error about unknown -W* options (#58909) + - fix ia64 libbfd miscompilation (#58694) + - register all pending unparsed_text structures with GC (#58647) + - fix __builtin_apply with ia32 -msse (#58447) + - prevent ia64 prologue insns saving regs required for eh from being + deleted (#58387) + +* Tue Jan 15 2002 Jakub Jelinek 3.1-0.18 +- update to CVS HEAD + - handle static x[] = { [X...Y] = (foo) { Z } } (#58338) + - fix getdents.os miscompilation (Richard Henderson, #58308) + - fix ICE in try_forward_edges (#58125) + - fix ICE with -fexceptions -foptimize-sibling-calls + +* Tue Jan 8 2002 Jakub Jelinek 3.1-0.17 +- avoid division by 0 when computing prediction probabilities (#57992) +- fix ICE due to store_expr not adjusting value back for mode +- increase -ftemplate-depth default value to 500 + +* Mon Jan 7 2002 Jakub Jelinek 3.1-0.16 +- if using PT_GNU_EH_FRAME registry, work around assembler bug resp. feature + and don't provide weak prototypes of functions which won't be used +- on Alpha, fix a typo so that crtbeginT.o is built and installed +- fix glibc inl-tester miscompilation on ia32 + +* Sun Jan 6 2002 Jakub Jelinek 3.1-0.15 +- update to CVS HEAD (fix glibc bootstrap failure) + +* Thu Jan 3 2002 Jakub Jelinek 3.1-0.14 +- update to CVS HEAD (#57907) + - fix alpha bootstrap (Richard Henderson) +- fix simplification of (div:SI (???:DI ???) (const_int 1)) + (#57916) +- add contrib/gcc_update --touch + +* Tue Jan 1 2002 Jakub Jelinek 3.1-0.13 +- update to CVS HEAD (fix glibc miscompilation on alpha) +- fix objc to not emit __objc_class_name_* without type and size + +* Mon Dec 31 2001 Jakub Jelinek 3.1-0.12 +- update to CVS HEAD +- fix sed commands for .la files +- make Alpha use PT_GNU_EH_FRAME + +* Thu Dec 27 2001 Jakub Jelinek 3.1-0.11 +- update to CVS HEAD (#57165, #57212, #57467, #57488, #57502, + #57505, #57574) +- readd .la files after fixing them up by sed +- add %%defattr(-,root,root) to libobjc subpackage + +* Mon Dec 3 2001 Jakub Jelinek 3.1-0.10 +- one more gcc.spec fix for passing --gdwarf-2 resp. --gstabs to as +- fix conditional register dead computation on IA-64 +- fix extern array of incomplete structures handling +- fix gcc -xc - +- fix Fortran ICEs with SAVE_EXPRs (Richard Kenner) + +* Tue Nov 27 2001 Jakub Jelinek 3.1-0.9 +- update to CVS HEAD +- make DWARF 2 preferred debugging format on Linux + +* Mon Nov 12 2001 Jakub Jelinek 3.1-0.8 +- don't ship .la files (#56072) +- include libfrtbegin.a (#56098) + +* Mon Nov 12 2001 Jakub Jelinek 3.1-0.7 +- update to CVS HEAD +- back out Nov 7th loop.c change for now + +* Fri Nov 9 2001 Jakub Jelinek 3.1-0.6 +- update to CVS HEAD +- frame unwind compatibility with 7.[12] binutils + +* Tue Nov 6 2001 Jakub Jelinek 3.1-0.5 +- update to CVS HEAD +- merge DW_EH_PE_indirect constants and their relocs + +* Thu Oct 25 2001 Jakub Jelinek 3.1-0.4 +- don't loop forever or ICE on bogus array initializers (#53704) +- fix store motion with pure calls +- disable store motion for now + +* Tue Oct 23 2001 Jakub Jelinek 3.1-0.3 +- fix inlining of C nested functions with auto prototypes + +* Mon Oct 22 2001 Jakub Jelinek 3.1-0.2 +- update to CVS HEAD +- tree inlining fix from Alexandre Oliva +- fix anonymous union ICE on alpha + +* Mon Oct 15 2001 Jakub Jelinek 3.1-0.1 +- switch package to main compiler from alternate compiler +- update to CVS HEAD +- early gcc-2.96-RH compatibility in __frame_state_for +- change weak function tests for functions always present in GLIBC 2.2 + into simple non-weak calls in crt*.o to avoid unnecessary symbol + lookups and prelink conflicts +- don't link against libgcc_s C shared libraries + +* Tue Oct 2 2001 Jakub Jelinek 3.0.1-4 +- update from CVS 3.0 branch + - ia64 function descriptors in vtables +- handle large files in Fortran (#53328) +- allow Java programs to be statically linked (#53605) +- remove #include_next patch, Benjamin commited it + +* Thu Sep 6 2001 Jakub Jelinek 3.0.1-3 +- don't use #include_next in headers (Benjamin Kosnik, #53262) + +* Wed Sep 5 2001 Jakub Jelinek 3.0.1-2 +- update from CVS 3.0 branch +- check all gcc-2.96-RH patches whether they have made it into 3.0.1, + and if not, whether they are appropriate for 3.0.1 +- 8 new patches + - add 36 testcases from gcc-2.96-RH + - fix ICE on very questionable C++ code from JDK (#39858, #52960) + - fix -frepo (Nathan Sidwell, #52877) + - avoid generating bogus .stabs (#49214) + - issue a clear error message about invalid ia32 floating point + asm constraints (#27137) + - fix some comment typos + - fix ADDRESSOF recognition (#29686) + +* Mon Aug 27 2001 Jakub Jelinek 3.0.1-1 +- update from CVS (3.0.1 final) +- properly handle throw() exception specifiers in template decls (#51824) +- fix IA-64 varargs handling in presence of additional anonymous arguments + (#50757) +- fix boehm-gc for prelink +- fix a typo in gcc3-c++ description (#52323) +- remove Chill from package summary (#51764) + +* Tue Aug 7 2001 Jakub Jelinek 3.0-6 +- update from CVS + - fix glibc vfprintf miscompilation +- don't warn about if (&foo) if foo is weak (H.J.Lu, #50855) + +* Wed Jul 25 2001 Jakub Jelinek 3.0-5 +- include libgcjgc.a in libgcj3-devel +- include libgcjgc.so.* in libgcj3 on ia64 +- remove dependency on libgcj on ia64 +- add ldconfig to libgcj3 post/postun + +* Tue Jul 24 2001 Jakub Jelinek 3.0-4 +- update from CVS +- make gcc3-java/libgcj3* packages, so that they can coexist + with 2.96-RH Java +- make sure shared Java libraries are built with proper dependencies + +* Wed Jul 11 2001 Jakub Jelinek 3.0-3 +- fix libgcc_s.so and libstdc++.so symlinks +- don't ship jar + +* Tue Jul 10 2001 Jakub Jelinek 3.0-2 +- move libstdc++.so into gcc-lib +- add libobjc.so symlink + +* Tue Jul 10 2001 Jakub Jelinek 3.0-1 +- new rpm diff --git a/patches/gcc/3.2.3/README-sh b/patches/gcc/3.2.3/README-sh new file mode 100644 index 0000000..a75042a --- /dev/null +++ b/patches/gcc/3.2.3/README-sh @@ -0,0 +1,16 @@ +http://mirror.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains the following patches: + +gcc-20030210-sh-linux-1.patch +gcc-3.2.3-libffi-1.patch +gcc-3.2.3-sh-linux-dwarf2-1.patch (*not* applied by the spec file, it's in there by accident) + +gcc-3.2.3-libffi-1.patch was needed just to build, I think. + +After that was applied, sh4 gcc seemed to compile fine, but c++ programs +failed to execute because libstdc++.so.5 was built without version +info. This was caused directly by libstdc++-v3/configure setting +SYMVER_MAP=config/linker-map.dummy because it sees that +no libgcc_s.so was generated; configure says + checking for shared libgcc... no. + +Applying gcc-20030210-sh-linux-1.patch in hopes it makes those problems go away. diff --git a/patches/gcc/3.2.3/config.sub.patch b/patches/gcc/3.2.3/config.sub.patch new file mode 100644 index 0000000..928f911 --- /dev/null +++ b/patches/gcc/3.2.3/config.sub.patch @@ -0,0 +1,72 @@ +When configuring a s390->s390 or cris->cris crosscompiler +(ok, I haven't hit this yet, but one of these days I'll get me an account +on an s390, and then I'll need this patch :-), you'll get the +following error: + ++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure +--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu +--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2 +--enable-languages=c +--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390- +unknown-linux-gnu --enable-threads=no --without-headers --with-newlib +--disable-shared +... +*** --with-headers is only supported when cross compiling + +This error pops up only when you're using Daniel Jacobowitz's technique +of slightly changing the target and host tuples to make them different +enough to force gcc's build system to not try to pull in system libraries +or headers. This technique is needed e.g. to build an x86 -> x86 +cross-compiler. +(The LFS developers ran into the same bug that prompted me to use +this technique; they point people who run into it to +http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different +way of avoiding this problem. I think the tuple tweak is the way to go, though.) + +config-patches@gnu.org rejected this patch, on the grounds that there +is only one vendor of each of those two architectures, so the +canonicalization is by definition correct. When I pointed out the +difficulty this causes for people building s390 -> s390 or +cris -> cris compilers that are incompatible with the system +libraries and thus must be built like cross-compilers, he grumped and said +"autoconf should let you specify a cross-compiler in some other way than +comparing tuple strings". + + + +--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003 ++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003 +@@ -433,9 +433,12 @@ + crds | unos) + basic_machine=m68k-crds + ;; +- cris | cris-* | etrax*) ++ cris | etrax*) + basic_machine=cris-axis + ;; ++ cris-*) ++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -820,11 +823,17 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- s390 | s390-*) ++ s390) + basic_machine=s390-ibm + ;; +- s390x | s390x-*) ++ s390-*) ++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ s390x) + basic_machine=s390x-ibm ++ ;; ++ s390x-*) ++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sa29200) + basic_machine=a29k-amd diff --git a/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch new file mode 100644 index 0000000..bd717f5 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch @@ -0,0 +1,105 @@ +# See http://gcc.gnu.org/PR7383, http://www.kegel.com/xgcc3/ppc405erratum77.html +# Fixed in gcc-3.3 + +diff -aur gcc-20020722.orig/gcc/config/rs6000/rs6000.h gcc-20020722/gcc/config/rs6000/rs6000.h +--- gcc-20020722.orig/gcc/config/rs6000/rs6000.h Thu Jul 25 09:32:21 2002 ++++ gcc-20020722/gcc/config/rs6000/rs6000.h Thu Jul 25 09:34:45 2002 +@@ -66,7 +66,7 @@ + %{mcpu=rsc1: -D_ARCH_PWR} \ + %{mcpu=401: -D_ARCH_PPC} \ + %{mcpu=403: -D_ARCH_PPC} \ +-%{mcpu=405: -D_ARCH_PPC} \ ++%{mcpu=405: -D_ARCH_PPC -D__PPC405__} \ + %{mcpu=505: -D_ARCH_PPC} \ + %{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \ + %{mcpu=602: -D_ARCH_PPC} \ +diff -aur gcc-20020722.orig/libjava/sysdep/powerpc/locks.h gcc-20020722/libjava/sysdep/powerpc/locks.h +--- gcc-20020722.orig/libjava/sysdep/powerpc/locks.h Thu Jul 25 09:32:30 2002 ++++ gcc-20020722/libjava/sysdep/powerpc/locks.h Thu Jul 25 11:39:13 2002 +@@ -11,6 +11,17 @@ + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + ++#ifdef __PPC405__ ++// workaround for PPC405 erratum #77 - 07/18/02 JRO, dank, NN. References: ++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++// http://www.kegel.com/xgcc3/ppc405erratum77.html ++// FIXME: using dbct instead of sync would be faster ++#define __LIBGCJ_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LIBGCJ_PPC405_ERR77_SYNC ++#endif ++ + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + +@@ -25,6 +36,7 @@ + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" ++ __LIBGCJ_PPC405_ERR77_SYNC + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " +@@ -58,6 +70,7 @@ + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" ++ __LIBGCJ_PPC405_ERR77_SYNC + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " +diff -aur gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h +--- gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:32:31 2002 ++++ gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:34:45 2002 +@@ -32,6 +32,17 @@ + + typedef int _Atomic_word; + ++#ifdef __PPC405__ ++// workaround for PPC405 erratum #77 - 07/18/02 JRO & dank. References: ++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++// http://www.kegel.com/xgcc3/ppc405erratum77.html ++// FIXME: using dbct instead of sync would be faster ++#define __LIBSTDCPP_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LIBSTDCPP_PPC405_ERR77_SYNC ++#endif ++ + static inline _Atomic_word + __attribute__ ((__unused__)) + __exchange_and_add (volatile _Atomic_word* __mem, int __val) +@@ -42,6 +53,7 @@ + "0:\t" + "lwarx %0,0,%2 \n\t" + "add%I3 %1,%0,%3 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %1,0,%2 \n\t" + "bne- 0b \n\t" + "/* End exchange & add */" +@@ -61,6 +73,7 @@ + "0:\t" + "lwarx %0,0,%1 \n\t" + "add%I2 %0,%0,%2 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %0,0,%1 \n\t" + "bne- 0b \n\t" + "/* End atomic add */" +@@ -78,6 +91,7 @@ + "/* Inline always swap */\n" + "0:\t" + "lwarx %0,0,%1 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %2,0,%1 \n\t" + "bne- 0b \n\t" + "/* End always swap */" +@@ -98,6 +112,7 @@ + "lwarx %0,0,%1 \n\t" + "cmpwi %0,0 \n\t" + "bne- 1f \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %2,0,%1 \n\t" + "bne- 0b \n" + "1:\n\t" diff --git a/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch new file mode 100644 index 0000000..4393078 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch @@ -0,0 +1,1761 @@ +diff -ruN gcc-20030210.orig/boehm-gc/configure gcc-20030210/boehm-gc/configure +--- gcc-20030210.orig/boehm-gc/configure Fri Jan 31 19:17:00 2003 ++++ gcc-20030210/boehm-gc/configure Sat Feb 22 01:40:14 2003 +@@ -1922,7 +1922,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/config-ml.in gcc-20030210/config-ml.in +--- gcc-20030210.orig/config-ml.in Fri Jan 31 19:16:59 2003 ++++ gcc-20030210/config-ml.in Sat Feb 22 01:40:14 2003 +@@ -545,6 +545,7 @@ + if [ -d ../$${dir}/$${lib} ]; then \ + flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ + if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \ ++ DESTDIR="$(DESTDIR)" \ + CFLAGS="$(CFLAGS) $${flags}" \ + prefix="$(prefix)" \ + exec_prefix="$(exec_prefix)" \ +diff -ruN gcc-20030210.orig/debian/edit-specs.in gcc-20030210/debian/edit-specs.in +--- gcc-20030210.orig/debian/edit-specs.in Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/edit-specs.in Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,45 @@ ++/^*asm:$/ { ++n ++c\ ++@AS_ENDIAN_FLAG@ %{mrelax:-relax} ++} ++/^*cpp:$/ { ++n ++c\ ++%(cpp_default_cpu_spec) %(subtarget_cpp_spec) %(subtarget_cpp_ptr_spec) %(subtarget_cpp_endian_spec) ++} ++/^*cc1:$/ { ++n ++c\ ++-musermode @CC1_CPU_ENDIAN_FLAGS@ %{profile:-p} ++} ++/^*link:$/ { ++n ++c\ ++%{!static:--eh-frame-hdr} @LINKER_CPU_ENDIAN_FLAGS@ @LINKER_RPATH_LINK_FLAG@ %{mrelax:-relax} %{shared:-shared} %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static} ++} ++/^*multilib:$/ { ++n ++c\ ++. ; ++} ++/^*multilib_matches:$/ { ++n ++c\ ++ ++} ++/^*multilib_options:$/ { ++n ++c\ ++ ++} ++/^*subtarget_cpp_endian_spec:$/ { ++n ++c\ ++@CPP_ENDIAN_DEF@ ++} ++/^*cpp_default_cpu_spec:$/ { ++n ++c\ ++@CPP_CPU_DEFS@ ++} +diff -ruN gcc-20030210.orig/debian/install-CPU-linux gcc-20030210/debian/install-CPU-linux +--- gcc-20030210.orig/debian/install-CPU-linux Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/install-CPU-linux Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,111 @@ ++#! /bin/sh ++ ++VERSION=$1; shift ++CPU=$1 ++ ++# literally (binary-ly) same ++PROGS_C="cpp gcc" ++PROGS_ADDITIONAL="c++ g++ g77 gcj" ++ ++DRIVERS_C="cc1 cpp0 tradcpp0" ++DRIVERS_ADDITIONAL="cc1obj cc1plus collect2 f771 jc1 jvgenmain" ++if [ -z "$STEP1_COMPILER_BUILD" ]; then ++ PROGS="$PROGS_C $PROGS_ADDITIONAL" ++ DRIVERS="$DRIVERS_C $DRIVERSADDITIONAL" ++ INITIAL="" ++else ++ PROGS=$PROGS_C ++ DRIVERS=$DRIVERS_C ++ INITIAL="-initial" ++fi ++ ++OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++LIBS_C="libgcc.a" ++LIBS_1="libgcc_s.so libgcc_s.so.1 libstdc++.so libstdc++.so.3 libstdc++.so.3.0.2" ++LIBS_2="libobjc.a libstdc++.a libsupc++.a" ++INCLUDE="include" ++ ++cd debian/gcc-sh-linux-others${INITIAL} || exit 1 ++ ++# Make directories. ++mkdir -p usr/bin usr/share usr/share/man usr/share/man/man1 usr/lib \ ++ usr/lib/gcc-lib usr/lib/gcc-lib/${CPU}-linux \ ++ usr/lib/gcc-lib/${CPU}-linux/${VERSION} \ ++ usr/${CPU}-linux usr/${CPU}-linux/lib ++ ++# Make symbolic links for include dir. ++(cd usr/${CPU}-linux; ln -s ../sh-linux/include .) ++ ++# Make symbolic links for executables. ++(cd usr/bin; ++ for p in ${PROGS}; do ++ ln -s shCPU-linux-GCC ${CPU}-linux-$p ++ done) ++ ++case "${CPU}" in ++ sh3) ++ MULTILIBDIR= ++ AS_ENDIAN_FLAG="-little" ++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__" ++ CC1_CPU_ENDIAN_FLAGS="-ml -m3" ++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3-linux/lib" ++ ;; ++ sh3eb) ++ MULTILIBDIR=/mb ++ AS_ENDIAN_FLAG="-big" ++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__" ++ CC1_CPU_ENDIAN_FLAGS="-mb -m3" ++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3eb-linux/lib" ++ ;; ++ sh4) ++ MULTILIBDIR=/m4 ++ AS_ENDIAN_FLAG="-little" ++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH4__" ++ CC1_CPU_ENDIAN_FLAGS="-ml -m4" ++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4-linux/lib" ++ ;; ++ sh4eb) ++ MULTILIBDIR=/mb/m4 ++ AS_ENDIAN_FLAG="-big" ++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH4__" ++ CC1_CPU_ENDIAN_FLAGS="-mb -m4" ++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4eb-linux/lib" ++ ;; ++esac ++ ++# Make symbolic links for GCC drivers, objects, libraries, and include dir. ++(cd usr/lib/gcc-lib/${CPU}-linux/${VERSION}; ++ for f in ${DRIVERS} ${INCLUDE}; do ++ ln -s ../../sh-linux/${VERSION}/$f $f; ++ done ++ for f in ${OBJS} ${LIBS_C}; do ++ ln -s ../../sh-linux/${VERSION}${MULTILIBDIR}/$f $f; ++ done) ++ ++if [ -z "$STEP1_COMPILER_BUILD" ]; then ++ for f in ${LIBS_1} ${LIBS_2}; do ++ mv ../gcc-sh-linux/usr/sh-linux/lib${MULTILIBDIR}/$f usr/${CPU}-linux/lib/; ++ done ++fi ++ ++sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \ ++ -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \ ++ -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \ ++ -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \ ++ -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \ ++ -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \ ++ ../edit-specs.in >../edit-specs-${CPU}.sed ++ ++sed -f ../edit-specs-${CPU}.sed \ ++ ../gcc-sh-linux${INITIAL}/usr/lib/gcc-lib/sh-linux/${VERSION}/specs \ ++ > usr/lib/gcc-lib/${CPU}-linux/${VERSION}/specs ++ ++exit 0 +diff -ruN gcc-20030210.orig/debian/multilib-symlink gcc-20030210/debian/multilib-symlink +--- gcc-20030210.orig/debian/multilib-symlink Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/multilib-symlink Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,10 @@ ++#! /bin/sh ++ ++cd /usr/sh-linux/lib ++ln -s ../../sh3-linux/lib/{*.a,*.so*,*.o} . ++cd m4 ++ln -s ../../../sh4-linux/lib/{*.a,*.so*,*.o} . ++cd ../mb ++ln -s ../../../sh3eb-linux/lib/{*.a,*.so*,*.o} . ++cd m4 ++ln -s ../../../../sh4eb-linux/lib/{*.a,*.so*,*.o} . +diff -ruN gcc-20030210.orig/debian/shCPU-linux-GCC gcc-20030210/debian/shCPU-linux-GCC +--- gcc-20030210.orig/debian/shCPU-linux-GCC Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/shCPU-linux-GCC Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,59 @@ ++#! /bin/bash ++ ++BASENAME=${0##*/} ++PROG=${BASENAME##*-} ++CPU=${BASENAME%%-*} ++ ++if [ "$PROG" = gcc ]; then ++ if [ "$1" = "-b" -a "$2" = "i386-linux" ]; then ++ shift 2 ++ exec /usr/bin/gcc "$@" ++ elif [ "$1" = "-print-multi-lib" -o "$1" = "--print-multi-lib" ]; then ++ echo ".;" ++ exit 0 ++ elif [ "$1" = "-print-multi-os-directory" -o "$1" = "--print-multi-os-directory" ]; then ++ echo "." ++ exit 0 ++ elif [ "$1" = "-dumpspecs" ]; then ++ cat /usr/lib/gcc-lib/${CPU}-linux/@@VERSION@@/specs ++ exit 0 ++ fi ++fi ++ ++case "${CPU}" in ++ sh3) ++ ARCH=m3 ++ DEFINES="-D__sh3__ -D__SH3__ -D__LITTLE_ENDIAN__" ++ ENDIAN=ml ++ ;; ++ sh3eb) ++ ARCH=m3 ++ DEFINES="-D__sh3__ -D__SH3__ -D__BIG_ENDIAN__" ++ ENDIAN=mb ++ ;; ++ sh4) ++ ARCH=m4 ++ DEFINES="-D__SH4__ -D__LITTLE_ENDIAN__" ++ ENDIAN=ml ++ ;; ++ sh4eb) ++ ARCH=m4 ++ DEFINES="-D__SH4__ -D__BIG_ENDIAN__" ++ ENDIAN=mb ++ ;; ++esac ++ ++# Prepend the appropriate options ++# If user specifies some options, it will be overridden ++ ++case "${PROG}" in ++ cpp) ++ exec sh-linux-${PROG} $DEFINES "$@" ++ ;; ++ c++|g++|g77|gcc|gcj) ++ exec sh-linux-${PROG} -$ARCH -$ENDIAN "$@" ++ ;; ++esac ++ ++echo "Something wrong..." ++exit 1 +diff -ruN gcc-20030210.orig/gcc/config/sh/elf.h gcc-20030210/gcc/config/sh/elf.h +--- gcc-20030210.orig/gcc/config/sh/elf.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/elf.h Sat Feb 22 01:40:14 2003 +@@ -170,3 +170,7 @@ + #undef ENDFILE_SPEC + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" ++ ++/* ASM_OUTPUT_CASE_LABEL is defined in elfos.h. With it, ++ redundant .align will be generated. */ ++#undef ASM_OUTPUT_CASE_LABEL +diff -ruN gcc-20030210.orig/gcc/config/sh/lib1funcs.asm gcc-20030210/gcc/config/sh/lib1funcs.asm +--- gcc-20030210.orig/gcc/config/sh/lib1funcs.asm Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/lib1funcs.asm Sat Feb 22 01:40:14 2003 +@@ -39,8 +39,13 @@ + + #ifdef __ELF__ + #define LOCAL(X) .L_##X ++#define FUNC(X) .type X,@function; .hidden X ++#define _ENDFUNC(X) .Lfe_##X: .size X,.Lfe_##X-X ++#define ENDFUNC(X) _ENDFUNC(X) + #else + #define LOCAL(X) L_##X ++#define FUNC(X) ++#define ENDFUNC(X) + #endif + + #ifdef __linux__ +@@ -91,6 +96,40 @@ + .global GLOBAL(ashiftrt_r4_31) + .global GLOBAL(ashiftrt_r4_32) + ++ FUNC(GLOBAL(ashiftrt_r4_0)) ++ FUNC(GLOBAL(ashiftrt_r4_1)) ++ FUNC(GLOBAL(ashiftrt_r4_2)) ++ FUNC(GLOBAL(ashiftrt_r4_3)) ++ FUNC(GLOBAL(ashiftrt_r4_4)) ++ FUNC(GLOBAL(ashiftrt_r4_5)) ++ FUNC(GLOBAL(ashiftrt_r4_6)) ++ FUNC(GLOBAL(ashiftrt_r4_7)) ++ FUNC(GLOBAL(ashiftrt_r4_8)) ++ FUNC(GLOBAL(ashiftrt_r4_9)) ++ FUNC(GLOBAL(ashiftrt_r4_10)) ++ FUNC(GLOBAL(ashiftrt_r4_11)) ++ FUNC(GLOBAL(ashiftrt_r4_12)) ++ FUNC(GLOBAL(ashiftrt_r4_13)) ++ FUNC(GLOBAL(ashiftrt_r4_14)) ++ FUNC(GLOBAL(ashiftrt_r4_15)) ++ FUNC(GLOBAL(ashiftrt_r4_16)) ++ FUNC(GLOBAL(ashiftrt_r4_17)) ++ FUNC(GLOBAL(ashiftrt_r4_18)) ++ FUNC(GLOBAL(ashiftrt_r4_19)) ++ FUNC(GLOBAL(ashiftrt_r4_20)) ++ FUNC(GLOBAL(ashiftrt_r4_21)) ++ FUNC(GLOBAL(ashiftrt_r4_22)) ++ FUNC(GLOBAL(ashiftrt_r4_23)) ++ FUNC(GLOBAL(ashiftrt_r4_24)) ++ FUNC(GLOBAL(ashiftrt_r4_25)) ++ FUNC(GLOBAL(ashiftrt_r4_26)) ++ FUNC(GLOBAL(ashiftrt_r4_27)) ++ FUNC(GLOBAL(ashiftrt_r4_28)) ++ FUNC(GLOBAL(ashiftrt_r4_29)) ++ FUNC(GLOBAL(ashiftrt_r4_30)) ++ FUNC(GLOBAL(ashiftrt_r4_31)) ++ FUNC(GLOBAL(ashiftrt_r4_32)) ++ + .align 1 + GLOBAL(ashiftrt_r4_32): + GLOBAL(ashiftrt_r4_31): +@@ -170,6 +209,41 @@ + GLOBAL(ashiftrt_r4_0): + rts + nop ++ ++ ENDFUNC(GLOBAL(ashiftrt_r4_0)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_1)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_2)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_3)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_4)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_5)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_6)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_7)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_8)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_9)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_10)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_11)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_12)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_13)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_14)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_15)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_16)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_17)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_18)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_19)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_20)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_21)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_22)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_23)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_24)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_25)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_26)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_27)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_28)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_29)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_30)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_31)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_32)) ++ + #endif + + #ifdef L_ashiftrt_n +@@ -192,6 +266,7 @@ + ! + + .global GLOBAL(ashrsi3) ++ FUNC(GLOBAL(ashrsi3)) + .align 2 + GLOBAL(ashrsi3): + mov #31,r0 +@@ -319,6 +394,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashrsi3)) ++ + #endif + + #ifdef L_ashiftlt +@@ -340,6 +417,7 @@ + ! (none) + ! + .global GLOBAL(ashlsi3) ++ FUNC(GLOBAL(ashlsi3)) + .align 2 + GLOBAL(ashlsi3): + mov #31,r0 +@@ -476,6 +554,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashlsi3)) ++ + #endif + + #ifdef L_lshiftrt +@@ -497,6 +577,7 @@ + ! (none) + ! + .global GLOBAL(lshrsi3) ++ FUNC(GLOBAL(lshrsi3)) + .align 2 + GLOBAL(lshrsi3): + mov #31,r0 +@@ -633,6 +714,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(lshrsi3)) ++ + #endif + + #ifdef L_movstr +@@ -649,76 +732,113 @@ + add #64,r4 + .align 4 + .global GLOBAL(movstrSI64) ++ FUNC(GLOBAL(movstrSI64)) + GLOBAL(movstrSI64): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + .global GLOBAL(movstrSI60) ++ FUNC(GLOBAL(movstrSI60)) + GLOBAL(movstrSI60): + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + .global GLOBAL(movstrSI56) ++ FUNC(GLOBAL(movstrSI56)) + GLOBAL(movstrSI56): + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + .global GLOBAL(movstrSI52) ++ FUNC(GLOBAL(movstrSI52)) + GLOBAL(movstrSI52): + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + .global GLOBAL(movstrSI48) ++ FUNC(GLOBAL(movstrSI48)) + GLOBAL(movstrSI48): + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + .global GLOBAL(movstrSI44) ++ FUNC(GLOBAL(movstrSI44)) + GLOBAL(movstrSI44): + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + .global GLOBAL(movstrSI40) ++ FUNC(GLOBAL(movstrSI40)) + GLOBAL(movstrSI40): + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + .global GLOBAL(movstrSI36) ++ FUNC(GLOBAL(movstrSI36)) + GLOBAL(movstrSI36): + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + .global GLOBAL(movstrSI32) ++ FUNC(GLOBAL(movstrSI32)) + GLOBAL(movstrSI32): + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + .global GLOBAL(movstrSI28) ++ FUNC(GLOBAL(movstrSI28)) + GLOBAL(movstrSI28): + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + .global GLOBAL(movstrSI24) ++ FUNC(GLOBAL(movstrSI24)) + GLOBAL(movstrSI24): + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + .global GLOBAL(movstrSI20) ++ FUNC(GLOBAL(movstrSI20)) + GLOBAL(movstrSI20): + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + .global GLOBAL(movstrSI16) ++ FUNC(GLOBAL(movstrSI16)) + GLOBAL(movstrSI16): + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + .global GLOBAL(movstrSI12) ++ FUNC(GLOBAL(movstrSI12)) + GLOBAL(movstrSI12): + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + .global GLOBAL(movstrSI8) ++ FUNC(GLOBAL(movstrSI8)) + GLOBAL(movstrSI8): + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + .global GLOBAL(movstrSI4) ++ FUNC(GLOBAL(movstrSI4)) + GLOBAL(movstrSI4): + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) ++ .global GLOBAL(movstrSI0) ++ FUNC(GLOBAL(movstrSI0)) + GLOBAL(movstrSI0): + rts + nop + ++ ENDFUNC(GLOBAL(movstrSI64)) ++ ENDFUNC(GLOBAL(movstrSI60)) ++ ENDFUNC(GLOBAL(movstrSI56)) ++ ENDFUNC(GLOBAL(movstrSI52)) ++ ENDFUNC(GLOBAL(movstrSI48)) ++ ENDFUNC(GLOBAL(movstrSI44)) ++ ENDFUNC(GLOBAL(movstrSI40)) ++ ENDFUNC(GLOBAL(movstrSI36)) ++ ENDFUNC(GLOBAL(movstrSI32)) ++ ENDFUNC(GLOBAL(movstrSI28)) ++ ENDFUNC(GLOBAL(movstrSI24)) ++ ENDFUNC(GLOBAL(movstrSI20)) ++ ENDFUNC(GLOBAL(movstrSI16)) ++ ENDFUNC(GLOBAL(movstrSI12)) ++ ENDFUNC(GLOBAL(movstrSI8)) ++ ENDFUNC(GLOBAL(movstrSI4)) ++ ENDFUNC(GLOBAL(movstrSI0)) ++ + .align 4 + + .global GLOBAL(movstr) ++ FUNC(GLOBAL(movstr)) + GLOBAL(movstr): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) +@@ -775,6 +895,8 @@ + add #64,r5 + bra GLOBAL(movstr) + add #64,r4 ++ ++ FUNC(GLOBAL(movstr)) + #endif + + #ifdef L_movstr_i4 +@@ -783,6 +905,10 @@ + .global GLOBAL(movstr_i4_odd) + .global GLOBAL(movstrSI12_i4) + ++ FUNC(GLOBAL(movstr_i4_even)) ++ FUNC(GLOBAL(movstr_i4_odd)) ++ FUNC(GLOBAL(movstrSI12_i4)) ++ + .p2align 5 + L_movstr_2mod4_end: + mov.l r0,@(16,r4) +@@ -791,6 +917,11 @@ + + .p2align 2 + ++GLOBAL(movstr_i4_even): ++ mov.l @r5+,r0 ++ bra L_movstr_start_even ++ mov.l @r5+,r1 ++ + GLOBAL(movstr_i4_odd): + mov.l @r5+,r1 + add #-4,r4 +@@ -817,10 +948,8 @@ + rts + mov.l r3,@(12,r4) + +-GLOBAL(movstr_i4_even): +- mov.l @r5+,r0 +- bra L_movstr_start_even +- mov.l @r5+,r1 ++ ENDFUNC(GLOBAL(movstr_i4_even)) ++ ENDFUNC(GLOBAL(movstr_i4_odd)) + + .p2align 4 + GLOBAL(movstrSI12_i4): +@@ -831,12 +960,16 @@ + mov.l r1,@(4,r4) + rts + mov.l r2,@(8,r4) ++ ++ ENDFUNC(GLOBAL(movstrSI12_i4)) ++ + #endif + + #ifdef L_mulsi3 + + + .global GLOBAL(mulsi3) ++ FUNC(GLOBAL(mulsi3)) + + ! r4 = aabb + ! r5 = ccdd +@@ -869,7 +1002,7 @@ + rts + add r2,r0 + +- ++ FUNC(GLOBAL(mulsi3)) + #endif + #endif /* ! __SH5__ */ + #ifdef L_sdivsi3_i4 +@@ -879,6 +1012,7 @@ + !! args in r4 and r5, result in fpul, clobber dr0, dr2 + + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + lds r4,fpul + float fpul,dr0 +@@ -888,6 +1022,8 @@ + rts + ftrc dr0,fpul + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) ++ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2 + +@@ -896,6 +1032,7 @@ + .mode SHcompact + #endif + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + sts.l fpscr,@-r15 + mov #8,r2 +@@ -910,6 +1047,8 @@ + rts + lds.l @r15+,fpscr + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) ++ + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -924,9 +1063,10 @@ + !! + !! + +-!! args in r4 and r5, result in r0 clobber r1,r2,r3 ++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit + + .global GLOBAL(sdivsi3) ++ FUNC(GLOBAL(sdivsi3)) + #if __SHMEDIA__ + #if __SH5__ == 32 + .section .text..SHmedia32,"ax" +@@ -1076,6 +1216,7 @@ + div0: rts + mov #0,r0 + ++ ENDFUNC(GLOBAL(sdivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* ! __SH4__ */ + #endif +@@ -1084,9 +1225,11 @@ + .title "SH DIVIDE" + !! 4 byte integer Divide code for the Hitachi SH + #ifdef __SH4__ +-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 ++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4, ++!! and t bit + + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1127,6 +1270,8 @@ + L1: + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) ++ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 + +@@ -1135,6 +1280,7 @@ + .mode SHcompact + #endif + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1183,6 +1329,8 @@ + #endif + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) ++ + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -1199,6 +1347,7 @@ + + !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit + .global GLOBAL(udivsi3) ++ FUNC(GLOBAL(udivsi3)) + + #if __SHMEDIA__ + #if __SH5__ == 32 +@@ -1299,6 +1448,8 @@ + ret: rts + mov r4,r0 + ++ ENDFUNC(GLOBAL(udivsi3)) ++ + #endif /* ! __SHMEDIA__ */ + #endif /* __SH4__ */ + #endif +@@ -1308,6 +1459,7 @@ + .mode SHcompact + #endif + .global GLOBAL(set_fpscr) ++ FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr + mov.l LOCAL(set_fpscr_L1),r1 +@@ -1340,11 +1492,16 @@ + .align 2 + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++ ++ ENDFUNC(GLOBAL(set_fpscr)) ++ ++#ifndef NO_FPSCR_VALUES + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else + .comm GLOBAL(fpscr_values),8 + #endif /* ELF */ ++#endif /* NO_FPSCR_VALUES */ + #endif /* SH3E / SH4 */ + #endif /* L_set_fpscr */ + #ifdef L_ic_invalidate +@@ -1360,6 +1517,7 @@ + blink tr0, r63 + #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + .global GLOBAL(ic_invalidate) ++ FUNC(GLOBAL(ic_invalidate)) + GLOBAL(ic_invalidate): + ocbwb @r4 + mova 0f,r0 +@@ -1382,6 +1540,9 @@ + nop + .endr + .endr ++ ++ ENDFUNC(GLOBAL(ic_invalidate)) ++ + #endif /* SH4 */ + #endif /* L_ic_invalidate */ + +diff -ruN gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver gcc-20030210/gcc/config/sh/libgcc-glibc.ver +--- gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/libgcc-glibc.ver Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,21 @@ ++# In order to work around the very problems that force us to now generally ++# create a libgcc.so, glibc reexported a number of routines from libgcc.a. ++# By now choosing the same version tags for these specific routines, we ++# maintain enough binary compatibility to allow future versions of glibc ++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY. ++ ++# Note that we cannot use the default libgcc-glibc.ver file on sh, ++# because GLIBC_2.0 does not exist on this architecture, as the first ++# ever glibc release on the platform was GLIBC_2.2. ++ ++%inherit GCC_3.0 GLIBC_2.2 ++GLIBC_2.2 { ++ __register_frame ++ __register_frame_table ++ __deregister_frame ++ __register_frame_info ++ __deregister_frame_info ++ __frame_state_for ++ __register_frame_info_table ++} ++ +diff -ruN gcc-20030210.orig/gcc/config/sh/linux.h gcc-20030210/gcc/config/sh/linux.h +--- gcc-20030210.orig/gcc/config/sh/linux.h Tue Apr 16 05:27:42 2002 ++++ gcc-20030210/gcc/config/sh/linux.h Sat Feb 22 01:40:14 2003 +@@ -19,6 +19,10 @@ + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++/* We're not SYSVR4, not having /usr/ccs */ ++#undef MD_EXEC_PREFIX ++#undef MD_STARTFILE_PREFIX ++ + /* Run-time Target Specification. */ + #undef TARGET_VERSION + #define TARGET_VERSION fputs (" (SH GNU/Linux with ELF)", stderr); +@@ -39,6 +43,28 @@ + #undef WCHAR_TYPE_SIZE + #define WCHAR_TYPE_SIZE BITS_PER_WORD + ++/* This was defined in linux.h. Define it here also. */ ++#undef DEFAULT_VTABLE_THUNKS ++#define DEFAULT_VTABLE_THUNKS 1 ++ ++/* Likewise. */ ++#define HANDLE_PRAGMA_PACK_PUSH_POP ++ ++/* Pick up the return address upon entry to a procedure. Used for ++ dwarf2 unwind information. This also enables the table driven ++ mechanism. */ ++ ++#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PR_REG) ++#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (PR_REG) ++ ++#undef CPP_SPEC ++#define CPP_SPEC "\ ++ %{m4:-D__SH4__} \ ++ %{!m4:%(cpp_default_cpu_spec)} \ ++ %(subtarget_cpp_spec) \ ++ %(subtarget_cpp_ptr_spec) \ ++ %(subtarget_cpp_endian_spec) " ++ + #undef SUBTARGET_CPP_SPEC + #define SUBTARGET_CPP_SPEC "\ + %{fPIC:-D__PIC__ -D__pic__} \ +@@ -55,36 +81,45 @@ + #undef CPP_DEFAULT_CPU_SPEC + #define CPP_DEFAULT_CPU_SPEC "-D__SH3__ -D__sh3__" + +- + #undef CPP_PREDEFINES + #define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sh__ -D__gnu_linux__ -Dlinux -Asystem=posix" + ++/* The GNU C++ standard library requires that these macros be defined. */ ++#undef CPLUSPLUS_CPP_SPEC ++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" ++ + #undef ASM_SPEC +-#define ASM_SPEC "%{!mb:-little} %{mrelax:-relax}" ++#define ASM_SPEC "%{mb:-big} %{!mb:-little} %{mrelax:-relax}" + + #undef CC1_SPEC + #define CC1_SPEC \ +- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}" +- +-#undef CC1PLUS_SPEC +-#define CC1PLUS_SPEC \ +- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}" ++ "-musermode %{!mb:-ml} %{!m4:-m3} %{profile:-p}" + ++/* XXX: It's wrong if prefix != /usr */ + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{!mb:-m shlelf_linux} %{mrelax:-relax} \ ++ "%{!mb:-m shlelf_linux -EL} %{mb:-m shelf_linux -EB} %{mrelax:-relax} \ + %{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ +- %{!rpath:-rpath /lib}} \ ++ %{!mb:%{!m4:-rpath-link /usr/sh-linux/lib }} \ ++ %{!mb:%{m4:-rpath-link /usr/sh-linux/lib/m4 }} \ ++ %{mb:%{!m4:-rpath-link /usr/sh-linux/lib/mb }} \ ++ %{mb:%{m4:-rpath-link /usr/sh-linux/lib/mb/m4 }}} \ + %{static:-static}" + + #undef LIB_SPEC ++#undef LIB_SPEC + #define LIB_SPEC \ + "%{shared: -lc} \ +- %{!shared: %{pthread:-lthread} \ +- %{profile:-lc_p} %{!profile: -lc}}" ++ %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \ ++ %{profile:-lc_p} %{!profile: -lc}}" ++ ++#if defined(HAVE_LD_EH_FRAME_HDR) ++#undef LINK_EH_SPEC ++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#endif + + #undef STARTFILE_SPEC + #define STARTFILE_SPEC \ +@@ -92,4 +127,40 @@ + %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ + %{!p:%{profile:gcrt1.o%s} \ + %{!profile:crt1.o%s}}}} \ +- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" ++ crti.o%s %{static:crtbeginT.o%s}\ ++ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" ++ ++#undef FUNCTION_PROFILER ++#define FUNCTION_PROFILER(STREAM,LABELNO) \ ++do \ ++{ \ ++ if (flag_pic) \ ++ { \ ++ fprintf (STREAM, " mov.l 3f,r1\n"); \ ++ fprintf (STREAM, " mova 3f,r0\n"); \ ++ fprintf (STREAM, " add r1,r0\n"); \ ++ fprintf (STREAM, " mov.l 1f,r1\n"); \ ++ fprintf (STREAM, " mov.l @(r0,r1),r1\n"); \ ++ } \ ++ else \ ++ { \ ++ fprintf (STREAM, " mov.l 1f,r1\n"); \ ++ } \ ++ fprintf (STREAM, " sts.l pr,@-r15\n"); \ ++ fprintf (STREAM, " mova 2f,r0\n"); \ ++ fprintf (STREAM, " jmp @r1\n"); \ ++ fprintf (STREAM, " lds r0,pr\n"); \ ++ fprintf (STREAM, " .align 2\n"); \ ++ if (flag_pic) \ ++ { \ ++ fprintf (STREAM, "1: .long mcount@GOT\n"); \ ++ fprintf (STREAM, "3: .long _GLOBAL_OFFSET_TABLE_\n"); \ ++ } \ ++ else \ ++ { \ ++ fprintf (STREAM, "1: .long mcount\n"); \ ++ } \ ++ fprintf (STREAM, "2: lds.l @r15+,pr\n"); \ ++} while (0) ++ ++#define NO_SHARED_LIBGCC_MULTILIB +diff -ruN gcc-20030210.orig/gcc/config/sh/sh-protos.h gcc-20030210/gcc/config/sh/sh-protos.h +--- gcc-20030210.orig/gcc/config/sh/sh-protos.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh-protos.h Sat Feb 22 01:40:14 2003 +@@ -74,6 +74,7 @@ + extern int shl_sext_length PARAMS ((rtx)); + extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx)); + extern rtx gen_datalabel_ref PARAMS ((rtx)); ++extern int shl_casesi_worker_length PARAMS ((rtx)); + extern int regs_used PARAMS ((rtx, int)); + extern void fixup_addr_diff_vecs PARAMS ((rtx)); + extern int get_dest_uid PARAMS ((rtx, int)); +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.c gcc-20030210/gcc/config/sh/sh.c +--- gcc-20030210.orig/gcc/config/sh/sh.c Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh.c Sat Feb 22 01:40:14 2003 +@@ -2143,6 +2143,48 @@ + return sym; + } + ++ ++/* Function to be used in the length attribute of the casesi_worker ++ instruction. Returns number of instructions, which is half of the ++ length of bytes. */ ++ ++int ++shl_casesi_worker_length (insn) ++ rtx insn; ++{ ++ rtx set_src, label; ++ rtx diff_vec; ++ ++ set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0)); ++ if (!(GET_CODE (set_src) == UNSPEC ++ && XINT (set_src, 1) == UNSPEC_CASESI)) ++ abort (); ++ ++ label = XVECEXP (set_src, 0, 2); ++ if (GET_CODE (label) != LABEL_REF) ++ abort (); ++ ++ diff_vec = PATTERN (next_real_insn (XEXP (label, 0))); ++ ++ if (GET_CODE (diff_vec) != ADDR_DIFF_VEC) ++ abort (); ++ ++ switch (GET_MODE (diff_vec)) ++ { ++ case SImode: ++ return 2; ++ case HImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return 3; ++ return 2; ++ case QImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return 2; ++ return 1; ++ default: ++ abort (); ++ } ++} + + /* The SH cannot load a large constant into a register, constants have to + come from a pc relative load. The reference of a pc relative load +@@ -3190,7 +3232,7 @@ + vec_lab = XEXP (XEXP (pat, 0), 0); + + /* Search the matching casesi_jump_2. */ +- for (prev = vec_lab; ; prev = PREV_INSN (prev)) ++ for (prev = vec_lab; prev; prev = PREV_INSN (prev)) + { + if (GET_CODE (prev) != JUMP_INSN) + continue; +@@ -3205,6 +3247,13 @@ + break; + } + ++ if (prev == NULL) ++ { /* Switch statement has been optimized out. */ ++ delete_insn (PREV_INSN (insn)); ++ delete_insn (insn); ++ continue; ++ } ++ + /* Emit the reference label of the braf where it belongs, right after + the casesi_jump_2 (i.e. braf). */ + braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0); +@@ -3223,7 +3272,7 @@ + rtx barrier_or_label; + { + rtx next = next_real_insn (barrier_or_label), pat, prev; +- int slot, credit, jump_to_next; ++ int slot, credit, jump_to_next = 0; + + if (! next) + return 0; +@@ -4507,7 +4556,8 @@ + if (current_function_varargs || current_function_stdarg) + { + /* This is not used by the SH3E calling convention */ +- if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI) ++ if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI ++ || TARGET_NO_IMPLICIT_FP) + { + /* Push arg regs as if they'd been provided by caller in stack. */ + for (i = 0; i < NPARM_REGS(SImode); i++) +@@ -5149,7 +5199,8 @@ + tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; + tree record; + +- if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI) ++ if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI ++ || TARGET_NO_IMPLICIT_FP) + return ptr_type_node; + + record = make_node (RECORD_TYPE); +@@ -5211,7 +5262,8 @@ + return; + } + +- if ((! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI) ++ if ((! TARGET_SH3E && ! TARGET_SH4) ++ || TARGET_HITACHI || TARGET_NO_IMPLICIT_FP) + { + std_expand_builtin_va_start (stdarg_p, valist, nextarg); + return; +@@ -5289,7 +5341,8 @@ + rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; + pptr_type_node = build_pointer_type (ptr_type_node); + +- if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) && ! TARGET_HITACHI) ++ if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) ++ && ! TARGET_HITACHI && ! TARGET_NO_IMPLICIT_FP) + { + tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; + tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack; +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.h gcc-20030210/gcc/config/sh/sh.h +--- gcc-20030210.orig/gcc/config/sh/sh.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh.h Sat Feb 22 01:40:14 2003 +@@ -147,10 +147,10 @@ + #define HARD_SH4_BIT (1<<5) + #define FPU_SINGLE_BIT (1<<7) + #define SH4_BIT (1<<12) ++#define NO_IMPLICIT_FP_BIT (1<<3) + #define FMOVD_BIT (1<<4) + #define SH5_BIT (1<<0) + #define SPACE_BIT (1<<13) +-#define BIGTABLE_BIT (1<<14) + #define RELAX_BIT (1<<15) + #define USERMODE_BIT (1<<16) + #define HITACHI_BIT (1<<22) +@@ -205,6 +205,9 @@ + /* Nonzero if we should generate code for a SH5 CPU (either ISA). */ + #define TARGET_SH5 (target_flags & SH5_BIT) + ++/* Nonzero if we should not use FPU implicitly. */ ++#define TARGET_NO_IMPLICIT_FP (target_flags & NO_IMPLICIT_FP_BIT) ++ + /* Nonzero if we should generate code using the SHcompact instruction + set and 32-bit ABI. */ + #define TARGET_SHCOMPACT (TARGET_SH5 && TARGET_SH1) +@@ -225,6 +228,7 @@ + + /* Nonzero if we should generate code using SHmedia FPU instructions. */ + #define TARGET_SHMEDIA_FPU (TARGET_SHMEDIA && TARGET_FPU_DOUBLE) ++ + /* Nonzero if we should generate fmovd. */ + #define TARGET_FMOVD (target_flags & FMOVD_BIT) + +@@ -234,9 +238,6 @@ + /* Nonzero if we should generate smaller code rather than faster code. */ + #define TARGET_SMALLCODE (target_flags & SPACE_BIT) + +-/* Nonzero to use long jump tables. */ +-#define TARGET_BIGTABLE (target_flags & BIGTABLE_BIT) +- + /* Nonzero to generate pseudo-ops needed by the assembler and linker + to do function call relaxing. */ + #define TARGET_RELAX (target_flags & RELAX_BIT) +@@ -297,7 +298,6 @@ + {"5-compact-nofpu", TARGET_NONE, "" }, \ + {"5-compact-nofpu", SH5_BIT|SH3_BIT|SH2_BIT|SH1_BIT, "Generate FPU-less SHcompact code" }, \ + {"b", -LITTLE_ENDIAN_BIT, "" }, \ +- {"bigtable", BIGTABLE_BIT, "" }, \ + {"dalign", DALIGN_BIT, "" }, \ + {"fmovd", FMOVD_BIT, "" }, \ + {"hitachi", HITACHI_BIT, "" }, \ +@@ -306,6 +306,7 @@ + {"isize", ISIZE_BIT, "" }, \ + {"l", LITTLE_ENDIAN_BIT, "" }, \ + {"no-ieee", -IEEE_BIT, "" }, \ ++ {"no-implicit-fp", NO_IMPLICIT_FP_BIT, "" }, \ + {"padstruct", PADSTRUCT_BIT, "" }, \ + {"prefergot", PREFERGOT_BIT, "" }, \ + {"relax", RELAX_BIT, "" }, \ +@@ -2493,16 +2494,22 @@ + goto LABEL; \ + } + ++extern int optimize; /* needed for gen_casesi. */ ++extern int optimize_size; ++ + /* Specify the machine mode that this machine uses + for the index in the tablejump instruction. */ +-#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode) ++#define CASE_VECTOR_MODE SImode + + #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \ + ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \ + ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \ + : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \ + ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \ +- : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \ ++ : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \ ++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \ ++ : optimize_size && (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \ ++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \ + : SImode) + + /* Define as C expression which evaluates to nonzero if the tablejump +@@ -3038,10 +3045,7 @@ + /* Output an absolute table element. */ + + #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \ +- if (TARGET_BIGTABLE) \ +- asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); \ +- else \ +- asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); \ ++ asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)) + + /* Output various types of constants. */ + +@@ -3167,8 +3171,6 @@ + #define sh_cpu_attr ((enum attr_cpu)sh_cpu) + extern enum processor_type sh_cpu; + +-extern int optimize; /* needed for gen_casesi. */ +- + enum mdep_reorg_phase_e + { + SH_BEFORE_MDEP_REORG, +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.md gcc-20030210/gcc/config/sh/sh.md +--- gcc-20030210.orig/gcc/config/sh/sh.md Sat Nov 23 04:58:06 2002 ++++ gcc-20030210/gcc/config/sh/sh.md Sat Feb 22 01:40:14 2003 +@@ -1242,7 +1242,7 @@ + (clobber (reg:SI PR_REG)) + (clobber (reg:SI R4_REG)) + (use (match_operand:SI 1 "arith_reg_operand" "r"))] +- "TARGET_SH1 && ! TARGET_SH4" ++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" + "jsr @%1%#" + [(set_attr "type" "sfunc") + (set_attr "needs_delay_slot" "yes")]) +@@ -1336,7 +1336,7 @@ + + operands[3] = gen_reg_rtx (Pmode); + /* Emit the move of the address to a pseudo outside of the libcall. */ +- if (TARGET_HARD_SH4 && TARGET_SH3E) ++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) + { + emit_move_insn (operands[3], + gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\")); +@@ -1391,7 +1391,7 @@ + (clobber (reg:SI R2_REG)) + (clobber (reg:SI R3_REG)) + (use (match_operand:SI 1 "arith_reg_operand" "r"))] +- "TARGET_SH1 && ! TARGET_SH4" ++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" + "jsr @%1%#" + [(set_attr "type" "sfunc") + (set_attr "needs_delay_slot" "yes")]) +@@ -1476,7 +1476,7 @@ + + operands[3] = gen_reg_rtx (Pmode); + /* Emit the move of the address to a pseudo outside of the libcall. */ +- if (TARGET_HARD_SH4 && TARGET_SH3E) ++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) + { + emit_move_insn (operands[3], + gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\")); +@@ -6446,6 +6446,8 @@ + case SImode: + return \"shll2 %1\;mov.l @(r0,%1),%0\"; + case HImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return \"add %1,%1\;mov.w @(r0,%1),%0\;extu.w %0,%0\"; + return \"add %1,%1\;mov.w @(r0,%1),%0\"; + case QImode: + if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) +@@ -6455,7 +6457,15 @@ + abort (); + } + }" +- [(set_attr "length" "4")]) ++ [(set (attr "length") ++ (cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1)) ++ (const_string "2") ++ (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2)) ++ (const_string "4") ++ ;; Put "match_dup" here so that insn_variable_length_p return 1. ++ (ne (match_dup 2) (match_dup 2)) ++ (const_string "4")] ++ (const_string "6")))]) + + (define_insn "casesi_shift_media" + [(set (match_operand 0 "arith_reg_operand" "=r") +diff -ruN gcc-20030210.orig/gcc/config/sh/sh3-linux.h gcc-20030210/gcc/config/sh/sh3-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh3-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh3-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH3 GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__LITTLE_ENDIAN__ \ ++ -D__SH3__ -D__sh3__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -ml -m3 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h gcc-20030210/gcc/config/sh/sh3eb-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh3eb-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH3EB GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__BIG_ENDIAN__ \ ++ -D__SH3__ -D__sh3__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -mb -m3 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh4-linux.h gcc-20030210/gcc/config/sh/sh4-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh4-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh4-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH4 GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__LITTLE_ENDIAN__ \ ++ -D__SH4__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -ml -m4 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h gcc-20030210/gcc/config/sh/sh4eb-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh4eb-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH4EB GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__BIG_ENDIAN__ \ ++ -D__SH4__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -mb -m4 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux gcc-20030210/gcc/config/sh/t-linux +--- gcc-20030210.orig/gcc/config/sh/t-linux Thu May 17 12:16:12 2001 ++++ gcc-20030210/gcc/config/sh/t-linux Sat Feb 22 01:40:14 2003 +@@ -1,10 +1,20 @@ +-TARGET_LIBGCC2_CFLAGS = -fpic ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIBGCC1 = libgcc1-asm.a ++CROSS_LIBGCC1 = libgcc1-asm.a ++LIBGCC1_TEST = libgcc1-test + LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movstr \ + _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ + _ic_invalidate ++LIB2ADDEH = $(srcdir)/unwind-sjlj.c ++LIB2ADDEHDEP = unwind.inc unwind-sjlj.c + +-MULTILIB_OPTIONS= mb m3e/m4 ++MULTILIB_OPTIONS= mb m4 + MULTILIB_DIRNAMES= + MULTILIB_MATCHES = + +-EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used and SH specific. ++SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ ++ $(srcdir)/config/sh/libgcc-glibc.ver +diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux-nomulti gcc-20030210/gcc/config/sh/t-linux-nomulti +--- gcc-20030210.orig/gcc/config/sh/t-linux-nomulti Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/t-linux-nomulti Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,9 @@ ++LIBGCC = libgcc.a ++EXTRA_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o ++ ++INSTALL_LIBGCC = install-libgcc ++ ++MULTILIB_OPTIONS= ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++EXTRA_MULTILIB_PARTS= +diff -ruN gcc-20030210.orig/gcc/config.gcc gcc-20030210/gcc/config.gcc +--- gcc-20030210.orig/gcc/config.gcc Fri Jan 31 19:17:13 2003 ++++ gcc-20030210/gcc/config.gcc Sat Feb 22 01:40:14 2003 +@@ -337,9 +337,9 @@ + sparc*-*-*) + cpu_type=sparc + ;; +-sh64-*-*) +- cpu_type=sh +- ;; ++sh*-*-*) ++ cpu_type=sh ++ ;; + esac + + tm_file=${cpu_type}/${cpu_type}.h +@@ -3018,9 +3018,31 @@ + thread_file='rtems' + fi + ;; +-sh-*-linux*) ++sh*-*-linux*) + tm_file="${tm_file} sh/elf.h sh/linux.h" +- tmake_file="sh/t-sh sh/t-elf sh/t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux sh/t-linux" ++ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o" ++ case $machine in ++ sh3eb-*) ++ tm_file="${tm_file} sh/sh3eb-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh4eb-*) ++ tm_file="${tm_file} sh/sh4eb-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh3-*) ++ tm_file="${tm_file} sh/sh3-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh4-*) ++ tm_file="${tm_file} sh/sh4-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ *) ++ ;; ++ esac ++ xmake_file=x-linux + gas=yes gnu_ld=yes + float_format=sh + ;; +diff -ruN gcc-20030210.orig/gcc/dwarf2out.c gcc-20030210/gcc/dwarf2out.c +--- gcc-20030210.orig/gcc/dwarf2out.c Mon Feb 10 19:36:25 2003 ++++ gcc-20030210/gcc/dwarf2out.c Sat Feb 22 01:40:14 2003 +@@ -10224,7 +10224,9 @@ + /* We can have a normal definition following an inline one in the + case of redefinition of GNU C extern inlines. + It seems reasonable to use AT_specification in this case. */ +- && !get_AT_unsigned (old_die, DW_AT_inline)) ++ && !get_AT_unsigned (old_die, DW_AT_inline) ++ /* Skip the nested function. */ ++ && !decl_function_context (decl)) + { + /* ??? This can happen if there is a bug in the program, for + instance, if it has duplicate function definitions. Ideally, +diff -ruN gcc-20030210.orig/gcc/final.c gcc-20030210/gcc/final.c +--- gcc-20030210.orig/gcc/final.c Fri Jan 31 19:17:20 2003 ++++ gcc-20030210/gcc/final.c Sat Feb 22 01:40:14 2003 +@@ -1128,7 +1128,7 @@ + } + } + +- INSN_ADDRESSES (uid) = insn_current_address; ++ INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid]; + + if (GET_CODE (insn) == NOTE || GET_CODE (insn) == BARRIER + || GET_CODE (insn) == CODE_LABEL) +diff -ruN gcc-20030210.orig/gcc/mkmap-symver.awk gcc-20030210/gcc/mkmap-symver.awk +--- gcc-20030210.orig/gcc/mkmap-symver.awk Fri Jan 31 19:17:26 2003 ++++ gcc-20030210/gcc/mkmap-symver.awk Sat Feb 22 01:40:14 2003 +@@ -89,7 +89,11 @@ + output(inherit[lib]); + + printf("%s {\n", lib); +- printf(" global:\n"); ++ for (sym in ver) ++ if ((ver[sym] == lib) && (sym in def)) ++ count++; ++ if (count > 0) ++ printf(" global:\n"); + for (sym in ver) + if ((ver[sym] == lib) && (sym in def)) + { +diff -ruN gcc-20030210.orig/gcc/reload1.c gcc-20030210/gcc/reload1.c +--- gcc-20030210.orig/gcc/reload1.c Fri Jan 31 19:17:29 2003 ++++ gcc-20030210/gcc/reload1.c Sat Feb 22 01:40:14 2003 +@@ -6103,6 +6103,7 @@ + for (j = 0; j < n_reloads; j++) + if (rld[j].in != 0 + && rld[j].when_needed != RELOAD_OTHER ++ && rld[j].when_needed != RELOAD_FOR_OUTPUT_ADDRESS + && reg_overlap_mentioned_for_reload_p (rld[j].in, + rld[i].in)) + rld[j].when_needed +diff -ruN gcc-20030210.orig/gcc/reorg.c gcc-20030210/gcc/reorg.c +--- gcc-20030210.orig/gcc/reorg.c Fri Jan 31 19:17:30 2003 ++++ gcc-20030210/gcc/reorg.c Sat Feb 22 01:40:14 2003 +@@ -3265,6 +3265,14 @@ + || condjump_in_parallel_p (XVECEXP (PATTERN (insn), 0, 0)))) + continue; + ++#ifdef MD_CAN_REDIRECT_BRANCH ++ /* On some targets, branches with delay slots can have a limited ++ displacement. Give the back end a chance to tell us we can't do ++ this. */ ++ if (! MD_CAN_REDIRECT_BRANCH (insn, delay_insn)) ++ continue; ++#endif ++ + target_label = JUMP_LABEL (delay_insn); + + if (target_label) +diff -ruN gcc-20030210.orig/gcc/tree-inline.c gcc-20030210/gcc/tree-inline.c +--- gcc-20030210.orig/gcc/tree-inline.c Fri Jan 31 19:17:33 2003 ++++ gcc-20030210/gcc/tree-inline.c Sat Feb 22 01:40:14 2003 +@@ -836,11 +836,17 @@ + + /* Don't try to inline functions that are not well-suited to + inlining. */ +- if (!inlinable_function_p (fn, id)) +- return NULL_TREE; ++ if (! inlinable_function_p (fn, id) ++ || ! (*lang_hooks.tree_inlining.start_inlining) (fn)) ++ { ++ if (DECL_INLINE (fn) && warn_inline && ! flag_really_no_inline) ++ { ++ warning_with_decl (fn, "inlining failed in call to `%s'"); ++ warning ("called from here"); ++ } + +- if (! (*lang_hooks.tree_inlining.start_inlining) (fn)) +- return NULL_TREE; ++ return NULL_TREE; ++ } + + /* Set the current filename and line number to the function we are + inlining so that when we create new _STMT nodes here they get +diff -ruN gcc-20030210.orig/libjava/Makefile.in gcc-20030210/libjava/Makefile.in +--- gcc-20030210.orig/libjava/Makefile.in Tue Jan 28 10:44:37 2003 ++++ gcc-20030210/libjava/Makefile.in Sat Feb 22 01:40:14 2003 +@@ -1637,6 +1637,7 @@ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ ++ "GCJ=$(GCJ)" \ + "LD=$(LD)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "NM=$(NM)" \ +diff -ruN gcc-20030210.orig/libjava/configure gcc-20030210/libjava/configure +--- gcc-20030210.orig/libjava/configure Tue Jan 28 10:44:37 2003 ++++ gcc-20030210/libjava/configure Sat Feb 22 01:42:11 2003 +@@ -2031,7 +2031,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/libjava/java/net/natInetAddress.cc gcc-20030210/libjava/java/net/natInetAddress.cc +--- gcc-20030210.orig/libjava/java/net/natInetAddress.cc Tue Mar 5 05:02:19 2002 ++++ gcc-20030210/libjava/java/net/natInetAddress.cc Sat Feb 22 01:40:14 2003 +@@ -56,7 +56,7 @@ + #endif + + #ifndef HAVE_GETHOSTNAME_DECL +-extern "C" int gethostname (char *name, int namelen); ++extern "C" int gethostname (char *name, unsigned int namelen); + #endif + + #ifdef DISABLE_JAVA_NET +diff -ruN gcc-20030210.orig/libjava/libltdl/aclocal.m4 gcc-20030210/libjava/libltdl/aclocal.m4 +--- gcc-20030210.orig/libjava/libltdl/aclocal.m4 Sun Sep 10 17:04:40 2000 ++++ gcc-20030210/libjava/libltdl/aclocal.m4 Sat Feb 22 01:40:14 2003 +@@ -573,7 +573,7 @@ + # This must be Linux ELF. + linux-gnu*) + case "$host_cpu" in +- alpha* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | i*86 | powerpc* | sparc* | ia64* | sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/libjava/sysdep/sh/locks.h gcc-20030210/libjava/sysdep/sh/locks.h +--- gcc-20030210.orig/libjava/sysdep/sh/locks.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/libjava/sysdep/sh/locks.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,72 @@ ++// locks.h - Thread synchronization primitives. SuperH implementation. ++ ++/* Copyright (C) 2002 Free Software Foundation ++ ++ This file is part of libgcj. ++ ++This software is copyrighted work licensed under the terms of the ++Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ++details. */ ++ ++#ifndef __SYSDEP_LOCKS_H__ ++#define __SYSDEP_LOCKS_H__ ++ ++typedef size_t obj_addr_t; /* Integer type big enough for object */ ++ /* address. */ ++ ++static unsigned char __cas_lock = 0; ++ ++inline static void ++__cas_start_atomic (void) ++{ ++ unsigned int val; ++ ++ do ++ __asm__ __volatile__ ("tas.b @%1; movt %0" ++ : "=r" (val) ++ : "r" (&__cas_lock) ++ : "memory"); ++ while (val == 0); ++} ++ ++inline static void ++__cas_end_atomic (void) ++{ ++ __asm__ __volatile__ (" " : : : "memory"); ++ __cas_lock = 0; ++} ++ ++inline static bool ++compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ bool ret; ++ ++ __cas_start_atomic (); ++ if (*addr != old) ++ ret = false; ++ else ++ { ++ *addr = new_val; ++ ret = true; ++ } ++ __cas_end_atomic (); ++ ++ return ret; ++} ++ ++inline static void ++release_set (volatile obj_addr_t *addr, obj_addr_t new_val) ++{ ++ __asm__ __volatile__ (" " : : : "memory"); ++ *(addr) = new_val; ++} ++ ++inline static bool ++compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ return compare_and_swap (addr, old, new_val); ++} ++ ++#endif /* ! __SYSDEP_LOCKS_H__ */ +diff -ruN gcc-20030210.orig/libstdc++-v3/acinclude.m4 gcc-20030210/libstdc++-v3/acinclude.m4 +--- gcc-20030210.orig/libstdc++-v3/acinclude.m4 Tue Jan 28 02:30:41 2003 ++++ gcc-20030210/libstdc++-v3/acinclude.m4 Sat Feb 22 01:40:14 2003 +@@ -1828,9 +1828,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libstdc++-v3/aclocal.m4 gcc-20030210/libstdc++-v3/aclocal.m4 +--- gcc-20030210.orig/libstdc++-v3/aclocal.m4 Mon Feb 10 19:36:47 2003 ++++ gcc-20030210/libstdc++-v3/aclocal.m4 Sat Feb 22 01:40:14 2003 +@@ -1840,9 +1840,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libstdc++-v3/configure gcc-20030210/libstdc++-v3/configure +--- gcc-20030210.orig/libstdc++-v3/configure Mon Feb 10 19:37:17 2003 ++++ gcc-20030210/libstdc++-v3/configure Sat Feb 22 01:40:14 2003 +@@ -1982,7 +1982,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +@@ -22340,9 +22340,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libtool.m4 gcc-20030210/libtool.m4 +--- gcc-20030210.orig/libtool.m4 Fri Jan 31 19:16:59 2003 ++++ gcc-20030210/libtool.m4 Sat Feb 22 01:40:14 2003 +@@ -597,7 +597,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/zlib/configure gcc-20030210/zlib/configure +--- gcc-20030210.orig/zlib/configure Tue Jan 28 10:44:15 2003 ++++ gcc-20030210/zlib/configure Sat Feb 22 01:40:14 2003 +@@ -1571,7 +1571,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM diff --git a/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch new file mode 100644 index 0000000..0de46fc --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch @@ -0,0 +1,98 @@ +g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003 + +The first hunk fixes the error + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) + invoked from within +"runtest $test_name" + ("foreach" body line 42) + invoked from within +... +make[1]: [check-g++] Error 1 (ignored) + +The fix isn't especially pretty, but it worked for me, and can't hurt the +more common native compiler case. Maybe someone who knows the code better +can come up with a better fix. + +The second hunk fixes the error + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + +when trying to compile g++ testcases (!); setting up +the shared library environment when running crosstests of g++ +should either be done by a special board file, or by +setting up a remote chroot environment (see http://kegel.com/crosstool), +not by blithely setting LD_LIBRARY_PATH on the local system. + +--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003 ++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003 +@@ -72,6 +72,8 @@ + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] +@@ -192,16 +192,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch new file mode 100644 index 0000000..db78ba1 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch @@ -0,0 +1,6864 @@ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am +--- gcc-3.2.2.orig/libffi/Makefile.am Tue Jan 28 10:43:56 2003 ++++ gcc/libffi/Makefile.am Tue Jan 28 10:48:33 2003 +@@ -8,14 +8,17 @@ + src/mips/n32.s src/mips/o32.S src/mips/o32.s \ + src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ + src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ ++ src/x86/ffi64.c src/x86/unix64.S \ + src/alpha/ffi.c src/alpha/osf.S \ + src/m68k/ffi.c src/m68k/sysv.S \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ + src/powerpc/ffi_darwin.c \ + src/powerpc/darwin.S src/powerpc/aix.S \ +- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ +- src/arm/ffi.c src/arm/sysv.S ++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ ++ src/arm/ffi.c src/arm/sysv.S \ ++ src/s390/ffi.c src/s390/sysv.S \ ++ src/sh/ffi.c src/sh/sysv.S + + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ + +@@ -83,6 +86,7 @@ + ffitest_LDFLAGS = -shared-libgcc + + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S +@@ -91,9 +95,12 @@ + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S + TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c ++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c + + ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@) + ## Work around automake deficiency +@@ -103,6 +110,10 @@ + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) + endif ++if MIPS_LINUX ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) ++endif + if MIPS_SGI + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) +@@ -147,6 +158,18 @@ + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) + endif ++if S390 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++endif ++if X86_64 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++endif ++if SH ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) ++libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) ++endif + + AM_CFLAGS = -fexceptions + +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in +--- gcc-3.2.2.orig/libffi/Makefile.in Wed Jan 29 07:59:05 2003 ++++ gcc/libffi/Makefile.in Wed Jan 29 07:58:58 2003 +@@ -91,14 +91,17 @@ + src/mips/n32.s src/mips/o32.S src/mips/o32.s \ + src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ + src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ ++ src/x86/ffi64.c src/x86/unix64.S \ + src/alpha/ffi.c src/alpha/osf.S \ + src/m68k/ffi.c src/m68k/sysv.S \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ + src/powerpc/ffi_darwin.c \ + src/powerpc/darwin.S src/powerpc/aix.S \ +- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ +- src/arm/ffi.c src/arm/sysv.S ++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ ++ src/arm/ffi.c src/arm/sysv.S \ ++ src/s390/ffi.c src/s390/sysv.S \ ++ src/sh/ffi.c src/sh/sysv.S + + + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ +@@ -162,6 +165,7 @@ + ffitest_LDFLAGS = -shared-libgcc + + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S +@@ -170,14 +174,18 @@ + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S + TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c ++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c + + libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c + + @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ++@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) + @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) + @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) +@@ -189,7 +197,11 @@ + @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) + @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ++@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) + @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ++@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) + @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) + @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) +@@ -201,6 +213,9 @@ + @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) + @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ++@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) + + AM_CFLAGS = -fexceptions + +@@ -208,7 +223,7 @@ + + INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs ++mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs + CONFIG_HEADER = fficonfig.h + CONFIG_CLEAN_FILES = + LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) +@@ -220,10 +235,6 @@ + LIBS = @LIBS@ + libffi_convenience_la_LDFLAGS = + libffi_convenience_la_LIBADD = +-@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ +-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo + @ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo +@@ -234,12 +245,29 @@ + @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ + @MIPS_GCC_TRUE@src/mips/n32.lo +-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo ++@S390_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo + @M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo ++@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ ++@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo ++@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo ++@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo ++@X86_64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \ ++@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo + @SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \ +@@ -247,62 +275,75 @@ + @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ +-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo +-@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo +-@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ++@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo ++@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ ++@MIPS_SGI_TRUE@src/mips/n32.lo + @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo +-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ +-@MIPS_SGI_TRUE@src/mips/n32.lo ++@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ++@SH_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo + libffi_la_LIBADD = ++@SH_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ ++@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \ ++@SH_TRUE@src/sh/ffi.lo ++@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo ++@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ ++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ ++@X86_TRUE@src/x86/sysv.lo + @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \ + @POWERPC_TRUE@src/powerpc/ppc_closure.lo +-@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo +-@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo +-@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo +-@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo +-@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@MIPS_LINUX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo + @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo + @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \ +-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo +-@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ +-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ +-@X86_TRUE@src/x86/sysv.lo ++@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo ++@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo + @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ + @ARM_TRUE@src/arm/ffi.lo ++@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo ++@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo ++@S390_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo ++@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo ++@X86_64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \ ++@X86_64_TRUE@src/x86/sysv.lo + @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo +-@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo + noinst_PROGRAMS = ffitest$(EXEEXT) + PROGRAMS = $(noinst_PROGRAMS) + +@@ -578,8 +616,8 @@ + -chmod 777 $(distdir) + $(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \ + $(distdir)/src/m68k $(distdir)/src/mips \ +- $(distdir)/src/powerpc $(distdir)/src/sparc \ +- $(distdir)/src/x86 ++ $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \ ++ $(distdir)/src/sparc $(distdir)/src/x86 + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4 +--- gcc-3.2.2.orig/libffi/acinclude.m4 Sun Sep 10 16:43:14 2000 ++++ gcc/libffi/acinclude.m4 Tue Dec 17 03:22:47 2002 +@@ -4,5 +4,8 @@ + dnl to add a definition of LIBTOOL to Makefile.in. + ifelse(yes,no,[ + AC_DEFUN([AC_PROG_LIBTOOL],) ++AC_DEFUN([AM_PROG_LIBTOOL],) + AC_SUBST(LIBTOOL) + ]) ++ ++sinclude(../config/accross.m4) +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4 +--- gcc-3.2.2.orig/libffi/aclocal.m4 Fri Feb 1 07:25:31 2002 ++++ gcc/libffi/aclocal.m4 Tue Dec 17 03:22:47 2002 +@@ -1,6 +1,6 @@ +-dnl aclocal.m4 generated automatically by aclocal 1.4 ++dnl aclocal.m4 generated automatically by aclocal 1.4-p5 + +-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. ++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. + dnl This file is free software; the Free Software Foundation + dnl gives unlimited permission to copy and/or distribute it, + dnl with or without modifications, as long as this notice is preserved. +@@ -16,108 +16,15 @@ + dnl to add a definition of LIBTOOL to Makefile.in. + ifelse(yes,no,[ + AC_DEFUN([AC_PROG_LIBTOOL],) ++AC_DEFUN([AM_PROG_LIBTOOL],) + AC_SUBST(LIBTOOL) + ]) + +-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], +-[changequote(<<, >>)dnl +-dnl The name to #define. +-define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +-dnl The cache variable name. +-define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl +-changequote([, ])dnl +-AC_MSG_CHECKING(size of $1) +-AC_CACHE_VAL(AC_CV_NAME, +-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. +- AC_TRY_COMPILE([#include "confdefs.h" +-#include +-$2 +-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) +- if test x$AC_CV_NAME != x ; then break; fi +-done +-]) +-if test x$AC_CV_NAME = x ; then +- AC_MSG_ERROR([cannot determine a size for $1]) +-fi +-AC_MSG_RESULT($AC_CV_NAME) +-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) +-undefine([AC_TYPE_NAME])dnl +-undefine([AC_CV_NAME])dnl +-]) +- +-AC_DEFUN([AC_C_BIGENDIAN_CROSS], +-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, +-[ac_cv_c_bigendian=unknown +-# See if sys/param.h defines the BYTE_ORDER macro. +-AC_TRY_COMPILE([#include +-#include ], [ +-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN +- bogus endian macros +-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. +-AC_TRY_COMPILE([#include +-#include ], [ +-#if BYTE_ORDER != BIG_ENDIAN +- not big endian +-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) +-if test $ac_cv_c_bigendian = unknown; then +-AC_TRY_RUN([main () { +- /* Are we little or big endian? From Harbison&Steele. */ +- union +- { +- long l; +- char c[sizeof (long)]; +- } u; +- u.l = 1; +- exit (u.c[sizeof (long) - 1] == 1); +-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, +-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) +-fi]) +-if test $ac_cv_c_bigendian = unknown; then +-AC_MSG_CHECKING(to probe for byte ordering) +-[ +-cat >conftest.c <&AC_FD_MSG +- ac_cv_c_bigendian=yes +- fi +- if test `grep -l LiTTleEnDian conftest.o` ; then +- echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG +- if test $ac_cv_c_bigendian = yes ; then +- ac_cv_c_bigendian=unknown; +- else +- ac_cv_c_bigendian=no +- fi +- fi +- echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG +- fi +- fi +-AC_MSG_RESULT($ac_cv_c_bigendian) +-fi +-if test $ac_cv_c_bigendian = yes; then +- AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) +- BYTEORDER=4321 +-else +- BYTEORDER=1234 +-fi +-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) +-if test $ac_cv_c_bigendian = unknown; then +- AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) +-fi +-]) ++sinclude(../config/accross.m4) + + # Like AC_CONFIG_HEADER, but automatically create stamp file. + +-AC_DEFUN(AM_CONFIG_HEADER, ++AC_DEFUN([AM_CONFIG_HEADER], + [AC_PREREQ([2.12]) + AC_CONFIG_HEADER([$1]) + dnl When config.status generates a header, we must update the stamp-h file. +@@ -147,7 +54,7 @@ + dnl Usage: + dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +-AC_DEFUN(AM_INIT_AUTOMAKE, ++AC_DEFUN([AM_INIT_AUTOMAKE], + [AC_REQUIRE([AC_PROG_INSTALL]) + PACKAGE=[$1] + AC_SUBST(PACKAGE) +@@ -175,7 +82,7 @@ + # Check to make sure that the build environment is sane. + # + +-AC_DEFUN(AM_SANITY_CHECK, ++AC_DEFUN([AM_SANITY_CHECK], + [AC_MSG_CHECKING([whether build environment is sane]) + # Just in case + sleep 1 +@@ -216,7 +123,7 @@ + + dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) + dnl The program must properly implement --version. +-AC_DEFUN(AM_MISSING_PROG, ++AC_DEFUN([AM_MISSING_PROG], + [AC_MSG_CHECKING(for working $2) + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. +@@ -235,7 +142,7 @@ + + # serial 1 + +-AC_DEFUN(AM_MAINTAINER_MODE, ++AC_DEFUN([AM_MAINTAINER_MODE], + [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +@@ -252,7 +159,7 @@ + + # Define a conditional. + +-AC_DEFUN(AM_CONDITIONAL, ++AC_DEFUN([AM_CONDITIONAL], + [AC_SUBST($1_TRUE) + AC_SUBST($1_FALSE) + if $2; then +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure +--- gcc-3.2.2.orig/libffi/configure Wed Jan 29 07:59:05 2003 ++++ gcc/libffi/configure Sat Feb 1 20:16:19 2003 +@@ -633,17 +633,16 @@ + + if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then +- libffi_basedir="${srcdir}/${with_multisrctop}.." ++ libffi_basedir="${with_multisrctop}../" + else +- libffi_basedir="${srcdir}/${with_multisrctop}" ++ libffi_basedir="${with_multisrctop}" + fi + else +- libffi_basedir="${srcdir}" ++ libffi_basedir= + fi + +- + ac_aux_dir= +-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do ++for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" +@@ -655,13 +654,14 @@ + fi + done + if test -z "$ac_aux_dir"; then +- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } ++ { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; } + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + ++ + # Make sure we can run config.sub. + if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : + else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +@@ -1238,9 +1238,18 @@ + ;; + + hpux10.20*|hpux11*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libc.sl ++ case $host_cpu in ++ hppa*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=/usr/lib/libc.sl ++ ;; ++ ia64*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ++ ;; ++ esac + ;; + + irix5* | irix6*) +@@ -1267,7 +1276,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +@@ -1330,13 +1339,13 @@ + deplibs_check_method=$lt_cv_deplibs_check_method + + echo $ac_n "checking for object suffix""... $ac_c" 1>&6 +-echo "configure:1334: checking for object suffix" >&5 ++echo "configure:1343: checking for object suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + rm -f conftest* + echo 'int i = 1;' > conftest.$ac_ext +-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; +@@ -1356,7 +1365,7 @@ + + + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +-echo "configure:1360: checking for executable suffix" >&5 ++echo "configure:1369: checking for executable suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1366,7 +1375,7 @@ + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= +- if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj) ;; +@@ -1399,7 +1408,7 @@ + file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 +-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5 ++echo "configure:1412: checking for ${ac_tool_prefix}file" >&5 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1461,7 +1470,7 @@ + if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo $ac_n "checking for file""... $ac_c" 1>&6 +-echo "configure:1465: checking for file" >&5 ++echo "configure:1474: checking for file" >&5 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1532,7 +1541,7 @@ + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1536: checking for $ac_word" >&5 ++echo "configure:1545: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1564,7 +1573,7 @@ + # Extract the first word of "ranlib", so it can be a program name with args. + set dummy ranlib; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1568: checking for $ac_word" >&5 ++echo "configure:1577: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1599,7 +1608,7 @@ + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. + set dummy ${ac_tool_prefix}strip; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1603: checking for $ac_word" >&5 ++echo "configure:1612: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1631,7 +1640,7 @@ + # Extract the first word of "strip", so it can be a program name with args. + set dummy strip; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1635: checking for $ac_word" >&5 ++echo "configure:1644: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1698,8 +1707,8 @@ + case $host in + *-*-irix6*) + # Find out which ABI we are using. +- echo '#line 1702 "configure"' > conftest.$ac_ext +- if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ echo '#line 1711 "configure"' > conftest.$ac_ext ++ if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" +@@ -1715,12 +1724,70 @@ + rm -rf conftest* + ;; + ++ia64-*-hpux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ case "`/usr/bin/file conftest.o`" in ++ *ELF-32*) ++ HPUX_IA64_MODE="32" ++ ;; ++ *ELF-64*) ++ HPUX_IA64_MODE="64" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ ++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ case "`/usr/bin/file conftest.o`" in ++ *32-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_i386" ++ ;; ++ ppc64-*linux*) ++ LD="${LD-ld} -m elf32ppclinux" ++ ;; ++ s390x-*linux*) ++ LD="${LD-ld} -m elf_s390" ++ ;; ++ sparc64-*linux*) ++ LD="${LD-ld} -m elf32_sparc" ++ ;; ++ esac ++ ;; ++ *64-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ ppc*-*linux*|powerpc*-*linux*) ++ LD="${LD-ld} -m elf64ppc" ++ ;; ++ s390*-*linux*) ++ LD="${LD-ld} -m elf64_s390" ++ ;; ++ sparc*-*linux*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ + *-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +-echo "configure:1724: checking whether the C compiler needs -belf" >&5 ++echo "configure:1791: checking whether the C compiler needs -belf" >&5 + if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1733,14 +1800,14 @@ + cross_compiling=$ac_cv_prog_cc_cross + + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes + else +@@ -1868,7 +1935,7 @@ + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" + # ./install, which can be erroneously created by make from ./install.sh. + echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +-echo "configure:1872: checking for a BSD compatible install" >&5 ++echo "configure:1939: checking for a BSD compatible install" >&5 + if test -z "$INSTALL"; then + if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +@@ -1921,7 +1988,7 @@ + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +-echo "configure:1925: checking whether build environment is sane" >&5 ++echo "configure:1992: checking whether build environment is sane" >&5 + # Just in case + sleep 1 + echo timestamp > conftestfile +@@ -1978,7 +2045,7 @@ + test "$program_transform_name" = "" && program_transform_name="s,x,x," + + echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5 ++echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5 + set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +@@ -2017,7 +2084,7 @@ + + missing_dir=`cd $ac_aux_dir && pwd` + echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +-echo "configure:2021: checking for working aclocal" >&5 ++echo "configure:2088: checking for working aclocal" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2030,7 +2097,7 @@ + fi + + echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +-echo "configure:2034: checking for working autoconf" >&5 ++echo "configure:2101: checking for working autoconf" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2043,7 +2110,7 @@ + fi + + echo $ac_n "checking for working automake""... $ac_c" 1>&6 +-echo "configure:2047: checking for working automake" >&5 ++echo "configure:2114: checking for working automake" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2056,7 +2123,7 @@ + fi + + echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +-echo "configure:2060: checking for working autoheader" >&5 ++echo "configure:2127: checking for working autoheader" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2069,7 +2136,7 @@ + fi + + echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +-echo "configure:2073: checking for working makeinfo" >&5 ++echo "configure:2140: checking for working makeinfo" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2086,7 +2153,7 @@ + + + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +-echo "configure:2090: checking for executable suffix" >&5 ++echo "configure:2157: checking for executable suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2096,7 +2163,7 @@ + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= +- if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj) ;; +@@ -2117,7 +2184,7 @@ + ac_exeext=$EXEEXT + + echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 +-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. + if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" +@@ -2143,7 +2210,7 @@ + # Extract the first word of "gcc", so it can be a program name with args. + set dummy gcc; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:2147: checking for $ac_word" >&5 ++echo "configure:2214: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2173,7 +2240,7 @@ + # Extract the first word of "cc", so it can be a program name with args. + set dummy cc; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:2177: checking for $ac_word" >&5 ++echo "configure:2244: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2224,7 +2291,7 @@ + # Extract the first word of "cl", so it can be a program name with args. + set dummy cl; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:2228: checking for $ac_word" >&5 ++echo "configure:2295: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2256,7 +2323,7 @@ + fi + + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ++echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + + ac_ext=c + # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +@@ -2267,12 +2334,12 @@ + + cat > conftest.$ac_ext << EOF + +-#line 2271 "configure" ++#line 2338 "configure" + #include "confdefs.h" + + main(){return(0);} + EOF +-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then +@@ -2298,12 +2365,12 @@ + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } + fi + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 ++echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 + echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 + cross_compiling=$ac_cv_prog_cc_cross + + echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +-echo "configure:2307: checking whether we are using GNU C" >&5 ++echo "configure:2374: checking whether we are using GNU C" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2312,7 +2379,7 @@ + yes; + #endif + EOF +-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes + else + ac_cv_prog_gcc=no +@@ -2331,7 +2398,7 @@ + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5 ++echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2381,17 +2448,23 @@ + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; ++mips64*-*);; ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; ++sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;; + esac + + if test $TARGETDIR = unknown; then +@@ -2418,6 +2491,15 @@ + fi + + ++if test x$TARGET = xMIPS_LINUX; then ++ MIPS_LINUX_TRUE= ++ MIPS_LINUX_FALSE='#' ++else ++ MIPS_LINUX_TRUE='#' ++ MIPS_LINUX_FALSE= ++fi ++ ++ + if test x$TARGET = xSPARC; then + SPARC_TRUE= + SPARC_FALSE='#' +@@ -2507,8 +2589,39 @@ + ARM_FALSE= + fi + ++ ++if test x$TARGET = xS390; then ++ S390_TRUE= ++ S390_FALSE='#' ++else ++ S390_TRUE='#' ++ S390_FALSE= ++fi ++ ++ ++if test x$TARGET = xX86_64; then ++ X86_64_TRUE= ++ X86_64_FALSE='#' ++else ++ X86_64_TRUE='#' ++ X86_64_FALSE= ++fi ++ ++ ++if test x$TARGET = xSH; then ++ SH_TRUE= ++ SH_FALSE='#' ++else ++ SH_TRUE='#' ++ SH_FALSE= ++fi ++ ++if test x$TARGET = xMIPS_LINUX; then ++ TARGET=MIPS ++fi ++ + echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +-echo "configure:2512: checking how to run the C preprocessor" >&5 ++echo "configure:2625: checking how to run the C preprocessor" >&5 + # On Suns, sometimes $CPP names a directory. + if test -n "$CPP" && test -d "$CPP"; then + CPP= +@@ -2523,13 +2636,13 @@ + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2540,13 +2653,13 @@ + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2557,13 +2670,13 @@ + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2588,12 +2701,12 @@ + echo "$ac_t""$CPP" 1>&6 + + echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +-echo "configure:2592: checking for ANSI C header files" >&5 ++echo "configure:2705: checking for ANSI C header files" >&5 + if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + #include +@@ -2601,7 +2714,7 @@ + #include + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + rm -rf conftest* +@@ -2618,7 +2731,7 @@ + if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat > conftest.$ac_ext < + EOF +@@ -2636,7 +2749,7 @@ + if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat > conftest.$ac_ext < + EOF +@@ -2657,7 +2770,7 @@ + : + else + cat > conftest.$ac_ext < + #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +@@ -2668,7 +2781,7 @@ + exit (0); } + + EOF +-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + : + else +@@ -2694,12 +2807,12 @@ + for ac_func in memcpy + do + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +-echo "configure:2698: checking for $ac_func" >&5 ++echo "configure:2811: checking for $ac_func" >&5 + if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" + else +@@ -2749,19 +2862,19 @@ + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works + # for constant arguments. Useless! + echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 +-echo "configure:2753: checking for working alloca.h" >&5 ++echo "configure:2866: checking for working alloca.h" >&5 + if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + int main() { + char *p = alloca(2 * sizeof(int)); + ; return 0; } + EOF +-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_header_alloca_h=yes + else +@@ -2782,12 +2895,12 @@ + fi + + echo $ac_n "checking for alloca""... $ac_c" 1>&6 +-echo "configure:2786: checking for alloca" >&5 ++echo "configure:2899: checking for alloca" >&5 + if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_func_alloca_works=yes + else +@@ -2847,12 +2960,12 @@ + + + echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 +-echo "configure:2851: checking whether alloca needs Cray hooks" >&5 ++echo "configure:2964: checking whether alloca needs Cray hooks" >&5 + if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&6 +-echo "configure:2881: checking for $ac_func" >&5 ++echo "configure:2994: checking for $ac_func" >&5 + if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" + else +@@ -2932,7 +3045,7 @@ + fi + + echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 +-echo "configure:2936: checking stack direction for C alloca" >&5 ++echo "configure:3049: checking stack direction for C alloca" >&5 + if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2940,7 +3053,7 @@ + ac_cv_c_stack_direction=0 + else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + ac_cv_c_stack_direction=1 + else +@@ -2982,13 +3095,13 @@ + + + echo $ac_n "checking size of short""... $ac_c" 1>&6 +-echo "configure:2986: checking size of short" >&5 ++echo "configure:3099: checking size of short" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -2998,7 +3111,7 @@ + switch (0) case 0: case (sizeof (short) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_short=$ac_size + else +@@ -3021,13 +3134,13 @@ + + + echo $ac_n "checking size of int""... $ac_c" 1>&6 +-echo "configure:3025: checking size of int" >&5 ++echo "configure:3138: checking size of int" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3037,7 +3150,7 @@ + switch (0) case 0: case (sizeof (int) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_int=$ac_size + else +@@ -3060,13 +3173,13 @@ + + + echo $ac_n "checking size of long""... $ac_c" 1>&6 +-echo "configure:3064: checking size of long" >&5 ++echo "configure:3177: checking size of long" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3076,7 +3189,7 @@ + switch (0) case 0: case (sizeof (long) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long=$ac_size + else +@@ -3099,13 +3212,13 @@ + + + echo $ac_n "checking size of long long""... $ac_c" 1>&6 +-echo "configure:3103: checking size of long long" >&5 ++echo "configure:3216: checking size of long long" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3115,7 +3228,7 @@ + switch (0) case 0: case (sizeof (long long) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long_long=$ac_size + else +@@ -3138,13 +3251,13 @@ + + + echo $ac_n "checking size of float""... $ac_c" 1>&6 +-echo "configure:3142: checking size of float" >&5 ++echo "configure:3255: checking size of float" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3154,7 +3267,7 @@ + switch (0) case 0: case (sizeof (float) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_float=$ac_size + else +@@ -3177,13 +3290,13 @@ + + + echo $ac_n "checking size of double""... $ac_c" 1>&6 +-echo "configure:3181: checking size of double" >&5 ++echo "configure:3294: checking size of double" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3193,7 +3306,7 @@ + switch (0) case 0: case (sizeof (double) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_double=$ac_size + else +@@ -3216,13 +3329,13 @@ + + + echo $ac_n "checking size of long double""... $ac_c" 1>&6 +-echo "configure:3220: checking size of long double" >&5 ++echo "configure:3333: checking size of long double" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3232,7 +3345,7 @@ + switch (0) case 0: case (sizeof (long double) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long_double=$ac_size + else +@@ -3256,13 +3369,13 @@ + + + echo $ac_n "checking size of void *""... $ac_c" 1>&6 +-echo "configure:3260: checking size of void *" >&5 ++echo "configure:3373: checking size of void *" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext < +@@ -3272,7 +3385,7 @@ + switch (0) case 0: case (sizeof (void *) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_void_p=$ac_size + else +@@ -3295,14 +3408,14 @@ + + + echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 +-echo "configure:3299: checking whether byte ordering is bigendian" >&5 ++echo "configure:3412: checking whether byte ordering is bigendian" >&5 + if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_cv_c_bigendian=unknown + # See if sys/param.h defines the BYTE_ORDER macro. + cat > conftest.$ac_ext < + #include +@@ -3313,11 +3426,11 @@ + #endif + ; return 0; } + EOF +-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + # It does; now see whether it defined to BIG_ENDIAN or not. + cat > conftest.$ac_ext < + #include +@@ -3328,7 +3441,7 @@ + #endif + ; return 0; } + EOF +-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_bigendian=yes + else +@@ -3348,7 +3461,7 @@ + echo $ac_n "cross-compiling... " 2>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + ac_cv_c_bigendian=no + else +@@ -3379,7 +3492,7 @@ + echo "$ac_t""$ac_cv_c_bigendian" 1>&6 + if test $ac_cv_c_bigendian = unknown; then + echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6 +-echo "configure:3383: checking to probe for byte ordering" >&5 ++echo "configure:3496: checking to probe for byte ordering" >&5 + + cat >conftest.c <> confdefs.h <<\EOF ++#define HOST_WORDS_BIG_ENDIAN 1 ++EOF ++ + BYTEORDER=4321 + else + BYTEORDER=1234 +@@ -3429,7 +3546,7 @@ + + if test x$TARGET = xSPARC; then + echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6 +-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5 ++echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5 + if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -3439,14 +3556,14 @@ + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + libffi_cv_as_sparc_ua_pcrel=yes + else +@@ -3709,6 +3826,8 @@ + s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g + s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g + s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g ++s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g ++s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g + s%@SPARC_TRUE@%$SPARC_TRUE%g + s%@SPARC_FALSE@%$SPARC_FALSE%g + s%@X86_TRUE@%$X86_TRUE%g +@@ -3729,6 +3848,12 @@ + s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g + s%@ARM_TRUE@%$ARM_TRUE%g + s%@ARM_FALSE@%$ARM_FALSE%g ++s%@S390_TRUE@%$S390_TRUE%g ++s%@S390_FALSE@%$S390_FALSE%g ++s%@X86_64_TRUE@%$X86_64_TRUE%g ++s%@X86_64_FALSE@%$X86_64_FALSE%g ++s%@SH_TRUE@%$SH_TRUE%g ++s%@SH_FALSE@%$SH_FALSE%g + s%@CPP@%$CPP%g + s%@ALLOCA@%$ALLOCA%g + s%@TARGET@%$TARGET%g +@@ -3969,7 +4094,7 @@ + + if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" +- ac_file=Makefile . ${libffi_basedir}/../config-ml.in ++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in + fi + + exit 0 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in +--- gcc-3.2.2.orig/libffi/configure.in Tue Jan 28 10:43:56 2003 ++++ gcc/libffi/configure.in Sat Feb 1 20:16:19 2003 +@@ -22,14 +22,15 @@ + + if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then +- libffi_basedir="${srcdir}/${with_multisrctop}.." ++ libffi_basedir="${with_multisrctop}../" + else +- libffi_basedir="${srcdir}/${with_multisrctop}" ++ libffi_basedir="${with_multisrctop}" + fi + else +- libffi_basedir="${srcdir}" ++ libffi_basedir= + fi + AC_SUBST(libffi_basedir) ++AC_CONFIG_AUX_DIR(${libffi_basedir}..) + + AC_CANONICAL_HOST + +@@ -56,17 +57,23 @@ + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; ++mips64*-*);; ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; ++sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;; + esac + + if test $TARGETDIR = unknown; then +@@ -75,6 +82,7 @@ + + AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes) + AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno) ++AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX) + AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) + AM_CONDITIONAL(X86, test x$TARGET = xX86) + AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32) +@@ -85,6 +93,13 @@ + AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) + AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) + AM_CONDITIONAL(ARM, test x$TARGET = xARM) ++AM_CONDITIONAL(S390, test x$TARGET = xS390) ++AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) ++AM_CONDITIONAL(SH, test x$TARGET = xSH) ++ ++if test x$TARGET = xMIPS_LINUX; then ++ TARGET=MIPS ++fi + + AC_HEADER_STDC + AC_CHECK_FUNCS(memcpy) +@@ -171,7 +186,7 @@ + [ + if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" +- ac_file=Makefile . ${libffi_basedir}/../config-ml.in ++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in + fi + ], + srcdir=${srcdir} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in +--- gcc-3.2.2.orig/libffi/include/Makefile.in Tue Oct 9 14:32:16 2001 ++++ gcc/libffi/include/Makefile.in Mon Apr 29 13:14:44 2002 +@@ -99,7 +99,7 @@ + + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +-TAR = gnutar ++TAR = gtar + GZIP_ENV = --best + all: all-redirect + .SUFFIXES: +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in +--- gcc-3.2.2.orig/libffi/include/ffi.h.in Wed Mar 13 07:35:56 2002 ++++ gcc/libffi/include/ffi.h.in Wed Jan 29 00:54:28 2003 +@@ -1,5 +1,5 @@ + /* -----------------------------------------------------------------*-C-*- +- libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions ++ libffi @VERSION@ - Copyright (c) 1996-2003 Cygnus Solutions + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the +@@ -164,6 +164,12 @@ + #endif + #endif + ++#ifdef S390 ++#if defined (__s390x__) ++#define S390X ++#endif ++#endif ++ + #ifndef LIBFFI_ASM + + /* ---- Generic type definitions ----------------------------------------- */ +@@ -189,16 +195,23 @@ + #endif + #endif + +- /* ---- Intel x86 ---------------- */ +-#ifdef X86 ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 + FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, + #endif + +- /* ---- Intel x86 Win32 ---------- */ +-#ifdef X86_WIN32 ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++#ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, ++#else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++#endif + #endif + + /* ---- Intel ia64 ---------------- */ +@@ -251,6 +264,18 @@ + FFI_DEFAULT_ABI = FFI_SYSV, + #endif + ++ /* ---- S390 --------------------- */ ++#ifdef S390 ++ FFI_SYSV, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- SuperH ------------------- */ ++#ifdef SH ++ FFI_SYSV, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ + /* Leave this for debugging purposes */ + FFI_LAST_ABI + +@@ -264,7 +289,7 @@ + /*@null@*/ struct _ffi_type **elements; + } ffi_type; + +-/* These are defined in ffi.c */ ++/* These are defined in types.c */ + extern ffi_type ffi_type_void; + extern ffi_type ffi_type_uint8; + extern ffi_type ffi_type_sint8; +@@ -373,13 +398,7 @@ + + /* ---- Definitions for closures ----------------------------------------- */ + +-#ifdef X86 +- +-#define FFI_CLOSURES 1 /* x86 supports closures */ +-#define FFI_TRAMPOLINE_SIZE 10 +-#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */ +- +-#elif defined(X86_WIN32) ++#ifdef __i386__ + + #define FFI_CLOSURES 1 /* x86 supports closures */ + #define FFI_TRAMPOLINE_SIZE 10 +@@ -424,6 +443,40 @@ + #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ + #define FFI_NATIVE_RAW_API 0 + ++#elif defined(SPARC64) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 24 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(SPARC) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 16 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(S390) ++ ++#define FFI_CLOSURES 1 ++#ifdef S390X ++#define FFI_TRAMPOLINE_SIZE 32 ++#else ++#define FFI_TRAMPOLINE_SIZE 16 ++#endif ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(SH) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 16 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(__x86_64__) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 24 ++#define FFI_NATIVE_RAW_API 0 ++ + #else + + #define FFI_CLOSURES 0 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c +--- gcc-3.2.2.orig/libffi/src/arm/ffi.c Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/arm/ffi.c Fri Jul 19 08:08:30 2002 +@@ -36,13 +36,10 @@ + /*@=exportheader@*/ + { + register unsigned int i; +- register int tmp; +- register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + +- tmp = 0; + argp = stack; + + if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) { +@@ -50,11 +47,10 @@ + argp += 4; + } + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- (i != 0) && (avn != 0); ++ (i != 0); + i--, p_arg++) + { + size_t z; +@@ -64,9 +60,6 @@ + argp = (char *) ALIGN(argp, (*p_arg)->alignment); + } + +- if (avn != 0) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof(int)) + { +@@ -107,7 +100,6 @@ + } + p_argv++; + argp += z; +- } + } + + return; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S +--- gcc-3.2.2.orig/libffi/src/arm/sysv.S Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/arm/sysv.S Mon Sep 30 03:08:58 2002 +@@ -28,8 +28,15 @@ + #ifdef HAVE_MACHINE_ASM_H + #include + #else +-/* XXX these lose for some platforms, I'm sure. */ ++#ifdef __USER_LABEL_PREFIX__ ++#define CONCAT1(a, b) CONCAT2(a, b) ++#define CONCAT2(a, b) a ## b ++ ++/* Use the right prefix for global labels. */ ++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) ++#else + #define CNAME(x) x ++#endif + #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): + #endif + +@@ -96,12 +103,20 @@ + + # return FLOAT + cmp a4, #FFI_TYPE_FLOAT ++#ifdef __SOFTFP__ ++ streq a1, [a3] ++#else + stfeqs f0, [a3] ++#endif + beq epilogue + + # return DOUBLE or LONGDOUBLE + cmp a4, #FFI_TYPE_DOUBLE ++#ifdef __SOFTFP__ ++ stmeqia a3, {a1, a2} ++#else + stfeqd f0, [a3] ++#endif + + epilogue: + ldmfd sp!, {a1-a4, fp, pc} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c +--- gcc-3.2.2.orig/libffi/src/java_raw_api.c Tue Apr 9 07:31:14 2002 ++++ gcc/libffi/src/java_raw_api.c Tue Oct 8 23:55:02 2002 +@@ -81,21 +81,14 @@ + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1); ++ *args = (void*) ((char*)(raw++) + 3); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2); ++ *args = (void*) ((char*)(raw++) + 2); + break; + +-#if SIZEOF_ARG >= 4 +- case FFI_TYPE_UINT32: +- case FFI_TYPE_SINT32: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4); +- break; +-#endif +- + #if SIZEOF_ARG == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +@@ -157,31 +150,54 @@ + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT8*) (*args); ++#else + (raw++)->uint = *(UINT8*) (*args); ++#endif + break; + + case FFI_TYPE_SINT8: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT8*) (*args); ++#else + (raw++)->sint = *(SINT8*) (*args); ++#endif + break; + + case FFI_TYPE_UINT16: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT16*) (*args); ++#else + (raw++)->uint = *(UINT16*) (*args); ++#endif + break; + + case FFI_TYPE_SINT16: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT16*) (*args); ++#else + (raw++)->sint = *(SINT16*) (*args); ++#endif + break; + +-#if SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT32*) (*args); ++#else + (raw++)->uint = *(UINT32*) (*args); ++#endif + break; + + case FFI_TYPE_SINT32: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT32*) (*args); ++#else + (raw++)->sint = *(SINT32*) (*args); +- break; + #endif +- case FFI_TYPE_FLOAT: ++ break; ++ ++ case FFI_TYPE_FLOAT: + (raw++)->flt = *(FLOAT32*) (*args); + break; + +@@ -211,6 +227,55 @@ + + #if !FFI_NATIVE_RAW_API + ++static void ++ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) ++{ ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ *(UINT64 *)rvalue <<= 32; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ *(SINT64 *)rvalue <<= 32; ++ break; ++ ++ default: ++ break; ++ } ++#endif ++} ++ ++static void ++ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) ++{ ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ *(UINT64 *)rvalue >>= 32; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ *(SINT64 *)rvalue >>= 32; ++ break; ++ ++ default: ++ break; ++ } ++#endif ++} + + /* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. +@@ -227,6 +292,7 @@ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_java_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); ++ ffi_java_rvalue_to_raw (cif, rvalue); + } + + #if FFI_CLOSURES /* base system provides closures */ +@@ -240,6 +306,7 @@ + + ffi_java_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, raw, cl->user_data); ++ ffi_java_raw_to_rvalue (cif, rvalue); + } + + /* Again, here is the generic version of ffi_prep_raw_closure, which +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c +--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c Sun Aug 8 22:27:19 1999 ++++ gcc/libffi/src/m68k/ffi.c Fri Jul 19 08:08:30 2002 +@@ -16,14 +16,11 @@ + ffi_prep_args (void *stack, extended_cif *ecif) + { + unsigned int i; +- int tmp; +- unsigned int avn; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + +- tmp = 0; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT +@@ -32,11 +29,10 @@ + else + struct_value_ptr = NULL; + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- i != 0 && avn != 0; ++ i != 0; + i--, p_arg++) + { + size_t z; +@@ -45,9 +41,6 @@ + if (((*p_arg)->alignment - 1) & (unsigned) argp) + argp = (char *) ALIGN (argp, (*p_arg)->alignment); + +- if (avn != 0) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof (int)) + { +@@ -82,7 +75,6 @@ + memcpy (argp, *p_argv, z); + p_argv++; + argp += z; +- } + } + + return struct_value_ptr; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c +--- gcc-3.2.2.orig/libffi/src/mips/ffi.c Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/mips/ffi.c Fri Jul 19 08:08:31 2002 +@@ -23,6 +23,7 @@ + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + ++#include + #include + #include + +@@ -50,7 +51,6 @@ + int flags) + { + register int i; +- register int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; +@@ -80,12 +80,9 @@ + FIX_ARGP; + } + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + +- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- i && avn; +- i--, p_arg++) ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) + { + size_t z; + +@@ -101,9 +98,6 @@ + #define OFFSET sizeof(int) + #endif + +- if (avn) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof(SLOT_TYPE_UNSIGNED)) + { +@@ -179,7 +173,6 @@ + p_argv++; + argp += z; + FIX_ARGP; +- } + } + + return; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S +--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S Sat Jan 19 01:22:34 2002 ++++ gcc/libffi/src/powerpc/darwin.S Thu Jan 23 03:21:55 2003 +@@ -3,8 +3,6 @@ + + PowerPC Assembly glue. + +- $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $ +- + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including +@@ -39,30 +37,34 @@ + .text + .align 2 + _ffi_call_DARWIN: +- mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved... ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved... */ ++LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 +- ++LCFI0: + /* Allocate the stack space we need. */ + stwux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + +- stw r28,-16(r8) ++ stw r28,-16(r8) + stw r29,-12(r8) + stw r30, -8(r8) + stw r31, -4(r8) +- +- stw r9, 8(r8) ++ ++ stw r9, 8(r8) + stw r2, 20(r1) ++LCFI1: + + /* Save arguments over call... */ +- mr r31,r5 /* flags, */ +- mr r30,r6 /* rvalue, */ +- mr r29,r7 /* function address, */ +- mr r28,r8 /* our AP. */ +- ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 +@@ -145,7 +147,8 @@ + L(float_return_value): + stfs f1,0(r30) + b L(done_return_value) +-//END(_ffi_call_DARWIN) ++LFE1: ++/* END(_ffi_call_DARWIN) */ + + /* Provide a null definition of _ffi_call_AIX. */ + .text +@@ -155,5 +158,61 @@ + .align 2 + _ffi_call_AIX: + blr +-//END(_ffi_call_AIX) ++/* END(_ffi_call_AIX) */ + ++.data ++.section __TEXT,__eh_frame ++Lframe1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align 2 ++LECIE1: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++LASFDE1: ++ .set L$set$2,LASFDE1-Lframe1 ++ .long L$set$2 ; FDE CIE offset ++ .long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align 2 ++LEFDE1: ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c +--- gcc-3.2.2.orig/libffi/src/prep_cif.c Sat Mar 3 07:21:22 2001 ++++ gcc/libffi/src/prep_cif.c Mon Sep 30 20:59:42 2002 +@@ -103,7 +103,8 @@ + /* Perform a sanity check on the return type */ + FFI_ASSERT(ffi_type_test(cif->rtype)); + +-#ifndef M68K ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT + #ifdef SPARC +@@ -122,6 +123,7 @@ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + ++#if !defined __x86_64__ && !defined S390 + #ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) +@@ -137,6 +139,7 @@ + + bytes += STACK_ARG_SIZE((*ptr)->size); + } ++#endif + } + + cif->bytes = bytes; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c +--- gcc-3.2.2.orig/libffi/src/s390/ffi.c Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/s390/ffi.c Thu Feb 6 08:58:57 2003 +@@ -0,0 +1,753 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2000 Software AG ++ ++ S390 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++/*====================================================================*/ ++/* Includes */ ++/* -------- */ ++/*====================================================================*/ ++ ++#include ++#include ++ ++#include ++#include ++ ++/*====================== End of Includes =============================*/ ++ ++/*====================================================================*/ ++/* Defines */ ++/* ------- */ ++/*====================================================================*/ ++ ++/* Maximum number of GPRs available for argument passing. */ ++#define MAX_GPRARGS 5 ++ ++/* Maximum number of FPRs available for argument passing. */ ++#ifdef __s390x__ ++#define MAX_FPRARGS 4 ++#else ++#define MAX_FPRARGS 2 ++#endif ++ ++/* Round to multiple of 16. */ ++#define ROUND_SIZE(size) (((size) + 15) & ~15) ++ ++/* If these values change, sysv.S must be adapted! */ ++#define FFI390_RET_VOID 0 ++#define FFI390_RET_STRUCT 1 ++#define FFI390_RET_FLOAT 2 ++#define FFI390_RET_DOUBLE 3 ++#define FFI390_RET_INT32 4 ++#define FFI390_RET_INT64 5 ++ ++/*===================== End of Defines ===============================*/ ++ ++/*====================================================================*/ ++/* Prototypes */ ++/* ---------- */ ++/*====================================================================*/ ++ ++static void ffi_prep_args (unsigned char *, extended_cif *); ++static int ffi_check_float_struct (ffi_type *); ++void ++#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) ++__attribute__ ((visibility ("hidden"))) ++#endif ++ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, ++ unsigned long long *, unsigned long *); ++ ++/*====================== End of Prototypes ===========================*/ ++ ++/*====================================================================*/ ++/* Externals */ ++/* --------- */ ++/*====================================================================*/ ++ ++extern void ffi_call_SYSV(unsigned, ++ extended_cif *, ++ void (*)(unsigned char *, extended_cif *), ++ unsigned, ++ void *, ++ void (*fn)()); ++ ++extern void ffi_closure_SYSV(void); ++ ++/*====================== End of Externals ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_check_struct_type. */ ++/* */ ++/* Function - Determine if a structure can be passed within a */ ++/* general purpose or floating point register. */ ++/* */ ++/*====================================================================*/ ++ ++static int ++ffi_check_struct_type (ffi_type *arg) ++{ ++ size_t size = arg->size; ++ ++ /* If the struct has just one element, look at that element ++ to find out whether to consider the struct as floating point. */ ++ while (arg->type == FFI_TYPE_STRUCT ++ && arg->elements[0] && !arg->elements[1]) ++ arg = arg->elements[0]; ++ ++ /* Structs of size 1, 2, 4, and 8 are passed in registers, ++ just like the corresponding int/float types. */ ++ switch (size) ++ { ++ case 1: ++ return FFI_TYPE_UINT8; ++ ++ case 2: ++ return FFI_TYPE_UINT16; ++ ++ case 4: ++ if (arg->type == FFI_TYPE_FLOAT) ++ return FFI_TYPE_FLOAT; ++ else ++ return FFI_TYPE_UINT32; ++ ++ case 8: ++ if (arg->type == FFI_TYPE_DOUBLE) ++ return FFI_TYPE_DOUBLE; ++ else ++ return FFI_TYPE_UINT64; ++ ++ default: ++ break; ++ } ++ ++ /* Other structs are passed via a pointer to the data. */ ++ return FFI_TYPE_POINTER; ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_args. */ ++/* */ ++/* Function - Prepare parameters for call to function. */ ++/* */ ++/* ffi_prep_args is called by the assembly routine once stack space */ ++/* has been allocated for the function's arguments. */ ++/* */ ++/*====================================================================*/ ++ ++static void ++ffi_prep_args (unsigned char *stack, extended_cif *ecif) ++{ ++ /* The stack space will be filled with those areas: ++ ++ FPR argument register save area (highest addresses) ++ GPR argument register save area ++ temporary struct copies ++ overflow argument area (lowest addresses) ++ ++ We set up the following pointers: ++ ++ p_fpr: bottom of the FPR area (growing upwards) ++ p_gpr: bottom of the GPR area (growing upwards) ++ p_ov: bottom of the overflow area (growing upwards) ++ p_struct: top of the struct copy area (growing downwards) ++ ++ All areas are kept aligned to twice the word size. */ ++ ++ int gpr_off = ecif->cif->bytes; ++ int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); ++ ++ unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); ++ unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); ++ unsigned char *p_struct = (unsigned char *)p_gpr; ++ unsigned long *p_ov = (unsigned long *)stack; ++ ++ int n_fpr = 0; ++ int n_gpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ void **p_argv = ecif->avalue; ++ int i; ++ ++ /* If we returning a structure then we set the first parameter register ++ to the address of where we are returning this structure. */ ++ ++ if (ecif->cif->flags == FFI390_RET_STRUCT) ++ p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; ++ i > 0; ++ i--, ptr++, p_argv++) ++ { ++ void *arg = *p_argv; ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, copy the data. */ ++ if (type == FFI_TYPE_POINTER) ++ { ++ p_struct -= ROUND_SIZE ((*ptr)->size); ++ memcpy (p_struct, (char *)arg, (*ptr)->size); ++ arg = &p_struct; ++ } ++ } ++ ++ /* Pointers are passed like UINTs of the same size. */ ++ if (type == FFI_TYPE_POINTER) ++#ifdef __s390x__ ++ type = FFI_TYPE_UINT64; ++#else ++ type = FFI_TYPE_UINT32; ++#endif ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ p_fpr[n_fpr++] = *(unsigned long long *) arg; ++ else ++#ifdef __s390x__ ++ p_ov[n_ov++] = *(unsigned long *) arg; ++#else ++ p_ov[n_ov++] = ((unsigned long *) arg)[0], ++ p_ov[n_ov++] = ((unsigned long *) arg)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; ++ else ++ p_ov[n_ov++] = *(unsigned int *) arg; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned long *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned long *) arg; ++#else ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = ((unsigned long *) arg)[0], ++ p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; ++ else ++ p_ov[n_ov++] = ((unsigned long *) arg)[0], ++ p_ov[n_ov++] = ((unsigned long *) arg)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_UINT32: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned int *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned int *) arg; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed int *) arg; ++ else ++ p_ov[n_ov++] = *(signed int *) arg; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned short *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned short *) arg; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed short *) arg; ++ else ++ p_ov[n_ov++] = *(signed short *) arg; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned char *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned char *) arg; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed char *) arg; ++ else ++ p_ov[n_ov++] = *(signed char *) arg; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_cif_machdep. */ ++/* */ ++/* Function - Perform machine dependent CIF processing. */ ++/* */ ++/*====================================================================*/ ++ ++ffi_status ++ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ size_t struct_size = 0; ++ int n_gpr = 0; ++ int n_fpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ int i; ++ ++ /* Determine return value handling. */ ++ ++ switch (cif->rtype->type) ++ { ++ /* Void is easy. */ ++ case FFI_TYPE_VOID: ++ cif->flags = FFI390_RET_VOID; ++ break; ++ ++ /* Structures are returned via a hidden pointer. */ ++ case FFI_TYPE_STRUCT: ++ cif->flags = FFI390_RET_STRUCT; ++ n_gpr++; /* We need one GPR to pass the pointer. */ ++ break; ++ ++ /* Floating point values are returned in fpr 0. */ ++ case FFI_TYPE_FLOAT: ++ cif->flags = FFI390_RET_FLOAT; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ cif->flags = FFI390_RET_DOUBLE; ++ break; ++ ++ /* Integer values are returned in gpr 2 (and gpr 3 ++ for 64-bit values on 31-bit machines). */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ cif->flags = FFI390_RET_INT64; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ /* These are to be extended to word size. */ ++#ifdef __s390x__ ++ cif->flags = FFI390_RET_INT64; ++#else ++ cif->flags = FFI390_RET_INT32; ++#endif ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = cif->arg_types, i = cif->nargs; ++ i > 0; ++ i--, ptr++) ++ { ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, we must reserve space ++ to copy its data for proper call-by-value semantics. */ ++ if (type == FFI_TYPE_POINTER) ++ struct_size += ROUND_SIZE ((*ptr)->size); ++ } ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ /* The first MAX_FPRARGS floating point arguments ++ go in FPRs, the rest overflow to the stack. */ ++ ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ n_fpr++; ++ else ++ n_ov += sizeof (double) / sizeof (long); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ n_fpr++; ++ else ++ n_ov++; ++ break; ++ ++ /* On 31-bit machines, 64-bit integers are passed in GPR pairs, ++ if one is still available, or else on the stack. If only one ++ register is free, skip the register (it won't be used for any ++ subsequent argument either). */ ++ ++#ifndef __s390x__ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ n_gpr += 2; ++ else ++ n_ov += 2; ++ break; ++#endif ++ ++ /* Everything else is passed in GPRs (until MAX_GPRARGS ++ have been used) or overflows to the stack. */ ++ ++ default: ++ if (n_gpr < MAX_GPRARGS) ++ n_gpr++; ++ else ++ n_ov++; ++ break; ++ } ++ } ++ ++ /* Total stack space as required for overflow arguments ++ and temporary structure copies. */ ++ ++ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; ++ ++ return FFI_OK; ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_call. */ ++/* */ ++/* Function - Call the FFI routine. */ ++/* */ ++/*====================================================================*/ ++ ++void ++ffi_call(ffi_cif *cif, ++ void (*fn)(), ++ void *rvalue, ++ void **avalue) ++{ ++ int ret_type = cif->flags; ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ecif.rvalue = rvalue; ++ ++ /* If we don't have a return value, we need to fake one. */ ++ if (rvalue == NULL) ++ { ++ if (ret_type == FFI390_RET_STRUCT) ++ ecif.rvalue = alloca (cif->rtype->size); ++ else ++ ret_type = FFI390_RET_VOID; ++ } ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, ++ ret_type, ecif.rvalue, fn); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_closure_helper_SYSV. */ ++/* */ ++/* Function - Call a FFI closure target function. */ ++/* */ ++/*====================================================================*/ ++ ++void ++ffi_closure_helper_SYSV (ffi_closure *closure, ++ unsigned long *p_gpr, ++ unsigned long long *p_fpr, ++ unsigned long *p_ov) ++{ ++ unsigned long long ret_buffer; ++ ++ void *rvalue = &ret_buffer; ++ void **avalue; ++ void **p_arg; ++ ++ int n_gpr = 0; ++ int n_fpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ int i; ++ ++ /* Allocate buffer for argument list pointers. */ ++ ++ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); ++ ++ /* If we returning a structure, pass the structure address ++ directly to the target function. Otherwise, have the target ++ function store the return value to the GPR save area. */ ++ ++ if (closure->cif->flags == FFI390_RET_STRUCT) ++ rvalue = (void *) p_gpr[n_gpr++]; ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = closure->cif->arg_types, i = closure->cif->nargs; ++ i > 0; ++ i--, p_arg++, ptr++) ++ { ++ int deref_struct_pointer = 0; ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, remember to ++ retrieve the pointer later. */ ++ if (type == FFI_TYPE_POINTER) ++ deref_struct_pointer = 1; ++ } ++ ++ /* Pointers are passed like UINTs of the same size. */ ++ if (type == FFI_TYPE_POINTER) ++#ifdef __s390x__ ++ type = FFI_TYPE_UINT64; ++#else ++ type = FFI_TYPE_UINT32; ++#endif ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ *p_arg = &p_fpr[n_fpr++]; ++ else ++ *p_arg = &p_ov[n_ov], ++ n_ov += sizeof (double) / sizeof (long); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ *p_arg = &p_fpr[n_fpr++]; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = &p_gpr[n_gpr++]; ++ else ++ *p_arg = &p_ov[n_ov++]; ++#else ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = &p_gpr[n_gpr], n_gpr += 2; ++ else ++ *p_arg = &p_ov[n_ov], n_ov += 2; ++#endif ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ ++ /* If this is a struct passed via pointer, we need to ++ actually retrieve that pointer. */ ++ if (deref_struct_pointer) ++ *p_arg = *(void **)*p_arg; ++ } ++ ++ ++ /* Call the target function. */ ++ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); ++ ++ /* Convert the return value. */ ++ switch (closure->cif->rtype->type) ++ { ++ /* Void is easy, and so is struct. */ ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_STRUCT: ++ break; ++ ++ /* Floating point values are returned in fpr 0. */ ++ case FFI_TYPE_FLOAT: ++ p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ p_fpr[0] = *(unsigned long long *) rvalue; ++ break; ++ ++ /* Integer values are returned in gpr 2 (and gpr 3 ++ for 64-bit values on 31-bit machines). */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ p_gpr[0] = *(unsigned long *) rvalue; ++#else ++ p_gpr[0] = ((unsigned long *) rvalue)[0], ++ p_gpr[1] = ((unsigned long *) rvalue)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT8: ++ p_gpr[0] = *(unsigned long *) rvalue; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT8: ++ p_gpr[0] = *(signed long *) rvalue; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_closure. */ ++/* */ ++/* Function - Prepare a FFI closure. */ ++/* */ ++/*====================================================================*/ ++ ++ffi_status ++ffi_prep_closure (ffi_closure *closure, ++ ffi_cif *cif, ++ void (*fun) (ffi_cif *, void *, void **, void *), ++ void *user_data) ++{ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++#ifndef __s390x__ ++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ ++ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ ++ *(short *)&closure->tramp [4] = 0x1006; ++ *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ ++ *(long *)&closure->tramp [8] = (long)closure; ++ *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; ++#else ++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ ++ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ ++ *(short *)&closure->tramp [4] = 0x100e; ++ *(short *)&closure->tramp [6] = 0x0004; ++ *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ ++ *(long *)&closure->tramp[16] = (long)closure; ++ *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; ++#endif ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/*======================== End of Routine ============================*/ ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S +--- gcc-3.2.2.orig/libffi/src/s390/sysv.S Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/s390/sysv.S Thu Nov 28 01:44:35 2002 +@@ -0,0 +1,425 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2000 Software AG ++ ++ S390 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef __s390x__ ++ ++.text ++ ++ # r2: cif->bytes ++ # r3: &ecif ++ # r4: ffi_prep_args ++ # r5: ret_type ++ # r6: ecif.rvalue ++ # ov: fn ++ ++ # This assumes we are using gas. ++ .globl ffi_call_SYSV ++ .type ffi_call_SYSV,%function ++ffi_call_SYSV: ++.LFB1: ++ stm %r6,%r15,24(%r15) # Save registers ++.LCFI0: ++ basr %r13,0 # Set up base register ++.Lbase: ++ lr %r11,%r15 # Set up frame pointer ++.LCFI1: ++ sr %r15,%r2 ++ ahi %r15,-96-48 # Allocate stack ++ lr %r8,%r6 # Save ecif.rvalue ++ sr %r9,%r9 ++ ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address ++ l %r7,96(%r11) # Load function address ++ st %r11,0(%r15) # Set up back chain ++ ahi %r11,-48 # Register save area ++.LCFI2: ++ ++ la %r2,96(%r15) # Save area ++ # r3 already holds &ecif ++ basr %r14,%r4 # Call ffi_prep_args ++ ++ lm %r2,%r6,0(%r11) # Load arguments ++ ld %f0,32(%r11) ++ ld %f2,40(%r11) ++ la %r14,0(%r13,%r9) # Set return address ++ br %r7 # ... and call function ++ ++.LretNone: # Return void ++ l %r4,48+56(%r11) ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretFloat: ++ l %r4,48+56(%r11) ++ ste %f0,0(%r8) # Return float ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretDouble: ++ l %r4,48+56(%r11) ++ std %f0,0(%r8) # Return double ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretInt32: ++ l %r4,48+56(%r11) ++ st %r2,0(%r8) # Return int ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretInt64: ++ l %r4,48+56(%r11) ++ stm %r2,%r3,0(%r8) # Return long long ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.Ltable: ++ .byte .LretNone-.Lbase # FFI390_RET_VOID ++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT ++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT ++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE ++ .byte .LretInt32-.Lbase # FFI390_RET_INT32 ++ .byte .LretInt64-.Lbase # FFI390_RET_INT64 ++ ++.LFE1: ++.ffi_call_SYSV_end: ++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV ++ ++ ++ .globl ffi_closure_SYSV ++ .type ffi_closure_SYSV,%function ++ffi_closure_SYSV: ++.LFB2: ++ stm %r12,%r15,48(%r15) # Save registers ++.LCFI10: ++ basr %r13,0 # Set up base register ++.Lcbase: ++ stm %r2,%r6,8(%r15) # Save arguments ++ std %f0,64(%r15) ++ std %f2,72(%r15) ++ lr %r1,%r15 # Set up stack frame ++ ahi %r15,-96 ++.LCFI11: ++ l %r12,.Lchelper-.Lcbase(%r13) # Get helper function ++ lr %r2,%r0 # Closure ++ la %r3,8(%r1) # GPRs ++ la %r4,64(%r1) # FPRs ++ la %r5,96(%r1) # Overflow ++ st %r1,0(%r15) # Set up back chain ++ ++ bas %r14,0(%r12,%r13) # Call helper ++ ++ l %r4,96+56(%r15) ++ ld %f0,96+64(%r15) # Load return registers ++ lm %r2,%r3,96+8(%r15) ++ lm %r12,%r15,96+48(%r15) ++ br %r4 ++ ++ .align 4 ++.Lchelper: ++ .long ffi_closure_helper_SYSV-.Lcbase ++ ++.LFE2: ++ ++.ffi_closure_SYSV_end: ++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV ++ ++ ++ .section .eh_frame,"a",@progbits ++.Lframe1: ++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry ++.LSCIE1: ++ .4byte 0x0 # CIE Identifier Tag ++ .byte 0x1 # CIE Version ++ .ascii "zR\0" # CIE Augmentation ++ .uleb128 0x1 # CIE Code Alignment Factor ++ .sleb128 -4 # CIE Data Alignment Factor ++ .byte 0xe # CIE RA Column ++ .uleb128 0x1 # Augmentation size ++ .byte 0x1b # FDE Encoding (pcrel sdata4) ++ .byte 0xc # DW_CFA_def_cfa ++ .uleb128 0xf ++ .uleb128 0x60 ++ .align 4 ++.LECIE1: ++.LSFDE1: ++ .4byte .LEFDE1-.LASFDE1 # FDE Length ++.LASFDE1: ++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset ++ .4byte .LFB1-. # FDE initial location ++ .4byte .LFE1-.LFB1 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI0-.LFB1 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x9 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0xa ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0xb ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0xc ++ .byte 0x8b # DW_CFA_offset, column 0xb ++ .uleb128 0xd ++ .byte 0x8a # DW_CFA_offset, column 0xa ++ .uleb128 0xe ++ .byte 0x89 # DW_CFA_offset, column 0x9 ++ .uleb128 0xf ++ .byte 0x88 # DW_CFA_offset, column 0x8 ++ .uleb128 0x10 ++ .byte 0x87 # DW_CFA_offset, column 0x7 ++ .uleb128 0x11 ++ .byte 0x86 # DW_CFA_offset, column 0x6 ++ .uleb128 0x12 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI1-.LCFI0 ++ .byte 0xd # DW_CFA_def_cfa_register ++ .uleb128 0xb ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI2-.LCFI1 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x90 ++ .align 4 ++.LEFDE1: ++.LSFDE2: ++ .4byte .LEFDE2-.LASFDE2 # FDE Length ++.LASFDE2: ++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset ++ .4byte .LFB2-. # FDE initial location ++ .4byte .LFE2-.LFB2 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI10-.LFB2 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x9 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0xa ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0xb ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0xc ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI11-.LCFI10 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0xc0 ++ .align 4 ++.LEFDE2: ++ ++#else ++ ++.text ++ ++ # r2: cif->bytes ++ # r3: &ecif ++ # r4: ffi_prep_args ++ # r5: ret_type ++ # r6: ecif.rvalue ++ # ov: fn ++ ++ # This assumes we are using gas. ++ .globl ffi_call_SYSV ++ .type ffi_call_SYSV,%function ++ffi_call_SYSV: ++.LFB1: ++ stmg %r6,%r15,48(%r15) # Save registers ++.LCFI0: ++ larl %r13,.Lbase # Set up base register ++ lgr %r11,%r15 # Set up frame pointer ++.LCFI1: ++ sgr %r15,%r2 ++ aghi %r15,-160-80 # Allocate stack ++ lgr %r8,%r6 # Save ecif.rvalue ++ llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address ++ lg %r7,160(%r11) # Load function address ++ stg %r11,0(%r15) # Set up back chain ++ aghi %r11,-80 # Register save area ++.LCFI2: ++ ++ la %r2,160(%r15) # Save area ++ # r3 already holds &ecif ++ basr %r14,%r4 # Call ffi_prep_args ++ ++ lmg %r2,%r6,0(%r11) # Load arguments ++ ld %f0,48(%r11) ++ ld %f2,56(%r11) ++ ld %f4,64(%r11) ++ ld %f6,72(%r11) ++ la %r14,0(%r13,%r9) # Set return address ++ br %r7 # ... and call function ++ ++.Lbase: ++.LretNone: # Return void ++ lg %r4,80+112(%r11) ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretFloat: ++ lg %r4,80+112(%r11) ++ ste %f0,0(%r8) # Return float ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretDouble: ++ lg %r4,80+112(%r11) ++ std %f0,0(%r8) # Return double ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretInt32: ++ lg %r4,80+112(%r11) ++ st %r2,0(%r8) # Return int ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretInt64: ++ lg %r4,80+112(%r11) ++ stg %r2,0(%r8) # Return long ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.Ltable: ++ .byte .LretNone-.Lbase # FFI390_RET_VOID ++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT ++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT ++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE ++ .byte .LretInt32-.Lbase # FFI390_RET_INT32 ++ .byte .LretInt64-.Lbase # FFI390_RET_INT64 ++ ++.LFE1: ++.ffi_call_SYSV_end: ++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV ++ ++ ++ .globl ffi_closure_SYSV ++ .type ffi_closure_SYSV,%function ++ffi_closure_SYSV: ++.LFB2: ++ stmg %r14,%r15,112(%r15) # Save registers ++.LCFI10: ++ stmg %r2,%r6,16(%r15) # Save arguments ++ std %f0,128(%r15) ++ std %f2,136(%r15) ++ std %f4,144(%r15) ++ std %f6,152(%r15) ++ lgr %r1,%r15 # Set up stack frame ++ aghi %r15,-160 ++.LCFI11: ++ lgr %r2,%r0 # Closure ++ la %r3,16(%r1) # GPRs ++ la %r4,128(%r1) # FPRs ++ la %r5,160(%r1) # Overflow ++ stg %r1,0(%r15) # Set up back chain ++ ++ brasl %r14,ffi_closure_helper_SYSV # Call helper ++ ++ lg %r14,160+112(%r15) ++ ld %f0,160+128(%r15) # Load return registers ++ lg %r2,160+16(%r15) ++ la %r15,160(%r15) ++ br %r14 ++.LFE2: ++ ++.ffi_closure_SYSV_end: ++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV ++ ++ ++ ++ .section .eh_frame,"a",@progbits ++.Lframe1: ++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry ++.LSCIE1: ++ .4byte 0x0 # CIE Identifier Tag ++ .byte 0x1 # CIE Version ++ .ascii "zR\0" # CIE Augmentation ++ .uleb128 0x1 # CIE Code Alignment Factor ++ .sleb128 -8 # CIE Data Alignment Factor ++ .byte 0xe # CIE RA Column ++ .uleb128 0x1 # Augmentation size ++ .byte 0x1b # FDE Encoding (pcrel sdata4) ++ .byte 0xc # DW_CFA_def_cfa ++ .uleb128 0xf ++ .uleb128 0xa0 ++ .align 8 ++.LECIE1: ++.LSFDE1: ++ .4byte .LEFDE1-.LASFDE1 # FDE Length ++.LASFDE1: ++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset ++ .4byte .LFB1-. # FDE initial location ++ .4byte .LFE1-.LFB1 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI0-.LFB1 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x5 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0x6 ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0x7 ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0x8 ++ .byte 0x8b # DW_CFA_offset, column 0xb ++ .uleb128 0x9 ++ .byte 0x8a # DW_CFA_offset, column 0xa ++ .uleb128 0xa ++ .byte 0x89 # DW_CFA_offset, column 0x9 ++ .uleb128 0xb ++ .byte 0x88 # DW_CFA_offset, column 0x8 ++ .uleb128 0xc ++ .byte 0x87 # DW_CFA_offset, column 0x7 ++ .uleb128 0xd ++ .byte 0x86 # DW_CFA_offset, column 0x6 ++ .uleb128 0xe ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI1-.LCFI0 ++ .byte 0xd # DW_CFA_def_cfa_register ++ .uleb128 0xb ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI2-.LCFI1 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0xf0 ++ .align 8 ++.LEFDE1: ++.LSFDE2: ++ .4byte .LEFDE2-.LASFDE2 # FDE Length ++.LASFDE2: ++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset ++ .4byte .LFB2-. # FDE initial location ++ .4byte .LFE2-.LFB2 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI10-.LFB2 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x5 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0x6 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI11-.LCFI10 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x140 ++ .align 8 ++.LEFDE2: ++ ++#endif ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c +--- gcc-3.2.2.orig/libffi/src/sh/ffi.c Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/sh/ffi.c Fri Jul 19 10:08:43 2002 +@@ -0,0 +1,722 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2002 Kaz Kojima ++ ++ SuperH Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++#define NGREGARG 4 ++#if defined(__SH4__) ++#define NFREGARG 8 ++#endif ++ ++#if defined(__HITACHI__) ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 ++#else ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 ++#endif ++ ++/* If the structure has essentialy an unique element, return its type. */ ++static int ++simple_type (ffi_type *arg) ++{ ++ if (arg->type != FFI_TYPE_STRUCT) ++ return arg->type; ++ else if (arg->elements[1]) ++ return FFI_TYPE_STRUCT; ++ ++ return simple_type (arg->elements[0]); ++} ++ ++static int ++return_type (ffi_type *arg) ++{ ++ unsigned short type; ++ ++ if (arg->type != FFI_TYPE_STRUCT) ++ return arg->type; ++ ++ type = simple_type (arg->elements[0]); ++ if (! arg->elements[1]) ++ { ++ switch (type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ return FFI_TYPE_INT; ++ ++ default: ++ return type; ++ } ++ } ++ ++ /* gcc uses r0/r1 pair for some kind of structures. */ ++ if (arg->size <= 2 * sizeof (int)) ++ { ++ int i = 0; ++ ffi_type *e; ++ ++ while ((e = arg->elements[i++])) ++ { ++ type = simple_type (e); ++ switch (type) ++ { ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_FLOAT: ++ return FFI_TYPE_UINT64; ++ ++ default: ++ break; ++ } ++ } ++ } ++ ++ return FFI_TYPE_STRUCT; ++} ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++/*@-exportheader@*/ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++/*@=exportheader@*/ ++{ ++ register unsigned int i; ++ register int tmp; ++ register unsigned int avn; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ int greg, ireg; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ++ tmp = 0; ++ argp = stack; ++ ++ if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; ++ } ++ else ++ ireg = 0; ++ ++ /* Set arguments for registers. */ ++ greg = ireg; ++ avn = ecif->cif->nargs; ++ p_argv = ecif->avalue; ++ ++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ argp += z; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ >= NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ } ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ argp += z; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++#if defined(__SH4__) ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++#else ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++#endif ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++ } ++ ++ /* Set arguments on stack. */ ++ greg = ireg; ++#if defined(__SH4__) ++ freg = 0; ++#endif ++ p_argv = ecif->avalue; ++ ++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ argp += z; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ < NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ } ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ argp += z; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 < NFREGARG) ++ { ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ continue; ++ } ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 < NGREGARG) ++ { ++ greg += n; ++ continue; ++ } ++#if (! defined(__SH4__)) ++ else if (greg < NGREGARG) ++ { ++ greg = NGREGARG; ++ continue; ++ } ++#endif ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ int i, j; ++ int size, type; ++ int n, m; ++ int greg; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ++ cif->flags = 0; ++ ++ greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && ++ STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; ++ ++#if defined(__SH4__) ++ for (i = j = 0; i < cif->nargs && j < 12; i++) ++ { ++ type = (cif->arg_types)[i]->type; ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ if (freg >= NFREGARG) ++ continue; ++ freg++; ++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j); ++ j++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ if ((freg + 1) >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j); ++ j++; ++ break; ++ ++ default: ++ size = (cif->arg_types)[i]->size; ++ n = (size + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++ for (m = 0; m < n; m++) ++ cif->flags += FFI_TYPE_INT << (2 * j++); ++ break; ++ } ++ } ++#else ++ for (i = j = 0; i < cif->nargs && j < 4; i++) ++ { ++ size = (cif->arg_types)[i]->size; ++ n = (size + sizeof (int) - 1) / sizeof (int); ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++ for (m = 0; m < n; m++) ++ cif->flags += FFI_TYPE_INT << (2 * j++); ++ } ++#endif ++ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_STRUCT: ++ cif->flags += (unsigned) (return_type (cif->rtype)) << 24; ++ break; ++ ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ cif->flags += (unsigned) cif->rtype->type << 24; ++ break; ++ ++ default: ++ cif->flags += FFI_TYPE_INT << 24; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), ++ /*@out@*/ extended_cif *, ++ unsigned, unsigned, ++ /*@out@*/ unsigned *, ++ void (*fn)()); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ffi_call(/*@dependent@*/ ffi_cif *cif, ++ void (*fn)(), ++ /*@out@*/ void *rvalue, ++ /*@dependent@*/ void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ /*@-usedef@*/ ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++extern void ffi_closure_SYSV (void); ++#if defined(__SH4__) ++extern void __ic_invalidate (void *line); ++#endif ++ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data) ++{ ++ unsigned int *tramp; ++ ++ FFI_ASSERT (cif->abi == FFI_GCC_SYSV); ++ ++ tramp = (unsigned int *) &closure->tramp[0]; ++#ifdef __LITTLE_ENDIAN__ ++ tramp[0] = 0xd301d202; ++ tramp[1] = 0x0009422b; ++#else ++ tramp[0] = 0xd202d301; ++ tramp[1] = 0x422b0009; ++#endif ++ *(void **) &tramp[2] = (void *)closure; /* ctx */ ++ *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++#if defined(__SH4__) ++ /* Flush the icache. */ ++ __ic_invalidate(&closure->tramp[0]); ++#endif ++ ++ return FFI_OK; ++} ++ ++/* Basically the trampoline invokes ffi_closure_SYSV, and on ++ * entry, r3 holds the address of the closure. ++ * After storing the registers that could possibly contain ++ * parameters to be passed into the stack frame and setting ++ * up space for a return value, ffi_closure_SYSV invokes the ++ * following helper function to do most of the work. ++ */ ++ ++#ifdef __LITTLE_ENDIAN__ ++#define OFS_INT8 0 ++#define OFS_INT16 2 ++#else ++#define OFS_INT8 3 ++#define OFS_INT16 2 ++#endif ++ ++int ++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, ++ unsigned long *pgr, unsigned long *pfr, ++ unsigned long *pst) ++{ ++ void **avalue; ++ ffi_type **p_arg; ++ int i, avn; ++ int ireg, greg = 0; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ffi_cif *cif; ++ double temp; ++ ++ cif = closure->cif; ++ avalue = alloca(cif->nargs * sizeof(void *)); ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++ { ++ rvalue = *pgr++; ++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; ++ } ++ else ++ ireg = 0; ++ ++ cif = closure->cif; ++ greg = ireg; ++ avn = cif->nargs; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (((char *)pgr) + OFS_INT8); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (((char *)pgr) + OFS_INT16); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ avalue[i] = pgr; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ pgr++; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ >= NFREGARG) ++ continue; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++#endif ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ avalue[i] = pgr; ++ pgr++; ++ } ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++#if defined(__SH4__) ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++#else ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++#endif ++ avalue[i] = pgr; ++ pgr += n; ++ } ++ } ++ ++ greg = ireg; ++#if defined(__SH4__) ++ freg = 0; ++#endif ++ ++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (((char *)pst) + OFS_INT8); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (((char *)pst) + OFS_INT16); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ avalue[i] = pst; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ pst++; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ < NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ } ++ avalue[i] = pst; ++ pst++; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 < NFREGARG) ++ { ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ continue; ++ } ++ avalue[i] = pst; ++ pst += 2; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 < NGREGARG) ++ { ++ greg += n; ++ continue; ++ } ++#if (! defined(__SH4__)) ++ else if (greg < NGREGARG) ++ { ++ greg = NGREGARG; ++ continue; ++ } ++#endif ++ avalue[i] = pst; ++ pst += n; ++ } ++ } ++ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_osf how to perform return type promotions. */ ++ return cif->rtype->type; ++} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S +--- gcc-3.2.2.orig/libffi/src/sh/sysv.S Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/sh/sysv.S Tue Dec 17 03:22:48 2002 +@@ -0,0 +1,773 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2002 Kaz Kojima ++ ++ SuperH Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include ++#ifdef HAVE_MACHINE_ASM_H ++#include ++#else ++/* XXX these lose for some platforms, I'm sure. */ ++#define CNAME(x) x ++#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): ++#endif ++ ++#if defined(__HITACHI__) ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 ++#else ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 ++#endif ++ ++.text ++ ++ # r4: ffi_prep_args ++ # r5: &ecif ++ # r6: bytes ++ # r7: flags ++ # sp+0: rvalue ++ # sp+4: fn ++ ++ # This assumes we are using gas. ++ENTRY(ffi_call_SYSV) ++ # Save registers ++.LFB1: ++ mov.l r8,@-r15 ++.LCFI0: ++ mov.l r9,@-r15 ++.LCFI1: ++ mov.l r10,@-r15 ++.LCFI2: ++ mov.l r12,@-r15 ++.LCFI3: ++ mov.l r14,@-r15 ++.LCFI4: ++ sts.l pr,@-r15 ++.LCFI5: ++ mov r15,r14 ++.LCFI6: ++#if defined(__SH4__) ++ mov r6,r8 ++ mov r7,r9 ++ ++ sub r6,r15 ++ add #-16,r15 ++ mov #~7,r0 ++ and r0,r15 ++ ++ mov r4,r0 ++ jsr @r0 ++ mov r15,r4 ++ ++ mov r9,r1 ++ shlr8 r9 ++ shlr8 r9 ++ shlr8 r9 ++ ++ mov #FFI_TYPE_STRUCT,r2 ++ cmp/eq r2,r9 ++ bf 1f ++#if STRUCT_VALUE_ADDRESS_WITH_ARG ++ mov.l @r15+,r4 ++ bra 2f ++ mov #5,r2 ++#else ++ mov.l @r15+,r10 ++#endif ++1: ++ mov #4,r2 ++2: ++ mov #4,r3 ++ ++L_pass: ++ cmp/pl r8 ++ bf L_call_it ++ ++ mov r1,r0 ++ and #3,r0 ++ ++L_pass_d: ++ cmp/eq #FFI_TYPE_DOUBLE,r0 ++ bf L_pass_f ++ ++ mov r3,r0 ++ and #1,r0 ++ tst r0,r0 ++ bt 1f ++ add #1,r3 ++1: ++ mov r15,r0 ++ and #7,r0 ++ tst r0,r0 ++ bt 2f ++ add #4,r15 ++2: ++ mov #12,r0 ++ cmp/hs r0,r3 ++ bt/s 3f ++ shlr2 r1 ++ bsr L_pop_d ++ nop ++3: ++ add #2,r3 ++ bra L_pass ++ add #-8,r8 ++ ++L_pop_d: ++ mov r3,r0 ++ add r0,r0 ++ add r3,r0 ++ add #-12,r0 ++ braf r0 ++ nop ++#ifdef __LITTLE_ENDIAN__ ++ fmov.s @r15+,fr5 ++ rts ++ fmov.s @r15+,fr4 ++ fmov.s @r15+,fr7 ++ rts ++ fmov.s @r15+,fr6 ++ fmov.s @r15+,fr9 ++ rts ++ fmov.s @r15+,fr8 ++ fmov.s @r15+,fr11 ++ rts ++ fmov.s @r15+,fr10 ++#else ++ fmov.s @r15+,fr4 ++ rts ++ fmov.s @r15+,fr5 ++ fmov.s @r15+,fr6 ++ rts ++ fmov.s @r15+,fr7 ++ fmov.s @r15+,fr8 ++ rts ++ fmov.s @r15+,fr9 ++ fmov.s @r15+,fr10 ++ rts ++ fmov.s @r15+,fr11 ++#endif ++ ++L_pass_f: ++ cmp/eq #FFI_TYPE_FLOAT,r0 ++ bf L_pass_i ++ ++ mov #