fpdiff.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2021 Intel Corporation
  3. #
  4. # SPDX-License-Identifier: Apache-2.0
  5. # A script to diff between two ram or rom reports generated by
  6. # size_report. When you call call the ram_report or rom_report targets you
  7. # end up with a json file in the build directory that can be used as input
  8. # for this script.
  9. # The output shows which symbols increased and which decreased in size and
  10. # also tracked added/remove symbols as well.
  11. # Example:
  12. # ./scripts/footprint/fpdiff.py ram1.json ram2.json
  13. from anytree.importer import DictImporter
  14. from anytree import PreOrderIter
  15. from anytree.search import find
  16. import colorama
  17. from colorama import Fore
  18. import json
  19. import argparse
  20. importer = DictImporter()
  21. def parse_args():
  22. parser = argparse.ArgumentParser(
  23. description="Compare footprint sizes of two builds.")
  24. parser.add_argument("file1", help="First file")
  25. parser.add_argument("file2", help="Second file")
  26. return parser.parse_args()
  27. def main():
  28. colorama.init()
  29. args = parse_args()
  30. with open(args.file1, "r") as f:
  31. data1 = json.load(f)
  32. with open(args.file2, "r") as f:
  33. data2 = json.load(f)
  34. for idx, ch in enumerate(data1['symbols']['children']):
  35. root1 = importer.import_(ch)
  36. root2 = importer.import_(data2['symbols']['children'][idx])
  37. print(f"{root1.name}\n+++++++++++++++++++++")
  38. for node in PreOrderIter(root1):
  39. # pylint: disable=undefined-loop-variable
  40. n = find(root2, lambda node2: node2.identifier == node.identifier)
  41. if n:
  42. if n.size != node.size:
  43. diff = n.size - node.size
  44. if diff == 0:
  45. continue
  46. if not n.children or not n.parent:
  47. if diff < 0:
  48. print(f"{n.identifier} -> {Fore.GREEN}{diff}{Fore.RESET}")
  49. else:
  50. print(f"{n.identifier} -> {Fore.RED}+{diff}{Fore.RESET}")
  51. else:
  52. if not node.children:
  53. print(f"{node.identifier} ({Fore.GREEN}-{node.size}{Fore.RESET}) disappeared.")
  54. for node in PreOrderIter(root2):
  55. n = find(root1, lambda node2: node2.identifier == node.identifier)
  56. if not n:
  57. if not node.children and node.size != 0:
  58. print(f"{node.identifier} ({Fore.RED}+{node.size}{Fore.RESET}) is new.")
  59. if __name__ == "__main__":
  60. main()