11364750dSJames Henderson# DExTer : Debugging Experience Tester 21364750dSJames Henderson# ~~~~~~ ~ ~~ ~ ~~ 31364750dSJames Henderson# 41364750dSJames Henderson# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 51364750dSJames Henderson# See https://llvm.org/LICENSE.txt for license information. 61364750dSJames Henderson# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 71364750dSJames Henderson"""View tool.""" 81364750dSJames Henderson 91364750dSJames Hendersonimport os 101364750dSJames Henderson 111364750dSJames Hendersonimport pickle 121364750dSJames Hendersonfrom dex.heuristic import Heuristic 131364750dSJames Hendersonfrom dex.heuristic.Heuristic import add_heuristic_tool_arguments 141364750dSJames Hendersonfrom dex.tools import ToolBase 151364750dSJames Hendersonfrom dex.utils.Exceptions import Error, HeuristicException 161364750dSJames Hendersonfrom dex.utils.ReturnCode import ReturnCode 171364750dSJames Henderson 181364750dSJames Henderson 191364750dSJames Hendersonclass Tool(ToolBase): 20*f98ee40fSTobias Hieta """Given a dextIR file, display the information in a human-readable form.""" 211364750dSJames Henderson 221364750dSJames Henderson @property 231364750dSJames Henderson def name(self): 24*f98ee40fSTobias Hieta return "DExTer view" 251364750dSJames Henderson 261364750dSJames Henderson def add_tool_arguments(self, parser, defaults): 271364750dSJames Henderson add_heuristic_tool_arguments(parser) 281364750dSJames Henderson parser.add_argument( 29*f98ee40fSTobias Hieta "input_path", 30*f98ee40fSTobias Hieta metavar="dextIR-file", 311364750dSJames Henderson type=str, 321364750dSJames Henderson default=None, 33*f98ee40fSTobias Hieta help="dexter dextIR file to view", 34*f98ee40fSTobias Hieta ) 351364750dSJames Henderson parser.description = Tool.__doc__ 361364750dSJames Henderson 371364750dSJames Henderson def handle_options(self, defaults): 381364750dSJames Henderson options = self.context.options 391364750dSJames Henderson 401364750dSJames Henderson options.input_path = os.path.abspath(options.input_path) 411364750dSJames Henderson if not os.path.isfile(options.input_path): 42*f98ee40fSTobias Hieta raise Error( 43*f98ee40fSTobias Hieta '<d>could not find dextIR file</> <r>"{}"</>'.format(options.input_path) 44*f98ee40fSTobias Hieta ) 451364750dSJames Henderson 461364750dSJames Henderson def go(self) -> ReturnCode: 471364750dSJames Henderson options = self.context.options 481364750dSJames Henderson 49*f98ee40fSTobias Hieta with open(options.input_path, "rb") as fp: 501364750dSJames Henderson steps = pickle.load(fp) 511364750dSJames Henderson 521364750dSJames Henderson try: 531364750dSJames Henderson heuristic = Heuristic(self.context, steps) 541364750dSJames Henderson except HeuristicException as e: 55*f98ee40fSTobias Hieta raise Error("could not apply heuristic: {}".format(e)) 561364750dSJames Henderson 57*f98ee40fSTobias Hieta self.context.o.auto( 58*f98ee40fSTobias Hieta "{}\n\n{}\n\n{}\n\n".format( 59*f98ee40fSTobias Hieta heuristic.summary_string, steps, heuristic.verbose_output 60*f98ee40fSTobias Hieta ) 61*f98ee40fSTobias Hieta ) 621364750dSJames Henderson 631364750dSJames Henderson return ReturnCode.OK 64