1*c0909341SAndroid Build Coastguard Worker# Copyright © 2020, VideoLAN and dav1d authors 2*c0909341SAndroid Build Coastguard Worker# All rights reserved. 3*c0909341SAndroid Build Coastguard Worker# 4*c0909341SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 5*c0909341SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 6*c0909341SAndroid Build Coastguard Worker# 7*c0909341SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright notice, this 8*c0909341SAndroid Build Coastguard Worker# list of conditions and the following disclaimer. 9*c0909341SAndroid Build Coastguard Worker# 10*c0909341SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright notice, 11*c0909341SAndroid Build Coastguard Worker# this list of conditions and the following disclaimer in the documentation 12*c0909341SAndroid Build Coastguard Worker# and/or other materials provided with the distribution. 13*c0909341SAndroid Build Coastguard Worker# 14*c0909341SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 15*c0909341SAndroid Build Coastguard Worker# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16*c0909341SAndroid Build Coastguard Worker# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17*c0909341SAndroid Build Coastguard Worker# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 18*c0909341SAndroid Build Coastguard Worker# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19*c0909341SAndroid Build Coastguard Worker# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20*c0909341SAndroid Build Coastguard Worker# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21*c0909341SAndroid Build Coastguard Worker# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*c0909341SAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23*c0909341SAndroid Build Coastguard Worker# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*c0909341SAndroid Build Coastguard Worker 25*c0909341SAndroid Build Coastguard Worker# 26*c0909341SAndroid Build Coastguard Worker# Build definition for the dav1d fuzzing binaries 27*c0909341SAndroid Build Coastguard Worker# 28*c0909341SAndroid Build Coastguard Worker 29*c0909341SAndroid Build Coastguard Workerif fuzzing_engine == 'none' and not have_fseeko 30*c0909341SAndroid Build Coastguard Worker subdir_done() 31*c0909341SAndroid Build Coastguard Workerendif 32*c0909341SAndroid Build Coastguard Worker 33*c0909341SAndroid Build Coastguard Workerdav1d_fuzzer_sources = files('dav1d_fuzzer.c') 34*c0909341SAndroid Build Coastguard Workerfuzzer_ldflags = [] 35*c0909341SAndroid Build Coastguard Workerfuzzer_link_lang = {} 36*c0909341SAndroid Build Coastguard Worker 37*c0909341SAndroid Build Coastguard Workerif get_option('fuzzer_ldflags') != '' 38*c0909341SAndroid Build Coastguard Worker fuzzer_ldflags += [get_option('fuzzer_ldflags')] 39*c0909341SAndroid Build Coastguard Workerendif 40*c0909341SAndroid Build Coastguard Worker 41*c0909341SAndroid Build Coastguard Workerif fuzzing_engine == 'none' 42*c0909341SAndroid Build Coastguard Worker dav1d_fuzzer_sources += files('main.c') 43*c0909341SAndroid Build Coastguard Workerelif fuzzing_engine == 'libfuzzer' 44*c0909341SAndroid Build Coastguard Worker fuzzer_ldflags += ['-fsanitize=fuzzer'] 45*c0909341SAndroid Build Coastguard Workerelif fuzzing_engine == 'oss-fuzz' 46*c0909341SAndroid Build Coastguard Worker # libFuzzingEngine needs c++ 47*c0909341SAndroid Build Coastguard Worker add_languages('cpp') 48*c0909341SAndroid Build Coastguard Worker fuzzer_link_lang = {'link_language': 'cpp'} 49*c0909341SAndroid Build Coastguard Workerendif 50*c0909341SAndroid Build Coastguard Worker 51*c0909341SAndroid Build Coastguard Workerdav1d_fuzzer = executable('dav1d_fuzzer', 52*c0909341SAndroid Build Coastguard Worker dav1d_fuzzer_sources, 53*c0909341SAndroid Build Coastguard Worker include_directories: dav1d_inc_dirs, 54*c0909341SAndroid Build Coastguard Worker link_args: fuzzer_ldflags, 55*c0909341SAndroid Build Coastguard Worker link_with : libdav1d, 56*c0909341SAndroid Build Coastguard Worker build_by_default: true, 57*c0909341SAndroid Build Coastguard Worker dependencies : [thread_dependency], 58*c0909341SAndroid Build Coastguard Worker kwargs: fuzzer_link_lang 59*c0909341SAndroid Build Coastguard Worker ) 60*c0909341SAndroid Build Coastguard Worker 61*c0909341SAndroid Build Coastguard Workerdav1d_fuzzer_mt = executable('dav1d_fuzzer_mt', 62*c0909341SAndroid Build Coastguard Worker dav1d_fuzzer_sources, 63*c0909341SAndroid Build Coastguard Worker include_directories: dav1d_inc_dirs, 64*c0909341SAndroid Build Coastguard Worker c_args: ['-DDAV1D_MT_FUZZING'], 65*c0909341SAndroid Build Coastguard Worker link_args: fuzzer_ldflags, 66*c0909341SAndroid Build Coastguard Worker link_with : libdav1d, 67*c0909341SAndroid Build Coastguard Worker build_by_default: true, 68*c0909341SAndroid Build Coastguard Worker dependencies : [thread_dependency], 69*c0909341SAndroid Build Coastguard Worker kwargs: fuzzer_link_lang 70*c0909341SAndroid Build Coastguard Worker ) 71*c0909341SAndroid Build Coastguard Worker 72*c0909341SAndroid Build Coastguard Workerobjcopy = find_program('objcopy', 73*c0909341SAndroid Build Coastguard Worker required: false) 74*c0909341SAndroid Build Coastguard Workerif (objcopy.found() and 75*c0909341SAndroid Build Coastguard Worker not get_option('b_lto') and 76*c0909341SAndroid Build Coastguard Worker get_option('default_library') == 'static' and 77*c0909341SAndroid Build Coastguard Worker cc.has_function('posix_memalign', prefix : '#include <stdlib.h>', args : test_args)) 78*c0909341SAndroid Build Coastguard Worker 79*c0909341SAndroid Build Coastguard Worker libdav1d_af = custom_target('libdav1d_af', 80*c0909341SAndroid Build Coastguard Worker input: libdav1d, 81*c0909341SAndroid Build Coastguard Worker output: 'libdav1d_af.a', 82*c0909341SAndroid Build Coastguard Worker depends: libdav1d, 83*c0909341SAndroid Build Coastguard Worker command: [objcopy, 84*c0909341SAndroid Build Coastguard Worker '--redefine-sym', 'malloc=__wrap_malloc', 85*c0909341SAndroid Build Coastguard Worker '--redefine-sym', 'posix_memalign=__wrap_posix_memalign', 86*c0909341SAndroid Build Coastguard Worker '--redefine-sym', 'pthread_create=__wrap_pthread_create', 87*c0909341SAndroid Build Coastguard Worker '--redefine-sym', 'pthread_cond_init=__wrap_pthread_cond_init', 88*c0909341SAndroid Build Coastguard Worker '--redefine-sym', 'pthread_mutex_init=__wrap_pthread_mutex_init', 89*c0909341SAndroid Build Coastguard Worker '@INPUT@', '@OUTPUT@']) 90*c0909341SAndroid Build Coastguard Worker 91*c0909341SAndroid Build Coastguard Worker dav1d_fuzzer_mem = executable('dav1d_fuzzer_mem', 92*c0909341SAndroid Build Coastguard Worker dav1d_fuzzer_sources + ['alloc_fail.c'], 93*c0909341SAndroid Build Coastguard Worker include_directories: dav1d_inc_dirs, 94*c0909341SAndroid Build Coastguard Worker c_args: ['-DDAV1D_ALLOC_FAIL'], 95*c0909341SAndroid Build Coastguard Worker link_args: fuzzer_ldflags + [join_paths(libdav1d_af.full_path())], 96*c0909341SAndroid Build Coastguard Worker link_depends: libdav1d_af, 97*c0909341SAndroid Build Coastguard Worker build_by_default: false, 98*c0909341SAndroid Build Coastguard Worker dependencies : [thread_dependency], 99*c0909341SAndroid Build Coastguard Worker kwargs: fuzzer_link_lang 100*c0909341SAndroid Build Coastguard Worker ) 101*c0909341SAndroid Build Coastguard Workerendif 102