about summary refs log tree commit diff homepage
path: root/lib/Core/Executor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Core/Executor.cpp')
-rw-r--r--lib/Core/Executor.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp
index 4dd486b6..279d5f3a 100644
--- a/lib/Core/Executor.cpp
+++ b/lib/Core/Executor.cpp
@@ -1236,6 +1236,19 @@ Executor::StatePair Executor::fork(ExecutionState &current, ref<Expr> condition,
 }
 
 void Executor::addConstraint(ExecutionState &state, ref<Expr> condition) {
+  const auto& [isMeta, patchNo] = Differentiator::extractPatchNumber(condition);
+  if (isMeta) {
+    if (state.patchNo && patchNo != state.patchNo) {
+      terminateStateEarly(state, "ignore patch combination",
+                          StateTerminationType::SilentExit);
+      return;
+    }
+    state.patchLocs++;
+    if (!state.patchNo)
+      differ.revisions.insert(state.patchNo = patchNo);
+    return;
+  }
+
   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(condition)) {
     if (!CE->isTrue())
       llvm::report_fatal_error("attempt to add invalid constraint");
@@ -4002,7 +4015,7 @@ void Executor::terminateStateOnError(ExecutionState &state,
     interpreterHandler->processTestCase(state, msg.str().c_str(), file_suffix);
   }
 
-  differ.search(&state);
+  differ.search(&state); // e.g. sanitiser error
   terminateState(state, terminationType);
 
   if (shouldExitOn(terminationType))