2016-05-04 12 views
1

元のソースファイルの各命令/機能用に生成されたLLVM-IRコードを視覚化するのに役立つツールを作成することを考えています。 thisのようなものですが、LLVM-IRのものです。元のソースに戻すためのLLVM IRコード(デバッグシンボル付き)の解析

  • スタートLLVM-IRのASTビルダーとによって:そのようなツールを構築するための

    の手順は、これまでのように見えます。

  • 生成されたIRコードを解析します。
  • キャレット位置では、AST要素を取得します。
  • 要素の有効範囲、行、列、および ファイルを読み取り、元のソースファイルにその旨を伝えます。

これは正しいアプローチですか?私はそれをあまりにもトリビアライズしていますか?

+0

ルックかなり正しい。あなたが達成したいことは、llvmではかなりシンプルですが、多くのUIコードが必要になります –

答えて

2

あなたのアプローチはかなり正しいと思います。 UI部分は実装にはかなり時間がかかるので、llvm部分に焦点を当てます。

LLVM-IRを含む入力ファイルから始めましょう。

手順1プロセスモジュール:
ファイルの内容を文字列に読み込みます。あなたは、単に機能に反復することができたら、それで行わ
、およびブロックと指示:

指示に

llvm::MemoryBuffer* buf = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(fileContent)).release(); 
llvm::SMDiagnostic diag; 
llvm::Module* module = llvm::parseIR(buf->getMemBufferRef(), diag, *context).release(); 
llvm::DebugInfoFinder* dif = new llvm::DebugInfoFinder(); 
dif->processModule(*module); 

ステップ2反復:それからそれからモジュールをビルドし、それを処理するデバッグ情報を取得します

// pseudo code for loops (real code is a bit long) 
foreach(llvm::Function f in module.functions) 
{ 
    foreach(llvm::BasicBlock b in f.BasicBlockList) 
    { 
     foreach(llvm::Instruction inst in b.InstList) 
     { 
     llvm::DebugLoc dl = inst.getDebugLoc(); 
     unsigned line = dl->getLine(); 
     // accordingly populate some dictionary between your instructions and source code 
     } 
    } 
} 

ステップ3更新あなたのUI
これはまた別の話です...

+0

*想定されるコンテキストは何ですか?私はgetGlobalContext()が使用されているが、私は "llvm/IR/LLVMContext.h"に定義されていない例を見つけました。 –

+0

これは、llvm :: LLVMContextタイプの新しいコンテキストにすぎません。 –

+1

@Regis Portalez氏によると、コードは少し長くなっています。各コレクションを繰り返し処理するには、次のようにします。for(auto curFref = m-> getFunctionList()。begin()、 endFref = module-> getFunctionList()。end(); curFref!= endFref; ++ curFref){...} –

関連する問題