# 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/config/sanitizers/sanitizers.gni")
import("//third_party/abseil-cpp/absl.gni")

absl_source_set("stacktrace") {
  sources = [
    "internal/stacktrace_aarch64-inl.inc",
    "internal/stacktrace_arm-inl.inc",
    "internal/stacktrace_config.h",
    "internal/stacktrace_emscripten-inl.inc",
    "internal/stacktrace_generic-inl.inc",
    "internal/stacktrace_powerpc-inl.inc",
    "internal/stacktrace_riscv-inl.inc",
    "internal/stacktrace_unimplemented-inl.inc",
    "internal/stacktrace_win32-inl.inc",
    "internal/stacktrace_x86-inl.inc",
    "stacktrace.cc",
  ]
  public = [ "stacktrace.h" ]
  deps = [
    ":debugging_internal",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_source_set("symbolize") {
  sources = [
    "symbolize.cc",
    "symbolize_darwin.inc",
    "symbolize_elf.inc",
    "symbolize_emscripten.inc",
    "symbolize_unimplemented.inc",
    "symbolize_win32.inc",
  ]
  public = [
    "internal/symbolize.h",
    "symbolize.h",
  ]
  deps = [
    ":debugging_internal",
    ":demangle_internal",
    "//third_party/abseil-cpp/absl/base",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//third_party/abseil-cpp/absl/base:malloc_internal",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//third_party/abseil-cpp/absl/strings",
  ]

  # TODO(mbonadei): The bazel file has:
  #   -DEFAULTLIB:dbghelp.lib
  # evaluate if this needs to be added here as well.
}

absl_source_set("examine_stack") {
  sources = [ "internal/examine_stack.cc" ]
  public = [ "internal/examine_stack.h" ]
  visibility = [ ":*" ]
  deps = [
    ":stacktrace",
    ":symbolize",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_source_set("failure_signal_handler") {
  sources = [ "failure_signal_handler.cc" ]
  public = [ "failure_signal_handler.h" ]
  deps = [
    ":examine_stack",
    ":stacktrace",
    "//third_party/abseil-cpp/absl/base",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:errno_saver",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_source_set("debugging_internal") {
  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/vdso_support.h",
  ]
  visibility = [ ":*" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//third_party/abseil-cpp/absl/base:errno_saver",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_source_set("demangle_internal") {
  sources = [ "internal/demangle.cc" ]
  public = [ "internal/demangle.h" ]
  visibility = [ ":*" ]
  deps = [
    "//third_party/abseil-cpp/absl/base",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
  ]
}

absl_source_set("leak_check") {
  if (is_ios || is_win) {
    sources = []
    public = []
  } else {
    sources = [ "leak_check.cc" ]
    public = [ "leak_check.h" ]
  }
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
  ]
}

absl_source_set("leak_check_disable") {
  sources = [ "leak_check_disable.cc" ]
  deps = [ "//third_party/abseil-cpp/absl/base:config" ]
}

if (is_lsan) {
  absl_source_set("leak_check_api_enabled_for_testing") {
    testonly = true
    sources = [ "leak_check.cc" ]
    public = [ "leak_check.h" ]
    visibility = [ ":*" ]
    deps = [
      "//third_party/abseil-cpp/absl/base:config",
      "//third_party/abseil-cpp/absl/base:core_headers",
    ]
  }
} else {
  absl_source_set("leak_check_api_disabled_for_testing") {
    testonly = true
    sources = [ "leak_check.cc" ]
    public = [ "leak_check.h" ]
    visibility = [ ":*" ]
    deps = [
      "//third_party/abseil-cpp/absl/base:config",
      "//third_party/abseil-cpp/absl/base:core_headers",
    ]
  }
}

absl_source_set("stack_consumption") {
  testonly = true
  sources = [ "internal/stack_consumption.cc" ]
  public = [ "internal/stack_consumption.h" ]
  deps = [
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
  visibility = [ ":*" ]
}
