| """Test module to collect code size metrics of the benchmark executable.""" |
| from litsupport import testplan |
| import logging |
| import os.path |
| |
| |
| def _getCodeSize(context): |
| # First get the filesize: This should always work. |
| metrics = {} |
| metrics['size'] = os.path.getsize(context.executable) |
| |
| # If we have the llvm-size tool available get the size per segment. |
| filename = context.test.getSourcePath() |
| if filename.endswith(".test"): |
| filename = filename[:-len(".test")] |
| filename += ".size" |
| if os.path.exists(filename): |
| with open(filename, "r") as fp: |
| lines = fp.readlines() |
| # First line contains executable name, second line should be a |
| # "section size addr" header, numbers start after that. |
| if "section" not in lines[1] or "size" not in lines[1]: |
| logging.warning("Unexpected output from llvm-size on '%s'", |
| context.executable) |
| else: |
| for line in lines[2:]: |
| line = line.strip() |
| if line == "": |
| continue |
| values = line.split() |
| if len(values) < 2: |
| logging.info("Ignoring malformed output line: %s", line) |
| continue |
| if values[0] == 'Total': |
| continue |
| try: |
| name = values[0] |
| val = int(values[1]) |
| metrics['size.%s' % name] = val |
| except ValueError: |
| logging.info("Ignoring malformed output line: %s", line) |
| |
| return metrics |
| |
| |
| def mutatePlan(context, plan): |
| plan.metric_collectors.append(_getCodeSize) |