incubator-nuttx/libs/libm/newlib/0004-newlib-disable-optmisa...

74 lines
2.2 KiB
Diff

From b88abc9c31c450c44c384feaf2e2653c8c4c69e4 Mon Sep 17 00:00:00 2001
From: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
Date: Fri, 24 May 2024 09:19:03 +0200
Subject: [PATCH] newlib: disable optmisation for sincos
Change-Id: Ie571e357485384655f67cdc9af2be1c60cacfeee
Signed-off-by: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
---
newlib/libm/math/w_sincos.c | 9 +++++++++
newlib/libm/math/wf_sincos.c | 10 ++++++++++
2 files changed, 19 insertions(+)
diff --git a/newlib/newlib/newlib/libm/math/w_sincos.c newlib/newlib/newlib/libm/math/w_sincos.c
index 491efa418..6f85c27ab 100644
--- a/newlib/newlib/newlib/libm/math/w_sincos.c
+++ newlib/newlib/newlib/libm/math/w_sincos.c
@@ -4,8 +4,19 @@
#include "fdlibm.h"
#include <errno.h>
+/* Disable sincos optimization for all functions in this file,
+ * otherwise gcc would generate infinite calls.
+ * Refer to gcc PR46926.
+ * -fno-builtin-sin or -fno-builtin-cos can disable sincos optimization,
+ * but these two options do not work inside optimize pragma in-file.
+ * Thus we just enforce -O0 when compiling this file.
+ */
+
#ifndef _DOUBLE_IS_32BITS
+#ifdef __GNUC__
+__attribute__((optimize("O0")))
+#endif
#ifdef __STDC__
void sincos(double x, double *sinx, double *cosx)
#else
diff --git a/newlib/newlib/newlib/libm/math/wf_sincos.c newlib/newlib/newlib/libm/math/wf_sincos.c
index 69eb922c9..2e9b5ca62 100644
--- a/newlib/newlib/newlib/libm/math/wf_sincos.c
+++ newlib/newlib/newlib/libm/math/wf_sincos.c
@@ -3,8 +3,19 @@
#include "fdlibm.h"
#if __OBSOLETE_MATH
+/* Disable sincos optimization for all functions in this file,
+ * otherwise gcc would generate infinite calls.
+ * Refer to gcc PR46926.
+ * -fno-builtin-sin or -fno-builtin-cos can disable sincos optimization,
+ * but these two options do not work inside optimize pragma in-file.
+ * Thus we just enforce -O0 when compiling this file.
+ */
+
#include <errno.h>
+#ifdef __GNUC__
+__attribute__((optimize("O0")))
+#endif
#ifdef __STDC__
void sincosf(float x, float *sinx, float *cosx)
#else
@@ -20,6 +29,9 @@
#ifdef _DOUBLE_IS_32BITS
+#ifdef __GNUC__
+__attribute__((optimize("O0")))
+#endif
#ifdef __STDC__
void sincos(double x, double *sinx, double *cosx)
#else
--
2.44.0