xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/fuzzer/FuzzerExtFunctionsWeakAlias.cpp (revision a7c257b03e4462df2b1020128fb82716512d7856)
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