| Index: chrome/tools/build/win/syzygy/BUILD.gn
|
| diff --git a/chrome/tools/build/win/syzygy/BUILD.gn b/chrome/tools/build/win/syzygy/BUILD.gn
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..14aa6fc7eb4d94e561c17a3af624f7fbd28c20b7
|
| --- /dev/null
|
| +++ b/chrome/tools/build/win/syzygy/BUILD.gn
|
| @@ -0,0 +1,221 @@
|
| +# Copyright 2015 The Chromium 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/chrome_build.gni")
|
| +import("//build/config/sanitizers/sanitizers.gni")
|
| +
|
| +declare_args() {
|
| + # Generate Syzygy optimized binaries. Syzygy optimize mode is a profile
|
| + # guided optimization that reorders code for better locality.
|
| + syzygy_optimize =
|
| + is_win && is_official_build && !is_clang && symbol_level == 2
|
| +}
|
| +
|
| +assert(!syzygy_optimize || !is_syzyasan,
|
| + "Don't do both syzygy_optimize and is_syzyasan")
|
| +
|
| +# Where the output binaries will be placed.
|
| +syzygy_dest_dir = "$root_out_dir/syzygy"
|
| +
|
| +if (syzygy_optimize) {
|
| + # Generates a Syzygy optimize target.
|
| + #
|
| + # dll_name (required)
|
| + # Name of the DLL to be instrumented, with no extension or path. This
|
| + # ${dll_name}.dll is assumed to be in the output directory and must be
|
| + # generated by a dependency of this target.
|
| + #
|
| + # deps (required)
|
| + # Normal meaning.
|
| + template("syzygy_optimize") {
|
| + action(target_name) {
|
| + if (defined(invoker.visibility)) {
|
| + visibility = invoker.visibility
|
| + }
|
| + script = "//chrome/tools/build/win/syzygy/reorder.py"
|
| +
|
| + dll_name = invoker.dll_name
|
| + input_dll = "$root_out_dir/$dll_name.dll"
|
| + input_pdb = "$root_out_dir/$dll_name.dll.pdb"
|
| +
|
| + inputs = [
|
| + input_dll,
|
| + #input_pdb,
|
| + ]
|
| +
|
| + outputs = [
|
| + "$syzygy_dest_dir/$dll_name.dll",
|
| + "$syzygy_dest_dir/$dll_name.dll.pdb",
|
| + ]
|
| +
|
| + args = [
|
| + "--input_executable",
|
| + rebase_path(input_dll, root_build_dir),
|
| + "--input_symbol",
|
| + rebase_path(input_pdb, root_build_dir),
|
| + "--destination_dir",
|
| + rebase_path(syzygy_dest_dir, root_build_dir),
|
| + ]
|
| +
|
| + if (defined(invoker.deps)) {
|
| + deps = invoker.deps
|
| + }
|
| + }
|
| + }
|
| +
|
| + syzygy_optimize("chrome_dll_syzygy") {
|
| + dll_name = "chrome"
|
| + deps = [
|
| + "//chrome:main_dll",
|
| + ]
|
| + }
|
| + if (is_multi_dll_chrome) {
|
| + # Also instrument chrome_child.dll.
|
| + syzygy_optimize("chrome_child_dll_syzygy") {
|
| + dll_name = "chrome_child"
|
| + deps = [
|
| + "//chrome:chrome_child",
|
| + ]
|
| + }
|
| + }
|
| +} else if (is_syzyasan) {
|
| + # Instruments a binary with SyzyAsan.
|
| + #
|
| + # dll_name (required)
|
| + # Name of the DLL to be instrumented, with no extension or path. This
|
| + # ${dll_name}.dll is assumed to be in the output directory and must be
|
| + # generated by a dependency of this target.
|
| + #
|
| + # deps (required)
|
| + # Normal meaning.
|
| + template("syzygy_asan") {
|
| + action(target_name) {
|
| + if (defined(invoker.visibility)) {
|
| + visibility = invoker.visibility
|
| + }
|
| + script = "//chrome/tools/build/win/syzygy/instrument.py"
|
| +
|
| + filter = "syzyasan-instrumentation-filter.txt"
|
| + input_dll = "$root_out_dir/$dll_name.dll"
|
| + input_pdb = "$root_out_dir/$dll_name.dll.pdb"
|
| +
|
| + inputs = [
|
| + filter,
|
| + input_dll,
|
| +
|
| + #input_pdb,
|
| + ]
|
| +
|
| + output_filter = "$syzygy_dest_dir/win-syzyasan-filter-$dll_name.txt.json"
|
| +
|
| + outputs = [
|
| + "$syzygy_dest_dir/$dll_name.dll",
|
| + "$syzygy_dest_dir/$dll_name.dll.pdb",
|
| + output_filter,
|
| + ]
|
| +
|
| + args = [
|
| + "--mode",
|
| + "asan",
|
| + "--input_executable",
|
| + rebase_path(input_dll, root_build_dir),
|
| + "--input_symbol",
|
| + rebase_path(input_pdb, root_build_dir),
|
| + "--filter",
|
| + rebase_path(filter, root_build_dir),
|
| + "--output-filter-file",
|
| + rebase_path(output_filter, root_build_dir),
|
| + "--destination_dir",
|
| + rebase_path(syzygy_dest_dir, root_build_dir),
|
| + ]
|
| +
|
| + deps = [
|
| + "//chrome/tools/build/win/syzygy:copy_syzyasan_binaries",
|
| + ]
|
| + if (defined(invoker.deps)) {
|
| + deps += invoker.deps
|
| + }
|
| + if (defined(invoker.public_deps)) {
|
| + public_deps = invoker.public_deps
|
| + }
|
| + }
|
| + }
|
| +
|
| + syzygy_asan("chrome_dll_syzygy") {
|
| + dll_name = "chrome"
|
| + deps = [
|
| + "//chrome:main_dll",
|
| + ]
|
| + }
|
| +
|
| + if (is_multi_dll_chrome) {
|
| + # Also instrument chrome_child.dll.
|
| + #
|
| + # For official builds, the instrumented version will be put into an
|
| + # "instrumented" subdirectory and the regular output will be
|
| + # uninstrumented. Otherwise, chrome_child is also instrumented to the
|
| + # normal place.
|
| + syzygy_asan("chrome_child_dll_syzygy") {
|
| + dll_name = "chrome_child"
|
| + deps = [
|
| + "//chrome:chrome_child",
|
| + ]
|
| +
|
| + if (is_official_build) {
|
| + dest_dir = "$syzygy_dest_dir/instrumented"
|
| + deps += [ ":chrome_child_dll_syzygy_copy" ]
|
| + } else {
|
| + dest_dir = syzygy_dest_dir
|
| + }
|
| + }
|
| +
|
| + if (is_official_build) {
|
| + # Copies the uninstrumented chrome_child.dll.
|
| + # GYP version: chrome/chrome_syzygy.gyp:chrome_child_dll_syzygy_copy
|
| + copy("chrome_child_dll_syzygy_copy") {
|
| + sources = [
|
| + "$root_out_dir/chrome_child.dll",
|
| + "$root_out_dir/chrome_child.dll.pdb",
|
| + ]
|
| + outputs = [
|
| + "$syzygy_dest_dir/{{source_file_part}}",
|
| + ]
|
| + deps = [
|
| + "//chrome:chrome_child",
|
| + ]
|
| + }
|
| + }
|
| + }
|
| +} else {
|
| + # No syzygy. Generate dummy targets so other targets can unconditionally
|
| + # depend on these without having to duplicate our conditions.
|
| + group("chrome_dll_syzygy") {
|
| + }
|
| + if (is_multi_dll_chrome) {
|
| + group("chrome_child_dll_syzygy") {
|
| + }
|
| + }
|
| +}
|
| +
|
| +if (is_syzyasan || syzygy_optimize) {
|
| + copy("copy_syzyasan_binaries") {
|
| + visibility = [ "//chrome/*" ]
|
| +
|
| + source_dir = "//third_party/syzygy/binaries/exe"
|
| +
|
| + sources = [
|
| + "$source_dir/agent_logger.exe",
|
| + "$source_dir/minidump_symbolizer.py",
|
| + "$source_dir/syzyasan_rtl.dll",
|
| + "$source_dir/syzyasan_rtl.dll.pdb",
|
| + ]
|
| +
|
| + outputs = [
|
| + "$syzygy_dest_dir/{{source_file_part}}",
|
| + ]
|
| + }
|
| +}
|
| +
|
| +# Prevent unused variable warning for code paths where this is unused.
|
| +assert(syzygy_dest_dir != "")
|
|
|