[test-suite] r261857 - [cmake] Add support for arbitrary metrics

James Molloy via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 25 03:06:15 PST 2016


Author: jamesm
Date: Thu Feb 25 05:06:15 2016
New Revision: 261857

URL: http://llvm.org/viewvc/llvm-project?rev=261857&view=rev
Log:
[cmake] Add support for arbitrary metrics

This allows a .test script to specify a command to get a metric for the test. For example:

METRIC: score: grep "Score:" %o | awk '{print $2}'

Modified:
    test-suite/trunk/cmake/modules/SingleMultiSource.cmake
    test-suite/trunk/litsupport/test.py
    test-suite/trunk/litsupport/testscript.py

Modified: test-suite/trunk/cmake/modules/SingleMultiSource.cmake
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/cmake/modules/SingleMultiSource.cmake?rev=261857&r1=261856&r2=261857&view=diff
==============================================================================
--- test-suite/trunk/cmake/modules/SingleMultiSource.cmake (original)
+++ test-suite/trunk/cmake/modules/SingleMultiSource.cmake Thu Feb 25 05:06:15 2016
@@ -223,3 +223,17 @@ macro(llvm_test_verify)
     set(TESTSCRIPT "${TESTSCRIPT}VERIFY: ${JOINED_ARGUMENTS}\n")
   endif()
 endmacro()
+
+macro(llvm_test_metric)
+  CMAKE_PARSE_ARGUMENTS(ARGS "" "RUN_TYPE;METRIC" "" ${ARGN})
+  if(NOT DEFINED TESTSCRIPT)
+    set(TESTSCRIPT "" PARENT_SCOPE)
+  endif()
+  # ARGS_UNPARSED_ARGUMENTS is a semicolon-separated list. Change it into a
+  # whitespace-separated string.
+  string(REPLACE ";" " " JOINED_ARGUMENTS "${ARGS_UNPARSED_ARGUMENTS}")
+  if(NOT DEFINED ARGS_RUN_TYPE OR "${ARGS_RUN_TYPE}" STREQUAL "${TEST_SUITE_RUN_TYPE}")
+    set(TESTSCRIPT "${TESTSCRIPT}METRIC: ${ARGS_METRIC}: ${JOINED_ARGUMENTS}\n")
+  endif()
+endmacro()
+  
\ No newline at end of file

Modified: test-suite/trunk/litsupport/test.py
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/litsupport/test.py?rev=261857&r1=261856&r2=261857&view=diff
==============================================================================
--- test-suite/trunk/litsupport/test.py (original)
+++ test-suite/trunk/litsupport/test.py Thu Feb 25 05:06:15 2016
@@ -56,7 +56,7 @@ class TestSuiteTest(FileBasedTest):
         res = testscript.parse(test.getSourcePath())
         if litConfig.noExecute:
             return lit.Test.Result(Test.PASS)
-        runscript, verifyscript = res
+        runscript, verifyscript, metricscripts = res
 
         # Apply the usual lit substitutions (%s, %S, %p, %T, ...)
         tmpDir, tmpBase = getTempPaths(test)
@@ -65,6 +65,8 @@ class TestSuiteTest(FileBasedTest):
         substitutions += [('%o', outfile)]
         runscript = applySubstitutions(runscript, substitutions)
         verifyscript = applySubstitutions(verifyscript, substitutions)
+        metricscripts = {k: applySubstitutions(v, substitutions)
+                         for k,v in metricscripts.items()}
         context = TestContext(test, litConfig, runscript, verifyscript, tmpDir,
                               tmpBase)
 
@@ -80,6 +82,7 @@ class TestSuiteTest(FileBasedTest):
         output = ""
         n_runs = 1
         runtimes = []
+        metrics = {}
         for n in range(n_runs):
             res = runScript(context, runscript)
             if isinstance(res, lit.Test.Result):
@@ -94,6 +97,15 @@ class TestSuiteTest(FileBasedTest):
                 output += "\n" + err
                 return lit.Test.Result(Test.FAIL, output)
 
+            # Execute metric extraction scripts.
+            for metric, script in metricscripts.items():
+                res = runScript(context, script)
+                if isinstance(res, lit.Test.Result):
+                    return res
+
+                out, err, exitCode, timeoutInfo = res
+                metrics.setdefault(metric, list()).append(float(out))
+            
             try:
                 runtime = runsafely.getTime(context)
                 runtimes.append(runtime)
@@ -128,6 +140,8 @@ class TestSuiteTest(FileBasedTest):
         result = lit.Test.Result(Test.PASS, output)
         if len(runtimes) > 0:
             result.addMetric('exec_time', lit.Test.toMetricValue(runtimes[0]))
+        for metric, values in metrics.items():
+            result.addMetric(metric, lit.Test.toMetricValue(values[0]))
         compiletime.collect(context, result)
 
         return result

Modified: test-suite/trunk/litsupport/testscript.py
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/litsupport/testscript.py?rev=261857&r1=261856&r2=261857&view=diff
==============================================================================
--- test-suite/trunk/litsupport/testscript.py (original)
+++ test-suite/trunk/litsupport/testscript.py Thu Feb 25 05:06:15 2016
@@ -22,13 +22,18 @@ def parse(filename):
     # Collect the test lines from the script.
     runscript = []
     verifyscript = []
-    keywords = ['RUN:', 'VERIFY:']
+    metricscripts = {}
+    keywords = ['RUN:', 'VERIFY:', 'METRIC:']
     for line_number, command_type, ln in \
             parseIntegratedTestScriptCommands(filename, keywords):
         if command_type == 'RUN':
             _parseShellCommand(runscript, ln)
         elif command_type == 'VERIFY':
             _parseShellCommand(verifyscript, ln)
+        elif command_type == 'METRIC':
+            metric, ln = ln.split(':', 1)
+            metricscript = metricscripts.setdefault(metric.strip(), list())
+            _parseShellCommand(metricscript, ln)
         else:
             raise ValueError("unknown script command type: %r" % (
                              command_type,))
@@ -43,4 +48,4 @@ def parse(filename):
             raise ValueError("Test has unterminated RUN/VERIFY lines " +
                              "(ending with '\\')")
 
-    return runscript, verifyscript
+    return runscript, verifyscript, metricscripts




More information about the llvm-commits mailing list