2016-11-22 12 views
0

Я хочу проанализировать значения указателя в LLVM IR.Как сравнить указатели в LLVM-IR?

Как показано на LLVM Value Class,

Value это очень важный класс LLVM. Это базовый класс всех значений , вычисленных программой, которые могут использоваться в качестве операндов для других значений . Значение - это суперкласс других важных классов, таких как Инструкция и функция. Все значения имеют тип. Тип не является подклассом значения. Некоторые значения могут иметь имя и принадлежать модулю . Установка имени в значении автоматически обновляет таблицу символов модуля .

Чтобы проверить, если Value является указателем или нет, есть функция a->getType()->isPointerTy(). LLVM также предоставляет LLVM PointerType class, однако нет прямого apis для сравнения значений указателей.

Так что мне интересно, как сравнивать эти значения указателя, чтобы проверить, равны они или нет. Я знаю, что есть AliasAnalysis, но у меня есть сомнения в результатах AliasAnalysis, поэтому я хочу проверить его самостоятельно.

ответ

2

Быстрое решение - использовать IRBuilder::CreatePtrDiff. Это вычислит разницу между двумя указателями и вернет результат i64. Если указатели равны, это будет равно нулю, и в противном случае оно будет отличным от нуля.

Это может показаться чрезмерным, видя, как CreatePtrDiff будет прилагать дополнительные усилия, чтобы вычислить результат с точкой зрения количества элементов, а не количество байт, но, по всей вероятности, что дополнительное подразделение получит оптимизированное.

Другой вариант - использовать инструкцию ptrtoint с достаточно большим типом результата, таким как i64, а затем выполнить целочисленное сравнение.

Из онлайн-справки:

Value *  CreatePtrDiff (Value *LHS, Value *RHS, const Twine &Name="") 
Return the i64 difference between two pointer values, dividing out the size of the pointed-to objects.