[llvm-branch-commits] [llvm] [Dexter] Add condition check to state nodes (PR #203847)

Orlando Cazalet-Hyams via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jun 24 07:17:06 PDT 2026


================
@@ -21,10 +21,40 @@
 class StateMatchContext:
     """Class that holds any state needed for matching state nodes to debugger state across a run."""
 
-    def __init__(self):
+    def __init__(self, check_condition: Callable[[StepIR, int, str], bool]):
         self.where_hit_counts: Counter[Where] = Counter()
         self.expired_wheres: Set[Where] = set()
         self._last_match_result: Optional[StateMatchResult] = None
+        # To avoid constantly re-evaluating conditions above the current function, and potentially causing them to
+        # be unfulfillable if we have imperfect stack unwinding, we track conditions that have been found True for state
+        # nodes above the current function and consider those conditions true until we return to/pass that frame.
+        # Key is a frame index counting from the root upwards, to keep stable as we grow and shrink the stack.
+        self._cached_frame_conditions: Dict[int, Dict[str, bool]] = defaultdict(dict)
+        self._check_condition = check_condition
+
+    def check_condition(self, step: StepIR, frame_idx: int, condition: str) -> bool:
+        reverse_frame_idx = step.num_frames - frame_idx - 1
+        cached_conditions = self._cached_frame_conditions[reverse_frame_idx]
+        if condition in cached_conditions:
+            return cached_conditions[condition]
+        # In an ideal world we would always cache conditions in a callee frame before moving to a called frame, but
+        # some optimized code makes this infeasible, so we settle for computing it after reaching the called frame
+        # instead.
+        result = self._check_condition(step, frame_idx, condition)
+        # We cache this now, but we won't actually use it *unless* we end up stepping into a lower frame next step.
----------------
OCHyams wrote:

lower -> root/leaf child/parent etc would be clearer

https://github.com/llvm/llvm-project/pull/203847


More information about the llvm-branch-commits mailing list