[PATCH v2] C++ : Add the -stdlib= option.
Eric Gallager
egall@gwmail.gwu.edu
Mon Mar 29 18:44:01 GMT 2021
Hi Iain, could you add a note about this change to the
gcc-11/changes.html page? There are probably some people who would be
interested in this who could use a note about it. Thanks
On Tue, Dec 22, 2020 at 3:53 PM Jason Merrill via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On 12/22/20 3:39 PM, Iain Sandoe wrote:
> > Hi Jason,
> >
> > Jason Merrill <jason@redhat.com> wrote:
> >
> >> On 11/11/20 3:58 PM, Iain Sandoe wrote:
> >
> >>> This option allows the user to specify alternate C++ runtime libraries,
> >>> for example when a platform uses libc++ as the installed C++ runtime.
> >>> It is the same spelling as a clang option that allows that to use libstdc++.
> >>> I have had this patch for some time now (more than a year) on Darwin
> >>> branches.
> >>>
> >
> >>> + /* Which standard library to link.
> >>> + 1 = libstdc++
> >>> + 2 = libc++. */
> >>> + int which_library = 1;
> >>
> >> Even if this variable is an int, let's introduce an enum for comparing it to specific values.
> >
> > done - it is also noted that it must track the enum in the opt file.
> >
> >>> @@ -264,6 +293,8 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> >>> /* Add one for shared_libgcc or extra static library. */
> >>> num_args = argc + added + need_math + (library > 0) * 4 + 1;
> >>> + if (which_library > 1 && LIBCXXABI != NULL)
> >>> + num_args += 4;
> >>
> >> Why does libc++ need more args than libstdc++? Please add a comment.
> >
> > done (JFTR, it’s because libc++ doesn’t include the abi library for most platforms, so that also has to be
> > appended to the link line).
> >
> >>> +#ifdef GPLUSPLUS_LIBCXX_INCLUDE_DIR
> >>> + /* Pick up libc++ include files, if we have -stdlib=libc++. */
> >>> + { GPLUSPLUS_LIBCXX_INCLUDE_DIR, "G++", 2, 1,
> >>
> >> If you're going to give cplusplus a non-boolean value, the comment in cppdefault.h needs to reflect that.
> >
> > done.
> >
> > (re-)tested on x86_64-darwin{11,16,17,19, 20} with the installed libc++ and x86_64-linux-gnu with an
> > LLVM-9 build. Bootstrapped and smoke-tested for libc++ (regular testing for libstdc++).
> >
> > OK for master now?
>
> OK.
>
> > thanks
> > Iain
> >
> > ==== revised patch
> >
> >
> > This option allows the user to specifiy alternate C++ runtime libraries,
> > for example when a platform uses libc++ as the installed C++ runtime.
> >
> > We introduce the command line option: -stdlib= which is the user-facing
> > mechanism to select the C++ runtime to be used when compiling and linking
> > code. This is the same option spelling as that used by clang to allow the
> > use of libstdc++.
> >
> > The availability (and thus function) of the option are a configure-time
> > choice using the configuration control:
> > --with-gxx-libcxx-include-dir=
> >
> > Specification of the path for the libc++ headers, enables the -stdlib=
> > option (using the path as given), default values are set when the path
> > is unconfigured.
> >
> > If --with-gxx-libcxx-include-dir is given together with --with-sysroot=,
> > then we test to see if the include path starts with the sysroot and, if so,
> > record the sysroot-relative component as the local path. At runtime, we
> > prepend the sysroot that is actually active.
> >
> > At link time, we use the C++ runtime in force and (if that is libc++) also
> > append the libc++abi ABI library. As for other cases, if a target sets the
> > name pointer for the ABI library to NULL the G++ driver will omit it from
> > the link line.
> >
> > gcc/ChangeLog:
> >
> > * configure.ac: Add gxx-libcxx-include-dir handled
> > in the same way as the regular cxx header directory.
> > * Makefile.in: Regenerated.
> > * config.in: Likewise.
> > * configure: Likewise.
> > * cppdefault.c: Pick up libc++ headers if the option
> > is enabled.
> > * cppdefault.h (struct default_include): Amend comments
> > to reflect the extended use of the cplusplus field.
> > * incpath.c (add_standard_paths): Allow for multiple
> > c++ header include path variants.
> > * doc/invoke.texi: Document the -stdlib= option.
> >
> > gcc/c-family/ChangeLog:
> >
> > * c.opt: Add -stdlib= option and enumerations for
> > libstdc++ and libc++.
> >
> > gcc/cp/ChangeLog:
> >
> > * g++spec.c (LIBCXX, LIBCXX_PROFILE, LIBCXX_STATIC): New.
> > (LIBCXXABI, LIBCXXABI_PROFILE, LIBCXXABI_STATIC): New.
> > (enum stdcxxlib_kind): New.
> > (lang_specific_driver): Allow selection amongst multiple
> > c++ runtime libraries.
> > ---
> > gcc/Makefile.in | 6 ++++
> > gcc/c-family/c.opt | 14 +++++++++
> > gcc/config.in | 6 ++++
> > gcc/configure | 57 ++++++++++++++++++++++++++++++++--
> > gcc/configure.ac | 44 +++++++++++++++++++++++++++
> > gcc/cp/g++spec.c | 74 ++++++++++++++++++++++++++++++++++++++++-----
> > gcc/cppdefault.c | 5 +++
> > gcc/cppdefault.h | 7 ++++-
> > gcc/doc/invoke.texi | 10 ++++++
> > gcc/incpath.c | 6 ++--
> > 10 files changed, 216 insertions(+), 13 deletions(-)
> >
> > diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> > index 178e4eaa513..6847022f108 100644
> > --- a/gcc/Makefile.in
> > +++ b/gcc/Makefile.in
> > @@ -679,6 +679,9 @@ build_tooldir = $(exec_prefix)/$(target_noncanonical)
> > # Directory in which the compiler finds target-independent g++ includes.
> > gcc_gxx_include_dir = @gcc_gxx_include_dir@
> > gcc_gxx_include_dir_add_sysroot = @gcc_gxx_include_dir_add_sysroot@
> > +# Directory in which the compiler finds libc++ includes.
> > +gcc_gxx_libcxx_include_dir = @gcc_gxx_libcxx_include_dir@
> > +gcc_gxx_libcxx_include_dir_add_sysroot = @gcc_gxx_libcxx_include_dir_add_sysroot@
> > # Directory to search for site-specific includes.
> > local_includedir = $(local_prefix)/include
> > includedir = $(prefix)/include
> > @@ -1185,6 +1188,7 @@ FLAGS_TO_PASS = \
> > "prefix=$(prefix)" \
> > "local_prefix=$(local_prefix)" \
> > "gxx_include_dir=$(gcc_gxx_include_dir)" \
> > + "gxx_libcxx_include_dir=$(gcc_gxx_libcxx_include_dir)" \
> > "build_tooldir=$(build_tooldir)" \
> > "gcc_tooldir=$(gcc_tooldir)" \
> > "bindir=$(bindir)" \
> > @@ -3004,6 +3008,8 @@ PREPROCESSOR_DEFINES = \
> > -DGPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT=$(gcc_gxx_include_dir_add_sysroot) \
> > -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \
> > -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \
> > + -DGPLUSPLUS_LIBCXX_INCLUDE_DIR=\"$(gcc_gxx_libcxx_include_dir)\" \
> > + -DGPLUSPLUS_LIBCXX_INCLUDE_DIR_ADD_SYSROOT=$(gcc_gxx_libcxx_include_dir_add_sysroot) \
> > -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \
> > -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \
> > -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
> > diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
> > index 21d8cd03709..e0c322f61ae 100644
> > --- a/gcc/c-family/c.opt
> > +++ b/gcc/c-family/c.opt
> > @@ -2356,6 +2356,20 @@ std=iso9899:2018
> > C ObjC Alias(std=c17)
> > Conform to the ISO 2017 C standard (published in 2018).
> >
> > +stdlib=
> > +Driver C++ ObjC++ Common Condition(ENABLE_STDLIB_OPTION) Var(flag_stdlib_kind) Joined Enum(stdlib_kind) RejectNegative Init(1)
> > +-stdlib=[libstdc++|libc++] The standard library to be used for C++ headers
> > +and runtime.
> > +
> > +Enum
> > +Name(stdlib_kind) Type(int)
> > +
> > +EnumValue
> > +Enum(stdlib_kind) String(libstdc++) Value(1)
> > +
> > +EnumValue
> > +Enum(stdlib_kind) String(libc++) Value(2)
> > +
> > traditional
> > Driver
> >
> > diff --git a/gcc/config.in b/gcc/config.in
> > index 216505abd2c..10a13cde586 100644
> > --- a/gcc/config.in
> > +++ b/gcc/config.in
> > @@ -240,6 +240,12 @@
> > standards-compatible mode on s390 targets. */
> > #undef ENABLE_S390_EXCESS_FLOAT_PRECISION
> >
> > +/* Define if the -stdlib= option should be enabled. */
> > +#ifndef USED_FOR_TARGET
> > +#undef ENABLE_STDLIB_OPTION
> > +#endif
> > +
> > +
> > /* Define if you want all operations on trees (the basic data structure of the
> > front ends) to be checked for dynamic type safety at runtime. This is
> > moderately expensive. */
> > diff --git a/gcc/configure b/gcc/configure
> > index fbe92089640..ee9760354b6 100755
> > --- a/gcc/configure
> > +++ b/gcc/configure
> > @@ -675,6 +675,8 @@ host_xm_defines
> > host_xm_include_list
> > host_xm_file_list
> > host_exeext
> > +gcc_gxx_libcxx_include_dir_add_sysroot
> > +gcc_gxx_libcxx_include_dir
> > gcc_gxx_include_dir_add_sysroot
> > gcc_gxx_include_dir
> > gcc_config_arguments
> > @@ -937,6 +939,7 @@ with_native_system_header_dir
> > with_build_sysroot
> > with_sysroot
> > with_gxx_include_dir
> > +with_gxx_libcxx_include_dir
> > with_cpp_install_dir
> > enable_generated_files_in_srcdir
> > with_gnu_ld
> > @@ -1801,6 +1804,8 @@ Optional Packages:
> > --with-sysroot[=DIR] search for usr/lib, usr/include, et al, within DIR
> > --with-gxx-include-dir=DIR
> > specifies directory to put g++ header files
> > + --with-gxx-libcxx-include-dir=DIR
> > + specifies directory to find libc++ header files
> > --with-cpp-install-dir=DIR
> > install the user visible C preprocessor in DIR
> > (relative to PREFIX) as well as PREFIX/bin
> > @@ -3731,6 +3736,52 @@ elif test "${with_sysroot+set}" = set; then
> > fi
> > fi
> >
> > +# Configuration for an alternate set of C++ headers.
> > +gcc_gxx_libcxx_include_dir=
> > +# Specify the alternate g++ header file directory
> > +
> > +# Check whether --with-gxx-libcxx-include-dir was given.
> > +if test "${with_gxx_libcxx_include_dir+set}" = set; then :
> > + withval=$with_gxx_libcxx_include_dir; case "${withval}" in
> > +yes) as_fn_error $? "bad value ${withval} given for libc++ include directory" "$LINENO" 5 ;;
> > +no) ;;
> > +*) gcc_gxx_libcxx_include_dir=$with_gxx_libcxx_include_dir ;;
> > +esac
> > +fi
> > +
> > +
> > +# If both --with-sysroot and --with-gxx-libcxx-include-dir are passed, we
> > +# check to see if the latter starts with the former and, upon success, compute
> > +# gcc_gxx_libcxx_include_dir as relative to the sysroot.
> > +gcc_gxx_libcxx_include_dir_add_sysroot=0
> > +
> > +if test x${gcc_gxx_libcxx_include_dir} != x; then
> > +
> > +$as_echo "#define ENABLE_STDLIB_OPTION 1" >>confdefs.h
> > +
> > +else
> > + $as_echo "#define ENABLE_STDLIB_OPTION 0" >>confdefs.h
> > +
> > +fi
> > +# ??? This logic must match libstdc++-v3/acinclude.m4:GLIBCXX_EXPORT_INSTALL_INFO.
> > +if test x${gcc_gxx_libcxx_include_dir} = x; then
> > + if test x${enable_version_specific_runtime_libs} = xyes; then
> > + gcc_gxx_libcxx_include_dir='${libsubdir}/libc++_include/c++/v1'
> > + else
> > + libcxx_incdir='libc++_include/c++/$(version)/v1'
> > + if test x$host != x$target; then
> > + libcxx_incdir="$target_alias/$libcxx_incdir"
> > + fi
> > + gcc_gxx_libcxx_include_dir="\$(libsubdir)/\$(libsubdir_to_prefix)$libcxx_incdir"
> > + fi
> > +elif test "${with_sysroot+set}" = set; then
> > + gcc_gxx_libcxx_without_sysroot=`expr "${gcc_gxx_libcxx_include_dir}" : "${with_sysroot}"'\(.*\)'`
> > + if test "${gcc_gxx_libcxx_without_sysroot}"; then
> > + gcc_gxx_libcxx_include_dir="${gcc_gxx_libcxx_without_sysroot}"
> > + gcc_gxx_libcxx_include_dir_add_sysroot=1
> > + fi
> > +fi
> > +
> >
> > # Check whether --with-cpp_install_dir was given.
> > if test "${with_cpp_install_dir+set}" = set; then :
> > @@ -19186,7 +19237,7 @@ else
> > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> > lt_status=$lt_dlunknown
> > cat > conftest.$ac_ext <<_LT_EOF
> > -#line 19189 "configure"
> > +#line 19240 "configure"
> > #include "confdefs.h"
> >
> > #if HAVE_DLFCN_H
> > @@ -19292,7 +19343,7 @@ else
> > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
> > lt_status=$lt_dlunknown
> > cat > conftest.$ac_ext <<_LT_EOF
> > -#line 19295 "configure"
> > +#line 19346 "configure"
> > #include "confdefs.h"
> >
> > #if HAVE_DLFCN_H
> > @@ -31175,6 +31226,8 @@ fi
> >
> >
> >
> > +
> > +
> >
> >
> >
> > diff --git a/gcc/configure.ac b/gcc/configure.ac
> > index 89b9981e872..6fcf154d987 100644
> > --- a/gcc/configure.ac
> > +++ b/gcc/configure.ac
> > @@ -228,6 +228,48 @@ elif test "${with_sysroot+set}" = set; then
> > fi
> > fi
> >
> > +# Configuration for an alternate set of C++ headers.
> > +gcc_gxx_libcxx_include_dir=
> > +# Specify the alternate g++ header file directory
> > +AC_ARG_WITH(gxx-libcxx-include-dir,
> > +[AS_HELP_STRING([--with-gxx-libcxx-include-dir=DIR],
> > + [specifies directory to find libc++ header files])],
> > +[case "${withval}" in
> > +yes) AC_MSG_ERROR(bad value ${withval} given for libc++ include directory) ;;
> > +no) ;;
> > +*) gcc_gxx_libcxx_include_dir=$with_gxx_libcxx_include_dir ;;
> > +esac])
> > +
> > +# If both --with-sysroot and --with-gxx-libcxx-include-dir are passed, we
> > +# check to see if the latter starts with the former and, upon success, compute
> > +# gcc_gxx_libcxx_include_dir as relative to the sysroot.
> > +gcc_gxx_libcxx_include_dir_add_sysroot=0
> > +
> > +if test x${gcc_gxx_libcxx_include_dir} != x; then
> > + AC_DEFINE(ENABLE_STDLIB_OPTION, 1,
> > + [Define if the -stdlib= option should be enabled.])
> > +else
> > + AC_DEFINE(ENABLE_STDLIB_OPTION, 0)
> > +fi
> > +# ??? This logic must match libstdc++-v3/acinclude.m4:GLIBCXX_EXPORT_INSTALL_INFO.
> > +if test x${gcc_gxx_libcxx_include_dir} = x; then
> > + if test x${enable_version_specific_runtime_libs} = xyes; then
> > + gcc_gxx_libcxx_include_dir='${libsubdir}/libc++_include/c++/v1'
> > + else
> > + libcxx_incdir='libc++_include/c++/$(version)/v1'
> > + if test x$host != x$target; then
> > + libcxx_incdir="$target_alias/$libcxx_incdir"
> > + fi
> > + gcc_gxx_libcxx_include_dir="\$(libsubdir)/\$(libsubdir_to_prefix)$libcxx_incdir"
> > + fi
> > +elif test "${with_sysroot+set}" = set; then
> > + gcc_gxx_libcxx_without_sysroot=`expr "${gcc_gxx_libcxx_include_dir}" : "${with_sysroot}"'\(.*\)'`
> > + if test "${gcc_gxx_libcxx_without_sysroot}"; then
> > + gcc_gxx_libcxx_include_dir="${gcc_gxx_libcxx_without_sysroot}"
> > + gcc_gxx_libcxx_include_dir_add_sysroot=1
> > + fi
> > +fi
> > +
> > AC_ARG_WITH(cpp_install_dir,
> > [AC_HELP_STRING([--with-cpp-install-dir=DIR],
> > [install the user visible C preprocessor in DIR
> > @@ -7096,6 +7138,8 @@ AC_SUBST(float_h_file)
> > AC_SUBST(gcc_config_arguments)
> > AC_SUBST(gcc_gxx_include_dir)
> > AC_SUBST(gcc_gxx_include_dir_add_sysroot)
> > +AC_SUBST(gcc_gxx_libcxx_include_dir)
> > +AC_SUBST(gcc_gxx_libcxx_include_dir_add_sysroot)
> > AC_SUBST(host_exeext)
> > AC_SUBST(host_xm_file_list)
> > AC_SUBST(host_xm_include_list)
> > diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
> > index 0f17148ccbd..a8254cd34c9 100644
> > --- a/gcc/cp/g++spec.c
> > +++ b/gcc/cp/g++spec.c
> > @@ -49,6 +49,34 @@ along with GCC; see the file COPYING3. If not see
> > #define LIBSTDCXX_STATIC NULL
> > #endif
> >
> > +#ifndef LIBCXX
> > +#define LIBCXX "c++"
> > +#endif
> > +#ifndef LIBCXX_PROFILE
> > +#define LIBCXX_PROFILE LIBCXX
> > +#endif
> > +#ifndef LIBCXX_STATIC
> > +#define LIBCXX_STATIC NULL
> > +#endif
> > +
> > +#ifndef LIBCXXABI
> > +#define LIBCXXABI "c++abi"
> > +#endif
> > +#ifndef LIBCXXABI_PROFILE
> > +#define LIBCXXABI_PROFILE LIBCXXABI
> > +#endif
> > +#ifndef LIBCXXABI_STATIC
> > +#define LIBCXXABI_STATIC NULL
> > +#endif
> > +
> > +/* The values used here must match those of the stdlib_kind enumeration
> > + in c.opt. */
> > +enum stdcxxlib_kind
> > +{
> > + USE_LIBSTDCXX = 1,
> > + USE_LIBCXX = 2
> > +};
> > +
> > void
> > lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> > unsigned int *in_decoded_options_count,
> > @@ -59,13 +87,16 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> > /* If nonzero, the user gave us the `-p' or `-pg' flag. */
> > int saw_profile_flag = 0;
> >
> > - /* What do with libstdc++:
> > - -1 means we should not link in libstdc++
> > - 0 means we should link in libstdc++ if it is needed
> > - 1 means libstdc++ is needed and should be linked in.
> > - 2 means libstdc++ is needed and should be linked statically. */
> > + /* What action to take for the c++ runtime library:
> > + -1 means we should not link it in.
> > + 0 means we should link it if it is needed.
> > + 1 means it is needed and should be linked in.
> > + 2 means it is needed but should be linked statically. */
> > int library = 0;
> >
> > + /* Which c++ runtime library to link. */
> > + stdcxxlib_kind which_library = USE_LIBSTDCXX;
> > +
> > /* The number of arguments being added to what's in argv, other than
> > libraries. We use this to track the number of times we've inserted
> > -xc++/-xnone. */
> > @@ -194,6 +225,10 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> > args[i] |= SKIPOPT;
> > break;
> >
> > + case OPT_stdlib_:
> > + which_library = (stdcxxlib_kind) decoded_options[i].value;
> > + break;
> > +
> > case OPT_SPECIAL_input_file:
> > {
> > int len;
> > @@ -250,6 +285,13 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> >
> > /* Add one for shared_libgcc or extra static library. */
> > num_args = argc + added + need_math + (library > 0) * 4 + 1;
> > + /* For libc++, on most platforms, the ABI library (usually called libc++abi)
> > + is provided as a separate DSO, which we must also append.
> > + However, a platform might have the ability to forward the ABI library
> > + from libc++, or combine it in some other way; in that case, LIBCXXABI
> > + should be set to NULL to signal that it need not be appended. */
> > + if (which_library == USE_LIBCXX && LIBCXXABI != NULL)
> > + num_args += 4;
> > new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
> >
> > i = 0;
> > @@ -323,9 +365,25 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
> > j++;
> > }
> > #endif
> > - generate_option (OPT_l,
> > - saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
> > - CL_DRIVER, &new_decoded_options[j]);
> > + if (which_library == USE_LIBCXX)
> > + {
> > + generate_option (OPT_l,
> > + saw_profile_flag ? LIBCXX_PROFILE : LIBCXX, 1,
> > + CL_DRIVER, &new_decoded_options[j]);
> > + if (LIBCXXABI != NULL)
> > + {
> > + j++;
> > + added_libraries++;
> > + generate_option (OPT_l,
> > + saw_profile_flag ? LIBCXXABI_PROFILE
> > + : LIBCXXABI, 1,
> > + CL_DRIVER, &new_decoded_options[j]);
> > + }
> > + }
> > + else
> > + generate_option (OPT_l,
> > + saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
> > + CL_DRIVER, &new_decoded_options[j]);
> > added_libraries++;
> > j++;
> > /* Add target-dependent static library, if necessary. */
> > diff --git a/gcc/cppdefault.c b/gcc/cppdefault.c
> > index af38cc494ea..eb6f94162cd 100644
> > --- a/gcc/cppdefault.c
> > +++ b/gcc/cppdefault.c
> > @@ -55,6 +55,11 @@ const struct default_include cpp_include_defaults[]
> > { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1,
> > GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
> > #endif
> > +#ifdef GPLUSPLUS_LIBCXX_INCLUDE_DIR
> > + /* Pick up libc++ include files, if we have -stdlib=libc++. */
> > + { GPLUSPLUS_LIBCXX_INCLUDE_DIR, "G++", 2, 1,
> > + GPLUSPLUS_LIBCXX_INCLUDE_DIR_ADD_SYSROOT, 0 },
> > +#endif
> > #ifdef GCC_INCLUDE_DIR
> > /* This is the dir for gcc's private headers. */
> > { GCC_INCLUDE_DIR, "GCC", 0, 0, 0, 0 },
> > diff --git a/gcc/cppdefault.h b/gcc/cppdefault.h
> > index a681264f75e..35cf24ec29e 100644
> > --- a/gcc/cppdefault.h
> > +++ b/gcc/cppdefault.h
> > @@ -36,7 +36,12 @@ struct default_include
> > const char *const fname; /* The name of the directory. */
> > const char *const component; /* The component containing the directory
> > (see update_path in prefix.c) */
> > - const char cplusplus; /* Only look here if we're compiling C++. */
> > + const char cplusplus; /* When this is non-zero, we should only
> > + consider this if we're compiling C++.
> > + When the -stdlib option is configured, this
> > + may take values greater than 1 to indicate
> > + which C++ standard library should be
> > + used. */
> > const char cxx_aware; /* Includes in this directory don't need to
> > be wrapped in extern "C" when compiling
> > C++. */
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index d7d354fc4de..3b8b003c51d 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -242,6 +242,7 @@ in the following sections.
> > -fext-numeric-literals @gol
> > -flang-info-include-translate@r{[}=@var{name}@r{]} @gol
> > -flang-info-include-translate-not @gol
> > +-stdlib=@var{libstdc++,libc++} @gol
> > -Wabi-tag -Wcatch-value -Wcatch-value=@var{n} @gol
> > -Wno-class-conversion -Wclass-memaccess @gol
> > -Wcomma-subscript -Wconditionally-supported @gol
> > @@ -3368,6 +3369,15 @@ is used when building the C++ library.)
> > @opindex flang-info-include-translate-not
> > Diagnose include translation events.
> >
> > +@item -stdlib=@var{libstdc++,libc++}
> > +@opindex stdlib
> > +When G++ is configured to support this option, it allows specification of
> > +alternate C++ runtime libraries. Two options are available: @var{libstdc++}
> > +(the default, native C++ runtime for G++) and @var{libc++} which is the
> > +C++ runtime installed on some operating systems (e.g. Darwin versions from
> > +Darwin11 onwards). The option switches G++ to use the headers from the
> > +specified library and to emit @code{-lstdc++} or @code{-lc++} respectively,
> > +when a C++ runtime is required for linking.
> > @end table
> >
> > In addition, these warning options have meanings only for C++ programs:
> > diff --git a/gcc/incpath.c b/gcc/incpath.c
> > index 8437939bf1e..14593a1f4c3 100644
> > --- a/gcc/incpath.c
> > +++ b/gcc/incpath.c
> > @@ -137,7 +137,8 @@ add_standard_paths (const char *sysroot, const char *iprefix,
> > IPREFIX and search them first. */
> > for (p = cpp_include_defaults; p->fname; p++)
> > {
> > - if (!p->cplusplus || cxx_stdinc)
> > + if (p->cplusplus == 0
> > + || (cxx_stdinc && (p->cplusplus == flag_stdlib_kind)))
> > {
> > /* Should we be translating sysrooted dirs too? Assume
> > that iprefix and sysroot are mutually exclusive, for
> > @@ -168,7 +169,8 @@ add_standard_paths (const char *sysroot, const char *iprefix,
> >
> > for (p = cpp_include_defaults; p->fname; p++)
> > {
> > - if (!p->cplusplus || cxx_stdinc)
> > + if (p->cplusplus == 0
> > + || (cxx_stdinc && (p->cplusplus == flag_stdlib_kind)))
> > {
> > char *str;
> >
> >
>
More information about the Gcc-patches
mailing list