0

私の知る限り、ローカル変数の行番号を取得する必要がある場合、llvm.dbg.declare組み込み関数の呼び出しを探して dbg メタデータを取得する必要がありました (それAllocaInst自体には dbg 情報が含まれていないため)。CallInstただし、これが の次の命令であるという保証はないAllocaInstようで、指定された関数で命令をトラバースする必要があり、非効率的です。そこで、指示を直接AllocaInst取得する方法があるかどうか疑問に思っています。llvm.dbg.declare

たとえば、次のような src でfoo.c:

int foo(){
     int a;
}

および対応する llvm ir:

define i32 @foo() nounwind {
entry:
  %retval = alloca i32
  %a = alloca i32
  %"alloca point" = bitcast i32 0 to i32
  call void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9
  br label %return, !dbg !10

return:                                           ; preds = %entry
  %retval1 = load i32* %retval, !dbg !10                                                                                                     
  ret i32 %retval1, !dbg !10
}
......
!9 = metadata !{i32 3, i32 0, metadata !8, null}

int a;で定義されている の行番号を知る必要がある場合はfoo.c、ir をトラバースして!dbg !9から取得する必要がありますcall void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9

llvm.dbg.gvところで、非常に情報が含まれているため、グローバル変数を扱うときに問題はないようです。

4

2 に答える 2

1

ここで見ることができる で静的メソッドDbgDeclareInst* findDbgDeclare(const Value *V)を使用できることが最終的にわかりましたDbgInfoPrinter.cpp

このコードをハックするのもそれほど難しくありません^_^

于 2012-12-14T01:40:58.920 に答える
-1

私のllvmのバージョンは3.3です。機能はございませんDbgDeclareInst* findDbgDeclare(const Value *V)。あなたのllvmのバージョンは何ですか?

于 2013-11-15T02:16:01.387 に答える