<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/111905>111905</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
-fsanitize=cfi-icall leads to eliminated icalls with optimization levels above -O0
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jwillbold
</td>
</tr>
</table>
<pre>
`-fsanitize=cfi-call` does not emit CFI statements and eliminates the icall during code elimination, leading to broken binaries.
We have created a minimal example highlighting the issue. The following code gets compiled using clang 19.1.0 x86_64 and `-O3 -fsanitize=cfi-icall -flto`
```c
void (*pFunc)();
int main(int argc, char** argv) {
pFunc = argv[1];
pFunc();
}
```
to
```
main:
mov rax,QWORD PTR [rsi+0x8]
mov QWORD PTR [rip+0x2edd],rax # 4018 <pFunc>
ud1 eax,DWORD PTR [eax+0x2]
```
When setting the `-O0`, it does emit the icall as expected. We created a compiler explorer example: https://godbolt.org/z/P71hx6xqs
However, we have also found that initializing the `pFunc` seems to stop the code elimination:
```c
void test() {
test();
}
//void (*pFunc)(); // Bad
void (*pFunc)() = &test; // Good
int main(int argc, char** argv) {
pFunc = (void (*)())**argv;
pFunc();
}
```
In that case the icall exists. Compiler explorer: https://godbolt.org/z/36hYWb7YW
We have also tested the previous clang version but cannot find a version where this compiles as expected.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVVuvozYQ_jXOyygRmEDggYdcmnafdrta6WifKmMPwVtjp7Yh6fn1lQ3NSbKnF1WNEMGe2zfjb8bMOXnSiDXJdyQ_LNjgO2PrbxepVGOUWDRG_F6TIlm2jmnp5SuS7MBbueRMKVIkIAw60MYD9tLD_vgBnGcee9TeAdMCUMleaubRge8QZDAEMVipT8CNwJuCNJrQPShkIsi8gcaaX1FDIzWzEt2KJAeSbKf3C0LHRgRukXkUwKCXWvZMAV5Zf1YInTx1Sp46H72F0M4NuIIvHUJrlDKXG4QTegfc9GepUMDgokAxfYK0WqWrBK5l8UuxjvmEYnzM4LuCTIktW-UNKZIZapFMD5_Wo5ECCC0J3Z6Pg-aEVnFVkWx3n5zUHnomNaFl-GT2xENpeMcsoVtCt2FrJLQCspkNAQCiTyDZYRLnu5Tkh5trmEM-xtscnqBOS2_u8TwJI7RslkFvxhDcsiuh-59fPn4-wKcvn4HkO-skobvkWgYYD8qPavIc1SgKETTp3rIrzD9CM1gnaQkk208JZD_MvgaRAsaoh3t3cSu4u0V9gv9Aow41OPQ3ksTjjbp0D9JP_I7cfmMvc4DXM3KPYgUv9xycOWSDXBkbPyIbSbaFzvuzC3WjR0KPJyMao_zK2BOhx1dCj582aXctrr-5e4A_mQuOaAOay0x5ppyB1gxagO-YBxl4yJR8vcthKlWRgEPsXWgm5805Sr9rumz77lnfc9aj8xNzHhn3tv8Oo6Z3TPbviA-TCuyY-IcuidQmtIhR3wx_NEb8r91DaHmH4Q1reIJ9NP9PbfVBT0fGmcM7QuFVOu9WsH-mz7-hTVZ0X1-azdeX98Zj5EqoF4oY72xxlGZw83gb0TppNDRDwKTDHG-lDkz-U3Lp0Aao8jYg3QP_74MuRJ2JKqvYAut0Q8u8rPJ1tehqThPKyrQqkoS2HDec83aTthsssK34ulzImiZ0nSZpklbrfF2txLrMs7yleUOLzYZTsk6wZ1KtlBr7kPwiTvM6TdMqyReKNahcvMUo1XiZZj2hYQYsbB2Mls1wcmSdqFjqmxsvvcL6L6Z5uIti89wuMTGdmIOL9B2Ys5e9fI1tBApHVA5YY0aE5cdkMVhVPx2e9N3QrLjpCT0GCPPf8mzNN-Se0GME7gg9zpmNNf0jAAD__7s-SS0">