Насколько я знаю, когда мне нужно получить номер строки локальной переменной, мне пришлось искать вызов встроенных объектов llvm.dbg.declare
и получить метаданные dbg (поскольку AllocaInst
сам по себе не содержит никакой информации dbg). Однако, похоже, нет никакой гарантии, что это CallInst
является следующей инструкцией AllocaInst
, и мне нужно пройти инструкцию в заданной функции, которая неэффективна. Поэтому мне интересно, есть ли метод для AllocaInst
, чтобы получить инструкцию llvm.dbg.declare
напрямую.Как получить номер строки определения переменной и т. Д., Используя метаданные dbg?
Например, в ЦСИ называется foo.c
:
int foo(){
int a;
}
и соответствующий LLVM л:
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
.
BTW, кажется, нет проблем при работе с глобальной переменной, так как llvm.dbg.gv
содержит самую информацию.
Хорошая работа. Но как вы можете получить то же самое для глобалов? Для меня findDbgGlobalDeclare работает неправильно ... Потому что у меня нет llvm.dbg.gv в моем байткоде – Alex