Я хочу написать проход LLVM для инструментария каждого доступа к памяти. Здесь это то, что я пытаюсь сделать.
Для любой программы C / C ++ (например, приведенной ниже) я пытаюсь вставить вызовы какой-либо функции до и после каждой инструкции, которая читает / записывает в / из памяти. Например, рассмотрим приведенную ниже программу на C ++ (Account.cpp)
#include
class Account {
int balance;
public:
Account(int b)
{
balance = b;
}
~Account(){ }
int read()
{
int r;
r = balance;
return r;
}
void deposit(int n)
{
balance = balance + n;
}
void withdraw(int n)
{
int r = read();
balance = r - n;
}
};
int main ()
{
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
Итак, после инструментария моя программа должна выглядеть так:
#include
class Account
{
int balance;
public:
Account(int b)
{
balance = b;
}
~Account(){ }
int read()
{
int r;
foo();
r = balance;
foo();
return r;
}
void deposit(int n)
{
foo();
balance = balance + n;
foo();
}
void withdraw(int n)
{
foo();
int r = read();
foo();
foo();
balance = r - n;
foo();
}
};
int main ()
{
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
где foo () может быть любой функцией, например, получить текущее системное время или увеличить счетчик .. и т. Д. .
Пожалуйста, дайте мне примеры (исходный код, учебные пособия и т. Д.) И шаги по его запуску. Я прочитал руководство о том, как создать проход LLVM, приведенное на http://llvm.org/docs/WritingAnLLVMPass.html , но не мог понять, как написать проход для указанной выше проблемы.