[llvm] [llvm][formatters] Add LLDB data-formatter for llvm::PointerIntPair (PR #173261)

Michael Buch via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 23 00:32:20 PST 2025


================
@@ -239,81 +222,85 @@ def get_child_index(self, name):
             return 1
         return None
 
-    def get_child_at_index(self, index):
-        expr_path = get_expression_path(self.valobj)
-        if index == 0:
-            return self.valobj.CreateValueFromExpression(
-                "Pointer", f"({self.pointer_ty.name}){expr_path}.getPointer()"
-            )
-        if index == 1:
-            return self.valobj.CreateValueFromExpression(
-                "Int", f"({self.int_ty.name}){expr_path}.getInt()"
-            )
-        return None
-
-    def update(self):
-        self.pointer_ty = self.valobj.GetType().GetTemplateArgumentType(0)
-        self.int_ty = self.valobj.GetType().GetTemplateArgumentType(2)
-
+    def _is_valid(self) -> bool:
+        return (
+            self.value
+            and self.pointer_ty
+            and self.int_ty
+            and self.pointer_bit_mask
+            and self.int_shift
+            and self.int_mask
+        )
 
-def parse_template_parameters(typename):
-    """
-    LLDB doesn't support template parameter packs, so let's parse them manually.
-    """
-    result = []
-    start = typename.find("<")
-    end = typename.rfind(">")
-    if start < 1 or end < 2 or end - start < 2:
-        return result
+    def _get_pointer(self):
+        data: SBData = self.value.GetData()
+        error = lldb.SBError()
+        raw_bytes = data.ReadRawData(error, 0, self.ptr_size)
+        if error.Fail():
+            return None
 
-    nesting_level = 0
-    current_parameter_start = start + 1
+        unmasked_pointer = int.from_bytes(raw_bytes, self.byteorder)
+        return unmasked_pointer & self.pointer_bit_mask.GetValueAsUnsigned()
 
-    for i in range(start + 1, end + 1):
-        c = typename[i]
-        if c == "<":
-            nesting_level += 1
-        elif c == ">":
-            nesting_level -= 1
-        elif c == "," and nesting_level == 0:
-            result.append(typename[current_parameter_start:i].strip())
-            current_parameter_start = i + 1
+    def _get_int(self):
+        data: SBData = self.value.GetData()
+        error = lldb.SBError()
+        raw_bytes = data.ReadRawData(error, 0, self.ptr_size)
+        if error.Fail():
+            return None
 
-    result.append(typename[current_parameter_start:i].strip())
+        unmasked_pointer = int.from_bytes(raw_bytes, self.byteorder)
+        return (
+            unmasked_pointer >> self.int_shift.GetValueAsUnsigned()
+        ) & self.int_mask.GetValueAsUnsigned()
 
-    return result
+    def get_child_at_index(self, index):
+        if not self._is_valid():
+            return None
 
+        if index == 0:
+            pointer_value = self._get_pointer()
----------------
Michael137 wrote:

Yea can move most of that logic out

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


More information about the llvm-commits mailing list