libstdc++: Enable building libstdc++.{a,so} when !HOSTED
Checks
Commit Message
This enables us to provide symbols for placeholders and numeric limits,
and allows users to mess about with linker flags less.
libstdc++-v3/ChangeLog:
* Makefile.am [!_GLIBCXX_HOSTED]: Enable src/ subdirectory.
* Makefile.in: Regenerate.
* src/Makefile.am [!_GLIBCXX_HOSTED]: Omit compatibility files.
There's no history to be compatible with.
* src/c++11/Makefile.am [!_GLIBCXX_HOSTED]: Omit hosted-only
source files from the build.
* src/c++17/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
* src/c++20/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
* src/c++98/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
* src/Makefile.in: Regenerate.
* src/c++11/Makefile.in: Regenerate.
* src/c++17/Makefile.in: Regenerate.
* src/c++20/Makefile.in: Regenerate.
* src/c++98/Makefile.in: Regenerate.
---
Afternoon,
With these changes, when we aren't hosted, we get a libstdc++ library that
contains only library facilities available in freestanding (i.e. placeholders
and limits.cc). This is, AFAICT, the only code in libstdc++.{a,so} that can
(and should) be available in freestanding.
As an implementation note, this could be a little bit faster (at
build/configure time), though not necessarily nicer, by having
src/Makefile.am not try to build convenience libraries for versions of
C++ that provide nothing. I opted not to do this since it'd make
src/Makefile.am even more complex, and make future changes harder to implement.
libstdc++ also isn't that slow to build, anyway.
Tested on i686-elf.
Have a good day!
libstdc++-v3/Makefile.am | 4 ++--
libstdc++-v3/Makefile.in | 4 ++--
libstdc++-v3/src/Makefile.am | 6 +++++
libstdc++-v3/src/Makefile.in | 8 +++++--
libstdc++-v3/src/c++11/Makefile.am | 16 ++++++++++---
libstdc++-v3/src/c++11/Makefile.in | 37 +++++++++++++++++++-----------
libstdc++-v3/src/c++17/Makefile.am | 4 ++++
libstdc++-v3/src/c++17/Makefile.in | 6 +++--
libstdc++-v3/src/c++20/Makefile.am | 4 ++++
libstdc++-v3/src/c++20/Makefile.in | 6 +++--
libstdc++-v3/src/c++98/Makefile.am | 4 ++++
libstdc++-v3/src/c++98/Makefile.in | 6 +++--
12 files changed, 77 insertions(+), 28 deletions(-)
# Use special rules for the deprecated source files so that they find
Comments
Evening,
Since S1 is closed now, best to ping this patch before it drifts into
GCC14.
Archive link:
https://gcc.gnu.org/pipermail/gcc-patches/2022-October/604031.html
Have a great evening!
On Thu, 20 Oct 2022 at 16:53, Arsen Arsenović via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> This enables us to provide symbols for placeholders and numeric limits,
I'm not convinced this is worth doing.
The placeholders and the numeric_limits members are all inline
variables for C++17 and later, and C++17 is the compiler's default
mode. The placeholders aren't even required to exist for freestanding
prior to C++23. For the numeric_limits definitions, I suppose it is a
problem that users can't take their address in freestanding today
unless they compile as C++17.
> and allows users to mess about with linker flags less.
i.e. they don't have to use -nostdlib and/or link with gcc -lsupc++,
but can just use g++?
That seems more compelling than providing definitions of the
placeholders and limits members.
>
> libstdc++-v3/ChangeLog:
>
> * Makefile.am [!_GLIBCXX_HOSTED]: Enable src/ subdirectory.
> * Makefile.in: Regenerate.
> * src/Makefile.am [!_GLIBCXX_HOSTED]: Omit compatibility files.
> There's no history to be compatible with.
> * src/c++11/Makefile.am [!_GLIBCXX_HOSTED]: Omit hosted-only
> source files from the build.
> * src/c++17/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/c++20/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/c++98/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/Makefile.in: Regenerate.
> * src/c++11/Makefile.in: Regenerate.
> * src/c++17/Makefile.in: Regenerate.
> * src/c++20/Makefile.in: Regenerate.
> * src/c++98/Makefile.in: Regenerate.
> ---
> Afternoon,
>
> With these changes, when we aren't hosted, we get a libstdc++ library that
> contains only library facilities available in freestanding (i.e. placeholders
> and limits.cc). This is, AFAICT, the only code in libstdc++.{a,so} that can
> (and should) be available in freestanding.
>
> As an implementation note, this could be a little bit faster (at
> build/configure time), though not necessarily nicer, by having
> src/Makefile.am not try to build convenience libraries for versions of
> C++ that provide nothing. I opted not to do this since it'd make
> src/Makefile.am even more complex, and make future changes harder to implement.
> libstdc++ also isn't that slow to build, anyway.
>
> Tested on i686-elf.
>
> Have a good day!
>
> libstdc++-v3/Makefile.am | 4 ++--
> libstdc++-v3/Makefile.in | 4 ++--
> libstdc++-v3/src/Makefile.am | 6 +++++
> libstdc++-v3/src/Makefile.in | 8 +++++--
> libstdc++-v3/src/c++11/Makefile.am | 16 ++++++++++---
> libstdc++-v3/src/c++11/Makefile.in | 37 +++++++++++++++++++-----------
> libstdc++-v3/src/c++17/Makefile.am | 4 ++++
> libstdc++-v3/src/c++17/Makefile.in | 6 +++--
> libstdc++-v3/src/c++20/Makefile.am | 4 ++++
> libstdc++-v3/src/c++20/Makefile.in | 6 +++--
> libstdc++-v3/src/c++98/Makefile.am | 4 ++++
> libstdc++-v3/src/c++98/Makefile.in | 6 +++--
> 12 files changed, 77 insertions(+), 28 deletions(-)
>
> diff --git a/libstdc++-v3/Makefile.am b/libstdc++-v3/Makefile.am
> index 0d147ad3ffe..d7f2b6e76a5 100644
> --- a/libstdc++-v3/Makefile.am
> +++ b/libstdc++-v3/Makefile.am
> @@ -24,11 +24,11 @@ include $(top_srcdir)/fragment.am
>
> if GLIBCXX_HOSTED
> ## Note that python must come after src.
> - hosted_source = src doc po testsuite python
> + hosted_source = doc po testsuite python
> endif
>
> ## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE.
> -SUBDIRS = include libsupc++ $(hosted_source)
> +SUBDIRS = include libsupc++ src $(hosted_source)
>
> ACLOCAL_AMFLAGS = -I . -I .. -I ../config
>
> diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
> index b83c222d51d..4eb78e76297 100644
> --- a/libstdc++-v3/src/Makefile.am
> +++ b/libstdc++-v3/src/Makefile.am
> @@ -121,7 +121,13 @@ cxx11_sources = \
> ${cxx0x_compat_sources} \
> ${ldbl_alt128_compat_sources}
>
> +if GLIBCXX_HOSTED
> libstdc___la_SOURCES = $(cxx98_sources) $(cxx11_sources)
> +else
> +# When freestanding, there's currently no compatibility to preserve. Should
> +# that change, any compatibility sources can be added here.
> +libstdc___la_SOURCES =
> +endif
>
> libstdc___la_LIBADD = \
> $(GLIBCXX_LIBS) \
> diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am
> index ecd46aafc01..72f05100c98 100644
> --- a/libstdc++-v3/src/c++11/Makefile.am
> +++ b/libstdc++-v3/src/c++11/Makefile.am
> @@ -51,6 +51,10 @@ else
> cxx11_abi_sources =
> endif
>
> +sources_freestanding = \
> + limits.cc \
> + placeholders.cc
> +
> sources = \
> chrono.cc \
> codecvt.cc \
> @@ -66,9 +70,7 @@ sources = \
> hashtable_c++0x.cc \
> ios.cc \
> ios_errcat.cc \
> - limits.cc \
> mutex.cc \
> - placeholders.cc \
> random.cc \
> regex.cc \
> shared_ptr.cc \
> @@ -118,7 +120,15 @@ endif
>
> vpath % $(top_srcdir)/src/c++11
>
> -libc__11convenience_la_SOURCES = $(sources) $(inst_sources)
> +if !GLIBCXX_HOSTED
> +libc__11convenience_la_SOURCES = $(sources_freestanding)
> +else
> +libc__11convenience_la_SOURCES = \
> + $(sources_freestanding) \
> + $(sources) \
> + $(inst_sources)
> +endif
> +
>
> # Use special rules for the hashtable.cc file so that all
> # the generated template functions are also instantiated.
> diff --git a/libstdc++-v3/src/c++17/Makefile.am b/libstdc++-v3/src/c++17/Makefile.am
> index 3d53f652fac..72095f5b087 100644
> --- a/libstdc++-v3/src/c++17/Makefile.am
> +++ b/libstdc++-v3/src/c++17/Makefile.am
> @@ -60,7 +60,11 @@ sources = \
>
> vpath % $(top_srcdir)/src/c++17
>
> +if GLIBCXX_HOSTED
> libc__17convenience_la_SOURCES = $(sources) $(inst_sources)
> +else
> +libc__17convenience_la_SOURCES =
> +endif
>
> if GLIBCXX_LDBL_ALT128_COMPAT
> floating_from_chars.lo: floating_from_chars.cc
> diff --git a/libstdc++-v3/src/c++20/Makefile.am b/libstdc++-v3/src/c++20/Makefile.am
> index d4c1e26e40e..5c937f7e804 100644
> --- a/libstdc++-v3/src/c++20/Makefile.am
> +++ b/libstdc++-v3/src/c++20/Makefile.am
> @@ -40,7 +40,11 @@ sources =
>
> vpath % $(top_srcdir)/src/c++20
>
> +if GLIBCXX_HOSTED
> libc__20convenience_la_SOURCES = $(sources) $(inst_sources)
> +else
> +libc__20convenience_la_SOURCES =
> +endif
>
> # AM_CXXFLAGS needs to be in each subdirectory so that it can be
> # modified in a per-library or per-sub-library way. Need to manually
> diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am
> index b96588bd95c..f7134d80027 100644
> --- a/libstdc++-v3/src/c++98/Makefile.am
> +++ b/libstdc++-v3/src/c++98/Makefile.am
> @@ -148,7 +148,11 @@ sources = \
>
> vpath % $(top_srcdir)/src/c++98
>
> +if GLIBCXX_HOSTED
> libc__98convenience_la_SOURCES = $(sources)
> +else
> +libc__98convenience_la_SOURCES =
> +endif
>
> # Use special rules to compile with -fimplicit-templates.
> c++locale.lo: c++locale.cc
> # Use special rules for the deprecated source files so that they find
> --
> 2.38.1
>
Jonathan Wakely <jwakely@redhat.com> writes:
> On Thu, 20 Oct 2022 at 16:53, Arsen Arsenović via Libstdc++
> <libstdc++@gcc.gnu.org> wrote:
>>
>> This enables us to provide symbols for placeholders and numeric limits,
>
>
> I'm not convinced this is worth doing.
>
> The placeholders and the numeric_limits members are all inline
> variables for C++17 and later, and C++17 is the compiler's default
> mode. The placeholders aren't even required to exist for freestanding
> prior to C++23. For the numeric_limits definitions, I suppose it is a
> problem that users can't take their address in freestanding today
> unless they compile as C++17.
>
>> and allows users to mess about with linker flags less.
>
> i.e. they don't have to use -nostdlib and/or link with gcc -lsupc++,
> but can just use g++?
>
> That seems more compelling than providing definitions of the
> placeholders and limits members.
Indeed, with just a few more changes that I didn't get the chance to
polish up before S3 (setting the MATH_LIBRARY target macro to "" and
disabling linking crt0 when building --without-headers
--without-newlib), and the other patches I did submit, I could get a
freestanding test program building with just -nolibc:
i686-elf-g++ -ffreestanding -ggdb3 -O2 -fno-omit-frame-pointer \
-std=gnu++20 -T ../linkscript.ld -nolibc \
-Wl,-z,max-page-size=0x1000 -o frello frello-main.o frello-abort.o \
-frello-support.o frello-memory.o frello-logging.o frello-assert.o \
frello-entry.o
Most of these flags serve unrelated purposes, and the linker script is
the default one for this configuration, with some sections shifted
about.
Have a great evening!
This is pushed to trunk now.
On Thu, 20 Oct 2022 at 16:53, Arsen Arsenović via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> This enables us to provide symbols for placeholders and numeric limits,
> and allows users to mess about with linker flags less.
>
> libstdc++-v3/ChangeLog:
>
> * Makefile.am [!_GLIBCXX_HOSTED]: Enable src/ subdirectory.
> * Makefile.in: Regenerate.
> * src/Makefile.am [!_GLIBCXX_HOSTED]: Omit compatibility files.
> There's no history to be compatible with.
> * src/c++11/Makefile.am [!_GLIBCXX_HOSTED]: Omit hosted-only
> source files from the build.
> * src/c++17/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/c++20/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/c++98/Makefile.am [!_GLIBCXX_HOSTED]: Likewise.
> * src/Makefile.in: Regenerate.
> * src/c++11/Makefile.in: Regenerate.
> * src/c++17/Makefile.in: Regenerate.
> * src/c++20/Makefile.in: Regenerate.
> * src/c++98/Makefile.in: Regenerate.
> ---
> Afternoon,
>
> With these changes, when we aren't hosted, we get a libstdc++ library that
> contains only library facilities available in freestanding (i.e. placeholders
> and limits.cc). This is, AFAICT, the only code in libstdc++.{a,so} that can
> (and should) be available in freestanding.
>
> As an implementation note, this could be a little bit faster (at
> build/configure time), though not necessarily nicer, by having
> src/Makefile.am not try to build convenience libraries for versions of
> C++ that provide nothing. I opted not to do this since it'd make
> src/Makefile.am even more complex, and make future changes harder to implement.
> libstdc++ also isn't that slow to build, anyway.
>
> Tested on i686-elf.
>
> Have a good day!
>
> libstdc++-v3/Makefile.am | 4 ++--
> libstdc++-v3/Makefile.in | 4 ++--
> libstdc++-v3/src/Makefile.am | 6 +++++
> libstdc++-v3/src/Makefile.in | 8 +++++--
> libstdc++-v3/src/c++11/Makefile.am | 16 ++++++++++---
> libstdc++-v3/src/c++11/Makefile.in | 37 +++++++++++++++++++-----------
> libstdc++-v3/src/c++17/Makefile.am | 4 ++++
> libstdc++-v3/src/c++17/Makefile.in | 6 +++--
> libstdc++-v3/src/c++20/Makefile.am | 4 ++++
> libstdc++-v3/src/c++20/Makefile.in | 6 +++--
> libstdc++-v3/src/c++98/Makefile.am | 4 ++++
> libstdc++-v3/src/c++98/Makefile.in | 6 +++--
> 12 files changed, 77 insertions(+), 28 deletions(-)
>
> diff --git a/libstdc++-v3/Makefile.am b/libstdc++-v3/Makefile.am
> index 0d147ad3ffe..d7f2b6e76a5 100644
> --- a/libstdc++-v3/Makefile.am
> +++ b/libstdc++-v3/Makefile.am
> @@ -24,11 +24,11 @@ include $(top_srcdir)/fragment.am
>
> if GLIBCXX_HOSTED
> ## Note that python must come after src.
> - hosted_source = src doc po testsuite python
> + hosted_source = doc po testsuite python
> endif
>
> ## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE.
> -SUBDIRS = include libsupc++ $(hosted_source)
> +SUBDIRS = include libsupc++ src $(hosted_source)
>
> ACLOCAL_AMFLAGS = -I . -I .. -I ../config
>
> diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
> index b83c222d51d..4eb78e76297 100644
> --- a/libstdc++-v3/src/Makefile.am
> +++ b/libstdc++-v3/src/Makefile.am
> @@ -121,7 +121,13 @@ cxx11_sources = \
> ${cxx0x_compat_sources} \
> ${ldbl_alt128_compat_sources}
>
> +if GLIBCXX_HOSTED
> libstdc___la_SOURCES = $(cxx98_sources) $(cxx11_sources)
> +else
> +# When freestanding, there's currently no compatibility to preserve. Should
> +# that change, any compatibility sources can be added here.
> +libstdc___la_SOURCES =
> +endif
>
> libstdc___la_LIBADD = \
> $(GLIBCXX_LIBS) \
> diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am
> index ecd46aafc01..72f05100c98 100644
> --- a/libstdc++-v3/src/c++11/Makefile.am
> +++ b/libstdc++-v3/src/c++11/Makefile.am
> @@ -51,6 +51,10 @@ else
> cxx11_abi_sources =
> endif
>
> +sources_freestanding = \
> + limits.cc \
> + placeholders.cc
> +
> sources = \
> chrono.cc \
> codecvt.cc \
> @@ -66,9 +70,7 @@ sources = \
> hashtable_c++0x.cc \
> ios.cc \
> ios_errcat.cc \
> - limits.cc \
> mutex.cc \
> - placeholders.cc \
> random.cc \
> regex.cc \
> shared_ptr.cc \
> @@ -118,7 +120,15 @@ endif
>
> vpath % $(top_srcdir)/src/c++11
>
> -libc__11convenience_la_SOURCES = $(sources) $(inst_sources)
> +if !GLIBCXX_HOSTED
> +libc__11convenience_la_SOURCES = $(sources_freestanding)
> +else
> +libc__11convenience_la_SOURCES = \
> + $(sources_freestanding) \
> + $(sources) \
> + $(inst_sources)
> +endif
> +
>
> # Use special rules for the hashtable.cc file so that all
> # the generated template functions are also instantiated.
> diff --git a/libstdc++-v3/src/c++17/Makefile.am b/libstdc++-v3/src/c++17/Makefile.am
> index 3d53f652fac..72095f5b087 100644
> --- a/libstdc++-v3/src/c++17/Makefile.am
> +++ b/libstdc++-v3/src/c++17/Makefile.am
> @@ -60,7 +60,11 @@ sources = \
>
> vpath % $(top_srcdir)/src/c++17
>
> +if GLIBCXX_HOSTED
> libc__17convenience_la_SOURCES = $(sources) $(inst_sources)
> +else
> +libc__17convenience_la_SOURCES =
> +endif
>
> if GLIBCXX_LDBL_ALT128_COMPAT
> floating_from_chars.lo: floating_from_chars.cc
> diff --git a/libstdc++-v3/src/c++20/Makefile.am b/libstdc++-v3/src/c++20/Makefile.am
> index d4c1e26e40e..5c937f7e804 100644
> --- a/libstdc++-v3/src/c++20/Makefile.am
> +++ b/libstdc++-v3/src/c++20/Makefile.am
> @@ -40,7 +40,11 @@ sources =
>
> vpath % $(top_srcdir)/src/c++20
>
> +if GLIBCXX_HOSTED
> libc__20convenience_la_SOURCES = $(sources) $(inst_sources)
> +else
> +libc__20convenience_la_SOURCES =
> +endif
>
> # AM_CXXFLAGS needs to be in each subdirectory so that it can be
> # modified in a per-library or per-sub-library way. Need to manually
> diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am
> index b96588bd95c..f7134d80027 100644
> --- a/libstdc++-v3/src/c++98/Makefile.am
> +++ b/libstdc++-v3/src/c++98/Makefile.am
> @@ -148,7 +148,11 @@ sources = \
>
> vpath % $(top_srcdir)/src/c++98
>
> +if GLIBCXX_HOSTED
> libc__98convenience_la_SOURCES = $(sources)
> +else
> +libc__98convenience_la_SOURCES =
> +endif
>
> # Use special rules to compile with -fimplicit-templates.
> c++locale.lo: c++locale.cc
> # Use special rules for the deprecated source files so that they find
> --
> 2.38.1
>
@@ -24,11 +24,11 @@ include $(top_srcdir)/fragment.am
if GLIBCXX_HOSTED
## Note that python must come after src.
- hosted_source = src doc po testsuite python
+ hosted_source = doc po testsuite python
endif
## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE.
-SUBDIRS = include libsupc++ $(hosted_source)
+SUBDIRS = include libsupc++ src $(hosted_source)
ACLOCAL_AMFLAGS = -I . -I .. -I ../config
@@ -121,7 +121,13 @@ cxx11_sources = \
${cxx0x_compat_sources} \
${ldbl_alt128_compat_sources}
+if GLIBCXX_HOSTED
libstdc___la_SOURCES = $(cxx98_sources) $(cxx11_sources)
+else
+# When freestanding, there's currently no compatibility to preserve. Should
+# that change, any compatibility sources can be added here.
+libstdc___la_SOURCES =
+endif
libstdc___la_LIBADD = \
$(GLIBCXX_LIBS) \
@@ -51,6 +51,10 @@ else
cxx11_abi_sources =
endif
+sources_freestanding = \
+ limits.cc \
+ placeholders.cc
+
sources = \
chrono.cc \
codecvt.cc \
@@ -66,9 +70,7 @@ sources = \
hashtable_c++0x.cc \
ios.cc \
ios_errcat.cc \
- limits.cc \
mutex.cc \
- placeholders.cc \
random.cc \
regex.cc \
shared_ptr.cc \
@@ -118,7 +120,15 @@ endif
vpath % $(top_srcdir)/src/c++11
-libc__11convenience_la_SOURCES = $(sources) $(inst_sources)
+if !GLIBCXX_HOSTED
+libc__11convenience_la_SOURCES = $(sources_freestanding)
+else
+libc__11convenience_la_SOURCES = \
+ $(sources_freestanding) \
+ $(sources) \
+ $(inst_sources)
+endif
+
# Use special rules for the hashtable.cc file so that all
# the generated template functions are also instantiated.
@@ -60,7 +60,11 @@ sources = \
vpath % $(top_srcdir)/src/c++17
+if GLIBCXX_HOSTED
libc__17convenience_la_SOURCES = $(sources) $(inst_sources)
+else
+libc__17convenience_la_SOURCES =
+endif
if GLIBCXX_LDBL_ALT128_COMPAT
floating_from_chars.lo: floating_from_chars.cc
@@ -40,7 +40,11 @@ sources =
vpath % $(top_srcdir)/src/c++20
+if GLIBCXX_HOSTED
libc__20convenience_la_SOURCES = $(sources) $(inst_sources)
+else
+libc__20convenience_la_SOURCES =
+endif
# AM_CXXFLAGS needs to be in each subdirectory so that it can be
# modified in a per-library or per-sub-library way. Need to manually
@@ -148,7 +148,11 @@ sources = \
vpath % $(top_srcdir)/src/c++98
+if GLIBCXX_HOSTED
libc__98convenience_la_SOURCES = $(sources)
+else
+libc__98convenience_la_SOURCES =
+endif
# Use special rules to compile with -fimplicit-templates.
c++locale.lo: c++locale.cc