import gdb class KapiMemoryAddressPrinter: """Print kapi::MemoryAddress.""" def __init__(self, val): self.val = val self.address_type = val.type.template_argument(0) def to_string(self): try: raw_address = int(self.val["m_value"]) type_string = str(self.address_type) if "linear" in type_string: suffix = "%lin" elif "physical" in type_string: suffix = "%phy" else: suffix = "%???" return f"{raw_address:#018x}{suffix}" except Exception as e: return f"{self.val}: {e}" def children(self): if "linear" in str(self.address_type): yield ( "std::byte *", self.val["m_value"].cast(gdb.lookup_type("std::byte").pointer()), ) yield ("m_value", self.val["m_value"])