12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- //=== FuzzerExtWindows.cpp - Interface to external functions --------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- // Implementation of FuzzerExtFunctions for Windows. Uses alternatename when
- // compiled with MSVC. Uses weak aliases when compiled with clang. Unfortunately
- // the method each compiler supports is not supported by the other.
- //===----------------------------------------------------------------------===//
- #include "FuzzerPlatform.h"
- #if LIBFUZZER_WINDOWS
- #include "FuzzerExtFunctions.h"
- #include "FuzzerIO.h"
- using namespace fuzzer;
- // Intermediate macro to ensure the parameter is expanded before stringified.
- #define STRINGIFY_(A) #A
- #define STRINGIFY(A) STRINGIFY_(A)
- #if LIBFUZZER_MSVC
- // Copied from compiler-rt/lib/sanitizer_common/sanitizer_win_defs.h
- #if defined(_M_IX86) || defined(__i386__)
- #define WIN_SYM_PREFIX "_"
- #else
- #define WIN_SYM_PREFIX
- #endif
- // Declare external functions as having alternativenames, so that we can
- // determine if they are not defined.
- #define EXTERNAL_FUNC(Name, Default) \
- __pragma(comment(linker, "/alternatename:" WIN_SYM_PREFIX STRINGIFY( \
- Name) "=" WIN_SYM_PREFIX STRINGIFY(Default)))
- #else
- // Declare external functions as weak to allow them to default to a specified
- // function if not defined explicitly. We must use weak symbols because clang's
- // support for alternatename is not 100%, see
- // https://bugs.llvm.org/show_bug.cgi?id=40218 for more details.
- #define EXTERNAL_FUNC(Name, Default) \
- __attribute__((weak, alias(STRINGIFY(Default))))
- #endif // LIBFUZZER_MSVC
- extern "C" {
- #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
- RETURN_TYPE NAME##Def FUNC_SIG { \
- Printf("ERROR: Function \"%s\" not defined.\n", #NAME); \
- exit(1); \
- } \
- EXTERNAL_FUNC(NAME, NAME##Def) RETURN_TYPE NAME FUNC_SIG
- #include "FuzzerExtFunctions.def"
- #undef EXT_FUNC
- }
- template <typename T>
- static T *GetFnPtr(T *Fun, T *FunDef, const char *FnName, bool WarnIfMissing) {
- if (Fun == FunDef) {
- if (WarnIfMissing)
- Printf("WARNING: Failed to find function \"%s\".\n", FnName);
- return nullptr;
- }
- return Fun;
- }
- namespace fuzzer {
- ExternalFunctions::ExternalFunctions() {
- #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
- this->NAME = GetFnPtr<decltype(::NAME)>(::NAME, ::NAME##Def, #NAME, WARN);
- #include "FuzzerExtFunctions.def"
- #undef EXT_FUNC
- }
- } // namespace fuzzer
- #endif // LIBFUZZER_WINDOWS
|