def container_of(val: gdb.Value, gdbtype: gdb.Type, member: str) -> gdb.Value: """ Returns an object that contains the specified object at the given offset. Args: val (gdb.Value): The value to be converted. It can refer to an allocated structure or a pointer. gdbtype (gdb.Type): The type of the object that will be generated member (str): The name of the member in the target struct that contains `val`. Returns: gdb.Value<gdbtype>: The converted object, of the type specified by the caller. Raises: TypeError: val is not a gdb.Value """ if not isinstance(val, gdb.Value): raise ArgumentTypeError('val', val, gdb.Value) if not isinstance(gdbtype, gdb.Type): raise ArgumentTypeError('gdbtype', gdbtype, gdb.Type) charp = types.char_p_type if val.type.code != gdb.TYPE_CODE_PTR: val = val.address offset = offsetof(gdbtype, member) return (val.cast(charp) - offset).cast(gdbtype.pointer()).dereference()
def print_icolumn_type(col: gdb.Value) -> str: obj_type: gdb.Type = col.dynamic_type obj_casted: gdb.Value = col.cast(obj_type) if obj_type == t_col_array: offsets: gdb.Value = gdb.dereference(obj_casted["offsets"]).cast(t_col_offsets)["data"] start, end, _= get_podarray_bounds(offsets) nested_printed: str = print_icolumn_type(gdb.dereference(obj_casted["data"])) return "ColumnArray[size: {}, {}]".format(end - start, nested_printed) elif obj_type == t_col_const: data: gdb.Value = gdb.dereference(obj_casted["data"]) nested_printed: str = print_icolumn_type(data) return "ColumnConst[size: {}, {}]".format(obj_casted["s"], nested_printed) elif obj_type == t_col_lc: dictionary: gdb.Value = obj_casted["dictionary"] index: gdb.Value = obj_casted["idx"] size_of_index_type: int = int(index["size_of_type"]) index_type: str = "UInt8" if size_of_index_type == t_uint16.sizeof: index_type = "UInt16" elif size_of_index_type == t_uint32.sizeof: index_type = "UInt32" else: index_type = "UInt64" nested_col: gdb.Value = gdb.dereference( gdb.dereference(dictionary["column_unique"])["column_holder"]) nested_printed: str = print_icolumn_type(nested_col) return "ColumnLowCardinality[index: {}, {}]".format(index_type, nested_printed) elif obj_type == t_col_nullable: col_nested: gdb.Value = gdb.dereference(obj_casted["nested_column"]) nested_printed: str = print_icolumn_type(col_nested) return "ColumnNullable[{}]".format(nested_printed) elif obj_type == t_col_vector: nested_type = obj_casted.template_argument(0) start, end, _ = get_podarray_bounds(obj_casted["data"]) return "ColumnArray[size: {}, {}]".format(nested_type, end - start) else: return "NI {}".format(obj_type)
def cast_interface(obj: gdb.Value, type: str) -> gdb.Value: gdb_type = gdb.lookup_type(type) return obj.cast(gdb_type)
def cast_address(obj: gdb.Value, type: str) -> gdb.Value: gdb_type = gdb.lookup_type(type).pointer() return obj.cast(gdb_type)
def pointer_to_ast(self, pointer: gdb.Value) -> gdb.Value: return pointer.cast(gdb.lookup_type("ast_t").pointer())