On Tue, Aug 17, 2021 at 1:43 AM Sebastian Huber
<sebastian.hu...@embedded-brains.de> wrote:
>
> abort() is used in gcc_assert() and gcc_unreachable() which is used by target
> libraries such as libgcov.a.  This patch changes the abort() definition under
> certain conditions.  If inhibit_libc is defined and abort is not already
> defined, then abort() is defined to __builtin_trap().
>
> The inhibit_libc define is usually defined if GCC is built for targets running
> in embedded systems which may optionally use a C standard library.  If
> inhibit_libc is defined, then there may be still a full featured abort()
> available.  abort() is a heavy weight function which depends on signals and
> file streams.  For statically linked applications, this means that a 
> dependency
> on gcc_assert() pulls in the support for signals and file streams.  This could
> prevent using gcov to test low end targets for example.  Using 
> __builtin_trap()
> avoids these dependencies if the target implements a "trap" instruction.  The
> application or operating system could use a trap handler to react to failed 
> GCC
> runtime checks which caused a trap.

This also breaks sometimes compiling of emutls.c on some targets like uclibc ...
See https://gcc.gnu.org/PR110775 for some more details there.

Thanks,
Andrew

>
> gcc/
>
>         * tsystem.h (abort): Define abort() if inhibit_libc is defined and it
>         is not already defined.
> ---
>  gcc/tsystem.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gcc/tsystem.h b/gcc/tsystem.h
> index e1e6a96a4f48..5c72c69ff3ed 100644
> --- a/gcc/tsystem.h
> +++ b/gcc/tsystem.h
> @@ -59,7 +59,7 @@ extern int atexit (void (*)(void));
>  #endif
>
>  #ifndef abort
> -extern void abort (void) __attribute__ ((__noreturn__));
> +#define abort() __builtin_trap ()
>  #endif
>
>  #ifndef strlen
> --
> 2.26.2
>

Reply via email to