LLVM ソース ツリーを読むのにかなりの時間を費やしました。それは非常に印象的なエンジニアリングです!
とにかく、基本的な静的解析のために、私が持っているいくつかの MachO Arm バイナリを LLVM ビットコードに変換しようとしています。主に、使用されるレジスタに応じて、特定の呼び出しで逆方向の静的スライスを作成したいと思います。さらに、明らかな定数の順方向伝搬を試みています (たとえば、シンボル テーブルから関数名を読み込んでレジスタに渡すなど)。
この時点で、次のコマンド ラインを使用して、ファイルをダンプし、ネイティブ ARM アセンブリで解析することができました。
bash-3.2$ llvm-objdump -d ~/code/osx/HelloWorldThin -triple=thumb
-mattr=+thumb2,+32bit,+v7,+v6t2,+thumb-mode,+neon
/Users/steve/code/osx/HelloWorldThin: file format Mach-O arm
Disassembly of section __TEXT,__text:
_main:
2fd4: f0 b5 push {r4, r5, r6, r7, lr}
2fd6: 03 af add r7, sp, #12
2fd8: 4d f8 04 8d str r8, [sp, #-4]!
2fdc: 0d 46 mov r5, r1
2fde: 06 46 mov r6, r0
2fe0: 00 f0 fe ef blx #4092
...切り取った...
パーサーを書く時間を大幅に節約できるので、これは素晴らしいことです!
MachODump.cpp を調べると、これらが MCInst に下げられていることがわかります。これは、私が理解している方法から、パラメーターを使用して解析されたオペコードにすぎません。
だから私の質問は:
1) ARM から LLVM に変換する方法はありますか (最適化パスなどのために)? ARM に出力する必要はなく、分析結果が必要なだけです。
1.5) すべての分析操作が MCInst ではなく命令で動作することに気付きました。プロモートと入力して必要な情報を提供する方法はありますか?
2) ARM または LLVM 命令をエミュレート/シミュレートする方法はありますか? メモリとレジスタの内容を判断するために、スライシングや定数伝播などにはデータフロー分析が必要なためです。
このような操作では、データがメモリからロードおよび格納される方法と、レジスタを追跡する必要があります。LLVM はこれらの分析命令の副作用を理解できますか?
__text:000032DE LDR R1, [R0] ; "viewDidLoad"
__text:000032E0 MOV R0, SP
__text:000032E2 BLX _objc_msgSendSuper2
3) LLVM で起こっていることについて根本的な誤解をしているように思われる場合は、フィードバックをいただければ幸いです。
ありがとうございます。私の問題についてさらに情報を提供できるかどうかお知らせください。