diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2019-11-27 13:58:10 +0000 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2020-12-24 10:08:42 +0000 |
commit | 662b9c55cf06d3df6682ef865fb2b685820317a9 (patch) | |
tree | 77c57d2f62a8f79a80dba61e66ebc6076b54f13b /gcc/cp/g++spec.c | |
parent | 168be2b3afddd41d4575ed55439231812bc3e7c9 (diff) | |
download | gcc-662b9c55cf06d3df6682ef865fb2b685820317a9.zip gcc-662b9c55cf06d3df6682ef865fb2b685820317a9.tar.gz gcc-662b9c55cf06d3df6682ef865fb2b685820317a9.tar.bz2 |
C++ : Add the -stdlib= option.
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.
Diffstat (limited to 'gcc/cp/g++spec.c')
-rw-r--r-- | gcc/cp/g++spec.c | 74 |
1 files changed, 66 insertions, 8 deletions
diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c index 0f17148..a8254cd 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. */ |