<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/3a2a0533bbdff9d4b6000c310be06c29b7646f81">https://github.com/macports/macports-legacy-support/commit/3a2a0533bbdff9d4b6000c310be06c29b7646f81</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 3a2a0533bbdff9d4b6000c310be06c29b7646f81
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Mon Oct 7 17:08:05 2024 -0700
<span style='display:block; white-space:pre;color:#404040;'> Fix SDK 15 math.h for compilers without _Float16
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Although Apple usually provides workarounds for newer SDKs with older
</span><span style='display:block; white-space:pre;color:#404040;'> compilers, they neglected to do that for the prototypes of the new
</span><span style='display:block; white-space:pre;color:#404040;'> half-precision floating-point functions added in macOS 15.0. With
</span><span style='display:block; white-space:pre;color:#404040;'> older compilers, this results in failed builds, even for code that
</span><span style='display:block; white-space:pre;color:#404040;'> doesn't use the new functions. Here we provide a workaround for that.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Also makes the _Float16 support status available as a macro,
</span><span style='display:block; white-space:pre;color:#404040;'> regardless of SDK version.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Xcode compilers for all OS versions, as well as many others, now
</span><span style='display:block; white-space:pre;color:#404040;'> successfully build math.h from all SDKs.
</span>---
include/math.h | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++
xtest/test_math_h.c | 1 +
2 files changed, 121 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/math.h b/include/math.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 1ceb420..20ebdcc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/math.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/math.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -72,6 +72,126 @@ __MP__END_DECLS
</span>
#endif /* __MPLS_SDK_SUPPORT_LLROUND__ */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Fix _Float16 issue with 15.x SDK.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The 15.0 SDK introduced a set of half-precision floating-point functions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * (first available in macOS 15.0) without including any support for older
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * compilers that lack the _Float16 type. With such compilers, the prototypes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * for those functions are syntactically illegal, resulting in fatal errors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * in any build that uses math.h, regardless of whether it uses any of these
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * functions. Here we determine whether it's a 15.x+ SDK and such a compiler,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * so we can provide a dummy definition for _Float16 to make the declarations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * work.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * There are actually two separate issues with _Float16. The first is whether
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * it's recognized as a type at all. The second is whether it's supported.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Unlike all other types in C, the latter is architecture-specific. When
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * it's not supported on the target architecture, any attempt to use it, while
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * syntactically legal, still results in a fatal error. Complicating things
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * further is that many versions of clang and many versions of gcc improperly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * consider _Float16 to be unsupported on x86.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * With clang, the mere recognition of the type can be tested in a backhanded
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * way without resorting to version conditionals through the use of the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * __is_identifier() intrinsic. Since the purpose of this operator is to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * determine whether its operand is a valid *user* identifier, it's false for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * all reserved words, including recognized types. Versions of clang that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * are too old to have __is_identifier() are also too old to recognize the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * _Float16 type, so it can reliably be used to test whether it's recognized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * as a type. This, however, doesn't answer the support question.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * All versions of clang that recognize _Float16 as a type support it for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * arm64, but Apple clang doesn't support it on x86 until clang 10, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MacPorts clang doesn't support it on x86 until clang 15. It's never
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * supported on ppc or ppc64.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * With gcc, there's no __is_identifier feature, so our only option is a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * hard-coded version threshold. Gcc versions 7 and later recognize the type,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * but don't actually support it on x86_64 until version 12. There's no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Apple gcc for arm64, but MacPorts gcc >=10 is available and supports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * _Float16 on arm64. MacPorts gcc <10 is currently unavailable for arm64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * but we assume that the architecture issue is similarly irrelevant for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * arm64, and hence that _Float16 is potentially legal for arm64 on gcc >=7.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The logic below handles the recognition and support issues separately,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * for better clarity. It also defines __MPLS_FLOAT16_STATUS as follows:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * -1 Not recognized
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 0 Recognized, but not supported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1 Recognized and supported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This is set up regardless of SDK version, but only acted upon for SDK 15.x+.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * In failing cases, we define _Float16 as a macro rather than a type, for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * maximum flexibility. This is suppressed if it's already defined as a macro
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * when we get here.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * When this hack is needed, we need to provide *some* compiler-supported type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * as a substitute. The reasonable candidates are 'short', which has the right
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * memnory size but the wrong "character", or 'float', which has the wrong
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * memory size but the right "character". Since actually using any of these
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * functions won't really work properly in either case, we opt for 'short'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If this hack is needed and the target OS is >=15.x, then we give a warning
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * about the compiler problem, though we have no way of knowing whether the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * code actually uses any of these functions. If the target OS is <15.x, then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * we assume that the code doesn't use these functions, since they're not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * available prior to 15.x, and don't bother with the warning.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Note that all this has to happen *before* the include_next, so that _Float16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * is usable while the system math.h is being processed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef __MPLS_FLOAT16_STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef __is_identifier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if !__is_identifier(_Float16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#elif !defined(__clang_major__) && defined(__GNUC__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if __GNUC__ >= 7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_FLOAT16_STATUS == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(__arm64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef __MPLS_FLOAT16_STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(__x86_64__) || defined(__i386__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(__clang_major__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if __clang_major__ >= 15
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef __MPLS_FLOAT16_STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif __clang_major__ >= 10 && defined(__apple_build_version__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef __MPLS_FLOAT16_STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(__GNUC__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if __GNUC__ >= 12
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef __MPLS_FLOAT16_STATUS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define __MPLS_FLOAT16_STATUS 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* Unsupported arch */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_SDK_MAJOR >= 150000 && !defined(_Float16)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_FLOAT16_STATUS <= 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if __MPLS_TARGET_OSVER >= 150000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #warning Compiler doesn't support _Float16 - relevant functions won't work
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define _Float16 short
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_SDK_MAJOR >= 150000 && !defined(_Float16) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /*
* Include the next math.h, which might be from the primary system or
* it might be within GCC's c or c++ (yup!) headers
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/xtest/test_math_h.c b/xtest/test_math_h.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 38e0478..e99bcc0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/xtest/test_math_h.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/xtest/test_math_h.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -55,6 +55,7 @@ print_details(void)
</span> printf("Compiler is " COMPILER);
printf(COMPILER_APPLE);
printf("Architecture is " ARCH "\n");
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("__MPLS_FLOAT16_STATUS = %d\n", __MPLS_FLOAT16_STATUS);
</span> }
int
</pre><pre style='margin:0'>
</pre>