int main(int argc, char * argv[]) { param_addr = (bool **) malloc(NB_FN_MAX * sizeof(bool *)); is_instrumented = (bool *) calloc(NB_FN_MAX, sizeof(bool)); nb_p = (unsigned int *) calloc(NB_FN_MAX, sizeof(unsigned int)); param_in = new list<param_t *>(); param_out = new list<param_t *>(); /* Initialize symbol table code, needed for rtn instrumentation */ PIN_InitSymbols(); PIN_SetSyntaxIntel(); if (PIN_Init(argc, argv)) return 1; ifile.open(KnobInputFile.Value().c_str()); ofile.open(KnobOutputFile.Value().c_str()); // INS_AddInstrumentFunction(Instruction, 0); INS_AddInstrumentFunction(Instruction, 0); fn_registry_init(NB_FN_MAX); vector<bool> unknown_int_idx; fn_registered(FID_UNKNOWN, 0, unknown_int_idx); /* Register Fini to be called when the application exits */ PIN_AddFiniFunction(Fini, 0); PIN_StartProgram(); return 0; }
VOID Commence() { trace_enter(); /* Init instruction counter */ counter = 0; init = true; string _addr, _name; if (ifile.is_open()) { while (ifile) { char m; unsigned int nb_param = 0; vector<bool> type_param; string img_name = read_part(&m); if (img_name.empty()) { continue; } ADDRINT img_addr = atol(read_part(&m).c_str()); string name = read_part(&m); /* Read parameters */ while (ifile && m != '\n') { string part = read_part(&m); switch (part[0]) { case 'A': type_param.push_back(true); break; case 'I': case 'V': type_param.push_back(false); break; case 'F': type_param.push_back(false); break; default: type_param.push_back(false); } nb_param += 1; } FID fid = fn_register(img_name, img_addr, name); if (fid != FID_UNKNOWN) { fn_registered(fid, nb_param - 1, type_param); } } } gettimeofday(&start, NULL); trace_leave(); return; }
VOID register_functions_from_arity_log() { ifstream ifile; ifile.open(KnobInputFile.Value().c_str()); if (ifile.is_open()) { while (ifile) { char m; string img_name = read_part(ifile, &m); if (img_name.empty()) { continue; } ADDRINT img_addr = atol(read_part(ifile, &m).c_str()); string name = read_part(ifile, &m); UINT64 int_arity = atol(read_part(ifile, &m).c_str()); UINT64 int_stack_arity = atol(read_part(ifile, &m).c_str()); UINT64 float_arity = atol(read_part(ifile, &m).c_str()); UINT64 float_stack_arity = atol(read_part(ifile, &m).c_str()); UINT64 has_return = atol(read_part(ifile, &m).c_str()); vector<UINT32> int_param_idx; while (ifile && m != '\n') { string part = read_part(ifile, &m); if (part.length() == 0) { break; } long idx = atol(part.c_str()); int_param_idx.push_back(idx); } FID fid = fn_register(img_name, img_addr, name); if (fid != FID_UNKNOWN) { fn_registered(fid, int_arity, int_stack_arity, float_arity, float_stack_arity, has_return, int_param_idx); } } ifile.close(); } }
int main(int argc, char * argv[]) { nb_param_int = (unsigned int *) malloc(NB_FN_MAX * sizeof(unsigned int)); nb_param_int_stack = (unsigned int *) malloc(NB_FN_MAX * sizeof(unsigned int)); nb_param_float = (unsigned int *) malloc(NB_FN_MAX * sizeof(unsigned int)); nb_param_float_stack = (unsigned int *) malloc(NB_FN_MAX * sizeof(unsigned int)); has_return = (unsigned int *) calloc(NB_FN_MAX, sizeof(bool)); param_is_not_addr = (bool **) malloc(NB_FN_MAX * sizeof(bool *)); nb_call = (unsigned int *) malloc(NB_FN_MAX * sizeof(unsigned int)); param_val = (list<UINT64> ***) malloc(NB_FN_MAX * sizeof(list<UINT64> **)); nb_out = (unsigned int **) malloc(NB_FN_MAX * sizeof(unsigned int*)); /* Initialize symbol table code, needed for rtn instrumentation */ PIN_InitSymbols(); PIN_SetSyntaxIntel(); if (PIN_Init(argc, argv)) return 1; ofile.open(KnobOutputFile.Value().c_str()); INS_AddInstrumentFunction(Instruction, 0); IMG_AddInstrumentFunction(image_loaded, 0); /* Register Fini to be called when the application exits */ PIN_AddFiniFunction(Fini, 0); debug_trace_init(); fn_registry_init(NB_FN_MAX); vector<UINT32> unknown_int_idx; fn_registered(FID_UNKNOWN, 0, 0, 0, 0, 0, unknown_int_idx); register_functions_from_arity_log(); PIN_StartProgram(); return 0; }