Прежде всего, вы должны решить, хотите ли вы работать с Clang или LLVM. Они оба работают с очень разными структурами данных, которые имеют свои преимущества и недостатки.
Из вашего скудного описания вашей проблемы я рекомендую перейти на этапы оптимизации в LLVM. Работа с IR значительно упростит санитарную обработку, анализ и внедрение кода, потому что это то, для чего он предназначен. Недостатком является то, что ваш проект будет зависеть от LLVM, что может или не может быть проблемой для вас. Вы можете вывести результат, используя бэкэнд C, но он не может быть использован человеком.
Другим важным недостатком при работе с проходами оптимизации является то, что вы также теряете все символы из исходного исходного кода. Даже если класс Value
(подробнее об этом позже) имеет метод getName
, вы не должны никогда полагаться на него, чтобы он содержал что-либо значимое. Он предназначен для отладки ваших пропусков и ничего больше.
Вы также должны иметь базовые знания о компиляторах. Например, необходимо знать о базовых блоках и статической форме одиночного назначения . К счастью, это не очень сложная концепция для изучения или понимания (статьи в Википедии должны быть адекватными).
Прежде чем приступить к написанию кода, сначала нужно немного почитать, поэтому вот несколько ссылок, с которых можно начать:
Обзор архитектуры : Краткий обзор архитектуры LLVM. Даст вам хорошее представление о том, с чем вы работаете, и подходит ли вам LLVM.
Глава документации : Здесь вы найдете все ссылки ниже и многое другое. Обратитесь к этому, если я что-то пропустил.
ИК-ссылка LLVM : Это полное описание IR LLVM, которым вы будете манипулировать. Язык относительно простой, поэтому его не так много для изучения.
Руководство программиста : краткий обзор основных вещей, которые необходимо знать при работе с LLVM.
Письменные проходы : Все, что вам нужно знать для написания проходов преобразования или анализа.
LLVM Passes : Полный список всех пропусков, предоставленных LLVM, которые вы можете и должны использовать. Это действительно может помочь очистить код и упростить анализ. Например, при работе с петлями пропуска lcssa
, simplify-loop
и indvar
спасут вам жизнь.
Дерево наследования значений : Это страница Doxygen для класса Value. Важным битом здесь является дерево наследования, которому вы можете следовать, чтобы получить документацию для всех инструкций, определенных на справочной странице IR. Просто игнорируйте безбожного чудовища, которое они называют диаграммой сотрудничества.
Дерево наследования типов : То же, что и выше, но для типов.
Как только вы все это поймете, тогда это торт. Чтобы найти доступ к памяти? Найдите инструкции store
и load
. К инструменту? Просто создайте то, что вам нужно, используя соответствующий подкласс класса Value
, и вставьте его до или после инструкции сохранения и загрузки. Поскольку ваш вопрос слишком широкий, я не могу вам больше помочь. (см. Исправление ниже)
Кстати, я должен был сделать нечто подобное несколько недель назад. Примерно через 2-3 недели я смог узнать все, что мне нужно о LLVM, создать проход анализа, чтобы найти доступ к памяти (и более) в цикле, и снабдить их созданным мной проходом преобразования. Там не было никаких причудливых алгоритмов (кроме тех, которые предоставлены LLVM), и все было довольно просто. Мораль этой истории заключается в том, что LLVM прост в освоении и работе с ним.
Исправление : я допустил ошибку, когда сказал, что все, что вам нужно сделать, - это найти load
и store
инструкции.
load
и store
инструкция будет давать доступ только к куче, используя указатели.Для того, чтобы получить все обращения к памяти, вы также должны посмотреть на значения, которые могут представлять ячейку памяти в стеке.Записывается ли значение в стек или сохраняется в регистре, определяется на этапе выделения регистров, который происходит на этапе оптимизации бэкэнда.Это означает, что она зависит от платформы и на нее не следует полагаться.
Теперь, если вы не предоставите больше информации о том, какой тип доступа к памяти вы ищете, в каком контексте и как вы намереваетесь его использовать, я могуэто не поможет тебе намного больше.