This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
soft-fp: Add _FP_UNREACHABLE [committed]
- From: Joseph Myers <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Wed, 11 Mar 2015 01:15:21 +0000
- Subject: soft-fp: Add _FP_UNREACHABLE [committed]
- Authentication-results: sourceware.org; auth=none
This patch makes soft-fp use a new macro _FP_UNREACHABLE in place of
calling abort in unreachable default cases of switch statements.
_FP_UNREACHABLE expands to call __builtin_unreachable for GCC 4.5 and
later; the fallback to abort is thus only for kernel use.
Tested for powerpc-nofpu that installed stripped shared libraries are
unchanged by this patch. Also tested with the math/ tests for mips64
(in the case of fma there *was* previously an abort call generated,
unlike for the other operations - one switch only deals with a subset
of classes for one operand based on what could have been generated in
the earlier part of fma, whereas the other switches deal with all
combinations of two classes - and this is apparently too complicated
for the default case to have been optimized away). Committed.
2015-03-11 Joseph Myers <joseph@codesourcery.com>
* soft-fp/soft-fp.h (_FP_UNREACHABLE): New macro.
* soft-fp/op-common.h (_FP_MUL): Use _FP_UNREACHABLE instead of
abort.
(_FP_FMA): Likewise.
(_FP_DIV): Likewise.
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 0a2f86a..83c2156 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -927,7 +927,7 @@
break; \
\
default: \
- abort (); \
+ _FP_UNREACHABLE; \
} \
} \
while (0)
@@ -1092,7 +1092,7 @@
break; \
\
default: \
- abort (); \
+ _FP_UNREACHABLE; \
} \
\
/* T = X * Y is zero, infinity or NaN. */ \
@@ -1148,7 +1148,7 @@
break; \
\
default: \
- abort (); \
+ _FP_UNREACHABLE; \
} \
done_fma: ; \
} \
@@ -1215,7 +1215,7 @@
break; \
\
default: \
- abort (); \
+ _FP_UNREACHABLE; \
} \
} \
while (0)
diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
index bb68df9..b247125 100644
--- a/soft-fp/soft-fp.h
+++ b/soft-fp/soft-fp.h
@@ -51,6 +51,15 @@
# endif
#endif
+/* For unreachable default cases in switch statements over bitwise OR
+ of FP_CLS_* values. */
+#if (defined __GNUC__ \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
+# define _FP_UNREACHABLE __builtin_unreachable ()
+#else
+# define _FP_UNREACHABLE abort ()
+#endif
+
/* In the Linux kernel, some architectures have a single function that
uses different kinds of unpacking and packing depending on the
instruction being emulated, meaning it is not readily visible to
--
Joseph S. Myers
joseph@codesourcery.com