2

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 で起こっていることについて根本的な誤解をしているように思われる場合は、フィードバックをいただければ幸いです。

ありがとうございます。私の問題についてさらに情報を提供できるかどうかお知らせください。

4

2 に答える 2

0

(1) の場合 - LLVM のフレームワーク内ではありません。そこには「逆コンパイラ」はありません。マシン コードを C に変換する外部の逆コンパイラを自由に使用して、clang を使用してそれを LLVM IR にコンパイルできます。もちろん、そのような翻訳の品質に関してはYMMVです。

(1.5) あなたの求めていることが理解できれば、いいえ。InstructionMCInstはまったく異なる動物であり、抽象化レベルが非常に離れています。これを読んでください:http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm/

(2) はい、LLVM にはツールから使用できるインタープリターがありlliます。LLVM IR を下げることなく直接「エミュレート」します。

于 2013-01-30T23:51:28.820 に答える