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