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

    <tr>
        <th>Summary</th>
        <td>
            unexpected ifunc behavior
        </td>
    </tr>

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

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

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

<pre>
    I tested the following with symbols of AOR lib
```
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stringlib.h>
#include <sys/auxv.h>

#ifndef HWCAP2_MTE
#define HWCAP2_MTE (1 << 18)
#endif

#ifndef HWCAP_SVE
#define HWCAP_SVE (1 << 22)
#endif

#ifndef AT_HWCAP2
#define AT_HWCAP2 26
#endif

#ifndef AT_HWCAP
#define AT_HWCAP 16
#endif

static inline bool mte_supported(void)
{
    unsigned long hwcaps = getauxval(AT_HWCAP2);
    if (hwcaps & HWCAP2_MTE)
        return true;
    return false;
}

static inline bool sve_supported(void)
{
    unsigned long hwcaps = getauxval(AT_HWCAP);
    if (hwcaps & HWCAP_SVE)
        return true;
    return false;
}

#define STRINGIFY_IMPL(X) #X
#define STRINGIFY(X) STRINGIFY_IMPL(X)
#define DISPATCH(NAME, SVE, MTE, ASIMD)                                                                                                             \
    extern typeof(ASIMD) NAME __attribute__((ifunc(STRINGIFY(__tiflash_##NAME##_resolver))));                                                       \
    _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wunused-function\"") static typeof(ASIMD) * __tiflash_##NAME##_resolver(void) \
    {                                                                                                                                               \
        if (sve_supported())                                                                                                                        \
            return SVE;                                                                                                                             \
        if (mte_supported())                                                                                                                        \
            return MTE;                                                                                                                             \
        return ASIMD;                                                                                                                               \
    }                                                                                                                                               \
    _Pragma("GCC diagnostic pop")
#undef memcpy
#undef memmove
#undef memset
#undef memchr
#undef memrchr
#undef memcmp
#undef strcpy
#undef stpcpy
#undef strcmp
#undef strchr
#undef strrchr
#undef strchrnul
#undef strlen
#undef strnlen
#undef strncmp

DISPATCH(memcpy, __memcpy_aarch64_sve, __memcpy_aarch64_simd, __memcpy_aarch64_simd)
DISPATCH(memmove, __memmove_aarch64_sve, __memmove_aarch64_simd, __memmove_aarch64_simd)
DISPATCH(memset, __memset_aarch64, __memset_aarch64, __memset_aarch64)
DISPATCH(memchr, __memchr_aarch64_sve, __memchr_aarch64_mte, __memchr_aarch64)
DISPATCH(memrchr, __memrchr_aarch64, __memrchr_aarch64, __memrchr_aarch64)
DISPATCH(memcmp, __memcmp_aarch64_sve, __memcmp_aarch64, __memcmp_aarch64)
DISPATCH(strcpy, __strcpy_aarch64_sve, __strcpy_aarch64, __strcpy_aarch64)
DISPATCH(stpcpy, __stpcpy_aarch64_sve, __stpcpy_aarch64, __stpcpy_aarch64)
DISPATCH(strcmp, __strcmp_aarch64_sve, __strcmp_aarch64, __strcmp_aarch64)
DISPATCH(strchr, __strchr_aarch64_sve, __strchr_aarch64_mte, __strchr_aarch64)
DISPATCH(strrchr, __strrchr_aarch64_sve, __strrchr_aarch64_mte, __strrchr_aarch64)
DISPATCH(strchrnul, __strchrnul_aarch64_sve, __strchrnul_aarch64_mte, __strchrnul_aarch64)
DISPATCH(strlen, __strlen_aarch64_sve, __strlen_aarch64_mte, __strlen_aarch64)
DISPATCH(strnlen, __strnlen_aarch64_sve, __strnlen_aarch64, __strnlen_aarch64)
DISPATCH(strncmp, __strncmp_aarch64_sve, __strncmp_aarch64, __strncmp_aarch64) 
```
when I override the symbol uses runtime dispatching, everything works fine.

Then, I tried the indirect function method shown above (compiled with `-O0/-O3`, clang 13.0.0 with lld), and I started to get random crashes.

Am I doing something wrong here? Or does this appear to be a bug in LLVM?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNWFtv4jgU_jXhxSrKpcDwwAOF7QxSO62m1czsvkRO4hDvOnZkO9D--z1OCCTgUHbV3akVgfMd-zsXHzu2I5G8zlZIE6VJgnRGUCoYE1vK12hLdYbUax4JppBI0fzhG2I0ctyl486dsbt76lc_oDxmZUKQEyyUTiIh2DBzgt965AlJz4kp12fEEsx7QwyG9rd4VY5_i8uXTbvJvmHKwTj05cdi_uiH988HCoApJy0JcvxPnmGEB3mfHH-6b0t4QtMzzOHTdzuxEXR4ff9C3vlzWJt2zLsXIH_8T4j6eJB3hkZprGmMKGemi0kDlGsSqrIohIQkA9c2giYHnyY3dQVBKbmiaw6ZyAQkYLaNcaEgDku0JtqMF2bQ_eAncASt3jQ1gWt6-eP2GDbq0K5IokvJkZYl6XDs8BQzdRA4k-UbLqrNf-LiZR5WufSeDh6G_On52-rr59Xt7-Hq_vEOdP8ERaA5-Nnbsmlk7Xrca7l6epw_L76A-Ov8HrxYoMqZBaoGbYHmT6v7paH7P4szWhwCRl40MYF8LYhIzdg0FhmDURhiDQtOVEKOhyCFh6Ylj-G_HZEw1DRlWGXQJoCndtbUQkmUYBsiTXT2T3DzHqaHjxKvc1yZ5X9eLFBC8ZoLZbK3KFXmVGvL2WaQq0JCthpe37_6UfJSkeTKuKip4DW849nNi9NIOf4cXRSBZt503YD5804D-16lY54p9cQ8XgXqwfwwRpqym_5mkv3rHHuf0hPD44_Fx42hWaE-Wgx3ptUz7xcbh45n8fIXm3NcLl8rReF0t2FltVHKSR4Xr6dgLjbkFFVEW_pn8hSUVjTOiyMQtrqn-pUubKC0dz9RBKAdBZCX7BRnhJ-C3I4ebKh-W1__XSjhix-GdT3EGHSOr0NYVe04zZMzgqlNRzUyTR_zYtXSFbTVWCRWPWasmz5Qb7pcjllZzbjsHc6kPUItHNZSG97DLtv0stP-ctBuNwz73o68sNt9wO3YKfMu_avWdf2UuYvbMRtz0WIuepgLC3PxJrPcR6Ou220-jsYxZmduBrCu25lt-dHFe9g79L38vQou0LBbYlomwWufF23RkSMtUY8mszw1HaBu1dHG2wpaeA87b9PzPn7eIbKCdvZ2AvG-DOK2FOqCsM223eVsM8LRCsFKJyVNSHUrVF8DIdj7KyRLrmlO4AOpCqzjjPK1UUCg_avOqpsjIf9SyBzwhu3l_jmrw7KCUyndXTdRnlBJYo2aEwV86XQmEqQyseUIR2CG2RbGIi8og07VrRTYevXgOv7t1UNg7AbSmGHQ7AVDd-jWjRirVmeQYZ6AUjieyOqWS5izNpKAihzFEs4kRHUMnefQPBHGFSWMPZVTsjqwEwnH5lv0IKEBBANkCuGiIFga4oggjKJyDX6hu7vv99B0kMyCZBpM8UBTzcis5OSlAI_BkuqkCH0yvKFCDkrJZpnWhXIC-GzewrMGP8poCM7DC2Ob5u-qkOJP4IBXqlRJzH3WaOx7_iCbRdgnnjf1vNS7nniu6wU4itzROLh24zTxrwcMR4SpmTO6gU0NJ1tUUZgNzmg5oDPf9X137I88NxiNguHEi6aT8dQlySSN3UniXLskx5QNjR1DIdcDOatMAq8VCBlVWh2EWFXXHaRSB_y4hNGVsyeYpSKBsBL5R1YOKgtmlQd_A0ZmuK4">