xref: /openbsd-src/gnu/llvm/compiler-rt/lib/fuzzer/FuzzerExtFunctionsWeak.cpp (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===- FuzzerExtFunctionsWeak.cpp - Interface to external functions -------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick // Implementation for Linux. This relies on the linker's support for weak
93cab2bb3Spatrick // symbols. We don't use this approach on Apple platforms because it requires
103cab2bb3Spatrick // clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow
113cab2bb3Spatrick // weak symbols to be undefined. That is a complication we don't want to expose
123cab2bb3Spatrick // to clients right now.
133cab2bb3Spatrick //===----------------------------------------------------------------------===//
141f9cb04fSpatrick #include "FuzzerPlatform.h"
153cab2bb3Spatrick #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA ||                \
16*d89ec533Spatrick     LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN
173cab2bb3Spatrick 
183cab2bb3Spatrick #include "FuzzerExtFunctions.h"
193cab2bb3Spatrick #include "FuzzerIO.h"
203cab2bb3Spatrick 
213cab2bb3Spatrick extern "C" {
223cab2bb3Spatrick // Declare these symbols as weak to allow them to be optionally defined.
233cab2bb3Spatrick #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                            \
243cab2bb3Spatrick   __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG
253cab2bb3Spatrick 
263cab2bb3Spatrick #include "FuzzerExtFunctions.def"
273cab2bb3Spatrick 
283cab2bb3Spatrick #undef EXT_FUNC
293cab2bb3Spatrick }
303cab2bb3Spatrick 
313cab2bb3Spatrick using namespace fuzzer;
323cab2bb3Spatrick 
CheckFnPtr(void * FnPtr,const char * FnName,bool WarnIfMissing)333cab2bb3Spatrick static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) {
343cab2bb3Spatrick   if (FnPtr == nullptr && WarnIfMissing) {
353cab2bb3Spatrick     Printf("WARNING: Failed to find function \"%s\".\n", FnName);
363cab2bb3Spatrick   }
373cab2bb3Spatrick }
383cab2bb3Spatrick 
393cab2bb3Spatrick namespace fuzzer {
403cab2bb3Spatrick 
ExternalFunctions()413cab2bb3Spatrick ExternalFunctions::ExternalFunctions() {
423cab2bb3Spatrick #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                            \
433cab2bb3Spatrick   this->NAME = ::NAME;                                                         \
443cab2bb3Spatrick   CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)),    \
453cab2bb3Spatrick              #NAME, WARN);
463cab2bb3Spatrick 
473cab2bb3Spatrick #include "FuzzerExtFunctions.def"
483cab2bb3Spatrick 
493cab2bb3Spatrick #undef EXT_FUNC
503cab2bb3Spatrick }
513cab2bb3Spatrick 
523cab2bb3Spatrick } // namespace fuzzer
533cab2bb3Spatrick 
543cab2bb3Spatrick #endif
55