# 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",
  ]
  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
}
