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上的内核的一部分,除了那一部分.
您似乎在编译arch/x86/include/asm/jump_label.h时遇到问题.整个代码段是为了支持"跳转标签修补".一个新功能非常有用,允许调试(打印日志等)在禁用调试时具有接近零的开销.
您遇到的实现取决于gcc(v4.5),它添加了一个asm goto允许分支到标签的新语句.
作为正确编译Linux内核的快速解决方案,您可以CONFIG_JUMP_LABEL在内核配置中禁用.此配置选项用于在编译器不asm goto正确支持时禁用优化.