#LLVM Анализ и проходы преобразования
Этот проект использует Clang и LLVM для анализа и преобразования исходного кода C ++.
Clang - это передний конец LLVM, он компилирует C ++ в IR. Промежуточное представление намного проще, чем C ++, что облегчает анализ и преобразование.
LLVM имеет множество библиотек, которые можно использовать для анализа и преобразования IR. Инструкции для анализа или преобразования называются проходом.
Видео демонстрация проходов
Done See BelowDone See BelowLLVM и Clang необходимы для компиляции и применения проходов. Cmake необходим для создания LLVM и Clang.
Clang используется для компиляции C ++ в Bytecode LLVM, используется для Implage Analysis Pass. Проход StaticCount проходит каждую инструкцию в Byetecode и распечатает, какой он тип. Он также использует LLVM для отслеживания статистики Certian, которую он распечатывает в конце анализа.
Прежде чем следовать этому руководству, вы должны были загрузить и построить LLVM.
Этот проект и руководство были сделаны с использованием macOS.
Чтобы применить проход к какому -то C -коду, существует ряд шагов, которые должны быть закреплены, они заключаются в следующем.
<LLVM_Source_Directory>/lib/Transforms .StaticCount из клонированного репозитория в каталог, указанный выше.Transforms должен быть ряд каталогов и только один файл CMakeLists.txt .CMakeLists.txt и добавьте строку add_subdirectory(StaticCount) .<LLVM_Build_Directory> и запустите cmake --build . Это построит все LLVM, включая проход, который мы только что добавили.HeapTimeTestProgram в клонированном репозитории.clang -O0 -emit-llvm -c main.cpp -o bctest.bc Это использует Clang для составления нашего файла C ++ до байт -кода, с которым LLVM может работать.opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null
ПРИМЕЧАНИЕ - это не полный выход прохода. Это уменьшается, так что приведенные выше команды были видны.
Беда? Пожалуйста, свяжитесь со мной.
Clang используется для компиляции C ++ в Bytecode LLVM, используется для имплексного анализа проходов DynCount проходит через каждый базовый блок в ByetEcode и добавляет призыв к библиотеке времени выполнения. Функции в библиотеке представляют собой только выходные поставки для этой вехи.
Сначала проход составлен, как и первый, затем мы составляем тестовую программу в Bytecode. После этого библиотека времени выполнения составлена в байт -код. Эти два файла Bytecode затем связаны в один файл с одним байт -кодом с использованием LLVM. После этого применяется проход, в отличие от первого прохода, в этот момент не будет вывода. Поскольку это динамический проход, мы получим результаты во время выполнения. Наконец, мы запускаем программу и получаем наш результат, в каждой концерте из нескольких различных типов блоков будут выводится выходные поставки.
Прежде чем следовать этому руководству, вы должны были загрузить и построить LLVM.
Этот проект и руководство были сделаны с использованием macOS.
Чтобы применить код Pass to C, существует ряд шагов, которые должны быть закреплены, они заключаются в следующем.
<LLVM_Source_Directory>/lib/Transforms .DynCount из клонированного репозитория в каталог, перечисленный выше.Transforms должен быть ряд каталогов и только один файл CMakeLists.txt .CMakeLists.txt и добавьте строку add_subdirectory(DynCount) .<LLVM_Build_Directory> и запустите cmake --build . Это построит все LLVM, включая проход, который мы только что добавили.SmallTestProgram внутри клонированного репозитория.clang -O0 -emit-llvm -c smallProgram.c -o sp.bc Это использует Clang для составления нашего C -файла до Bytecode, с которым LLVM может работать.clang -O0 -emit-llvm -c print -o p.bc Это использует Clang, чтобы составить нашу библиотеку времени выполнения до байт -кода, которая может быть связана с программой, которую мы составляли выше.llvm-link p.bc sp.bc -S -o smallprogramandprint.bc Это связывает нашу программу для проанализирования и нашей библиотеки времени выполнения.opt -load <LLVM_Build_Directory>/lib/llvmDynCount.dylib -DynCount <smallprogramandprint.bc> instrumentedprogram.bc Это применяет пропуск к программе, модифицируя байт -код с вызовами в библиотеку выполнения, которые мы связывали.lli instrumentedprogram.bc Это запускает инструментальную программу, чтобы мы могли видеть результат прохода. 
ПРИМЕЧАНИЕ - это не полный вывод прохода. Это уменьшается, так что приведенные выше команды были видны.
Беда? Пожалуйста, свяжитесь со мной.