On Fri, Jul 17, 2015 at 05:43:09PM +0300, Ilya Verbin wrote: > On Fri, Jul 17, 2015 at 15:54:13 +0200, Jakub Jelinek wrote: > > These tests had a thinko, computation performed on the offloaded copy of the > > a variable, but then tested on the host side, without #pragma omp target > > update or similar. > > Fixed thusly. > > In my testing linear-2.C still causes SIGSEGV on target in f1<int>: > > 0x7ffff6fc3872 <_Z2f1IiEvRT_._omp_fn.29(void)>: push %rbp > 0x7ffff6fc3873 <_Z2f1IiEvRT_._omp_fn.29(void)+1>: mov %rsp,%rbp > 0x7ffff6fc3876 <_Z2f1IiEvRT_._omp_fn.29(void)+4>: push %rbx > 0x7ffff6fc3877 <_Z2f1IiEvRT_._omp_fn.29(void)+5>: sub $0x48,%rsp > 0x7ffff6fc387b <_Z2f1IiEvRT_._omp_fn.29(void)+9>: mov > %rdi,-0x48(%rbp) > 0x7ffff6fc387f <_Z2f1IiEvRT_._omp_fn.29(void)+13>: lea > -0x34(%rbp),%rax > 0x7ffff6fc3883 <_Z2f1IiEvRT_._omp_fn.29(void)+17>: mov > %rax,-0x18(%rbp) > 0x7ffff6fc3887 <_Z2f1IiEvRT_._omp_fn.29(void)+21>: mov > -0x48(%rbp),%rax > 0x7ffff6fc388b <_Z2f1IiEvRT_._omp_fn.29(void)+25>: mov (%rax),%rax > 0x7ffff6fc388e <_Z2f1IiEvRT_._omp_fn.29(void)+28>: mov (%rax),%rax > => 0x7ffff6fc3891 <_Z2f1IiEvRT_._omp_fn.29(void)+31>: mov (%rax),%edx > > (gdb) x $rax > 0x7fff537fc1ec: Cannot access memory at address 0x7fff537fc1ec > > Probably something wasn't mapped.
Yeah, I've noticed too. Most likely this is about the implicit map(tofrom:i) where i is int &. I think it boils down to: #pragma omp declare target void use (int &); #pragma omp end declare target void foo (int &p) { #pragma omp target map(tofrom:p) { use (p); } } where we map the reference (i.e. the pointer), rather than what it points to plus pointer translate the reference to the new copy. Guess I'll ask on omp-lang. Jakub