#!/usr/bin/env python3
# SPDX-License-Identifier: Apache-2.0
# -----------------------------------------------------------------------------
# Copyright 2021 Arm Limited
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy
# of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# -----------------------------------------------------------------------------
"""
The ``astc_dump_binary`` utility provides a wrapper around the ``objdump``
utility to extract disassembly of specific functions. Currently only matches
the root name, for sake of command line sanity, so all overloads get dumped.

Using __attribute__((noinline)) can be useful during profiling to stop any
functions of interest getting inlined once they get too small ...
"""


import argparse
import re
import shutil
import subprocess as sp
import sys


def run_objdump(binary, symbol):
    """
    Run objdump on a single binary and extract the range for a given symbol.

    Output is printed to stdout.

    Args:
        binary (str): The path of the binary file to process.
        symbol (str): The symbol to match.

    Raises:
        CalledProcessException: The ``objdump`` subprocess failed for any reason.
    """
    args = [
        "objdump", "-C",
        "-M", "intel",
        "--no-show-raw",
        "-d", "-S",
        binary
    ]

    result = sp.run(args, stdout=sp.PIPE, stderr=sp.PIPE,
                    check=True, universal_newlines=True)

    funcPattern = re.compile(r"^[0-9a-f]{16} <(.*)\(.*\)>:$")

    funcLines = []
    funcActive = False
    lines = result.stdout.splitlines()

    for line in lines:
        match = funcPattern.match(line)
        if match:
            funcName = match.group(1)
            if funcName == symbol:
                funcActive = True
            else:
                funcActive = False

        if funcActive:
            funcLines.append(line)

    print("\n".join(funcLines))

def parse_command_line():
    """
    Parse the command line.

    Returns:
        Namespace: The parsed command line container.
    """
    parser = argparse.ArgumentParser()

    parser.add_argument("binary", type=argparse.FileType("r"),
                        help="The new binary to dump")

    parser.add_argument("symbol", type=str,
                        help="The function name to dump")

    return parser.parse_args()


def main():
    """
    The main function.

    Returns:
        int: The process return code.
    """
    args = parse_command_line()

    # Preflight - check that size exists. Note that size might still fail at
    # runtime later, e.g. if the binary is not of the correct format
    path = shutil.which("objdump")
    if not path:
        print("ERROR: The 'objdump' utility is not installed on the PATH")
        return 1

    # Collect the data
    try:
        run_objdump(args.binary.name, args.symbol)
    except sp.CalledProcessError as ex:
        print("ERROR: The 'objdump' utility failed")
        print("       %s" % ex.stderr.strip())
        return 1

    return 0


if __name__ == "__main__":
    sys.exit(main())
