diff --git a/incl/iss/plugin/pctrace.h b/incl/iss/plugin/pctrace.h index 0cad8b0..d227666 100644 --- a/incl/iss/plugin/pctrace.h +++ b/incl/iss/plugin/pctrace.h @@ -90,6 +90,7 @@ private: std::ofstream output; std::string filename; std::vector delays; + bool jumped, first; }; } diff --git a/src/plugin/pctrace.cpp b/src/plugin/pctrace.cpp index 1a92dd4..97ca4fc 100644 --- a/src/plugin/pctrace.cpp +++ b/src/plugin/pctrace.cpp @@ -20,6 +20,8 @@ iss::plugin::cov::cov(std::string const &filename) , filename(filename) { output.open("output.trc"); + jumped = false; + first = true; } iss::plugin::cov::~cov() { @@ -79,19 +81,53 @@ bool iss::plugin::cov::registration(const char *const version, vm_if& vm) { } + +inline string formatPC(uint64_t pc) { + stringstream stream; + stream << "0x" << std::hex << pc; + return stream.str(); +} + void iss::plugin::cov::callback(instr_info_t iinfo, const exec_info& einfo) { -// if((instr_if->get_next_pc() - instr_if->get_pc() != 4) ||( instr_if->get_next_pc() - instr_if->get_pc() != 2)){ -// std::cout << "jump from " << std::hex << instr_if->get_pc() << " to " << instr_if->get_next_pc()<< " after " << std::dec << counter <<" linear instructions" <get_pc() <<"," << delay << "\n"; + delay = entry.not_taken; + + if (first){ + output << formatPC(instr_if->get_pc()) << "," << delay; + first = false; + } + if(instr_if->get_next_pc()-instr_if->get_pc() != delays[iinfo.instr_id].size/8){ + //The goal is to keep the output in start-target pairs, so after a jump the target address needs to get written + //to the output. If the target happens to also be a start, we keep the pairing by adding a 0-delay entry. + if (jumped) + output <<"\n" <get_pc()) << "," << 0; + output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; + jumped = true; + } + else{ + if (jumped){ + output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; + jumped = false; + } + else if(delay!=1){ + output <<"\n" << formatPC(instr_if->get_pc()) << "," << delay; + output <<"\n" << formatPC(instr_if->get_pc()) << "," << 0; + } + + } + +//source code for the full output +// auto delay = 0; +// auto entry = delays[iinfo.instr_id]; +// bool taken = einfo.branch_taken; +// if (einfo.branch_taken) +// delay = entry.taken; +// else +// delay = entry.not_taken; +// output<get_pc() <<"," << delay << "\n"; }