xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter/dex/tools/view/Tool.py (revision f98ee40f4b5d7474fc67e82824bf6abbaedb7b1c)
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