[test-suite] r264240 - lit: Collect detailed codesize information via llvm-size

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 23 20:39:18 PDT 2016


Author: matze
Date: Wed Mar 23 22:39:17 2016
New Revision: 264240

URL: http://llvm.org/viewvc/llvm-project?rev=264240&view=rev
Log:
lit: Collect detailed codesize information via llvm-size

Modified:
    test-suite/trunk/CMakeLists.txt
    test-suite/trunk/lit.site.cfg.in
    test-suite/trunk/litsupport/codesize.py

Modified: test-suite/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/CMakeLists.txt?rev=264240&r1=264239&r2=264240&view=diff
==============================================================================
--- test-suite/trunk/CMakeLists.txt (original)
+++ test-suite/trunk/CMakeLists.txt Wed Mar 23 22:39:17 2016
@@ -78,13 +78,14 @@ set(TEST_SUITE_RUN_UNDER "" CACHE STRING
 set(TEST_SUITE_RUN_TYPE "train" CACHE STRING
     "Type of benchmark inputs (may be test,train or ref)")
 
+find_program(TEST_SUITE_LLVM_SIZE NAMES "llvm-size")
+find_program(TEST_SUITE_LLVM_PROFDATA NAMES "llvm-profdata")
+mark_as_advanced(TEST_SUITE_LLVM_SIZE TEST_SUITE_LLVM_PROFDATA)
+
 # Enable profile generate mode in lit. Note that this does not automatically
 # add something like -fprofile-instr-generate to the compiler flags.
 set(TEST_SUITE_PROFILE_GENERATE "FALSE" CACHE BOOL
     "Enable lit profile generate mode")
-set(TEST_SUITE_LLVM_PROFDATA "llvm-profdata" CACHE STRING
-    "llvm-profdata executable")
-mark_as_advanced(TEST_SUITE_LLVM_PROFDATA)
 # Set value to python style True/False
 if(TEST_SUITE_PROFILE_GENERATE)
   set(TEST_SUITE_PROFILE_GENERATE "True")

Modified: test-suite/trunk/lit.site.cfg.in
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/lit.site.cfg.in?rev=264240&r1=264239&r2=264240&view=diff
==============================================================================
--- test-suite/trunk/lit.site.cfg.in (original)
+++ test-suite/trunk/lit.site.cfg.in Wed Mar 23 22:39:17 2016
@@ -10,5 +10,6 @@ config.run_under = "@TEST_SUITE_RUN_UNDE
 config.strip_tool = "@CMAKE_STRIP@"
 config.profile_generate = @TEST_SUITE_PROFILE_GENERATE@
 config.llvm_profdata = "@TEST_SUITE_LLVM_PROFDATA@"
+config.llvm_size = "@TEST_SUITE_LLVM_SIZE@"
 
 lit_config.load_config(config, "@CMAKE_SOURCE_DIR@/lit.cfg")

Modified: test-suite/trunk/litsupport/codesize.py
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/litsupport/codesize.py?rev=264240&r1=264239&r2=264240&view=diff
==============================================================================
--- test-suite/trunk/litsupport/codesize.py (original)
+++ test-suite/trunk/litsupport/codesize.py Wed Mar 23 22:39:17 2016
@@ -1,11 +1,41 @@
 import lit.Test
 import logging
 import os.path
+import subprocess
 
 
 def _getCodeSize(context):
     size = os.path.getsize(context.executable)
-    return {'size': lit.Test.toMetricValue(size)}
+    # First get the filesize: This should always work.
+    metrics = {}
+    metrics['size'] = lit.Test.toMetricValue(size)
+
+    # 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 = subprocess.check_output(cmdline)
+        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 l in lines[2:]:
+                values = l.split()
+                if len(values) < 2 or values[0] == 'Total':
+                    logging.info("Ignoring malformed output line: %s", l)
+                    continue
+                try:
+                    name = values[0]
+                    val = int(values[1])
+                    metrics['size.%s' % name] = lit.Test.toMetricValue(val)
+                except ValueError as e:
+                    logging.info("Ignoring malformed output line: %s", l)
+
+    return metrics
 
 
 def mutatePlan(context, plan):




More information about the llvm-commits mailing list