diff options
author | Daniel Dunbar <daniel@zuster.org> | 2014-09-12 19:03:17 -0700 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2014-09-12 19:08:39 -0700 |
commit | 853cc1f5c47781cc3e3681351ffe7a6d0dcd39de (patch) | |
tree | ca400a4e192f09a95c9d5789032cd81d2773666c /lib | |
parent | f093572ff2dd5d52787fa5be578f975eadf41dd3 (diff) | |
download | klee-853cc1f5c47781cc3e3681351ffe7a6d0dcd39de.tar.gz |
[Module] Fix handling of instructions without debug info.
- The change in 6829fb9 caused us to not allocation InstructionInfo objects for instructions without source-level debug info, however, that means that all such instructions end up sharing the one dummy InstructionInfo object, which really breaks statistics tracking. - This commit basically reverts that change, and also changes the code so we don't ever use the dummy InstructionInfo object for instructions, so that this problem can't be hit in other ways (e.g., if someone modifies the module after the InstructionInfoTable construction). There is a FIXME for checking the same thing for functions. - Fixes #144.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Module/InstructionInfoTable.cpp | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/lib/Module/InstructionInfoTable.cpp b/lib/Module/InstructionInfoTable.cpp index 19d7e511..82d60708 100644 --- a/lib/Module/InstructionInfoTable.cpp +++ b/lib/Module/InstructionInfoTable.cpp @@ -34,6 +34,7 @@ #endif #include "llvm/Analysis/ValueTracking.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h" #include <map> #include <string> @@ -121,23 +122,12 @@ InstructionInfoTable::InstructionInfoTable(Module *m) lineTable.find(instr); if (ltit!=lineTable.end()) assemblyLine = ltit->second; - if (getInstructionDebugInfo(instr, initialFile, initialLine)) - { - infos.insert(std::make_pair(instr, - InstructionInfo(id++, - *initialFile, - initialLine, - assemblyLine))); - DEBUG_WITH_TYPE("klee_obtained_debug", dbgs() << - "Instruction: \"" << *instr << "\" (assembly line " << assemblyLine << - ") has debug location " << *initialFile << ":" << initialLine << "\n"); - } - else - { - DEBUG_WITH_TYPE("klee_missing_debug", dbgs() << - "Instruction: \"" << *instr << "\" (assembly line " << assemblyLine << - ") is missing debug info.\n"); - } + getInstructionDebugInfo(instr, initialFile, initialLine); + infos.insert(std::make_pair(instr, + InstructionInfo(id++, + *initialFile, + initialLine, + assemblyLine))); } } } @@ -168,16 +158,20 @@ const InstructionInfo & InstructionInfoTable::getInfo(const Instruction *inst) const { std::map<const llvm::Instruction*, InstructionInfo>::const_iterator it = infos.find(inst); - if (it==infos.end()) { - return dummyInfo; - } else { - return it->second; - } + if (it == infos.end()) + llvm::report_fatal_error("invalid instruction, not present in " + "initial module!"); + return it->second; } const InstructionInfo & InstructionInfoTable::getFunctionInfo(const Function *f) const { if (f->isDeclaration()) { + // FIXME: We should probably eliminate this dummyInfo object, and instead + // allocate a per-function object to track the stats for that function + // (otherwise, anyone actually trying to use those stats is getting ones + // shared across all functions). I'd like to see if this matters in practice + // and construct a test case for it if it does, though. return dummyInfo; } else { return getInfo(f->begin()->begin()); |