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