1*fb1b10abSAndroid Build Coastguard Worker## Copyright (c) 2018 The WebM project authors. All Rights Reserved. 2*fb1b10abSAndroid Build Coastguard Worker## 3*fb1b10abSAndroid Build Coastguard Worker## Use of this source code is governed by a BSD-style license 4*fb1b10abSAndroid Build Coastguard Worker## that can be found in the LICENSE file in the root of the source 5*fb1b10abSAndroid Build Coastguard Worker## tree. An additional intellectual property rights grant can be found 6*fb1b10abSAndroid Build Coastguard Worker## in the file PATENTS. All contributing project authors may 7*fb1b10abSAndroid Build Coastguard Worker## be found in the AUTHORS file in the root of the source tree. 8*fb1b10abSAndroid Build Coastguard Worker## 9*fb1b10abSAndroid Build Coastguard Worker## Sourcing this file sets environment variables to simplify setting up 10*fb1b10abSAndroid Build Coastguard Worker## sanitizer builds and testing. 11*fb1b10abSAndroid Build Coastguard Worker 12*fb1b10abSAndroid Build Coastguard Workersanitizer="${1}" 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Workercase "${sanitizer}" in 15*fb1b10abSAndroid Build Coastguard Worker address) ;; 16*fb1b10abSAndroid Build Coastguard Worker cfi) ;; 17*fb1b10abSAndroid Build Coastguard Worker integer) ;; 18*fb1b10abSAndroid Build Coastguard Worker memory) ;; 19*fb1b10abSAndroid Build Coastguard Worker thread) ;; 20*fb1b10abSAndroid Build Coastguard Worker undefined) ;; 21*fb1b10abSAndroid Build Coastguard Worker clear) 22*fb1b10abSAndroid Build Coastguard Worker echo "Clearing environment:" 23*fb1b10abSAndroid Build Coastguard Worker set -x 24*fb1b10abSAndroid Build Coastguard Worker unset CC CXX LD AR 25*fb1b10abSAndroid Build Coastguard Worker unset CFLAGS CXXFLAGS LDFLAGS 26*fb1b10abSAndroid Build Coastguard Worker unset ASAN_OPTIONS MSAN_OPTIONS TSAN_OPTIONS UBSAN_OPTIONS 27*fb1b10abSAndroid Build Coastguard Worker set +x 28*fb1b10abSAndroid Build Coastguard Worker return 29*fb1b10abSAndroid Build Coastguard Worker ;; 30*fb1b10abSAndroid Build Coastguard Worker *) 31*fb1b10abSAndroid Build Coastguard Worker echo "Usage: source set_analyzer_env.sh [<sanitizer>|clear]" 32*fb1b10abSAndroid Build Coastguard Worker echo " Supported sanitizers:" 33*fb1b10abSAndroid Build Coastguard Worker echo " address cfi integer memory thread undefined" 34*fb1b10abSAndroid Build Coastguard Worker return 1 35*fb1b10abSAndroid Build Coastguard Worker ;; 36*fb1b10abSAndroid Build Coastguard Workeresac 37*fb1b10abSAndroid Build Coastguard Worker 38*fb1b10abSAndroid Build Coastguard Workerif [ ! $(which clang) ]; then 39*fb1b10abSAndroid Build Coastguard Worker # TODO(johannkoenig): Support gcc analyzers. 40*fb1b10abSAndroid Build Coastguard Worker echo "ERROR: 'clang' must be in your PATH" 41*fb1b10abSAndroid Build Coastguard Worker return 1 42*fb1b10abSAndroid Build Coastguard Workerfi 43*fb1b10abSAndroid Build Coastguard Worker 44*fb1b10abSAndroid Build Coastguard Worker# Warnings. 45*fb1b10abSAndroid Build Coastguard Workerif [ "${sanitizer}" = "undefined" -o "${sanitizer}" = "integer" ]; then 46*fb1b10abSAndroid Build Coastguard Worker echo "WARNING: When building the ${sanitizer} sanitizer for 32 bit targets" 47*fb1b10abSAndroid Build Coastguard Worker echo "you must run:" 48*fb1b10abSAndroid Build Coastguard Worker echo "export LDFLAGS=\"\${LDFLAGS} --rtlib=compiler-rt -lgcc_s\"" 49*fb1b10abSAndroid Build Coastguard Worker echo "See http://llvm.org/bugs/show_bug.cgi?id=17693 for details." 50*fb1b10abSAndroid Build Coastguard Workerfi 51*fb1b10abSAndroid Build Coastguard Worker 52*fb1b10abSAndroid Build Coastguard Workerif [ "${sanitizer}" = "undefined" ]; then 53*fb1b10abSAndroid Build Coastguard Worker major_version=$(clang --version | head -n 1 \ 54*fb1b10abSAndroid Build Coastguard Worker | grep -o -E "[[:digit:]]\.[[:digit:]]\.[[:digit:]]" | cut -f1 -d.) 55*fb1b10abSAndroid Build Coastguard Worker if [ ${major_version} -eq 5 ]; then 56*fb1b10abSAndroid Build Coastguard Worker echo "WARNING: clang v5 has a problem with vp9 x86_64 high bit depth" 57*fb1b10abSAndroid Build Coastguard Worker echo "configurations. It can take ~40 minutes to compile" 58*fb1b10abSAndroid Build Coastguard Worker echo "vpx_dsp/x86/fwd_txfm_sse2.c" 59*fb1b10abSAndroid Build Coastguard Worker echo "clang v4 did not have this issue." 60*fb1b10abSAndroid Build Coastguard Worker fi 61*fb1b10abSAndroid Build Coastguard Workerfi 62*fb1b10abSAndroid Build Coastguard Worker 63*fb1b10abSAndroid Build Coastguard Workerecho "It is recommended to configure with '--enable-debug' to improve stack" 64*fb1b10abSAndroid Build Coastguard Workerecho "traces. On mac builds, run 'dysmutil' on the output binaries (vpxenc," 65*fb1b10abSAndroid Build Coastguard Workerecho "test_libvpx, etc) to link the stack traces to source code lines." 66*fb1b10abSAndroid Build Coastguard Worker 67*fb1b10abSAndroid Build Coastguard Worker# Build configuration. 68*fb1b10abSAndroid Build Coastguard Workercflags="-fsanitize=${sanitizer}" 69*fb1b10abSAndroid Build Coastguard Workerldflags="-fsanitize=${sanitizer}" 70*fb1b10abSAndroid Build Coastguard Worker 71*fb1b10abSAndroid Build Coastguard Worker# Useful backtraces. 72*fb1b10abSAndroid Build Coastguard Workercflags="${cflags} -fno-omit-frame-pointer" 73*fb1b10abSAndroid Build Coastguard Worker# Exact backtraces. 74*fb1b10abSAndroid Build Coastguard Workercflags="${cflags} -fno-optimize-sibling-calls" 75*fb1b10abSAndroid Build Coastguard Worker 76*fb1b10abSAndroid Build Coastguard Workerif [ "${sanitizer}" = "cfi" ]; then 77*fb1b10abSAndroid Build Coastguard Worker # https://clang.llvm.org/docs/ControlFlowIntegrity.html 78*fb1b10abSAndroid Build Coastguard Worker cflags="${cflags} -fno-sanitize-trap=cfi -flto -fvisibility=hidden" 79*fb1b10abSAndroid Build Coastguard Worker ldflags="${ldflags} -fno-sanitize-trap=cfi -flto -fuse-ld=gold" 80*fb1b10abSAndroid Build Coastguard Worker export AR="llvm-ar" 81*fb1b10abSAndroid Build Coastguard Workerfi 82*fb1b10abSAndroid Build Coastguard Worker 83*fb1b10abSAndroid Build Coastguard Workerset -x 84*fb1b10abSAndroid Build Coastguard Workerexport CC="clang" 85*fb1b10abSAndroid Build Coastguard Workerexport CXX="clang++" 86*fb1b10abSAndroid Build Coastguard Workerexport LD="clang++" 87*fb1b10abSAndroid Build Coastguard Worker 88*fb1b10abSAndroid Build Coastguard Workerexport CFLAGS="${cflags}" 89*fb1b10abSAndroid Build Coastguard Workerexport CXXFLAGS="${cflags}" 90*fb1b10abSAndroid Build Coastguard Workerexport LDFLAGS="${ldflags}" 91*fb1b10abSAndroid Build Coastguard Workerset +x 92*fb1b10abSAndroid Build Coastguard Worker 93*fb1b10abSAndroid Build Coastguard Worker# Execution configuration. 94*fb1b10abSAndroid Build Coastguard Workersanitizer_options="" 95*fb1b10abSAndroid Build Coastguard Workersanitizer_options="${sanitizer_options}:handle_segv=1" 96*fb1b10abSAndroid Build Coastguard Workersanitizer_options="${sanitizer_options}:handle_abort=1" 97*fb1b10abSAndroid Build Coastguard Workersanitizer_options="${sanitizer_options}:handle_sigfpe=1" 98*fb1b10abSAndroid Build Coastguard Workersanitizer_options="${sanitizer_options}:fast_unwind_on_fatal=1" 99*fb1b10abSAndroid Build Coastguard Workersanitizer_options="${sanitizer_options}:allocator_may_return_null=1" 100*fb1b10abSAndroid Build Coastguard Worker 101*fb1b10abSAndroid Build Coastguard Workercase "${sanitizer}" in 102*fb1b10abSAndroid Build Coastguard Worker address) 103*fb1b10abSAndroid Build Coastguard Worker sanitizer_options="${sanitizer_options}:detect_stack_use_after_return=1" 104*fb1b10abSAndroid Build Coastguard Worker sanitizer_options="${sanitizer_options}:max_uar_stack_size_log=17" 105*fb1b10abSAndroid Build Coastguard Worker set -x 106*fb1b10abSAndroid Build Coastguard Worker export ASAN_OPTIONS="${sanitizer_options}" 107*fb1b10abSAndroid Build Coastguard Worker set +x 108*fb1b10abSAndroid Build Coastguard Worker ;; 109*fb1b10abSAndroid Build Coastguard Worker cfi) 110*fb1b10abSAndroid Build Coastguard Worker # No environment settings 111*fb1b10abSAndroid Build Coastguard Worker ;; 112*fb1b10abSAndroid Build Coastguard Worker memory) 113*fb1b10abSAndroid Build Coastguard Worker set -x 114*fb1b10abSAndroid Build Coastguard Worker export MSAN_OPTIONS="${sanitizer_options}" 115*fb1b10abSAndroid Build Coastguard Worker set +x 116*fb1b10abSAndroid Build Coastguard Worker ;; 117*fb1b10abSAndroid Build Coastguard Worker thread) 118*fb1b10abSAndroid Build Coastguard Worker # The thread sanitizer uses an entirely independent set of options. 119*fb1b10abSAndroid Build Coastguard Worker set -x 120*fb1b10abSAndroid Build Coastguard Worker export TSAN_OPTIONS="halt_on_error=1" 121*fb1b10abSAndroid Build Coastguard Worker set +x 122*fb1b10abSAndroid Build Coastguard Worker ;; 123*fb1b10abSAndroid Build Coastguard Worker undefined|integer) 124*fb1b10abSAndroid Build Coastguard Worker sanitizer_options="${sanitizer_options}:print_stacktrace=1" 125*fb1b10abSAndroid Build Coastguard Worker set -x 126*fb1b10abSAndroid Build Coastguard Worker export UBSAN_OPTIONS="${sanitizer_options}" 127*fb1b10abSAndroid Build Coastguard Worker set +x 128*fb1b10abSAndroid Build Coastguard Worker ;; 129*fb1b10abSAndroid Build Coastguard Workeresac 130