From 38aa393e8acbf0d05d704e48694873d4b351ea3d Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Mon, 23 Jun 2003 09:22:19 -0500 Subject: [svn-r7084] Purpose: Bug fix Description: Alignment on Cray SV1 machine was not being detected correctly and was not aligning integer types correctly for type conversion, nor was detecting the proper internal offset of the data in a 'short' type. Solution: Added more checks to detect way Cray aligns pointers in addition to current checks. Corrected 'offset' detection on big-endian machines. Platforms tested: FreeBSD 4.8 (sleipnir) h5committest --- src/H5detect.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/H5detect.c b/src/H5detect.c index fb11322..eb8f9ac 100644 --- a/src/H5detect.c +++ b/src/H5detect.c @@ -112,14 +112,14 @@ precision (detected_t *d) */ for (n=0; nsize && d->perm[n]<0; n++) /*void*/; d->precision = 8*(d->size-n); - d->offset = 0; + d->offset = 8*n; } else if (d->perm[d->size - 1] < 0) { /* * Higher addresses are padded. */ for (n=0; nsize && d->perm[d->size-(n+1)]; n++) /*void*/; d->precision = 8*(d->size-n); - d->offset = 8*n; + d->offset = 0; } else { /* * No padding. @@ -179,13 +179,13 @@ precision (detected_t *d) INFO.perm[_i] = _j; \ } \ INFO.sign = ('U'!=*(#VAR)); \ - ALIGNMENT(TYPE, INFO.align); \ + precision (&(INFO)); \ + ALIGNMENT(TYPE, INFO); \ if(!strcmp(INFO.varname, "SCHAR") || !strcmp(INFO.varname, "SHORT") || \ !strcmp(INFO.varname, "INT") || !strcmp(INFO.varname, "LONG") || \ !strcmp(INFO.varname, "LLONG")) { \ COMP_ALIGNMENT(TYPE,INFO.comp_align); \ } \ - precision (&(INFO)); \ } /*------------------------------------------------------------------------- @@ -267,12 +267,12 @@ precision (detected_t *d) \ _v1 = 1.0; \ INFO.bias = find_bias (INFO.epos, INFO.esize, INFO.perm, &_v1); \ - ALIGNMENT(TYPE, INFO.align); \ + precision (&(INFO)); \ + ALIGNMENT(TYPE, INFO); \ if(!strcmp(INFO.varname, "FLOAT") || !strcmp(INFO.varname, "DOUBLE") || \ !strcmp(INFO.varname, "LDOUBLE")) { \ COMP_ALIGNMENT(TYPE,INFO.comp_align); \ } \ - precision (&(INFO)); \ } @@ -309,21 +309,33 @@ precision (detected_t *d) } #if defined(H5_HAVE_LONGJMP) && defined(H5_HAVE_SIGNAL) -#define ALIGNMENT(TYPE,ALIGN) { \ +#define ALIGNMENT(TYPE,INFO) { \ char *volatile _buf=NULL; \ volatile TYPE _val=0; \ + volatile TYPE _val2; \ volatile size_t _ano=0; \ void (*_handler)(int) = signal(SIGBUS, sigbus_handler); \ - void (*_handler2)(int) = signal(SIGSEGV, sigsegv_handler); \ + void (*_handler2)(int) = signal(SIGSEGV, sigsegv_handler); \ \ _buf = malloc(sizeof(TYPE)+align_g[NELMTS(align_g)-1]); \ if (setjmp(jbuf_g)) _ano++; \ if (_ano=NELMTS(align_g)) { \ - ALIGN=0; \ + INFO.align=0; \ fprintf(stderr, "unable to calculate alignment for %s\n", #TYPE); \ } \ } #else -#define ALIGNMENT(TYPE,ALIGN) (ALIGN)=0 +#define ALIGNMENT(TYPE,INFO) (INFO.align)=0 #endif #endif -- cgit v0.12