#!/usr/bin/env python #------------------------------------------------------------------------------------------------------- # Copyright (C) Microsoft. All rights reserved. # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. #------------------------------------------------------------------------------------------------------- # Regenerate embedded bytecode headers. # NOTEs: # 1. this script is for linux and macOS only, on windows please use RegenAllByteCode.cmd AND update_bytecode_version.ps1 # 2. this script uses paths relative to the tools directory it's in so cd to it before running # 3. this script relies on forcing 64bit CC builds to produce 32bit bytecode - this could break due to future changes to CC. # If this facility breaks the CI will fail AND either this will need fixing or bytecode will need to be regenerated using # 32 bit builds on windows # 4. Run with flag '--skip-build' if the necessary versions of ChakraCore are already built to skip the compilation step # (this is useful if editing the .js files that the bytecode is produced from) # Two versions of CC and ch must be compiled for bytecode generation # ch is used to generate bytecode. # ch (NoJIT variety) is used to generate NoJIT bytecodes. import subprocess import sys import uuid # Compile ChakraCore both noJit and Jit variants def run_sub(message, commands, error): print(message) sub = subprocess.Popen(commands) sub.wait() if sub.returncode != 0: sys.exit(error) if len(sys.argv) == 1 or sys.argv[1] != '--skip-build': run_sub('Compiling ChakraCore with no Jit', ['../build.sh', '--no-jit', '--test-build', '--target-path=../out/noJit', '-j=2'], 'No Jit build failed - aborting bytecode generation') run_sub('Compiling ChakraCore with Jit', ['../build.sh', '--test-build', '--target-path=../out/Jit', '-j=2'], 'Jit build failed - aborting bytecode generation') # Regenerate the bytecode def bytecode_job(outPath, command, error): header = open(outPath, 'w') job = subprocess.Popen(command, stdout=header) job.wait() if job.returncode != 0: sys.exit(error) # INTL print('Generating INTL bytecode') bytecode_job('../lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.64b.h', ['../out/noJit/test/ch', '-GenerateLibraryByteCodeHeader', '-Intl', '../lib/Runtime/Library/InJavascript/Intl.js'], 'Failed to generate INTL 64bit noJit bytecode') bytecode_job('../lib/Runtime/Library/InJavascript/Intl.js.nojit.bc.32b.h', ['../out/noJit/test/ch', '-GenerateLibraryByteCodeHeader', '-Intl', '-Force32BitByteCode','../lib/Runtime/Library/InJavascript/Intl.js'], 'Failed to generate INTL 32bit noJit bytecode') bytecode_job('../lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h', ['../out/Jit/test/ch', '-GenerateLibraryByteCodeHeader', '-Intl', '../lib/Runtime/Library/InJavascript/Intl.js'], 'Failed to generate INTL 64bit bytecode') bytecode_job('../lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h', ['../out/Jit/test/ch', '-GenerateLibraryByteCodeHeader', '-Intl', '-Force32BitByteCode','../lib/Runtime/Library/InJavascript/Intl.js'], 'Failed to generate INTL 32bit bytecode') # JsBuiltin print('Generating JsBuiltin Bytecode') bytecode_job('../lib/Runtime/Library/JsBuiltin/JsBuiltin.js.nojit.bc.64b.h', ['../out/noJit/test/ch', '-GenerateLibraryByteCodeHeader', '-JsBuiltIn', '-LdChakraLib', '../lib/Runtime/Library/JsBuiltin/JsBuiltin.js'], 'Failed to generate noJit 64bit JsBuiltin Bytecode') bytecode_job('../lib/Runtime/Library/JsBuiltin/JsBuiltin.js.nojit.bc.32b.h', ['../out/noJit/test/ch', '-GenerateLibraryByteCodeHeader', '-JsBuiltIn', '-LdChakraLib', '-Force32BitByteCode', '../lib/Runtime/Library/JsBuiltin/JsBuiltin.js'], 'Failed to generate noJit 32bit JsBuiltin Bytecode') bytecode_job('../lib/Runtime/Library/JsBuiltin/JsBuiltin.js.bc.64b.h', ['../out/Jit/test/ch', '-GenerateLibraryByteCodeHeader', '-JsBuiltIn', '-LdChakraLib', '../lib/Runtime/Library/JsBuiltin/JsBuiltin.js'], 'Failed to generate 64bit JsBuiltin Bytecode') bytecode_job('../lib/Runtime/Library/JsBuiltin/JsBuiltin.js.bc.32b.h', ['../out/Jit/test/ch', '-GenerateLibraryByteCodeHeader', '-JsBuiltIn', '-LdChakraLib', '-Force32BitByteCode', '../lib/Runtime/Library/JsBuiltin/JsBuiltin.js'], 'Failed to generate 32bit JsBuiltin Bytecode') # Bytecode regeneration complete - create a new GUID for it print('Generating new GUID for new bytecode') guid_header = open('../lib/Runtime/Bytecode/ByteCodeCacheReleaseFileVersion.h', 'w') guid = str(uuid.uuid4()) output_str = '''//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- // NOTE: If there is a merge conflict the correct fix is to make a new GUID. // This file was generated with tools/xplatRegenByteCode.py // {%s} const GUID byteCodeCacheReleaseFileVersion = { 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s } }; ''' % (guid, guid[:8], guid[9:13], guid[14:18], guid[19:21], guid[21:23], guid[24:26], guid[26:28], guid[28:30], guid[30:32], guid[32:34], guid[-2:]) guid_header.write(output_str) print('Bytecode successfully regenerated. Please rebuild ChakraCore to incorporate it.')