<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/145888>145888</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [flang][openmp] undefined symbols with device runtime on amdgpu
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          VeeEM
      </td>
    </tr>
</table>

<pre>
    I'm getting some undefined symbols with the flang offload runtime if I try to assign to an array in a target region. Array assignments in target regions have worked previously.

Here's a reproducer
```
program assign
implicit none

integer, dimension(10) :: xs

!$omp target map(xs)
xs = 1
!$omp end target

print *, xs

end program
```

Trying to build it with
`$ flang -fopenmp --offload-arch=gfx1100 assign.f90 -L$RUNTIME_DIR`
outputs
```
flang-21: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
flang-21: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
flang-21: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
ld.lld: error: undefined symbol: std::in_place_index<0ul>
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(void std::_Construct<std::__detail::__variant::_Uninitialized<Fortran::runtime::AssignTicket, true>, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor&, Fortran::runtime::Descriptor const&, int&, void* (*&)(void*, void const*, unsigned long), Fortran::runtime::typeInfo::DerivedType const*&>(std::__detail::__variant::_Uninitialized<Fortran::runtime::AssignTicket, true>*, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor&, Fortran::runtime::Descriptor const&, int&, void* (*&)(void*, void const*, unsigned long), Fortran::runtime::typeInfo::DerivedType const*&))
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(void std::_Construct<std::__detail::__variant::_Uninitialized<Fortran::runtime::AssignTicket, true>, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor&, Fortran::runtime::Descriptor const&, int&, void* (*&)(void*, void const*, unsigned long), Fortran::runtime::typeInfo::DerivedType const*&>(std::__detail::__variant::_Uninitialized<Fortran::runtime::AssignTicket, true>*, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor&, Fortran::runtime::Descriptor const&, int&, void* (*&)(void*, void const*, unsigned long), Fortran::runtime::typeInfo::DerivedType const*&))
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(void std::_Construct<std::__detail::__variant::_Uninitialized<Fortran::runtime::FinalizeTicket, true>, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor const&, Fortran::runtime::typeInfo::DerivedType const&>(std::__detail::__variant::_Uninitialized<Fortran::runtime::FinalizeTicket, true>*, std::in_place_index_t<0ul> const&, Fortran::runtime::Descriptor const&, Fortran::runtime::typeInfo::DerivedType const&))
>>> referenced 11 more times

ld.lld: error: undefined symbol: Fortran::runtime::DerivedAssignTicket<true>::Begin(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_19DerivedAssignTicketILb1EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_19DerivedAssignTicketILb1EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DescriptorIoTicket<(Fortran::runtime::io::Direction)0>::Begin(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE0EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE0EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DescriptorIoTicket<(Fortran::runtime::io::Direction)1>::Begin(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE1EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE1EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::DerivedAssignTicket<false>::Begin(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_19DerivedAssignTicketILb0EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_0clINS0_19DerivedAssignTicketILb0EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::DerivedAssignTicket<true>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_19DerivedAssignTicketILb1EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_19DerivedAssignTicketILb1EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DescriptorIoTicket<(Fortran::runtime::io::Direction)0>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE0EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE0EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DescriptorIoTicket<(Fortran::runtime::io::Direction)1>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE1EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr18DescriptorIoTicketILNS6_9DirectionE1EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DerivedIoTicket<(Fortran::runtime::io::Direction)0>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr15DerivedIoTicketILNS6_9DirectionE0EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr15DerivedIoTicketILNS6_9DirectionE0EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::io::descr::DerivedIoTicket<(Fortran::runtime::io::Direction)1>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr15DerivedIoTicketILNS6_9DirectionE1EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_2io5descr15DerivedIoTicketILNS6_9DirectionE1EEEEEDaRT_)

ld.lld: error: undefined symbol: Fortran::runtime::DerivedAssignTicket<false>::Continue(Fortran::runtime::WorkQueue&)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_19DerivedAssignTicketILb0EEEEEDaRT_)
>>> referenced by /tmp/a.out.amdgcn.gfx1100-542f42.img.lto.o:(_ZZN7Fortran7runtime6Ticket8ContinueERNS0_9WorkQueueEENK3$_1clINS0_19DerivedAssignTicketILb0EEEEEDaRT_)
clang: error: ld.lld command failed with exit code 1 (use -v to see invocation)
/home/acc/llvm-stuff/llvm_upstream/install/bin/clang-linker-wrapper: error: 'clang' failed
flang-21: error: linker command failed with exit code 1 (use -v to see invocation)
```


I'm on commit 163871c2d269fe0bf34800739245aa55fe851be0 and have built clang and flang with these configurations:
```
cmake \
  -G Ninja \
 -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=$INSTALLDIR \
 -DCMAKE_CXX_STANDARD=17 \
  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
 -DCMAKE_CXX_LINK_FLAGS="-Wl,-rpath,$LD_LIBRARY_PATH" \
 -DLLVM_ENABLE_ASSERTIONS=ON \
  -DLLVM_TARGETS_TO_BUILD='X86;AMDGPU' \
 -DLLVM_LIT_ARGS=-v \
  -DLLVM_ENABLE_PROJECTS='clang;mlir;flang;lld' \
 -DLLVM_ENABLE_RUNTIMES='compiler-rt;openmp;offload;flang-rt' \
 -DRUNTIMES_amdgcn-amd-amdhsa_LLVM_ENABLE_RUNTIMES=libc \
 -DLLVM_RUNTIME_TARGETS='default;amdgcn-amd-amdhsa' \
 -DLLVM_CCACHE_BUILD=ON \
  ../llvm-project/llvm
```
  
And the offload runtime with these:
```
cmake  \
  -DLLVM_ENABLE_RUNTIMES=flang-rt \
 -DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
 -DCMAKE_C_COMPILER=clang \
  -DCMAKE_CXX_COMPILER=clang++ \
 -DFLANG_RT_DEVICE_ARCHITECTURES='gfx1100' \
  -DFLANG_RT_INCLUDE_TESTS=OFF \
  ../llvm-project/runtimes/
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWltzm8gS_jXjlylUMAhdHvSAACWcyJIPwkl2X6gRDNJshhlqGBT7_PpTw8W25Nib7CYp2UlKqXBpvv66--sWqjSuKrrjhMyAMweOf4FrtRdy9p6Q4PJiK7LbWQjQuIA7ohTlO1iJgsCaZySnnGSwui22glXwM1V7qPYE5gzzHRR5zgTOoKy5ogWBNIchVPIWKgFbj80Rh1hKfAsphxgqLHdEQUl2VPABdJs7rXFBuKq01ZFNBff4QOBnIT-RDJaSHKioK3Y7AKYLTPctkQSgcQUxlKSUIqtTIvWtkdl9TLeUYidx0bkBpkuLktGUKsgFJy0O5YrsiATIgxktCK-o4ABNLBOgKQS2C2wX3lStLUAWQENRlD3TApcATW4qgKbAdG8qCGwfWkeWhGeddYtRSsoVBMjVHntgbdSRPQkBmG4sb3VplIDbmrIMUtXUozNEw64oRi5KwosSGkZXHwPLdA9sf5ffWJZpdmkY5FMTGkuAhtH1Kg4vg8QPo9aZqFVZq-qEQgNvIEtn4jOWnPKdPlyXhF9ewaouSyGVLl_Lg1awUpQxSG5KInVKFWYQOHPjw8MrhiiVTrXjvxoXLBswlmlUIqWQ-uC0lfS1SmWtrihPSoZTklCekRtge2bNgB3o9NtB-4GS5EQSnpIMbm8hQAtVlAAt8EDUaoCLbJfyQVdfwxmifIgGtNgNmBIDob2gyUHQ7N5n4gleKVmnCtje_dUkIwpT1p8dsKSYq-70mlNOFcWM_o9kwPYWQiqJeXu3mwHtidsoLKbpJ6K0vpWsiQ4EeU9Fnai7uGGqqQE00uZP-_BJlUpaKiG_wfQIm_L-SOcGIBcCNGk6cqQbuU1Z16FN9rqHmws1byZqBpngu8b8OQbqtiQhz0XPR9IDyeLbkjzAHDUZmvy8Yri_6_F8PTTK9Hcb_mpl_92G51WPl96GC8obq5_ViF_5wN8m_0d1wjP5-FG98P1S8qwYLQsWQhKoEbtX-q98GXwuiIbF0fiwvT5jjcmc7Kj-sfI0yAchP_23JjXpQvi-zZT8-edq3Dkfd35HLdWJJ7iivCZBtNqYyfSOSBCs3tkADRMzZaG-ZU2_EGm43FqB_uPjKE5ePPPvIAfaiTPT2j6VeSjuBPKsHHoQn0qSNj9c0NR8XXJCVDhNjqzJ4_yEy9VmlEzvwg_MsxfZv43nnKVn_crSO__59m_j-WFfgjlm1S_yLXj-A-rrmf-cl6Ke-EtVhPVi34u-nfk5fzmZr05Rr-XV6HvFc87qs35x9Z3_lDuDt6Mvqq-ZvL8H35dL5Zzk50VPvX8QzNmK7jXPu7-t00sadv8gmJ_0O_C1COfl_RT8ZuYpw-36xZ0cWoXAVBQF5hnMMWUka_eOyA1VMBUZgRYEaFJXBBoHqASsCIGUH0SKuyHSLN4s9qIgOvg0BWjB2KEwKlXneXeS1GWlJMEFQAvKK4UZA2ixpRygRUPLYJR_ItL4LHFZEnnEEqBxSx2NO4onmyX38TQg3yGe410gYLrtwpbgDTZV0BrZk7GVogyNpjkxt7k9nJjm2J6ioYOx4-Rk4lhbYkLNo1mp2taUKdgE0lxsN176Ha-q-U-PnO5q2fCotECOiaQF_kQgcDxguhAab-CK8r9wf8HwvUv3XZDMr8Oln8R_XAXA9iPCCK4ePNQZhatN7C6XyVUULMKPwPYBGnbX_DA6hfQ-fkw2sbvy3cgHtm-NH-EFH6_WUZx468urcBnofy_dlb8Btr9efQltGa7eJYul-2bT-EbGBwaQZ8gSqz1AHkDDpZ8sw3nkRn8kV278FiB0j7Ncvr9MgpU7XwaJu9kEURyuV8fOeqvYjd4E8SaJ121iGnfjj5MRsOfupf_m6lqL6hh5GcaJGzXUjMMpYOf2Klr_J_Diln6nTnteMCqBPc-7Uz18H6F3AN0WWA8gipIyIg2pgD1vN8r0QbtR1kPquw_xeoyknTUGLjL9d1_h5AlXjG7TEz79OlqXqZZPRnJcM83lEfTjiDzP9d4Gd_l9UITBoJ8FpRR_kVR1pyfChhCYrsuzZtfxdMvxvkGe6ognSvQg7D5798QXS3f1JolirdwgCi-DVewuk_VisVy7frK5vtJ6brXZ7qodCbATcq_3CNh-29enfaG1fmoE0Byg-Reo-MH70AsSN_LehnHgxddRL4_uS-RB6h8-F6685bUfJHGwaeq3XiyerUCX2QqgxcN8XmQzO5vaU3xBZtbYMadD25wOL_Yzy8LYHG7tae6kIz3VxlMzz2yEyDi1HHN6QWfIRI45QiPLNofOcJCmJrKHo3yKMLEsMgJDkxSYsoFmMhByd0GrqiYza-hMJpMLhreEVc2yLEJt8yAEHP9Czhrq23pXgaHJaKWqewhFFWs2bNsnHB84fec4_lPbtBk50JTciUtwqAVe1he1ZLO9UmUzd9ECoMWOqn29HaSi6FX7KJNNFDqPXSCHGfp_AAAA__9hNuys">