summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2022-04-16 15:21:18 (GMT)
committerGitHub <noreply@github.com>2022-04-16 15:21:18 (GMT)
commita80897ee4944ff6008bfb3b93619ebcb58a070d1 (patch)
treef01b999aa5168e6869e4cf35c073377e3db09cd7 /src
parent463ef39bc777340b731903995a2ad416ec5e0ae4 (diff)
downloadhdf5-a80897ee4944ff6008bfb3b93619ebcb58a070d1.zip
hdf5-a80897ee4944ff6008bfb3b93619ebcb58a070d1.tar.gz
hdf5-a80897ee4944ff6008bfb3b93619ebcb58a070d1.tar.bz2
Remove H5_NO_ALIGNMENT_RESTRICTIONS (#1426)
* Do not conditionally compile code that uses a pointer dereference and assignment to copy a potentially unaligned variable to aligned automatic storage, or vice versa. Instead, always use naked `memcpy(3)`s. Disassembling the generated code reveals that the `memcpy(3)`s optimize (`-O3`) to a single `mov` instruction for x86_64, which is not strict about alignment. This change reduces the size of code and scripts by 143 lines, eases our way to cross-compilation, and avoids invoking undefined behavior. * Committing clang-format changes * Per discussion, use HD and add comments. Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/H5Tvlen.c94
1 files changed, 20 insertions, 74 deletions
diff --git a/src/H5Tvlen.c b/src/H5Tvlen.c
index 7bf28af..39d33d4 100644
--- a/src/H5Tvlen.c
+++ b/src/H5Tvlen.c
@@ -369,11 +369,7 @@ done:
static herr_t
H5T__vlen_mem_seq_getlen(H5VL_object_t H5_ATTR_UNUSED *file, const void *_vl, size_t *len)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- const hvl_t *vl = (const hvl_t *)_vl; /* Pointer to the user's hvl_t information */
-#else
hvl_t vl; /* User's hvl_t information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
@@ -381,13 +377,12 @@ H5T__vlen_mem_seq_getlen(H5VL_object_t H5_ATTR_UNUSED *file, const void *_vl, si
HDassert(_vl);
HDassert(len);
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- *len = vl->len;
-#else
- H5MM_memcpy(&vl, _vl, sizeof(hvl_t));
+ /* Copy to ensure correct alignment. memcpy is best here because
+ * it optimizes to fast code.
+ */
+ HDmemcpy(&vl, _vl, sizeof(hvl_t));
*len = vl.len;
-#endif
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5T__vlen_mem_seq_getlen() */
@@ -407,25 +402,16 @@ H5T__vlen_mem_seq_getlen(H5VL_object_t H5_ATTR_UNUSED *file, const void *_vl, si
static void *
H5T__vlen_mem_seq_getptr(void *_vl)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- const hvl_t *vl = (const hvl_t *)_vl; /* Pointer to the user's hvl_t information */
-#else
hvl_t vl; /* User's hvl_t information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
/* check parameters, return result */
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- HDassert(vl);
-
- FUNC_LEAVE_NOAPI(vl->p)
-#else
HDassert(_vl);
- H5MM_memcpy(&vl, _vl, sizeof(hvl_t));
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&vl, _vl, sizeof(hvl_t));
FUNC_LEAVE_NOAPI(vl.p)
-#endif
} /* end H5T__vlen_mem_seq_getptr() */
/*-------------------------------------------------------------------------
@@ -443,24 +429,17 @@ H5T__vlen_mem_seq_getptr(void *_vl)
static herr_t
H5T__vlen_mem_seq_isnull(const H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, hbool_t *isnull)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- const hvl_t *vl = (const hvl_t *)_vl; /* Pointer to the user's hvl_t information */
-#else
hvl_t vl; /* User's hvl_t information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
/* Check parameters */
HDassert(_vl);
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- *isnull = ((vl->len == 0 || vl->p == NULL) ? TRUE : FALSE);
-#else
- H5MM_memcpy(&vl, _vl, sizeof(hvl_t));
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&vl, _vl, sizeof(hvl_t));
*isnull = ((vl.len == 0 || vl.p == NULL) ? TRUE : FALSE);
-#endif
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5T__vlen_mem_seq_isnull() */
@@ -512,27 +491,18 @@ H5T__vlen_mem_seq_setnull(H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, void H5
static herr_t
H5T__vlen_mem_seq_read(H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, void *buf, size_t len)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- const hvl_t *vl = (const hvl_t *)_vl; /* Pointer to the user's hvl_t information */
-#else
hvl_t vl; /* User's hvl_t information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
/* check parameters, copy data */
HDassert(buf);
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- HDassert(vl && vl->p);
-
- H5MM_memcpy(buf, vl->p, len);
-#else
HDassert(_vl);
- H5MM_memcpy(&vl, _vl, sizeof(hvl_t));
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&vl, _vl, sizeof(hvl_t));
HDassert(vl.p);
H5MM_memcpy(buf, vl.p, len);
-#endif
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5T__vlen_mem_seq_read() */
@@ -606,20 +576,15 @@ done:
static herr_t
H5T__vlen_mem_str_getlen(H5VL_object_t H5_ATTR_UNUSED *file, const void *_vl, size_t *len)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- const char *s = *(const char *const *)_vl; /* Pointer to the user's string information */
-#else
const char *s = NULL; /* Pointer to the user's string information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
/* check parameters */
HDassert(_vl);
-#ifndef H5_NO_ALIGNMENT_RESTRICTIONS
- H5MM_memcpy(&s, _vl, sizeof(char *));
-#endif
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&s, _vl, sizeof(char *));
*len = HDstrlen(s);
@@ -641,21 +606,14 @@ H5T__vlen_mem_str_getlen(H5VL_object_t H5_ATTR_UNUSED *file, const void *_vl, si
static void *
H5T__vlen_mem_str_getptr(void *_vl)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- char *s = *(char **)_vl; /* Pointer to the user's string information */
-#else
- char * s = NULL; /* Pointer to the user's string information */
-#endif
+ char *s = NULL; /* Pointer to the user's string information */
FUNC_ENTER_PACKAGE_NOERR
/* check parameters */
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- HDassert(s);
-#else
HDassert(_vl);
- H5MM_memcpy(&s, _vl, sizeof(char *));
-#endif
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&s, _vl, sizeof(char *));
FUNC_LEAVE_NOAPI(s)
} /* end H5T__vlen_mem_str_getptr() */
@@ -675,17 +633,12 @@ H5T__vlen_mem_str_getptr(void *_vl)
static herr_t
H5T__vlen_mem_str_isnull(const H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, hbool_t *isnull)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- char *s = *(char **)_vl; /* Pointer to the user's string information */
-#else
char *s = NULL; /* Pointer to the user's string information */
-#endif
FUNC_ENTER_PACKAGE_NOERR
-#ifndef H5_NO_ALIGNMENT_RESTRICTIONS
- H5MM_memcpy(&s, _vl, sizeof(char *));
-#endif
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&s, _vl, sizeof(char *));
*isnull = (s == NULL ? TRUE : FALSE);
@@ -732,23 +685,16 @@ H5T__vlen_mem_str_setnull(H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, void H5
static herr_t
H5T__vlen_mem_str_read(H5VL_object_t H5_ATTR_UNUSED *file, void *_vl, void *buf, size_t len)
{
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- char *s = *(char **)_vl; /* Pointer to the user's string information */
-#else
- char *s; /* Pointer to the user's string information */
-#endif
+ char *s; /* Pointer to the user's string information */
FUNC_ENTER_PACKAGE_NOERR
if (len > 0) {
/* check parameters */
HDassert(buf);
-#ifdef H5_NO_ALIGNMENT_RESTRICTIONS
- HDassert(s);
-#else
HDassert(_vl);
- H5MM_memcpy(&s, _vl, sizeof(char *));
-#endif
+ /* Copy to ensure correct alignment. */
+ HDmemcpy(&s, _vl, sizeof(char *));
H5MM_memcpy(buf, s, len);
} /* end if */