[sanitizer] Use COMPILER_RT_EMULATOR with gtests
authorVitaly Buka <vitalybuka@google.com>
Thu, 22 Apr 2021 18:16:21 +0000 (11:16 -0700)
committerVitaly Buka <vitalybuka@google.com>
Sun, 25 Apr 2021 22:41:13 +0000 (15:41 -0700)
Reviewed By: morehouse

Differential Revision: https://reviews.llvm.org/D100998

compiler-rt/unittests/lit.common.unit.cfg.py
compiler-rt/unittests/lit.common.unit.configured.in
llvm/utils/lit/lit/formats/googletest.py

index fba034a..4cf5bf7 100644 (file)
@@ -8,9 +8,21 @@ import os
 
 import lit.formats
 
+# Copied from libcxx's config.py
+def get_lit_conf(name, default=None):
+    # Allow overriding on the command line using --param=<name>=<val>
+    val = lit_config.params.get(name, None)
+    if val is None:
+        val = getattr(config, name, None)
+        if val is None:
+            val = default
+    return val
+
+emulator = get_lit_conf('emulator', None)
+
 # Setup test format
 llvm_build_mode = getattr(config, "llvm_build_mode", "Debug")
-config.test_format = lit.formats.GoogleTest(llvm_build_mode, "Test")
+config.test_format = lit.formats.GoogleTest(llvm_build_mode, "Test", emulator)
 
 # Setup test suffixes.
 config.suffixes = []
index d959d43..29e1615 100644 (file)
@@ -12,6 +12,7 @@ config.host_arch = "@HOST_ARCH@"
 config.host_os = "@HOST_OS@"
 config.llvm_lib_dir = "@LLVM_LIBRARY_DIR@"
 config.gwp_asan = @COMPILER_RT_HAS_GWP_ASAN_PYBOOL@
+config.emulator = "@COMPILER_RT_EMULATOR@"
 
 # LLVM tools dir and build mode can be passed in lit parameters,
 # so try to apply substitution.
index 059eb99..0fe8a51 100644 (file)
@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 import os
+import shlex
 import subprocess
 import sys
 
@@ -11,7 +12,7 @@ from .base import TestFormat
 kIsWindows = sys.platform in ['win32', 'cygwin']
 
 class GoogleTest(TestFormat):
-    def __init__(self, test_sub_dirs, test_suffix):
+    def __init__(self, test_sub_dirs, test_suffix, run_under = []):
         self.test_sub_dirs = str(test_sub_dirs).split(';')
 
         # On Windows, assume tests will also end in '.exe'.
@@ -21,6 +22,7 @@ class GoogleTest(TestFormat):
 
         # Also check for .py files for testing purposes.
         self.test_suffixes = {exe_suffix, test_suffix + '.py'}
+        self.run_under = run_under
 
     def getGTestTests(self, path, litConfig, localConfig):
         """getGTestTests(path) - [name]
@@ -32,7 +34,7 @@ class GoogleTest(TestFormat):
           litConfig: LitConfig instance
           localConfig: TestingConfig instance"""
 
-        list_test_cmd = self.maybeAddPythonToCmd([path, '--gtest_list_tests'])
+        list_test_cmd = self.prepareCmd([path, '--gtest_list_tests'])
 
         try:
             output = subprocess.check_output(list_test_cmd,
@@ -113,7 +115,7 @@ class GoogleTest(TestFormat):
             testName = namePrefix + '/' + testName
 
         cmd = [testPath, '--gtest_filter=' + testName]
-        cmd = self.maybeAddPythonToCmd(cmd)
+        cmd = self.prepareCmd(cmd)
         if litConfig.useValgrind:
             cmd = litConfig.valgrindArgs + cmd
 
@@ -141,13 +143,20 @@ class GoogleTest(TestFormat):
 
         return lit.Test.PASS,''
 
-    def maybeAddPythonToCmd(self, cmd):
-        """Insert the python exe into the command if cmd[0] ends in .py
+    def prepareCmd(self, cmd):
+        """Insert interpreter if needed.
 
+        It inserts the python exe into the command if cmd[0] ends in .py or caller
+        specified run_under.
         We cannot rely on the system to interpret shebang lines for us on
         Windows, so add the python executable to the command if this is a .py
         script.
         """
         if cmd[0].endswith('.py'):
-            return [sys.executable] + cmd
+            cmd = [sys.executable] + cmd
+        if self.run_under:
+            if isinstance(self.run_under, list):
+                cmd = self.run_under + cmd
+            else:
+                cmd = shlex.split(self.run_under) + cmd
         return cmd