尝试移植GCC特定的asm到Clang

我一直在尝试将GNU扩展转换成实际的标准C,所以它会在叮当中运行,知道标准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,但还没有成功。

如果您好奇,这是我刚刚开始build立在叮当声之上的内核的一部分,除此之外。

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

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

看来Clang / LLVM不支持asm goto

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