Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence

2023-10-24 Thread Richard Biener
On Mon, Oct 23, 2023 at 6:41 PM Sergei Trofimovich  wrote:
>
> On Mon, 23 Oct 2023 13:54:01 +0100
> Iain Sandoe  wrote:
>
> > hi Sergei,
> >
> > > On 23 Oct 2023, at 13:43, Sergei Trofimovich  wrote:
> > >
> > > From: Sergei Trofimovich 
> > >
> > > To build `libc` for a target one needs to build `gcc` without `libc`
> > > support first. Commit r14-4823-g8abddb187b3348 "libgcc: support
> > > heap-based trampolines" added unconditional `libc` dependency and broke
> > > libc-less `gcc` builds.
> > >
> > > An example failure on `x86_64-unknown-linux-gnu`:
> > >
> > >$ mkdir -p /tmp/empty
> > >$ ../gcc/configure \
> > >--disable-multilib \
> > >--without-headers \
> > >--with-newlib \
> > >--enable-languages=c \
> > >--disable-bootstrap \
> > >--disable-gcov \
> > >--disable-threads \
> > >--disable-shared \
> > >--disable-libssp \
> > >--disable-libquadmath \
> > >--disable-libgomp \
> > >--disable-libatomic \
> > >--with-build-sysroot=/tmp/empty
> > >$ make
> > >...
> > >/tmp/gb/./gcc/xgcc -B/tmp/gb/./gcc/ 
> > > -B/usr/local/x86_64-pc-linux-gnu/bin/ 
> > > -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem 
> > > /usr/local/x86_64-pc-linux-gnu/include -isystem 
> > > /usr/local/x86_64-pc-linux-gnu/sys-include --sysroot=/tmp/empty   -g -O2 
> > > -O2  -g -O2 -DIN_GCC   -W -Wall -Wno-narrowing -Wwrite-strings 
> > > -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes 
> > > -Wold-style-definition  -isystem ./include  -fpic -mlong-double-80 
> > > -DUSE_ELF_SYMVER -fcf-protection -mshstk -g -DIN_LIBGCC2 
> > > -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fpic 
> > > -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -I. -I. 
> > > -I../.././gcc -I/home/slyfox/dev/git/gcc/libgcc 
> > > -I/home/slyfox/dev/git/gcc/libgcc/. 
> > > -I/home/slyfox/dev/git/gcc/libgcc/../gcc 
> > > -I/home/slyfox/dev/git/gcc/libgcc/../include  -DHAVE_CC_TLS  -DUSE_TLS  
> > > -o heap-trampoline.o -MT heap-trampoline.o -MD -MP -MF 
> > > heap-trampoline.dep  -c .../gcc/libgcc/config/i386/heap-trampoline.c 
> > > -fvisibility=hidden -DHIDE_EXPORTS
> > >../gcc/libgcc/config/i386/heap-trampoline.c:3:10: fatal error: 
> > > unistd.h: No such file or directory
> > >3 | #include 
> > >  |  ^~
> > >compilation terminated.
> > >make[2]: *** [.../gcc/libgcc/static-object.mk:17: heap-trampoline.o] 
> > > Error 1
> > >make[2]: Leaving directory '/tmp/gb/x86_64-pc-linux-gnu/libgcc'
> > >make[1]: *** [Makefile:13307: all-target-libgcc] Error 2
> > >
> > > The change inhibits any heap-based trampoline code.
> >
> > That looks reasonable to me (I was considering using __has_include(), but 
> > the inhibit_libc is neater).
> >
> > The fact that this first compiler is buit without heap-trampoline support, 
> > would become relevant, I guess if libc wanted to use them, it would need 
> > another iteration.
> >
> > so, it looks fine, but I cannot actually approve it.
>
> Sounds good. Let's wait for others to chime in. Maybe Richard? :)

OK.

> AFAIU libcs (like `glibc`) try hard not to use link tests and uses
> mainly preprocessor and code generator to specifically accommodate this
> case. Maybe there is a way to pass the support flag to libc without the
> reliance on code presence in libgcc.
>
> Otherwise we could use __builtin_trap() as an implementation for exposed
> symbols.
>
> >
> > >
> > > libgcc/
> > >
> > > * libgcc/config/aarch64/heap-trampoline.c: Disable when libc is
> > >   not present.
> > > ---
> > > libgcc/config/aarch64/heap-trampoline.c | 5 +
> > > libgcc/config/i386/heap-trampoline.c| 5 +
> > > 2 files changed, 10 insertions(+)
> > >
> > > diff --git a/libgcc/config/aarch64/heap-trampoline.c 
> > > b/libgcc/config/aarch64/heap-trampoline.c
> > > index c8b83681ed7..f22233987ca 100644
> > > --- a/libgcc/config/aarch64/heap-trampoline.c
> > > +++ b/libgcc/config/aarch64/heap-trampoline.c
> > > @@ -1,5 +1,8 @@
> > > /* Copyright The GNU Toolchain Authors. */
> > >
> > > +/* libc is required to allocate trampolines.  */
> > > +#ifndef inhibit_libc
> > > +
> > > #include 
> > > #include 
> > > #include 
> > > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
> > >   tramp_ctrl_curr = prev;
> > > }
> > > }
> > > +
> > > +#endif /* !inhibit_libc */
> > > diff --git a/libgcc/config/i386/heap-trampoline.c 
> > > b/libgcc/config/i386/heap-trampoline.c
> > > index 96e13bf828e..4b9f4365868 100644
> > > --- a/libgcc/config/i386/heap-trampoline.c
> > > +++ b/libgcc/config/i386/heap-trampoline.c
> > > @@ -1,5 +1,8 @@
> > > /* Copyright The GNU Toolchain Authors. */
> > >
> > > +/* libc is required to allocate trampolines.  */
> > > +#ifndef inhibit_libc
> > > +
> > > #include 
> > > #include 
> > > #include 
> > > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
> > >   tramp_ctrl_curr = prev;
> > > }
> > 

Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence

2023-10-23 Thread Sergei Trofimovich
On Mon, 23 Oct 2023 13:54:01 +0100
Iain Sandoe  wrote:

> hi Sergei,
> 
> > On 23 Oct 2023, at 13:43, Sergei Trofimovich  wrote:
> > 
> > From: Sergei Trofimovich 
> > 
> > To build `libc` for a target one needs to build `gcc` without `libc`
> > support first. Commit r14-4823-g8abddb187b3348 "libgcc: support
> > heap-based trampolines" added unconditional `libc` dependency and broke
> > libc-less `gcc` builds.
> > 
> > An example failure on `x86_64-unknown-linux-gnu`:
> > 
> >$ mkdir -p /tmp/empty
> >$ ../gcc/configure \
> >--disable-multilib \
> >--without-headers \
> >--with-newlib \
> >--enable-languages=c \
> >--disable-bootstrap \
> >--disable-gcov \
> >--disable-threads \
> >--disable-shared \
> >--disable-libssp \
> >--disable-libquadmath \
> >--disable-libgomp \
> >--disable-libatomic \
> >--with-build-sysroot=/tmp/empty
> >$ make
> >...
> >/tmp/gb/./gcc/xgcc -B/tmp/gb/./gcc/ 
> > -B/usr/local/x86_64-pc-linux-gnu/bin/ -B/usr/local/x86_64-pc-linux-gnu/lib/ 
> > -isystem /usr/local/x86_64-pc-linux-gnu/include -isystem 
> > /usr/local/x86_64-pc-linux-gnu/sys-include --sysroot=/tmp/empty   -g -O2 
> > -O2  -g -O2 -DIN_GCC   -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual 
> > -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem 
> > ./include  -fpic -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk 
> > -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fpic 
> > -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -I. -I. 
> > -I../.././gcc -I/home/slyfox/dev/git/gcc/libgcc 
> > -I/home/slyfox/dev/git/gcc/libgcc/. 
> > -I/home/slyfox/dev/git/gcc/libgcc/../gcc 
> > -I/home/slyfox/dev/git/gcc/libgcc/../include  -DHAVE_CC_TLS  -DUSE_TLS  -o 
> > heap-trampoline.o -MT heap-trampoline.o -MD -MP -MF heap-trampoline.dep  -c 
> > .../gcc/libgcc/config/i386/heap-trampoline.c -fvisibility=hidden 
> > -DHIDE_EXPORTS
> >../gcc/libgcc/config/i386/heap-trampoline.c:3:10: fatal error: unistd.h: 
> > No such file or directory
> >3 | #include 
> >  |  ^~
> >compilation terminated.
> >make[2]: *** [.../gcc/libgcc/static-object.mk:17: heap-trampoline.o] 
> > Error 1
> >make[2]: Leaving directory '/tmp/gb/x86_64-pc-linux-gnu/libgcc'
> >make[1]: *** [Makefile:13307: all-target-libgcc] Error 2
> > 
> > The change inhibits any heap-based trampoline code.  
> 
> That looks reasonable to me (I was considering using __has_include(), but the 
> inhibit_libc is neater).
> 
> The fact that this first compiler is buit without heap-trampoline support, 
> would become relevant, I guess if libc wanted to use them, it would need 
> another iteration.
> 
> so, it looks fine, but I cannot actually approve it.

Sounds good. Let's wait for others to chime in. Maybe Richard? :)

AFAIU libcs (like `glibc`) try hard not to use link tests and uses
mainly preprocessor and code generator to specifically accommodate this
case. Maybe there is a way to pass the support flag to libc without the
reliance on code presence in libgcc.

Otherwise we could use __builtin_trap() as an implementation for exposed
symbols.

> 
> > 
> > libgcc/
> > 
> > * libgcc/config/aarch64/heap-trampoline.c: Disable when libc is
> >   not present.
> > ---
> > libgcc/config/aarch64/heap-trampoline.c | 5 +
> > libgcc/config/i386/heap-trampoline.c| 5 +
> > 2 files changed, 10 insertions(+)
> > 
> > diff --git a/libgcc/config/aarch64/heap-trampoline.c 
> > b/libgcc/config/aarch64/heap-trampoline.c
> > index c8b83681ed7..f22233987ca 100644
> > --- a/libgcc/config/aarch64/heap-trampoline.c
> > +++ b/libgcc/config/aarch64/heap-trampoline.c
> > @@ -1,5 +1,8 @@
> > /* Copyright The GNU Toolchain Authors. */
> > 
> > +/* libc is required to allocate trampolines.  */
> > +#ifndef inhibit_libc
> > +
> > #include 
> > #include 
> > #include 
> > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
> >   tramp_ctrl_curr = prev;
> > }
> > }
> > +
> > +#endif /* !inhibit_libc */
> > diff --git a/libgcc/config/i386/heap-trampoline.c 
> > b/libgcc/config/i386/heap-trampoline.c
> > index 96e13bf828e..4b9f4365868 100644
> > --- a/libgcc/config/i386/heap-trampoline.c
> > +++ b/libgcc/config/i386/heap-trampoline.c
> > @@ -1,5 +1,8 @@
> > /* Copyright The GNU Toolchain Authors. */
> > 
> > +/* libc is required to allocate trampolines.  */
> > +#ifndef inhibit_libc
> > +
> > #include 
> > #include 
> > #include 
> > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
> >   tramp_ctrl_curr = prev;
> > }
> > }
> > +
> > +#endif /* !inhibit_libc */
> > -- 
> > 2.42.0
> >   
> 


-- 

  Sergei


Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence

2023-10-23 Thread Iain Sandoe
hi Sergei,

> On 23 Oct 2023, at 13:43, Sergei Trofimovich  wrote:
> 
> From: Sergei Trofimovich 
> 
> To build `libc` for a target one needs to build `gcc` without `libc`
> support first. Commit r14-4823-g8abddb187b3348 "libgcc: support
> heap-based trampolines" added unconditional `libc` dependency and broke
> libc-less `gcc` builds.
> 
> An example failure on `x86_64-unknown-linux-gnu`:
> 
>$ mkdir -p /tmp/empty
>$ ../gcc/configure \
>--disable-multilib \
>--without-headers \
>--with-newlib \
>--enable-languages=c \
>--disable-bootstrap \
>--disable-gcov \
>--disable-threads \
>--disable-shared \
>--disable-libssp \
>--disable-libquadmath \
>--disable-libgomp \
>--disable-libatomic \
>--with-build-sysroot=/tmp/empty
>$ make
>...
>/tmp/gb/./gcc/xgcc -B/tmp/gb/./gcc/ -B/usr/local/x86_64-pc-linux-gnu/bin/ 
> -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem 
> /usr/local/x86_64-pc-linux-gnu/include -isystem 
> /usr/local/x86_64-pc-linux-gnu/sys-include --sysroot=/tmp/empty   -g -O2 -O2  
> -g -O2 -DIN_GCC   -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual 
> -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem 
> ./include  -fpic -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -g 
> -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fpic 
> -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -I. -I. 
> -I../.././gcc -I/home/slyfox/dev/git/gcc/libgcc 
> -I/home/slyfox/dev/git/gcc/libgcc/. -I/home/slyfox/dev/git/gcc/libgcc/../gcc 
> -I/home/slyfox/dev/git/gcc/libgcc/../include  -DHAVE_CC_TLS  -DUSE_TLS  -o 
> heap-trampoline.o -MT heap-trampoline.o -MD -MP -MF heap-trampoline.dep  -c 
> .../gcc/libgcc/config/i386/heap-trampoline.c -fvisibility=hidden 
> -DHIDE_EXPORTS
>../gcc/libgcc/config/i386/heap-trampoline.c:3:10: fatal error: unistd.h: 
> No such file or directory
>3 | #include 
>  |  ^~
>compilation terminated.
>make[2]: *** [.../gcc/libgcc/static-object.mk:17: heap-trampoline.o] Error 
> 1
>make[2]: Leaving directory '/tmp/gb/x86_64-pc-linux-gnu/libgcc'
>make[1]: *** [Makefile:13307: all-target-libgcc] Error 2
> 
> The change inhibits any heap-based trampoline code.

That looks reasonable to me (I was considering using __has_include(), but the 
inhibit_libc is neater).

The fact that this first compiler is buit without heap-trampoline support, 
would become relevant, I guess if libc wanted to use them, it would need 
another iteration.

so, it looks fine, but I cannot actually approve it.
Iain

> 
> libgcc/
> 
>   * libgcc/config/aarch64/heap-trampoline.c: Disable when libc is
> not present.
> ---
> libgcc/config/aarch64/heap-trampoline.c | 5 +
> libgcc/config/i386/heap-trampoline.c| 5 +
> 2 files changed, 10 insertions(+)
> 
> diff --git a/libgcc/config/aarch64/heap-trampoline.c 
> b/libgcc/config/aarch64/heap-trampoline.c
> index c8b83681ed7..f22233987ca 100644
> --- a/libgcc/config/aarch64/heap-trampoline.c
> +++ b/libgcc/config/aarch64/heap-trampoline.c
> @@ -1,5 +1,8 @@
> /* Copyright The GNU Toolchain Authors. */
> 
> +/* libc is required to allocate trampolines.  */
> +#ifndef inhibit_libc
> +
> #include 
> #include 
> #include 
> @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
>   tramp_ctrl_curr = prev;
> }
> }
> +
> +#endif /* !inhibit_libc */
> diff --git a/libgcc/config/i386/heap-trampoline.c 
> b/libgcc/config/i386/heap-trampoline.c
> index 96e13bf828e..4b9f4365868 100644
> --- a/libgcc/config/i386/heap-trampoline.c
> +++ b/libgcc/config/i386/heap-trampoline.c
> @@ -1,5 +1,8 @@
> /* Copyright The GNU Toolchain Authors. */
> 
> +/* libc is required to allocate trampolines.  */
> +#ifndef inhibit_libc
> +
> #include 
> #include 
> #include 
> @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
>   tramp_ctrl_curr = prev;
> }
> }
> +
> +#endif /* !inhibit_libc */
> -- 
> 2.42.0
> 



[PATCH] libgcc: make heap-based trampolines conditional on libc presence

2023-10-23 Thread Sergei Trofimovich
From: Sergei Trofimovich 

To build `libc` for a target one needs to build `gcc` without `libc`
support first. Commit r14-4823-g8abddb187b3348 "libgcc: support
heap-based trampolines" added unconditional `libc` dependency and broke
libc-less `gcc` builds.

An example failure on `x86_64-unknown-linux-gnu`:

$ mkdir -p /tmp/empty
$ ../gcc/configure \
--disable-multilib \
--without-headers \
--with-newlib \
--enable-languages=c \
--disable-bootstrap \
--disable-gcov \
--disable-threads \
--disable-shared \
--disable-libssp \
--disable-libquadmath \
--disable-libgomp \
--disable-libatomic \
--with-build-sysroot=/tmp/empty
$ make
...
/tmp/gb/./gcc/xgcc -B/tmp/gb/./gcc/ -B/usr/local/x86_64-pc-linux-gnu/bin/ 
-B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem 
/usr/local/x86_64-pc-linux-gnu/include -isystem 
/usr/local/x86_64-pc-linux-gnu/sys-include --sysroot=/tmp/empty   -g -O2 -O2  
-g -O2 -DIN_GCC   -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual 
-Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem 
./include  -fpic -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -g 
-DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fpic 
-mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -I. -I. -I../.././gcc 
-I/home/slyfox/dev/git/gcc/libgcc -I/home/slyfox/dev/git/gcc/libgcc/. 
-I/home/slyfox/dev/git/gcc/libgcc/../gcc 
-I/home/slyfox/dev/git/gcc/libgcc/../include  -DHAVE_CC_TLS  -DUSE_TLS  -o 
heap-trampoline.o -MT heap-trampoline.o -MD -MP -MF heap-trampoline.dep  -c 
.../gcc/libgcc/config/i386/heap-trampoline.c -fvisibility=hidden -DHIDE_EXPORTS
../gcc/libgcc/config/i386/heap-trampoline.c:3:10: fatal error: unistd.h: No 
such file or directory
3 | #include 
  |  ^~
compilation terminated.
make[2]: *** [.../gcc/libgcc/static-object.mk:17: heap-trampoline.o] Error 1
make[2]: Leaving directory '/tmp/gb/x86_64-pc-linux-gnu/libgcc'
make[1]: *** [Makefile:13307: all-target-libgcc] Error 2

The change inhibits any heap-based trampoline code.

libgcc/

* libgcc/config/aarch64/heap-trampoline.c: Disable when libc is
  not present.
---
 libgcc/config/aarch64/heap-trampoline.c | 5 +
 libgcc/config/i386/heap-trampoline.c| 5 +
 2 files changed, 10 insertions(+)

diff --git a/libgcc/config/aarch64/heap-trampoline.c 
b/libgcc/config/aarch64/heap-trampoline.c
index c8b83681ed7..f22233987ca 100644
--- a/libgcc/config/aarch64/heap-trampoline.c
+++ b/libgcc/config/aarch64/heap-trampoline.c
@@ -1,5 +1,8 @@
 /* Copyright The GNU Toolchain Authors. */
 
+/* libc is required to allocate trampolines.  */
+#ifndef inhibit_libc
+
 #include 
 #include 
 #include 
@@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
   tramp_ctrl_curr = prev;
 }
 }
+
+#endif /* !inhibit_libc */
diff --git a/libgcc/config/i386/heap-trampoline.c 
b/libgcc/config/i386/heap-trampoline.c
index 96e13bf828e..4b9f4365868 100644
--- a/libgcc/config/i386/heap-trampoline.c
+++ b/libgcc/config/i386/heap-trampoline.c
@@ -1,5 +1,8 @@
 /* Copyright The GNU Toolchain Authors. */
 
+/* libc is required to allocate trampolines.  */
+#ifndef inhibit_libc
+
 #include 
 #include 
 #include 
@@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void)
   tramp_ctrl_curr = prev;
 }
 }
+
+#endif /* !inhibit_libc */
-- 
2.42.0