レジスタR0, R1,...,Rn
を前提としたアルゴリズムを適用したいと思います。LLVM IRによるx86レジスタの制御?
この場合、私が制御したいのは、これらのレジスタがどのような順序で割り当てられるかです。
LLVM IRレベルでレジスタを制御することはできますか?または、IRによってこれらの低レベルの詳細が遮蔽されていますか?
レジスタR0, R1,...,Rn
を前提としたアルゴリズムを適用したいと思います。LLVM IRによるx86レジスタの制御?
この場合、私が制御したいのは、これらのレジスタがどのような順序で割り当てられるかです。
LLVM IRレベルでレジスタを制御することはできますか?または、IRによってこれらの低レベルの詳細が遮蔽されていますか?
新しいバージョンのllvmでは、llvm.read_registerとllvm.write_registerを使用できます。あなたが良い例をしたい場合は
することは、そのようなグローバル変数を作成してみてください:
register void *rsp asm("rsp");
その後のprintfでそれを印刷してみてください。 -S -emit-LLVMを持つ単純なCプログラムをコンパイルし、あなたはllvm.read_registerが
%4 = call i64 @llvm.read_register.i64(metadata !0)
し、ファイルの一番下にあなたがメタデータのインデックス0が表示されます使用されて見ることができます。
!0 = !{!"rsp"}
しかし、それは 'mov rax、rsp'または何かに変わることはありませんか? '%4'レジスタに格納されているレジスタを制御することはできません。 –
これは常に正しいとは限りませんが、最適化されていない場合でも問題が発生することは確実です。インラインアセンブリーはおそらくOPが望んでいるものを行うための最良の方法です – keyboardsmoke
それをインラインアセンブリで可能ですが、これはあなたが望むものではない可能性があります。 IRはこの面でアセンブリレベルよりもCレベルです。 – Joky
インラインアセンブリで使用できるメソッド呼び出しは何ですか? – Shuzheng
私はその質問を理解していないのですか? – Joky