107 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/bin/bash -eu
 | 
						|
# Copyright 2021 Google LLC
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
#
 | 
						|
################################################################################
 | 
						|
 | 
						|
cp standalone.gclient .gclient
 | 
						|
gclient sync
 | 
						|
 | 
						|
mkdir -p out/Debug
 | 
						|
pushd out/Debug
 | 
						|
 | 
						|
# ubsan's vptr sanitization is desabled as it requires RTTI, which is disabled
 | 
						|
# when building tint.
 | 
						|
CFLAGS="$CFLAGS -fno-sanitize=vptr" \
 | 
						|
CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr" \
 | 
						|
cmake -GNinja ../.. -DCMAKE_BUILD_TYPE=Release -DTINT_BUILD_FUZZERS=ON -DTINT_BUILD_SPIRV_TOOLS_FUZZER=ON -DTINT_BUILD_TESTS=OFF -DTINT_LIB_FUZZING_ENGINE_LINK_OPTIONS=$LIB_FUZZING_ENGINE
 | 
						|
 | 
						|
if [ -n "${OSS_FUZZ_CI-}" ]
 | 
						|
then
 | 
						|
  # When running in the CI, restrict to a small number of fuzz targets to save
 | 
						|
  # time and disk space.  A SPIR-V Tools-based fuzzer that uses the HLSL
 | 
						|
  # back-end, and a regular fuzzer that uses the MSL back-end, are selected.
 | 
						|
  SPIRV_TOOLS_FUZZERS="tint_spirv_tools_hlsl_writer_fuzzer"
 | 
						|
  SPIRV_FUZZERS="tint_spv_reader_msl_writer_fuzzer\
 | 
						|
   ${SPIRV_TOOLS_FUZZERS}"
 | 
						|
else
 | 
						|
  SPIRV_TOOLS_FUZZERS="tint_spirv_tools_hlsl_writer_fuzzer\
 | 
						|
   tint_spirv_tools_msl_writer_fuzzer\
 | 
						|
   tint_spirv_tools_spv_writer_fuzzer\
 | 
						|
   tint_spirv_tools_wgsl_writer_fuzzer"
 | 
						|
  SPIRV_FUZZERS="tint_spv_reader_hlsl_writer_fuzzer\
 | 
						|
   tint_spv_reader_msl_writer_fuzzer\
 | 
						|
   tint_spv_reader_spv_writer_fuzzer\
 | 
						|
   tint_spv_reader_wgsl_writer_fuzzer\
 | 
						|
   ${SPIRV_TOOLS_FUZZERS}"
 | 
						|
fi
 | 
						|
 | 
						|
# The spirv-as tool is used to build seed corpora
 | 
						|
ninja ${SPIRV_FUZZERS}
 | 
						|
 | 
						|
cp ${SPIRV_FUZZERS} $OUT
 | 
						|
 | 
						|
popd
 | 
						|
 | 
						|
# An un-instrumented build of spirv-as is used to generate a corpus of SPIR-V binaries.
 | 
						|
mkdir -p out/Standard
 | 
						|
pushd out/Standard
 | 
						|
 | 
						|
# Back-up instrumentation options
 | 
						|
CFLAGS_SAVE="$CFLAGS"
 | 
						|
CXXFLAGS_SAVE="$CXXFLAGS"
 | 
						|
unset CFLAGS
 | 
						|
unset CXXFLAGS
 | 
						|
export AFL_NOOPT=1
 | 
						|
 | 
						|
cmake -GNinja ../.. -DCMAKE_BUILD_TYPE=Release
 | 
						|
ninja spirv-as
 | 
						|
 | 
						|
# Restore instrumentation options
 | 
						|
export CFLAGS="${CFLAGS_SAVE}"
 | 
						|
export CXXFLAGS="${CXXFLAGS_SAVE}"
 | 
						|
unset AFL_NOOPT
 | 
						|
 | 
						|
popd
 | 
						|
 | 
						|
# Generate a corpus of SPIR-V binaries from the SPIR-V assembly files in the
 | 
						|
# tint repository.
 | 
						|
mkdir $WORK/spirv-corpus
 | 
						|
python3 fuzzers/generate_spirv_corpus.py test $WORK/spirv-corpus out/Standard/spirv-as
 | 
						|
 | 
						|
mkdir $WORK/spirv-corpus-hashed-names
 | 
						|
for f in `ls $WORK/spirv-corpus/*.spv`
 | 
						|
do
 | 
						|
  hashed_name=$(sha1sum "$f" | awk '{print $1}')
 | 
						|
  cp $f $WORK/spirv-corpus-hashed-names/$hashed_name
 | 
						|
done
 | 
						|
 | 
						|
zip -j "$WORK/seed_corpus.zip" "$WORK"/spirv-corpus-hashed-names/*
 | 
						|
 | 
						|
for fuzzer in $SPIRV_FUZZERS
 | 
						|
do
 | 
						|
  cp "$WORK/seed_corpus.zip" "$OUT/${fuzzer}_seed_corpus.zip"
 | 
						|
done
 | 
						|
 | 
						|
for fuzzer in $SPIRV_TOOLS_FUZZERS
 | 
						|
do
 | 
						|
  echo "[libfuzzer]
 | 
						|
max_len = 10000
 | 
						|
cross_over = 0
 | 
						|
mutate_depth = 1
 | 
						|
tint_enable_all_mutations = false
 | 
						|
tint_mutation_batch_size = 5
 | 
						|
" > "$OUT/${fuzzer}.options"
 | 
						|
done
 |