blob: 07fbc7d08d28bdb5bd075f0b95a2937c5c6254e5 [file] [log] [blame]
# Copyright 2014 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.
import re
from recipe_engine.types import freeze
from recipe_engine import post_process
from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb
from RECIPE_MODULES.build import chromium
from RECIPE_MODULES.build.attr_utils import attrs, attrib
DEPS = [
'archive',
'chromium',
'chromium_checkout',
'gn',
'recipe_engine/context',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/raw_io',
'recipe_engine/step',
]
@attrs()
class LibfuzzerSpec(chromium.BuilderSpec):
archive_prefix = attrib(str, default='libfuzzer')
v8_targets_only = attrib(bool, default=False)
# Fields without defaults can't be declared when inheriting from a type that
# has defaults for any fields
# TODO(gbeaty) Once we're on python3, we can switch these to be kwonly and not
# specify a default. For now, it's enforced in __attrs_post_init__, which gets
# run after the fields are initialized
upload_bucket = attrib(str, default=None)
upload_directory = attrib(str, default=None)
def __attrs_post_init__(self):
assert self.upload_bucket is not None
assert self.upload_directory is not None
BUILDERS = freeze({
'chromium.fuzz': {
'builders': {
'Libfuzzer Upload Chrome OS ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'chromeos',
'TARGET_BITS': 64,
},
gclient_apply_config=['chromeos'],
archive_prefix='libfuzzer-chromeos',
upload_bucket='chromium-browser-libfuzzer',
upload_directory='chromeos-asan',
),
'Libfuzzer Upload Linux32 ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
'Libfuzzer Upload Linux32 ASan Debug':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
'Libfuzzer Upload Linux32 V8-ARM ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
archive_prefix='libfuzzer-v8-arm',
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan-arm-sim',
v8_targets_only=True,
),
'Libfuzzer Upload Linux32 V8-ARM ASan Debug':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 32,
},
archive_prefix='libfuzzer-v8-arm',
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan-arm-sim',
v8_targets_only=True,
),
'Libfuzzer Upload Linux ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
'Libfuzzer Upload Linux ASan Debug':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
'Libfuzzer Upload Linux V8-ARM64 ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
archive_prefix='libfuzzer-v8-arm64',
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan-arm64-sim',
v8_targets_only=True,
),
'Libfuzzer Upload Linux V8-ARM64 ASan Debug':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Debug',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
archive_prefix='libfuzzer-v8-arm64',
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan-arm64-sim',
v8_targets_only=True,
),
'Libfuzzer Upload Linux MSan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber', 'msan'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='msan',
),
'Libfuzzer Upload Linux UBSan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'linux',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='ubsan',
),
'Libfuzzer Upload Mac ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'mac',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
'Libfuzzer Upload Windows ASan':
LibfuzzerSpec.create(
chromium_config='chromium_clang',
chromium_apply_config=['clobber'],
chromium_config_kwargs={
'BUILD_CONFIG': 'Release',
'TARGET_PLATFORM': 'win',
'TARGET_BITS': 64,
},
upload_bucket='chromium-browser-libfuzzer',
upload_directory='asan',
),
},
},
})
def RunSteps(api):
builder_id, bot_config = api.chromium.configure_bot(BUILDERS, ['mb'])
checkout_results = api.chromium_checkout.ensure_checkout(bot_config)
api.chromium.ensure_goma()
api.chromium.runhooks()
api.chromium.mb_gen(builder_id, use_goma=True)
with api.context(cwd=api.path['checkout'], env=api.chromium.get_env()):
all_fuzzers = api.gn.refs(
api.chromium.output_dir,
['//testing/libfuzzer:libfuzzer_main'],
output_type='executable',
output_format='output',
step_name='calculate all_fuzzers',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'target1\ntarget2\nv8_target3', stream='stdout'))
if bot_config.v8_targets_only:
# Some builders only need the V8 targets as the only difference is code
# generated by V8 simulators.
v8_fuzzers = api.gn.refs(
api.chromium.output_dir,
['//v8:fuzzer_support'],
output_type='executable',
output_format='output',
step_name='calculate v8_fuzzers',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'v8_target3', stream='stdout'))
all_fuzzers = all_fuzzers & v8_fuzzers
no_clusterfuzz = api.gn.refs(
api.chromium.output_dir,
['//testing/libfuzzer:no_clusterfuzz'],
output_type='executable',
output_format='output',
step_name='calculate no_clusterfuzz',
step_test_data=lambda: api.raw_io.test_api.stream_output(
'target1', stream='stdout'))
targets = list(all_fuzzers - no_clusterfuzz)
api.step.active_result.presentation.logs['all_fuzzers'] = all_fuzzers
api.step.active_result.presentation.logs['no_clusterfuzz'] = no_clusterfuzz
api.step.active_result.presentation.logs['targets'] = targets
raw_result = api.chromium.compile(targets=targets, use_goma_module=True)
if raw_result.status != common_pb.SUCCESS:
return raw_result
# Make sure 32 bit archives are distinguished from 64 bit ones.
kwargs = {}
if api.chromium.c.TARGET_BITS == 32:
kwargs['use_legacy'] = False
kwargs['bitness'] = 32
api.archive.clusterfuzz_archive(
build_dir=api.chromium.output_dir,
update_properties=checkout_results.json.output['properties'],
gs_bucket=bot_config.upload_bucket,
archive_prefix=bot_config.archive_prefix,
archive_subdir_suffix=bot_config.upload_directory,
gs_acl='public-read',
**kwargs)
def GenTests(api):
for test in api.chromium.gen_tests_for_builders(BUILDERS):
yield test
yield api.test(
'compile_failure',
api.chromium.ci_build(
mastername='chromium.fuzz',
builder='Libfuzzer Upload Mac ASan',
),
api.platform.name('mac'),
api.step_data('compile', retcode=1),
api.post_process(post_process.StatusFailure),
api.post_process(post_process.DropExpectation),
)