diff --git a/src/core/util/llvmdisassembler/LLVMtoFailTranslator.cpp b/src/core/util/llvmdisassembler/LLVMtoFailTranslator.cpp index 0d10e1a2..f99f0070 100644 --- a/src/core/util/llvmdisassembler/LLVMtoFailTranslator.cpp +++ b/src/core/util/llvmdisassembler/LLVMtoFailTranslator.cpp @@ -9,7 +9,7 @@ const LLVMtoFailTranslator::reginfo_t & LLVMtoFailTranslator::getFailRegisterID if( it != llvm_to_fail_map.end() ) {// found return (*it).second; } else { // not found - std::cout << "Fail ID for LLVM Register id " << regid << " not found :(" << std::endl; + std::cout << "Fail ID for LLVM Register id " << std::dec << regid << " not found :(" << std::endl; //exit(EXIT_FAILURE); return notfound; } diff --git a/src/core/util/llvmdisassembler/LLVMtoFailTranslator.hpp b/src/core/util/llvmdisassembler/LLVMtoFailTranslator.hpp index 5849e12c..f64cf07a 100644 --- a/src/core/util/llvmdisassembler/LLVMtoFailTranslator.hpp +++ b/src/core/util/llvmdisassembler/LLVMtoFailTranslator.hpp @@ -51,6 +51,12 @@ protected: public: + /** + * Translates a backend-specific register ID to a Fail register ID. + * @param regid A backend-specific register ID. + * @return A Fail* register ID, or LLVMtoFailTranslator::notfound if no + * mapping was found. + */ const reginfo_t & getFailRegisterID(unsigned int regid); regdata_t getRegisterContent(ConcreteCPU & cpu, const reginfo_t & reg); @@ -63,7 +69,7 @@ public: } int getFailRegisterId(unsigned int regid) { return this->getFailRegisterID(regid).id; }; -private: + reginfo_t notfound; }; diff --git a/tools/import-trace/RegisterImporter.cc b/tools/import-trace/RegisterImporter.cc index 5564a184..4d6605d6 100644 --- a/tools/import-trace/RegisterImporter.cc +++ b/tools/import-trace/RegisterImporter.cc @@ -130,6 +130,12 @@ bool RegisterImporter::handle_ip_event(fail::simtime_t curtime, instruction_coun for (std::vector::const_iterator it = opcode.reg_uses.begin(); it != opcode.reg_uses.end(); ++it) { const LLVMtoFailTranslator::reginfo_t &info = ltof.getFailRegisterID(*it); + if (&info == <of.notfound) { + LOG << "Could not find a mapping for LLVM input register #" << std::dec << *it + << " at IP " << std::hex << ev.ip() + << ", skipping" << std::endl; + continue; + } /* if not tracing flags, but flags register -> ignore it if not tracing gp, but ! flags -> ignore it*/ @@ -146,6 +152,13 @@ bool RegisterImporter::handle_ip_event(fail::simtime_t curtime, instruction_coun for (std::vector::const_iterator it = opcode.reg_defs.begin(); it != opcode.reg_defs.end(); ++it) { const LLVMtoFailTranslator::reginfo_t &info = ltof.getFailRegisterID(*it); + if (&info == <of.notfound) { + LOG << "Could not find a mapping for LLVM output register #" << std::dec << *it + << " at IP " << std::hex << ev.ip() + << ", skipping" << std::endl; + 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)