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

    <tr>
        <th>Summary</th>
        <td>
            clang emits problematic LLVM bitcode with LTO and pointers to multiversioned functions
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    When LTO is enabled and a program takes a pointer to a multiversioned function, clang emits LLVM bitcode that causes any LLVM program reading it (e.g. lld and llvm-dis) to crash.

This happens with at least clang-8, clang-14, and clang-15. Here's an example with clang-14:

```
shachaf@iodine:~/r$ cat r.cpp
[[gnu::target("default")]]
void foo() {}

void (*f)() = 0;

void set_foo() {
  f = foo;
}
shachaf@iodine:~/r$ clang++ -flto=thin -c r.cpp
shachaf@iodine:~/r$ llvm-dis r.o
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llvm-dis r.o
 #0 0x00007f2c8cb6dd01 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3fd01)
 #1 0x00007f2c8cb6ba3e llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3da3e)
 #2 0x00007f2c8cb6e236 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe40236)
 #3 0x00007f2c8b837520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f2c8cb8e7f6 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe607f6)
 #5 0x00007f2c8cb7ea8e llvm::ModuleSummaryIndex::print(llvm::raw_ostream&, bool) const (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe50a8e)
 #6 0x0000000000405a37 (/usr/lib/llvm-14/bin/llvm-dis+0x405a37)
 #7 0x00007f2c8b81ed90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
 #8 0x00007f2c8b81ee40 call_init ./csu/../csu/libc-start.c:128:20
 #9 0x00007f2c8b81ee40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#10 0x0000000000403835 (/usr/lib/llvm-14/bin/llvm-dis+0x403835)
Segmentation fault
```

I'm not sure whether the main problem is with clang generating invalid bitcode or with other tools having trouble reading that bitcode, but presumably lld/llvm-dis segfaulting is a problem regardless.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVtuO4zYM_RrnRYjh--UhDzPNBLvALDroLNrHQLZlW11ZMiR5Ln9fUnYycZpu2wkcR4rEw0ORIlmp5n33R88kefz-K-GGMEkrwRpCJXzJqFWn6UAs_cEMzhWXlmliFUyGSVj-wrThSoJEO8nawtCLfiG1oLIjbODWkMfH37-RittaNYzYnlpS08kgnHyfF09aNKMNBzluiRcVzO98IsRMRYiXYdtw40UlKq81Nb3vBXsvuJvf33sg39NxZNKQV257AooEo8bOZLbFmdc2THCMsMs89ckXppkX5ciKsDc6jILNMGeR-O5Sn5cFy-Ompqd1T1svCbgCGxjuzh-86KC9KAGDLdF-PY6LbHoPTycn3BXfWao7ZsFiL4oa1lI4VhiBpV66x8fJvCgOR6yU21YSL7_38v0lIbfBrd61KLvsi_ck8OL7v-00zB7XcG6NkNbJ4NJZ6qToX4zEg_Kie3jIthUWAPa255Js60vjfw5y8jNIqHn_0-PD3fMDMVMF0QRRV00dBMqotMVA6K0dDUJEB3g6cNhU-bUaYIJQy88WIuxPVsOxHrgxE4MwOjj_c1mLyYUlm2OKVLT-YTWt2RJdzxb-IM00jOcACGCpfFpiFnw3DUxaJHGDPXgkDkjwFsAnb6O6qKusaYLQbZ3db97NPHjScLmcvu9IAFzzsUnT16MyFm4I2JRh-MJe5zl04EHwCt5vRXbMkq3gcnrbYni5BbxiEL--UX4IvgneWNwCA4yRM8XwimJFY3aL4m-TfOadpOILnJ6Aq3-Kn8-waEDJikV0xYJFcfYp6CQAyRV0fAldFXGeRsF_gK4RNHOgSQQiK8xkTbdgefs5uhlArOmma-ic0eLSH99UMwn2PA0D1e9fZcPe5v9H7aLip3FTKSXQZbWSxn6KbhoAmxXdbKE7f5IgpXG-QE9GnxW464HJ91BxeZq7pI7n66RWsPnaaSFryoAcj-iXo4GsaY81FeI4UEgyPuDVBjn7OISIbdiI91yOVizOvBbyezihtIBXmH1oLa61QjgRJ8MlZKArRfMQ0bcO3a8RLkLQKPgALW-Brky5ZcVN8DgvkfaSm-HuBlenHxcQP__79FHqfPrPrMOkRrGek7ki3ap68_sr1M2BSGUhSWuomj2DdKpdTnVGQfKFlmLA7uKjopKOSaZBAdZ7-UIF1KRTk6D0vFHNOBCwWNpfcKvVagKwc6vg-olFzkX3ZEEfM9MAbcw7tg8XlkLR65wxTqmZ-xtHTbOOakhoxvgbtguzLC_zOEyTTbOLmzIu6cZyK9jusq9ZZMGEet3jOO7YTmGFWTomg8XqHxoms5m02H2-kqVFUWSbfpemRVvWNC-zNA5pGbEqpxVrg6KiVZzE5UbAVJgdth9RJNkrcRDYa6T7Dd9FQRSFYVAGaQrJzW-CtGqTpgqTsqVtEULFBmu58JGHr3S30TtHCSqygUXBjTUfi9QYqBSMOXWATyfbK71byv_Gqd456n8BYg4tXA">