public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-3345] libgcc, soft-float: Fix strong_alias macro use for Darwin.
@ 2021-09-03 15:29 Iain D Sandoe
  0 siblings, 0 replies; only message in thread
From: Iain D Sandoe @ 2021-09-03 15:29 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:3ccb523bdd78e6ba3c133064be90cdf19dcbf896

commit r12-3345-g3ccb523bdd78e6ba3c133064be90cdf19dcbf896
Author: Iain Sandoe <iain@sandoe.co.uk>
Date:   Fri Sep 3 08:41:06 2021 +0100

    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.

Diff:
---
 libgcc/config/i386/sfp-machine.h | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/libgcc/config/i386/sfp-machine.h b/libgcc/config/i386/sfp-machine.h
index f15d29d3755..172ebc70c8d 100644
--- a/libgcc/config/i386/sfp-machine.h
+++ b/libgcc/config/i386/sfp-machine.h
@@ -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) \


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-03 15:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-03 15:29 [gcc r12-3345] libgcc, soft-float: Fix strong_alias macro use for Darwin Iain D Sandoe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).