|  | //===-- 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 |