/* GCC-StarPU Copyright (C) 2011, 2012 INRIA GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ /* Test whether `#pragma starpu register ...' generates the right code. */ /* r19465 is modifying the test to avoid calling starpu_data_register twice with the same variable, starpu now checks that the same key is not entered twice in the same hashtable */ #undef NDEBUG #include static void foo (void) { int x[] = { 1, 2, 3 }; expected_register_arguments.pointer = x; expected_register_arguments.elements = sizeof x / sizeof x[0]; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x /* (warning "considered unsafe") */ } #if 0 static void bar (float *p, int s) { expected_register_arguments.pointer = p; expected_register_arguments.elements = s; expected_register_arguments.element_size = sizeof *p; #pragma starpu register p s } /* Same as above, but with arguments reversed, to make sure using S doesn't mutate the parameter list. */ static void baz (int s, float *p) { expected_register_arguments.pointer = p; expected_register_arguments.elements = s; expected_register_arguments.element_size = sizeof *p; #pragma starpu register p s } #endif /* Check the interaction between `register' and `heap_allocated'. This test assumes `heap_allocated' works as expected. */ static void heap_alloc (int x, int y) { data_register_calls = data_unregister_calls = 0; expected_malloc_argument = x * y * sizeof (float); float m[x][y] __attribute__ ((heap_allocated)); expected_register_arguments.pointer = m; expected_register_arguments.elements = x; expected_register_arguments.element_size = y * sizeof m[0][0]; #pragma starpu register m expected_unregister_arguments.pointer = m; #pragma starpu unregister m assert (data_register_calls == 1); assert (data_unregister_calls == 1); expected_free_argument = m; } int main (int argc, char *argv[]) { #pragma starpu initialize int x[123]; double *y; double *yy; static char z[345]; static float m[7][42]; static float m3d[14][11][80]; short w[] = { 1, 2, 3 }; size_t y_size = 234; y = malloc (234 * sizeof *y); yy = malloc (234 * sizeof *yy); expected_register_arguments.pointer = x; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof x[0]; #pragma starpu register x 123 /* (note "can be omitted") */ expected_register_arguments.pointer = y; expected_register_arguments.elements = 234; expected_register_arguments.element_size = sizeof *y; #pragma starpu register y 234 expected_register_arguments.pointer = yy; expected_register_arguments.elements = y_size; expected_register_arguments.element_size = sizeof *yy; #pragma starpu register yy y_size expected_register_arguments.pointer = z; expected_register_arguments.elements = 345; expected_register_arguments.element_size = sizeof z[0]; #pragma starpu register z expected_register_arguments.pointer = w; expected_register_arguments.elements = 3; expected_register_arguments.element_size = sizeof w[0]; #pragma starpu register w expected_register_arguments.pointer = argv; expected_register_arguments.elements = 456; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register argv 456 #if 0 #define ARGV argv #define N 456 expected_register_arguments.pointer = argv; expected_register_arguments.elements = N; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register ARGV /* hello, world! */ N #undef ARGV #undef N #endif foo (); // bar ((float *) argv, argc); // baz (argc, (float *) argv); #if 0 expected_register_arguments.pointer = argv; expected_register_arguments.elements = argc; expected_register_arguments.element_size = sizeof argv[0]; int chbouib = argc; #pragma starpu register argv chbouib #endif expected_register_arguments.pointer = &argv[1]; expected_register_arguments.elements = 3; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register &argv[1] 3 expected_register_arguments.pointer = &argv[argc + 3 / 2]; expected_register_arguments.elements = argc * 4; expected_register_arguments.element_size = sizeof argv[0]; #pragma starpu register &argv[argc + 3 / 2] (argc * 4) expected_register_arguments.pointer = &y[y_size / 2]; expected_register_arguments.elements = (y_size / 2 - 7); expected_register_arguments.element_size = sizeof y[0]; #pragma starpu register &y[y_size / 2] (y_size / 2 - 7) expected_register_arguments.pointer = m[6]; expected_register_arguments.elements = 42; expected_register_arguments.element_size = sizeof m[0][0]; #pragma starpu register m[6] expected_register_arguments.pointer = m; expected_register_arguments.elements = 7; expected_register_arguments.element_size = sizeof m[0]; #pragma starpu register m expected_register_arguments.pointer = m3d; expected_register_arguments.elements = 14; expected_register_arguments.element_size = sizeof m3d[0]; #pragma starpu register m3d #if 0 assert (data_register_calls == 17); #else assert (data_register_calls == 13); #endif free (y); free (yy); heap_alloc (42, 77); assert (free_calls == 1); return EXIT_SUCCESS; }