PyObject* Python_RTN_IsDynamic(PyObject* self, PyObject* args) { PyObject* rtn; PyArg_ParseTuple(args, "L", &rtn); RTN rtn_object = *(RTN*) rtn; if (RTN_IsDynamic(rtn_object)) { return Py_BuildValue("O", Py_True); } else { return Py_BuildValue("O", Py_False); } }
// Pin calls this function every time a new rtn is executed VOID Routine(RTN rtn, VOID *v) { if (!RTN_IsDynamic(rtn)) { return; } *out << "Just discovered " << RTN_Name(rtn) << endl; RTN_Open(rtn); // Insert a call at the entry point of a routine to increment the call count RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)RtnCallPrint, IARG_ADDRINT, RTN_Name(rtn).c_str(), IARG_END); RTN_Close(rtn); }
// Pin calls this function every time a new instruction is encountered VOID Instruction(INS ins, VOID *v) { RTN rtn = INS_Rtn(ins); if (!RTN_Valid(rtn)) { ++insNoRtnDiscoveredCount; INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsNoRtnCount, IARG_END); } else if (RTN_IsDynamic(rtn)) { ++insDynamicDiscoveredCount; INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsDynamicCount, IARG_END); } else { ++insNativeDiscoveredCount; INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsNativeCount, IARG_END); } }
// Is called for every instruction and instruments reads and writes VOID Instruction(INS ins, VOID *v) { if(fixed_pim_flag) { fixed_pim_count++; return; } UINT32 memOperands = INS_MemoryOperandCount(ins); if(gen_pim_flag) { if(memOperands != 0) gen_pim_mem_ref++; else gen_pim_comp_ref++; return; } if(memOperands != 0) reg_mem_ref++; else reg_comp_ref++; return; #if 0 UINT32 memOperands = INS_MemoryOperandCount(ins); RTN rtn = INS_Rtn(ins); if ( RTN_Valid(rtn) && fixed_pim_flag) { FixPimCount(); //INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)FixPimCount, IARG_END); // icount++;//++insNoRtnDiscoveredCount; //INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)InsNativeCount, IARG_END); } else if ( RTN_IsDynamic(rtn) && gen_pim_flag) { for (UINT32 memOp = 0; memOp < memOperands; memOp++) { if ((INS_MemoryOperandIsRead(ins, memOp) || INS_MemoryOperandIsWritten(ins, memOp)) ) { /* INS_InsertPredicatedCall( ins, IPOINT_BEFORE, (AFUNPTR)GenPimMemCount, IARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END);*/ GenPimMemCount(); //INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)GenPimMemCount, IARG_END); } else { GenPimCoRef(); //INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)GenPimCoRef, IARG_END); } } } else { for (UINT32 memOp = 0; memOp < memOperands; memOp++) { if (INS_MemoryOperandIsRead(ins, memOp) || INS_MemoryOperandIsWritten(ins, memOp)) { /*INS_InsertPredicatedCall( ins, IPOINT_BEFORE, (AFUNPTR)RegMemRef, IARG_INST_PTR, IARG_MEMORYOP_EA, memOp, IARG_END);*/ RegMemRef(); //INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)RegMemRef, IARG_END); } else { RegCoRef(); // INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)RegCoRef, IARG_END); } } } INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END); INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)FixPimCount, IARG_END); INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)GenPimMemCount, IARG_END); INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)GenPimCoRef, IARG_END); INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)RegMemRef, IARG_END); INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)RegCoRef, IARG_END); #endif }