https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119662

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|[OpenMP] Unhelpful debug    |[OpenMP] Wrong-code for
                   |line location for           |'omp dispatch' with
                   |append_args call            |append_args clause and
                   |                            |unhelpful debug line
                   |                            |location
           Keywords|                            |wrong-code

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> ---
-fdump-tree-optimized-lineno:

  [testsuite/libgomp.c/append-args-fr-1.c:66:21] is_targetsync = 0;
  interopobjs.56[0] = &interop.58;
  tgt_tgtsync.57[0] = 1;
  GOMP_interop (-5, 1, interopobjs.56, tgt_tgtsync.57, 0B, 0, 0B, 0, 0B, 0,
0B);
  [testsuite/libgomp.c/append-args-fr-1.c:68:13] interop.60_58 = interop.58;
  [testsuite/libgomp.c/append-args-fr-1.c:68:13] cleanuptmp.59_60 = f0_1_tg_
(interop.60_58);
  [testsuite/libgomp.c/append-args-fr-1.c:68:9 discrim 1] GOMP_interop (-5, 0,
0B, 0B, 0B, 0, 0B, 1, interopobjs.56, 0, 0B);
  [testsuite/libgomp.c/append-args-fr-1.c:68:9 discrim 2] interop.58 ={v}
{CLOBBER(eob)};
  [testsuite/libgomp.c/append-args-fr-1.c:68:11 discrim 2] i_63 =
cleanuptmp.59_60;
  [testsuite/libgomp.c/append-args-fr-1.c:69:7] if (i_63 == 4242)

* * *

WRONG CODE ISSUE:


The original issue leading me to find the debugger issue is a crash at runtime.
The problem is a missing '&' before 'interopobjs' in:

  GOMP_interop (-5, 1, interopobjs.56, tgt_tgtsync.57, 0B, 0, 0B, 0, 0B, 0,
0B);
  GOMP_interop (-5, 0, 0B, 0B, 0B, 0, 0B, 1, interopobjs.56, 0, 0B);

I keep getting confused whether the '&' is technically required or not, but

  #pragma omp interop init(target: myobj)

successfully uses

  interopobjs.88[0] = &myobj;
  tgt_tgtsync.89[0] = 1;
  GOMP_interop (-5, 1, &interopobjs.88, &tgt_tgtsync.89, 0B, 0, 0B, 0, 0B, 0,
0B);


 * * *

I think the problem is the following (at least on x86-64-gnu-linux).

Assume 'omp_interop_t interopobjs[2]'.

Without '&', I think a 2*sizeof(omp_interop_t) = 2*sizeof(void *) object is
passed on the stack (by value).

But we want to pass the address of the 'interopobjs' array - which is
sizeof(void*).

Reply via email to