Hi, 2010/1/6 Nobuhiro Iwamatsu <iwama...@nigauri.org>: > Hi, > > Sorry, I was late in checking your email. > > 2010/1/6 Arthur Loiret <aloi...@debian.org>: >>> Triplet of m4-nofpu is sh4_nofpu-linux-gnu. >>> What should I set in src/gcc/multiarch.h? >> >> Something like: >> >> # if defined(__sh4-linux-gnu__) >> { "m4", "sh4-linux-gnu" }, >> { "m4-nofpu", "sh4_nofpu-linux-gnu" }, >> # endif >> > > Thank you! > >> And then, if it builds, can you paste the include paths and library >> paths for both m4/m4-nofpu obtained from gcc -v? >> > OK, I started build. > If a package is done, I contact it.
Build fine with your patch. Thanks. I paste output of cpp -v . m4: iwama...@gcc-4.4-4.4.2-8+sh4.1$ cpp -E -v -m4 Using built-in specs. Target: sh4-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.2-8+sh4.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-multilib-list=m4,m4-nofpu --with-cpu=sh4 --enable-checking=release --build=sh4-linux-gnu --host=sh4-linux-gnu --target=sh4-linux-gnu Thread model: posix gcc version 4.4.2 (Debian 4.4.2-8+sh4.1) COLLECT_GCC_OPTIONS='-E' '-v' '-m4' /usr/lib/gcc/sh4-linux-gnu/4.4.2/cc1 -E -quiet -v - -m4 ignoring nonexistent directory "/usr/local/include/sh4-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/sh4-linux-gnu/4.4.2/../../../../sh4-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/local/include /usr/lib/gcc/sh4-linux-gnu/4.4.2/include /usr/lib/gcc/sh4-linux-gnu/4.4.2/include-fixed /usr/include/sh4-linux-gnu /usr/include End of search list. m4-nofpu: iwama...@gcc-4.4-4.4.2-8+sh4.1$ cpp -E -v -m4-nofpu Using built-in specs. Target: sh4-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.2-8+sh4.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-multilib-list=m4,m4-nofpu --with-cpu=sh4 --enable-checking=release --build=sh4-linux-gnu --host=sh4-linux-gnu --target=sh4-linux-gnu Thread model: posix gcc version 4.4.2 (Debian 4.4.2-8+sh4.1) COLLECT_GCC_OPTIONS='-E' '-v' '-m4-nofpu' /usr/lib/gcc/sh4-linux-gnu/4.4.2/cc1 -E -quiet -v -imultilib m4-nofpu - -m4-nofpu ignoring nonexistent directory "/usr/local/include/sh4_nofpu-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/sh4-linux-gnu/4.4.2/../../../../sh4-linux-gnu/include" ignoring nonexistent directory "/usr/include/sh4_nofpu-linux-gnu" #include "..." search starts here: #include <...> search starts here: /usr/local/include /usr/lib/gcc/sh4-linux-gnu/4.4.2/include /usr/lib/gcc/sh4-linux-gnu/4.4.2/include-fixed /usr/include End of search list. I attached my patch. Best regards, Nobuhiro -- Nobuhiro Iwamatsu iwamatsu at {nigauri.org / debian.org} GPG ID: 40AD1FA6
# DP: Add multiarch support to GCC. # DP: # DP: Convert the multilib option to a target triplet, # DP: add multiarch include directories and libraries path: # DP: /usr/local/include/<arch>-linux-gnu # DP: /usr/include/<arch>-linux-gnu # DP: /usr/lib/<arch>-linux-gnu # DP: to the system paths. 2009-03-24 Arthur Loiret <aloi...@debian.org> * configure.ac: Handle --enable-multiarch and --with-multiarch-defaults. * config.gcc: Define MULTIARCH_DEFAULTS if multiarch is enabled. * config.in [!USED_FOR_TARGET]: Undef ENABLE_MULTIARCH. * gcc.c: include multiarch.h. (set_multiarch_dir): New function. Adds the multiarch directories to the library path. [ENABLE_MULTIARCH]: Use it. * cppdefault.c [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an include directory for multiarch directories. * incpath.c: include multiarch.h [ENABLE_MULTIARCH]: Add the multiarch directory to include directories. * Makefile.in (MULTIARCH_H): New. Use it for incpath.o and gcc.o. * multiarch.h: New file. --- gcc/Makefile.in | 7 ++-- gcc/config.gcc | 9 +++++ gcc/config.in | 4 ++ gcc/configure.ac | 13 ++++++++ gcc/cppdefault.c | 6 +++ gcc/gcc.c | 41 ++++++++++++++++++++++++ gcc/incpath.c | 28 ++++++++++++++++ gcc/multiarch.h | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 196 insertions(+), 3 deletions(-) --- a/src/gcc/Makefile.in +++ b/src/gcc/Makefile.in @@ -880,6 +880,7 @@ EBIMAP_H = ebitmap.h sbitmap.h IPA_PROP_H = ipa-prop.h $(TREE_H) vec.h $(CGRAPH_H) GSTAB_H = gstab.h stab.def BITMAP_H = bitmap.h $(HASHTAB_H) statistics.h +MULTIARCH_H = multiarch.h # # Now figure out from those variables how to compile and link. @@ -1815,8 +1816,8 @@ gcc.srcextra: gengtype-lex.c -cp -p $^ $(srcdir) incpath.o: incpath.c incpath.h $(CONFIG_H) $(SYSTEM_H) $(CPPLIB_H) \ - intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) \ - $(MACHMODE_H) + intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(MULTIARCH_H) \ + $(TARGET_H) $(MACHMODE_H) c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ $(RTL_H) $(C_TREE_H) $(GGC_H) $(TARGET_H) $(FLAGS_H) $(FUNCTION_H) output.h \ @@ -1957,7 +1958,7 @@ DRIVER_DEFINES = \ gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \ Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \ - configargs.h $(OBSTACK_H) opts.h + configargs.h $(OBSTACK_H) opts.h $(MULTIARCH_H) (SHLIB_LINK='$(SHLIB_LINK)'; \ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ $(DRIVER_DEFINES) \ --- a/src/gcc/config.gcc +++ b/src/gcc/config.gcc @@ -3173,3 +3173,12 @@ then target_cpu_default=$target_cpu_default2 fi fi + +if test x${enable_multiarch} = xyes; then + multiarch_defaults=`echo ${target_noncanonical} | sed -e 's/unknown-//'` + multiarch_define="__`echo ${multiarch_defaults} | tr '-' '_'`__" + if test x${with_multiarch_defaults} != x; then + multiarch_defaults=${with_multiarch_defaults} + fi + tm_defines="${tm_defines} ${multiarch_define}=1 MULTIARCH_DEFAULTS=\\\"${multiarch_defaults}\\\"" +fi --- a/src/gcc/config.in +++ b/src/gcc/config.in @@ -155,6 +155,10 @@ #undef ENABLE_WIN32_REGISTRY #endif +/* Define if you want to use multiarch. */ +#ifndef USED_FOR_TARGET +#undef ENABLE_MULTIARCH +#endif /* Define to the name of a file containing a list of extra machine modes for this architecture. */ --- a/src/gcc/configure.ac +++ b/src/gcc/configure.ac @@ -585,6 +585,19 @@ AC_ARG_ENABLE(multilib, [], [enable_multilib=yes]) AC_SUBST(enable_multilib) +# Determine whether or not multiarch is enabled. +AC_ARG_ENABLE(multiarch, +[ --enable-multiarch enable multiarch support], +[ + enable_multiarch=yes + AC_DEFINE(ENABLE_MULTIARCH, 1, + [Define if you want to use multiarch.]) +],[]) +AC_SUBST(enable_multiarch) + +AC_ARG_WITH(multiarch-defaults, +[ --with-multiarch-defaults set the default multiarch directory.],) + # Enable __cxa_atexit for C++. AC_ARG_ENABLE(__cxa_atexit, [ --enable-__cxa_atexit enable __cxa_atexit for C++], --- a/src/gcc/cppdefault.c +++ b/src/gcc/cppdefault.c @@ -60,6 +60,9 @@ const struct default_include cpp_include_defaults[] #endif #ifdef LOCAL_INCLUDE_DIR /* /usr/local/include comes before the fixincluded header files. */ +# ifdef ENABLE_MULTIARCH + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, +# endif { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, #endif #ifdef PREFIX_INCLUDE_DIR @@ -95,6 +98,9 @@ const struct default_include cpp_include_defaults[] #endif #ifdef STANDARD_INCLUDE_DIR /* /usr/include comes dead last. */ +# ifdef ENABLE_MULTIARCH + { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 2 }, +# endif { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 0 }, #endif { 0, 0, 0, 0, 0, 0 } --- a/src/gcc/gcc.c +++ b/src/gcc/gcc.c @@ -71,6 +71,7 @@ compilation is specified by a string called a "spec". */ #include "system.h" #include "coretypes.h" #include "multilib.h" /* before tm.h */ +#include "multiarch.h" #include "tm.h" #include <signal.h> #if ! defined( SIGCHLD ) && defined( SIGCLD ) @@ -345,6 +346,9 @@ static void give_switch (int, int); static int used_arg (const char *, int); static int default_arg (const char *, int); static void set_multilib_dir (void); +#ifdef ENABLE_MULTIARCH +static void set_multiarch_dir (void); +#endif static void print_multilib_info (void); static void perror_with_name (const char *); static void fatal_ice (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; @@ -6504,6 +6508,11 @@ main (int argc, char **argv) the subdirectory based on the options. */ set_multilib_dir (); +#ifdef ENABLE_MULTIARCH + /* Add the multiarch directories to libraries path. */ + set_multiarch_dir (); +#endif + /* Warn about any switches that no pass was interested in. */ for (i = 0; (int) i < n_switches; i++) @@ -7576,6 +7585,39 @@ set_multilib_dir (void) multilib_os_dir = multilib_dir; } +#ifdef ENABLE_MULTIARCH +/* Add the multiarch directories to libraries path. This uses the converted + multiarch triplet from the multilib value. + For example, if the target supports -m32/-m64 as multilib option and + defaults to 64, it will add /usr/lib/$triplet_target64/lib to library + path if either -m64 or no multilib option at all is set. And it will + add /usr/lib/$triplet_target32 if -m32 is set. Triplets are defined in + multiarch.def. */ + +static void +set_multiarch_dir (void) +{ + const char *multiarch, *path; + + multiarch = multilib_to_multiarch (multilib_dir); + if (multiarch == NULL) + { + fatal_ice ("\ +Internal error: no multiarch mapping for multilib (%s)\n\ +Please submit a full bug report.\n\ +See %s for instructions.", + multilib_dir ? multilib_dir : multilib_defaults, bug_report_url); + } + else if (multiarch) + { + path = concat (STANDARD_STARTFILE_PREFIX_2, multiarch, + dir_separator_str, NULL); + add_prefix (&startfile_prefixes, path, NULL, + PREFIX_PRIORITY_LAST, 0, 1); + } +} +#endif + /* Print out the multiple library subdirectory selection information. This prints out a series of lines. Each line looks like SUBDIRECTORY;@opt...@option, with as many options as is --- a/src/gcc/incpath.c +++ b/src/gcc/incpath.c @@ -30,6 +30,7 @@ #include "intl.h" #include "incpath.h" #include "cppdefault.h" +#include "multiarch.h" /* Microsoft Windows does not natively support inodes. VMS has non-numeric inodes. */ @@ -132,6 +133,9 @@ add_standard_paths (const char *sysroot, const char *iprefix, const struct default_include *p; int relocated = cpp_relocated(); size_t len; +#ifdef ENABLE_MULTIARCH + const char *multiarch; +#endif if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) { @@ -150,8 +154,20 @@ add_standard_paths (const char *sysroot, const char *iprefix, if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) { char *str = concat (iprefix, p->fname + len, NULL); +#ifdef ENABLE_MULTIARCH + if (p->multilib == 1 && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); + else if (p->multilib == 2) + { + multiarch = multilib_to_multiarch (imultilib); + if (!multiarch) + continue; + str = concat (str, dir_separator_str, multiarch, NULL); + } +#else if (p->multilib && imultilib) str = concat (str, dir_separator_str, imultilib, NULL); +#endif add_path (str, SYSTEM, p->cxx_aware, false); } } @@ -195,8 +211,20 @@ add_standard_paths (const char *sysroot, const char *iprefix, else str = update_path (p->fname, p->component); +#ifdef ENABLE_MULTIARCH + if (p->multilib == 1 && imultilib) + str = concat (str, dir_separator_str, imultilib, NULL); + else if (p->multilib == 2) + { + multiarch = multilib_to_multiarch (imultilib); + if (!multiarch) + continue; + str = concat (str, dir_separator_str, multiarch, NULL); + } +#else if (p->multilib && imultilib) str = concat (str, dir_separator_str, imultilib, NULL); +#endif add_path (str, SYSTEM, p->cxx_aware, false); } --- /dev/null +++ b/src/gcc/multiarch.h @@ -0,0 +1,95 @@ +/* Header for multiarch handling (include directories, libraries path). + Copyright (C) 2009 Free Software Foundation, Inc. + Contributed by Arthur Loiret <aloi...@debian.org> + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_MULTIARCH_H +#define GCC_MULTIARCH_H + +#include "tm.h" + +struct multiarch_mapping +{ + const char *const multilib; + const char *const multiarch; +}; + +const struct multiarch_mapping multiarch_mappings[] = { +#ifdef ENABLE_MULTIARCH + { "", MULTIARCH_DEFAULTS }, +# if defined(__x86_64_linux_gnu__) + { "32", "i486-linux-gnu" }, +# endif +# if defined(__i486_linux_gnu__) + { "64", "x86_64-linux-gnu" }, +# endif +# if defined(__powerpc64_linux_gnu__) + { "32", "powerpc-linux-gnu" }, +# endif +# if defined(__powerpc_linux_gnu__) + { "64", "powerpc64-linux-gnu" }, +# endif +# if defined(__sparc64_linux_gnu__) + { "32", "sparc-linux-gnu" }, +# endif +# if defined(__sparc_linux_gnu__) + { "64", "sparc64-linux-gnu" }, +# endif +# if defined(__s390x_linux_gnu__) + { "31", "s390-linux-gnu" }, +# endif +# if defined(__s390_linux_gnu__) + { "64", "s390x-linux-gnu" }, +# endif +# if defined(__mips_linux_gnu__) + { "n32", "mips64-linux-gnuabin32" }, + { "64", "mips64-linux-gnuabi64" }, +# endif +# if defined(__mipsel_linux_gnu__) + { "n32", "mips64el-linux-gnuabin32" }, + { "64", "mips64el-linux-gnuabi64" }, +# endif +# if defined(__x86_64_kfreebsd_gnu__) + { "32", "i486-kfreebsd-gnu" }, +# endif +# if defined(__sh4_linux_gnu__) + { "m4", "sh4-linux-gnu" }, + { "m4-nofpu", "sh4_nofpu-linux-gnu" }, +# endif +#endif /* ENABLE_MULTIARCH */ + { 0, 0 } +}; + +/* Convert the multilib option to the corresponding target triplet. + See multiarch.def and config.gcc for multilib/multiarch pairs. + When the default multilib is used, the corresponding multilib/multiarch + pair is { "", $target_tripplet }. */ +static inline const char* +multilib_to_multiarch (const char *imultilib) +{ + const struct multiarch_mapping *p; + + for (p = multiarch_mappings; p->multiarch; p++) + { + if (!strcmp(p->multilib, imultilib ? imultilib : "")) + return p->multiarch; + } + return NULL; +} + +#endif /* GCC_MULTIARCH_H */