| //===-- FuzzerPlatform.h --------------------------------------------------===// | |
| // | |
| // 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // Common platform macros. | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_FUZZER_PLATFORM_H | |
| #define LLVM_FUZZER_PLATFORM_H | |
| // Platform detection. | |
| #ifdef __linux__ | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 1 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif __APPLE__ | |
| #define LIBFUZZER_APPLE 1 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif __NetBSD__ | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 1 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif __FreeBSD__ | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 1 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif _WIN32 | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 1 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif __Fuchsia__ | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 1 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 0 | |
| #elif __EMSCRIPTEN__ | |
| #define LIBFUZZER_APPLE 0 | |
| #define LIBFUZZER_FUCHSIA 0 | |
| #define LIBFUZZER_LINUX 0 | |
| #define LIBFUZZER_NETBSD 0 | |
| #define LIBFUZZER_FREEBSD 0 | |
| #define LIBFUZZER_WINDOWS 0 | |
| #define LIBFUZZER_EMSCRIPTEN 1 | |
| #else | |
| #error "Support for your platform has not been implemented" | |
| #endif | |
| #if defined(_MSC_VER) && !defined(__clang__) | |
| // MSVC compiler is being used. | |
| #define LIBFUZZER_MSVC 1 | |
| #else | |
| #define LIBFUZZER_MSVC 0 | |
| #endif | |
| #ifndef __has_attribute | |
| #define __has_attribute(x) 0 | |
| #endif | |
| #define LIBFUZZER_POSIX \ | |
| (LIBFUZZER_APPLE || LIBFUZZER_LINUX || LIBFUZZER_NETBSD || \ | |
| LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN) | |
| #ifdef __x86_64 | |
| #if __has_attribute(target) | |
| #define ATTRIBUTE_TARGET_POPCNT __attribute__((target("popcnt"))) | |
| #else | |
| #define ATTRIBUTE_TARGET_POPCNT | |
| #endif | |
| #else | |
| #define ATTRIBUTE_TARGET_POPCNT | |
| #endif | |
| #ifdef __clang__ // avoid gcc warning. | |
| #if __has_attribute(no_sanitize) | |
| #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory"))) | |
| #else | |
| #define ATTRIBUTE_NO_SANITIZE_MEMORY | |
| #endif | |
| #define ALWAYS_INLINE __attribute__((always_inline)) | |
| #else | |
| #define ATTRIBUTE_NO_SANITIZE_MEMORY | |
| #define ALWAYS_INLINE | |
| #endif // __clang__ | |
| #if LIBFUZZER_WINDOWS | |
| #define ATTRIBUTE_NO_SANITIZE_ADDRESS | |
| #else | |
| #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) | |
| #endif | |
| #if LIBFUZZER_WINDOWS | |
| #define ATTRIBUTE_ALIGNED(X) __declspec(align(X)) | |
| #define ATTRIBUTE_INTERFACE __declspec(dllexport) | |
| // This is used for __sancov_lowest_stack which is needed for | |
| // -fsanitize-coverage=stack-depth. That feature is not yet available on | |
| // Windows, so make the symbol static to avoid linking errors. | |
| #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC static | |
| #define ATTRIBUTE_NOINLINE __declspec(noinline) | |
| #else | |
| #define ATTRIBUTE_ALIGNED(X) __attribute__((aligned(X))) | |
| #define ATTRIBUTE_INTERFACE __attribute__((visibility("default"))) | |
| #define ATTRIBUTES_INTERFACE_TLS_INITIAL_EXEC \ | |
| ATTRIBUTE_INTERFACE __attribute__((tls_model("initial-exec"))) thread_local | |
| #define ATTRIBUTE_NOINLINE __attribute__((noinline)) | |
| #endif | |
| #if defined(__has_feature) | |
| #if __has_feature(address_sanitizer) | |
| #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_ADDRESS | |
| #elif __has_feature(memory_sanitizer) | |
| #define ATTRIBUTE_NO_SANITIZE_ALL ATTRIBUTE_NO_SANITIZE_MEMORY | |
| #else | |
| #define ATTRIBUTE_NO_SANITIZE_ALL | |
| #endif | |
| #else | |
| #define ATTRIBUTE_NO_SANITIZE_ALL | |
| #endif | |
| #endif // LLVM_FUZZER_PLATFORM_H |