blob: 50012cfdf9429a8fd67422e30b2438535ef59abe [file] [log] [blame]
# Copyright 2018 The Fuchsia 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("//build/config/profile/config.gni")
import("//build/toolchain/variant.gni")
if (profile_source_files != []) {
# This can't use a generated_file() target because there's no way to
# express the deps to make GN accept the file in the inputs list if it's
# the output of some target.
_profile_source_files_file = "$root_out_dir/profile-source-files.list"
_profile_source_files_lines = []
foreach(file, profile_source_files) {
_profile_source_files_lines +=
[ "src:" + rebase_path(file, root_build_dir) ]
}
write_file(_profile_source_files_file,
_profile_source_files_lines,
"list lines")
profile_source_files_list_files += [ _profile_source_files_file ]
}
# Common flags for all coverage-based variants defined below.
# IMPORTANT: This should not include any rust or linker flags!
_coverage_common_flags = [
"-fprofile-instr-generate",
"-fcoverage-mapping",
]
_coverage_inputs = profile_source_files_list_files
foreach(file, profile_source_files_list_files) {
_coverage_common_flags +=
[ "-fprofile-list=" + rebase_path(file, root_build_dir) ]
}
variant("coverage") {
common_flags = _coverage_common_flags
inputs = _coverage_inputs
if (!is_kernel && is_fuchsia) {
# The statically-linked profiling runtime depends on libzircon.
# TODO(fxbug.dev/61522): Ensure this works with shared_library() instances too!
deps = [ "//src/zircon/lib/zircon" ]
dynamic_linker_flags = "-dynamic-linker=coverage/ld.so.1"
ldflags = [ "-Wl,$dynamic_linker_flags" ]
rustflags = [ "-Clink-arg=$dynamic_linker_flags" ]
}
}
# This variant is similar to `coverage` but is used to only compile sdk_source_set()
# targets with coverage instrumentation. This works as follows:
#
# - Unlike `coverage`, this variant does not add assembler and compiler flags
# to enable profiling instrumentation.
#
# - The sdk_source_set() template adds the "coverage-sdk-source-config" config
# to its inner target when they are built in the "coverage-sdk" variant. This
# adds the necessary cflags/asmflags when building the target.
#
# - All final binaries (executables and shared libraries) are linked to the
# profiling runtime. Even if none of their code is actually instrumented.
#
# - Since this is an instrumented build variant, the libprefix is 'lib/coverage-sdk'
#
variant("coverage-sdk") {
inputs = _coverage_inputs
if (!is_kernel && is_fuchsia) {
# The statically-linked profiling runtime depends on libzircon.
# TODO(fxbug.dev/61522): Ensure this works with shared_library() instances too!
deps = [ "//src/zircon/lib/zircon" ]
}
# All instrumented build variants place their dynamic loader and dependency
# libraries under lib/<variant>/ so ensure generated executables will find
# it here.
dynamic_linker_flags = "-dynamic-linker=coverage-sdk/ld.so.1"
ldflags = [ "-Wl,$dynamic_linker_flags" ]
rustflags = [ "-Clink-arg=$dynamic_linker_flags" ]
ldflags += [ "-fprofile-instr-generate" ]
}
# This config should only be added to sdk_source_set() targets.
config("coverage-sdk-source-config") {
cflags = _coverage_common_flags
asmflags = _coverage_common_flags
}
variant("profile") {
common_flags = _coverage_common_flags
inputs = profile_source_files_list_files
foreach(file, profile_source_files_list_files) {
common_flags += [ "-fprofile-list=" + rebase_path(file, root_build_dir) ]
}
if (!is_kernel && is_fuchsia) {
# The statically-linked profiling runtime depends on libzircon.
# TODO(fxbug.dev/61522): Ensure this works with shared_library() instances too!
deps = [ "//src/zircon/lib/zircon" ]
dynamic_linker_flags = "-dynamic-linker=profile/ld.so.1"
ldflags = [ "-Wl,$dynamic_linker_flags" ]
rustflags = [ "-Clink-arg=$dynamic_linker_flags" ]
}
}
# Only enable either "coverage-rust" or clang coverage (variant("profile") or variant("coverage")),
# not both.
#
# -Zinstrument-coverage is known to work with -Copt-level=1 (or 2 or 3, possibly others)
# in tested cases. If helpful, we may want to include it.
#
# DO NOT NAME THIS WITH PREFIX `rust-`. The prefix will be stripped in some cases, and fail to
# work with other cases that do not expect the stripped prefix.
variant("coverage-rust") {
if (!is_kernel && is_fuchsia) {
# The statically-linked profiling runtime depends on libzircon.
# TODO(fxbug.dev/61522): Ensure this works with shared_library() instances too!
deps = [ "//src/zircon/lib/zircon" ]
dynamic_linker_flags = "-dynamic-linker=coverage-rust/ld.so.1"
ldflags = [ "-Wl,$dynamic_linker_flags" ]
rustflags = [
"-Zinstrument-coverage",
"-Clink-arg=$dynamic_linker_flags",
]
}
}