diff options
Diffstat (limited to 'src/H5detect.c')
-rw-r--r-- | src/H5detect.c | 167 |
1 files changed, 62 insertions, 105 deletions
diff --git a/src/H5detect.c b/src/H5detect.c index bf97452..ae1ecb2 100644 --- a/src/H5detect.c +++ b/src/H5detect.c @@ -39,19 +39,19 @@ static const char *FileHeader = "\n\ */ typedef struct detected_t { const char *varname; - int size; /*total byte size*/ - int precision; /*meaningful bits*/ - int offset; /*bit offset to meaningful bits*/ - int perm[32]; - int sign; - int mpos, msize, imp; - int epos, esize; - unsigned long bias; + int size; /*total byte size */ + int precision; /*meaningful bits */ + int offset; /*bit offset to meaningful bits */ + int perm[32]; /*byte order */ + int sign; /*location of sign bit */ + int mpos, msize, imp;/*information about mantissa */ + int epos, esize; /*information about exponent */ + unsigned long bias; /*exponent bias for floating pt.*/ + size_t align; /*required byte alignment */ } detected_t; static void print_results(int nd, detected_t *d); static void iprint(detected_t *); -static void print_known_formats(detected_t *); static int byte_cmp(int, void *, void *); static int bit_cmp(int, int *, void *, void *); static void fix_order(int, int, int, int *, const char **); @@ -59,6 +59,7 @@ static int imp_bit(int, int *, void *, void *); static unsigned long find_bias(int, int, int *, void *); static void precision (detected_t*); static void print_header(void); +static size_t align_g[] = {1, 2, 4, 8, 16}; /*------------------------------------------------------------------------- @@ -114,58 +115,7 @@ precision (detected_t *d) } } - -/*------------------------------------------------------------------------- - * For convenience, we place here in a table descriptions of all - * architectures we've seen so far. That way we can print a description - * of the system on which the program is run. We place the system name - * in the VARNAME field. - *------------------------------------------------------------------------- - */ -#define LE {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, \ - 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31} -#define LE_1 LE -#define LE_2 LE -#define LE_4 LE -#define LE_8 LE - -#define BE_1 {0} -#define BE_2 {1,0} -#define BE_4 {3,2,1,0} -#define BE_8 {7,6,5,4,3,2,1,0} -#define INTEGER 0,0,0,0,0,0,0 - -static detected_t Known[] = -{ - /* Single-byte quantities */ - {"Byte addressable", - 1, 8, 0, LE_1, INTEGER}, - - /* Little-endian integer */ - {"Little-endian", - 2, 16, 0, LE_2, INTEGER}, - {"Little-endian", - 4, 32, 0, LE_4, INTEGER}, - - /* Big-endian integer */ - {"Big-endian", - 2, 16, 0, BE_2, INTEGER}, - {"Big-endian", - 4, 32, 0, BE_4, INTEGER}, - - /* Little-endian IEEE floating-point */ - {"Little-endian IEEE", - 4, 32, 0, LE_4, 31, 0, 23, 1, 23, 8, 127}, - {"Little-endian IEEE", - 8, 64, 0, LE_8, 63, 0, 52, 1, 52, 11, 1023}, - - /* Big-endian IEEE floating-point */ - {"Big-endian IEEE", - 4, 32, 0, BE_4, 31, 0, 23, 1, 23, 8, 127}, - {"Big-endian IEEE", - 8, 64, 0, BE_8, 63, 0, 52, 1, 52, 11, 1023}, -}; /*------------------------------------------------------------------------- * Function: DETECT_I @@ -210,6 +160,7 @@ static detected_t Known[] = INFO.perm[_i] = _j; \ } \ INFO.sign = ('U'!=*(#VAR)); \ + ALIGNMENT(TYPE, INFO.align); \ precision (&(INFO)); \ } @@ -286,8 +237,47 @@ static detected_t Known[] = \ _v1 = 1.0; \ INFO.bias = find_bias (INFO.epos, INFO.esize, INFO.perm, &_v1); \ + ALIGNMENT(TYPE, INFO.align); \ precision (&(INFO)); \ } + +#define ALIGNMENT(TYPE,ALIGN) { \ + char *_buf=malloc(sizeof(TYPE)+align_g[NELMTS(align_g)-1]); \ + TYPE _val=0; \ + size_t _ano; \ + pid_t _child; \ + int _status; \ + \ + for (_ano=0; _ano<NELMTS(align_g); _ano++) { \ + fflush(stdout); \ + fflush(stderr); \ + if (0==(_child=fork())) { \ + _val = *((TYPE*)(_buf+align_g[_ano])); \ + exit(0); \ + } else if (_child<0) { \ + perror("fork"); \ + exit(1); \ + } \ + if (waitpid(_child, &_status, 0)<0) { \ + perror("waitpid"); \ + exit(1); \ + } \ + if (WIFEXITED(_status) && 0==WEXITSTATUS(_status)) { \ + ALIGN=align_g[_ano]; \ + break; \ + } \ + if (WIFSIGNALED(_status) && SIGBUS==WTERMSIG(_status)) { \ + continue; \ + } \ + _ano=NELMTS(align_g); \ + break; \ + } \ + if (_ano>=NELMTS(align_g)) { \ + ALIGN=0; \ + fprintf(stderr, "unable to calculate alignment for %s\n", #TYPE); \ + } \ +} + /*------------------------------------------------------------------------- * Function: print_results @@ -346,8 +336,7 @@ H5T_native_open (void)\n\ /* Print a comment to describe this section of definitions. */ printf("\n /*\n"); - iprint(d + i); - print_known_formats(d + i); + iprint(d+i); printf(" */\n"); /* The part common to fixed and floating types */ @@ -404,6 +393,8 @@ H5T_native_open (void)\n\ \"failure\");\n\ }\n", d[i].varname); + printf(" H5T_NATIVE_%s_ALIGN_g = %lu;\n", + d[i].varname, (unsigned long)(d[i].align)); } printf(" FUNC_LEAVE (SUCCEED);\n}\n"); @@ -475,50 +466,16 @@ iprint(detected_t *d) if (d->msize) { printf(" * Implicit bit? %s\n", d->imp ? "yes" : "no"); } -} - - -/*------------------------------------------------------------------------- - * Function: print_known_formats - * - * Purpose: Prints archetecture names for the specified format - * description, if any. - * - * Return: void - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jun 13, 1996 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static void -print_known_formats(detected_t *d) -{ - - int i, j, diff; - int n = sizeof(Known) / sizeof(Known[0]); - - for (i=0; i<n; i++) { - if (d->size != Known[i].size) continue; - if (d->precision != Known[i].precision) continue; - if (d->offset != Known[i].offset) continue; - for (j = diff = 0; !diff && j < d->size; j++) { - if (d->perm[j] != Known[i].perm[j]) diff = 1; - } - if (diff) continue; - /* if (d->sign != Known[i].sign) continue; */ - if (d->mpos != Known[i].mpos) continue; - if (d->msize != Known[i].msize) continue; - if (d->imp != Known[i].imp) continue; - if (d->epos != Known[i].epos) continue; - if (d->esize != Known[i].esize) continue; - if (d->bias != Known[i].bias) continue; - - printf(" * %s\n", Known[i].varname); + /* + * Alignment + */ + if (0==d->align) { + printf(" * Alignment: NOT CALCULATED\n"); + } else if (1==d->align) { + printf(" * Alignment: none\n"); + } else { + printf(" * Alignemtn: %lu\n", (unsigned long)(d->align)); } } |