From 83175cb19103db8186cf7ad65bbbea1ef88e0366 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Wed, 28 Apr 2010 15:56:55 -0500 Subject: [svn-r18660] Description: Tweak H5detect to be even more careful about its actions, to allow gcc 4.5 to use '-O3'. Also, minor code cleanups in H5Tfloat.c Tested on: FreeBSD/64 6.3 (liberty) w/gcc 4.5 & production mode (h5committest not necessary/appropriate) --- src/H5Tfloat.c | 195 +++++++++++++++++++++++++-------------------------------- src/H5detect.c | 32 ++++++---- 2 files changed, 105 insertions(+), 122 deletions(-) diff --git a/src/H5Tfloat.c b/src/H5Tfloat.c index 73ccf30..88d13fd 100644 --- a/src/H5Tfloat.c +++ b/src/H5Tfloat.c @@ -70,40 +70,41 @@ H5T_init_float_interface(void) * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived datatypes. *------------------------------------------------------------------------- */ herr_t -H5Tget_fields(hid_t type_id, size_t *spos/*out*/, - size_t *epos/*out*/, size_t *esize/*out*/, - size_t *mpos/*out*/, size_t *msize/*out*/) +H5Tget_fields(hid_t type_id, size_t *spos/*out*/, size_t *epos/*out*/, +size_t *esize/*out*/, size_t *mpos/*out*/, size_t *msize/*out*/) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt; /* Datatype */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Tget_fields, FAIL) H5TRACE6("e", "ixxxxx", type_id, spos, epos, esize, mpos, msize); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class") /* Get values */ - if (spos) *spos = dt->shared->u.atomic.u.f.sign; - if (epos) *epos = dt->shared->u.atomic.u.f.epos; - if (esize) *esize = dt->shared->u.atomic.u.f.esize; - if (mpos) *mpos = dt->shared->u.atomic.u.f.mpos; - if (msize) *msize = dt->shared->u.atomic.u.f.msize; + if(spos) + *spos = dt->shared->u.atomic.u.f.sign; + if(epos) + *epos = dt->shared->u.atomic.u.f.epos; + if(esize) + *esize = dt->shared->u.atomic.u.f.esize; + if(mpos) + *mpos = dt->shared->u.atomic.u.f.mpos; + if(msize) + *msize = dt->shared->u.atomic.u.f.msize; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tget_fields() */ /*------------------------------------------------------------------------- @@ -122,45 +123,40 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ herr_t H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, - size_t mpos, size_t msize) + size_t mpos, size_t msize) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt; /* Datatype */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Tset_fields, FAIL) H5TRACE6("e", "izzzzz", type_id, spos, epos, esize, mpos, msize); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") - while (dt->shared->parent) + if(H5T_STATE_TRANSIENT != dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class") - if (epos + esize > dt->shared->u.atomic.prec) + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class") + if(epos + esize > dt->shared->u.atomic.prec) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent bit field size/location is invalid") - if (mpos + msize > dt->shared->u.atomic.prec) + if(mpos + msize > dt->shared->u.atomic.prec) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mantissa bit field size/location is invalid") - if (spos >= dt->shared->u.atomic.prec) + if(spos >= dt->shared->u.atomic.prec) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign location is not valid") /* Check for overlap */ - if (spos >= epos && spos < epos + esize) + if(spos >= epos && spos < epos + esize) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within exponent field") - if (spos >= mpos && spos < mpos + msize) + if(spos >= mpos && spos < mpos + msize) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within mantissa field") - if ((mpos < epos && mpos + msize > epos) || - (epos < mpos && epos + esize > mpos)) + if((mpos < epos && mpos + msize > epos) || (epos < mpos && epos + esize > mpos)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent and mantissa fields overlap") /* Commit */ @@ -172,7 +168,7 @@ H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tset_fields() */ /*------------------------------------------------------------------------- @@ -187,34 +183,31 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived datatypes. *------------------------------------------------------------------------- */ size_t H5Tget_ebias(hid_t type_id) { - H5T_t *dt = NULL; - size_t ret_value; + H5T_t *dt; /* Datatype */ + size_t ret_value; /* Return value */ FUNC_ENTER_API(H5Tget_ebias, 0) H5TRACE1("z", "i", type_id); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, 0, "operation not defined for datatype class") /* bias */ - H5_ASSIGN_OVERFLOW(ret_value,dt->shared->u.atomic.u.f.ebias,uint64_t,size_t); + H5_ASSIGN_OVERFLOW(ret_value, dt->shared->u.atomic.u.f.ebias, uint64_t, size_t); done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tget_ebias() */ /*------------------------------------------------------------------------- @@ -236,28 +229,28 @@ done: herr_t H5Tset_ebias(hid_t type_id, size_t ebias) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt; /* Datatype */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Tset_ebias, FAIL) H5TRACE2("e", "iz", type_id, ebias); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") - while (dt->shared->parent) + if(H5T_STATE_TRANSIENT != dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class") /* Commit */ dt->shared->u.atomic.u.f.ebias = ebias; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tset_ebias() */ /*------------------------------------------------------------------------- @@ -273,35 +266,31 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived datatypes. - * *------------------------------------------------------------------------- */ H5T_norm_t H5Tget_norm(hid_t type_id) { - H5T_t *dt = NULL; - H5T_norm_t ret_value; + H5T_t *dt; /* Datatype */ + H5T_norm_t ret_value; /* Return value */ FUNC_ENTER_API(H5Tget_norm, H5T_NORM_ERROR) H5TRACE1("Tn", "i", type_id); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NORM_ERROR, "not a datatype") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_NORM_ERROR, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, H5T_NORM_ERROR, "operation not defined for datatype class") /* norm */ ret_value = dt->shared->u.atomic.u.f.norm; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tget_norm() */ /*------------------------------------------------------------------------- @@ -315,39 +304,35 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ herr_t H5Tset_norm(hid_t type_id, H5T_norm_t norm) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt; /* Datatype */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Tset_norm, FAIL) H5TRACE2("e", "iTn", type_id, norm); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") - if (norm < H5T_NORM_IMPLIED || norm > H5T_NORM_NONE) + if(H5T_STATE_TRANSIENT != dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + if(norm < H5T_NORM_IMPLIED || norm > H5T_NORM_NONE) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal normalization") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class") /* Commit */ dt->shared->u.atomic.u.f.norm = norm; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tset_norm() */ /*------------------------------------------------------------------------- @@ -365,35 +350,31 @@ done: * Programmer: Robb Matzke * Friday, January 9, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ H5T_pad_t H5Tget_inpad(hid_t type_id) { - H5T_t *dt = NULL; - H5T_pad_t ret_value; + H5T_t *dt; /* Datatype */ + H5T_pad_t ret_value; /* Return value */ FUNC_ENTER_API(H5Tget_inpad, H5T_PAD_ERROR) H5TRACE1("Tp", "i", type_id); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_PAD_ERROR, "not a datatype") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_PAD_ERROR, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, H5T_PAD_ERROR, "operation not defined for datatype class") /* pad */ ret_value = dt->shared->u.atomic.u.f.pad; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tget_inpad() */ /*------------------------------------------------------------------------- @@ -409,37 +390,33 @@ done: * Programmer: Robb Matzke * Friday, January 9, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ herr_t H5Tset_inpad(hid_t type_id, H5T_pad_t pad) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt; /* Datatype */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(H5Tset_inpad, FAIL) H5TRACE2("e", "iTp", type_id, pad); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) + if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") - if (pad < H5T_PAD_ZERO || pad >= H5T_NPAD) + if(H5T_STATE_TRANSIENT != dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + if(pad < H5T_PAD_ZERO || pad >= H5T_NPAD) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal internal pad type") - while (dt->shared->parent) + while(dt->shared->parent) dt = dt->shared->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class") + if(H5T_FLOAT != dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "operation not defined for datatype class") /* Commit */ dt->shared->u.atomic.u.f.pad = pad; done: FUNC_LEAVE_API(ret_value) -} +} /* end H5Tset_inpad() */ diff --git a/src/H5detect.c b/src/H5detect.c index 1cfce96..5bae2bb 100644 --- a/src/H5detect.c +++ b/src/H5detect.c @@ -288,33 +288,39 @@ precision (detected_t *d) *------------------------------------------------------------------------- */ #define DETECT_F(TYPE,VAR,INFO) { \ - volatile TYPE _v1, _v2, _v3; \ - int _i, _j, _first=(-1), _last=(-1); \ + volatile TYPE _v1, _v2, _v3; \ + unsigned char _buf1[sizeof(TYPE)], _buf3[sizeof(TYPE)]; \ + int _i, _j, _first = (-1), _last = (-1); \ char *_mesg; \ \ - memset (&INFO, 0, sizeof(INFO)); \ + memset(&INFO, 0, sizeof(INFO)); \ INFO.varname = #VAR; \ INFO.size = sizeof(TYPE); \ \ /* Completely initialize temporary variables, in case the bits used in */ \ /* the type take less space than the number of bits used to store the type */ \ - memset(&_v3,0,sizeof(TYPE)); \ - memset(&_v2,0,sizeof(TYPE)); \ - memset(&_v1,0,sizeof(TYPE)); \ + memset(&_v3, 0, sizeof(TYPE)); \ + memset(&_v2, 0, sizeof(TYPE)); \ + memset(&_v1, 0, sizeof(TYPE)); \ \ /* Byte Order */ \ - for (_i=0,_v1=0.0,_v2=1.0; _i<(signed)sizeof(TYPE); _i++) { \ - _v3 = _v1; _v1 += _v2; _v2 /= 256.0; \ - _j=byte_cmp(sizeof(TYPE), &_v3, &_v1); \ - if(_j>=0) { \ - if (0==_i || INFO.perm[_i-1]!=_j) { \ + for(_i = 0, _v1 = 0.0, _v2 = 1.0; _i < (int)sizeof(TYPE); _i++) { \ + _v3 = _v1; \ + _v1 += _v2; \ + _v2 /= 256.0; \ + memcpy(_buf1, (const void *)&_v1, sizeof(TYPE)); \ + memcpy(_buf3, (const void *)&_v3, sizeof(TYPE)); \ + _j = byte_cmp(sizeof(TYPE), &_buf3, &_buf1); \ + if(_j >= 0) { \ + if(0 == _i || INFO.perm[_i - 1] != _j) { \ INFO.perm[_i] = _j; \ _last = _i; \ - if (_first<0) _first = _i; \ + if(_first < 0) \ + _first = _i; \ } \ } \ } \ - fix_order (sizeof(TYPE), _first, _last, INFO.perm, (const char**)&_mesg); \ + fix_order(sizeof(TYPE), _first, _last, INFO.perm, (const char**)&_mesg); \ \ if(!strcmp(_mesg, "VAX")) \ INFO.is_vax = TRUE; \ -- cgit v0.12