1*f5c631daSSadaf Ebrahimi#!/usr/bin/env python2.7 2*f5c631daSSadaf Ebrahimi 3*f5c631daSSadaf Ebrahimi# Copyright 2015, VIXL authors 4*f5c631daSSadaf Ebrahimi# All rights reserved. 5*f5c631daSSadaf Ebrahimi# 6*f5c631daSSadaf Ebrahimi# Redistribution and use in source and binary forms, with or without 7*f5c631daSSadaf Ebrahimi# modification, are permitted provided that the following conditions are met: 8*f5c631daSSadaf Ebrahimi# 9*f5c631daSSadaf Ebrahimi# * Redistributions of source code must retain the above copyright notice, 10*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer. 11*f5c631daSSadaf Ebrahimi# * Redistributions in binary form must reproduce the above copyright notice, 12*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer in the documentation 13*f5c631daSSadaf Ebrahimi# and/or other materials provided with the distribution. 14*f5c631daSSadaf Ebrahimi# * Neither the name of ARM Limited nor the names of its contributors may be 15*f5c631daSSadaf Ebrahimi# used to endorse or promote products derived from this software without 16*f5c631daSSadaf Ebrahimi# specific prior written permission. 17*f5c631daSSadaf Ebrahimi# 18*f5c631daSSadaf Ebrahimi# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 19*f5c631daSSadaf Ebrahimi# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20*f5c631daSSadaf Ebrahimi# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21*f5c631daSSadaf Ebrahimi# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 22*f5c631daSSadaf Ebrahimi# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*f5c631daSSadaf Ebrahimi# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24*f5c631daSSadaf Ebrahimi# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25*f5c631daSSadaf Ebrahimi# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26*f5c631daSSadaf Ebrahimi# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*f5c631daSSadaf Ebrahimi# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*f5c631daSSadaf Ebrahimi 29*f5c631daSSadaf Ebrahimiimport os 30*f5c631daSSadaf Ebrahimiimport sys 31*f5c631daSSadaf Ebrahimiimport argparse 32*f5c631daSSadaf Ebrahimiimport re 33*f5c631daSSadaf Ebrahimiimport util 34*f5c631daSSadaf Ebrahimi 35*f5c631daSSadaf Ebrahimicopyright_header = """// Copyright 2015, VIXL authors 36*f5c631daSSadaf Ebrahimi// All rights reserved. 37*f5c631daSSadaf Ebrahimi// 38*f5c631daSSadaf Ebrahimi// Redistribution and use in source and binary forms, with or without 39*f5c631daSSadaf Ebrahimi// modification, are permitted provided that the following conditions are met: 40*f5c631daSSadaf Ebrahimi// 41*f5c631daSSadaf Ebrahimi// * Redistributions of source code must retain the above copyright notice, 42*f5c631daSSadaf Ebrahimi// this list of conditions and the following disclaimer. 43*f5c631daSSadaf Ebrahimi// * Redistributions in binary form must reproduce the above copyright notice, 44*f5c631daSSadaf Ebrahimi// this list of conditions and the following disclaimer in the documentation 45*f5c631daSSadaf Ebrahimi// and/or other materials provided with the distribution. 46*f5c631daSSadaf Ebrahimi// * Neither the name of ARM Limited nor the names of its contributors may be 47*f5c631daSSadaf Ebrahimi// used to endorse or promote products derived from this software without 48*f5c631daSSadaf Ebrahimi// specific prior written permission. 49*f5c631daSSadaf Ebrahimi// 50*f5c631daSSadaf Ebrahimi// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 51*f5c631daSSadaf Ebrahimi// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 52*f5c631daSSadaf Ebrahimi// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 53*f5c631daSSadaf Ebrahimi// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 54*f5c631daSSadaf Ebrahimi// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55*f5c631daSSadaf Ebrahimi// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 56*f5c631daSSadaf Ebrahimi// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 57*f5c631daSSadaf Ebrahimi// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 58*f5c631daSSadaf Ebrahimi// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 59*f5c631daSSadaf Ebrahimi// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 60*f5c631daSSadaf Ebrahimi 61*f5c631daSSadaf Ebrahimi""" 62*f5c631daSSadaf Ebrahimi 63*f5c631daSSadaf Ebrahimimaster_trace_header = """ 64*f5c631daSSadaf Ebrahimi// This file holds the expected results for the instructions tested by 65*f5c631daSSadaf Ebrahimi// test-simulator-aarch64. 66*f5c631daSSadaf Ebrahimi// 67*f5c631daSSadaf Ebrahimi// If you update input lists in test-simulator-inputs-aarch64.h, or add a new 68*f5c631daSSadaf Ebrahimi// test to test-simulator-aarch64.cc, please run 69*f5c631daSSadaf Ebrahimi// tools/generate_simulator_traces.py on a reference platform to regenerate 70*f5c631daSSadaf Ebrahimi// this file and trace files. 71*f5c631daSSadaf Ebrahimi// 72*f5c631daSSadaf Ebrahimi 73*f5c631daSSadaf Ebrahimi#ifndef VIXL_TEST_AARCH64_SIMULATOR_TRACES_AARCH64_H_ 74*f5c631daSSadaf Ebrahimi#define VIXL_TEST_AARCH64_SIMULATOR_TRACES_AARCH64_H_ 75*f5c631daSSadaf Ebrahimi 76*f5c631daSSadaf Ebrahimiextern "C" { 77*f5c631daSSadaf Ebrahimi#include <stdint.h> 78*f5c631daSSadaf Ebrahimi} 79*f5c631daSSadaf Ebrahimi 80*f5c631daSSadaf Ebrahimi// To add a new simulator test to test-simulator-aarch64.cc, add placeholder array(s) 81*f5c631daSSadaf Ebrahimi// below to build test-simulator-aarch64 for reference platform. Then, run 82*f5c631daSSadaf Ebrahimi// tools/generate_simulator_traces.py on a reference platform to regenerate this 83*f5c631daSSadaf Ebrahimi// file and traces files. 84*f5c631daSSadaf Ebrahimi 85*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 86*f5c631daSSadaf Ebrahimi// ADD DUMMY ARRAYS FOR NEW SIMULATOR TEST HERE. 87*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 88*f5c631daSSadaf Ebrahimiconst uint64_t kExpected_placeholder_64[] = {0}; 89*f5c631daSSadaf Ebrahimiconst size_t kExpectedCount_placeholder_64 = 0; 90*f5c631daSSadaf Ebrahimi 91*f5c631daSSadaf Ebrahimiconst uint32_t kExpected_placeholder_32[] = {0}; 92*f5c631daSSadaf Ebrahimiconst size_t kExpectedCount_placeholder_32 = 0; 93*f5c631daSSadaf Ebrahimi 94*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 95*f5c631daSSadaf Ebrahimi// Simulator test trace output files. 96*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 97*f5c631daSSadaf Ebrahimi""" 98*f5c631daSSadaf Ebrahimimaster_trace_footer = """ 99*f5c631daSSadaf Ebrahimi#endif // VIXL_TEST_AARCH64_SIMULATOR_TRACES_AARCH64_H_ 100*f5c631daSSadaf Ebrahimi""" 101*f5c631daSSadaf Ebrahimi 102*f5c631daSSadaf Ebrahimitrace_header = """ 103*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 104*f5c631daSSadaf Ebrahimi// This file is auto generated using tools/generate_simulator_traces.py. 105*f5c631daSSadaf Ebrahimi// 106*f5c631daSSadaf Ebrahimi// PLEASE DO NOT EDIT. 107*f5c631daSSadaf Ebrahimi// --------------------------------------------------------------------- 108*f5c631daSSadaf Ebrahimi""" 109*f5c631daSSadaf Ebrahimi 110*f5c631daSSadaf Ebrahimidef BuildOptions(root): 111*f5c631daSSadaf Ebrahimi result = argparse.ArgumentParser(description = 'Simulator test generator.') 112*f5c631daSSadaf Ebrahimi result.add_argument('--runner', action='store', 113*f5c631daSSadaf Ebrahimi default=os.path.join(root, 'obj/latest/test/test-runner'), 114*f5c631daSSadaf Ebrahimi help='The test executable to run.') 115*f5c631daSSadaf Ebrahimi result.add_argument('--aarch32-only', action='store_true') 116*f5c631daSSadaf Ebrahimi result.add_argument('--aarch64-only', action='store_true') 117*f5c631daSSadaf Ebrahimi result.add_argument('--out', action='store', 118*f5c631daSSadaf Ebrahimi default='test/aarch64/test-simulator-traces-aarch64.h') 119*f5c631daSSadaf Ebrahimi result.add_argument('--filter', action='store', help='Test regexp filter.') 120*f5c631daSSadaf Ebrahimi return result.parse_args() 121*f5c631daSSadaf Ebrahimi 122*f5c631daSSadaf Ebrahimidef ShouldGenerateAArch32(args): 123*f5c631daSSadaf Ebrahimi return (not args.aarch32_only and not args.aarch64_only) or args.aarch32_only 124*f5c631daSSadaf Ebrahimi 125*f5c631daSSadaf Ebrahimidef ShouldGenerateAArch64(args): 126*f5c631daSSadaf Ebrahimi return (not args.aarch32_only and not args.aarch64_only) or args.aarch64_only 127*f5c631daSSadaf Ebrahimi 128*f5c631daSSadaf Ebrahimidef GetAArch32Filename(test): 129*f5c631daSSadaf Ebrahimi return test.lower().replace('_', '-') + '.h' 130*f5c631daSSadaf Ebrahimi 131*f5c631daSSadaf Ebrahimidef GetAArch64Filename(test): 132*f5c631daSSadaf Ebrahimi return test.lower().replace('_', '-') + '-trace-aarch64.h' 133*f5c631daSSadaf Ebrahimi 134*f5c631daSSadaf Ebrahimiif __name__ == '__main__': 135*f5c631daSSadaf Ebrahimi # $ROOT/tools/generate_simulator_traces.py 136*f5c631daSSadaf Ebrahimi root_dir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))) 137*f5c631daSSadaf Ebrahimi os.chdir(root_dir) 138*f5c631daSSadaf Ebrahimi 139*f5c631daSSadaf Ebrahimi args = BuildOptions(root_dir) 140*f5c631daSSadaf Ebrahimi 141*f5c631daSSadaf Ebrahimi # List all tests. 142*f5c631daSSadaf Ebrahimi status, test_list = util.getstatusoutput(args.runner + ' --list') 143*f5c631daSSadaf Ebrahimi if status != 0: util.abort('Failed to list all tests') 144*f5c631daSSadaf Ebrahimi 145*f5c631daSSadaf Ebrahimi if ShouldGenerateAArch64(args): 146*f5c631daSSadaf Ebrahimi # Run each simulator test (AARCH64_SIM_*) with the --generate_test_trace 147*f5c631daSSadaf Ebrahimi # option, and use the output to create the traces header (from --out). In 148*f5c631daSSadaf Ebrahimi # addition, the test-simulator-traces-aarch64.h file, the master trace file, 149*f5c631daSSadaf Ebrahimi # which includes all other trace files is generated. 150*f5c631daSSadaf Ebrahimi 151*f5c631daSSadaf Ebrahimi # Create master trace file. 152*f5c631daSSadaf Ebrahimi master_trace_f = open(args.out, 'w') 153*f5c631daSSadaf Ebrahimi master_trace_f.write(copyright_header) 154*f5c631daSSadaf Ebrahimi master_trace_f.write(master_trace_header) 155*f5c631daSSadaf Ebrahimi master_trace_f.write('\n\n') 156*f5c631daSSadaf Ebrahimi 157*f5c631daSSadaf Ebrahimi # Find the AArch64 simulator tests. 158*f5c631daSSadaf Ebrahimi tests = sorted(filter(lambda t: 'AARCH64_SIM_' in t, test_list.split()), 159*f5c631daSSadaf Ebrahimi key=lambda t: GetAArch64Filename(t)) 160*f5c631daSSadaf Ebrahimi 161*f5c631daSSadaf Ebrahimi for test in tests: 162*f5c631daSSadaf Ebrahimi # Strip out 'AARCH64_' to get the name of the test. 163*f5c631daSSadaf Ebrahimi test_name = test[len('AARCH64_'):] 164*f5c631daSSadaf Ebrahimi trace_filename = GetAArch64Filename(test_name) 165*f5c631daSSadaf Ebrahimi if not args.filter or re.compile(args.filter).search(test): 166*f5c631daSSadaf Ebrahimi # Run each test. 167*f5c631daSSadaf Ebrahimi print 'Generating trace for ' + test; 168*f5c631daSSadaf Ebrahimi cmd = ' '.join([args.runner, '--generate_test_trace', test]) 169*f5c631daSSadaf Ebrahimi status, output = util.getstatusoutput(cmd) 170*f5c631daSSadaf Ebrahimi if status != 0: util.abort('Failed to run ' + cmd + '.') 171*f5c631daSSadaf Ebrahimi 172*f5c631daSSadaf Ebrahimi # Create a new trace header file. 173*f5c631daSSadaf Ebrahimi trace_f = open("test/aarch64/traces/" + trace_filename, 'w') 174*f5c631daSSadaf Ebrahimi trace_f.write(copyright_header) 175*f5c631daSSadaf Ebrahimi trace_f.write(trace_header) 176*f5c631daSSadaf Ebrahimi trace_f.write('\n') 177*f5c631daSSadaf Ebrahimi trace_f.write("#ifndef VIXL_" + test_name.upper() + "_TRACE_AARCH64_H_\n") 178*f5c631daSSadaf Ebrahimi trace_f.write("#define VIXL_" + test_name.upper() + "_TRACE_AARCH64_H_\n") 179*f5c631daSSadaf Ebrahimi trace_f.write('\n') 180*f5c631daSSadaf Ebrahimi trace_f.write(output) 181*f5c631daSSadaf Ebrahimi trace_f.write('\n') 182*f5c631daSSadaf Ebrahimi trace_f.write('\n' + "#endif // VIXL_" 183*f5c631daSSadaf Ebrahimi + test_name.upper() + "_TRACE_AARCH64_H_" + '\n') 184*f5c631daSSadaf Ebrahimi trace_f.close() 185*f5c631daSSadaf Ebrahimi 186*f5c631daSSadaf Ebrahimi # Update master trace file. 187*f5c631daSSadaf Ebrahimi master_trace_f.write( 188*f5c631daSSadaf Ebrahimi '#include \"aarch64/traces/' + trace_filename + '\"\n') 189*f5c631daSSadaf Ebrahimi 190*f5c631daSSadaf Ebrahimi # Close master trace file. 191*f5c631daSSadaf Ebrahimi master_trace_f.write(master_trace_footer) 192*f5c631daSSadaf Ebrahimi master_trace_f.close() 193*f5c631daSSadaf Ebrahimi 194*f5c631daSSadaf Ebrahimi if ShouldGenerateAArch32(args): 195*f5c631daSSadaf Ebrahimi # Run each test (AARCH32_{SIMULATOR,ASSEMBLER}_*) with the 196*f5c631daSSadaf Ebrahimi # --generate_test_trace option. 197*f5c631daSSadaf Ebrahimi 198*f5c631daSSadaf Ebrahimi # Find the AArch32 tests. 199*f5c631daSSadaf Ebrahimi tests = sorted( 200*f5c631daSSadaf Ebrahimi filter( 201*f5c631daSSadaf Ebrahimi lambda t: 'AARCH32_SIMULATOR_' in t or ('AARCH32_ASSEMBLER_' in t 202*f5c631daSSadaf Ebrahimi and not 'AARCH32_ASSEMBLER_NEGATIVE_' in t), 203*f5c631daSSadaf Ebrahimi test_list.split()), 204*f5c631daSSadaf Ebrahimi key=lambda t: GetAArch32Filename(t)) 205*f5c631daSSadaf Ebrahimi if args.filter: 206*f5c631daSSadaf Ebrahimi tests = filter(re.compile(args.filter).search, tests) 207*f5c631daSSadaf Ebrahimi 208*f5c631daSSadaf Ebrahimi for test in tests: 209*f5c631daSSadaf Ebrahimi # Run each test. 210*f5c631daSSadaf Ebrahimi print 'Generating trace for ' + test; 211*f5c631daSSadaf Ebrahimi # Strip out 'AARCH32_' to get the name of the test. 212*f5c631daSSadaf Ebrahimi test_name = test[len('AARCH32_'):] 213*f5c631daSSadaf Ebrahimi 214*f5c631daSSadaf Ebrahimi # An "and" instruction will be called "and_" since we cannot clash with 215*f5c631daSSadaf Ebrahimi # the C++ operator. Rename "and_" to "and" to keep sane filenames. 216*f5c631daSSadaf Ebrahimi test_name = test_name.replace('and_', 'and') 217*f5c631daSSadaf Ebrahimi 218*f5c631daSSadaf Ebrahimi cmd = ' '.join([args.runner, '--generate_test_trace', test]) 219*f5c631daSSadaf Ebrahimi status, output = util.getstatusoutput(cmd) 220*f5c631daSSadaf Ebrahimi if status != 0: util.abort('Failed to run ' + cmd + '.') 221*f5c631daSSadaf Ebrahimi 222*f5c631daSSadaf Ebrahimi # Create a new trace header file. 223*f5c631daSSadaf Ebrahimi trace_filename = GetAArch32Filename(test_name) 224*f5c631daSSadaf Ebrahimi trace_f = open("test/aarch32/traces/" + trace_filename, 'w') 225*f5c631daSSadaf Ebrahimi trace_f.write(copyright_header) 226*f5c631daSSadaf Ebrahimi trace_f.write(trace_header) 227*f5c631daSSadaf Ebrahimi trace_f.write('\n') 228*f5c631daSSadaf Ebrahimi trace_f.write("#ifndef VIXL_" + test_name.upper() + "_H_\n") 229*f5c631daSSadaf Ebrahimi trace_f.write("#define VIXL_" + test_name.upper() + "_H_\n") 230*f5c631daSSadaf Ebrahimi trace_f.write('\n') 231*f5c631daSSadaf Ebrahimi trace_f.write(output) 232*f5c631daSSadaf Ebrahimi trace_f.write('\n') 233*f5c631daSSadaf Ebrahimi trace_f.write( 234*f5c631daSSadaf Ebrahimi '\n' + "#endif // VIXL_" + test_name.upper() + "_H_" + '\n') 235*f5c631daSSadaf Ebrahimi trace_f.close() 236*f5c631daSSadaf Ebrahimi 237*f5c631daSSadaf Ebrahimi print 'Trace generation COMPLETE' 238