aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/g++spec.c
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2019-11-27 13:58:10 +0000
committerIain Sandoe <iain@sandoe.co.uk>2020-12-24 10:08:42 +0000
commit662b9c55cf06d3df6682ef865fb2b685820317a9 (patch)
tree77c57d2f62a8f79a80dba61e66ebc6076b54f13b /gcc/cp/g++spec.c
parent168be2b3afddd41d4575ed55439231812bc3e7c9 (diff)
downloadgcc-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.c74
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. */