2017-12-04 9 views
1

ソースコード内のデータフローを追跡しようとしています。そのために、私は彼らがタイプLoadInstの命令であることLLVM - レジスタを指定し、IR表現で最後に使用された場所を取得

*(LI->getPointerOperand()) 

LIを使用してから値をロードしているどのレジスタタイプloadの指示を見て、取得しています。今私はこのレジスタが最後にアクセスされた場所を知る必要があるので、その命令からこの命令へのデータフローをチェックすることができます。どんな提案も高く評価されます。

+0

静的解析コンテキストで「最後にアクセスした」とはどういう意味ですか?コントロールフローグラフに一番近い前回のアクセスのようなものを意味しますか? – compor

+0

はい。それが私の言いたいことです。私を案内してください。 – eren555

答えて

0

最初は、複数の出口を持つループと関数を除外することで問題を簡素化し、関数CFGを単一のエントリと単一の終了グラフとして持つようにします。 PostDominatorTreeDomTreeNodeBasegetLevel方法(私はthisLLVM 5.0で導入されたと思うを使用して次に

llvm::Instruction i = [the register for that LoadInst]; 
auto users = i->users(); 

:最初のような何かをすることによって、すべてのユーザーを見つけることであろう

一つ(おそらく単純化)の方法.0、ご利用のバージョンで利用できない場合は、getChildrenを使用し、BFSの通過を実行することができます)、レベル番号が最も高いものをフィルタリングできます。

私はループで何をしたいのか分かりませんが、特別なことがなければ、上記で十分です。関数から複数の出口を処理するには、処理の前にmergereturnのパスを使用することができます。

関連する問題