# Copyright 2018 The Chromium Authors
# 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("//flutter/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",
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//flutter/third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_test("stacktrace_test") {
  sources = ["stacktrace_test.cc"]
  deps = [
    ":stacktrace",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
  ]
}

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",
    "//flutter/third_party/abseil-cpp/absl/base",
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//flutter/third_party/abseil-cpp/absl/base:malloc_internal",
    "//flutter/third_party/abseil-cpp/absl/base:raw_logging_internal",
    "//flutter/third_party/abseil-cpp/absl/strings",
    "//flutter/third_party/abseil-cpp/absl/strings:string_view",
  ]

  # 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 = [
    ":*",
    "//flutter/third_party/abseil-cpp/absl/log/internal:*",
  ]
  deps = [
    ":stacktrace",
    ":symbolize",
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/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",
    "//flutter/third_party/abseil-cpp/absl/base",
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/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 = [
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/third_party/abseil-cpp/absl/base:dynamic_annotations",
    "//flutter/third_party/abseil-cpp/absl/base:errno_saver",
    "//flutter/third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
}

absl_source_set("demangle_internal") {
  sources = [ "internal/demangle.cc" ]
  public = [ "internal/demangle.h" ]
  visibility = [
    "//flutter/third_party/abseil-cpp/absl/container:*",
    "//flutter/third_party/abseil-cpp/absl/debugging:*",
  ]
  deps = [
    "//flutter/third_party/abseil-cpp/absl/base",
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/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 = [
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/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 = [
    "//flutter/third_party/abseil-cpp/absl/base:config",
    "//flutter/third_party/abseil-cpp/absl/base:core_headers",
    "//flutter/third_party/abseil-cpp/absl/base:raw_logging_internal",
  ]
  visibility = [ ":*" ]
}
