Я работаю над некоторыми инструментами LLVM и хотел бы определить инструкции по загрузке и хранению, которые записывают в память кучи.
Сейчас я могу идентифицировать вызовы malloc
et c. и я могу сказать, когда выделяется куча памяти. Есть ли в LLVM IR что-нибудь, что отличает загрузку / хранение в стеке от кучи? Я предполагаю, что нет.
Подход, который я думал использовать, состоял в том, чтобы отслеживать адреса памяти, возвращаемые malloc
во время выполнения, а затем инструментальные вызовы к getelementptr
, где во время выполнения я вижу, является ли базовый адрес тем, который имеет было выделено malloc
. Я также назначил бы любые загрузки / хранилища, которые используют указатель, возвращаемый getelementptr
, где код инструментария будет работать только в том случае, если адрес является адресом кучи.
У меня вопрос: как я могу определить такие нагрузки /магазины? Создает ли LLVM граф зависимостей данных или что-то в этом роде, к которому я могу обратиться, чтобы определить эти инструкции? По сути, я хочу идентифицировать все загрузки / хранилища, которые используют указатель, возвращаемый определенной инструкцией getelementptr
.
Конечно, если есть более простой способ сделать это, пожалуйста, дайте мне знать. Я совсем новичок в этом.