Home | History | Annotate | Download | only in pin
      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
      9 static long long dynamic_memory_access_count;
     10 static int static_memory_access_count;
     11 
     12 //---------- Instrumentation functions ---------
     13 void InsertBeforeEvent_MemoryAccess(ADDRINT pc) {
     14   dynamic_memory_access_count++;
     15 }
     16 
     17 //-------------- PIN callbacks ---------------
     18 void 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 
     33 static 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 ---------------
     39 int 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