Как получить номер строки определения переменной и т. Д. С помощью метаданных dbg?

Насколько я знаю, когда мне нужно было получить номер строки локальной переменной, мне пришлось искать вызов встроенных функций 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 содержит саму информацию.


person Hongxu Chen    schedule 13.12.2012    source источник


Ответы (2)


Я наконец понял, что мы можем использовать статический метод DbgDeclareInst* findDbgDeclare(const Value *V) в DbgInfoPrinter.cpp, который можно увидеть здесь

Взломать этот кусок кода тоже не очень сложно ^ _ ^

person Hongxu Chen    schedule 14.12.2012
comment
Хорошая работа. Но как получить то же самое для глобалов? Для меня findDbgGlobalDeclare не работает должным образом ... Потому что у меня нет llvm.dbg.gv в моем байт-коде - person Alex; 27.02.2013

Версия моего llvm - 3.3. Нет функции DbgDeclareInst* findDbgDeclare(const Value *V). Какая у вас версия llvm?

person blankboy2011    schedule 15.11.2013
comment
AFAIK, llvm2.9 все еще имеет DbgDeclareInst; llvm просто слишком сильно меняется :-) - person Hongxu Chen; 16.11.2013