7

私は GNU 拡張機能の一部を実際の標準 C に変換しようと試みていたので、clang で実行されます。GNU 拡張機能ではなく標準 C を知っているため、少し途方に暮れています。

    __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 に変換しようとしましたが、まだ成功していません。

興味があれば、これは、その 1 つのセクションに加えて、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.0 で Clang に最初のサポートasm gotoが追加されました。

asm gotoインライン アセンブリからラベルへの制御フローのために、ステートメント (GNU C 拡張) の初期サポートが追加されました。このコンストラクトの主なコンシューマーは、Linux カーネル (CONFIG_JUMP_LABEL=y) と glib です。Clang の統合アセンブラと IfConverter には、まだサポートされていないコーナー ケースがいくつかあります。遭遇した問題についてバグを報告してください。

于 2013-09-18T09:16:38.533 に答える