7

我一直在尝试将一些 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););

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

如果你很好奇,除了那一部分之外,这是我即将在 clang 上构建的内核的一部分。

4

1 回答 1

8

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

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

看来Clang/LLVM < 9.0.0 不支持asm goto.

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


更新:在 v9.0.0asm goto中添加了对 Clang 的初始支持。

asm goto为从内联汇编到标签的控制流添加了对语句(GNU C 扩展)的初始支持。这个结构的主要消费者是 Linux 内核 (CONFIG_JUMP_LABEL=y) 和 glib。在 Clang 的集成汇编器和 IfConverter 中仍有一些不受支持的极端情况。请为您遇到的任何问题提交错误。

于 2013-09-18T09:16:38.533 回答