37
37
#include < fstream>
38
38
#include < climits>
39
39
#include < algorithm>
40
+ #include < list>
40
41
41
42
using namespace klee ;
42
43
using namespace llvm ;
@@ -486,58 +487,42 @@ bool ExhaustiveMergingSearcher::canMerge(ExecutionState* pausedES)
486
487
487
488
ExecutionState* ExhaustiveMergingSearcher::doMerge (std::set<ExecutionState*> &possibleMerges)
488
489
{
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}
493
491
494
492
for (std::set<ExecutionState*>::iterator ei = possibleMerges.begin (), ee = possibleMerges.end (); ei != ee; ++ei) {
495
493
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);
511
496
}
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) {
516
506
if (*ei == target)
517
507
continue ;
518
508
ExecutionState *es = *ei;
519
- // std::cerr << es << "\n";
520
509
521
510
int mergeOK = target->merge (*es);
522
511
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--;
526
514
executor.terminateState (*es);
527
515
}
528
- // else if (mergeOK == -1) {
529
- // std::cerr << "will now pseudomerge into" << target << "\n";
530
- // target->pseudoMergedChildren.insert(es);
531
- // }
532
516
else if (mergeOK == 0 || mergeOK == -1 ) {
533
- // std::cerr << "merge failed unexpectedly.\n";
534
- baseSearcher->addState (es);
535
- assert (pausedStates.find (es) != pausedStates.end ());
536
517
continue ;
537
518
}
538
519
}
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 ;
541
526
}
542
527
543
528
void ExhaustiveMergingSearcher::cleanPausedStates () {
@@ -563,13 +548,7 @@ void ExhaustiveMergingSearcher::cleanPausedStates() {
563
548
}
564
549
for (std::map<std::pair<llvm::Function*, llvm::BasicBlock*>, std::set<ExecutionState*> >::iterator i = esCanMergeAt.begin (), e = esCanMergeAt.end (); i != e; ++i) {
565
550
// 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 );
573
552
}
574
553
575
554
0 commit comments