2017-02-18 10 views
1

レジスタR0, R1,...,Rnを前提としたアルゴリズムを適用したいと思います。LLVM IRによるx86レジスタの制御?

この場合、私が制御したいのは、これらのレジスタがどのような順序で割り当てられるかです。

LLVM IRレベルでレジスタを制御することはできますか?または、IRによってこれらの低レベルの詳細が遮蔽されていますか?

+0

それをインラインアセンブリで可能ですが、これはあなたが望むものではない可能性があります。 IRはこの面でアセンブリレベルよりもCレベルです。 – Joky

+0

インラインアセンブリで使用できるメソッド呼び出しは何ですか? – Shuzheng

+0

私はその質問を理解していないのですか? – Joky

答えて

0

新しいバージョンの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"} 
+0

しかし、それは 'mov rax、rsp'または何かに変わることはありませんか? '%4'レジスタに格納されているレジスタを制御することはできません。 –

+0

これは常に正しいとは限りませんが、最適化されていない場合でも問題が発生することは確実です。インラインアセンブリーはおそらくOPが望んでいるものを行うための最良の方法です – keyboardsmoke

関連する問題