123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #!/usr/bin/env python3
- # Copyright (c) 2021 Intel Corporation
- #
- # SPDX-License-Identifier: Apache-2.0
- # A script to diff between two ram or rom reports generated by
- # size_report. When you call call the ram_report or rom_report targets you
- # end up with a json file in the build directory that can be used as input
- # for this script.
- # The output shows which symbols insreased and which decreased in size and
- # also tracked added/remove symbols as well.
- # Example:
- # ./scripts/footprint/fpdiff.py ram1.json ram2.json
- from anytree.importer import DictImporter
- from anytree import PreOrderIter
- from anytree.search import find
- from colorama import Fore
- import json
- import argparse
- importer = DictImporter()
- def parse_args():
- parser = argparse.ArgumentParser(
- description="Compare footprint sizes of two builds.")
- parser.add_argument("file1", help="First file")
- parser.add_argument("file2", help="Second file")
- return parser.parse_args()
- def main():
- args = parse_args()
- with open(args.file1, "r") as f:
- data = json.load(f)
- root1 = importer.import_(data['symbols'])
- with open(args.file2, "r") as f:
- data = json.load(f)
- root2 = importer.import_(data['symbols'])
- for node in PreOrderIter(root1):
- # pylint: disable=undefined-loop-variable
- n = find(root2, lambda node2: node2.identifier == node.identifier)
- if n:
- if n.size != node.size:
- diff = n.size - node.size
- if diff == 0:
- continue
- if not n.children or not n.parent:
- if diff < 0:
- print(f"{n.identifier} -> {Fore.GREEN}{diff}{Fore.RESET}")
- else:
- print(f"{n.identifier} -> {Fore.RED}+{diff}{Fore.RESET}")
- else:
- if not node.children:
- print(f"{node.identifier} ({Fore.GREEN}-{node.size}{Fore.RESET}) disappeared.")
- for node in PreOrderIter(root2):
- n = find(root1, lambda node2: node2.identifier == node.identifier)
- if not n:
- if not node.children and node.size != 0:
- print(f"{node.identifier} ({Fore.RED}+{node.size}{Fore.RESET}) is new.")
- if __name__ == "__main__":
- main()
|