私の知る限り、ローカル変数の行番号を取得する必要がある場合、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
ところで、非常に情報が含まれているため、グローバル変数を扱うときに問題はないようです。