Hello, this 4-year-old patch of mine was never reviewed. Per 
https://github.com/NixOS/nixpkgs/pull/414299, we in a package set / distro, 
Nixpkgs/NixOS, just began (albeit on an experimental basis) packaging GCC with 
this patch (among others) applied. It would thus be nice to get it applied 
upstream --- if changes are needed, of course we can make them and resubmit.

(The is also visible at 
https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/compilers/gcc/ng/15/gcc/custom-threading-model.patch.)

This is I think the conceptually simplest patch/series of the ones we have in 
there, so a good one to start with. (I think it would be unnecessary 
complicated to discuss them all at once.)

Thanks in advance,

John

On Wed, Aug 18, 2021, at 4:38 PM, John Ericson wrote:
> From: John Ericson <g...@johnericson.me>
> 
> Previously, they always scraped the thread mode from `$CC -v', now, that
> is the default but one may pass `--with-threads=MODEL` to be explicit
> instead.
> 
> One use-case is bootstraping with a shorter critical path. The
> traditionally route was to build an entire "static stage" GCC, build
> libc, and then build GCC again supporting dynamic linking,
> multithreading, etc. But this is wasteful in that GCC itself is built
> twice.
> 
> With this change, rather than having to mess with spec files we can just
> configure the runtime libraries the way we want directly. In turn, that
> opens to just building libgcc twice rather than all of GCC.
> 
> Frankly, specs were always a rather indirect approach to coordinate this
> during GCC's bootstrap, since GCC itself really doesn't care what the
> threading model is, just that the runtime libraries agree among
> themselves. Relying on a hard-coded spec for this also keeps us one step
> further from the long-term goal of multi-target GCC, for what it's
> worth.
> 
> For the record, "single stage" builds of GCC have some precedent in
> downstream packaging, for example with [1]. That one, as far as I can
> tell, builds libgcc once, but with the headers of the libc
> implementation provided and then cyclic linking down later. They are
> both fine approaches, but I don't think one should have to be forced
> into cyclic dependencies if they don't want to. That opens the door to
> non-terminating programs due to, e.g., atomics used in a threads
> implementation being lowered to threads absent hardware support.
> 
> Finally, I understand that such custom bootstrapping is not officially
> supported. I don't mean to imply it should be --- a lot more cleanup
> work to the build system would be necessary before supporting it
> wouldn't be a huge additional maintainer burden --- I just hope to add a
> reasonable knob for those comfortable with doing unsupported things
> already.
> 
> [1]: https://github.com/richfelker/musl-cross-make
> ---
> config/gthr.m4              | 32 ++++++++++++++++++++++++++++++++
> libatomic/configure.ac      |  4 +---
> libgcc/configure.ac         |  4 +---
> libphobos/m4/druntime/os.m4 |  2 +-
> libstdc++-v3/acinclude.m4   |  8 +++-----
> 5 files changed, 38 insertions(+), 12 deletions(-)
> 
> diff --git a/config/gthr.m4 b/config/gthr.m4
> index 4b937306ad0..c585b618e40 100644
> --- a/config/gthr.m4
> +++ b/config/gthr.m4
> @@ -5,6 +5,35 @@ dnl Public License, this file may be distributed as part of 
> a program
> dnl that contains a configuration script generated by Autoconf, under
> dnl the same distribution terms as the rest of that program.
>  
> +dnl Define thread model
> +
> +dnl usage: GCC_AC_THREAD_MODEL
> +AC_DEFUN([GCC_AC_THREAD_MODEL],
> +[
> +# With threads
> +# Pass with no value to take from compiler's metadata
> +# Pass with a value to specify a thread package
> +# 'single' means single threaded -- without threads.
> +AC_ARG_WITH(threads,
> +[AS_HELP_STRING([[--with-threads=MODEL]],
> + [specify thread model for this GCC
> + runtime library])],,
> +[with_threads=''])
> +
> +if test x"$with_threads" = x'yes'; then
> +    AC_MSG_ERROR([Cannot pass bare --with-threads, must pass explicit 
> --with-threads=MODEL])
> +elif test x"$with_threads" = x'no'; then
> +    target_thread_file=single
> +elif test x"$with_threads" = ''; then
> +    AC_MSG_CHECKING([for thread model used by GCC])
> +    target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
> +    AC_MSG_RESULT([$target_thread_file])
> +else
> +    target_thread_file=$with_threads
> +fi
> +])
> +
> +
> dnl Define header location by thread model
>  
> dnl usage: GCC_AC_THREAD_HEADER([thread_model])
> @@ -22,6 +51,9 @@ case $1 in
>      tpf) thread_header=config/s390/gthr-tpf.h ;;
>      vxworks) thread_header=config/gthr-vxworks.h ;;
>      win32) thread_header=config/i386/gthr-win32.h ;;
> +    *)
> +        AC_MSG_ERROR([No known header for threading model '$1'.])
> +        ;;
> esac
> AC_SUBST(thread_header)
> ])
> diff --git a/libatomic/configure.ac b/libatomic/configure.ac
> index 2a371870c2f..42d2016b7a2 100644
> --- a/libatomic/configure.ac
> +++ b/libatomic/configure.ac
> @@ -161,9 +161,7 @@ libtool_VERSION=3:0:2
> AC_SUBST(libtool_VERSION)
>  
> # Check for used threading-model
> -AC_MSG_CHECKING([for thread model used by GCC])
> -target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
> -AC_MSG_RESULT([$target_thread_file])
> +GCC_AC_THREAD_MODEL
>  
> case "$target" in
>   *aarch64*)
> diff --git a/libgcc/configure.ac b/libgcc/configure.ac
> index 13a80b2551b..1209a0986e0 100644
> --- a/libgcc/configure.ac
> +++ b/libgcc/configure.ac
> @@ -298,9 +298,7 @@ AC_SUBST([use_tm_clone_registry])
>  
> AC_LIB_PROG_LD_GNU
>  
> -AC_MSG_CHECKING([for thread model used by GCC])
> -target_thread_file=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
> -AC_MSG_RESULT([$target_thread_file]) 
> +GCC_AC_THREAD_MODEL
>  
> # Check for assembler CFI support.
> AC_CACHE_CHECK([whether assembler supports CFI directives], [libgcc_cv_cfi],
> diff --git a/libphobos/m4/druntime/os.m4 b/libphobos/m4/druntime/os.m4
> index 351558dbcda..2b44fbca8fc 100644
> --- a/libphobos/m4/druntime/os.m4
> +++ b/libphobos/m4/druntime/os.m4
> @@ -32,7 +32,7 @@ case $1 in
>      # TODO: These targets need porting.
>      dce|mipssde|rtems|tpf|vxworks)
>     DCFG_THREAD_MODEL="Single" ;;
> -    *)     as_fn_error "Thread implementation '$1' not recognised" "$LINENO" 
> 5 ;;
> +    *)     AC_MSG_ERROR([Thread implementation '$1' not recognised]) ;;
> esac
> AC_SUBST(DCFG_THREAD_MODEL)
> ])
> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
> index 90ecc4a87a2..83204176c05 100644
> --- a/libstdc++-v3/acinclude.m4
> +++ b/libstdc++-v3/acinclude.m4
> @@ -3910,9 +3910,7 @@ dnl Substs:
> dnl  thread_header
> dnl
> AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
> -  AC_MSG_CHECKING([for thread model used by GCC])
> -  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
> -  AC_MSG_RESULT([$target_thread_file])
> +  GCC_AC_THREAD_MODEL
>    GCC_AC_THREAD_HEADER([$target_thread_file])
> ])
>  
> @@ -3922,7 +3920,8 @@ dnl Check if gthread implementation defines the types 
> and functions
> dnl required by the c++0x thread library.  Conforming gthread
> dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
> dnl
> -dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
> +dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_ENABLE_THREADS must be done
> +dnl before this.
> dnl
> AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
>    GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
> @@ -3937,7 +3936,6 @@ AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
>    CXXFLAGS="$CXXFLAGS -fno-exceptions \
> -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
>  
> -  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
>    case $target_thread_file in
>      posix)
>        CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
> -- 
> 2.31.1
> 
> 

Reply via email to