[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