# Copyright 2018 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_overrides/build.gni")
import("//build/config/sanitizers/sanitizers.gni")

if (build_with_chromium) {
  visibility = [
    "//third_party/webrtc/*",
    "//third_party/abseil-cpp/*",
    "//third_party/googletest:gtest",
  ]
} else {
  visibility = [ "*" ]
}

source_set("stacktrace") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "stacktrace.cc",
  ]
  public = [
    "stacktrace.h",
  ]
  deps = [
    ":debugging_internal",
    "../base",
    "../base:core_headers",
  ]
}

source_set("symbolize") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "symbolize.cc",
    "symbolize_elf.inc",
    "symbolize_unimplemented.inc",
    "symbolize_win32.inc",
  ]
  public = [
    "internal/symbolize.h",
    "symbolize.h",
  ]
  deps = [
    ":debugging_internal",
    ":demangle_internal",
    "../base",
    "../base:core_headers",
    "../base:malloc_internal",
  ]
}

source_set("examine_stack") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/examine_stack.cc",
  ]
  public = [
    "internal/examine_stack.h",
  ]
  visibility = []
  visibility += [ ":*" ]
  deps = [
    ":stacktrace",
    ":symbolize",
    "../base",
    "../base:core_headers",
  ]
}

source_set("failure_signal_handler") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "failure_signal_handler.cc",
  ]
  public = [
    "failure_signal_handler.h",
  ]
  deps = [
    ":examine_stack",
    ":stacktrace",
    "../base",
    "../base:config",
    "../base:core_headers",
  ]
}

source_set("debugging_internal") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/address_is_readable.cc",
    "internal/elf_mem_image.cc",
    "internal/vdso_support.cc",
  ]
  public = [
    "internal/address_is_readable.h",
    "internal/elf_mem_image.h",
    "internal/stacktrace_config.h",
    "internal/vdso_support.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
    "../base:dynamic_annotations",
  ]
}

source_set("demangle_internal") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/demangle.cc",
  ]
  public = [
    "internal/demangle.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
  ]
}

source_set("leak_check") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  if (is_ios || is_win) {
    sources = []
    public = []
  } else {
    sources = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
  }
  deps = [
    "../base:core_headers",
  ]
}

source_set("leak_check_disable") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "leak_check_disable.cc",
  ]
}

if (is_lsan) {
  source_set("leak_check_api_enabled_for_testing") {
    testonly = true
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//third_party/abseil-cpp:absl_default_cflags_cc",
    ]
    public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
    sources = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
    visibility = []
    visibility += [ ":*" ]
  }
} else {
  source_set("leak_check_api_disabled_for_testing") {
    testonly = true
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//third_party/abseil-cpp:absl_default_cflags_cc",
    ]
    public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
    sources = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
    visibility = []
    visibility += [ ":*" ]
  }
}

source_set("stack_consumption") {
  testonly = true
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/stack_consumption.cc",
  ]
  public = [
    "internal/stack_consumption.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
  ]
  visibility = []
  visibility += [ ":*" ]
}
