<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVV1v2zoM_TXOizAjsZO0efBDP7ZhQIENuwP2aFAS7WiVJU-Ukma__lJ203bt9rTAX5Io8vAcUpFen5oPPojeeglWqJi_0WGAaLwTyoLrhQwI9yTACeM6HwY2DMmiiHuI4h6DQyu65FTeQkKBK6qLKPZwwHlPZBPeY427hx5FUV3uYxypqK-K6gNfvdfS21j60PPoF9-SNH75hXJbVLuyWN4Wy6v5-f4BhpFDU0xSGDpjRS1g8vfCtNguNXbG4TMCGk1oHwEfvNGiWC_bj3efr6_u2paSbD-1OAcolVXjyEgZAAOuV4Jwyo8HVRnxIZYUIcTENhXPrbTs82u1yc85RAuhb0Hr0NIIKue9Wr9eVQqJ2p-Jwf1hOZ7GP26TQPjXxTz_0uPFtSjLkt-3zMhLgr7tMbBCfB8gGJ9IHOFErCrzqnyyWkgUnXlgco8m7p-sDBNk1FQgz5y_E19x8Ad8I3cpOA5LRQlnN5N_k-OgGD2RkcaaeBK-Ew4GzDVHe6TZ2LNVEDGAIzuXZHIm0uyUsvkYvLQ4ZI_akEpEjNc48arE2FmSpfIDD6w9nF_vePsPVpaHE0Tij029uajKc1rf8ZGMc6kJONf8McA4Zni5D46TkXEHf8-yMNOvSounhEwxp-3EEYVDxhm9GIDtKYXHdiIzGAvBnvIayMxoJuox4kQQZ8ok_GQ-YfDcnmDtW4ZYO8NrWQTUb5NJhOeen7FmMsp5ps2nAGW8kwTkOSaNqExnlPj0dY6VzwHKGP9KCzOJLoYTi8w1IbrgB7Z5PieIo8xSTRUBIcDpCWiu2IVuar2rd7CAFPc-NFcOuOnIwH8xWX-ARQq2-RedL5bbxb5ZXypcb2Bb7eSmXu8qvVxVW9hqrDfc1rhdWJBoqSk219zsfkSnLH8Um9vFv4c3TbWs-Fpx0Jp_5WqrsNaXu-Vyp2tExdrgAMaWk0J8RC5CM7mUqacsnCHuh6dF4IbqubYmtIwwmminwU1RMfzr9WfGf3PHS-LGu44bOeY6eepacPqsIzjn43S2PovW_f5fsZiyaaZU_ge1DSBn>53706</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [C++4OpenCL] Conflicting internal and kernel annotated functions for global ctor
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            opencl
      </td>
    </tr>

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

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

<pre>
    For global ctor generation clang breaks an informal rule that kernel functions can't have an internal linkage (https://godbolt.org/z/bsdePzeb6).

Example stub is generated as:

`define internal spir_kernel void @_GLOBAL__sub_I_example.clcpp() #1 section ".text.startup" !dbg !15 !kernel_arg_addr_space !4 !kernel_arg_access_qual !4 !kernel_arg_type !4 !kernel_arg_base_type !4 !kernel_arg_type_qual !4 { ... }`

There are various ways this could be fixed with various implications:
- Remove internal linkage. The issue with this is the possibility of name clashes with other translation units. The same problem is discussed in https://github.com/llvm/llvm-project/issues/53572.
- We could generate a kernel wrapper that would invoke `@_GLOBAL__sub_` but then we need to make sure that similarly to above the kernel name is unique among all translation units being linked.
- We could use global `@llvm.global_ctors` with some specific IR transforms to generate a kernel wrapper/entry point from a functions stored in this array.
- ... 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVNtu3DgM_RrPi1DD47llHvyQy3ZRIEAXbYE-GpREe7SRJVeUZjL9-lJ2Jskm7dMavkmiyMNzKEqvz81HH0RvvQQrVMz_6DBANN4JZcH1QgaEBxLghHGdDwMbhmRRxANE8YDBoRVdcipvIaHAFfUuigMccd4T2YT3WOMeoEdR1FeHGEcqVtdF_ZHv3mvpbSx96Hn0kx9JGv_5iXJb1PuyqO6K6np-__UIw8ihKSYpDF2wohYw-XtlWmwrjZ1x-IKARhPaJ8BHb7Qo1lX79_3nm-v7tqUk208tzgFKZdU4MlIGwIBXS0E45ceDuoz4GEuKEGJim5rnllr2-bPc5PccooXQt6B1aGkElfNert-uKoVE7Y_E4H6zHM_jb7dJIPzjYp5_7XF3I8qy5O8dM_KaoG8HDKwQP0cIxicSJzgTq8q8Kp-sFhJFZx6Z3JOJh2crwwQZNRXIC-cfxBcc_BHfyV0KjsNSUcLZzeTf5DgoRk9kpLEmnoXvhIMBc83RAWk29mwVRAzgyM4lmZyJNDulbD4GLy0O2aM2pBIR4zVOvCkxdpZkqfzAA2uPl88H3v4vK8vDCSLxz2a12dXlJa3v-ETGpdQEXGr-FGAcM7x8Dk6TkXFH_8CyMNNvSounhEwxp-3ECYVDxhm9GIDtKYWn40RmMBaCPec1kJnRTNRTxIkgzpRJ-MF8wuD5eIK17xli7QyvZRFQv08mEV7O_Iw1k1HOM23uApTxThKQ55g0ojKdUeLTlzlW7gOUMf6RFmYSXQxnFplrQnTBD2zz0ieIo8xSTRUBIcD5GWiu2IVuVnq_2sMimmixKTY3t0V9w_f684ju9r7Y3Ilb7zquxpiTfS49cPoCBpzzcWoQL5G7_za8RQq2-T_lsqu2i0OD1Rr36053V3JVqSXWayU3u91uu1l3sK3VwoJESzkN7hmeM1CWfziJhWnqquZ7WS3rFV_lcqtwpa_2VbXXK0TFAuEAxpaTTNwnF6GZ8MjUU1bPEB-K50XgU9VzgU2x2D-kePChuXbATYsMfI3J-iMsphyaKYFfQVALWw">