From d804bfecdbbb57cd20f80c71bc567c7b02666bf9 Mon Sep 17 00:00:00 2001 From: Matthias Klose Date: Mon, 14 Jan 2013 16:35:23 +0000 Subject: [PATCH] invoke.texi: Document -print-multiarch. 2013-01-14 Matthias Klose * doc/invoke.texi: Document -print-multiarch. * doc/install.texi: Document --enable-multiarch. * doc/fragments.texi: Document MULTILIB_OSDIRNAMES, MULTIARCH_DIRNAME. * configure.ac: Add --enable-multiarch option. Substitute with_cpu, with_float. * configure: Regenerate. * Makefile.in (s-mlib): Pass MULTIARCH_DIRNAME to genmultilib. enable_multiarch, with_cpu, with_float: New macros. if_multiarch: New macro, define in terms of enable_multiarch. * genmultilib: Add new argument for the multiarch name. * gcc.c (multiarch_dir): Define. (for_each_path): Search for multiarch suffixes. (driver_handle_option): Handle multiarch option. (do_spec_1): Pass -imultiarch if defined. (main): Print multiarch. (set_multilib_dir): Separate multilib and multiarch names from multilib_select. (print_multilib_info): Ignore multiarch names in multilib_select. * incpath.c (add_standard_paths): Search the multiarch include dirs. * cppdefault.h (default_include): Document multiarch in multilib member. * cppdefault.c: [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an include directory for multiarch directories. * common.opt: New options --print-multiarch and -imultilib. * config.gcc (tmake_file): Include i386/t-gnu. (tmake_file): Include i386/t-kfreebsd. * config/i386/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES, define MULTIARCH_DIRNAME. * config/i386/t-linux: Define MULTIARCH_DIRNAME. * config/i386/t-gnu: New file. * config/i386/t-kfreebsd: Likewise. * config/sparc/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. * config/sparc/t-linux: Define MULTIARCH_DIRNAME. * config/pa/t-linux, config/pa/t-linux64: Define MULTIARCH_DIRNAME. * config/mips/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. * config/arm/t-linux-eabi: Define MULTIARCH_DIRNAME for linux target. * config/rs6000/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. * config/rs6000/t-linux: New file; define MULTIARCH_DIRNAME. * config/rs6000/t-fprules (SOFT_FLOAT_CPUS): New macro. Add e300c2 to the list. (MULTILIB_MATCHES_FLOAT): Define in terms of SOFT_FLOAT_CPUS. * config.gcc (tmake_file): Include rs6000/t-linux for 32bit non-biarch configurations. * config/s390/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. * config/m68k/t-linux: Define MULTIARCH_DIRNAME. * config/ia64/t-linux: New file; define MULTIARCH_DIRNAME. * config.gcc (tmake_file): Include ia64/t-linux. From-SVN: r195154 --- gcc/ChangeLog | 59 ++++++++++++++++++++++++++ gcc/Makefile.in | 20 ++++++++- gcc/common.opt | 10 +++++ gcc/config.gcc | 13 ++++-- gcc/config/alpha/t-linux | 1 + gcc/config/arm/t-linux-eabi | 7 +++- gcc/config/i386/t-gnu | 1 + gcc/config/i386/t-kfreebsd | 5 +++ gcc/config/i386/t-linux | 4 ++ gcc/config/i386/t-linux64 | 3 +- gcc/config/ia64/t-glibc | 2 + gcc/config/m68k/t-linux | 4 ++ gcc/config/mips/t-linux64 | 9 +++- gcc/config/pa/t-linux | 2 + gcc/config/pa/t-linux64 | 4 +- gcc/config/rs6000/t-fprules | 15 ++----- gcc/config/rs6000/t-linux | 9 ++++ gcc/config/rs6000/t-linux64 | 4 +- gcc/config/s390/t-linux64 | 3 +- gcc/config/sparc/t-linux | 2 + gcc/config/sparc/t-linux64 | 5 ++- gcc/configure | 36 +++++++++++++++- gcc/configure.ac | 22 ++++++++++ gcc/cppdefault.c | 2 + gcc/cppdefault.h | 10 +++-- gcc/doc/fragments.texi | 62 ++++++++++++++++++++++++++- gcc/doc/install.texi | 8 ++++ gcc/doc/invoke.texi | 5 +++ gcc/gcc.c | 84 +++++++++++++++++++++++++++++++------ gcc/genmultilib | 15 +++++-- gcc/incpath.c | 16 ++++++- 31 files changed, 390 insertions(+), 52 deletions(-) create mode 100644 gcc/config/i386/t-gnu create mode 100644 gcc/config/i386/t-kfreebsd create mode 100644 gcc/config/rs6000/t-linux diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 751685e2315f..b323282bfb88 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,62 @@ +2013-01-14 Matthias Klose + + * doc/invoke.texi: Document -print-multiarch. + * doc/install.texi: Document --enable-multiarch. + * doc/fragments.texi: Document MULTILIB_OSDIRNAMES, MULTIARCH_DIRNAME. + * configure.ac: Add --enable-multiarch option. + Substitute with_cpu, with_float. + * configure: Regenerate. + * Makefile.in (s-mlib): Pass MULTIARCH_DIRNAME to genmultilib. + enable_multiarch, with_cpu, with_float: New macros. + if_multiarch: New macro, define in terms of enable_multiarch. + * genmultilib: Add new argument for the multiarch name. + * gcc.c (multiarch_dir): Define. + (for_each_path): Search for multiarch suffixes. + (driver_handle_option): Handle multiarch option. + (do_spec_1): Pass -imultiarch if defined. + (main): Print multiarch. + (set_multilib_dir): Separate multilib and multiarch names + from multilib_select. + (print_multilib_info): Ignore multiarch names in multilib_select. + * incpath.c (add_standard_paths): Search the multiarch include dirs. + * cppdefault.h (default_include): Document multiarch in multilib + member. + * cppdefault.c: [LOCAL_INCLUDE_DIR, STANDARD_INCLUDE_DIR] Add an + include directory for multiarch directories. + * common.opt: New options --print-multiarch and -imultilib. + + * config.gcc (tmake_file): Include i386/t-gnu. + (tmake_file): + Include i386/t-kfreebsd. + * config/i386/t-linux64: Add multiarch names in + MULTILIB_OSDIRNAMES, define MULTIARCH_DIRNAME. + * config/i386/t-linux: Define MULTIARCH_DIRNAME. + * config/i386/t-gnu: New file. + * config/i386/t-kfreebsd: Likewise. + + * config/sparc/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. + * config/sparc/t-linux: Define MULTIARCH_DIRNAME. + + * config/pa/t-linux, config/pa/t-linux64: Define MULTIARCH_DIRNAME. + + * config/mips/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. + + * config/arm/t-linux-eabi: Define MULTIARCH_DIRNAME for linux target. + + * config/rs6000/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. + * config/rs6000/t-linux: New file; define MULTIARCH_DIRNAME. + * config/rs6000/t-fprules (SOFT_FLOAT_CPUS): New macro. Add e300c2 + to the list. + (MULTILIB_MATCHES_FLOAT): Define in terms of SOFT_FLOAT_CPUS. + * config.gcc (tmake_file): + Include rs6000/t-linux for 32bit non-biarch configurations. + + * config/s390/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. + + * config/m68k/t-linux: Define MULTIARCH_DIRNAME. + + * config/ia64/t-linux: New file; define MULTIARCH_DIRNAME. + * config.gcc (tmake_file): Include ia64/t-linux. 2013-01-14 Eric Botcazou * tree-vectorizer.h (vect_get_single_scalar_iteraion_cost): Fix typo. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 872956d1f67a..94df373727d5 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -3,7 +3,7 @@ # Copyright (C) 1987, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 1996, # 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -# 2008, 2009, 2010 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2012 Free Software Foundation, Inc. #This file is part of GCC. @@ -514,6 +514,21 @@ extra_modes_file=@extra_modes_file@ extra_opt_files=@extra_opt_files@ host_hook_obj=@out_host_hook_obj@ +# Multiarch support +enable_multiarch = @enable_multiarch@ +with_cpu = @with_cpu@ +with_float = @with_float@ +ifeq ($(enable_multiarch),yes) + if_multiarch = $(1) +else + ifeq ($(enable_multiarch),auto) + # SYSTEM_HEADER_DIR is makefile syntax, cannot be evaluated in configure.ac + if_multiarch = $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib/*/crti.o),$(1)) + else + if_multiarch = + endif +endif + # ------------------------ # Installation directories # ------------------------ @@ -1941,10 +1956,11 @@ s-mlib: $(srcdir)/genmultilib Makefile "$(MULTILIB_EXTRA_OPTS)" \ "$(MULTILIB_EXCLUSIONS)" \ "$(MULTILIB_OSDIRNAMES)" \ + "$(MULTIARCH_DIRNAME)" \ "@enable_multilib@" \ > tmp-mlib.h; \ else \ - $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no \ + $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' "$(MULTIARCH_DIRNAME)" no \ > tmp-mlib.h; \ fi $(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h diff --git a/gcc/common.opt b/gcc/common.opt index 605655186e67..75e29de490ce 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -334,6 +334,9 @@ Driver Alias(print-multi-lib) -print-multi-os-directory Driver Alias(print-multi-os-directory) +-print-multiarch +Driver Alias(print-multiarch) + -print-prog-name Driver Separate Alias(print-prog-name=) @@ -2190,6 +2193,10 @@ iplugindir= Common Joined Var(plugindir_string) Init(0) -iplugindir= Set to be the default plugin directory +imultiarch +Common Joined Separate RejectDriver Var(imultiarch) Init(0) +-imultiarch Set to be the multiarch include subdirectory + l Driver Joined Separate @@ -2247,6 +2254,9 @@ Driver Var(print_multi_lib) print-multi-os-directory Driver Var(print_multi_os_directory) + +print-multiarch +Driver Var(print_multiarch) print-prog-name= Driver JoinedOrMissing Var(print_prog_name) diff --git a/gcc/config.gcc b/gcc/config.gcc index ebd39bcc0e97..65a319b47107 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1,6 +1,6 @@ # GCC target-specific configuration file. # Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -# 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. #This file is part of GCC. @@ -2172,6 +2172,7 @@ powerpc-*-linux* | powerpc64-*-linux*) ;; *) tm_file="${tm_file} rs6000/linux.h glibc-stdint.h" + tmake_file="$tmake_file rs6000/t-linux" ;; esac tmake_file="${tmake_file} t-slibgcc-libgcc rs6000/t-fprules-softfp soft-fp/t-softfp" @@ -3659,11 +3660,15 @@ case ${target} in i[34567]86-*-darwin* | x86_64-*-darwin*) tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp" ;; - i[34567]86-*-linux* | x86_64-*-linux* | \ - i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \ - i[34567]86-*-gnu*) + i[34567]86-*-linux* | x86_64-*-linux*) tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux" ;; + i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu) + tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux i386/t-kfreebsd" + ;; + i[34567]86-*-gnu*) + tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux i386/t-gnu" + ;; i[34567]86-*-solaris2*) tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp" ;; diff --git a/gcc/config/alpha/t-linux b/gcc/config/alpha/t-linux index fabf38f9cce0..b96f1dfeb374 100644 --- a/gcc/config/alpha/t-linux +++ b/gcc/config/alpha/t-linux @@ -1 +1,2 @@ +MULTIARCH_DIRNAME = $(call if_multiarch,alpha-linux-gnu) SHLIB_MAPFILES += $(srcdir)/config/alpha/libgcc-alpha-ldbl.ver diff --git a/gcc/config/arm/t-linux-eabi b/gcc/config/arm/t-linux-eabi index a328a0005527..39de9aefe796 100644 --- a/gcc/config/arm/t-linux-eabi +++ b/gcc/config/arm/t-linux-eabi @@ -1,4 +1,4 @@ -# Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc. +# Copyright (C) 2005, 2009, 2010, 2012 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -28,6 +28,11 @@ MULTILIB_DIRNAMES = #MULTILIB_DIRNAMES += fa606te fa626te fmp626 fa726te #MULTILIB_EXCEPTIONS += *mthumb/*mcpu=fa606te *mthumb/*mcpu=fa626te *mthumb/*mcpu=fmp626 *mthumb/*mcpu=fa726te* +ifneq (,$(findstring gnueabi,$(target))) +ARM_EB = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),eb) +MULTIARCH_DIRNAME = $(call if_multiarch,arm$(ARM_EB)-linux-gnueabi$(if $(filter hard,$(with_float)),hf)) +endif + # Use a version of div0 which raises SIGFPE, and a special __clear_cache. LIB1ASMFUNCS := $(filter-out _dvmd_tls,$(LIB1ASMFUNCS)) _dvmd_lnx _clear_cache diff --git a/gcc/config/i386/t-gnu b/gcc/config/i386/t-gnu new file mode 100644 index 000000000000..5f946c71604f --- /dev/null +++ b/gcc/config/i386/t-gnu @@ -0,0 +1 @@ +MULTIARCH_DIRNAME = $(call if_multiarch,i386-gnu) diff --git a/gcc/config/i386/t-kfreebsd b/gcc/config/i386/t-kfreebsd new file mode 100644 index 000000000000..b4310df8afbb --- /dev/null +++ b/gcc/config/i386/t-kfreebsd @@ -0,0 +1,5 @@ +MULTIARCH_DIRNAME = $(call if_multiarch,i386-kfreebsd-gnu) + +# MULTILIB_OSDIRNAMES are set in t-linux64. +KFREEBSD_OS = $(filter kfreebsd%, $(word 3, $(subst -, ,$(target)))) +MULTILIB_OSDIRNAMES := $(subst linux,$(KFREEBSD_OS),$(MULTILIB_OSDIRNAMES)) diff --git a/gcc/config/i386/t-linux b/gcc/config/i386/t-linux index 4c6bb51e3b84..76e3f64f56eb 100644 --- a/gcc/config/i386/t-linux +++ b/gcc/config/i386/t-linux @@ -3,3 +3,7 @@ # t-slibgcc-elf-ver and t-linux SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ $(srcdir)/config/i386/libgcc-glibc.ver + +ifneq (,$(findstring -linux,$(target))) +MULTIARCH_DIRNAME = $(call if_multiarch,i386-linux-gnu) +endif diff --git a/gcc/config/i386/t-linux64 b/gcc/config/i386/t-linux64 index 5d5a476cf5da..057744b4b7a6 100644 --- a/gcc/config/i386/t-linux64 +++ b/gcc/config/i386/t-linux64 @@ -25,7 +25,8 @@ MULTILIB_OPTIONS = m64/m32 MULTILIB_DIRNAMES = 64 32 -MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) +MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:x86_64-linux-gnu) \ + $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu) LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib diff --git a/gcc/config/ia64/t-glibc b/gcc/config/ia64/t-glibc index e6d72b94a871..ddb5fe3c3d01 100644 --- a/gcc/config/ia64/t-glibc +++ b/gcc/config/ia64/t-glibc @@ -3,3 +3,5 @@ LIB2ADDEH = $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c \ $(srcdir)/unwind-compat.c SHLIB_MAPFILES += $(srcdir)/config/ia64/libgcc-glibc.ver + +MULTIARCH_DIRNAME = $(call if_multiarch,ia64-linux-gnu) diff --git a/gcc/config/m68k/t-linux b/gcc/config/m68k/t-linux index 17f0c6f59879..d61f73beaa1e 100644 --- a/gcc/config/m68k/t-linux +++ b/gcc/config/m68k/t-linux @@ -21,6 +21,10 @@ EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o # Only include multilibs for 680x0 CPUs with an MMU. M68K_MLIB_CPU += && (CPU ~ "^m680") && (FLAGS ~ "FL_MMU") +ifeq ($(M68K_ARCH),m68k) +MULTIARCH_DIRNAME = $(call if_multiarch,m68k-linux-gnu) +endif + # This rule uses MULTILIB_MATCHES to generate a definition of # SYSROOT_SUFFIX_SPEC. sysroot-suffix.h: $(srcdir)/config/m68k/print-sysroot-suffix.sh diff --git a/gcc/config/mips/t-linux64 b/gcc/config/mips/t-linux64 index 66ea51a92dc7..7915f4d7dff4 100644 --- a/gcc/config/mips/t-linux64 +++ b/gcc/config/mips/t-linux64 @@ -1,4 +1,4 @@ -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006, 2012 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -18,7 +18,12 @@ MULTILIB_OPTIONS = mabi=n32/mabi=32/mabi=64 MULTILIB_DIRNAMES = n32 32 64 -MULTILIB_OSDIRNAMES = ../lib32 ../lib ../lib64 +MIPS_EL = $(if $(filter %el, $(firstword $(subst -, ,$(target)))),el) +MIPS_SOFT = $(if $(strip $(filter MASK_SOFT_FLOAT_ABI, $(target_cpu_default)) $(filter soft, $(with_float))),soft) +MULTILIB_OSDIRNAMES = \ + ../lib32$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT)) \ + ../lib$(call if_multiarch,:mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT)) \ + ../lib64$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT)) EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o diff --git a/gcc/config/pa/t-linux b/gcc/config/pa/t-linux index fbbcfe29fd77..ba42ad03cac7 100644 --- a/gcc/config/pa/t-linux +++ b/gcc/config/pa/t-linux @@ -35,3 +35,5 @@ fptr.c: $(srcdir)/config/pa/fptr.c # Compile crtbeginS.o and crtendS.o as PIC. CRTSTUFF_T_CFLAGS_S = -fPIC + +MULTIARCH_DIRNAME = $(call if_multiarch,hppa-linux-gnu) diff --git a/gcc/config/pa/t-linux64 b/gcc/config/pa/t-linux64 index 1658f6d8aaeb..cfa73606f8a6 100644 --- a/gcc/config/pa/t-linux64 +++ b/gcc/config/pa/t-linux64 @@ -1,4 +1,4 @@ -# Copyright (C) 2001, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001, 2008, 2012 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -30,3 +30,5 @@ LIB2FUNCS_STATIC_EXTRA = $(srcdir)/config/pa/linux-atomic.c # Compile libgcc2.a as PIC. TARGET_LIBGCC2_CFLAGS = -fPIC -Dpa64=1 -DELF=1 + +MULTIARCH_DIRNAME = $(call if_multiarch,hppa-linux-gnu) diff --git a/gcc/config/rs6000/t-fprules b/gcc/config/rs6000/t-fprules index 42d8fd77b5b0..51ca4cd3dbc7 100644 --- a/gcc/config/rs6000/t-fprules +++ b/gcc/config/rs6000/t-fprules @@ -1,4 +1,4 @@ -# Copyright (C) 2002, 2005, 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002, 2005, 2006, 2008, 2012 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -16,17 +16,8 @@ # along with GCC; see the file COPYING3. If not see # . -MULTILIB_MATCHES_FLOAT = msoft-float=mcpu?401 \ - msoft-float=mcpu?403 \ - msoft-float=mcpu?405 \ - msoft-float=mcpu?440 \ - msoft-float=mcpu?464 \ - msoft-float=mcpu?476 \ - msoft-float=mcpu?ec603e \ - msoft-float=mcpu?801 \ - msoft-float=mcpu?821 \ - msoft-float=mcpu?823 \ - msoft-float=mcpu?860 +SOFT_FLOAT_CPUS = e300c2 401 403 405 440 464 476 ec603e 801 821 823 860 +MULTILIB_MATCHES_FLOAT = $(foreach cpu, $(SOFT_FLOAT_CPUS), msoft-float=mcpu?$(cpu)) # Build the libraries for both hard and soft floating point by default diff --git a/gcc/config/rs6000/t-linux b/gcc/config/rs6000/t-linux new file mode 100644 index 000000000000..017a293cde30 --- /dev/null +++ b/gcc/config/rs6000/t-linux @@ -0,0 +1,9 @@ +# do not define the multiarch name if configured for a soft-float cpu +# or soft-float. +ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float))) +ifneq (,$(findstring spe,$(target))) +MULTIARCH_DIRNAME = powerpc-linux-gnuspe$(if $(findstring rs6000/e500-double.h, $(tm_file_list)),,v1) +else +MULTIARCH_DIRNAME = powerpc-linux-gnu +endif +endif diff --git a/gcc/config/rs6000/t-linux64 b/gcc/config/rs6000/t-linux64 index 6a2235ff11a9..1596c0f74e82 100644 --- a/gcc/config/rs6000/t-linux64 +++ b/gcc/config/rs6000/t-linux64 @@ -36,7 +36,9 @@ MULTILIB_DIRNAMES = 64 32 nof MULTILIB_EXTRA_OPTS = fPIC mstrict-align MULTILIB_EXCEPTIONS = m64/msoft-float MULTILIB_EXCLUSIONS = m64/!m32/msoft-float -MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) nof +MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:powerpc64-linux-gnu) +MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu) +MULTILIB_OSDIRNAMES += nof MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT) softfp_wrap_start := '\#ifndef __powerpc64__' diff --git a/gcc/config/s390/t-linux64 b/gcc/config/s390/t-linux64 index ede76a2cbf3f..cc6ab367072f 100644 --- a/gcc/config/s390/t-linux64 +++ b/gcc/config/s390/t-linux64 @@ -7,4 +7,5 @@ MULTILIB_OPTIONS = m64/m31 MULTILIB_DIRNAMES = 64 32 -MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) +MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu) +MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu) diff --git a/gcc/config/sparc/t-linux b/gcc/config/sparc/t-linux index a3e513087f57..38741fd893e9 100644 --- a/gcc/config/sparc/t-linux +++ b/gcc/config/sparc/t-linux @@ -3,3 +3,5 @@ # Avoid the t-linux version file. SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ $(srcdir)/config/sparc/libgcc-sparc-glibc.ver + +MULTIARCH_DIRNAME = $(call if_multiarch,sparc-linux-gnu) diff --git a/gcc/config/sparc/t-linux64 b/gcc/config/sparc/t-linux64 index 74d04898d9f7..d904876d4b26 100644 --- a/gcc/config/sparc/t-linux64 +++ b/gcc/config/sparc/t-linux64 @@ -1,5 +1,5 @@ # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, -# 2006, 2010 Free Software Foundation, Inc. +# 2006, 2010, 2012 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -26,7 +26,8 @@ MULTILIB_OPTIONS = m64/m32 MULTILIB_DIRNAMES = 64 32 -MULTILIB_OSDIRNAMES = ../lib64 $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib) +MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:sparc64-linux-gnu) +MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:sparc-linux-gnu) LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib diff --git a/gcc/configure b/gcc/configure index e0414d6cf9be..c8caff252f45 100755 --- a/gcc/configure +++ b/gcc/configure @@ -762,6 +762,9 @@ TARGET_SYSTEM_ROOT enable_shared enable_fixed_point enable_decimal_float +with_float +with_cpu +enable_multiarch enable_multilib ENABLE_BUILD_WITH_CXX coverage_flags @@ -871,6 +874,7 @@ enable_gather_detailed_mem_stats enable_build_with_cxx with_stabs enable_multilib +enable_multiarch enable___cxa_atexit enable_decimal_float enable_fixed_point @@ -1572,6 +1576,7 @@ Optional Features: --enable-gather-detailed-mem-stats enable detailed memory allocation stats gathering --enable-build-with-cxx build with C++ compiler instead of C compiler --enable-multilib enable library support for multiple ABIs + --enable-multiarch enable support for multiarch paths --enable-__cxa_atexit enable __cxa_atexit for C++ --enable-decimal-float={no,yes,bid,dpd} enable decimal float extension to C. Selecting 'bid' @@ -6874,6 +6879,33 @@ fi +# Determine whether or not multiarch is enabled. +# Check whether --enable-multiarch was given. +if test "${enable_multiarch+set}" = set; then : + enableval=$enable_multiarch; case "${enableval}" in +yes|no|auto) enable_multiarch=$enableval;; +*) as_fn_error "bad value ${enableval} given for --enable-multiarch option" "$LINENO" 5 ;; +esac +else + enable_multiarch=auto +fi + +if test x${enable_multiarch} = xauto; then + if test x$host != x$target && test "x$with_sysroot" = x; then + ma_msg_suffix=", disabled auto check (cross build configured without --with-sysroot)" + enable_multiarch=no + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for multiarch configuration" >&5 +$as_echo_n "checking for multiarch configuration... " >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_multiarch$ma_msg_suffix" >&5 +$as_echo "$enable_multiarch$ma_msg_suffix" >&6; } + +# needed for setting the multiarch name for soft-float/hard-float ABIs + + + # Enable __cxa_atexit for C++. # Check whether --enable-__cxa_atexit was given. if test "${enable___cxa_atexit+set}" = set; then : @@ -17495,7 +17527,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 17498 "configure" +#line 17530 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -17601,7 +17633,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 17604 "configure" +#line 17636 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/gcc/configure.ac b/gcc/configure.ac index 6c4d8a9b9edb..48605c851b2e 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -606,6 +606,28 @@ AC_ARG_ENABLE(multilib, [], [enable_multilib=yes]) AC_SUBST(enable_multilib) +# Determine whether or not multiarch is enabled. +AC_ARG_ENABLE(multiarch, +[AS_HELP_STRING([--enable-multiarch], + [enable support for multiarch paths])], +[case "${enableval}" in +yes|no|auto) enable_multiarch=$enableval;; +*) AC_MSG_ERROR(bad value ${enableval} given for --enable-multiarch option) ;; +esac], [enable_multiarch=auto]) +if test x${enable_multiarch} = xauto; then + if test x$host != x$target && test "x$with_sysroot" = x; then + ma_msg_suffix=", disabled auto check (cross build configured without --with-sysroot)" + enable_multiarch=no + fi +fi +AC_MSG_CHECKING(for multiarch configuration) +AC_SUBST(enable_multiarch) +AC_MSG_RESULT($enable_multiarch$ma_msg_suffix) + +# needed for setting the multiarch name for soft-float/hard-float ABIs +AC_SUBST(with_cpu) +AC_SUBST(with_float) + # Enable __cxa_atexit for C++. AC_ARG_ENABLE(__cxa_atexit, [ --enable-__cxa_atexit enable __cxa_atexit for C++], diff --git a/gcc/cppdefault.c b/gcc/cppdefault.c index 9b1495feb94c..6f43545e1827 100644 --- a/gcc/cppdefault.c +++ b/gcc/cppdefault.c @@ -64,6 +64,7 @@ const struct default_include cpp_include_defaults[] #endif #ifdef LOCAL_INCLUDE_DIR /* /usr/local/include comes before the fixincluded header files. */ + { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, #endif #ifdef PREFIX_INCLUDE_DIR @@ -95,6 +96,7 @@ const struct default_include cpp_include_defaults[] #endif #ifdef STANDARD_INCLUDE_DIR /* /usr/include comes dead last. */ + { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 2 }, { STANDARD_INCLUDE_DIR, STANDARD_INCLUDE_COMPONENT, 0, 0, 1, 0 }, #endif { 0, 0, 0, 0, 0, 0 } diff --git a/gcc/cppdefault.h b/gcc/cppdefault.h index 657c4abce213..93f7f88ac598 100644 --- a/gcc/cppdefault.h +++ b/gcc/cppdefault.h @@ -1,6 +1,6 @@ /* CPP Library. Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. + 1999, 2000, 2003, 2004, 2006, 2007, 2012 Free Software Foundation, Inc. Contributed by Per Bothner, 1994-95. Based on CCCP program by Paul Rubin, June 1986 Adapted to ANSI C, Richard Stallman, Jan 1987 @@ -43,9 +43,11 @@ struct default_include C++. */ const char add_sysroot; /* FNAME should be prefixed by cpp_SYSROOT. */ - const char multilib; /* FNAME should have the multilib path - specified with -imultilib - appended. */ + const char multilib; /* FNAME should have appended + - the multilib path specified with -imultilib + when set to 1, + - the multiarch path specified with + -imultiarch, when set to 2. */ }; extern const struct default_include cpp_include_defaults[]; diff --git a/gcc/doc/fragments.texi b/gcc/doc/fragments.texi index ff89d513d491..76f27925e6b7 100644 --- a/gcc/doc/fragments.texi +++ b/gcc/doc/fragments.texi @@ -1,5 +1,5 @@ @c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, -@c 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +@c 1999, 2000, 2001, 2003, 2004, 2005, 2008, 2012 Free Software Foundation, Inc. @c This is part of the GCC manual. @c For copying conditions, see the file gcc.texi. @@ -115,6 +115,12 @@ Write one element in @code{MULTILIB_DIRNAMES} for each element in default value will be @code{MULTILIB_OPTIONS}, with all slashes treated as spaces. +@code{MULTILIB_DIRNAMES} describes the multilib directories using GCC +conventions and is applied to directories that are part of the GCC +installation. When multilib-enabled, the compiler will add a +subdirectory of the form @var{prefix}/@var{multilib} before each +directory in the search path for libraries and crt files. + For example, if @code{MULTILIB_OPTIONS} is set to @samp{m68000/m68020 msoft-float}, then the default value of @code{MULTILIB_DIRNAMES} is @samp{m68000 m68020 msoft-float}. You may specify a different value if @@ -157,6 +163,60 @@ If the default location for system headers is not @file{/usr/include}, you must set this to the directory containing the headers. This value should match the value of the @code{SYSTEM_INCLUDE_DIR} macro. +@findex MULTILIB_OSDIRNAMES +@item MULTILIB_OSDIRNAMES +If @code{MULTILIB_OPTIONS} is used, this variable specifies +a list of subdirectory names, that are used to modify the search +path depending on the chosen multilib. Unlike @code{MULTILIB_DIRNAMES}, +@code{MULTILIB_OSDIRNAMES} describes the multilib directories using +operating systems conventions, and is applied to the directories such as +@code{lib} or those in the @env{LIBRARY_PATH} environment variable. +The format is either the same as of +@code{MULTILIB_DIRNAMES}, or a set of mappings. When it is the same +as @code{MULTILIB_DIRNAMES}, it describes the multilib directories +using operating system conventions, rather than GCC conventions. When it is a set +of mappings of the form @var{gccdir}=@var{osdir}, the left side gives +the GCC convention and the right gives the equivalent OS defined +location. If the @var{osdir} part begins with a @samp{!}, +GCC will not search in the non-multilib directory and use +exclusively the multilib directory. Otherwise, the compiler will +examine the search path for libraries and crt files twice; the first +time it will add @var{multilib} to each directory in the search path, +the second it will not. + +For configurations that support both multilib and multiarch, +@code{MULTILIB_OSDIRNAMES} also encodes the multiarch name, thus +subsuming @code{MULTIARCH_DIRNAME}. The multiarch name is appended to +each directory name, separated by a colon (e.g. +@samp{../lib32:i386-linux-gnu}). + +Each multiarch subdirectory will be searched before the corresponding OS +multilib directory, for example @samp{/lib/i386-linux-gnu} before +@samp{/lib/../lib32}. The multiarch name will also be used to modify the +system header search path, as explained for @code{MULTIARCH_DIRNAME}. + +@findex MULTIARCH_DIRNAME +@item MULTIARCH_DIRNAME +This variable specifies the multiarch name for configurations that are +multiarch-enabled but not multilibbed configurations. + +The multiarch name is used to augment the search path for libraries, crt +files and system header files with additional locations. The compiler +will add a multiarch subdirectory of the form +@var{prefix}/@var{multiarch} before each directory in the library and +crt search path. It will also add two directories +@code{LOCAL_INCLUDE_DIR}/@var{multiarch} and +@code{NATIVE_SYSTEM_HEADER_DIR}/@var{multiarch}) to the system header +search path, respectively before @code{LOCAL_INCLUDE_DIR} and +@code{NATIVE_SYSTEM_HEADER_DIR}. + +@code{MULTIARCH_DIRNAME} is not used for configurations that support +both multilib and multiarch. In that case, multiarch names are encoded +in @code{MULTILIB_OSDIRNAMES} instead. + +More documentation about multiarch can be found at +@uref{http://wiki.debian.org/Multiarch}. + @findex SPECS @item SPECS Unfortunately, setting @code{MULTILIB_EXTRA_OPTS} is not enough, since diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index a6f39d85ea3c..75c202e90686 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1005,6 +1005,14 @@ information normally used on 386 SVR4 platforms; stabs provide a workable alternative. This requires gas and gdb, as the normal SVR4 tools can not generate or interpret stabs. +@item --enable-multiarch +Specify whether to enable or disable multiarch support. The default is +to check for glibc start files in a multiarch location, and enable it +if the files are found. The auto detection is enabled for native builds, +and for cross builds configured with @option{--with-sysroot}. +More documentation about multiarch can be found at +@uref{http://wiki.debian.org/Multiarch}. + @item --disable-multilib Specify that multiple target libraries to support different target variants, calling diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 4e56044d8fc5..de25c58cb13c 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -5787,6 +5787,11 @@ sibling directories this prints e.g.@: @file{../lib64}, @file{../lib} or @file{../lib32}, or if OS libraries are present in @file{lib/@var{subdir}} subdirectories it prints e.g.@: @file{amd64}, @file{sparcv9} or @file{ev6}. +@item -print-multiarch +@opindex print-multiarch +Print the path to OS libraries for the selected multiarch, +relative to some @file{lib} subdirectory. + @item -print-prog-name=@var{program} @opindex print-prog-name Like @option{-print-file-name}, but searches for a program such as @samp{cpp}. diff --git a/gcc/gcc.c b/gcc/gcc.c index 75f522e1db51..6efd037c56f1 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -1,7 +1,7 @@ /* Compiler driver program that can handle many languages. Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010, 2011 + 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -1132,6 +1132,11 @@ static const char *multilib_dir; set_multilib_dir based on the compilation options. */ static const char *multilib_os_dir; + +/* Subdirectory to use for locating libraries in multiarch conventions. Set by + set_multilib_dir based on the compilation options. */ + +static const char *multiarch_dir; /* Structure to keep track of the specs that have been defined so far. These are accessed using %(specname) or %[specname] in a compiler @@ -2045,6 +2050,7 @@ for_each_path (const struct path_prefix *paths, struct prefix_list *pl; const char *multi_dir = NULL; const char *multi_os_dir = NULL; + const char *multiarch_suffix = NULL; const char *multi_suffix; const char *just_multi_suffix; char *path = NULL; @@ -2062,11 +2068,14 @@ for_each_path (const struct path_prefix *paths, } if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0) multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL); + if (multiarch_dir) + multiarch_suffix = concat (multiarch_dir, dir_separator_str, NULL); while (1) { size_t multi_dir_len = 0; size_t multi_os_dir_len = 0; + size_t multiarch_len = 0; size_t suffix_len; size_t just_suffix_len; size_t len; @@ -2075,16 +2084,15 @@ for_each_path (const struct path_prefix *paths, multi_dir_len = strlen (multi_dir); if (multi_os_dir) multi_os_dir_len = strlen (multi_os_dir); + if (multiarch_suffix) + multiarch_len = strlen (multiarch_suffix); suffix_len = strlen (multi_suffix); just_suffix_len = strlen (just_multi_suffix); if (path == NULL) { len = paths->max_len + extra_space + 1; - if (suffix_len > multi_os_dir_len) - len += suffix_len; - else - len += multi_os_dir_len; + len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len); path = XNEWVEC (char, len); } @@ -2113,6 +2121,16 @@ for_each_path (const struct path_prefix *paths, break; } + /* Now try the multiarch path. */ + if (!skip_multi_dir + && !pl->require_machine_suffix && multiarch_dir) + { + memcpy (path + len, multiarch_suffix, multiarch_len + 1); + ret = callback (path, callback_info); + if (ret) + break; + } + /* Now try the base path. */ if (!pl->require_machine_suffix && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir)) @@ -2929,6 +2947,9 @@ display_help (void) fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout); fputs (_(" -print-file-name= Display the full path to library \n"), stdout); fputs (_(" -print-prog-name= Display the full path to compiler component \n"), stdout); + fputs (_("\ + -print-multiarch Display the target's normalized GNU triplet, used as\n\ + a component in the library path\n"), stdout); fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout); fputs (_("\ -print-multi-lib Display the mapping between command line options and\n\ @@ -3201,6 +3222,7 @@ driver_handle_option (struct gcc_options *opts, case OPT_print_multi_directory: case OPT_print_sysroot: case OPT_print_multi_os_directory: + case OPT_print_multiarch: case OPT_print_sysroot_headers_suffix: case OPT_time: case OPT_wrapper: @@ -4851,6 +4873,15 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part) do_spec_1 (" ", 0, NULL); } + if (multiarch_dir) + { + do_spec_1 ("-imultiarch", 1, NULL); + /* Make this a separate argument. */ + do_spec_1 (" ", 0, NULL); + do_spec_1 (multiarch_dir, 1, NULL); + do_spec_1 (" ", 0, NULL); + } + if (gcc_exec_prefix) { do_spec_1 ("-iprefix", 1, NULL); @@ -6497,6 +6528,15 @@ main (int argc, char **argv) return (0); } + if (print_multiarch) + { + if (multiarch_dir == NULL) + printf ("\n"); + else + printf ("%s\n", multiarch_dir); + return (0); + } + if (print_sysroot) { if (target_system_root) @@ -7260,7 +7300,9 @@ default_arg (const char *p, int len) options are present, then we will ignore this completely. Passing that, gcc will consider each multilib_select in turn using the same rules for matching the options. If a match is found, that subdirectory - will be used. */ + will be used. + A subdirectory name is optionally followed by a colon and the corresponding + multiarch name. */ static void set_multilib_dir (void) @@ -7472,10 +7514,25 @@ set_multilib_dir (void) q++; if (q < end) { - char *new_multilib_os_dir = XNEWVEC (char, end - q); - memcpy (new_multilib_os_dir, q + 1, end - q - 1); - new_multilib_os_dir[end - q - 1] = '\0'; - multilib_os_dir = new_multilib_os_dir; + const char *q2 = q + 1, *ml_end = end; + char *new_multilib_os_dir; + + while (q2 < end && *q2 != ':') + q2++; + if (*q2 == ':') + ml_end = q2; + new_multilib_os_dir = XNEWVEC (char, ml_end - q); + memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1); + new_multilib_os_dir[ml_end - q - 1] = '\0'; + multilib_os_dir = *new_multilib_os_dir ? new_multilib_os_dir : "."; + + if (q2 < end && *q2 == ':') + { + char *new_multiarch_dir = XNEWVEC (char, end - q2); + memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1); + new_multiarch_dir[end - q2 - 1] = '\0'; + multiarch_dir = new_multiarch_dir; + } break; } } @@ -7535,9 +7592,10 @@ print_multilib_info (void) } /* When --disable-multilib was used but target defines - MULTILIB_OSDIRNAMES, entries starting with .: are there just - to find multilib_os_dir, so skip them from output. */ - if (this_path[0] == '.' && this_path[1] == ':') + MULTILIB_OSDIRNAMES, entries starting with .: (and not starting + with .:: for multiarch configurations) are there just to find + multilib_os_dir, so skip them from output. */ + if (this_path[0] == '.' && this_path[1] == ':' && this_path[2] != ':') skip = 1; /* Check for matches with the multilib_exclusions. We don't bother diff --git a/gcc/genmultilib b/gcc/genmultilib index 270de2b2a2cd..154ff4b560f7 100644 --- a/gcc/genmultilib +++ b/gcc/genmultilib @@ -73,6 +73,8 @@ # the os directory names are used exclusively. Use the mapping when # there is no one-to-one equivalence between GCC levels and the OS. +# The optional eighth argument is the multiarch name. + # The last option should be "yes" if multilibs are enabled. If it is not # "yes", all GCC multilib dir names will be ".". @@ -121,7 +123,8 @@ exceptions=$4 extra=$5 exclusions=$6 osdirnames=$7 -enable_multilib=$8 +multiarch=$8 +enable_multilib=$9 echo "static const char *const multilib_raw[] = {" @@ -222,6 +225,9 @@ fi # names. toosdirnames= defaultosdirname= +if [ -n "${multiarch}" ]; then + defaultosdirname=::${multiarch} +fi if [ -n "${osdirnames}" ]; then set x ${osdirnames} shift @@ -229,6 +235,9 @@ if [ -n "${osdirnames}" ]; then case "$1" in .=*) defaultosdirname=`echo $1 | sed 's|^.=|:|'` + if [ -n "${multiarch}" ]; then + defaultosdirname=${defaultosdirname}:${multiarch} + fi shift ;; *=*) @@ -314,13 +323,13 @@ for combo in ${combinations}; do dirout=`echo ${combo} | sed -e 's/=/-/g'` fi # Remove the leading and trailing slashes. - dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'` + dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` # Use the OS directory names rather than the option names. if [ -n "${toosdirnames}" ]; then osdirout=`echo ${combo} | sed ${toosdirnames}` # Remove the leading and trailing slashes. - osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/$||g'` + osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/*:/*|:|' -e 's|/$||g'` if [ "x${enable_multilib}" != xyes ]; then dirout=".:${osdirout}" disable_multilib=yes diff --git a/gcc/incpath.c b/gcc/incpath.c index baf904fb3260..eb097c18d9e5 100644 --- a/gcc/incpath.c +++ b/gcc/incpath.c @@ -150,8 +150,14 @@ 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); - if (p->multilib && imultilib) + if (p->multilib == 1 && imultilib) str = concat (str, dir_separator_str, imultilib, NULL); + else if (p->multilib == 2) + { + if (!imultiarch) + continue; + str = concat (str, dir_separator_str, imultiarch, NULL); + } add_path (str, SYSTEM, p->cxx_aware, false); } } @@ -195,8 +201,14 @@ add_standard_paths (const char *sysroot, const char *iprefix, else str = update_path (p->fname, p->component); - if (p->multilib && imultilib) + if (p->multilib == 1 && imultilib) str = concat (str, dir_separator_str, imultilib, NULL); + else if (p->multilib == 2) + { + if (!imultiarch) + continue; + str = concat (str, dir_separator_str, imultiarch, NULL); + } add_path (str, SYSTEM, p->cxx_aware, false); } -- 2.47.2