| OLD | NEW |
| (Empty) |
| 1 # -*- python -*- | |
| 2 # Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 | |
| 7 import os | |
| 8 import sys | |
| 9 Import('env') | |
| 10 | |
| 11 # | |
| 12 # | |
| 13 # Build x86 only pieces | |
| 14 # | |
| 15 # | |
| 16 if not env.Bit('target_x86'): Return() | |
| 17 | |
| 18 # TODO(bradchen): eliminate need for the following line | |
| 19 env.FilterOut(CCFLAGS=['-Wextra', '-Wswitch-enum', '-Wsign-compare']) | |
| 20 | |
| 21 #----------- FILE GENERATION -------------------------- | |
| 22 # | |
| 23 # Generates source files needed by the decoder. | |
| 24 | |
| 25 generate = False | |
| 26 if 'valgen' in COMMAND_LINE_TARGETS: generate = True | |
| 27 if 'valclean' in COMMAND_LINE_TARGETS: generate = True | |
| 28 | |
| 29 # | |
| 30 # Only generate/clean these files if the alias is specified on the | |
| 31 # command line. We conditionally add these pieces to scons to prevent | |
| 32 # a normal invocation from accidentally regenerating the files. | |
| 33 # | |
| 34 if generate: | |
| 35 # | |
| 36 # valgen - Table Generator | |
| 37 # | |
| 38 # We create an alias 'valgen' which we use to generate the various | |
| 39 # headers used by the x86 validator. This target will generate | |
| 40 # *.h, *_impl.h from the *.enum files. | |
| 41 # | |
| 42 | |
| 43 # Define environment for generating files. | |
| 44 gen_env = env.Clone() | |
| 45 gen_env.Append(CCFLAGS=['-DNACL_TRUSTED_BUT_NOT_TCB']) | |
| 46 | |
| 47 # Get the directory in which we will generate checking in files. | |
| 48 header_prefix = env.subst('${MAIN_DIR}') | |
| 49 if header_prefix.endswith('/native_client'): | |
| 50 header_prefix = header_prefix[0:header_prefix.rfind('native_client')] | |
| 51 elif header_prefix.endswith('/native_client/'): | |
| 52 header_prefix = header_prefix[0:header_prefix.rfind('native_client/')] | |
| 53 decoder_src_dir = '$MAIN_DIR/src/trusted/validator/x86/decoder' | |
| 54 | |
| 55 #------------------------------------------------------ | |
| 56 # Generate the needed header files for enumerated types. | |
| 57 # Note that we use the same directory for all platforms. | |
| 58 | |
| 59 # Define enumerate type files, and the options to process. | |
| 60 enum_headers = [] | |
| 61 ncv_enum_pairs = { | |
| 62 'ncopcode_prefix': '--name=NaClInstPrefix --add_size=1', | |
| 63 'ncopcode_insts': | |
| 64 '--name=NaClMnemonic --add_size=1 --sort=1 --name_prefix=Inst', | |
| 65 'ncopcode_opcode_flags': '--name=NaClIFlag --add_size=1', | |
| 66 'ncopcode_operand_kind': '--name=NaClOpKind --add_size=1', | |
| 67 'ncopcode_operand_flag': '--name=NaClOpFlag --add_size=1', | |
| 68 'ncop_expr_node_flag': '--name=NaClExpFlag --add_size=1', | |
| 69 'ncop_expr_node_kind': '--name=NaClExpKind --add_size=1', | |
| 70 } | |
| 71 | |
| 72 # Now code generate the enumerated types. | |
| 73 for ncv_enum in ncv_enum_pairs: | |
| 74 ncv_options = ncv_enum_pairs[ncv_enum] | |
| 75 ncv_enum_file = gen_env.File(ncv_enum + '.enum') | |
| 76 ncv_header_1 = gen_env.File('%s/gen/%s.h' % (decoder_src_dir, ncv_enum)) | |
| 77 ncv_header_2 = gen_env.File('%s/gen/%s_impl.h' % (decoder_src_dir, ncv_enum)
) | |
| 78 | |
| 79 cmd_line = ( | |
| 80 '${PYTHON} %s --header="%s" --source="%s" --path_prefix="%s" %s %s' % | |
| 81 (gen_env.File('%s/../../../validator_x86/enum_gen.py' % decoder_src_dir)
, | |
| 82 ncv_header_1, ncv_header_2, header_prefix, | |
| 83 ncv_options, ncv_enum_file)) | |
| 84 gen_env.Command([ncv_header_1, ncv_header_2], ncv_enum_file, cmd_line) | |
| 85 enum_headers.append(ncv_header_1) | |
| 86 enum_headers.append(ncv_header_2) | |
| 87 | |
| 88 gen_list = enum_headers | |
| 89 gen_env.AlwaysBuild( | |
| 90 gen_env.Alias('valgen', gen_list)) | |
| 91 gen_env.AlwaysBuild( | |
| 92 gen_env.Alias('valclean', action=[Delete(x) for x in gen_list])) | |
| 93 | |
| 94 #---------- TESTS -------------------------------------- | |
| 95 # | |
| 96 # Create environment for command-line tools and testing, rather than | |
| 97 # part of the TCB. Then define compile-time flag that communicates | |
| 98 # that we are compiling in the test environment (rather than for the TCB). | |
| 99 test_env = env.Clone() | |
| 100 test_env.Append(CCFLAGS=['-DNACL_TRUSTED_BUT_NOT_TCB']) | |
| 101 | |
| 102 #---------- COMPONENTS BUILT --------------------------- | |
| 103 | |
| 104 # TODO(karl): merge nc_opcode_modeling and nc_decoder libraries. | |
| 105 # Instruction modeling for the decoder. | |
| 106 env.ComponentLibrary(env.NaClTargetArchSuffix('nc_opcode_modeling'), | |
| 107 ['ncopcode_desc.c', | |
| 108 ]) | |
| 109 | |
| 110 # Verbose routines for instruction modeling for the decoder. | |
| 111 env.ComponentLibrary(env.NaClTargetArchSuffix('nc_opcode_modeling_verbose'), | |
| 112 ['ncopcode_desc_verbose.c', | |
| 113 ]) | |
| 114 | |
| 115 # Decoder library. | |
| 116 env.ComponentLibrary(env.NaClTargetArchSuffix('nc_decoder'), | |
| 117 ['nc_inst_iter.c', | |
| 118 'nc_inst_state.c', | |
| 119 'nc_inst_trans.c', | |
| 120 'ncop_exps.c', | |
| 121 ]) | |
| 122 | |
| 123 # Full decoder tables. | |
| 124 env.ComponentLibrary(env.NaClTargetArchSuffix('ncdis_decode_tables'), | |
| 125 ['ncdis_decode_tables.c']) | |
| 126 | |
| 127 #---------- UNIT TESTS --------------------------------- | |
| 128 | |
| 129 # Create an environment to run unit tests using Gtest. | |
| 130 gtest_env = env.MakeGTestEnv() | |
| 131 | |
| 132 # List of (unit) test file prefixes to run unit tests on. | |
| 133 gtest_sources = ['nc_inst_state'] | |
| 134 | |
| 135 for source in gtest_sources: | |
| 136 test_exe = gtest_env.ComponentProgram( | |
| 137 'x86_decoder_tests_' + source, | |
| 138 [source+'_tests.cc'], | |
| 139 EXTRA_LIBS=[# Note: The following forces the inclusion | |
| 140 # of kNaClDecoderTables | |
| 141 gtest_env.NaClTargetArchSuffix('ncval_seg_sfi'), | |
| 142 gtest_env.NaClTargetArchSuffix('nc_decoder'), | |
| 143 gtest_env.NaClTargetArchSuffix('ncdis_decode_tables'), | |
| 144 gtest_env.NaClTargetArchSuffix('nc_opcode_modeling_verbose'), | |
| 145 ]) | |
| 146 test_node = gtest_env.CommandTest( | |
| 147 source+'Tests.out', | |
| 148 command=[test_exe]) | |
| 149 gtest_env.AddNodeToTestSuite(test_node, ['small_tests'], | |
| 150 'run_x86_validator_tests') | |
| OLD | NEW |