【问题标题】:Trying to port GCC specific asm goto to Clang尝试将 GCC 特定的 asm goto 移植到 Clang
【发布时间】:2013-09-22 16:32:39
【问题描述】:

我一直在尝试将一些 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 上构建的内核的一部分,除了那个部分。

【问题讨论】:

  • +1 用于管理生产这样的东西,虽然我不明白,可能应该添加 -1 因为缺少 cmets。
  • 这个乱七八糟的别怪我,它是 Linux 内核的一部分。
  • 哦。我已经重新标记了它。顺便说一句,这不是标准 C 的领域。
  • 搜索包含该程序集块的函数,您会很快从KML 中找到消息(如this one),表明该代码段的负责人。向他们发送电子邮件。另外,read this.

标签: c linux gcc linux-kernel clang


【解决方案1】:

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

您遇到的depends on gcc(v4.5) which adds a new asm goto statement 允许分支到标签的实现。

看来Clang/LLVM < 9.0.0 does NOT support asm goto

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


更新:对asm goto 的初始支持是added to Clang in v9.0.0

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

【讨论】:

  • 虽然它不能帮助我直接修复代码,但我可以完全禁用它的事实我什至没有想到。这是一个非常有效的解决方案,谢谢!
  • Asm goto 支持已合并到 LLVM 中! phoronix.com/… :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多