arm-trusted-firmware/tools/memory/memory/memmap.py
Harrison Mutai d0e3053c4f fix(memmap): reintroduce support for GNU map files
The intial patch stack only supported ELF files, which proved
particularly problematic when dealing with incomplete builds (i.e. build
didn't complete due to linker errors). This adds support for GNU map
files. Most analysis performed by the tool should be possible with map
files alone.

Change-Id: I89f775a98efc5aef6671a17d0e6e973df555a6fa
Signed-off-by: Harrison Mutai <harrison.mutai@arm.com>
2023-06-08 14:06:00 +01:00

111 lines
2.5 KiB
Python
Executable file

#!/usr/bin/env python3
#
# Copyright (c) 2023, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
from pathlib import Path
import click
from memory.buildparser import TfaBuildParser
from memory.printer import TfaPrettyPrinter
@click.command()
@click.option(
"-r",
"--root",
type=Path,
default=None,
help="Root containing build output.",
)
@click.option(
"-p",
"--platform",
show_default=True,
default="fvp",
help="The platform targeted for analysis.",
)
@click.option(
"-b",
"--build-type",
default="release",
help="The target build type.",
type=click.Choice(["debug", "release"], case_sensitive=False),
)
@click.option(
"-f",
"--footprint",
is_flag=True,
show_default=True,
help="Generate a high level view of memory usage by memory types.",
)
@click.option(
"-t",
"--tree",
is_flag=True,
help="Generate a hierarchical view of the modules, segments and sections.",
)
@click.option(
"--depth",
default=3,
help="Generate a virtual address map of important TF symbols.",
)
@click.option(
"-s",
"--symbols",
is_flag=True,
help="Generate a map of important TF symbols.",
)
@click.option("-w", "--width", type=int, envvar="COLUMNS")
@click.option(
"-d",
is_flag=True,
default=False,
help="Display numbers in decimal base.",
)
@click.option(
"--no-elf-images",
is_flag=True,
help="Analyse the build's map files instead of ELF images.",
)
def main(
root: Path,
platform: str,
build_type: str,
footprint: str,
tree: bool,
symbols: bool,
depth: int,
width: int,
d: bool,
no_elf_images: bool,
):
build_path = root if root else Path("build/", platform, build_type)
click.echo(f"build-path: {build_path.resolve()}")
parser = TfaBuildParser(build_path, map_backend=no_elf_images)
printer = TfaPrettyPrinter(columns=width, as_decimal=d)
if footprint or not (tree or symbols):
printer.print_footprint(parser.get_mem_usage_dict())
if tree:
printer.print_mem_tree(
parser.get_mem_tree_as_dict(), parser.module_names, depth=depth
)
if symbols:
expr = (
r"(.*)(TEXT|BSS|RODATA|STACKS|_OPS|PMF|XLAT|GOT|FCONF"
r"|R.M)(.*)(START|END)__$"
)
printer.print_symbol_table(
parser.filter_symbols(parser.symbols, expr), parser.module_names
)
if __name__ == "__main__":
main()