libgcc, soft-float: Fix strong_alias macro use for Darwin.

Darwin does not support strong symbol aliases and a work-
around is provided in sfp-machine.h where a second function
is created that simply calls the original.  However this
needs the arguments to the synthesized function to track
the mode of the original function.

So the fix here is to match known floating point modes from
the incoming function and apply the one found to the new
function args.

The matching is highly specific to the current set of modes
and will need adjusting should more cases be added.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>

libgcc/ChangeLog:

	* config/i386/sfp-machine.h (alias_HFtype, alias_SFtype
	alias_DFtype, alias_TFtype): New.
	(ALIAS_SELECTOR): New.
	(strong_alias): Use __typeof and a _Generic selector to
	provide the type to the synthesized function.
This commit is contained in:
Iain Sandoe 2021-09-03 08:41:06 +01:00
parent 0100555037
commit 3ccb523bdd

View File

@ -75,10 +75,24 @@ void __sfp_handle_exceptions (int);
/* Define ALIASNAME as a strong alias for NAME. */
#if defined __MACH__
/* Mach-O doesn't support aliasing. If these functions ever return
anything but CMPtype we need to revisit this... */
/* Mach-O doesn't support aliasing, so we build a secondary function for
the alias - we need to do a bit of a dance to find out what the type of
the arguments is and then apply that to the secondary function.
If these functions ever return anything but CMPtype we need to revisit
this... */
typedef float alias_HFtype __attribute__ ((mode (HF)));
typedef float alias_SFtype __attribute__ ((mode (SF)));
typedef float alias_DFtype __attribute__ ((mode (DF)));
typedef float alias_TFtype __attribute__ ((mode (TF)));
#define ALIAS_SELECTOR \
CMPtype (*) (alias_HFtype, alias_HFtype): (alias_HFtype) 0, \
CMPtype (*) (alias_SFtype, alias_SFtype): (alias_SFtype) 0, \
CMPtype (*) (alias_DFtype, alias_DFtype): (alias_DFtype) 0, \
CMPtype (*) (alias_TFtype, alias_TFtype): (alias_TFtype) 0
#define strong_alias(name, aliasname) \
CMPtype aliasname (TFtype a, TFtype b) { return name(a, b); }
CMPtype aliasname (__typeof (_Generic (name, ALIAS_SELECTOR)) a, \
__typeof (_Generic (name, ALIAS_SELECTOR)) b) \
{ return name (a, b); }
#else
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \