summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5detect.c196
1 files changed, 157 insertions, 39 deletions
diff --git a/src/H5detect.c b/src/H5detect.c
index fc6d4a7..a363308 100644
--- a/src/H5detect.c
+++ b/src/H5detect.c
@@ -81,6 +81,11 @@ typedef struct malign_t {
const char *name;
size_t comp_align; /*alignment for structure */
} malign_t;
+
+/* global variables types detection code */
+detected_t d[MAXDETECT];
+malign_t m[MAXDETECT];
+volatile int nd = 0, na = 0;
static void print_results(int nd, detected_t *d, int na, malign_t *m);
static void iprint(detected_t *);
@@ -91,6 +96,11 @@ 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 void detect_C89_integers(void);
+static void detect_C89_floats(void);
+static void detect_C99_integers(void);
+static void detect_C99_floats(void);
+static void detect_alignments(void);
static size_t align_g[] = {1, 2, 4, 8, 16};
static jmp_buf jbuf_g;
@@ -1093,48 +1103,22 @@ bit.\n";
/*-------------------------------------------------------------------------
- * Function: main
+ * Function: detect_C89_integers
*
- * Purpose: Main entry point.
- *
- * Return: Success: exit(0)
+ * Purpose: Detect C89 integer types
*
- * Failure: exit(1)
+ * Return: void
*
- * Programmer: Robb Matzke
- * matzke@llnl.gov
- * Jun 12, 1996
+ * Programmer: Albert Cheng
+ * 2004/05/20
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-int
-main(void)
+static void
+detect_C89_integers(void)
{
- detected_t d[MAXDETECT];
- malign_t m[MAXDETECT];
- volatile int nd = 0, na = 0;
-
-#if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
-#if defined(UAC_NOPRINT) && defined(UAC_SIGBUS)
- /*
- * Make sure unaligned access generates SIGBUS and doesn't print warning
- * messages so that we can detect alignment constraints on the DEC Alpha.
- */
- int nvpairs[2];
- nvpairs[0] = SSIN_UACPROC;
- nvpairs[1] = UAC_NOPRINT | UAC_SIGBUS;
- if (setsysinfo(SSI_NVPAIRS, nvpairs, 1, 0, 0)<0) {
- fprintf(stderr, "H5detect: unable to turn off UAC handling: %s\n",
- strerror(errno));
- }
-#endif
-#endif
-
- print_header();
-
- /* C89 integer types */
DETECT_I(signed char, SCHAR, d[nd]); nd++;
DETECT_I(unsigned char, UCHAR, d[nd]); nd++;
DETECT_I(short, SHORT, d[nd]); nd++;
@@ -1143,10 +1127,48 @@ main(void)
DETECT_I(unsigned int, UINT, d[nd]); nd++;
DETECT_I(long, LONG, d[nd]); nd++;
DETECT_I(unsigned long, ULONG, d[nd]); nd++;
+}
- /*
- * C9x integer types.
- */
+
+/*-------------------------------------------------------------------------
+ * Function: detect_C89_floats
+ *
+ * Purpose: Detect C89 floating point types
+ *
+ * Return: void
+ *
+ * Programmer: Albert Cheng
+ * 2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C89_floats(void)
+{
+ DETECT_F(float, FLOAT, d[nd]); nd++;
+ DETECT_F(double, DOUBLE, d[nd]); nd++;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: detect_C99_integers
+ *
+ * Purpose: Detect C99 integer types
+ *
+ * Return: void
+ *
+ * Programmer: Albert Cheng
+ * 2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_integers(void)
+{
#if H5_SIZEOF_INT8_T>0
DETECT_I(int8_t, INT8, d[nd]); nd++;
#endif
@@ -1232,10 +1254,26 @@ main(void)
DETECT_I(long, LLONG, d[nd]); nd++;
DETECT_I(unsigned long, ULLONG, d[nd]); nd++;
#endif
+}
- DETECT_F(float, FLOAT, d[nd]); nd++;
- DETECT_F(double, DOUBLE, d[nd]); nd++;
-
+
+/*-------------------------------------------------------------------------
+ * Function: detect_C99_floats
+ *
+ * Purpose: Detect C99 floating point types
+ *
+ * Return: void
+ *
+ * Programmer: Albert Cheng
+ * 2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_C99_floats(void)
+{
#if H5_SIZEOF_DOUBLE == H5_SIZEOF_LONG_DOUBLE
/*
* If sizeof(double)==sizeof(long double) then assume that `long double'
@@ -1247,12 +1285,92 @@ main(void)
#else
DETECT_F(long double, LDOUBLE, d[nd]); nd++;
#endif
+}
+
+/*-------------------------------------------------------------------------
+ * Function: detect_alignments
+ *
+ * Purpose: Detect structure alignments
+ *
+ * Return: void
+ *
+ * Programmer: Albert Cheng
+ * 2004/05/20
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+detect_alignments(void)
+{
/* Detect structure alignment for pointers, hvl_t, hobj_ref_t, hdset_reg_ref_t */
DETECT_M(void *, POINTER, m[na]); na++;
DETECT_M(hvl_t, HVL, m[na]); na++;
DETECT_M(hobj_ref_t, HOBJREF, m[na]); na++;
DETECT_M(hdset_reg_ref_t, HDSETREGREF, m[na]); na++;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Main entry point.
+ *
+ * Return: Success: exit(0)
+ *
+ * Failure: exit(1)
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jun 12, 1996
+ *
+ * Modifications:
+ * Albert Cheng, 2004/05/20
+ * Some compilers, e.g., Intel C v7.0, took a long time to compile
+ * with optimization when a module routine contains many code lines.
+ * Divide up all those types detections macros into subroutines, both
+ * to avoid the compiler optimization error and cleaner codes.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+
+#if defined(H5_HAVE_SETSYSINFO) && defined(SSI_NVPAIRS)
+#if defined(UAC_NOPRINT) && defined(UAC_SIGBUS)
+ /*
+ * Make sure unaligned access generates SIGBUS and doesn't print warning
+ * messages so that we can detect alignment constraints on the DEC Alpha.
+ */
+ int nvpairs[2];
+ nvpairs[0] = SSIN_UACPROC;
+ nvpairs[1] = UAC_NOPRINT | UAC_SIGBUS;
+ if (setsysinfo(SSI_NVPAIRS, nvpairs, 1, 0, 0)<0) {
+ fprintf(stderr, "H5detect: unable to turn off UAC handling: %s\n",
+ strerror(errno));
+ }
+#endif
+#endif
+
+ print_header();
+
+ /* C89 integer types */
+ detect_C89_integers();
+
+ /* C99 integer types */
+ detect_C99_integers();
+
+ /* C89 floating point types */
+ detect_C89_floats();
+
+ /* C99 floating point types */
+ detect_C99_floats();
+
+ /* Detect structure alignment */
+ detect_alignments();
print_results (nd, d, na, m);