1// Simple test for PIN.
2// Prints the number of memory accesses.
3// Run: $PIN_ROOT/pin -t `pwd`/simple_pin_test.so -- your_program
4#include "pin.H"
5
6#include <map>
7
8// statistics
9static long long dynamic_memory_access_count;
10static int static_memory_access_count;
11
12//---------- Instrumentation functions ---------
13void InsertBeforeEvent_MemoryAccess(ADDRINT pc) {
14  dynamic_memory_access_count++;
15}
16
17//-------------- PIN callbacks ---------------
18void CallbackForTRACE(TRACE trace, void *v) {
19  for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)) {
20    for (INS ins = BBL_InsHead(bbl); INS_Valid(ins); ins = INS_Next(ins)) {
21      if (INS_IsStackRead(ins) || INS_IsStackWrite(ins))
22        continue;
23      if (INS_IsMemoryRead(ins) || INS_IsMemoryWrite(ins)) {
24        static_memory_access_count++;
25        INS_InsertCall(ins, IPOINT_BEFORE,
26                         (AFUNPTR)InsertBeforeEvent_MemoryAccess,
27                         IARG_INST_PTR, IARG_END);
28      }
29    }
30  }
31}
32
33static void CallbackForFini(INT32 code, void *v) {
34  printf("accesses static  : %d\n", static_memory_access_count);
35  printf("accesses dynamic : %lld\n", dynamic_memory_access_count);
36}
37
38//---------------- main ---------------
39int main(INT32 argc, CHAR **argv) {
40  PIN_Init(argc, argv);
41  PIN_InitSymbols();
42  PIN_AddFiniFunction(CallbackForFini, 0);
43  TRACE_AddInstrumentFunction(CallbackForTRACE, 0);
44  PIN_StartProgram();
45  printf("accesses static  : %d\n", static_memory_access_count);
46  return 0;
47}
48