aboutsummaryrefslogtreecommitdiff
path: root/size-data-to-csv.py
diff options
context:
space:
mode:
Diffstat (limited to 'size-data-to-csv.py')
-rwxr-xr-xsize-data-to-csv.py83
1 files changed, 38 insertions, 45 deletions
diff --git a/size-data-to-csv.py b/size-data-to-csv.py
index 12a3b3f..f6637cf 100755
--- a/size-data-to-csv.py
+++ b/size-data-to-csv.py
@@ -5,6 +5,7 @@ import csv
import subprocess
import os
import metric_utils
+import argparse
"""
Parse output of nm -S -td."""
@@ -44,68 +45,60 @@ def get_symbol_size(symbol_to_size, perf_bmk_symbols, exe_path):
return symbol_to_size
-class Executable:
- def __init__(self, name, path):
- self.name = name
- self.path = path
+def calculate_size(exe_path):
+ return int(subprocess.check_output ("size {0} | tail -n1 | cut -f1".format(exe_path), shell=True).decode('utf-8').strip())
- def calculate_size(self):
- return int(subprocess.check_output ("size {0} | tail -n1 | cut -f1".format(self.path), shell=True).decode('utf-8').strip())
+"""
+Parse command line args. """
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-b", "--benchmark", dest="benchmark", type=str, required=True,
+ help="Benchmark name (spec, coremark)")
+ parser.add_argument("-r", "--results_dir", dest="results_dir", type=str, required=True,
+ help="Path to results dir.")
+ parser.add_argument("-o", "--out", dest="output_csv", type=str, required=True,
+ help="Output csv file")
+ parser.add_argument("-p", "--profile", dest="profile_csv", type=str, default="",
+ help="Performance profile")
+
+ args = parser.parse_args()
+ if args.benchmark == "spec" and args.profile_csv == "":
+ print("Error: SPEC needs to be provided with profile csv.")
+ exit(1)
+ return args
def main():
- bmk = sys.argv[1]
- results_dir = sys.argv[2]
- out_csv_file = sys.argv[3]
+ args = parse_args()
+ bmk_name = args.benchmark
+ results_dir = args.results_dir
+ out_csv_file = args.output_csv
+ perf_csv = args.profile_csv
outf = open(out_csv_file, "w")
csvwriter = csv.writer(outf)
csvwriter.writerow(("benchmark", "symbol", "size"))
- if bmk == "coremark":
- sizes = glob.glob("{0}/*/size.txt".format(results_dir), recursive=True)
- assert len(sizes) == 1
- size_txt = sizes[0]
- textsize = -1
- with open(size_txt, "r") as fp:
- lines = fp.readlines()
- for line in lines:
- if line.startswith(".text"):
- textsize = int(line.split()[1])
- break
- csvwriter.writerow(("coremark", "coremark", textsize))
- return 0
-
- perf_csv = sys.argv[4]
- benchmarks = metric_utils.get_benchmarks_from_results_dir(results_dir)
+ benchmarks = metric_utils.get_benchmarks_from_results_dir(bmk_name, results_dir)
for bmk in benchmarks:
- exe_path = bmk.exe_path
- # Skip calculating size, if exe is not found.
- if exe_path is None:
- csvwriter.writerow((bmk.name, bmk.exe_name, 0))
- continue
-
- # exes holds the main exe and libs used by benchmark.
- exes = []
- exes.append(Executable(bmk.exe_name, exe_path))
-
- libs = bmk.libs
- for libname in libs.keys():
- exes.append(Executable(libname, libs[libname]))
+ exe = bmk.exe
# Get symbols from perf.csv. We ensure that size for all symbols from
# perf.csv is calculcated.
perf_bmk_symbols = metric_utils.get_bmk_symbols_from_perf(perf_csv, bmk.name)
-
+
# FIXME: For now, accumulate size for symbols with same name across main exe and libraries.
# So sym_to_size now contains symbols across the main exe and libs, with
# one entry for common symbols.
- sym_to_size = {}
- for exe in exes:
- sym_to_size = get_symbol_size(sym_to_size, perf_bmk_symbols, exe.path)
+ sym_to_size = get_symbol_size({}, perf_bmk_symbols, exe.path)
+ libs = exe.libs
+ for libname in libs:
+ sym_to_size = get_symbol_size(sym_to_size, perf_bmk_symbols, libs[libname])
# Write entry for libs: bmk, libname, total lib size
- for exe in exes:
- csvwriter.writerow((bmk.name, exe.name, exe.calculate_size()))
+ csvwriter.writerow((bmk.name, exe.name, calculate_size(exe.path)))
+ libs = exe.libs
+ for libname in libs:
+ csvwriter.writerow((bmk.name, libname, calculate_size(libs[libname])))
# Write entry for indiviudal symbols
for symbol in sym_to_size.keys():
@@ -116,4 +109,4 @@ def main():
return 0
if __name__ == "__main__":
- exit(main())
+ exit(main()) \ No newline at end of file