# Copyright 2016 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")

config("warnings") {
  if (is_clang) {
    cflags = [
      "-Wno-shadow",

      # See crbug.com/932188, libFuzzer does not check the result of write()
      # when it does raw printing.
      "-Wno-unused-result",
    ]
  }
}

# Depend on this if you wish to use LLVMFuzzerRunDriver from within
# some existing code
source_set("libfuzzer") {
  sources = [
    "src/FuzzerCrossOver.cpp",
    "src/FuzzerDataFlowTrace.cpp",
    "src/FuzzerDriver.cpp",
    "src/FuzzerExtFunctionsDlsym.cpp",
    "src/FuzzerExtFunctionsWeak.cpp",
    "src/FuzzerExtFunctionsWindows.cpp",
    "src/FuzzerExtraCounters.cpp",
    "src/FuzzerExtraCountersDarwin.cpp",
    "src/FuzzerExtraCountersWindows.cpp",
    "src/FuzzerFork.cpp",
    "src/FuzzerIO.cpp",
    "src/FuzzerIOPosix.cpp",
    "src/FuzzerIOWindows.cpp",
    "src/FuzzerLoop.cpp",
    "src/FuzzerMerge.cpp",
    "src/FuzzerMutate.cpp",
    "src/FuzzerSHA1.cpp",
    "src/FuzzerTracePC.cpp",
    "src/FuzzerUtil.cpp",
    "src/FuzzerUtilDarwin.cpp",
    "src/FuzzerUtilFuchsia.cpp",
    "src/FuzzerUtilLinux.cpp",
    "src/FuzzerUtilPosix.cpp",
    "src/FuzzerUtilWindows.cpp",
  ]
  if (!using_sanitizer) {
    sources += [ "src/FuzzerInterceptors.cpp" ]
  }

  configs -= fuzzing_engine_remove_configs
  configs += fuzzing_engine_add_configs
  configs += [
    ":warnings",
    "//build/config/compiler:no_exit_time_destructors",
  ]

  if (is_android) {
    # Bypasses the "initial-exec" TLS model in libFuzzer's FuzzerPlatform.h
    # which causes dlopen() crashes when fuzzers are packaged as Android APKs.
    defines = [ "tls_model(x)=" ]
  }

  deps = []
  if (is_fuchsia) {
    deps += [ "//third_party/fuchsia-sdk/sdk:fdio" ]
  }
}

# Depend on this if you wish for libfuzzer to provide the main()
# function for your target.
source_set("libfuzzer_main") {
  deps = [ ":libfuzzer" ]
  configs -= fuzzing_engine_remove_configs
  configs += fuzzing_engine_add_configs
  sources = []
  if (!is_ios) {
    sources += [ "src/FuzzerMain.cpp" ]
  }
}
