diff --git a/tools/import-trace/RegisterImporter.cc b/tools/import-trace/RegisterImporter.cc index 45b9d434..9467bf6a 100644 --- a/tools/import-trace/RegisterImporter.cc +++ b/tools/import-trace/RegisterImporter.cc @@ -107,6 +107,27 @@ bool RegisterImporter::handle_ip_event(fail::simtime_t curtime, instruction_coun do_ip = cmd[IP]; do_split_registers = !cmd[NO_SPLIT]; + // retrieve register IDs for general-purpose and flags register(s) for + // the configured architecture + fail::Architecture arch; + m_ip_register_id = + (*arch.getRegisterSetOfType(RT_IP)->begin())->getId(); + fail::UniformRegisterSet *regset; + if (do_gp) { + regset = arch.getRegisterSetOfType(RT_GP); + for (fail::UniformRegisterSet::iterator it = regset->begin(); + it != regset->end(); ++it) { + m_register_ids.insert((*it)->getId()); + } + } + if (do_flags) { + regset = arch.getRegisterSetOfType(RT_ST); + for (fail::UniformRegisterSet::iterator it = regset->begin(); + it != regset->end(); ++it) { + m_register_ids.insert((*it)->getId()); + } + } + /* Disassemble the binary if necessary */ llvm::InitializeAllTargetInfos(); llvm::InitializeAllTargetMCs(); @@ -147,12 +168,10 @@ bool RegisterImporter::handle_ip_event(fail::simtime_t curtime, instruction_coun continue; } - /* if not tracing flags, but flags register -> ignore it - if not tracing gp, but ! flags -> ignore it*/ - if (info.id == RID_FLAGS && !do_flags) - continue; - else if (!do_gp) + /* only proceed if we want to inject into this register */ + if (m_register_ids.find(info.id) == m_register_ids.end()) { continue; + } if (!addRegisterTrace(curtime, instr, ev, info, 'R')) { return false; @@ -169,18 +188,16 @@ bool RegisterImporter::handle_ip_event(fail::simtime_t curtime, instruction_coun continue; } - /* if not tracing flags, but flags register -> ignore it - if not tracing gp, but ! flags -> ignore it*/ - if (info.id == RID_FLAGS && !do_flags) - continue; - else if (!do_gp) + /* only proceed if we want to inject into this register */ + if (m_register_ids.find(info.id) == m_register_ids.end()) { continue; + } if (!addRegisterTrace(curtime, instr, ev, info, 'W')) return false; } - const LLVMtoFailTranslator::reginfo_t info_pc(RID_PC); + const LLVMtoFailTranslator::reginfo_t info_pc(m_ip_register_id); if (do_ip) { if (!addRegisterTrace(curtime, instr, ev, info_pc, 'R')) return false; diff --git a/tools/import-trace/RegisterImporter.hpp b/tools/import-trace/RegisterImporter.hpp index a6cefc1d..5576ba05 100644 --- a/tools/import-trace/RegisterImporter.hpp +++ b/tools/import-trace/RegisterImporter.hpp @@ -1,7 +1,7 @@ #ifndef __REGISTER_IMPORTER_H__ #define __REGISTER_IMPORTER_H__ - +#include #include "util/CommandLine.hpp" #include "Importer.hpp" @@ -20,6 +20,9 @@ class RegisterImporter : public Importer { fail::CommandLine::option_handle NO_GP, FLAGS, IP, NO_SPLIT; bool do_gp, do_flags, do_ip, do_split_registers; + std::set m_register_ids; + unsigned m_ip_register_id; + public: RegisterImporter() : Importer(), do_gp(true), do_flags(false), do_ip(false), do_split_registers(true) {}