[llvm] [SandboxIR] Remove tight-coupling with LLVM's SwitchInst::CaseHandle (PR #167093)

Jorge Gorbe Moya via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 8 09:04:17 PST 2025


================
@@ -1884,45 +1884,96 @@ class SwitchInst : public SingleLLVMInstructionImpl<llvm::SwitchInst> {
     return cast<llvm::SwitchInst>(Val)->getNumCases();
   }
 
-  using CaseHandle =
-      llvm::SwitchInst::CaseHandleImpl<SwitchInst, ConstantInt, BasicBlock>;
-  using ConstCaseHandle =
-      llvm::SwitchInst::CaseHandleImpl<const SwitchInst, const ConstantInt,
-                                       const BasicBlock>;
-  using CaseIt = llvm::SwitchInst::CaseIteratorImpl<CaseHandle>;
-  using ConstCaseIt = llvm::SwitchInst::CaseIteratorImpl<ConstCaseHandle>;
+  class CaseIt;
+  class CaseHandle {
+    Context &Ctx;
+    llvm::SwitchInst::CaseIt LLVMCaseIt;
+    friend class CaseIt;
+
+  public:
+    CaseHandle(Context &Ctx, llvm::SwitchInst::CaseIt LLVMCaseIt)
+        : Ctx(Ctx), LLVMCaseIt(LLVMCaseIt) {}
+    LLVM_ABI ConstantInt *getCaseValue() const;
+    BasicBlock *getCaseSuccessor() const;
+    unsigned getCaseIndex() const {
+      const auto &LLVMCaseHandle = *LLVMCaseIt;
+      return LLVMCaseHandle.getCaseIndex();
+    }
+    unsigned getSuccessorIndex() const {
+      const auto &LLVMCaseHandle = *LLVMCaseIt;
+      return LLVMCaseHandle.getSuccessorIndex();
+    }
+  };
+
+  class CaseIt
+      : public iterator_facade_base<CaseIt, std::random_access_iterator_tag,
+                                    CaseHandle> {
+    CaseHandle CH;
+
+  public:
+    CaseIt(Context &Ctx, llvm::SwitchInst::CaseIt It) : CH(Ctx, It) {}
+    CaseIt(SwitchInst *SI, ptrdiff_t CaseNum)
+        : CH(SI->getContext(), llvm::SwitchInst::CaseIt(
+                                   cast<llvm::SwitchInst>(SI->Val), CaseNum)) {}
+    CaseIt &operator+=(ptrdiff_t N) {
+      CH.LLVMCaseIt.operator+=(N);
+      return *this;
+    }
+    CaseIt &operator-=(ptrdiff_t N) {
+      CH.LLVMCaseIt.operator-=(N);
+      return *this;
+    }
+    ptrdiff_t operator-(const CaseIt &Other) const {
+      return CH.LLVMCaseIt - Other.CH.LLVMCaseIt;
+    }
+    bool operator==(const CaseIt &Other) const {
+      return CH.LLVMCaseIt == Other.CH.LLVMCaseIt;
+    }
+    bool operator<(const CaseIt &Other) const {
+      return CH.LLVMCaseIt < Other.CH.LLVMCaseIt;
+    }
+    CaseHandle &operator*() const { return const_cast<CaseIt *>(this)->CH; }
+  };
+
+  // TODO: Implement a proper ConstCaseIt.
----------------
slackito wrote:

It should be possible to templatize `CaseHandle` and `CaseIt` similar to what the implementation in LLVM IR does to handle the const case, right?

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


More information about the llvm-commits mailing list