From 1438f0f373bf156413b1bfb6b03b1f04c2463aa0 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 17 May 2022 15:29:04 +0200 Subject: [PATCH] add backannotation to pc trace plugin --- incl/iss/plugin/cycle_estimate.h | 2 +- src/plugin/cycle_estimate.cpp | 14 +++++++------- src/plugin/pctrace.cpp | 9 +++++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/incl/iss/plugin/cycle_estimate.h b/incl/iss/plugin/cycle_estimate.h index 0c2cc15..a8345f5 100644 --- a/incl/iss/plugin/cycle_estimate.h +++ b/incl/iss/plugin/cycle_estimate.h @@ -81,7 +81,7 @@ public: void callback(instr_info_t instr_info, exec_info const&) override; private: - iss::instrumentation_if *arch_instr; + iss::instrumentation_if *instr_if; std::vector delays; struct pair_hash { size_t operator()(const std::pair &p) const { diff --git a/src/plugin/cycle_estimate.cpp b/src/plugin/cycle_estimate.cpp index f68d241..553a772 100644 --- a/src/plugin/cycle_estimate.cpp +++ b/src/plugin/cycle_estimate.cpp @@ -48,7 +48,7 @@ using namespace rapidjson; using namespace std; iss::plugin::cycle_estimate::cycle_estimate(string const& config_file_name) -: arch_instr(nullptr) +: instr_if(nullptr) , config_file_name(config_file_name) { } @@ -57,9 +57,9 @@ iss::plugin::cycle_estimate::~cycle_estimate() { } bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& vm) { - arch_instr = vm.get_arch()->get_instrumentation_if(); - if(!arch_instr) return false; - const string core_name = arch_instr->core_type_name(); + instr_if = vm.get_arch()->get_instrumentation_if(); + if(!instr_if) return false; + const string core_name = instr_if->core_type_name(); if (config_file_name.length() > 0) { ifstream is(config_file_name); if (is.is_open()) { @@ -108,11 +108,11 @@ bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& } void iss::plugin::cycle_estimate::callback(instr_info_t instr_info, exec_info const& exc_info) { - assert(arch_instr && "No instrumentation interface available but callback executed"); + assert(instr_if && "No instrumentation interface available but callback executed"); auto entry = delays[instr_info.instr_id]; bool taken = exc_info.branch_taken; if (exc_info.branch_taken && (entry.taken > 1)) - arch_instr->set_curr_instr_cycles(entry.taken); + instr_if->set_curr_instr_cycles(entry.taken); else if (entry.not_taken > 1) - arch_instr->set_curr_instr_cycles(entry.not_taken); + instr_if->set_curr_instr_cycles(entry.not_taken); } diff --git a/src/plugin/pctrace.cpp b/src/plugin/pctrace.cpp index 2f4db3e..d3d099b 100644 --- a/src/plugin/pctrace.cpp +++ b/src/plugin/pctrace.cpp @@ -159,10 +159,15 @@ void cov::callback(instr_info_t iinfo, const exec_info& einfo) { auto instr = instr_if->get_instr_word(); auto call = (id==2 || id==3) && bit_sub<7,5>(instr)!=0; bool taken = einfo.branch_taken; - if (einfo.branch_taken) + if (einfo.branch_taken) { delay = entry.taken; - else + if(entry.taken > 1) + instr_if->set_curr_instr_cycles(entry.taken); + } else { delay = entry.not_taken; + if (entry.not_taken > 1) + instr_if->set_curr_instr_cycles(entry.not_taken); + } #ifndef WITH_LZ4 output<get_pc() <<"," << delay <<"," << call<< "\n"; #else