#include #include #include #include "dump-descriptors.h" struct m { int i, j, k, l; }; extern void ctest (void); #define IMAX 6 #define JMAX 8 #define KMAX 10 #define LMAX 12 static struct m buffer[LMAX][KMAX][JMAX][IMAX]; static void check_element (struct m *mp, int i, int j, int k, int l) { #if 0 fprintf (stderr, "expected (%d, %d, %d, %d), got (%d, %d, %d, %d)\n", i, j, k, l, mp->i, mp->j, mp->k, mp->l); #endif if (mp->i != i || mp->j != j || mp->k != k || mp->l != l) abort (); } void ctest (void) { CFI_CDESC_T(4) sdesc; CFI_cdesc_t *source = (CFI_cdesc_t *) &sdesc; CFI_CDESC_T(4) rdesc; CFI_cdesc_t *result = (CFI_cdesc_t *) &rdesc; CFI_index_t extents[4] = { IMAX, JMAX, KMAX, LMAX }; CFI_index_t lb[4], ub[4], s[4]; int i, j, k, l; int ii, jj, kk, ll; /* Initialize the buffer to uniquely label each element. */ for (i = 0; i < IMAX; i++) for (j = 0; j < JMAX; j++) for (k = 0; k < KMAX; k++) for (l = 0; l < LMAX; l++) { buffer[l][k][j][i].i = i; buffer[l][k][j][i].j = j; buffer[l][k][j][i].k = k; buffer[l][k][j][i].l = l; } /* Establish the source array. */ check_CFI_status ("CFI_establish", CFI_establish (source, (void *)buffer, CFI_attribute_pointer, CFI_type_struct, sizeof (struct m), 4, extents)); /* Try taking a degenerate section (single element). */ check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_struct, sizeof (struct m), 0, NULL)); lb[0] = 3; lb[1] = 4; lb[2] = 5; lb[3] = 6; ub[0] = 3; ub[1] = 4; ub[2] = 5; ub[3] = 6; s[0] = 0; s[1] = 0; s[2] = 0; s[3] = 0; check_CFI_status ("CFI_section", CFI_section (result, source, lb, ub, s)); dump_CFI_cdesc_t (result); check_element ((struct m *)result->base_addr, 3, 4, 5, 6); /* Try taking a 2d chunk out of the 4d array. */ check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_struct, sizeof (struct m), 2, NULL)); lb[0] = 1; lb[1] = 2; lb[2] = 3; lb[3] = 4; ub[0] = 1; ub[1] = JMAX - 2; ub[2] = 3; ub[3] = LMAX - 2; s[0] = 0; s[1] = 2; s[2] = 0; s[3] = 3; check_CFI_status ("CFI_section", CFI_section (result, source, lb, ub, s)); dump_CFI_cdesc_t (result); i = lb[0]; k = lb[2]; for (j = lb[1], jj = result->dim[0].lower_bound; j <= ub[1]; j += s[1], jj++) for (l = lb[3], ll = result->dim[1].lower_bound; l <= ub[3]; l += s[3], ll++) { CFI_index_t subscripts[2]; subscripts[0] = jj; subscripts[1] = ll; check_element ((struct m *) CFI_address (result, subscripts), i, j, k, l); } }