This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: soft-fp: Adjust call to abort for kernel use [committed]


On Fri, Feb 20, 2015 at 06:07:53PM +0000, Joseph Myers wrote:
> soft-fp calls abort in various cases that the code doesn't handle, all
> cases that should never actually occur for any supported choice of
> types.
> 
> Calling an abort function is not appropriate for kernel use, so the
> Linux kernel redefines abort as a macro in various ways in the ports
> using this code, typically to "return 0" or similar.
> 
> One use of abort in soft-fp is inside a comma expression and doesn't
> work with such a macro.  This patch changes it to use a statement
> expression.
> 
> Tested for powerpc-nofpu that installed shared libraries are unchanged
> by this patch.  Committed.
> 
> (There are two classes of aborts: those to make control flow visible
> to the compiler, in default cases of switches over _FP_CLS_COMBINE,
> which could reasonably change to __builtin_unreachable for glibc but
> would still need to handle pre-4.5 compilers for kernel use, and those
> intended to detect any use of soft-fp for combinations of types the
> code doesn't know how to handle, which could reasonably become link
> failures if the calls should always be optimized away.  But those are
> separate possible future enhancements.)
> 
> 2015-02-20  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* soft-fp/op-common.h (_FP_FROM_INT): Wrap call to abort in
> 	expression inside statement expression.
> 
> diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
> index 342532a..14fd6cd 100644
> --- a/soft-fp/op-common.h
> +++ b/soft-fp/op-common.h
> @@ -1815,7 +1815,7 @@
>  			 X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
>  				  - _FP_FROM_INT_lz);			\
>  		       })						\
> -		     : (abort (), 0)));					\
> +		     : ({ abort (); 0; })));				\
>  									\
>  	  if ((rsize) - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		\
>  	      && X##_e >= _FP_EXPMAX_##fs)				\

Could these be replaced by __builtin_trap() or similar? I'm not clear
on whether this code is purely glibc+kernel or also used by gcc, but
if it's used by gcc too it would be very much preferable not to have
libgcc pulling in a reference to abort (this affects -ffreestanding,
etc.).

Rich


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]