From 8e6d03d08321b17824fadd1b1ffeea9238cd0b2c Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Thu, 21 Sep 2017 21:27:31 +0000 Subject: [PATCH] [lit] Refactor out some more common lit configuration code. debuginfo-tests has need to reuse a lot of common configuration from clang and lld, and in general it seems like all of the projects which are tightly coupled (e.g. lld, clang, llvm, lldb, etc) can benefit from knowing about one other. For example, lldb needs to know various things about how to run clang in its test suite. Since there's a lot of common substitutions and operations that need to be shared among projects, sinking this up into LLVM makes sense. In addition, this patch introduces a function add_tool_substitution which handles all the dirty intricacies of matching tool names which was previously copied around the various config files. This is now a simple straightforward interface which is hard to mess up. Differential Revision: https://reviews.llvm.org/D37944 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313919 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/lit.cfg.py | 121 ++++++++++++------------------------------------ 1 file changed, 30 insertions(+), 91 deletions(-) diff --git a/test/lit.cfg.py b/test/lit.cfg.py index f1bb4578dc..0f1733c73b 100644 --- a/test/lit.cfg.py +++ b/test/lit.cfg.py @@ -10,6 +10,7 @@ import lit.formats import lit.util from lit.llvm import llvm_config +from lit.llvm import ToolFilter # Configuration file for the 'lit' test runner. @@ -112,55 +113,12 @@ config.substitutions.append( ('%PATH%', config.environment['PATH']) ) if config.clang_examples: config.available_features.add('examples') -# Note that when substituting %clang_cc1 also fill in the include directory of -# the builtin headers. Those are part of even a freestanding environment, but -# Clang relies on the driver to locate them. -def getClangBuiltinIncludeDir(clang): - # FIXME: Rather than just getting the version, we should have clang print - # out its resource dir here in an easy to scrape form. - cmd = subprocess.Popen([clang, '-print-file-name=include'], - stdout=subprocess.PIPE, - env=config.environment) - if not cmd.stdout: - lit_config.fatal("Couldn't find the include dir for Clang ('%s')" % clang) - dir = cmd.stdout.read().strip() - if sys.platform in ['win32'] and not llvm_config.use_lit_shell: - # Don't pass dosish path separator to msys bash.exe. - dir = dir.replace('\\', '/') - # Ensure the result is an ascii string, across Python2.5+ - Python3. - return str(dir.decode('ascii')) - -def makeItaniumABITriple(triple): - m = re.match(r'(\w+)-(\w+)-(\w+)', triple) - if not m: - lit_config.fatal("Could not turn '%s' into Itanium ABI triple" % triple) - if m.group(3).lower() != 'win32': - # All non-win32 triples use the Itanium ABI. - return triple - return m.group(1) + '-' + m.group(2) + '-mingw32' - -def makeMSABITriple(triple): - m = re.match(r'(\w+)-(\w+)-(\w+)', triple) - if not m: - lit_config.fatal("Could not turn '%s' into MS ABI triple" % triple) - isa = m.group(1).lower() - vendor = m.group(2).lower() - os = m.group(3).lower() - if os == 'win32': - # If the OS is win32, we're done. - return triple - if isa.startswith('x86') or isa == 'amd64' or re.match(r'i\d86', isa): - # For x86 ISAs, adjust the OS. - return isa + '-' + vendor + '-win32' - # -win32 is not supported for non-x86 targets; use a default. - return 'i686-pc-win32' - +builtin_include_dir = llvm_config.get_clang_builtin_include_dir(config.clang) config.substitutions.append( ('%clang_analyze_cc1', '%clang_cc1 -analyze %analyze') ) config.substitutions.append( ('%clang_cc1', '%s -cc1 -internal-isystem %s -nostdsysteminc' - % (config.clang, - getClangBuiltinIncludeDir(config.clang))) ) + % (config.clang, builtin_include_dir)) ) config.substitutions.append( ('%clang_cpp', ' ' + config.clang + ' --driver-mode=cpp ')) config.substitutions.append( ('%clang_cl', ' ' + config.clang + @@ -168,16 +126,20 @@ config.substitutions.append( ('%clang_cl', ' ' + config.clang + config.substitutions.append( ('%clangxx', ' ' + config.clang + ' --driver-mode=g++ ')) config.substitutions.append( ('%clang', ' ' + config.clang + ' ') ) -config.substitutions.append( ('%test_debuginfo', ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') ) -config.substitutions.append( ('%itanium_abi_triple', makeItaniumABITriple(config.target_triple)) ) -config.substitutions.append( ('%ms_abi_triple', makeMSABITriple(config.target_triple)) ) -config.substitutions.append( ('%resource_dir', getClangBuiltinIncludeDir(config.clang)) ) +config.substitutions.append( ('%test_debuginfo', + ' ' + config.llvm_src_root + '/utils/test_debuginfo.pl ') ) +config.substitutions.append( ('%itanium_abi_triple', + llvm_config.make_itanium_abi_triple(config.target_triple)) ) +config.substitutions.append( ('%ms_abi_triple', + llvm_config.make_msabi_triple(config.target_triple)) ) +config.substitutions.append( ('%resource_dir', builtin_include_dir) ) config.substitutions.append( ('%python', config.python_executable) ) # The host triple might not be set, at least if we're compiling clang from # an already installed llvm. if config.host_triple and config.host_triple != '@LLVM_HOST_TRIPLE@': - config.substitutions.append( ('%target_itanium_abi_host_triple', '--target=%s' % makeItaniumABITriple(config.host_triple)) ) + config.substitutions.append( ('%target_itanium_abi_host_triple', + '--target=%s' % llvm_config.make_itanium_abi_triple(config.host_triple)) ) else: config.substitutions.append( ('%target_itanium_abi_host_triple', '') ) @@ -207,50 +169,27 @@ config.substitutions.append( (' %clang-cl ', """*** invalid substitution, use '%clang_cl'. ***""") ) -# For each occurrence of a clang tool name as its own word, replace it -# with the full path to the build directory holding that tool. This -# ensures that we are testing the tools just built and not some random +# For each occurrence of a clang tool name, replace it with the full path to +# the build directory holding that tool. We explicitly specify the directories +# to search to ensure that we get the tools just built and not some random # tools that might happen to be in the user's PATH. -tool_dirs = os.path.pathsep.join((config.clang_tools_dir, config.llvm_tools_dir)) - -# Regex assertions to reject neighbor hyphens/dots (seen in some tests). -# For example, don't match 'clang-check-' or '.clang-format'. -NoPreHyphenDot = r"(?