summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDana Robinson <43805+derobins@users.noreply.github.com>2022-08-08 19:04:01 (GMT)
committerGitHub <noreply@github.com>2022-08-08 19:04:01 (GMT)
commit5d63aca604713973ef6079deb0da247efa0e077a (patch)
tree636c395c3631c2c1b235d1932ac71f801b606489
parent57926d549ef75c532badc7ad3318170f7130295b (diff)
downloadhdf5-5d63aca604713973ef6079deb0da247efa0e077a.zip
hdf5-5d63aca604713973ef6079deb0da247efa0e077a.tar.gz
hdf5-5d63aca604713973ef6079deb0da247efa0e077a.tar.bz2
Turns off clang optimizations on a couple of onion VFD functions (#1976)
Ancient clang (7.7.3 on OS X) emits problematic code with -O2 or -O3
-rw-r--r--src/H5FDonion_history.c2
-rw-r--r--src/H5FDonion_index.c2
-rw-r--r--src/H5private.h13
3 files changed, 15 insertions, 2 deletions
diff --git a/src/H5FDonion_history.c b/src/H5FDonion_history.c
index 501a1f7..ed45ddd 100644
--- a/src/H5FDonion_history.c
+++ b/src/H5FDonion_history.c
@@ -154,7 +154,7 @@ done:
* Failure: 0
*-----------------------------------------------------------------------------
*/
-size_t
+size_t H5_ATTR_NO_OPTIMIZE
H5FD__onion_history_decode(unsigned char *buf, H5FD_onion_history_t *history)
{
uint32_t ui32 = 0;
diff --git a/src/H5FDonion_index.c b/src/H5FDonion_index.c
index 90eaf0e..9dbdde7 100644
--- a/src/H5FDonion_index.c
+++ b/src/H5FDonion_index.c
@@ -583,7 +583,7 @@ H5FD__onion_revision_index_find(const H5FD_onion_revision_index_t *rix, uint64_t
* Failure: 0
*-----------------------------------------------------------------------------
*/
-size_t
+size_t H5_ATTR_NO_OPTIMIZE
H5FD__onion_revision_record_decode(unsigned char *buf, H5FD_onion_revision_record_t *record)
{
uint32_t ui32 = 0;
diff --git a/src/H5private.h b/src/H5private.h
index 3130bb1..19c3d33 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -289,6 +289,18 @@
# define H5_ATTR_MALLOC /*void*/
# endif
+/* Turns off optimizations for a function. Goes after the return type.
+ * Not generally needed in the library, but ancient versions of clang
+ * (7.3.3, possibly others) have trouble with some of the onion VFD decode
+ * functions and need the optimizer turned off. This macro can go away when
+ * we figure out what's going on and can engineer another solution.
+ */
+# if defined(__clang__)
+# define H5_ATTR_NO_OPTIMIZE __attribute__((optnone))
+# else
+# define H5_ATTR_NO_OPTIMIZE /*void*/
+# endif
+
#else
# define H5_ATTR_FORMAT(X, Y, Z) /*void*/
# define H5_ATTR_UNUSED /*void*/
@@ -302,6 +314,7 @@
# define H5_ATTR_PURE /*void*/
# define H5_ATTR_FALLTHROUGH /*void*/
# define H5_ATTR_MALLOC /*void*/
+# define H5_ATTR_NO_OPTIMIZE /*void*/
#endif
/* clang-format on */