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

    <tr>
        <th>Summary</th>
        <td>
            [OpenMP] Libomptarget depends on `libffi`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            openmp
      </td>
    </tr>

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

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

<pre>
    We currently have a dependency on `libffi` in the CPU version of the offloading library. The dependency on `libffi` is unnecessary and also prevents us from having a unified way to pass  arguments to the offloading library. When we emit "kernels" for the CPU they are simply functions in a shared library, see https://godbolt.org/z/5j9r1x9xq.

```llvm
define weak_odr protected void @__omp_offloading_10302_bd4d1_main_l3(ptr %dyn_ptr, i64 %x) {
entry:
  %dyn_ptr.addr = alloca ptr, align 8
  %x.addr = alloca i64, align 8
  store ptr %dyn_ptr, ptr %dyn_ptr.addr, align 8
  store i64 %x, ptr %x.addr, align 8
  %0 = load i32, ptr %x.addr, align 4
 ret void
}
```

What we should do instead is emit this kernel with a known argument that is simply a natively packed struct of all the arguments. This would allow us to pass the arguments as simply a pointer and size, similarly to how both CUDA and HSA allow you to pass arguments.

```llvm
define weak_odr protected void @__omp_offloading_10302_bd4d1_main_l3(ptr noundef %args) {
entry:
 %args.addr = alloca ptr, align 8
  store ptr %args, ptr %args.addr, align 8
  %0 = load ptr, ptr %args.addr, align 8
  %dyn_ptr = getelementptr inbounds %struct.Args, ptr %0, i32 0, i32 0
  %x = getelementptr inbounds %struct.Args, ptr %0, i32 0, i32 8
  ret void
}
```

The code that generates this prologue is at https://github.com/llvm/llvm-project/blob/main/clang/lib/CodeGen/CGStmtOpenMP.cpp#L617, which is shared between all captured OpenMP statements.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VU-P4rgT_TTmUvqh4IQABw49IOZ3mNWONDuaI6rElcTdjp21K9CZT79yQtN0z3bvjLRaCQEu1Z9XrvdcGIKuLdFWLD-I5X6GPTfOb--bviCfzwqnhu03grL3niybARo8ESAo6sgqsuUAzoLIE6OLqtIiT0Bb4IZg9_krnMgH7Sy4ajS5qjIOlbY1GF149MMc_mjo3WQBemuppBDQD4BWAZrgoPN0IssB-gCVd23EFfMi9FZXmhSccQB20GEIAOjrvh392b0J5VtDFs4E1GoGIeUDeUsmCCmhcv7aFDc0AHqCoNvODFD1tmTtbIidI4QGPamnrELuIBBBw9wFkd4JeRDyUDtVOMNz52shD9-FPCzvN37xuHn8cy6SvUjuLt95Mn2MObWTSVGlLcGZ8OHolIfOO6aSScHJaQUiS45H13bH5waPiyRN5LFQmVocW9T2aFIh1x17EHKpBnvs2EecOs-i5VHIDYjVh6keWfZDBD6e4CZkjkp5EOke0BhXIlzSoNG1hfVNwOMPrjrP_sY1sPMEPwJ7aRmTvRn93MQ17vGtCCGXyYgq3hToVL4TlF2CPPF405cBrfavJnU7vm8NciRUaFxvFCgH2gamWCtMLONGB5h4BmfNDSA8WHe2V8ICxxw6PJENwSLrE5kBOiwfSEFg35ccJYbGjCS9kj2qSwc4j9XjzZ-jXJ5E8cIV8KZE57Rl8qPagv5OI4l1qw16M4qqcWcoHDew-7q_G93-_-XuUmFw_bXEM5L_ktXW9VZRFaeIvg7v0fni8pNUfsHPKfXu9vhzPHtJ6n-Iu3B-jK6JyVC8z2jRtoh9hug1cWB-9xJSMoo6lXDz50aU_1LOK9pfUUZ89UunaKJ3TZY8MoVJD513xtU9Rdojv346NTd9MS9dK-RhJND087_Ou3sqWchDYVwh5CGSQshDadDGV9boaNw5RR8p2ncfv3DLv3dkf_s8L7tOyPRTvljFts6NLptRdNNbXhCfiewosBI77qNxioTAyDRxfKa2qdqkG5zRdrFapIv1JpX5rNkulphilVUKszRZr7O1LHCZrSul8nS1kPlMb2UisyRbLBfpcimzeZZUZZ5glqQbKnNZiiyhFrWZx1bj2pjpEHrarterdD0zWJAJ4wqX0nVk205IGde53453U_R1EFlidODwnII1m3HxT62I5R4-6cK1HaOviS9rObzeybPem-0vD2XEG4Q8jJD_CgAA__-eerQt">