| /* PR middle-end/109816 */ | |
| /* This variant: without -flto, see target-map-class-2.C for -flto. */ | |
| /* iostream.h adds 'globl _ZSt21ios_base_library_initv' with _GLIBCXX_SYMVER_GNU, | |
| but it shouldn't end up in the offload assembly but only in the host assembly. */ | |
| /* Example based on sollve_vv's test_target_data_map_classes.cpp; however, | |
| relevant is only the 'include' and not the actual executable code. */ | |
| #include <iostream> | |
| #include <omp.h> | |
| using namespace std; | |
| #define N 1000 | |
| struct A | |
| { | |
| int *h_array; | |
| int size, sum; | |
| A (int *array, const int s) : h_array(array), size(s), sum(0) { } | |
| ~A() { h_array = NULL; } | |
| }; | |
| void | |
| test_map_tofrom_class_heap () | |
| { | |
| int *array = new int[N]; | |
| A *obj = new A (array, N); | |
| #pragma omp target map(from: array[:N]) map(tofrom: obj[:1]) | |
| { | |
| int *tmp_h_array = obj->h_array; | |
| obj->h_array = array; | |
| int tmp = 0; | |
| for (int i = 0; i < N; ++i) | |
| { | |
| obj->h_array[i] = 4*i; | |
| tmp += 3; | |
| } | |
| obj->h_array = tmp_h_array; | |
| obj->sum = tmp; | |
| } | |
| for (int i = 0; i < N; ++i) | |
| if (obj->h_array[i] != 4*i) | |
| __builtin_abort (); | |
| if (3*N != obj->sum) | |
| { | |
| std::cout << "sum: " << obj->sum << std::endl; | |
| __builtin_abort (); | |
| } | |
| delete obj; | |
| delete[] array; | |
| } | |
| void | |
| test_map_tofrom_class_stack () | |
| { | |
| int array[N]; | |
| A obj(array, N); | |
| #pragma omp target map(from: array[:N]) map(tofrom: obj) | |
| { | |
| int *tmp_h_array = obj.h_array; | |
| obj.h_array = array; | |
| int tmp = 0; | |
| for (int i = 0; i < N; ++i) | |
| { | |
| obj.h_array[i] = 7*i; | |
| tmp += 5; | |
| } | |
| obj.h_array = tmp_h_array; | |
| obj.sum = tmp; | |
| } | |
| for (int i = 0; i < N; ++i) | |
| if (obj.h_array[i] != 7*i) | |
| __builtin_abort (); | |
| if (5*N != obj.sum) | |
| { | |
| std::cout << "sum: " << obj.sum << std::endl; | |
| __builtin_abort (); | |
| } | |
| } | |
| int | |
| main() | |
| { | |
| test_map_tofrom_class_heap(); | |
| test_map_tofrom_class_stack(); | |
| return 0; | |
| } |