@@ -455,6 +455,7 @@ class MemapParser(object):
455
455
"""
456
456
457
457
print_sections = ('.text' , '.data' , '.bss' )
458
+ delta_sections = ('.text-delta' , '.data-delta' , '.bss-delta' )
458
459
459
460
460
461
# sections to print info (generic for all toolchains)
@@ -466,6 +467,7 @@ def __init__(self):
466
467
# list of all modules and their sections
467
468
# full list - doesn't change with depth
468
469
self .modules = dict ()
470
+ self .old_modules = None
469
471
# short version with specific depth
470
472
self .short_modules = dict ()
471
473
@@ -510,8 +512,18 @@ def reduce_depth(self, depth):
510
512
new_name = join (* split_name [:depth ])
511
513
self .short_modules .setdefault (new_name , defaultdict (int ))
512
514
for section_idx , value in v .items ():
513
- self .short_modules [new_name ].setdefault (section_idx , 0 )
514
515
self .short_modules [new_name ][section_idx ] += self .modules [module_name ][section_idx ]
516
+ try :
517
+ new_size = self .modules [module_name ][section_idx ]
518
+ try :
519
+ old_size = self .old_modules [module_name ][section_idx ]
520
+ except KeyError :
521
+ old_size = 0
522
+ self .short_modules [new_name ][section_idx + '-delta' ] += (
523
+ new_size - old_size
524
+ )
525
+ except TypeError :
526
+ self .short_modules [new_name ][section_idx + '-delta' ] += 0
515
527
516
528
export_formats = ["json" , "csv-ci" , "html" , "table" ]
517
529
@@ -557,7 +569,7 @@ def _move_up_tree(tree, next_module):
557
569
if child ["name" ] == next_module :
558
570
return child
559
571
else :
560
- new_module = {"name" : next_module , "value" : 0 }
572
+ new_module = {"name" : next_module , "value" : 0 , "delta" : 0 }
561
573
tree ["children" ].append (new_module )
562
574
return new_module
563
575
@@ -567,9 +579,9 @@ def generate_html(self, file_desc):
567
579
Positional arguments:
568
580
file_desc - the file to write out the final report to
569
581
"""
570
- tree_text = {"name" : ".text" , "value" : 0 }
571
- tree_bss = {"name" : ".bss" , "value" : 0 }
572
- tree_data = {"name" : ".data" , "value" : 0 }
582
+ tree_text = {"name" : ".text" , "value" : 0 , "delta" : 0 }
583
+ tree_bss = {"name" : ".bss" , "value" : 0 , "delta" : 0 }
584
+ tree_data = {"name" : ".data" , "value" : 0 , "delta" : 0 }
573
585
for name , dct in self .modules .items ():
574
586
cur_text = tree_text
575
587
cur_bss = tree_bss
@@ -578,14 +590,17 @@ def generate_html(self, file_desc):
578
590
while True :
579
591
try :
580
592
cur_text ["value" ] += dct ['.text' ]
593
+ cur_text ["delta" ] += dct ['.text' ]
581
594
except KeyError :
582
595
pass
583
596
try :
584
597
cur_bss ["value" ] += dct ['.bss' ]
598
+ cur_bss ["delta" ] += dct ['.bss' ]
585
599
except KeyError :
586
600
pass
587
601
try :
588
602
cur_data ["value" ] += dct ['.data' ]
603
+ cur_data ["delta" ] += dct ['.data' ]
589
604
except KeyError :
590
605
pass
591
606
if not modules :
@@ -594,15 +609,43 @@ def generate_html(self, file_desc):
594
609
cur_text = self ._move_up_tree (cur_text , next_module )
595
610
cur_data = self ._move_up_tree (cur_data , next_module )
596
611
cur_bss = self ._move_up_tree (cur_bss , next_module )
612
+ for name , dct in self .old_modules .items ():
613
+ cur_text = tree_text
614
+ cur_bss = tree_bss
615
+ cur_data = tree_data
616
+ modules = name .split (sep )
617
+ while True :
618
+ try :
619
+ cur_text ["delta" ] -= dct ['.text' ]
620
+ except KeyError :
621
+ pass
622
+ try :
623
+ cur_bss ["delta" ] -= dct ['.bss' ]
624
+ except KeyError :
625
+ pass
626
+ try :
627
+ cur_data ["delta" ] -= dct ['.data' ]
628
+ except KeyError :
629
+ pass
630
+ if not modules :
631
+ break
632
+ next_module = modules .pop (0 )
633
+ if not any (cld ['name' ] == next_module for cld in cur_text ['children' ]):
634
+ break
635
+ cur_text = self ._move_up_tree (cur_text , next_module )
636
+ cur_data = self ._move_up_tree (cur_data , next_module )
637
+ cur_bss = self ._move_up_tree (cur_bss , next_module )
597
638
598
639
tree_rom = {
599
640
"name" : "ROM" ,
600
641
"value" : tree_text ["value" ] + tree_data ["value" ],
642
+ "delta" : tree_text ["delta" ] + tree_data ["delta" ],
601
643
"children" : [tree_text , tree_data ]
602
644
}
603
645
tree_ram = {
604
646
"name" : "RAM" ,
605
647
"value" : tree_bss ["value" ] + tree_data ["value" ],
648
+ "delta" : tree_bss ["delta" ] + tree_data ["delta" ],
606
649
"children" : [tree_bss , tree_data ]
607
650
}
608
651
@@ -646,7 +689,7 @@ def generate_csv(self, file_desc):
646
689
module_section = []
647
690
sizes = []
648
691
for i in sorted (self .short_modules ):
649
- for k in self .print_sections :
692
+ for k in self .print_sections + self . delta_sections :
650
693
module_section .append ((i + k ))
651
694
sizes += [self .short_modules [i ][k ]]
652
695
@@ -681,7 +724,8 @@ def generate_table(self, file_desc):
681
724
row = [i ]
682
725
683
726
for k in self .print_sections :
684
- row .append (self .short_modules [i ][k ])
727
+ row .append ("{}({:+})" .format (self .short_modules [i ][k ],
728
+ self .short_modules [i ][k + "-delta" ]))
685
729
686
730
table .add_row (row )
687
731
@@ -724,7 +768,8 @@ def compute_report(self):
724
768
self .mem_report .append ({
725
769
"module" : name ,
726
770
"size" :{
727
- k : sizes .get (k , 0 ) for k in self .print_sections
771
+ k : sizes .get (k , 0 ) for k in (self .print_sections +
772
+ self .delta_sections )
728
773
}
729
774
})
730
775
@@ -741,16 +786,21 @@ def parse(self, mapfile, toolchain):
741
786
"""
742
787
self .tc_name = toolchain .title ()
743
788
if toolchain in ("ARM" , "ARM_STD" , "ARM_MICRO" , "ARMC6" ):
744
- parser = _ArmccParser ()
789
+ parser = _ArmccParser
745
790
elif toolchain == "GCC_ARM" or toolchain == "GCC_CR" :
746
- parser = _GccParser ()
791
+ parser = _GccParser
747
792
elif toolchain == "IAR" :
748
- parser = _IarParser ()
793
+ parser = _IarParser
749
794
else :
750
795
return False
751
796
try :
752
797
with open (mapfile , 'r' ) as file_input :
753
- self .modules = parser .parse_mapfile (file_input )
798
+ self .modules = parser ().parse_mapfile (file_input )
799
+ try :
800
+ with open ("%s.old" % mapfile , 'r' ) as old_input :
801
+ self .old_modules = parser ().parse_mapfile (old_input )
802
+ except IOError :
803
+ self .old_modules = None
754
804
return True
755
805
756
806
except IOError as error :
0 commit comments