| Index: src/trusted/validator_mips/build.scons | 
| diff --git a/src/trusted/validator_mips/build.scons b/src/trusted/validator_mips/build.scons | 
| new file mode 100755 | 
| index 0000000000000000000000000000000000000000..b6fdcbe5dd58687695e5e69f52558d612b450c33 | 
| --- /dev/null | 
| +++ b/src/trusted/validator_mips/build.scons | 
| @@ -0,0 +1,118 @@ | 
| +# -*- python -*- | 
| +# Copyright (c) 2012 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('env') | 
| + | 
| +if env.Bit('linux'): | 
| + | 
| +  # Defines common arch-independent validator directory. | 
| +  COMMON_VAL_DIR = '${MAIN_DIR}/src/trusted/validator' | 
| + | 
| +  # Defines this source directory. | 
| +  GEN_SRC_DIR = '${MAIN_DIR}/src/trusted/validator_mips/gen' | 
| + | 
| +  # Defines the full file name for a generated file. | 
| +  def _gen_file(filename): | 
| +    return '%s/%s' % (GEN_SRC_DIR, filename) | 
| + | 
| +  # Defines the full file name for a file inside common validator directory. | 
| +  def _val_dir(filename): | 
| +    return '%s/%s' % (COMMON_VAL_DIR, filename) | 
| + | 
| +  env.Append( | 
| +    CXXFLAGS='-Weffc++ -Woverloaded-virtual -fno-rtti -fomit-frame-pointer', | 
| +  ) | 
| + | 
| +  GEN_LIST = [_gen_file('decode.cc')] | 
| + | 
| +  generate = False | 
| +  gen_env = env.Clone(); | 
| +  if 'mipsvalgen' in COMMAND_LINE_TARGETS: generate = True | 
| +  if 'mipsvalclean' in COMMAND_LINE_TARGETS: generate = True | 
| + | 
| +  if generate: | 
| +    gen_env.AlwaysBuild(gen_env.Alias('mipsvalgen', GEN_LIST)) | 
| +    gen_env.AlwaysBuild( | 
| +      gen_env.Alias('mipsvalclean', action=[Delete(x) for x in GEN_LIST])) | 
| + | 
| +  def _generate_source(filename): | 
| +    env.Command(target=filename, | 
| +                source=['mips-opt.table', | 
| +                        'dgen/generate_decoder.py', | 
| +                        'dgen/dgen_core.py', | 
| +                        'dgen/dgen_input.py', | 
| +                        'dgen/dgen_opt.py', | 
| +                        'dgen/dgen_output.py'], | 
| +               action=['${SOURCES[1].abspath} ${SOURCES[0].abspath} ' | 
| +                           '${TARGET.abspath}']) | 
| + | 
| +  for f in GEN_LIST: | 
| +    _generate_source(f) | 
| + | 
| +  env.ComponentLibrary('mips_validator_core', | 
| +                       ['address_set.cc', | 
| +                        'validator.cc', | 
| +                        'gen/decode.cc']) | 
| + | 
| +  ncval = env.ComponentProgram( | 
| +      'mips-ncval-core', | 
| +      ['ncval.cc'], | 
| +      LIBS=['mips_validator_core', | 
| +            env.NaClTargetArchSuffix('ncfileutils'), | 
| +            '${OPTIONAL_COVERAGE_LIBS}']) | 
| + | 
| +  env.SDKInstallBin('ncval', ncval, target='mips32') | 
| + | 
| +  gtest_env = env.MakeGTestEnv() | 
| + | 
| +  address_exe = gtest_env.ComponentProgram('mips_address_set_test_binary', | 
| +                       ['address_set_test.cc'], | 
| +                       LIBS=['mips_validator_core', 'gtest', 'pthread', | 
| +                             '${OPTIONAL_COVERAGE_LIBS}']) | 
| + | 
| +  address_set_test = gtest_env.CommandTest('mips_address_set_test.out', | 
| +                                           command=[address_exe]) | 
| + | 
| +  gtest_env.AddNodeToTestSuite(address_set_test, | 
| +                               ['small_tests'], | 
| +                               'mips_address_set_test') | 
| + | 
| +  validator_tests = { | 
| +    'test_forbidden_instructions': 1, | 
| +    'test_sp_updates': 1, | 
| +    'test_stores': 1, | 
| +    'test_loads': 1, | 
| +    'test_jmp_reg': 1, | 
| +    'test_jmp_imm': 1, | 
| +    'test_read_only_regs': 1, | 
| +    'test_invalid_dest': 1, | 
| +  } | 
| + | 
| +  for test, exit_status in validator_tests.iteritems(): | 
| +    node = env.CommandTest( | 
| +        test + '_actual_mips.out', | 
| +        [ncval, env.File('testdata/' + test + '.nexe')], | 
| +        exit_status = str(exit_status), | 
| +        filter_regex = "'^ncval'", | 
| +        stderr_golden = env.File('testdata/' + test + '.err')) | 
| + | 
| +    # TODO(petarj): validator_tests need to be disabled until tools for MIPS | 
| +    # architecture are available in the repository. | 
| +    # env.AddNodeToTestSuite(node, ['small_tests', 'validator_tests'], | 
| +    #                       "run_mips_" + test) | 
| + | 
| +  # Do NOT name this program 'validator_tests' because this is the same name as | 
| +  # a test suite, and scons will run that test suite if it ever builds | 
| +  # a program of the same name. | 
| +  validator_tests_exe = gtest_env.ComponentProgram('mips_validator_tests', | 
| +                                 ['validator_tests.cc'], | 
| +                                 EXTRA_LIBS=['mips_validator_core']) | 
| + | 
| +  test_node = gtest_env.CommandTest( | 
| +      'mips_validator_tests.out', | 
| +      command=[validator_tests_exe]) | 
| +  gtest_env.AddNodeToTestSuite(test_node, ['small_tests'], | 
| +      'run_mips_validator_tests') | 
|  |