我一直在尝试将一些 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););
我尝试将其转换为实际的汇编,但尚未成功。
如果你好奇的话,除了这一部分之外,这是我即将在 clang 上构建的内核的一部分。
您似乎在编译时遇到问题拱门/x86/include/asm/jump_label.h http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/include/asm/jump_label.h。整个代码片段是为了启用对“跳转标签修补”的支持。一项非常有用的新功能,可以在禁用调试时允许调试(打印日志等),开销接近于零。
你遇到的实现取决于 gcc(v4.5),它添加了一个新的asm goto陈述 http://gcc.gnu.org/ml/gcc-patches/2009-07/msg01556.html允许分支到标签。
看起来Clang/LLVM asm goto http://llvm.org/bugs/show_bug.cgi?id=9295.
作为让 Linux 内核正确编译的快速修复方法,您可以禁用CONFIG_JUMP_LABEL
在你的内核配置中。该配置选项用于在编译器不支持时禁用优化asm goto
适当地。
Update: 初步支持asm goto
was 在 v9.0.0 中添加到 Clang https://github.com/llvm/llvm-project/commit/1634b4bc934d67cb5fa356a925ba8efca2259f12.
初步支持asm goto
语句(GNU C 扩展)已
添加用于控制从内联汇编到标签的流程。主要消费者为
这个构造是 Linux 内核 (CONFIG_JUMP_LABEL=y) 和 glib。有
Clang 的集成汇编器中仍然存在一些不受支持的极端情况,
如果转换器。请针对您遇到的任何问题提出错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)