| # -*- Python -*- | 
 | # Taken from utils/lit/tests in the LLVM tree and hacked together to support | 
 | # our tests. | 
 | # | 
 | # Note: This configuration has simple commands to run Subzero's translator. | 
 | # They have the form %X2i (i.e. %p2i, %l2i, and %lc2i) where X is defined | 
 | # as follows: | 
 | # | 
 | #   p : Run Subzero's translator, building ICE from PNaCl bitcode directly. | 
 | #   l : Run Subzero's translator, converting the .ll file to a PNaCl bitcode | 
 | #       file, reading in the bitcode file and generating LLVM IR, and | 
 | #       then convert LLVM IR to ICE IR. | 
 | #   lc : Run Subzero's translator, directly parsing the .ll file into LLVM IR, | 
 | #        and then convert it to ICE IR. | 
 | # | 
 | # These commands can be used in RUN lines by FileCheck. If the Subzero | 
 | # build being tested lacks any required attributes (e.g., the ability | 
 | # to parse .ll files), the command will simply return successfully, | 
 | # generating no output. This allows translation tests to be able to | 
 | # conditionally test the translator, based on the translator built. | 
 | # | 
 | # This conditional handling of translation introduces potential problems | 
 | # when the output is piped to another command on a RUN line. Executables | 
 | # like FileCheck expect non-empty input. | 
 | # | 
 | # To handle the problem that the pipe is conditional, any command that | 
 | # doesn't accept empty input should be prefixed by a corresponding | 
 | # %ifX (i.e. %p2i, %ifl, or %ifpc). Note: %p2i should always work, and | 
 | # hence %ifp is not necessary (i.e. it is a nop). | 
 | # | 
 | # If you need to check other build attributes (other than the | 
 | # existence of %l2i and %lc2i), you can use the %if command (which is | 
 | # a short hand for using pydir/ifatts.py). | 
 |  | 
 | import os | 
 | import re | 
 | import sys | 
 |  | 
 | import lit.formats | 
 |  | 
 | sys.path.insert(0, 'pydir') | 
 | from utils import FindBaseNaCl, shellcmd | 
 |  | 
 | # name: The name of this test suite. | 
 | config.name = 'subzero' | 
 |  | 
 | # testFormat: The test format to use to interpret tests. | 
 | config.test_format = lit.formats.ShTest() | 
 |  | 
 | # suffixes: A list of file extensions to treat as test files. | 
 | config.suffixes = ['.ll', '.test'] | 
 |  | 
 | # test_source_root: The root path where tests are located. | 
 | config.test_source_root = os.path.dirname(__file__) | 
 | config.test_exec_root = config.test_source_root | 
 | config.target_triple = '(unused)' | 
 |  | 
 | src_root = os.path.join(FindBaseNaCl(), 'toolchain_build/src/subzero') | 
 | bin_root = src_root | 
 | config.substitutions.append(('%{src_root}', src_root)) | 
 | config.substitutions.append(('%{python}', sys.executable)) | 
 |  | 
 | pydir = os.path.join(bin_root, 'pydir') | 
 |  | 
 | # Finding PNaCl binary tools. Tools used in the tests must be listed in the | 
 | # pnaclbintools list. | 
 | pnaclbinpath = os.path.abspath(os.environ.get('PNACL_BIN_PATH')) | 
 |  | 
 | # Define the location of the pnacl-sz tool. | 
 | pnacl_sz_tool = os.path.join(bin_root, 'pnacl-sz') | 
 | pnacl_sz_atts = shellcmd(' '.join([pnacl_sz_tool, '--build-atts']), | 
 |                         echo=False).split() | 
 |  | 
 | # Add build attributes of pnacl-sz tool to the set of available features. | 
 | config.available_features.update(pnacl_sz_atts) | 
 |  | 
 | def if_cond_flag(Value): | 
 |   return '--cond=true' if Value else '--cond=false' | 
 |  | 
 | # shell conditional commands. | 
 | if_atts = [os.path.join(pydir, 'if.py')] | 
 | if_atts_cmd = if_atts + ['--have=' + att for att in pnacl_sz_atts] | 
 | ifl2i_atts_cmd = if_atts + [if_cond_flag('allow_llvm_ir' in pnacl_sz_atts), | 
 |                             '--command'] | 
 | iflc2i_atts_cmd = if_atts + [if_cond_flag('allow_llvm_ir_as_input' | 
 |                                           in pnacl_sz_atts), '--command'] | 
 |  | 
 | # Base command for running pnacl-sz | 
 | pnacl_sz_cmd = [os.path.join(pydir, 'run-pnacl-sz.py'), | 
 |                 '--echo-cmd', | 
 |                 '--pnacl-sz', pnacl_sz_tool, | 
 |                 '--pnacl-bin-path', pnaclbinpath] | 
 | if 'FORCEASM' in lit_config.params: | 
 |   pnacl_sz_cmd += ['--forceasm'] | 
 |  | 
 | # Run commands only if corresponding build attributes apply, including | 
 | # for each compiler setup. | 
 | config.substitutions.append(('%ifp', ' ')) | 
 | config.substitutions.append(('%iflc', ' '.join(iflc2i_atts_cmd))) | 
 | config.substitutions.append(('%ifl', ' '.join(ifl2i_atts_cmd))) | 
 | config.substitutions.append(('%if', ' '.join(if_atts_cmd))) | 
 |  | 
 | # Translate LLVM source for each compiler setup. | 
 | config.substitutions.append(('%p2i', ' '.join(pnacl_sz_cmd))) | 
 | config.substitutions.append(('%l2i', ' '.join(ifl2i_atts_cmd + pnacl_sz_cmd | 
 |                                               + ['--llvm']))) | 
 | config.substitutions.append(('%lc2i', ' '.join(iflc2i_atts_cmd + pnacl_sz_cmd | 
 |                                                + ['--llvm-source']))) | 
 |  | 
 | config.substitutions.append(('%pnacl_sz', pnacl_sz_tool)) | 
 |  | 
 | pnaclbintools = [r'\b' + x + r'\b' for x in | 
 |                  ['FileCheck', | 
 |                   'llvm-as', | 
 |                   'llvm-mc', | 
 |                   'llvm-readobj', | 
 |                   'not', | 
 |                   'pnacl-bcdis', | 
 |                   'pnacl-bcfuzz', | 
 |                   'pnacl-freeze']] | 
 |  | 
 | for tool in pnaclbintools: | 
 |   # The re.sub() line is adapted from one of LLVM's lit.cfg files. | 
 |   # Extract the tool name from the pattern.  This relies on the tool | 
 |   # name being surrounded by \b word match operators.  If the | 
 |   # pattern starts with "| ", include it in the string to be | 
 |   # substituted. | 
 |   substitution = re.sub(r"^(\\)?((\| )?)\W+b([0-9A-Za-z-_]+)\\b\W*$", | 
 |                         r"\2" + pnaclbinpath + "/" + r"\4", | 
 |                         tool) | 
 |   config.substitutions.append((tool, substitution)) | 
 |  | 
 | # Add a feature to detect the Python version. | 
 | config.available_features.add("python%d.%d" % (sys.version_info[0], | 
 |                                                sys.version_info[1])) | 
 |  | 
 | # Debugging output | 
 | def dbg(s): | 
 |   print '[DBG] %s' % s | 
 |  | 
 | dbg('bin_root = %s' % bin_root) | 
 | dbg('pnaclbinpath = %s' % pnaclbinpath) | 
 | dbg("Build attributes = %s" % pnacl_sz_atts) |