312 changes: 165 additions & 147 deletions openmp/libomptarget/src/device.cpp

Large diffs are not rendered by default.

305 changes: 127 additions & 178 deletions openmp/libomptarget/src/omptarget.cpp

Large diffs are not rendered by default.

34 changes: 22 additions & 12 deletions openmp/libomptarget/test/mapping/data_member_ref.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
// RUN: %libomptarget-compilexx-run-and-check-generic

// Wrong results on amdgpu
// XFAIL: amdgcn-amd-amdhsa

#include <stdio.h>

struct View {
Expand All @@ -26,42 +23,55 @@ int main() {
int Data = 123456;
V1.Data = &Data;
Foo<ViewPtr> Baz(V1);
int D1, D2;

// CHECK: Host 123456.
printf("Host %d.\n", Bar.VRef.Data);
#pragma omp target map(Bar.VRef)
#pragma omp target map(Bar.VRef) map(from : D1, D2)
{
// CHECK: Device 123456.
printf("Device %d.\n", Bar.VRef.Data);
D1 = Bar.VRef.Data;
printf("Device %d.\n", D1);
V.Data = 654321;
// CHECK: Device 654321.
printf("Device %d.\n", Bar.VRef.Data);
D2 = Bar.VRef.Data;
printf("Device %d.\n", D2);
}
printf("Device %d.\n", D1);
printf("Device %d.\n", D2);
// CHECK: Host 654321 654321.
printf("Host %d %d.\n", Bar.VRef.Data, V.Data);
V.Data = 123456;
// CHECK: Host 123456.
printf("Host %d.\n", Bar.VRef.Data);
#pragma omp target map(Bar) map(Bar.VRef)
#pragma omp target map(Bar) map(Bar.VRef) map(from : D1, D2)
{
// CHECK: Device 123456.
printf("Device %d.\n", Bar.VRef.Data);
D1 = Bar.VRef.Data;
printf("Device %d.\n", D1);
V.Data = 654321;
// CHECK: Device 654321.
printf("Device %d.\n", Bar.VRef.Data);
D2 = Bar.VRef.Data;
printf("Device %d.\n", D2);
}
printf("Device %d.\n", D1);
printf("Device %d.\n", D2);
// CHECK: Host 654321 654321.
printf("Host %d %d.\n", Bar.VRef.Data, V.Data);
// CHECK: Host 123456.
printf("Host %d.\n", *Baz.VRef.Data);
#pragma omp target map(*Baz.VRef.Data)
#pragma omp target map(*Baz.VRef.Data) map(from : D1, D2)
{
// CHECK: Device 123456.
printf("Device %d.\n", *Baz.VRef.Data);
D1 = *Baz.VRef.Data;
printf("Device %d.\n", D1);
*V1.Data = 654321;
// CHECK: Device 654321.
printf("Device %d.\n", *Baz.VRef.Data);
D2 = *Baz.VRef.Data;
printf("Device %d.\n", D2);
}
printf("Device %d.\n", D1);
printf("Device %d.\n", D2);
// CHECK: Host 654321 654321 654321.
printf("Host %d %d %d.\n", *Baz.VRef.Data, *V1.Data, Data);
return 0;
Expand Down