Skip to content

Commit c828043

Browse files
committedDec 29, 2010
clean up, implemented merge-all algorithm (but turn it off by default)
1 parent 23eb54a commit c828043

File tree

2 files changed

+22
-60
lines changed

2 files changed

+22
-60
lines changed
 

‎lib/Core/ExecutionState.cpp

-17
Original file line numberDiff line numberDiff line change
@@ -159,28 +159,11 @@ std::ostream &klee::operator<<(std::ostream &os, const MemoryMap &mm) {
159159
//-1: pseudomerge instead
160160
int ExecutionState::merge(const ExecutionState &b) {
161161

162-
//std::cerr << "OHAI\n";
163162
if (DebugLogStateMerge)
164163
std::cerr << "-- attempting merge of A:"
165164
<< this << " with B:" << &b << "--\n";
166165
if (pc != b.pc)
167166
return 0;
168-
//return false;
169-
#if 0
170-
//quick hack to get user input
171-
int ans;
172-
std::cout << "type 42 to fail merge\n";
173-
std::cin >> ans;
174-
if (ans == 42) {
175-
std::cerr << "failing merge..\n";
176-
return false;
177-
}
178-
else {
179-
std::cerr << "ok, ill try to merge..\n";
180-
}
181-
182-
#endif
183-
// XXX
184167
assert(symbolics==b.symbolics && "Symbolics differ!");
185168
{
186169
std::vector<StackFrame>::const_iterator itA = stack.begin();

‎lib/Core/Searcher.cpp

+22-43
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <fstream>
3838
#include <climits>
3939
#include <algorithm>
40+
#include <list>
4041

4142
using namespace klee;
4243
using namespace llvm;
@@ -486,58 +487,42 @@ bool ExhaustiveMergingSearcher::canMerge(ExecutionState* pausedES)
486487

487488
ExecutionState* ExhaustiveMergingSearcher::doMerge(std::set<ExecutionState*> &possibleMerges)
488489
{
489-
ExecutionState *target = *possibleMerges.begin();
490-
std::set<ExecutionState*> allPossibleMerges; //possibleMerges U {es->childern | es in possibleMerges}
491-
492-
//std::cerr << "merging... possibleMerges = \n";
490+
std::list<ExecutionState*> allPossibleMerges; //possibleMerges U {es->childern | es in possibleMerges}
493491

494492
for (std::set<ExecutionState*>::iterator ei = possibleMerges.begin(), ee = possibleMerges.end(); ei != ee; ++ei) {
495493
ExecutionState *es = *ei;
496-
//std::cerr << es ;
497-
498-
allPossibleMerges.insert(es);
499-
500-
if (es->hasPseudoMergedChildren()) {
501-
std::set<ExecutionState*> esC = es->pseudoMergedChildren;
502-
es->pseudoMergedChildren.clear();
503-
allPossibleMerges.insert(esC.begin(), esC.end());
504-
//std::cerr << ":";
505-
for (std::set<ExecutionState*>::iterator esCi = esC.begin(), esCe = esC.end(); esCi != esCe; ++esCi) {
506-
ExecutionState* esCes = *esCi;
507-
//std::cerr << esCes << " ";
508-
}
509-
}
510-
//std::cerr << "\n";
494+
pausedStates.erase(es);
495+
allPossibleMerges.push_back(es);
511496
}
512-
//std::cerr << "\n";
513-
514-
515-
for (std::set<ExecutionState*>::iterator ei = allPossibleMerges.begin(), ee = allPossibleMerges.end(); ei != ee; ++ei) {
497+
498+
ExecutionState *target;
499+
std::vector<ExecutionState*> toErase;
500+
501+
//while (!allPossibleMerges.empty()) {
502+
if (1) {
503+
504+
target = allPossibleMerges.back();
505+
for (std::list<ExecutionState*>::iterator ei = allPossibleMerges.begin(), ee = allPossibleMerges.end(); ei != ee; ++ei) {
516506
if (*ei == target)
517507
continue;
518508
ExecutionState *es = *ei;
519-
//std::cerr << es << "\n";
520509

521510
int mergeOK = target->merge(*es);
522511
if (mergeOK == 1) {
523-
//std::cerr << "merge ok! \n";
524-
//std::cerr << "terminate " << es << "\n";
525-
//TODO: let baseSearcher know about it first
512+
allPossibleMerges.erase(ei);
513+
ei--;
526514
executor.terminateState(*es);
527515
}
528-
// else if (mergeOK == -1) {
529-
//std::cerr << "will now pseudomerge into" << target << "\n";
530-
//target->pseudoMergedChildren.insert(es);
531-
// }
532516
else if (mergeOK == 0 || mergeOK == -1) {
533-
//std::cerr << "merge failed unexpectedly.\n";
534-
baseSearcher->addState(es);
535-
assert(pausedStates.find(es) != pausedStates.end());
536517
continue;
537518
}
538519
}
539-
return target;
540-
//only target will be added back from baseSearcher. the pseudoMergedChildren won't.
520+
baseSearcher->addState(target);
521+
522+
allPossibleMerges.pop_back();
523+
524+
}
525+
return 0;
541526
}
542527

543528
void ExhaustiveMergingSearcher::cleanPausedStates() {
@@ -563,13 +548,7 @@ void ExhaustiveMergingSearcher::cleanPausedStates() {
563548
}
564549
for (std::map<std::pair<llvm::Function*, llvm::BasicBlock*>, std::set<ExecutionState*> >::iterator i = esCanMergeAt.begin(), e = esCanMergeAt.end(); i != e; ++i) {
565550
//std::cerr << "\t" << i->first.first->getNameStr() << "::" << i->first.second->getNameStr() << ":" << i->second.size() << "\n";
566-
ExecutionState* target = doMerge(i->second);
567-
for (std::set<ExecutionState*>::iterator p = i->second.begin(), pe = i->second.end(); p != pe; ++p) {
568-
ExecutionState* pausedE = *p;
569-
assert(pausedStates.find(pausedE) != pausedStates.end());
570-
pausedStates.erase(pausedE);
571-
}
572-
baseSearcher->addState(target);
551+
doMerge(i->second);
573552
}
574553

575554

0 commit comments

Comments
 (0)
Please sign in to comment.