import gdb import re # GDB Pretty Printers for most isl objects class IslObjectPrinter: """Print an isl object""" def __init__(self, val, type): self.val = val self.type = type def to_string(self): # Cast val to a void pointer to stop gdb using this pretty # printer for the pointer which would lead to an infinite loop. void_ptr = gdb.lookup_type("void").pointer() value = str(self.val.cast(void_ptr)) printer = gdb.parse_and_eval( "isl_printer_to_str(isl_" + str(self.type) + "_get_ctx(" + value + "))" ) printer = gdb.parse_and_eval( "isl_printer_print_" + str(self.type) + "(" + str(printer) + ", " + value + ")" ) string = gdb.parse_and_eval("(char*)isl_printer_get_str(" + str(printer) + ")") gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")") return string def display_hint(self): return "string" class IslIntPrinter: """Print an isl_int""" def __init__(self, val): self.val = val def to_string(self): # Cast val to a void pointer to stop gdb using this pretty # printer for the pointer which would lead to an infinite loop. void_ptr = gdb.lookup_type("void").pointer() value = str(self.val.cast(void_ptr)) context = gdb.parse_and_eval("isl_ctx_alloc()") printer = gdb.parse_and_eval("isl_printer_to_str(" + str(context) + ")") printer = gdb.parse_and_eval( "isl_printer_print_isl_int(" + str(printer) + ", " + value + ")" ) string = gdb.parse_and_eval("(char*)isl_printer_get_str(" + str(printer) + ")") gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")") gdb.parse_and_eval("isl_ctx_free(" + str(context) + ")") return string def display_hint(self): return "string" class IslPrintCommand(gdb.Command): """Print an isl value.""" def __init__(self): super(IslPrintCommand, self).__init__("islprint", gdb.COMMAND_OBSCURE) def invoke(self, arg, from_tty): arg = gdb.parse_and_eval(arg) printer = str_lookup_function(arg) if printer == None: print("No isl printer for this type") return print(printer.to_string()) IslPrintCommand() def str_lookup_function(val): if val.type.code != gdb.TYPE_CODE_PTR: if str(val.type) == "isl_int": return IslIntPrinter(val) else: return None lookup_tag = val.type.target() regex = re.compile("^isl_(.*)$") if lookup_tag == None: return None m = regex.match(str(lookup_tag)) if m: # Those types of printers defined in isl. if m.group(1) in [ "basic_set", "set", "union_set", "basic_map", "map", "union_map", "qpolynomial", "pw_qpolynomial", "pw_qpolynomial_fold", "union_pw_qpolynomial", "union_pw_qpolynomial_fold", ]: return IslObjectPrinter(val, m.group(1)) return None # Do not register the pretty printer. # gdb.current_objfile().pretty_printers.append(str_lookup_function)