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

时间:2013-09-18 03:28:56

标签: c linux gcc linux-kernel clang

我一直在尝试将一些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 个答案:

答案 0 :(得分:6)

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

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

  

似乎Clang/LLVM does NOT support asm goto

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