<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59167>59167</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
ifunc does not require resolver function to have no arguments
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend,
clang:diagnostics
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
arsenm
</td>
</tr>
</table>
<pre>
For some reason, both clang and gcc seem to not perform any verification on ifunc resolver functions. Both accept resolver functions taking arguments and produce code. As far as I can tell, this is totally invalid. The GCC documentation states "the resolver's declaration is be a function returning pointer to void function returning void".
[My skimming of the glibc sources suggests nothing can ever be passed here](https://sourceware.org/git?p=glibc.git;a=blob;f=sysdeps/x86_64/dl-irel.h;h=412bf18de3dc422659e5b11d75ce3de455cb705f;hb=HEAD#l32) for x86.
However, [AArch64's elf_ifunc_invoke has a little more going on](https://sourceware.org/git?p=glibc.git;a=blob;f=sysdeps/aarch64/dl-irel.h;h=88a45abeff338f756f9c35a43e2d20378f197026;hb=HEAD#l33). I'm not sure if user functions should/need to be looking for this hwcap argument.
```
int foo(int x) {
return x + 1;
}
int bar(int x) {
return x + 2;
}
// These arguments should not be allowed
extern "C" void *resolver(int x, int y) {
return x ? (void*)foo : (void*) bar;
}
__attribute__((ifunc("resolver")))
extern int call_ifunc(int x, int y);
int caller() {
return call_ifunc(3, 9) + 4;
}
```
I was looking into adding an IR verifier check for ifunc types, but a frontend error is probably needed before doing that.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VUtz4zYM_jXyBbMai7JeBx0ce93NoZdO7x6KhCxuKNElqST-9wUpO4mbTaeXemibDxD48OHBzshLezAWnBkRLHJnpoTtoDN-AKH5dAI-STgJAQ5xBG9gMh7OaHtjRzq7wDNa1SvBvTIT0FD9PAlS5YymIwircORSeAhKuRB49r84B8-fVLBnT_OIk3fR8tkaOQsEYSSmsHXQcwvcwSMIPoFHrQNcPygHNLzxXOsLqOmZayVT-HNA-G23A2lEVLqgdPSPDhLG_IBvUBJWOZBIXttFjBR2CPwNIkn62U4B5NmoyRN64uPZKPkrkbBPFlJI1vtkvb3-Fg-_X8A9qXEMMqaHgOCkVUcEm9kKguXm0wkd-U9MD0EqeIqBK0Jz5s6hhAEtJsU-YfXg_dkl-TZhBxqLjhduMTX2RBsn5ZP8cE7yfTSSxvUDp3WnTUfTnqbu4iSSFnZ4rctjuaGJ1N-URZ0OJELf_SZjXZ_VEnMpNoyVRYNFl2WyKgRt4aYoRFetiz6Ik9r9j-9bQpfrnCWsAUoWINXpRyp-mBeMrO-AWNlurRiCZYoB6v4Ys-hIcTRPCAMFnINW3muE0VhizET6pv-DA86vUD6RUNd8U_AO-z7P674qyr4RecE3OTLJ1nlV91lTrVn5iYScSEjhkbwbY_24mXxQPczurgLcYGZNSXOYkGJMuUUB18bEsggUxjQfXgQ_v1XJHaVJub6OuKQUpWuGCAqz1xCIpHpYzoA-S67CKxXCA2QE-qql2n9UGu523P43LewrLUtoQj06_FDii8eRk1BqWlNSyOUGvlKBTaFId_Rdyixh2_dqveHZQZhc_gVYfqCb9VKQhKQhUmhze78ZnfwC_fHIvbeqmz0ej3QrGA9hi1P2Dikk-3V89CHgE-Tc8XbpE_J3w_9gPlyLzn7l3p3ePOhsoigFY_NlMO7zZPl9hBcqs1u6kW0DXMrYkSd4_OPa5ylfxYDiKebj0ur95YwuPhqzD93SGmqN1LrR2iDjQg_veEdtOaQ1JTYVUKhhGWvYD_yWxCtss7JsGMuzuljJNpdN3vCVV1T27WJLGox9kbz_a6ba_PyOhLIZ-DOS1HuerWar2_suQU1gmLtUmJEWWj_f_r4R2p8oPC2Vc3Pw7FA0WVmthrbMq7Iusyavs3rTr4tuk4mGl1WOosywyFaamoN2LfUzyoX4fJK9GyExPXbw4UQqfpqM80q4cFjsV6pla8ayjCio1mVWp4isrrKmzDpZVZWUyWaNI1c6DVhDf1vZNsLu5pOjQ63o5Xg_pNdCnYj2CIn089kPxrbcOpzGVXSwjd79DcINhUU">