Как различать знаковые и беззнаковые целые числа в LLVM

Проект LLVM не делает различий между целыми числами со знаком и без знака, как описано здесь. Бывают ситуации, когда вам нужно знать, следует ли интерпретировать конкретную переменную как знаковую или как беззнаковую, например, когда она увеличивается по размеру или когда она используется в делении. Мое решение - хранить отдельную информацию о типе для каждой переменной, которая описывает, является ли она целым или кардинальным типом.

Однако мне интересно, нет ли способа таким образом «атрибутировать» тип в LLVM? Я искал какие-то «пользовательские данные», которые можно было бы добавить к типу, но вроде ничего нет. Это должно происходить каким-то образом при создании типа, поскольку одинаковые типы генерируются в LLVM только один раз.

Поэтому мой вопрос:

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

Спасибо


person Rick    schedule 28.05.2015    source источник
comment
Если вы пишете компилятор, это, как правило, информация, которую вы поддерживаете во внешнем интерфейсе, независимо от LLVM.   -  person Ismail Badawi    schedule 29.05.2015


Ответы (1)


Прежде всего, вы должны быть уверены, что вам нужно вставить метаданные дополнительного типа, поскольку Clang уже правильно обрабатывает целочисленные операции со знаком, например, используя sdiv и srem, а не udev и urem.

Кроме того, это можно использовать для реализации некоторого облегченного вывода типов на основе того, как переменные доступны в IR. Обратите внимание, что такая операция, как add, не требует информации о значении, поскольку она основана на представлении с двумя дополнениями.

В противном случае я думаю, что лучший способ сделать это - изменить интерфейс (Clang), чтобы добавить некоторую пользовательскую информацию отладки DWARF. Вот ссылка, с которой вы можете начать.

ОБНОВЛЕНИЕ: Если ваша цель - реализовать статический анализ непосредственно на LLVM IR. Этот документ может предложить подробное обсуждение.

Навас, Дж. А., Шахте, П., Сондергаард, Х., Стаки, П. Дж .: Независимый от знаков анализ программ: точные целочисленные границы для низкоуровневого кода. В: Jhala, R., Igarashi, A. (eds.) APLAS 2012. LNCS, vol. 7705. С. 115–130. Спрингер, Гейдельберг (2012)

person Codoka    schedule 29.05.2015
comment
Спасибо, я пишу свой собственный фронтент, но не для C, поэтому я не использую Clang, но я проверю идею о метаданных, я пока не обращал на это особого внимания, но буду читать вверх на нем, чтобы проверить, могу ли я использовать его таким образом - person Rick; 31.05.2015