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

            Bug ID: 100318
           Summary: [OpenMP] Offloading with two identically named static
                    functions fails
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: openmp
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

Based on
https://github.com/clang-ykt/omptests/tree/master/t-same-name-definitions

g++ -fopenmp A.cpp B.cpp

The problem for the example below is that the function 'fAB2' exists in both
translation units.  (The linked testcase tries the same also with global
variables, templates etc.)

With nvptx, the program fails with:
  lto1: fatal error: a-A.o: section _ZL4fAB2v$_omp_fn$0.3 is missing
where lto1 == nvptx-none/lto1  and   "_ZL4fAB2v" = "fAB2()".

It does compile with GCN offloading, which produces:
  _ZL4fAB2v._omp_fn.0.lto_priv.0
  _ZL4fAB2v._omp_fn.0.lto_priv.1
on the GCN side.

However, it does not seem to find the function name at runtime - such that
always the host version is executed. 


------ A.cpp --------------
int b ();

static int
fAB2 ()
{
  int i = 0;
  #pragma omp target map(tofrom: i)
    i = 42;
  return i;
}

int
a ()
{
  int res = fAB2 ();
  return res;
}

int main()
{
  if (a () != 42)
    __builtin_abort ();
  if (b () != 5)
    __builtin_abort ();
  return 0;
}
------ B.cpp --------------
static int
fAB2 ()
{
  int j = 0;
  #pragma omp target map(tofrom: j)
    j = 5;
  return j;
}

int
b ()
{
  return fAB2 ();
}

Reply via email to