Я вставляю некоторые инструкции в llvm IR, чтобы выполнить проверку целочисленного переполнения (IO). Однако меня раздражает то, что некоторые из моих вставленных инструкций оптимизированы оптимизатором.
Например, когда есть
int result = data + 1;
Мой пропуск рассматривал эту операцию как потенциальный сайт переполнения и добавлял (IR, конечно, я написал здесь C, чтобы облегчить себе жизнь):
int64_t result_64bit = (int64_t)data + 1
if (result_64bit > 2147483647) { report(); }
Однако эта инструкция оптимизируется.
Вот что я пробовал:
добавить флаг -O0. Это не сработает. Я сбрасывал IR после каждого прохода, и это происходило на проходе Удаление избыточной операции. (Не лишний с моей точки зрения ...)
Переместите проход в конец оптимизации, установив флаг EP_OptimizerLast. Что ж, это не оптимально, так как некоторая информация теряется. Например, я сильно полагаюсь на флаг nsw / nuw для определения признаков, некоторые из этих флагов удаляются после оптимизации.
Итак, я спрашиваю, есть ли в LLVM какое-то средство защиты инструкций, которое защищает инструкцию от оптимизации или удаления?
Привет, JKRT :) Нет, не знал. Я сделал дамп IR, чтобы посмотреть, что к чему, но никогда не прекращаю компиляцию. Я компилировал дважды: сначала в дамп IR, а во второй в бинарный. Зачем спрашивать? Это имеет какой-то неизвестный эффект?
В порядке. Нет, просто интересно. По-прежнему не можете просто удалить все проходы из диспетчера пропусков и просто запустить свой проход раньше?
Итак, что вы делаете, это, возможно, сгенерируете LLVM IR из C, загружающего IR. Проведя некоторый анализ, вставив свои инструкции по его сбросу. После этого запустить через Clang?
Да, ты можешь так сказать





Короткий вопрос: вы сбрасываете сгенерированный LLVM IR в файл, а затем используете clang для этого файла?