Инструментирование кода C / C ++ с помощью LLVM

Я хочу написать проход 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 , но не мог понять, как написать проход для указанной выше проблемы.

11
задан Lightness Races with Monica 18 October 2011 в 11:48
поделиться