# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import("tcmalloc_sources.gni")

config("internal_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  cflags = [
    "-Wall",
    "-Wextra",
    "-Wno-format",
    "-Wno-missing-field-initializers",
    "-Wno-sign-compare",
    "-Wno-type-limits",
    "-Wno-unused-result",
    "-Wno-unused-parameter",
    "-Wno-unused-function",
    "-Wno-vla",
    "-g3",
    "-ggdb3",
    "-fstack-protector",
    "-Wa,--noexecstack",
    "-fno-omit-frame-pointer",
    "-fno-builtin-malloc",
    "-fno-builtin-free",
    "-fno-builtin-realloc",
    "-fno-builtin-calloc",
    "-fno-builtin-cfree",
    "-fno-builtin-memalign",
    "-fno-builtin-posix_memalign",
    "-fno-builtin-valloc",
    "-fno-builtin-pvalloc",
    "-fsized-deallocation",
    "-faligned-new",
  ]
  if (is_clang) {
    cflags += [ "-Wno-unused-const-variable" ]
  }
  if (current_cpu == "arm" && !is_clang) {
    cflags += [ "-Wno-psabi" ]
  }
}

config("link_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  ldflags = [
    # Don't let linker rip this symbol out, otherwise the heap&cpu
    # profilers will not initialize properly on startup.
    "-Wl,-uIsHeapProfilerRunning,-uProfilerStart",
  ]
}

source_set("dynamic_annotations") {
  configs -= [
    "//build/config/compiler:chromium_code",
    "//build/config/compiler:clang_stackrealign",
  ]
  configs += [ ":internal_config" ]

  include_dirs = [
    "include",
    "gperftools/src/base",
    "gperftools/src",
  ]

  sources = [
    "gperftools/src/base/dynamic_annotations.c",
    "gperftools/src/base/dynamic_annotations.h",
  ]
}

source_set("tcmalloc") {
  configs -= [
    "//build/config/compiler:chromium_code",
    "//build/config/compiler:clang_stackrealign",
    "//build/config/compiler:compiler_arm_thumb",
  ]
  configs += [ ":internal_config" ]

  public_configs = [ ":link_config" ]

  deps = [
    ":dynamic_annotations",
  ]

  include_dirs = [
    "include",
    "gperftools/src/base",
    "gperftools/src",
  ]

  # Disable the heap checker in tcmalloc.
  defines = [
    "ENABLE_EMERGENCY_MALLOC",
    "NO_HEAP_CHECK",

    # Disable debug even in a Dart Debug build. It is too slow.
    "NDEBUG",
  ]

  if (is_product) {
    # Disable stack sampling for heap profiling in Product builds.
    defines += [ "NO_TCMALLOC_SAMPLES" ]

    # To override the C library functions, we can't hide symbols.
    configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
  }

  cflags = [
    "-Wnon-virtual-dtor",
    "-Woverloaded-virtual",
    "-fno-rtti",
    "-fpermissive",
  ]

  if (!is_clang) {
    cflags += [ "-Wno-format" ]
  }

  set_sources_assignment_filter([
                                  # No debug allocator.
                                  "gperftools/src/debugallocation.cc",

                                  # Not needed when using emergency malloc.
                                  "gperftools/src/fake_stacktrace_scope.cc",

                                  # Not using the cpuprofiler
                                  "gperftools/src/base/thread_lister.c",
                                  "gperftools/src/base/thread_lister.h",
                                  "gperftools/src/profile-handler.cc",
                                  "gperftools/src/profile-handler.h",
                                  "gperftools/src/profiledata.cc",
                                  "gperftools/src/profiledata.h",
                                  "gperftools/src/profiler.cc",
                                ])

  sources = tcmalloc_sources
}
