Как получить весь номер строки переменной из исходного кода, заданного LLVM IR? - PullRequest
2 голосов
/ 25 сентября 2019

Я новичок в LLVM.Я хотел знать, как мы можем получить все номера строк для конкретной переменной из исходного кода, заданного LLVM IR?

Например (показывает фрагмент IR LLVM)

store i32 0, i32* %i, align 4, !dbg !12
!12 = !DILocation(line: 2, column: 6, scope: !7)
%4 = load i32*, i32** %ip, align 8, !dbg !30
!30 = !DILocation(line: 7, column: 4, scope: !25)

Я считаю,Из проверки IR LLVM получение деталей номера строки для любой переменной связано с доступом к !dbg в конце инструкции.Но я не знаю, как получить доступ к этой информации.

Еще одно сомнение: если указатель используется для хранения адреса переменной, как мы узнаем, для какой переменной он хранит адрес?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Все в LLVM является ценностью, а некоторые ценности отслеживают своих пользователей.42 (константа int) - нет, но значения, которые вас интересуют, отслеживают их пользователей.У меня есть некоторый код, который обрабатывает фи-узлы, которые используют частичное значение;Вот три строки, которые находят эти фи-узлы:

for(auto u : someValue->users()) {
  PHINode * phi = dyn_cast<PHINode>(u);
  if(phi)
    …

Обратите внимание, что это работает только в модуле.Если у вас есть глобальное значение (например, много функций), то использование извне модуля не отслеживается (например, большинство вызовов функций).

0 голосов
/ 25 сентября 2019

Я полагаю, что после проверки IR LLVM получение деталей номера строки для любой переменной связано с доступом к! Dbg в конце инструкции.Но я не знаю, как получить доступ к этой информации.

Я считаю, что вы правы в этом предположении.Насколько я могу судить, у вас есть вся информация:

Первая инструкция заканчивается на !dbg !12 (store i32 0, i32* %i, align 4, !dbg !12).

Затем вы должны найти строку, начинающуюся с !12.Подсказка, информация отладки обычно находится внизу IR LLVM для модуля.

В вашем случае это: !12 = !DILocation(line: 2, column: 6, scope: !7) <- Интерпретация здесь: Инструкция, отмеченная <code>!12, поступает изстрока 2 столбца 6 в исходном файле, который сгенерировал этот LLVM IR.Имя исходного файла также должно быть доступно (обычно в верхней части LLVM IR).

Еще одно сомнение - если указатель используется для хранения адреса переменной, откуда мы знаемв какой переменной он хранит адрес?

Вам необходимо вывести эту информацию самостоятельно, например, путем анализа потока данных.Это концептуально довольно просто, поскольку LLVM IR уже находится в форме SSA .

...