Merge to upstream r348296.
Test: ./run_tests.py --bitness 32 Test: ./run_tests.py --bitness 64 Test: ./run_tests.py --bitness 64 --host Bug: None Change-Id: I79cdb1e5f146e42e383426c8e12a231b53a9459a
This commit is contained in:
@@ -133,7 +133,6 @@ class Configuration(object):
|
||||
self.configure_cxx()
|
||||
self.configure_triple()
|
||||
self.configure_deployment()
|
||||
self.configure_availability()
|
||||
self.configure_src_root()
|
||||
self.configure_obj_root()
|
||||
self.configure_cxx_stdlib_under_test()
|
||||
@@ -307,16 +306,10 @@ class Configuration(object):
|
||||
elif self.use_system_cxx_lib == 'false':
|
||||
self.use_system_cxx_lib = False
|
||||
elif self.use_system_cxx_lib:
|
||||
assert os.path.isdir(self.use_system_cxx_lib)
|
||||
assert os.path.isdir(self.use_system_cxx_lib), "the specified use_system_cxx_lib parameter (%s) is not a valid directory" % self.use_system_cxx_lib
|
||||
self.lit_config.note(
|
||||
"inferred use_system_cxx_lib as: %r" % self.use_system_cxx_lib)
|
||||
|
||||
def configure_availability(self):
|
||||
# See http://llvm.org/docs/AvailabilityMarkup.html
|
||||
self.with_availability = self.get_lit_bool('with_availability', False)
|
||||
self.lit_config.note(
|
||||
"inferred with_availability as: %r" % self.with_availability)
|
||||
|
||||
def configure_cxx_stdlib_under_test(self):
|
||||
self.cxx_stdlib_under_test = self.get_lit_conf(
|
||||
'cxx_stdlib_under_test', 'libc++')
|
||||
@@ -338,9 +331,6 @@ class Configuration(object):
|
||||
|
||||
def configure_use_clang_verify(self):
|
||||
'''If set, run clang with -verify on failing tests.'''
|
||||
if self.with_availability:
|
||||
self.use_clang_verify = False
|
||||
return
|
||||
self.use_clang_verify = self.get_lit_bool('use_clang_verify')
|
||||
if self.use_clang_verify is None:
|
||||
# NOTE: We do not test for the -verify flag directly because
|
||||
@@ -417,11 +407,10 @@ class Configuration(object):
|
||||
self.add_deployment_feature('with_system_cxx_lib')
|
||||
|
||||
# Configure the availability markup checks features.
|
||||
if self.with_availability:
|
||||
if self.use_deployment:
|
||||
self.config.available_features.add('availability_markup')
|
||||
self.add_deployment_feature('availability_markup')
|
||||
|
||||
if self.use_system_cxx_lib or self.with_availability:
|
||||
self.config.available_features.add('availability')
|
||||
self.add_deployment_feature('availability')
|
||||
|
||||
@@ -446,7 +435,7 @@ class Configuration(object):
|
||||
# Run a compile test for the -fsized-deallocation flag. This is needed
|
||||
# in test/std/language.support/support.dynamic/new.delete
|
||||
if self.cxx.hasCompileFlag('-fsized-deallocation'):
|
||||
self.config.available_features.add('fsized-deallocation')
|
||||
self.config.available_features.add('-fsized-deallocation')
|
||||
|
||||
if self.cxx.hasCompileFlag('-faligned-allocation'):
|
||||
self.config.available_features.add('-faligned-allocation')
|
||||
@@ -585,9 +574,6 @@ class Configuration(object):
|
||||
self.cxx.flags += ['-arch', arch]
|
||||
self.cxx.flags += ['-m' + name + '-version-min=' + version]
|
||||
|
||||
# Disable availability unless explicitely requested
|
||||
if not self.with_availability:
|
||||
self.cxx.flags += ['-D_LIBCPP_DISABLE_AVAILABILITY']
|
||||
# FIXME(EricWF): variant_size.pass.cpp requires a slightly larger
|
||||
# template depth with older Clang versions.
|
||||
self.cxx.addFlagIfSupported('-ftemplate-depth=270')
|
||||
@@ -677,7 +663,8 @@ class Configuration(object):
|
||||
if feature_macros[m]:
|
||||
define += '=%s' % (feature_macros[m])
|
||||
self.cxx.compile_flags += [define]
|
||||
if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS':
|
||||
if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS' or \
|
||||
m == '_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT':
|
||||
continue
|
||||
if m == '_LIBCPP_ABI_VERSION':
|
||||
self.config.available_features.add('libcpp-abi-version-v%s'
|
||||
@@ -720,13 +707,9 @@ class Configuration(object):
|
||||
enable_fs = self.get_lit_bool('enable_filesystem', default=False)
|
||||
if not enable_fs:
|
||||
return
|
||||
enable_experimental = self.get_lit_bool('enable_experimental', default=False)
|
||||
if not enable_experimental:
|
||||
self.lit_config.fatal(
|
||||
'filesystem is enabled but libc++experimental.a is not.')
|
||||
self.config.available_features.add('c++filesystem')
|
||||
static_env = os.path.join(self.libcxx_src_root, 'test', 'std',
|
||||
'experimental', 'filesystem', 'Inputs', 'static_test_env')
|
||||
'input.output', 'filesystems', 'Inputs', 'static_test_env')
|
||||
static_env = os.path.realpath(static_env)
|
||||
assert os.path.isdir(static_env)
|
||||
self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="%s"' % static_env]
|
||||
@@ -821,6 +804,10 @@ class Configuration(object):
|
||||
if libcxx_experimental:
|
||||
self.config.available_features.add('c++experimental')
|
||||
self.cxx.link_flags += ['-lc++experimental']
|
||||
libcxx_fs = self.get_lit_bool('enable_filesystem', default=False)
|
||||
if libcxx_fs:
|
||||
self.config.available_features.add('c++fs')
|
||||
self.cxx.link_flags += ['-lc++fs']
|
||||
if self.link_shared:
|
||||
self.cxx.link_flags += ['-lc++']
|
||||
else:
|
||||
@@ -930,12 +917,6 @@ class Configuration(object):
|
||||
self.cxx.addWarningFlagIfSupported('-Wunused-variable')
|
||||
self.cxx.addWarningFlagIfSupported('-Wunused-parameter')
|
||||
self.cxx.addWarningFlagIfSupported('-Wunreachable-code')
|
||||
# FIXME: Enable the two warnings below.
|
||||
self.cxx.addWarningFlagIfSupported('-Wno-conversion')
|
||||
self.cxx.addWarningFlagIfSupported('-Wno-unused-local-typedef')
|
||||
# FIXME: Remove this warning once the min/max handling patch lands
|
||||
# See https://reviews.llvm.org/D33080
|
||||
self.cxx.addWarningFlagIfSupported('-Wno-#warnings')
|
||||
std = self.get_lit_conf('std', None)
|
||||
if std in ['c++98', 'c++03']:
|
||||
# The '#define static_assert' provided by libc++ in C++03 mode
|
||||
|
||||
@@ -188,7 +188,7 @@ class LibcxxTestFormat(object):
|
||||
if rc != 0:
|
||||
report = libcxx.util.makeReport(cmd, out, err, rc)
|
||||
report += "Compilation failed unexpectedly!"
|
||||
return lit.Test.FAIL, report
|
||||
return lit.Test.Result(lit.Test.FAIL, report)
|
||||
# Run the test
|
||||
local_cwd = os.path.dirname(source_path)
|
||||
env = None
|
||||
@@ -206,14 +206,14 @@ class LibcxxTestFormat(object):
|
||||
cmd, out, err, rc = self.executor.run(exec_path, [exec_path],
|
||||
local_cwd, data_files,
|
||||
env)
|
||||
report = "Compiled With: '%s'\n" % ' '.join(compile_cmd)
|
||||
report += libcxx.util.makeReport(cmd, out, err, rc)
|
||||
if rc == 0:
|
||||
res = lit.Test.PASS if retry_count == 0 else lit.Test.FLAKYPASS
|
||||
return res, ''
|
||||
return lit.Test.Result(res, report)
|
||||
elif rc != 0 and retry_count + 1 == max_retry:
|
||||
report = libcxx.util.makeReport(cmd, out, err, rc)
|
||||
report = "Compiled With: %s\n%s" % (compile_cmd, report)
|
||||
report += "Compiled test failed unexpectedly!"
|
||||
return lit.Test.FAIL, report
|
||||
return lit.Test.Result(lit.Test.FAIL, report)
|
||||
|
||||
assert False # Unreachable
|
||||
finally:
|
||||
@@ -250,16 +250,15 @@ class LibcxxTestFormat(object):
|
||||
#
|
||||
# Therefore, we check if the test was expected to fail because of
|
||||
# nodiscard before enabling it
|
||||
test_str = "ignoring return value of function declared with " \
|
||||
+ "'nodiscard' attribute"
|
||||
if test_str in contents:
|
||||
test_str_list = ['ignoring return value', 'nodiscard', 'NODISCARD']
|
||||
if any(test_str in contents for test_str in test_str_list):
|
||||
test_cxx.flags += ['-Werror=unused-result']
|
||||
cmd, out, err, rc = test_cxx.compile(source_path, out=os.devnull)
|
||||
expected_rc = 0 if use_verify else 1
|
||||
report = libcxx.util.makeReport(cmd, out, err, rc)
|
||||
if rc == expected_rc:
|
||||
return lit.Test.PASS, ''
|
||||
return lit.Test.Result(lit.Test.PASS, report)
|
||||
else:
|
||||
report = libcxx.util.makeReport(cmd, out, err, rc)
|
||||
report_msg = ('Expected compilation to fail!' if not use_verify else
|
||||
'Expected compilation using verify to pass!')
|
||||
return lit.Test.FAIL, report + report_msg + '\n'
|
||||
report += ('Expected compilation to fail!\n' if not use_verify else
|
||||
'Expected compilation using verify to pass!\n')
|
||||
return lit.Test.Result(lit.Test.FAIL, report)
|
||||
|
||||
122
utils/libcxx/test/googlebenchmark.py
Normal file
122
utils/libcxx/test/googlebenchmark.py
Normal file
@@ -0,0 +1,122 @@
|
||||
from __future__ import absolute_import
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import lit.Test
|
||||
import lit.TestRunner
|
||||
import lit.util
|
||||
from lit.formats.base import TestFormat
|
||||
|
||||
kIsWindows = sys.platform in ['win32', 'cygwin']
|
||||
|
||||
class GoogleBenchmark(TestFormat):
|
||||
def __init__(self, test_sub_dirs, test_suffix, benchmark_args=[]):
|
||||
self.benchmark_args = list(benchmark_args)
|
||||
self.test_sub_dirs = os.path.normcase(str(test_sub_dirs)).split(';')
|
||||
|
||||
# On Windows, assume tests will also end in '.exe'.
|
||||
exe_suffix = str(test_suffix)
|
||||
if kIsWindows:
|
||||
exe_suffix += '.exe'
|
||||
|
||||
# Also check for .py files for testing purposes.
|
||||
self.test_suffixes = {exe_suffix, test_suffix + '.py'}
|
||||
|
||||
def getBenchmarkTests(self, path, litConfig, localConfig):
|
||||
"""getBenchmarkTests(path) - [name]
|
||||
|
||||
Return the tests available in gtest executable.
|
||||
|
||||
Args:
|
||||
path: String path to a gtest executable
|
||||
litConfig: LitConfig instance
|
||||
localConfig: TestingConfig instance"""
|
||||
|
||||
# TODO: allow splitting tests according to the "benchmark family" so
|
||||
# the output for a single family of tests all belongs to the same test
|
||||
# target.
|
||||
list_test_cmd = [path, '--benchmark_list_tests']
|
||||
try:
|
||||
output = subprocess.check_output(list_test_cmd,
|
||||
env=localConfig.environment)
|
||||
except subprocess.CalledProcessError as exc:
|
||||
litConfig.warning(
|
||||
"unable to discover google-benchmarks in %r: %s. Process output: %s"
|
||||
% (path, sys.exc_info()[1], exc.output))
|
||||
raise StopIteration
|
||||
|
||||
nested_tests = []
|
||||
for ln in output.splitlines(False): # Don't keep newlines.
|
||||
ln = lit.util.to_string(ln)
|
||||
if not ln.strip():
|
||||
continue
|
||||
|
||||
index = 0
|
||||
while ln[index*2:index*2+2] == ' ':
|
||||
index += 1
|
||||
while len(nested_tests) > index:
|
||||
nested_tests.pop()
|
||||
|
||||
ln = ln[index*2:]
|
||||
if ln.endswith('.'):
|
||||
nested_tests.append(ln)
|
||||
elif any([name.startswith('DISABLED_')
|
||||
for name in nested_tests + [ln]]):
|
||||
# Gtest will internally skip these tests. No need to launch a
|
||||
# child process for it.
|
||||
continue
|
||||
else:
|
||||
yield ''.join(nested_tests) + ln
|
||||
|
||||
def getTestsInDirectory(self, testSuite, path_in_suite,
|
||||
litConfig, localConfig):
|
||||
source_path = testSuite.getSourcePath(path_in_suite)
|
||||
for subdir in self.test_sub_dirs:
|
||||
dir_path = os.path.join(source_path, subdir)
|
||||
if not os.path.isdir(dir_path):
|
||||
continue
|
||||
for fn in lit.util.listdir_files(dir_path,
|
||||
suffixes=self.test_suffixes):
|
||||
# Discover the tests in this executable.
|
||||
execpath = os.path.join(source_path, subdir, fn)
|
||||
testnames = self.getBenchmarkTests(execpath, litConfig, localConfig)
|
||||
for testname in testnames:
|
||||
testPath = path_in_suite + (subdir, fn, testname)
|
||||
yield lit.Test.Test(testSuite, testPath, localConfig,
|
||||
file_path=execpath)
|
||||
|
||||
def execute(self, test, litConfig):
|
||||
testPath,testName = os.path.split(test.getSourcePath())
|
||||
while not os.path.exists(testPath):
|
||||
# Handle GTest parametrized and typed tests, whose name includes
|
||||
# some '/'s.
|
||||
testPath, namePrefix = os.path.split(testPath)
|
||||
testName = namePrefix + '/' + testName
|
||||
|
||||
cmd = [testPath, '--benchmark_filter=%s$' % testName ] + self.benchmark_args
|
||||
|
||||
if litConfig.noExecute:
|
||||
return lit.Test.PASS, ''
|
||||
|
||||
try:
|
||||
out, err, exitCode = lit.util.executeCommand(
|
||||
cmd, env=test.config.environment,
|
||||
timeout=litConfig.maxIndividualTestTime)
|
||||
except lit.util.ExecuteCommandTimeoutException:
|
||||
return (lit.Test.TIMEOUT,
|
||||
'Reached timeout of {} seconds'.format(
|
||||
litConfig.maxIndividualTestTime)
|
||||
)
|
||||
|
||||
if exitCode:
|
||||
return lit.Test.FAIL, out + err
|
||||
|
||||
passing_test_line = testName
|
||||
if passing_test_line not in out:
|
||||
msg = ('Unable to find %r in google benchmark output:\n\n%s%s' %
|
||||
(passing_test_line, out, err))
|
||||
return lit.Test.UNRESOLVED, msg
|
||||
|
||||
return lit.Test.PASS, err + out
|
||||
|
||||
@@ -15,6 +15,8 @@ import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from libcxx.util import executeCommand
|
||||
|
||||
class DefaultTargetInfo(object):
|
||||
def __init__(self, full_config):
|
||||
self.full_config = full_config
|
||||
@@ -127,14 +129,13 @@ class DarwinLocalTI(DefaultTargetInfo):
|
||||
cmd = ['xcrun', '--sdk', name, '--show-sdk-path']
|
||||
else:
|
||||
cmd = ['xcrun', '--show-sdk-path']
|
||||
try:
|
||||
out = subprocess.check_output(cmd).strip()
|
||||
res = 0
|
||||
except OSError:
|
||||
res = -1
|
||||
if res == 0 and out:
|
||||
sdk_path = out
|
||||
out, err, exit_code = executeCommand(cmd)
|
||||
if exit_code != 0:
|
||||
self.full_config.lit_config.warning("Could not determine macOS SDK path! stderr was " + err)
|
||||
if exit_code == 0 and out:
|
||||
sdk_path = out.strip()
|
||||
self.full_config.lit_config.note('using SDKROOT: %r' % sdk_path)
|
||||
assert isinstance(sdk_path, str)
|
||||
flags += ["-isysroot", sdk_path]
|
||||
|
||||
def add_cxx_link_flags(self, flags):
|
||||
@@ -222,12 +223,17 @@ class LinuxLocalTI(DefaultTargetInfo):
|
||||
self.full_config.config.available_features)
|
||||
llvm_unwinder = self.full_config.get_lit_bool('llvm_unwinder', False)
|
||||
shared_libcxx = self.full_config.get_lit_bool('enable_shared', True)
|
||||
# FIXME: Remove the need to link -lrt in all the tests, and instead
|
||||
# limit it only to the filesystem tests. This ensures we don't cause an
|
||||
# implicit dependency on librt except when filesystem is needed.
|
||||
enable_fs = self.full_config.get_lit_bool('enable_filesystem',
|
||||
default=False)
|
||||
flags += ['-lm']
|
||||
if not llvm_unwinder:
|
||||
flags += ['-lgcc_s', '-lgcc']
|
||||
if enable_threads:
|
||||
flags += ['-lpthread']
|
||||
if not shared_libcxx:
|
||||
if not shared_libcxx or enable_fs:
|
||||
flags += ['-lrt']
|
||||
flags += ['-lc']
|
||||
if llvm_unwinder:
|
||||
|
||||
Reference in New Issue
Block a user