2017-01-21 9 views
0

Итак, я пытаюсь подсчитать, сколько раз вызываются определенные инструкции по вызову, и я борюсь с однозначным определением инструкций. Я не мог найти что-то в качестве идентификатора инструкции в документации. Я хочу получить идентификатор и передать его внешней функции, которая знает, как выполнить задание.Как однозначно идентифицировать инструкцию в LLVM Pass?

Итак, вопрос в том, как я могу получить уникальный идентификатор для этих инструкций (желательно как целое число)?

+1

Я подозреваю, вы можете просто использовать значение указателя вашей 'Инструкции *' как ID. – arrowd

+0

Привет @arrowd! Спасибо за комментарий. Значит, вы имеете в виду адрес инструкции? Более того, не может адресовать изменения? –

+0

Кроме того, вторая часть вопроса, как я могу получить ее как Int или любой другой примитивный тип данных (а не как указатель на тип инструкции)? –

ответ

1

Я понимаю, что вы выполняете подсчет на выполнении, и в проходе вы просто вставляете код, который выполняет, что подсчет вблизи инструкции вызова интересующие вас. В этом случае Instruction указателе должно работать нормально. Указатель не изменился бы, если вы перемещаете Instruction, он может стать недействительным, если вы удалите Instruction.

Чтобы преобразовать указатель в целое число, используйте static_cast<uintptr_t>(i).

0

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

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

Поскольку инструкция вызова возвращает значение (Value*) для данного конкретного вызова, я думаю, что все указатели Instruction*, которые вы получите, будут уникальными. Таким образом, это не будет служить вашей цели, если вы используете значение указателя как идентификатор.