static VOID Image(IMG img, VOID *v) { RTN rtn = RTN_FindByName(img, watch_rtn); if (!RTN_Valid(rtn)) { return; } printf("Instrumenting %s at %p\n", watch_rtn, reinterpret_cast<void *>(RTN_Address(rtn))); RTN_Open(rtn); INS ins = RTN_InsHeadOnly(rtn); ASSERTX (INS_Valid(ins)); // version_reg is used to select the version, use the first // argument of watch_rtn to set it INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(select_version), IARG_FUNCARG_ENTRYPOINT_VALUE, 0, IARG_REG_VALUE, version_reg, IARG_RETURN_REGS, version_reg, IARG_END); // Note that the version instrumentation will occur before any // instrumentation done on this ins from Trace or Instruction // instrumentation time callbacks INS_InsertVersionCase(ins, version_reg, 10, VERSION_1, IARG_END); INS_InsertVersionCase(ins, version_reg, 20, VERSION_2, IARG_END); RTN_Close(rtn); }
VOID Image(IMG img, void *v) { for (SEC sec = IMG_SecHead(img); SEC_Valid(sec); sec = SEC_Next(sec)) { for (RTN rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn)) { RTN_Open(rtn); numRtnsFoundInImageCallback++; INS ins = RTN_InsHeadOnly(rtn); if (INS_Invalid() == ins) { // no instruction found - assert that RTN_InsHead(rtn) also doesn't find any INS ASSERTX (INS_Invalid() == RTN_InsHead(rtn)); RTN_Close(rtn); continue; } if (INS_HasFallThrough(ins)) { ADDRINT insAddress = INS_Address(ins); numRtnsInstrumentedFromImageCallback++; RTN_InsertCall( rtn, IPOINT_BEFORE, AFUNPTR(AtRtn), IARG_ADDRINT, RTN_Address(rtn), IARG_END); INS_InsertCall (ins, IPOINT_BEFORE, AFUNPTR(BeforeInsHeadOnly), IARG_ADDRINT, INS_Address(ins), IARG_END); INS_InsertCall (ins, IPOINT_AFTER, AFUNPTR(AfterInsHeadOnly), IARG_ADDRINT, INS_Address(ins), IARG_END); ins = RTN_InsHead(rtn); ASSERTX(INS_Invalid() != ins); ASSERTX(INS_Address(ins)==insAddress); INS_InsertCall (ins, IPOINT_BEFORE, AFUNPTR(BeforeInsHead), IARG_ADDRINT, insAddress, IARG_END); INS_InsertCall (ins, IPOINT_AFTER, AFUNPTR(AfterInsHead), IARG_ADDRINT, insAddress, IARG_END); } RTN_Close(rtn); } } }
PyObject* Python_RTN_InsHeadOnly(PyObject* self, PyObject* args) { PyObject* rtn; PyArg_ParseTuple(args, "L", &rtn); RTN rtn_object = *(RTN*) rtn; INS* ins_return = (INS*) malloc(sizeof(INS)); *ins_return = RTN_InsHeadOnly(rtn_object); return Py_BuildValue("L", ins_return); }
/* ===================================================================== * Called upon image load to instrument the function GlobalFunction * ===================================================================== */ static void Image(IMG img, VOID *) { if (IMG_IsMainExecutable(img)) { RTN rtn = RTN_FindByName(img, "GlobalFunction"); ASSERT(RTN_Valid(rtn), "Failed to find GlobalFunction() in main application image"); RTN_Open(rtn); INS ins = RTN_InsHeadOnly(rtn); INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(DoBreakpoint), IARG_THREAD_ID, IARG_CONTEXT, IARG_END); RTN_Close(rtn); } }
static VOID Rtn(RTN rtn, VOID *v) { if (!RTN_Valid(rtn) || RTN_Name(rtn) != watch_rtn) { return; } printf("Rtn Instrumenting %s\n", watch_rtn); RTN_Open(rtn); INS ins = RTN_InsHeadOnly(rtn); ASSERTX (INS_Valid(ins)); INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "RTN instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST+1, IARG_END); RTN_Close(rtn); }
static VOID Image(IMG img, VOID *v) { RTN rtn = RTN_FindByName(img, watch_rtn); if (!RTN_Valid(rtn)) { return; } printf("Image Instrumenting %s\n", watch_rtn); RTN_Open(rtn); INS ins = RTN_InsHeadOnly(rtn); ASSERTX (INS_Valid(ins)); INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "IMG instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST, IARG_END); RTN_Close(rtn); }
int rtn_ins_head_only (lua_State *L) { RTN* v1 = check_rtn(L,1); INS_to_lua(L, RTN_InsHeadOnly(*v1)); return 1; }