code_size_compare: generate text,data as comparison result

Previously we used dec(total) as comparison result of code size
measurement. However, it's not accurate because dec(total) is
the sum of text, data and bss. Now we show text,data instead
since those are sections we care about in code size perspective
specifically for TF-M.

Signed-off-by: Yanray Wang <yanray.wang@arm.com>
diff --git a/scripts/code_size_compare.py b/scripts/code_size_compare.py
index 6b2b3a9..e679af0 100755
--- a/scripts/code_size_compare.py
+++ b/scripts/code_size_compare.py
@@ -300,7 +300,7 @@
     def __init__(self) -> None:
         """ Variable code_size is used to store size info for any revisions.
         code_size: (data format)
-        {revision: {module: {file_name: SizeEntry,
+        {revision: {module: {file_name: [text, data, bss, dec],
                              etc ...
                             },
                     etc ...
@@ -318,8 +318,9 @@
         size_record = {}
         for line in size_text.splitlines()[1:]:
             data = line.split()
-            size_record[data[5]] = CodeSizeGeneratorWithSize.SizeEntry(\
-                    data[0], data[1], data[2], data[3])
+            # file_name: SizeEntry(text, data, bss, dec)
+            size_record[data[5]] = CodeSizeGeneratorWithSize.SizeEntry(
+                data[0], data[1], data[2], data[3])
         if revision in self.code_size:
             self.code_size[revision].update({mod: size_record})
         else:
@@ -341,8 +342,8 @@
                     continue
 
                 if mod:
-                    size_record[data[0]] = \
-                        CodeSizeGeneratorWithSize.SizeEntry(\
+                    # file_name: SizeEntry(text, data, bss, dec)
+                    size_record[data[0]] = CodeSizeGeneratorWithSize.SizeEntry(
                         data[1], data[2], data[3], data[4])
 
                 # check if we hit record for the end of a module
@@ -390,24 +391,43 @@
     ) -> None:
         """Write comparison result into a file.
 
-        Writing Format: file_name current(total) old(total) change(Byte) change_pct(%)
+        Writing Format: file_name current(text,data) old(text,data)\
+                change(text,data) change_pct%(text,data)
         """
-        output.write("{:<30} {:>7} {:>7} {:>7} {:>7}\n"
-                     .format("filename", "current", "old", "change", "change%"))
-        for mod, fname, size_entry in self._size_reader_helper(new_rev, output):
-            new_size = int(size_entry.total)
+
+        def cal_size_section_variation(mod, fname, size_entry, attr):
+            new_size = int(size_entry.__dict__[attr])
             # check if we have the file in old revision
             if fname in self.code_size[old_rev][mod]:
-                old_size = int(self.code_size[old_rev][mod][fname].total)
+                old_size = int(self.code_size[old_rev][mod][fname].__dict__[attr])
                 change = new_size - old_size
                 if old_size != 0:
                     change_pct = change / old_size
                 else:
                     change_pct = 0
-                output.write("{:<30} {:>7} {:>7} {:>7} {:>7.2%}\n"
-                             .format(fname, new_size, old_size, change, change_pct))
+                return [new_size, old_size, change, change_pct]
             else:
-                output.write("{} {}\n".format(fname, new_size))
+                return [new_size]
+
+        output.write("{:<30} {:<18} {:<14} {:<17} {:<18}\n"
+                     .format("filename", "current(text,data)", "old(text,data)",\
+                             "change(text,data)", "change%(text,data)"))
+        for mod, fname, size_entry in self._size_reader_helper(new_rev, output):
+            text_vari = cal_size_section_variation(mod, fname, size_entry, 'text')
+            data_vari = cal_size_section_variation(mod, fname, size_entry, 'data')
+
+            if len(text_vari) != 1:
+                output.write("{:<30} {:<18} {:<14} {:<17} {:<18}\n"
+                             .format(fname,\
+                                     str(text_vari[0]) + "," + str(data_vari[0]),\
+                                     str(text_vari[1]) + "," + str(data_vari[1]),\
+                                     str(text_vari[2]) + "," + str(data_vari[2]),\
+                                     "{:.2%}".format(text_vari[3]) + "," +\
+                                     "{:.2%}".format(data_vari[3])))
+            else:
+                output.write("{:<30} {:<18}\n"
+                             .format(fname,\
+                                     str(text_vari[0]) + "," + str(data_vari[0])))
 
     def size_generator_write_record(
             self,