1c5f01b2fSopenharmony_ci//===- FuzzerExtFunctionsWeakAlias.cpp - Interface to external functions --===//
2c5f01b2fSopenharmony_ci//
3c5f01b2fSopenharmony_ci//                     The LLVM Compiler Infrastructure
4c5f01b2fSopenharmony_ci//
5c5f01b2fSopenharmony_ci// This file is distributed under the University of Illinois Open Source
6c5f01b2fSopenharmony_ci// License. See LICENSE.TXT for details.
7c5f01b2fSopenharmony_ci//
8c5f01b2fSopenharmony_ci//===----------------------------------------------------------------------===//
9c5f01b2fSopenharmony_ci// Implementation using weak aliases. Works for Windows.
10c5f01b2fSopenharmony_ci//===----------------------------------------------------------------------===//
11c5f01b2fSopenharmony_ci#include "FuzzerDefs.h"
12c5f01b2fSopenharmony_ci#if LIBFUZZER_WINDOWS
13c5f01b2fSopenharmony_ci
14c5f01b2fSopenharmony_ci#include "FuzzerExtFunctions.h"
15c5f01b2fSopenharmony_ci#include "FuzzerIO.h"
16c5f01b2fSopenharmony_ci
17c5f01b2fSopenharmony_ciusing namespace fuzzer;
18c5f01b2fSopenharmony_ci
19c5f01b2fSopenharmony_ciextern "C" {
20c5f01b2fSopenharmony_ci// Declare these symbols as weak to allow them to be optionally defined.
21c5f01b2fSopenharmony_ci#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                            \
22c5f01b2fSopenharmony_ci  RETURN_TYPE NAME##Def FUNC_SIG {                                             \
23c5f01b2fSopenharmony_ci    Printf("ERROR: Function \"%s\" not defined.\n", #NAME);                    \
24c5f01b2fSopenharmony_ci    exit(1);                                                                   \
25c5f01b2fSopenharmony_ci  }                                                                            \
26c5f01b2fSopenharmony_ci  RETURN_TYPE NAME FUNC_SIG __attribute__((weak, alias(#NAME "Def")));
27c5f01b2fSopenharmony_ci
28c5f01b2fSopenharmony_ci#include "FuzzerExtFunctions.def"
29c5f01b2fSopenharmony_ci
30c5f01b2fSopenharmony_ci#undef EXT_FUNC
31c5f01b2fSopenharmony_ci}
32c5f01b2fSopenharmony_ci
33c5f01b2fSopenharmony_citemplate <typename T>
34c5f01b2fSopenharmony_cistatic T *GetFnPtr(T *Fun, T *FunDef, const char *FnName, bool WarnIfMissing) {
35c5f01b2fSopenharmony_ci  if (Fun == FunDef) {
36c5f01b2fSopenharmony_ci    if (WarnIfMissing)
37c5f01b2fSopenharmony_ci      Printf("WARNING: Failed to find function \"%s\".\n", FnName);
38c5f01b2fSopenharmony_ci    return nullptr;
39c5f01b2fSopenharmony_ci  }
40c5f01b2fSopenharmony_ci  return Fun;
41c5f01b2fSopenharmony_ci}
42c5f01b2fSopenharmony_ci
43c5f01b2fSopenharmony_cinamespace fuzzer {
44c5f01b2fSopenharmony_ci
45c5f01b2fSopenharmony_ciExternalFunctions::ExternalFunctions() {
46c5f01b2fSopenharmony_ci#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                            \
47c5f01b2fSopenharmony_ci  this->NAME = GetFnPtr<decltype(::NAME)>(::NAME, ::NAME##Def, #NAME, WARN);
48c5f01b2fSopenharmony_ci
49c5f01b2fSopenharmony_ci#include "FuzzerExtFunctions.def"
50c5f01b2fSopenharmony_ci
51c5f01b2fSopenharmony_ci#undef EXT_FUNC
52c5f01b2fSopenharmony_ci}
53c5f01b2fSopenharmony_ci
54c5f01b2fSopenharmony_ci} // namespace fuzzer
55c5f01b2fSopenharmony_ci
56c5f01b2fSopenharmony_ci#endif // LIBFUZZER_WINDOWS
57