From 51b4a7ef52aa5c1877bb63a23724ac74dd9fc953 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Thu, 22 Apr 2021 11:16:21 -0700 Subject: [PATCH] [sanitizer] Use COMPILER_RT_EMULATOR with gtests Reviewed By: morehouse Differential Revision: https://reviews.llvm.org/D100998 --- compiler-rt/unittests/lit.common.unit.cfg.py | 14 +++++++++++++- compiler-rt/unittests/lit.common.unit.configured.in | 1 + llvm/utils/lit/lit/formats/googletest.py | 21 +++++++++++++++------ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/compiler-rt/unittests/lit.common.unit.cfg.py b/compiler-rt/unittests/lit.common.unit.cfg.py index fba034a..4cf5bf7 100644 --- a/compiler-rt/unittests/lit.common.unit.cfg.py +++ b/compiler-rt/unittests/lit.common.unit.cfg.py @@ -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== + 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 = [] diff --git a/compiler-rt/unittests/lit.common.unit.configured.in b/compiler-rt/unittests/lit.common.unit.configured.in index d959d43..29e1615 100644 --- a/compiler-rt/unittests/lit.common.unit.configured.in +++ b/compiler-rt/unittests/lit.common.unit.configured.in @@ -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. diff --git a/llvm/utils/lit/lit/formats/googletest.py b/llvm/utils/lit/lit/formats/googletest.py index 059eb99..0fe8a51 100644 --- a/llvm/utils/lit/lit/formats/googletest.py +++ b/llvm/utils/lit/lit/formats/googletest.py @@ -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 -- 2.7.4