blob: 0ed28999b32112a21b3b283f4fae9f319a284453 [file] [log] [blame]
Xiaofei Baibca03e52021-09-09 09:42:37 +00001#!/usr/bin/env python3
2
3"""
Xiaofei Baibca03e52021-09-09 09:42:37 +00004This script is for comparing the size of the library files from two
5different Git revisions within an Mbed TLS repository.
6The results of the comparison is formatted as csv and stored at a
7configurable location.
8Note: must be run from Mbed TLS root.
9"""
10
11# Copyright The Mbed TLS Contributors
12# SPDX-License-Identifier: Apache-2.0
13#
14# Licensed under the Apache License, Version 2.0 (the "License"); you may
15# not use this file except in compliance with the License.
16# You may obtain a copy of the License at
17#
18# http://www.apache.org/licenses/LICENSE-2.0
19#
20# Unless required by applicable law or agreed to in writing, software
21# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
22# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23# See the License for the specific language governing permissions and
24# limitations under the License.
25
26import argparse
27import os
Yanray Wang16ebc572023-05-30 18:10:20 +080028import re
Xiaofei Baibca03e52021-09-09 09:42:37 +000029import subprocess
30import sys
Yanray Wang16ebc572023-05-30 18:10:20 +080031import typing
Yanray Wang23bd5322023-05-24 11:03:59 +080032from enum import Enum
Xiaofei Baibca03e52021-09-09 09:42:37 +000033
Yanray Wang16ebc572023-05-30 18:10:20 +080034from mbedtls_dev import typing_util
Gilles Peskined9071e72022-09-18 21:17:09 +020035from mbedtls_dev import build_tree
36
Yanray Wang23bd5322023-05-24 11:03:59 +080037class SupportedArch(Enum):
38 """Supported architecture for code size measurement."""
39 AARCH64 = 'aarch64'
40 AARCH32 = 'aarch32'
Yanray Wangaba71582023-05-29 16:45:56 +080041 ARMV8_M = 'armv8-m'
Yanray Wang23bd5322023-05-24 11:03:59 +080042 X86_64 = 'x86_64'
43 X86 = 'x86'
44
Yanray Wang6a862582023-05-24 12:24:38 +080045CONFIG_TFM_MEDIUM_MBEDCRYPTO_H = "../configs/tfm_mbedcrypto_config_profile_medium.h"
46CONFIG_TFM_MEDIUM_PSA_CRYPTO_H = "../configs/crypto_config_profile_medium.h"
47class SupportedConfig(Enum):
48 """Supported configuration for code size measurement."""
49 DEFAULT = 'default'
50 TFM_MEDIUM = 'tfm-medium'
51
Yanray Wang16ebc572023-05-30 18:10:20 +080052# Static library
53MBEDTLS_STATIC_LIB = {
54 'CRYPTO': 'library/libmbedcrypto.a',
55 'X509': 'library/libmbedx509.a',
56 'TLS': 'library/libmbedtls.a',
57}
58
Yanray Wang23bd5322023-05-24 11:03:59 +080059DETECT_ARCH_CMD = "cc -dM -E - < /dev/null"
60def detect_arch() -> str:
61 """Auto-detect host architecture."""
62 cc_output = subprocess.check_output(DETECT_ARCH_CMD, shell=True).decode()
63 if "__aarch64__" in cc_output:
64 return SupportedArch.AARCH64.value
65 if "__arm__" in cc_output:
66 return SupportedArch.AARCH32.value
67 if "__x86_64__" in cc_output:
68 return SupportedArch.X86_64.value
69 if "__x86__" in cc_output:
70 return SupportedArch.X86.value
71 else:
72 print("Unknown host architecture, cannot auto-detect arch.")
73 sys.exit(1)
Gilles Peskined9071e72022-09-18 21:17:09 +020074
Yanray Wang6a862582023-05-24 12:24:38 +080075class CodeSizeInfo: # pylint: disable=too-few-public-methods
76 """Gather information used to measure code size.
77
78 It collects information about architecture, configuration in order to
79 infer build command for code size measurement.
80 """
81
Yanray Wangc18cd892023-05-31 11:08:04 +080082 SupportedArchConfig = [
83 "-a " + SupportedArch.AARCH64.value + " -c " + SupportedConfig.DEFAULT.value,
84 "-a " + SupportedArch.AARCH32.value + " -c " + SupportedConfig.DEFAULT.value,
85 "-a " + SupportedArch.X86_64.value + " -c " + SupportedConfig.DEFAULT.value,
86 "-a " + SupportedArch.X86.value + " -c " + SupportedConfig.DEFAULT.value,
87 "-a " + SupportedArch.ARMV8_M.value + " -c " + SupportedConfig.TFM_MEDIUM.value,
88 ]
89
Yanray Wang21f17442023-06-01 11:29:06 +080090 def __init__(self, arch: str, config: str, sys_arch: str) -> None:
Yanray Wang6a862582023-05-24 12:24:38 +080091 """
92 arch: architecture to measure code size on.
93 config: configuration type to measure code size with.
Yanray Wang699a6c82023-07-04 17:21:28 +080094 sys_arch: host architecture.
Yanray Wang6a862582023-05-24 12:24:38 +080095 make_command: command to build library (Inferred from arch and config).
96 """
97 self.arch = arch
98 self.config = config
Yanray Wang21f17442023-06-01 11:29:06 +080099 self.sys_arch = sys_arch
Yanray Wang6a862582023-05-24 12:24:38 +0800100 self.make_command = self.set_make_command()
101
102 def set_make_command(self) -> str:
103 """Infer build command based on architecture and configuration."""
104
Yanray Wang21f17442023-06-01 11:29:06 +0800105 if self.config == SupportedConfig.DEFAULT.value and \
106 self.arch == self.sys_arch:
Yanray Wang6a862582023-05-24 12:24:38 +0800107 return 'make -j lib CFLAGS=\'-Os \' '
Yanray Wangaba71582023-05-29 16:45:56 +0800108 elif self.arch == SupportedArch.ARMV8_M.value and \
Yanray Wang6a862582023-05-24 12:24:38 +0800109 self.config == SupportedConfig.TFM_MEDIUM.value:
110 return \
Yanray Wang60430bd2023-05-29 14:48:18 +0800111 'make -j lib CC=armclang \
Yanray Wang6a862582023-05-24 12:24:38 +0800112 CFLAGS=\'--target=arm-arm-none-eabi -mcpu=cortex-m33 -Os \
113 -DMBEDTLS_CONFIG_FILE=\\\"' + CONFIG_TFM_MEDIUM_MBEDCRYPTO_H + '\\\" \
114 -DMBEDTLS_PSA_CRYPTO_CONFIG_FILE=\\\"' + CONFIG_TFM_MEDIUM_PSA_CRYPTO_H + '\\\" \''
115 else:
Yanray Wang21f17442023-06-01 11:29:06 +0800116 print("Unsupported combination of architecture: {} and configuration: {}"
Yanray Wang6a862582023-05-24 12:24:38 +0800117 .format(self.arch, self.config))
Yanray Wangc18cd892023-05-31 11:08:04 +0800118 print("\nPlease use supported combination of architecture and configuration:")
119 for comb in CodeSizeInfo.SupportedArchConfig:
120 print(comb)
Yanray Wang21f17442023-06-01 11:29:06 +0800121 print("\nFor your system, please use:")
122 for comb in CodeSizeInfo.SupportedArchConfig:
123 if "default" in comb and self.sys_arch not in comb:
124 continue
125 print(comb)
Yanray Wang6a862582023-05-24 12:24:38 +0800126 sys.exit(1)
127
Yanray Wang16ebc572023-05-30 18:10:20 +0800128class SizeEntry: # pylint: disable=too-few-public-methods
129 """Data Structure to only store information of code size."""
130 def __init__(self, text, data, bss, dec):
131 self.text = text
132 self.data = data
133 self.bss = bss
134 self.total = dec # total <=> dec
Yanray Wang6a862582023-05-24 12:24:38 +0800135
Yanray Wang16ebc572023-05-30 18:10:20 +0800136class CodeSizeBase:
137 """Code Size Base Class for size record saving and writing."""
138
139 def __init__(self) -> None:
140 """ Variable code_size is used to store size info for any revisions.
141 code_size: (data format)
142 {revision: {module: {file_name: SizeEntry,
143 etc ...
144 },
145 etc ...
146 },
147 etc ...
148 }
149 """
150 self.code_size = {} #type: typing.Dict[str, typing.Dict]
151
152 def set_size_record(self, revision: str, mod: str, size_text: str) -> None:
153 """Store size information for target revision and high-level module.
154
155 size_text Format: text data bss dec hex filename
156 """
157 size_record = {}
158 for line in size_text.splitlines()[1:]:
159 data = line.split()
160 size_record[data[5]] = SizeEntry(data[0], data[1], data[2], data[3])
161 if revision in self.code_size:
162 self.code_size[revision].update({mod: size_record})
163 else:
164 self.code_size[revision] = {mod: size_record}
165
166 def read_size_record(self, revision: str, fname: str) -> None:
167 """Read size information from csv file and write it into code_size.
168
169 fname Format: filename text data bss dec
170 """
171 mod = ""
172 size_record = {}
173 with open(fname, 'r') as csv_file:
174 for line in csv_file:
175 data = line.strip().split()
176 # check if we find the beginning of a module
177 if data and data[0] in MBEDTLS_STATIC_LIB:
178 mod = data[0]
179 continue
180
181 if mod:
182 size_record[data[0]] = \
183 SizeEntry(data[1], data[2], data[3], data[4])
184
185 # check if we hit record for the end of a module
186 m = re.match(r'.?TOTALS', line)
187 if m:
188 if revision in self.code_size:
189 self.code_size[revision].update({mod: size_record})
190 else:
191 self.code_size[revision] = {mod: size_record}
192 mod = ""
193 size_record = {}
194
195 def _size_reader_helper(
196 self,
197 revision: str,
198 output: typing_util.Writable
199 ) -> typing.Iterator[tuple]:
200 """A helper function to peel code_size based on revision."""
201 for mod, file_size in self.code_size[revision].items():
202 output.write("\n" + mod + "\n")
203 for fname, size_entry in file_size.items():
204 yield mod, fname, size_entry
205
206 def write_size_record(
207 self,
208 revision: str,
209 output: typing_util.Writable
210 ) -> None:
211 """Write size information to a file.
212
213 Writing Format: file_name text data bss total(dec)
214 """
215 output.write("{:<30} {:>7} {:>7} {:>7} {:>7}\n"
216 .format("filename", "text", "data", "bss", "total"))
217 for _, fname, size_entry in self._size_reader_helper(revision, output):
218 output.write("{:<30} {:>7} {:>7} {:>7} {:>7}\n"
219 .format(fname, size_entry.text, size_entry.data,\
220 size_entry.bss, size_entry.total))
221
222 def write_comparison(
223 self,
224 old_rev: str,
225 new_rev: str,
226 output: typing_util.Writable
227 ) -> None:
228 """Write comparison result into a file.
229
230 Writing Format: file_name current(total) old(total) change(Byte) change_pct(%)
231 """
232 output.write("{:<30} {:>7} {:>7} {:>7} {:>7}\n"
233 .format("filename", "current", "old", "change", "change%"))
234 for mod, fname, size_entry in self._size_reader_helper(new_rev, output):
235 new_size = int(size_entry.total)
236 # check if we have the file in old revision
237 if fname in self.code_size[old_rev][mod]:
238 old_size = int(self.code_size[old_rev][mod][fname].total)
239 change = new_size - old_size
240 if old_size != 0:
241 change_pct = change / old_size
242 else:
243 change_pct = 0
244 output.write("{:<30} {:>7} {:>7} {:>7} {:>7.2%}\n"
245 .format(fname, new_size, old_size, change, change_pct))
246 else:
247 output.write("{} {}\n".format(fname, new_size))
248
249
250class CodeSizeComparison(CodeSizeBase):
Xiaofei Bai2400b502021-10-21 12:22:58 +0000251 """Compare code size between two Git revisions."""
Xiaofei Baibca03e52021-09-09 09:42:37 +0000252
Yanray Wang72b105f2023-05-31 15:20:39 +0800253 def __init__(
254 self,
255 old_revision: str,
256 new_revision: str,
257 result_dir: str,
258 code_size_info: CodeSizeInfo
259 ) -> None:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000260 """
Yanray Wang6a862582023-05-24 12:24:38 +0800261 old_revision: revision to compare against.
Xiaofei Baibca03e52021-09-09 09:42:37 +0000262 new_revision:
Yanray Wang6a862582023-05-24 12:24:38 +0800263 result_dir: directory for comparison result.
264 code_size_info: an object containing information to build library.
Xiaofei Baibca03e52021-09-09 09:42:37 +0000265 """
Yanray Wang8804db92023-05-30 18:18:18 +0800266 super().__init__()
Xiaofei Baibca03e52021-09-09 09:42:37 +0000267 self.repo_path = "."
268 self.result_dir = os.path.abspath(result_dir)
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000269 os.makedirs(self.result_dir, exist_ok=True)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000270
271 self.csv_dir = os.path.abspath("code_size_records/")
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000272 os.makedirs(self.csv_dir, exist_ok=True)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000273
274 self.old_rev = old_revision
275 self.new_rev = new_revision
276 self.git_command = "git"
Yanray Wang4c26db02023-07-04 16:49:04 +0800277 self.make_clean = 'make clean'
Yanray Wang6a862582023-05-24 12:24:38 +0800278 self.make_command = code_size_info.make_command
Yanray Wang369cd962023-05-24 17:13:29 +0800279 self.fname_suffix = "-" + code_size_info.arch + "-" +\
280 code_size_info.config
Xiaofei Baibca03e52021-09-09 09:42:37 +0000281
282 @staticmethod
Yanray Wang72b105f2023-05-31 15:20:39 +0800283 def validate_revision(revision: str) -> bytes:
Xiaofei Baiccd738b2021-11-03 07:12:31 +0000284 result = subprocess.check_output(["git", "rev-parse", "--verify",
285 revision + "^{commit}"], shell=False)
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000286 return result
Xiaofei Bai2400b502021-10-21 12:22:58 +0000287
Yanray Wang72b105f2023-05-31 15:20:39 +0800288 def _create_git_worktree(self, revision: str) -> str:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000289 """Make a separate worktree for revision.
290 Do not modify the current worktree."""
291
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000292 if revision == "current":
Yanray Wangc7a2a6d2023-05-31 15:47:25 +0800293 print("Using current work directory")
Xiaofei Baibca03e52021-09-09 09:42:37 +0000294 git_worktree_path = self.repo_path
295 else:
296 print("Creating git worktree for", revision)
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000297 git_worktree_path = os.path.join(self.repo_path, "temp-" + revision)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000298 subprocess.check_output(
299 [self.git_command, "worktree", "add", "--detach",
300 git_worktree_path, revision], cwd=self.repo_path,
301 stderr=subprocess.STDOUT
302 )
Aditya Deshpande41a0aad2023-04-13 16:32:21 +0100303
Xiaofei Baibca03e52021-09-09 09:42:37 +0000304 return git_worktree_path
305
Yanray Wang72b105f2023-05-31 15:20:39 +0800306 def _build_libraries(self, git_worktree_path: str) -> None:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000307 """Build libraries in the specified worktree."""
308
309 my_environment = os.environ.copy()
Aditya Deshpande41a0aad2023-04-13 16:32:21 +0100310 try:
311 subprocess.check_output(
Yanray Wang4c26db02023-07-04 16:49:04 +0800312 self.make_clean, env=my_environment, shell=True,
313 cwd=git_worktree_path, stderr=subprocess.STDOUT,
314 )
315 subprocess.check_output(
Aditya Deshpande41a0aad2023-04-13 16:32:21 +0100316 self.make_command, env=my_environment, shell=True,
317 cwd=git_worktree_path, stderr=subprocess.STDOUT,
318 )
319 except subprocess.CalledProcessError as e:
320 self._handle_called_process_error(e, git_worktree_path)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000321
Yanray Wang72b105f2023-05-31 15:20:39 +0800322 def _gen_code_size_csv(self, revision: str, git_worktree_path: str) -> None:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000323 """Generate code size csv file."""
324
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000325 if revision == "current":
Yanray Wangc7a2a6d2023-05-31 15:47:25 +0800326 print("Measuring code size in current work directory")
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000327 else:
328 print("Measuring code size for", revision)
Yanray Wang8804db92023-05-30 18:18:18 +0800329
330 for mod, st_lib in MBEDTLS_STATIC_LIB.items():
331 try:
332 result = subprocess.check_output(
333 ["size", st_lib, "-t"], cwd=git_worktree_path
334 )
335 except subprocess.CalledProcessError as e:
336 self._handle_called_process_error(e, git_worktree_path)
337 size_text = result.decode("utf-8")
338
339 self.set_size_record(revision, mod, size_text)
340
341 print("Generating code size csv for", revision)
342 csv_file = open(os.path.join(self.csv_dir, revision +
343 self.fname_suffix + ".csv"), "w")
344 self.write_size_record(revision, csv_file)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000345
Yanray Wang72b105f2023-05-31 15:20:39 +0800346 def _remove_worktree(self, git_worktree_path: str) -> None:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000347 """Remove temporary worktree."""
348 if git_worktree_path != self.repo_path:
349 print("Removing temporary worktree", git_worktree_path)
350 subprocess.check_output(
351 [self.git_command, "worktree", "remove", "--force",
352 git_worktree_path], cwd=self.repo_path,
353 stderr=subprocess.STDOUT
354 )
355
Yanray Wang72b105f2023-05-31 15:20:39 +0800356 def _get_code_size_for_rev(self, revision: str) -> None:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000357 """Generate code size csv file for the specified git revision."""
358
359 # Check if the corresponding record exists
Yanray Wang369cd962023-05-24 17:13:29 +0800360 csv_fname = revision + self.fname_suffix + ".csv"
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000361 if (revision != "current") and \
Xiaofei Baibca03e52021-09-09 09:42:37 +0000362 os.path.exists(os.path.join(self.csv_dir, csv_fname)):
363 print("Code size csv file for", revision, "already exists.")
Yanray Wang8804db92023-05-30 18:18:18 +0800364 self.read_size_record(revision, os.path.join(self.csv_dir, csv_fname))
Xiaofei Baibca03e52021-09-09 09:42:37 +0000365 else:
366 git_worktree_path = self._create_git_worktree(revision)
367 self._build_libraries(git_worktree_path)
368 self._gen_code_size_csv(revision, git_worktree_path)
369 self._remove_worktree(git_worktree_path)
370
Yanray Wang72b105f2023-05-31 15:20:39 +0800371 def _gen_code_size_comparison(self) -> int:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000372 """Generate results of the size changes between two revisions,
373 old and new. Measured code size results of these two revisions
Xiaofei Bai2400b502021-10-21 12:22:58 +0000374 must be available."""
Xiaofei Baibca03e52021-09-09 09:42:37 +0000375
Yanray Wang369cd962023-05-24 17:13:29 +0800376 res_file = open(os.path.join(self.result_dir, "compare-" +
377 self.old_rev + "-" + self.new_rev +
378 self.fname_suffix +
379 ".csv"), "w")
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000380
Yanray Wangc7a2a6d2023-05-31 15:47:25 +0800381 print("\nGenerating comparison results between",\
382 self.old_rev, "and", self.new_rev)
Yanray Wang8804db92023-05-30 18:18:18 +0800383 self.write_comparison(self.old_rev, self.new_rev, res_file)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000384
Xiaofei Bai2400b502021-10-21 12:22:58 +0000385 return 0
Xiaofei Baibca03e52021-09-09 09:42:37 +0000386
Yanray Wang72b105f2023-05-31 15:20:39 +0800387 def get_comparision_results(self) -> int:
Xiaofei Baibca03e52021-09-09 09:42:37 +0000388 """Compare size of library/*.o between self.old_rev and self.new_rev,
389 and generate the result file."""
Gilles Peskined9071e72022-09-18 21:17:09 +0200390 build_tree.check_repo_path()
Xiaofei Baibca03e52021-09-09 09:42:37 +0000391 self._get_code_size_for_rev(self.old_rev)
392 self._get_code_size_for_rev(self.new_rev)
Yanray Wang8804db92023-05-30 18:18:18 +0800393 return self._gen_code_size_comparison()
Xiaofei Baibca03e52021-09-09 09:42:37 +0000394
Aditya Deshpande41a0aad2023-04-13 16:32:21 +0100395 def _handle_called_process_error(self, e: subprocess.CalledProcessError,
Yanray Wang72b105f2023-05-31 15:20:39 +0800396 git_worktree_path: str) -> None:
Aditya Deshpande41a0aad2023-04-13 16:32:21 +0100397 """Handle a CalledProcessError and quit the program gracefully.
398 Remove any extra worktrees so that the script may be called again."""
399
400 # Tell the user what went wrong
401 print("The following command: {} failed and exited with code {}"
402 .format(e.cmd, e.returncode))
403 print("Process output:\n {}".format(str(e.output, "utf-8")))
404
405 # Quit gracefully by removing the existing worktree
406 self._remove_worktree(git_worktree_path)
407 sys.exit(-1)
408
Xiaofei Bai2400b502021-10-21 12:22:58 +0000409def main():
Yanray Wang502c54f2023-05-31 11:41:36 +0800410 parser = argparse.ArgumentParser(description=(__doc__))
411 group_required = parser.add_argument_group(
412 'required arguments',
413 'required arguments to parse for running ' + os.path.basename(__file__))
414 group_required.add_argument(
415 "-o", "--old-rev", type=str, required=True,
416 help="old revision for comparison.")
417
418 group_optional = parser.add_argument_group(
419 'optional arguments',
420 'optional arguments to parse for running ' + os.path.basename(__file__))
421 group_optional.add_argument(
Xiaofei Baibca03e52021-09-09 09:42:37 +0000422 "-r", "--result-dir", type=str, default="comparison",
423 help="directory where comparison result is stored, \
Yanray Wang502c54f2023-05-31 11:41:36 +0800424 default is comparison")
425 group_optional.add_argument(
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000426 "-n", "--new-rev", type=str, default=None,
427 help="new revision for comparison, default is the current work \
Yanray Wang502c54f2023-05-31 11:41:36 +0800428 directory, including uncommitted changes.")
429 group_optional.add_argument(
Yanray Wang23bd5322023-05-24 11:03:59 +0800430 "-a", "--arch", type=str, default=detect_arch(),
431 choices=list(map(lambda s: s.value, SupportedArch)),
432 help="specify architecture for code size comparison, default is the\
Yanray Wang502c54f2023-05-31 11:41:36 +0800433 host architecture.")
434 group_optional.add_argument(
Yanray Wang6a862582023-05-24 12:24:38 +0800435 "-c", "--config", type=str, default=SupportedConfig.DEFAULT.value,
436 choices=list(map(lambda s: s.value, SupportedConfig)),
437 help="specify configuration type for code size comparison,\
Yanray Wang502c54f2023-05-31 11:41:36 +0800438 default is the current MbedTLS configuration.")
Xiaofei Baibca03e52021-09-09 09:42:37 +0000439 comp_args = parser.parse_args()
440
441 if os.path.isfile(comp_args.result_dir):
442 print("Error: {} is not a directory".format(comp_args.result_dir))
443 parser.exit()
444
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000445 validate_res = CodeSizeComparison.validate_revision(comp_args.old_rev)
Xiaofei Baiccd738b2021-11-03 07:12:31 +0000446 old_revision = validate_res.decode().replace("\n", "")
Xiaofei Bai2400b502021-10-21 12:22:58 +0000447
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000448 if comp_args.new_rev is not None:
449 validate_res = CodeSizeComparison.validate_revision(comp_args.new_rev)
Xiaofei Baiccd738b2021-11-03 07:12:31 +0000450 new_revision = validate_res.decode().replace("\n", "")
Xiaofei Bai184e8b62021-10-26 09:23:42 +0000451 else:
452 new_revision = "current"
Xiaofei Bai2400b502021-10-21 12:22:58 +0000453
Yanray Wang21f17442023-06-01 11:29:06 +0800454 code_size_info = CodeSizeInfo(comp_args.arch, comp_args.config,
455 detect_arch())
Yanray Wangc7a2a6d2023-05-31 15:47:25 +0800456 print("Measure code size for architecture: {}, configuration: {}\n"
Yanray Wangaba71582023-05-29 16:45:56 +0800457 .format(code_size_info.arch, code_size_info.config))
Xiaofei Baibca03e52021-09-09 09:42:37 +0000458 result_dir = comp_args.result_dir
Yanray Wang6a862582023-05-24 12:24:38 +0800459 size_compare = CodeSizeComparison(old_revision, new_revision, result_dir,
460 code_size_info)
Xiaofei Baibca03e52021-09-09 09:42:37 +0000461 return_code = size_compare.get_comparision_results()
462 sys.exit(return_code)
463
464
465if __name__ == "__main__":
Xiaofei Bai2400b502021-10-21 12:22:58 +0000466 main()