| # Copyright 2020 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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. |
| |
| import("//build_overrides/pigweed.gni") |
| import("//build_overrides/pigweed_environment.gni") |
| |
| # See https://github.com/google/sanitizers |
| config("sanitize_address") { |
| cflags = [ "-fsanitize=address" ] |
| ldflags = cflags |
| } |
| |
| config("sanitize_memory") { |
| cflags = [ |
| "-fsanitize=memory", |
| |
| # Do not optimizes tail recursive calls to get better call stack. |
| "-fno-optimize-sibling-calls", |
| |
| # Enable check after destruction detection. |
| "-fsanitize-memory-use-after-dtor", |
| ] |
| ldflags = cflags |
| } |
| |
| config("sanitize_undefined") { |
| cflags = [ |
| "-fsanitize=undefined", |
| |
| # Store the stack frame pointer in a register to get proper debug |
| # information. |
| "-fno-omit-frame-pointer", |
| |
| # Exit the program on check failure. (The default is to continue execution, |
| # which prevents test frameworks from realizing the test has failed.) |
| "-fno-sanitize-recover=undefined", |
| ] |
| ldflags = cflags |
| } |
| |
| # UBsan configuration that enables additional checks. These checks are |
| # heuristic and may not correspond to undefined behavior. |
| config("sanitize_undefined_heuristic") { |
| sanitizers = [ |
| # Base checks for undefined behaviour. |
| "undefined", |
| |
| # Checks for undefined or suspicious integer behavior. |
| "integer", |
| |
| # Checks for floating point division by zero. |
| "float-divide-by-zero", |
| |
| # Checks for suspicious behavior of implicit conversions. |
| "implicit-conversion", |
| |
| # Checks for null as function arg, lvalue and return type. |
| "nullability", |
| ] |
| cflags = [ |
| "-fsanitize=" + string_join(",", sanitizers), |
| |
| # Store the stack frame pointer in a register to get proper debug |
| # information. |
| "-fno-omit-frame-pointer", |
| ] |
| ldflags = cflags |
| } |
| |
| config("sanitize_thread") { |
| cflags = [ "-fsanitize=thread" ] |
| ldflags = cflags |
| } |
| |
| config("sanitize_coverage") { |
| cflags = [ |
| "-fprofile-instr-generate", |
| "-fcoverage-mapping", |
| ] |
| ldflags = cflags |
| } |
| |
| # Locate XCode's sysroot for Clang. |
| config("xcode_sysroot") { |
| if (current_os == "mac") { |
| _xcode_sysroot = exec_script("$dir_pw_build/py/pw_build/exec.py", |
| [ |
| "--", |
| "/usr/bin/xcrun", |
| "--show-sdk-path", |
| ], |
| "trim string") |
| cflags = [ "--sysroot=$_xcode_sysroot" ] |
| ldflags = cflags |
| } |
| } |
| |
| config("linux_sysroot") { |
| if (current_os == "linux") { |
| cflags = [ "--sysroot=" + |
| rebase_path(pw_env_setup_CIPD_PIGWEED, root_build_dir) + |
| "/clang_sysroot/" ] |
| ldflags = cflags |
| } |
| } |
| |
| # The CIPD provided Clang/LLVM toolchain must link against the matched |
| # libc++ which is also from CIPD. However, by default, Clang on Mac (but |
| # not on Linux) will fall back to the system libc++, which is |
| # incompatible due to an ABI change. |
| # |
| # Pull the appropriate paths from our Pigweed env setup. |
| config("no_system_libcpp") { |
| if (current_os == "mac") { |
| install_dir = pw_env_setup_CIPD_PIGWEED |
| assert(install_dir != "", |
| "You forgot to activate the Pigweed environment; " + |
| "did you source pw_env_setup/setup.sh?") |
| ldflags = [ |
| # Force dropping the system libc++ |
| "-nostdlib++", |
| |
| # Use the libc++ from CIPD. |
| rebase_path(pw_env_setup_CIPD_PIGWEED + "/lib/libc++.a", root_build_dir), |
| ] |
| } |
| } |