diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2017-08-21 23:25:50 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2017-08-21 23:25:50 +0000 |
commit | 10ab2ace1359fd96cd662ad235797e29f9ba3daa (patch) | |
tree | c5d47c489b54be9c936b8c27a6c89baad3294d61 /compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp | |
parent | 9f6f74c2c5ef8bb1e9fa9b0f2c7c3e31d69e62ac (diff) | |
download | bcm5719-llvm-10ab2ace1359fd96cd662ad235797e29f9ba3daa.tar.gz bcm5719-llvm-10ab2ace1359fd96cd662ad235797e29f9ba3daa.zip |
Move libFuzzer to compiler_rt.
Resulting library binaries will be named libclang_rt.fuzzer*, and will
be placed in Clang toolchain, allowing redistribution.
Differential Revision: https://reviews.llvm.org/D36908
llvm-svn: 311407
Diffstat (limited to 'compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp b/compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp new file mode 100644 index 00000000000..321b3ec5d41 --- /dev/null +++ b/compiler-rt/lib/fuzzer/FuzzerExtFunctionsDlsymWin.cpp @@ -0,0 +1,62 @@ +//===- FuzzerExtFunctionsDlsymWin.cpp - Interface to external functions ---===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// Implementation using dynamic loading for Windows. +//===----------------------------------------------------------------------===// +#include "FuzzerDefs.h" +#if LIBFUZZER_WINDOWS + +#include "FuzzerExtFunctions.h" +#include "FuzzerIO.h" +#include "Windows.h" + +// This must be included after Windows.h. +#include "Psapi.h" + +namespace fuzzer { + +ExternalFunctions::ExternalFunctions() { + HMODULE Modules[1024]; + DWORD BytesNeeded; + HANDLE CurrentProcess = GetCurrentProcess(); + + if (!EnumProcessModules(CurrentProcess, Modules, sizeof(Modules), + &BytesNeeded)) { + Printf("EnumProcessModules failed (error: %d).\n", GetLastError()); + exit(1); + } + + if (sizeof(Modules) < BytesNeeded) { + Printf("Error: the array is not big enough to hold all loaded modules.\n"); + exit(1); + } + + for (size_t i = 0; i < (BytesNeeded / sizeof(HMODULE)); i++) + { + FARPROC Fn; +#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ + if (this->NAME == nullptr) { \ + Fn = GetProcAddress(Modules[i], #NAME); \ + if (Fn == nullptr) \ + Fn = GetProcAddress(Modules[i], #NAME "__dll"); \ + this->NAME = (decltype(ExternalFunctions::NAME)) Fn; \ + } +#include "FuzzerExtFunctions.def" +#undef EXT_FUNC + } + +#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ + if (this->NAME == nullptr && WARN) \ + Printf("WARNING: Failed to find function \"%s\".\n", #NAME); +#include "FuzzerExtFunctions.def" +#undef EXT_FUNC +} + +} // namespace fuzzer + +#endif // LIBFUZZER_WINDOWS |