试图将GCC特定的asm goto移植到Clang

stq*_*ism 6 c linux gcc clang linux-kernel

我一直试图将一些GNU扩展转换为实际标准C,因此它将在clang上运行,知道标准C而不是GNU扩展,我有点亏.

    __asm__ (goto("1:"
            STATIC_KEY_INITIAL_NOP
            ".pushsection __jump_table,  \"aw\" \n\t"
            _ASM_ALIGN "\n\t"
            _ASM_PTR "1b, %l[l_yes], %c0 \n\t"
            ".popsection \n\t"
            : :  "i" (key) : : l_yes););
Run Code Online (Sandbox Code Playgroud)

我试图把它变成实际的asm,但还没有成功.

如果你很好奇,这是我刚刚建立在clang上的内核的一部分,除了那一部分.

The*_*ist 7

您似乎在编译arch/x86/include/asm/jump_label.h时遇到问题.整个代码段是为了支持"跳转标签修补".一个新功能非常有用,允许调试(打印日志等)在禁用调试时具有接近零的开销.

您遇到的实现取决于gcc(v4.5),它添加了一个asm goto允许分支到标签的新语句.

似乎Clang/LLVM不支持asm goto.

作为正确编译Linux内核的快速解决方案,您可以CONFIG_JUMP_LABEL在内核配置中禁用.此配置选项用于在编译器不asm goto正确支持时禁用优化.

  • Asm goto支持已合并到LLVM!https://www.phoronix.com/scan.php?page=news_item&px=LLVM-Asm-Goto-Merged :) (2认同)