def read_case(settings, interps, heaps, pointer, stack, scrutinee): try: if settings.opts.verbose: print("Found case inspection!") info_name = show.get_name_for_address(settings, pointer.value) if settings.opts.verbose: print(" Name:", show.demangle(info_name)) arms, tags, stacks, registers = gather_case_arms(settings, heaps, pointer.value, 1, settings.rt.word.size - 1, stack, { settings.rt.main_register: ptrutil.make_tagged(settings, Offset(base = CasePointer(inspection = pointer, matched_tag = DefaultTag()), index = 0)), settings.rt.stack_register: ptrutil.make_tagged(settings, Offset(base = StackPointer(), index = -len(stack))) }, stack, pointer, []) interp_arms = [] for arm, tag, stack, regs in zip(arms, tags, stacks, registers): if settings.opts.verbose: print() print("Found case arm:") print(" From case:", info_name) print(" Pattern:", tag) interp_arms.append(read_code(settings, interps, heaps, arm, stack, regs)) return Case(scrutinee = scrutinee, bound_ptr = pointer, arms = interp_arms, tags = tags) except: e_type, e_obj, e_tb = sys.exc_info() print("Error in processing case at", show.show_pretty_pointer(settings, pointer)) print(" Error:", e_obj) print(" Error Location:", e_tb.tb_lineno) print(" Disassembly:") for insn in disasm.disasm_from(settings, pointer.value): print(" " + show.show_instruction(insn)) print()
def read_case(settings, worklist, heaps, pointer, stack, scrutinee): try: if settings.opts.verbose: print("Found case inspection!") info_name = show.get_name_for_address(settings, pointer.value) if settings.opts.verbose: print(" Name:", show.demangle(info_name)) arms, tags, stacks, registers = gather_case_arms(settings, heaps, pointer.value, 1, settings.rt.word.size - 1, stack, { settings.rt.main_register: ptrutil.make_tagged(settings, Offset(base = CasePointer(inspection = pointer, matched_tag = DefaultTag()), index = 0)), settings.rt.stack_register: ptrutil.make_tagged(settings, Offset(base = StackPointer(), index = -len(stack))) }, stack, pointer, []) interp_arms = [] for arm, tag, stack, regs in zip(arms, tags, stacks, registers): if settings.opts.verbose: print() print("Found case arm:") print(" From case:", info_name) print(" Pattern:", tag) interp_arms.append(read_code(settings, worklist, heaps, arm, stack, regs)) return Case(scrutinee = scrutinee, bound_ptr = pointer, arms = interp_arms, tags = tags) except: e_type, e_obj, e_tb = sys.exc_info() print("Error in processing case at", show.show_pretty_pointer(settings, pointer)) print(" Error:", e_obj) print(" Error Location:", e_tb.tb_lineno) print(" Disassembly:") for insn in disasm.disasm_from(settings, pointer.value): print(" " + show.show_instruction(insn)) print() return UnknownInterpretation()
def run_worklist(settings, interps, worklist): while len(worklist) > 0: work = worklist.pop() if isinstance(work, ClosureWork): if settings.opts.verbose: print("Found closure:") print(" Pointer:", show.show_pretty_pointer(settings, work.pointer)) if isinstance(work.pointer, Argument) or isinstance( work.pointer, CaseArgument) or isinstance( work.pointer, Offset) and isinstance( work.pointer.base, CasePointer): if settings.opts.verbose: print(" Simple closure!") print() continue if isinstance(work.pointer, StaticValue) and show.name_is_library( show.get_name_for_address(settings, work.pointer.value)): if settings.opts.verbose: print(" Library defined!") print() continue interps[work.pointer] = parse.read_closure(settings, worklist, work.heaps, work.pointer) elif isinstance(work, FunctionThunkWork): if settings.opts.verbose: print("Found function/thunk!") print( " Name:", show.demangle( show.get_name_for_address(settings, work.address))) print(" Arg pattern:", work.arg_pattern) if StaticValue(value=work.address) in interps: if settings.opts.verbose: print(" Seen before!") print() continue if show.name_is_library( show.get_name_for_address(settings, work.address)): if settings.opts.verbose: print(" Library defined!") print() continue interps[StaticValue( value=work.address)] = parse.read_function_thunk( settings, worklist, work.heaps, work.address, work.main_register, work.arg_pattern) else: assert False, "bad work in worklist" if settings.opts.verbose: print()
def run_worklist(settings, interps, worklist): while len(worklist) > 0: work = worklist.pop() if isinstance(work, ClosureWork): if settings.opts.verbose: print("Found closure:") print(" Pointer:", show.show_pretty_pointer(settings, work.pointer)) if ( isinstance(work.pointer, Argument) or isinstance(work.pointer, CaseArgument) or isinstance(work.pointer, Offset) and isinstance(work.pointer.base, CasePointer) ): if settings.opts.verbose: print(" Simple closure!") print() continue if isinstance(work.pointer, StaticValue) and show.name_is_library( show.get_name_for_address(settings, work.pointer.value) ): if settings.opts.verbose: print(" Library defined!") print() continue interps[work.pointer] = parse.read_closure(settings, worklist, work.heaps, work.pointer) elif isinstance(work, FunctionThunkWork): if settings.opts.verbose: print("Found function/thunk!") print(" Name:", show.demangle(show.get_name_for_address(settings, work.address))) print(" Arg pattern:", work.arg_pattern) if StaticValue(value=work.address) in interps: if settings.opts.verbose: print(" Seen before!") print() continue if show.name_is_library(show.get_name_for_address(settings, work.address)): if settings.opts.verbose: print(" Library defined!") print() continue interps[StaticValue(value=work.address)] = parse.read_function_thunk( settings, worklist, work.heaps, work.address, work.main_register, work.arg_pattern ) else: assert False, "bad work in worklist" if settings.opts.verbose: print()
def read_function_thunk(settings, interps, heaps, address, main_register, arg_pattern): if settings.opts.verbose: print("Found function/thunk!") if StaticValue(value = address) in interps: if settings.opts.verbose: print(" Seen before!") return info_name = show.get_name_for_address(settings, address) if settings.opts.verbose: print(" Name:", show.demangle(info_name)) print(" Arg pattern:", arg_pattern) if show.name_is_library(info_name): if settings.opts.verbose: print(" Library Defined!") print() return extra_stack = [] registers = {} registers[settings.rt.main_register] = main_register for i in range(len(arg_pattern)): if arg_pattern[i] != 'v': if i < len(settings.rt.arg_registers): registers[settings.rt.arg_registers[i]] = ptrutil.make_tagged(settings, Argument(index = i, func = address)) else: extra_stack.append(ptrutil.make_tagged(settings, Argument(index = i, func = address))) interps[StaticValue(value = address)] = None body = read_code(settings, interps, heaps, address, extra_stack, registers) if arg_pattern == '': interps[StaticValue(value = address)] = body else: interps[StaticValue(value = address)] = Lambda(func = address, arg_pattern = arg_pattern, body = body)