VOID Handler(CONTROL_EVENT ev, VOID * v, CONTEXT * ctxt, VOID * ip, THREADID tid) { std::cout << "tid: " << tid << " "; std::cout << "ip: " << ip << " " << icount.Count() ; #if defined(TARGET_IA32) || defined(TARGET_IA32E) std::cout << " [ with REP iterations " << icount.CountWithREP() << "] "; #endif switch(ev) { case CONTROL_START: std::cout << "Start" << endl; break; case CONTROL_STOP: std::cout << "Stop" << endl; break; case CONTROL_THREADID: std::cout << "ThreadID" << endl; break; default: ASSERTX(false); break; } }
VOID Handler(CONTROL_EVENT ev, VOID * v, CONTEXT * ctxt, VOID * ip, THREADID tid) { GetLock(&output_lock, tid+1); std::cout << "tid: " << tid << " "; std::cout << "ip: " << ip << " " << icount.Count() ; switch(ev) { case CONTROL_START: std::cout << "Start" << endl; break; case CONTROL_STOP: std::cout << "Stop" << endl; break; case CONTROL_THREADID: std::cout << "ThreadID" << endl; break; default: ASSERTX(false); break; } ReleaseLock(&output_lock); }
VOID Handler(EVENT_TYPE ev, VOID * v, CONTEXT * ctxt, VOID * ip, THREADID tid, BOOL bcast) { PIN_GetLock(&output_lock, tid+1); std::cout << "tid: " << tid << " "; std::cout << "ip: " << ip << " " << icount.Count() ; switch(ev) { case EVENT_START: std::cout << "Start" << endl; break; case EVENT_STOP: std::cout << "Stop" << endl; break; case EVENT_THREADID: std::cout << "ThreadID" << endl; break; default: ASSERTX(false); break; } PIN_ReleaseLock(&output_lock); }
VOID Handler(CONTROL_EVENT ev, VOID * v, CONTEXT * ctxt, VOID * ip, THREADID tid) { std::cerr << "tid: " << dec << tid << " ip: 0x" << hex << ip; // get line info on current instruction INT32 linenum = 0; string filename; PIN_LockClient(); PIN_GetSourceLocation((ADDRINT)ip, NULL, &linenum, &filename); PIN_UnlockClient(); if(filename != "") { std::cerr << " ( " << filename << ":" << dec << linenum << " )"; } std::cerr << dec << " Inst. Count " << icount.Count(tid) << " "; #if defined(TARGET_IA32) || defined(TARGET_IA32E) std::cerr << " [ with REP iterations " << icount.CountWithREP() << "] "; #endif switch(ev) { case CONTROL_START: std::cerr << "Start" << endl; if(control.PinPointsActive()) { std::cerr << "PinPoint: " << control.CurrentPp(tid) << " PhaseNo: " << control.CurrentPhase(tid) << endl; } break; case CONTROL_STOP: std::cerr << "Stop" << endl; if(control.PinPointsActive()) { std::cerr << "PinPoint: " << control.CurrentPp(tid) << endl; } break; default: ASSERTX(false); break; } }
VOID Handler(CONTROL_EVENT ev, VOID * v, CONTEXT * ctxt, VOID * ip, THREADID tid) { std::cout << "ip: " << ip << " Instructions: " << icount.Count() << " "; switch(ev) { case CONTROL_START: std::cout << "Start" << endl; ppinfo.startMispredicts = bimodal.Mispredicts(); ppinfo.startIcount = icount.Count(); if(control.PinPointsActive()) { std::cout << "PinPoint: " << control.CurrentPp() << endl; UINT32 pp = control.CurrentPp(); ASSERTX( pp <= MAXPP); ppinfo.ppstats[pp].ppWeightTimesThousand = control.CurrentPpWeightTimesThousand(); ppinfo.currentpp = pp; } break; case CONTROL_STOP: std::cout << "Stop" << endl; if(control.PinPointsActive()) { std::cout << "PinPoint: " << control.CurrentPp() << endl; UINT64 mispredicts = bimodal.Mispredicts() - ppinfo.startMispredicts; UINT64 instructions = icount.Count() - ppinfo.startIcount; UINT32 pp = ppinfo.currentpp; ppinfo.ppstats[pp].ppMispredicts = mispredicts; ppinfo.ppstats[pp].ppInstructions = instructions; } break; default: ASSERTX(false); break; } }
/* ===================================================================== */ int main(int argc, char *argv[]) { if (PIN_Init(argc,argv)) return Usage(); // Single thread profile enabled ? if (KnobSingleThread.Value()) { bimodal.SetSingleOSThreadID(KnobSingleThread.Value()); gshare.SetSingleOSThreadID(KnobSingleThread.Value()); simpleindirect.SetSingleOSThreadID(KnobSingleThread.Value()); vpcsimpleindirect.SetSingleOSThreadID(KnobSingleThread.Value()); targetcache.SetSingleOSThreadID(KnobSingleThread.Value()); } // Active the predictors. if (!KnobDisableBimodal.Value()) { bimodal.Activate(); } if (!KnobDisableGshare.Value()) { gshare.Activate(); } if (!KnobDisableSimpleIndirect.Value()) { simpleindirect.Activate(); } if (!KnobDisableVPCIndirect.Value()) { vpcsimpleindirect.Activate(); } if (!KnobDisableTargetCache.Value()) { targetcache.Activate(); } // Activate the icount. if (!KnobDisableICount.Value()) { icount.Activate(); } outfile = new ofstream(KnobOutputFile.Value().c_str()); PIN_AddFiniFunction(Fini, 0); PIN_StartProgram(); }
// argc, argv are the entire command line, including pin -t <toolname> -- ... int main(int argc, char * argv[]) { if( PIN_Init(argc,argv) ) { return Usage(); } icount.Activate(); // Activate alarm, must be done before PIN_StartProgram control.CheckKnobs(Handler, 0); // Start the program, never returns PIN_StartProgram(); return 0; }
// argc, argv are the entire command line, including pin -t <toolname> -- ... int main(int argc, char * argv[]) { if( PIN_Init(argc,argv) ) { return Usage(); } PIN_InitLock(&output_lock); icount.Activate(); // Activate alarm, must be done before PIN_StartProgram control.RegisterHandler(Handler, 0, FALSE); control.Activate(); // Start the program, never returns PIN_StartProgram(); return 0; }
int main(int argc, char *argv[]) { if( PIN_Init(argc,argv) ) { return Usage(); } icount.Activate(); bimodal.Activate(); // Activate alarm, must be done before PIN_StartProgram control.CheckKnobs(Handler, 0); outfile = new ofstream("bimodal.out"); PIN_AddFiniFunction(Fini, 0); PIN_StartProgram(); }
LOCALFUN VOID Fini(int n, void *v) { *outfile << endl; double whole_MPKI = 1000.0 * (double)bimodal.Mispredicts()/icount.Count(); *outfile << "Whole-program MPKI = " << whole_MPKI << dec << endl; if (control.PinPointsActive()) { UINT32 NumPp = control.NumPp(); double predicted_MPKI = 0.0; *outfile << "PP #," << " %Weight," << " MPKI" << endl; for (UINT32 p = 1; p <= NumPp ; p++) { double weight = (double) ppinfo.ppstats[p].ppWeightTimesThousand/1000.0; double mpki = (double)ppinfo.ppstats[p].ppMispredicts*1000/ppinfo.ppstats[p].ppInstructions; *outfile << dec << p << ", " << weight << ", " << mpki << endl; predicted_MPKI += (double) weight*mpki/100.0; } *outfile << "Predicted MPKI = " << predicted_MPKI << dec << endl; } }
VOID Handler(CONTROL_EVENT ev, VOID * v, CONTEXT * ctxt, VOID * ip , VOID * tid) { switch(ev) { case CONTROL_START: std::cerr << "Start : Detaching at icount:" << icount.Count() << endl; PIN_RemoveFiniFunctions(); PIN_Detach(); break; case CONTROL_STOP: std::cerr << "Stop" << endl; break; default: ASSERTX(false); break; } }
int main(int argc, char * argv[]) { if( PIN_Init(argc,argv) ) { return Usage(); } icount.Activate(); // Activate alarm, must be done before PIN_StartProgram control.CheckKnobs(Handler, 0); // Callback function "byeWorld" is invoked // right before Pin releases control of the application // to allow it to return to normal execution PIN_AddDetachFunction(helloWorld, 0); PIN_AddDetachFunction(byeWorld, 0); // Never returns PIN_StartProgram(); return 0; }
VOID Image(IMG img, VOID * v) { cerr << "G: " << IMG_Name(img) << " LowAddress: " << hex << IMG_LowAddress(img) << " LoadOffset: " << hex << IMG_LoadOffset(img) << dec << " Inst. Count " << icount.Count((ADDRINT)0) << endl; }