VOID Fini(INT32 code, VOID *v) { trace_enter(); list<param_t *>::reverse_iterator it_in, it_out; it_in = param_in->rbegin(); it_out = param_out->rbegin(); int depth = 0; UINT64 last_date = -1; bool is_in = false; gettimeofday(&stop, NULL); ofile << "Elapsed time ] Commence ; Fini [ : " << (stop.tv_usec / 1000.0 + 1000 * stop.tv_sec - start.tv_sec * 1000 - start.tv_usec / 1000.0) / 1000.0 << "s" << endl; while (it_in != param_in->rend() || it_out != param_out->rend()) { // for (int i = 0; i < depth; i++) // ofile << " "; param_t *p; if (it_in == param_in->rend()) { p = *it_out; it_out++; is_in = false; ofile << "out:"; } else if (it_out == param_out->rend() || (*it_out)->counter >= (*it_in)->counter) { p = *it_in; it_in++; is_in = true; ofile << "in:"; } else { p = *it_out; it_out++; is_in = false; ofile << "out:"; } if (p->is_addr) ofile << "addr:"; else ofile << "int:"; if (last_date != p->counter) { if (is_in) depth++; else depth--; } last_date = p->counter; ofile << p->val << ":" << fn_img(p->fid) << ":" << fn_imgaddr(p->fid) << ":" << fn_name(p->fid) << ":" << p->pos << ":" << p->counter << endl; } ofile.close(); trace_leave(); return; }
VOID Fini(INT32 code, VOID *v) { trace_enter(); #define append_type(type) \ if (need_comma) \ ofile << "," ; \ ofile << (type); \ need_comma = true for(unsigned int fid = 1; fid <= fn_nb(); fid++) { if (nb_call[fid] < NB_CALLS_TO_CONCLUDE) continue; ofile << fn_img(fid) << ":" << fn_imgaddr(fid) << ":" << fn_name(fid) << ":"; bool need_comma = false; unsigned int param_val_size = 1 + nb_param_int[fid] + nb_param_int_stack[fid]; for (unsigned int pid = 0; pid < param_val_size; pid++) { if (((float) nb_out[fid][pid]) > 0.75 * ((float) nb_call[fid])) { debug("Found 'out parameter' candidate : [%s@%lX] %s %u (%u <=> %u)\n", fn_img(fid).c_str(), fn_imgaddr(fid), fn_name(fid).c_str(), pid, nb_out[fid][pid], nb_call[fid]); } if (pid == 0 && has_return[fid] == 0) { append_type("VOID"); } else if (pid == 0 && has_return[fid] == 2) { append_type("FLOAT"); } else if (pid < 1 + nb_param_int[fid] && param_is_not_addr[fid][pid]) { append_type("INT"); } else if (param_val[fid][pid]->size() == 0) { append_type("UNDEF"); } else { int param_addr = 0; for (list<UINT64>::iterator it = param_val[fid][pid]->begin(); it != param_val[fid][pid]->end(); it++) { if (is_addr(*it)) { param_addr++; } } float coef = ((float) param_addr) / ((float) param_val[fid][pid]->size()); append_type(coef > THRESHOLD ? "ADDR" : "INT"); ofile << "(" << coef << ")"; } } for (unsigned int pid = 0; pid < nb_param_float[fid] + nb_param_float_stack[fid]; pid++) { append_type("FLOAT"); } ofile << endl; } ofile.close(); trace_leave(); }
VOID Fini(INT32 code, VOID *v) { trace_enter(); list<param_t *>::reverse_iterator it_in, it_out; it_in = param_in->rbegin(); it_out = param_out->rbegin(); int depth = 0; UINT64 last_date = -1; bool is_in = false; gettimeofday(&stop, NULL); ofile << "Elapsed time ] Commence ; Fini [ : " << (stop.tv_usec / 1000.0 + 1000 * stop.tv_sec - start.tv_sec * 1000 - start.tv_usec / 1000.0) / 1000.0 << "s" << endl; while (it_in != param_in->rend() || it_out != param_out->rend()) { param_t *p; if (it_in == param_in->rend()) { p = *it_out; it_out++; is_in = false; } else if (it_out == param_out->rend() || (*it_out)->counter >= (*it_in)->counter) { p = *it_in; it_in++; is_in = true; } else { p = *it_out; it_out++; is_in = false; } #if 0 if (p->is_addr) ofile << "a:"; else ofile << "n:"; #endif if (last_date != p->counter) { if (is_in) depth++; else depth--; } last_date = p->counter; char head = 0x00; /* Construct the first byte */ /* First two bits are for i/o and addr/not addr */ head |= 0x80 & ((is_in?1:0) << 7); head |= 0x40 & ((p->is_addr?1:0) << 6); /* Then we encode the position of the parameter */ head |= 0x3F & p->pos; if (!pushed_in_log[p->fid]) { ofile << '\xff' << p->fid << ":" << fn_img(p->fid) << ":" << fn_imgaddr(p->fid) << ":" << fn_name(p->fid) << endl; pushed_in_log[p->fid] = true; } ofile << head; ofile << p->fid << ":" << p->counter << ":" << p->val << endl; #if 0 ofile << p->val << ":" << fn_img(p->fid) << ":" << fn_imgaddr(p->fid) << ":" << fn_name(p->fid) << ":" << p->pos << ":" << p->counter << endl; #endif } ofile.close(); trace_leave(); return; }