| Index: src/trusted/validator/x86/decoder/generator/build.scons
|
| diff --git a/src/trusted/validator/x86/decoder/generator/build.scons b/src/trusted/validator/x86/decoder/generator/build.scons
|
| deleted file mode 100644
|
| index bacd774dfe1ac56a5da67992fe8d1eb78dad3fee..0000000000000000000000000000000000000000
|
| --- a/src/trusted/validator/x86/decoder/generator/build.scons
|
| +++ /dev/null
|
| @@ -1,295 +0,0 @@
|
| -# -*- python -*-
|
| -# Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -
|
| -import os
|
| -import sys
|
| -Import('env')
|
| -
|
| -#
|
| -#
|
| -# Build x86 only pieces
|
| -#
|
| -#
|
| -if not env.Bit('target_x86'): Return()
|
| -
|
| -# ------------------------------------------------------
|
| -# General adjustments to the environment for builds.
|
| -
|
| -# Defines which test sets tests should be added to.
|
| -STANDARD_TESTS = ['small_tests', 'validator_tests']
|
| -
|
| -# Define which test sets modeling test should be added to
|
| -MODELING_TESTS = STANDARD_TESTS + ['validator_modeling']
|
| -
|
| -# TODO(bradchen): eliminate need for the following line
|
| -env.FilterOut(CCFLAGS=['-Wextra', '-Wswitch-enum', '-Wsign-compare'])
|
| -
|
| -# Defines this source directory.
|
| -src_dir = '$MAIN_DIR/src/trusted/validator/x86/decoder/generator'
|
| -
|
| -# Defines the source directory for locally generated files.
|
| -local_src_dir = '$MAIN_DIR/src/trusted/validator/x86/decoder/generator/gen'
|
| -
|
| -# Defines the source directory where validator generated files should be added.
|
| -tables_src_dir = '$MAIN_DIR/src/trusted/validator/x86/decoder/gen'
|
| -
|
| -# Create environment for command-line tools and testing, rather than
|
| -# part of the TCB. Then define compile-time flag that communicates
|
| -# that we are compiling in the test environment (rather than for the TCB).
|
| -test_env = env.Clone()
|
| -test_env.Append(CCFLAGS=['-DNACL_TRUSTED_BUT_NOT_TCB'])
|
| -
|
| -# ------------------------------------------------------
|
| -# Source generation:
|
| -#
|
| -# Source generation is done in three steps. The first generates
|
| -# enumerated types. The second generates decoder tables needed by
|
| -# the decoders. In between these two steps we generate the executables
|
| -# that build the decoder tables.
|
| -#
|
| -# Source generation is controlled by to command line directives, and can be
|
| -# built in either the x86-32 or the x86-64 platform. The two directives are:
|
| -#
|
| -# valclean : Delete the existing versions of the generated files.
|
| -# This step should be done whenever ANY change may effect
|
| -# the generated sources.
|
| -#
|
| -# valgen : Regenerate any deleted source files. Note: some generated
|
| -# source files do understand dependencies and do not need to be
|
| -# deleted before calling valgen. However, do not count on this,
|
| -# as some dependencies are not caught. To be safe, if you have
|
| -# modified a file that effects source generation, run "valclean"
|
| -# followed by a "valgen" to guarantee that generated sources are
|
| -# up to date.
|
| -
|
| -gen_env = env.Clone()
|
| -gen_env.Append(CCFLAGS=['-DNACL_TRUSTED_BUT_NOT_TCB'])
|
| -
|
| -generate = False
|
| -if 'valgen' in COMMAND_LINE_TARGETS: generate = True
|
| -if 'valclean' in COMMAND_LINE_TARGETS: generate = True
|
| -
|
| -# Set of generated (source) decoder tables.
|
| -tables = []
|
| -
|
| -# Set of generated (source) enumeration files.
|
| -enum_headers = []
|
| -
|
| -# ------------------------------------------------------
|
| -# Source generation step 1: Generate enumerated types.
|
| -#
|
| -# Only generate/clean these files if the alias is specified on the
|
| -# command line. We conditionally add these pieces to scons to prevent
|
| -# a normal invocation from accidentally regenerating the files.
|
| -#
|
| -if generate:
|
| - #
|
| - # valgen - Table Generator
|
| - #
|
| - # We create an alias 'valgen' which we use to generate the various
|
| - # headers used by the x86 validator. This target will generate
|
| - # *.h, *_impl.h from the *.enum files, as well as the executables
|
| - # ncdecode_table and ncdecode_tablegen which are used to generate
|
| - # the large opcode tables.
|
| - #
|
| - # Get the directory in which we will generate checking in files.
|
| - header_prefix = gen_env.subst('${MAIN_DIR}')
|
| - if header_prefix.endswith('/native_client'):
|
| - header_prefix = header_prefix[0:header_prefix.rfind('native_client')]
|
| - elif header_prefix.endswith('/native_client/'):
|
| - header_prefix = header_prefix[0:header_prefix.rfind('native_client/')]
|
| -
|
| - #------------------------------------------------------
|
| - # Generate the needed header files for enumerated types.
|
| - # Note that we use the same directory for all platforms.
|
| -
|
| - # Define enumerate type files, and the options to process.
|
| - ncv_enum_pairs = {
|
| - 'nacl_disallows': '--name=NaClDisallowsFlag --add_size=1',
|
| - }
|
| -
|
| - # Now code generate the enumerated types.
|
| - for ncv_enum in ncv_enum_pairs:
|
| - ncv_options = ncv_enum_pairs[ncv_enum]
|
| - ncv_enum_file = gen_env.File(ncv_enum + '.enum')
|
| - ncv_header_1 = gen_env.File('%s/%s.h' % (local_src_dir, ncv_enum))
|
| - ncv_header_2 = gen_env.File('%s/%s_impl.h' % (local_src_dir, ncv_enum))
|
| -
|
| - cmd_line = (
|
| - '${PYTHON} %s --header="%s" --source="%s" --path_prefix="%s" %s %s' %
|
| - (gen_env.File('%s/../../../../validator_x86/enum_gen.py' % src_dir),
|
| - ncv_header_1, ncv_header_2, header_prefix,
|
| - ncv_options, ncv_enum_file))
|
| -
|
| - gen_env.Command([ncv_header_1, ncv_header_2], ncv_enum_file, cmd_line)
|
| - enum_headers.append(ncv_header_1)
|
| - enum_headers.append(ncv_header_2)
|
| -
|
| -# ------------------------------------------------------
|
| -# Table generators:
|
| -#
|
| -# In the middle of generating, we unconditionally add ncdecode_table and
|
| -# ncdecode_tablegen so that the tests which depend on it, can run correctly.
|
| -# This step sits in the middle because of dependency order, where the next
|
| -# generation step requires this executable.
|
| -
|
| -# Add new x86 table generator.
|
| -#
|
| -#
|
| -ncdecode_tablegen = gen_env.ComponentProgram(
|
| - 'ncdecode_tablegen',
|
| - ['ncdecode_tablegen.c',
|
| - 'nc_compress.c',
|
| - 'ncval_simplify.c',
|
| - 'ncdecode_forms.c',
|
| - 'zero_extends.c',
|
| - 'nc_def_jumps.c',
|
| - 'long_mode.c',
|
| - 'nc_rep_prefix.c',
|
| - 'defsize64.c',
|
| - 'nacl_illegal.c',
|
| - 'lock_insts.c',
|
| - 'ncdecode_st.c',
|
| - 'ncdecode_onebyte.c',
|
| - 'ncdecode_0F.c',
|
| - 'ncdecode_sse.c',
|
| - 'ncdecodeX87.c',
|
| - 'nacl_regsgen.c',
|
| - 'modeled_nacl_inst.c',
|
| - ],
|
| - EXTRA_LIBS=[gen_env.NaClTargetArchSuffix('nc_opcode_modeling_verbose'),
|
| - 'utils'])
|
| -
|
| -
|
| -# ------------------------------------------------------
|
| -# Source generation step 2: Generate decoder tables.
|
| -#
|
| -# Now we are back to conditionally defining the large tables generated
|
| -# by ncdecode_tablegen.
|
| -#
|
| -if generate:
|
| - #
|
| - # Generate 32 and 64 bit versions of nc_opcode_table and nc_subregs
|
| - #
|
| - for filename in ['nc_opcode_table', 'nc_subregs', 'ncval_reg_sfi_opcode_table']:
|
| - for bits in ['32', '64']:
|
| - fullname = '%s/%s_%s.h' % (tables_src_dir, filename, bits)
|
| - exe_path = '${STAGING_DIR}/${PROGPREFIX}ncdecode_tablegen${PROGSUFFIX}'
|
| - if filename == 'nc_subregs':
|
| - cmd_line = '%s -m%s -nacl_subregs %s'% (exe_path, bits, fullname)
|
| - elif filename == 'ncval_reg_sfi_opcode_table':
|
| - cmd_line = '%s -m%s -validator_decoder %s'% (exe_path, bits, fullname)
|
| - else:
|
| - cmd_line = '%s -m%s %s'% (exe_path, bits, fullname)
|
| - out = gen_env.Command(env.File(fullname), exe_path, cmd_line)
|
| - tables.append(fullname)
|
| -
|
| - # Generate 32 and 64 bit versions of ncval_opcode_table (validator
|
| - # decoder tables)
|
| - gen_list = enum_headers + tables
|
| - gen_env.AlwaysBuild(
|
| - gen_env.Alias('valgen', gen_list))
|
| - gen_env.AlwaysBuild(
|
| - gen_env.Alias('valclean', action=[Delete(x) for x in gen_list]))
|
| -
|
| -# ======================================================================
|
| -# Helper functions for getting automated tests from the corresponding
|
| -# test directory.
|
| -
|
| -TESTDATA_DIR = 'testdata/'
|
| -TESTDATA_SUBARCH_DIR = TESTDATA_DIR + env['TARGET_SUBARCH'] + '/'
|
| -
|
| -# Generates the set of test files with the given extension.
|
| -def __GoldenFiles(ext):
|
| - return Glob(TESTDATA_SUBARCH_DIR + '*.' + ext)
|
| -
|
| -# Generates base names (i.e. minus path and extention (ext) suffix) of
|
| -# all test data input files.
|
| -def __FilterOutTestFileBaseGen(files, ext):
|
| - for f in files:
|
| - yield os.path.basename(f.path).replace('.' + ext, '')
|
| -
|
| -# Generates the set of golden bases for the given extension.
|
| -def __GoldenBases(ext):
|
| - return __FilterOutTestFileBaseGen(__GoldenFiles(ext), ext)
|
| -
|
| -# Generates the corresponding test file from the given base.
|
| -def __BaseTestFile(base, ext):
|
| - return test_env.File(TESTDATA_SUBARCH_DIR + base + '.' + ext)
|
| -
|
| -# Generates the corresponding output file from the given base.
|
| -def __OutTestFile(test, base, ext):
|
| - return test + '_' + base + '.' + ext + '.out'
|
| -
|
| -def __AddTest(test, test_env, base, ext, command, groups):
|
| - test_env.AddNodeToTestSuite(command,
|
| - groups,
|
| - 'run_%s_%s_%s_test' % (test, base, ext))
|
| -
|
| -#------------------------------------------------------------------
|
| -# Generate the header files containing the modeled x86 instructions.
|
| -
|
| -def TestGeneratedInstructionTables(target_subarch, golden_filename,
|
| - validator_decoder, groups):
|
| -
|
| - test_name = 'ncdecode_tablegen_%s_%s' % (golden_filename, target_subarch)
|
| - golden_output = env.File('%s/%s_%s.h'
|
| - % (tables_src_dir, golden_filename, target_subarch))
|
| - cmd_line = [ncdecode_tablegen, '-m%s' % (target_subarch,)]
|
| - if validator_decoder:
|
| - cmd_line += ['-validator_decoder']
|
| - test = test_env.CommandTest(test_name + '.out',
|
| - cmd_line,
|
| - stdout_golden = golden_output)
|
| - test_env.AddNodeToTestSuite(test, groups, 'run_%s_test' % test_name)
|
| -
|
| -
|
| -def TestGeneratedSubregisterTables(target_subarch, golden_filename, groups):
|
| - test_name = 'ncdecode_tablegen_subreg_tables_' + target_subarch
|
| - golden_output = env.File('%s/%s_%s.h'
|
| - % (tables_src_dir, golden_filename, target_subarch))
|
| - test = test_env.CommandTest(
|
| - test_name + '.out',
|
| - [ncdecode_tablegen, '-m%s -nacl_subregs' % (target_subarch,)],
|
| - stdout_golden = golden_output)
|
| - test_env.AddNodeToTestSuite(test, groups, 'run_%s_test' % test_name)
|
| -
|
| -
|
| -# The following verifies that we generate the same source files, independent of
|
| -# whether the 32 bit or 64 bit table generator is used.
|
| -# Note: This is important in the 64-bit case on Windows, in that we want
|
| -# to make sure if the 32-bit generator is used, we still generate the
|
| -# same source files.
|
| -for test_subarch in ['32', '64']:
|
| - TestGeneratedInstructionTables(test_subarch, 'nc_opcode_table',
|
| - False, STANDARD_TESTS)
|
| - TestGeneratedInstructionTables(test_subarch, 'ncval_reg_sfi_opcode_table',
|
| - True, STANDARD_TESTS)
|
| - TestGeneratedSubregisterTables(test_subarch, 'nc_subregs',
|
| - STANDARD_TESTS)
|
| -
|
| -# Run test to see if we have changed the set of modeled instructions.
|
| -def __AddModeledInstsTest():
|
| - prefixes = ['']
|
| - if test_env.Bit('build_x86_64'):
|
| - prefixes.append('ncval_reg_sfi_')
|
| - for prefix in prefixes:
|
| - test = 'test'
|
| - base = prefix + 'modeled_insts'
|
| - ext = 'txt'
|
| - command = [ncdecode_tablegen,
|
| - '-m%s' % (env['TARGET_SUBARCH']),
|
| - '-documentation']
|
| - if prefix == 'ncval_reg_sfi_':
|
| - command.append('-validator_decoder')
|
| - model = test_env.CommandTest(
|
| - __OutTestFile(test, base, ext),
|
| - command,
|
| - stdout_golden = __BaseTestFile(base, ext))
|
| - __AddTest(test, test_env, base, ext, model,
|
| - MODELING_TESTS)
|
| -
|
| -__AddModeledInstsTest()
|
|
|