180a8ca840
This is a reland of 431fff66f5
.
The fix is in BUILD.gn: We need to also include chromeos, which is a
linux target which is not covered by "is_linux" in gn.
R=ahaas@chromium.org
Original change's description:
> [traphandler] Add simulator support
>
> This prepares the trap handler to support being used from simulators.
> Modifications to the arm64 simulator will be done in a follow-up CL. For
> now, the trap handler will be registered but not used in Wasm (we emit
> explicit bounds checks instead, as before).
>
> The implementation uses inline assembly, so it is only available on x64
> POSIX systems for now. This is the main platform we use for testing and
> for fuzzing, so it should give us the test coverage we need. If needed,
> inline assembly for other platforms can be added later.
> The new code will be executed by the existing arm64 simulator bots, e.g.
> "V8 Linux - arm64 - sim".
>
> R=ahaas@chromium.org, mseaborn@chromium.org
>
> Bug: v8:11955
> Change-Id: Idc50291c704d9dea902ae0098e5309f19055816c
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3011160
> Commit-Queue: Clemens Backes <clemensb@chromium.org>
> Reviewed-by: Andreas Haas <ahaas@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#75780}
Bug: v8:11955
Change-Id: I8af39dea5b2cd3fa5418170a458832b3d6075107
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3040844
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Auto-Submit: Clemens Backes <clemensb@chromium.org>
Reviewed-by: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75809}
153 lines
5.1 KiB
Python
Executable File
153 lines
5.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# vim:fenc=utf-8:shiftwidth=2
|
|
|
|
# Copyright 2018 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.
|
|
|
|
"""Check that each header can be included in isolation.
|
|
|
|
For each header we generate one .cc file which only includes this one header.
|
|
All these .cc files are then added to a sources.gni file which is included in
|
|
BUILD.gn. Just compile to check whether there are any violations to the rule
|
|
that each header must be includable in isolation.
|
|
"""
|
|
|
|
# for py2/py3 compatibility
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import os
|
|
import os.path
|
|
import re
|
|
import sys
|
|
|
|
# TODO(clemensb): Extend to tests.
|
|
DEFAULT_INPUT = ['base', 'src']
|
|
DEFAULT_GN_FILE = 'BUILD.gn'
|
|
MY_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
V8_DIR = os.path.dirname(MY_DIR)
|
|
OUT_DIR = os.path.join(V8_DIR, 'check-header-includes')
|
|
AUTO_EXCLUDE = [
|
|
# flag-definitions.h needs a mode set for being included.
|
|
'src/flags/flag-definitions.h',
|
|
# recorder.h should only be included conditionally.
|
|
'src/libplatform/tracing/recorder.h',
|
|
# trap-handler-simulator.h can only be included in simulator builds.
|
|
'src/trap-handler/trap-handler-simulator.h',
|
|
]
|
|
AUTO_EXCLUDE_PATTERNS = [
|
|
'src/base/atomicops_internals_.*',
|
|
# TODO(petermarshall): Enable once Perfetto is built by default.
|
|
'src/libplatform/tracing/perfetto*',
|
|
] + [
|
|
# platform-specific headers
|
|
'\\b{}\\b'.format(p) for p in
|
|
('win', 'win32', 'ia32', 'x64', 'arm', 'arm64', 'mips', 'mips64', 's390',
|
|
'ppc','riscv64')]
|
|
|
|
args = None
|
|
def parse_args():
|
|
global args
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-i', '--input', type=str, action='append',
|
|
help='Headers or directories to check (directories '
|
|
'are scanned for headers recursively); default: ' +
|
|
','.join(DEFAULT_INPUT))
|
|
parser.add_argument('-x', '--exclude', type=str, action='append',
|
|
help='Add an exclude pattern (regex)')
|
|
parser.add_argument('-v', '--verbose', action='store_true',
|
|
help='Be verbose')
|
|
args = parser.parse_args()
|
|
args.exclude = (args.exclude or []) + AUTO_EXCLUDE_PATTERNS
|
|
args.exclude += ['^' + re.escape(x) + '$' for x in AUTO_EXCLUDE]
|
|
if not args.input:
|
|
args.input=DEFAULT_INPUT
|
|
|
|
|
|
def printv(line):
|
|
if args.verbose:
|
|
print(line)
|
|
|
|
|
|
def find_all_headers():
|
|
printv('Searching for headers...')
|
|
header_files = []
|
|
exclude_patterns = [re.compile(x) for x in args.exclude]
|
|
def add_recursively(filename):
|
|
full_name = os.path.join(V8_DIR, filename)
|
|
if not os.path.exists(full_name):
|
|
sys.exit('File does not exist: {}'.format(full_name))
|
|
if os.path.isdir(full_name):
|
|
for subfile in os.listdir(full_name):
|
|
full_name = os.path.join(filename, subfile)
|
|
printv('Scanning {}'.format(full_name))
|
|
add_recursively(full_name)
|
|
elif filename.endswith('.h'):
|
|
printv('--> Found header file {}'.format(filename))
|
|
for p in exclude_patterns:
|
|
if p.search(filename):
|
|
printv('--> EXCLUDED (matches {})'.format(p.pattern))
|
|
return
|
|
header_files.append(filename)
|
|
|
|
for filename in args.input:
|
|
add_recursively(filename)
|
|
|
|
return header_files
|
|
|
|
|
|
def get_cc_file_name(header):
|
|
split = os.path.split(header)
|
|
header_dir = os.path.relpath(split[0], V8_DIR)
|
|
# Prefix with the directory name, to avoid collisions in the object files.
|
|
prefix = header_dir.replace(os.path.sep, '-')
|
|
cc_file_name = 'test-include-' + prefix + '-' + split[1][:-1] + 'cc'
|
|
return os.path.join(OUT_DIR, cc_file_name)
|
|
|
|
|
|
def create_including_cc_files(header_files):
|
|
comment = 'check including this header in isolation'
|
|
for header in header_files:
|
|
cc_file_name = get_cc_file_name(header)
|
|
rel_cc_file_name = os.path.relpath(cc_file_name, V8_DIR)
|
|
content = '#include "{}" // {}\n'.format(header, comment)
|
|
if os.path.exists(cc_file_name):
|
|
with open(cc_file_name) as cc_file:
|
|
if cc_file.read() == content:
|
|
printv('File {} is up to date'.format(rel_cc_file_name))
|
|
continue
|
|
printv('Creating file {}'.format(rel_cc_file_name))
|
|
with open(cc_file_name, 'w') as cc_file:
|
|
cc_file.write(content)
|
|
|
|
|
|
def generate_gni(header_files):
|
|
gni_file = os.path.join(OUT_DIR, 'sources.gni')
|
|
printv('Generating file "{}"'.format(os.path.relpath(gni_file, V8_DIR)))
|
|
with open(gni_file, 'w') as gn:
|
|
gn.write("""\
|
|
# Copyright 2018 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
# This list is filled automatically by tools/check_header_includes.py.
|
|
check_header_includes_sources = [
|
|
""");
|
|
for header in header_files:
|
|
cc_file_name = get_cc_file_name(header)
|
|
gn.write(' "{}",\n'.format(os.path.relpath(cc_file_name, V8_DIR)))
|
|
gn.write(']\n')
|
|
|
|
|
|
def main():
|
|
parse_args()
|
|
header_files = find_all_headers()
|
|
if not os.path.exists(OUT_DIR):
|
|
os.mkdir(OUT_DIR)
|
|
create_including_cc_files(header_files)
|
|
generate_gni(header_files)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|