2012-12-13 3 views
0

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

ответ

1

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

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

+1

Хорошая работа. Но как вы можете получить то же самое для глобалов? Для меня findDbgGlobalDeclare работает неправильно ... Потому что у меня нет llvm.dbg.gv в моем байткоде – Alex

-1

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

+0

AFAIK, llvm2.9 все еще имеет 'DbgDeclareInst'; llvm просто слишком сильно меняется :-) –