예제 #1
0
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;
    }
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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;
    }
}
예제 #6
0
/* ===================================================================== */
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();
}
예제 #7
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();
    }

    icount.Activate();
    
    // Activate alarm, must be done before PIN_StartProgram
    control.CheckKnobs(Handler, 0);

    // Start the program, never returns
    PIN_StartProgram();
    
    return 0;
}
예제 #8
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();
}
예제 #10
0
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;
    }
}
예제 #11
0
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;
    }
}
예제 #12
0
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;
}
예제 #13
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;
}