1

LLVM プラグインを作成して、関数宣言ごとに、関数が持つ汎用レジスタ、XMM レジスタ、およびスタック引数の数を教えてください。これは、x86 SYSV 呼び出し規約でのみ機能する必要があります。これは現在可能ですか?もしそうなら、どんな方向でも大歓迎です。

4

1 に答える 1

0

可能ですが、少し注意が必要です.LLVMは、マシン固有のコードをいじる場合よりも、IRを操作しようとする場合の方がはるかに使いやすいようです. たとえば、パスを追加する簡単な方法はありません。また、最終的に使用されるレジスターの数は、仮想レジスターが最終的に実際の x86 論理レジスターにどのように割り当てられるかによって異なります。スピルが発生する場合もあれば、一部の変数が削除される場合もあります。したがって、値が SSA 形式である IR での作業が妨げられるだけでなく、実際には CodeGen の最後の段階で作業する必要があります。物事をより面白くするために、使用する最適化のレベルにも依存します。チェックアウト - llvm/lib/CodeGen/Passes.cpp、addOptimizedRegAlloc または addFastRegAlloc を見て、内部で呼び出された渡されたものをチェックアウトし、最後のものを使用します (CodeGen の別のファイルに実装されています)。ヒッチハイクする。内部ループは非常に単純ですが、TargetRegisterInfo で列挙された X86 ターゲット regs に基づいてブックキーピングを実行する必要があります。

于 2013-06-21T13:19:21.990 に答える