This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [patch] Default to --enable-libstdcxx-time=auto
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Jonathan Wakely <jwakely dot gcc at gmail dot com>, Benjamin Kosnik <bkoz at redhat dot com>, Paolo Carlini <paolo dot carlini at oracle dot com>, libstdc++ <libstdc++ at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 24 May 2013 15:35:15 +0200
- Subject: Re: [patch] Default to --enable-libstdcxx-time=auto
- References: <20130523140218 dot GW1377 at tucnak dot redhat dot com> <20130523162611 dot GA1377 at tucnak dot redhat dot com> <yddbo81whlf dot fsf at CeBiTec dot Uni-Bielefeld dot DE> <20130523205022 dot GF1377 at tucnak dot redhat dot com> <ydd7gipwh3a dot fsf at CeBiTec dot Uni-Bielefeld dot DE> <20130523210611 dot GH1377 at tucnak dot redhat dot com> <ydd38tdwgis dot fsf at CeBiTec dot Uni-Bielefeld dot DE> <yddy5b5uzuq dot fsf at CeBiTec dot Uni-Bielefeld dot DE> <20130524075705 dot GK1377 at tucnak dot redhat dot com> <yddk3mopxat dot fsf at lokon dot CeBiTec dot Uni-Bielefeld dot DE> <20130524132117 dot GT1377 at tucnak dot redhat dot com>
Jakub Jelinek <jakub@redhat.com> writes:
>> It occured to me that there might be a far less intrusive option to still
>> allow a Solaris backport: instead of going the libstdc++.spec route
>> (which I still think is the correct way forward), statically handle -lrt
>> addition in g++spec.c, controlled by a macro defined only in config/sol2.h.
>>
>> Such a patch could be added to mainline and 4.8 branch now, and mainline
>> later changed to use libstdc++.spec instead.
>
> I think a switch from not linking libstdc++ against -lrt to linking against
> that is quite heavy change for the branch. Do you see why the latest patch
I'm not so sure: to me, that's just an implementation detail.
> I've posted today wouldn't work well on Solaris?
It should work on the 4.8 branch (I'll include it in my bootstraps this
weekend), but on mainline the failures due to missing nanosleep/-lrt
will remain.
I've just successfully bootstrapped the following patch on
i386-pc-solaris2.10 and x86_64-unknown-linux-gnu. It fixes the
libstdc++ testsuite failures I'd reported before.
Rainer
2013-05-24 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
gcc/cp:
* g++spec.c (TIMELIB): Define.
(WITHLIBC, SKIPOPT): Adjust values.
(lang_specific_driver): Add TIME_LIBRARY if not passed explicitly.
gcc:
* config/sol2.h (TIME_LIBRARY): Define.
# HG changeset patch
# Parent d6881ec042d3a6328b763cbf0f38e61bdbb64d79
Add -lrt on Solaris
diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h
--- a/gcc/config/sol2.h
+++ b/gcc/config/sol2.h
@@ -194,6 +194,9 @@ along with GCC; see the file COPYING3.
#endif /* HAVE_LD_EH_FRAME && TARGET_DL_ITERATE_PHDR */
#endif
+/* C++11 programs need -lrt for nanosleep. */
+#define TIME_LIBRARY "rt"
+
#ifndef USE_GLD
/* The default MFLIB_SPEC is GNU ld specific. */
#define MFLIB_SPEC ""
diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
--- a/gcc/cp/g++spec.c
+++ b/gcc/cp/g++spec.c
@@ -28,10 +28,12 @@ along with GCC; see the file COPYING3.
#define LANGSPEC (1<<1)
/* This bit is set if they did `-lm' or `-lmath'. */
#define MATHLIB (1<<2)
+/* This bit is set if they did `-lrt' or equivalent. */
+#define TIMELIB (1<<3)
/* This bit is set if they did `-lc'. */
-#define WITHLIBC (1<<3)
+#define WITHLIBC (1<<4)
/* Skip this option. */
-#define SKIPOPT (1<<4)
+#define SKIPOPT (1<<5)
#ifndef MATH_LIBRARY
#define MATH_LIBRARY "m"
@@ -40,6 +42,10 @@ along with GCC; see the file COPYING3.
#define MATH_LIBRARY_PROFILE MATH_LIBRARY
#endif
+#ifndef TIME_LIBRARY
+#define TIME_LIBRARY ""
+#endif
+
#ifndef LIBSTDCXX
#define LIBSTDCXX "stdc++"
#endif
@@ -83,16 +89,22 @@ lang_specific_driver (struct cl_decoded_
/* "-lm" or "-lmath" if it appears on the command line. */
const struct cl_decoded_option *saw_math = NULL;
+ /* "-lrt" or eqivalent if it appears on the command line. */
+ const struct cl_decoded_option *saw_time = NULL;
+
/* "-lc" if it appears on the command line. */
const struct cl_decoded_option *saw_libc = NULL;
/* An array used to flag each argument that needs a bit set for
- LANGSPEC, MATHLIB, or WITHLIBC. */
+ LANGSPEC, MATHLIB, TIMELIB, or WITHLIBC. */
int *args;
/* By default, we throw on the math library if we have one. */
int need_math = (MATH_LIBRARY[0] != '\0');
+ /* By default, we throw on the time library if we have one. */
+ int need_time = (TIME_LIBRARY[0] != '\0');
+
/* True if we saw -static. */
int static_link = 0;
@@ -136,6 +148,11 @@ lang_specific_driver (struct cl_decoded_
args[i] |= MATHLIB;
need_math = 0;
}
+ else if (strcmp (arg, TIME_LIBRARY) == 0)
+ {
+ args[i] |= TIMELIB;
+ need_time = 0;
+ }
else if (strcmp (arg, "c") == 0)
args[i] |= WITHLIBC;
else
@@ -268,6 +285,12 @@ lang_specific_driver (struct cl_decoded_
saw_math = &decoded_options[i];
}
+ if (!saw_time && (args[i] & TIMELIB) && library > 0)
+ {
+ --j;
+ saw_time = &decoded_options[i];
+ }
+
if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
{
--j;
@@ -352,6 +375,15 @@ lang_specific_driver (struct cl_decoded_
added_libraries++;
j++;
}
+ if (saw_time)
+ new_decoded_options[j++] = *saw_time;
+ else if (library > 0 && need_time)
+ {
+ generate_option (OPT_l, TIME_LIBRARY, 1, CL_DRIVER,
+ &new_decoded_options[j]);
+ added_libraries++;
+ j++;
+ }
if (saw_libc)
new_decoded_options[j++] = *saw_libc;
if (shared_libgcc && !static_link)
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University