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