Commit 0eae5959 authored by Frederik Gossen's avatar Frederik Gossen Committed by Commit Bot

[wasm-hints] Add tool to inject compilation hints into Wasm modules

The python script allows to inject hints into a Wasm module. Hints are
injected into a newly created custom section named "compilationHints"
that is used by the compiler to determine its compilation strategy. The
section is placed after the functions section and before the code
section.

Bug: v8:9003
Change-Id: I531c57e4269ff9ae42b95be3515d2409627d6fb9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1619865
Commit-Queue: Frederik Gossen <frgossen@google.com>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Reviewed-by: 's avatarMichael Achenbach <machenbach@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61797}
parent e588ff10
#!/usr/bin/env python
# Copyright 2019 the V8 project 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 argparse
import io
import sys
from wasm import *
FUNCTION_SECTION_ID = 3
def parse_args():
parser = argparse.ArgumentParser(\
description="Inject compilation hints into a Wasm module.")
parser.add_argument("-i", "--in-wasm-file", \
type=str, \
help="original wasm module")
parser.add_argument("-o", "--out-wasm-file", \
type=str, \
help="wasm module with injected hints")
parser.add_argument("-x", "--hints-file", \
type=str, required=True, \
help="binary hints file to be injected as a custom section " + \
"'compilationHints'")
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
in_wasm_file = args.in_wasm_file if args.in_wasm_file else sys.stdin.fileno()
out_wasm_file = args.out_wasm_file if args.out_wasm_file else sys.stdout.fileno()
hints_bs = open(args.hints_file, "rb").read()
with io.open(in_wasm_file, "rb") as fin:
with io.open(out_wasm_file, "wb") as fout:
magic_number, bs = read_magic_number(fin);
fout.write(bs)
version, bs = read_version(fin);
fout.write(bs)
num_declared_functions = None
while True:
id, bs = read_varuintN(fin)
fout.write(bs)
if id == None:
break
payload_length, bs = read_varuintN(fin)
fout.write(bs)
# Peek into function section for upcoming validity check.
if id == FUNCTION_SECTION_ID:
num_declared_functions, bs = peek_varuintN(fin)
bs = fin.read(payload_length)
fout.write(bs)
# Instert hint section after function section.
if id == FUNCTION_SECTION_ID:
assert len(hints_bs) == num_declared_functions, "unexpected number of hints"
write_compilation_hints_section(fout, hints_bs)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment