LART = LLVM Абстракция и инструмент уточнения. Цель этого инструмента состоит в том, чтобы обеспечить преобразования LLVM-к LLVM, которые реализуют различные программы. С точки зрения набора инструкций, полученные программы являются нормальными, конкретными программами LLVM, которые могут быть выполнены и проанализированы. Дополнительная информация об абстракции (ы), действующих на программу (фрагмента), вставляется с использованием специальных внутренних функций LLVM и узлов метаданных LLVM. LART предоставляет как автономный инструмент, который обрабатывает файлы бит-кодов на диска, так и структуру, которая может быть интегрирована в сложные инструменты на основе LLVM. Основной мотивацией LART является предоставление «препроцессора» для модельных контролеров на основе LLVM и других инструментов анализа, упрощая их работу за счет уменьшения размера проблемы без ущерба для обоснованности анализа. Абстракции, реализованные LART, обычно могут быть уточнены на основе конкретных инструкций о том, какие «часть» абстракции слишком грубо (абстракция, которая слишком грубая, создаст ложные ошибки, видимые для последующих анализов, но не присутствует в исходной программе).
Цель всего упражнения - абстрагировать информацию из биткода LLVM, что делает последующий анализ более эффективным (за счет некоторой точности). С этой целью нам в основном необходимо иметь возможность кодировать нетерминированный выбор в программах LLVM, который можно выполнить просто с помощью специальной функции (аналогично внутренней внутренней основе LLVM). Функция названа @lart.choice , принимает пару границ в качестве аргументов и не определенных факторизма возвращает значение, которое падает между этими границами.
Это расширение на семантику LLVM должно быть распознано инструментом ниже по течению. Это также единственное важное отклонение от стандартного биткода LLVM. Многие инструменты анализа уже будут реализовать аналогичный механизм, как внутри, так и даже с внешним интерфейсом. Адаптация инструментов без поддержки @lart.choice для работы с Lart, как правило, очень проста.
Существуют и другие функции специального назначения, предоставляемые LART, а именно семейство @lart.meta.* @llvm.dbg.* Ожидается, что преобразования программ сохранят эти вызовы в случае, если LART будет вызван для уточнения абстракции (каждая абстракция, предоставленная LART, поставляется с соответствующей процедурой уточнения, которая часто должна найти вызовы @lart.meta , вставленные абстракцией).
В то время как большинство традиционных двигателей абстракции работают как переводчики, абстракции также могут быть «составлены» в программы. Вместо (повторно) символического интерпретации инструкции могут быть скомпилированы символические инструкции. В случае абстракции предиката полученный бит -код будет напрямую манипулировать и использовать предикатные оценки вместо конкретных переменных. Как объяснено выше, важное отличие состоит в том, что биткод должен делать неэтерминированный выбор, поскольку некоторые предикаты могут иметь неопределенные оценки (как истинны, так и ложь). Некоторые переменные могут быть даже абстрагированы полностью, и все тесты на такие переменные дадут как да, так и без ответов.
Используйте или повторите настройку от ./devcontainer/Dockerfile на данный момент.
Затем используйте:
./scripts/build.sh
./build/bin/lartcc <domain> <compiler arguments> in.c
opt -load build/lib/cc/liblart_module.so -lart < in.bc > out.bc
lit -v build/test
Примечание: build/lartcc/lartcc должен иметь Exacutabple Erders.