//===- FuzzerExtFunctionsWeak.cpp - Interface to external functions -------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// Implementation for Linux. This relies on the linker's support for weak
// symbols. We don't use this approach on Apple platforms because it requires
// clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow
// weak symbols to be undefined. That is a complication we don't want to expose
// to clients right now.
//===----------------------------------------------------------------------===//
#include "FuzzerPlatform.h"
#if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA || \
    LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD || LIBFUZZER_EMSCRIPTEN

  #include "FuzzerExtFunctions.h"
  #include "FuzzerIO.h"

extern "C" {

  // Declare these symbols as weak to allow them to be optionally defined.
  #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
    __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG

  #include "FuzzerExtFunctions.def"

  #undef EXT_FUNC

}

using namespace fuzzer;

static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) {

  if (FnPtr == nullptr && WarnIfMissing) {

    Printf("WARNING: Failed to find function \"%s\".\n", FnName);

  }

}

namespace fuzzer {

ExternalFunctions::ExternalFunctions() {
\
  #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                         \
    this->NAME = ::NAME;                                                      \
    CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)), \
               #NAME, WARN);

  #include "FuzzerExtFunctions.def"

  #undef EXT_FUNC

}

}  // namespace fuzzer

#endif

