| """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. |
| llvm_size = context.config.llvm_size |
| if llvm_size: |
| # -format=sysv is easier to parse than darwin/berkeley. |
| cmdline = [llvm_size, '-format=sysv', context.executable] |
| out = testplan.check_output(cmdline).decode('utf-8', errors='ignore') |
| lines = out.splitlines() |
| # 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) |