| 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) |