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